| defmodule Plausible.Billing.Subscription do |
| @moduledoc false |
|
|
| use Ecto.Schema |
| import Ecto.Changeset |
| require Plausible.Billing.Subscription.Status |
| alias Plausible.Billing.Subscription |
|
|
| @type t() :: %__MODULE__{} |
|
|
| @required_fields [ |
| :paddle_subscription_id, |
| :paddle_plan_id, |
| :update_url, |
| :cancel_url, |
| :status, |
| :next_bill_amount, |
| :next_bill_date, |
| :currency_code |
| ] |
|
|
| @optional_fields [:last_bill_date] |
|
|
| schema "subscriptions" do |
| field :paddle_subscription_id, :string |
| field :paddle_plan_id, :string |
| field :update_url, :string |
| field :cancel_url, :string |
| field :status, Ecto.Enum, values: Subscription.Status.valid_statuses() |
| field :next_bill_amount, :string |
| field :next_bill_date, :date |
| field :last_bill_date, :date |
| field :currency_code, :string |
|
|
| belongs_to :team, Plausible.Teams.Team |
|
|
| timestamps() |
| end |
|
|
| def create_changeset(team, attrs \\ %{}) do |
| %__MODULE__{} |
| |> changeset(attrs) |
| |> put_assoc(:team, team) |
| end |
|
|
| def changeset(subscription, attrs \\ %{}) do |
| subscription |
| |> cast(attrs, @required_fields ++ @optional_fields) |
| |> validate_required(@required_fields) |
| |> unique_constraint(:paddle_subscription_id) |
| end |
|
|
| def free(team, attrs \\ %{}) do |
| %__MODULE__{ |
| paddle_plan_id: "free_10k", |
| status: Subscription.Status.active(), |
| next_bill_amount: "0", |
| currency_code: "EUR" |
| } |
| |> cast(attrs, @required_fields ++ @optional_fields) |
| |> put_assoc(:team, team) |
| |> unique_constraint(:paddle_subscription_id) |
| end |
| end |
|
|