defmodule ArcadiaCloud.Billing.TenantInvoice do use Ecto.Schema import Ecto.Changeset @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id @statuses ~w(draft issued paid void) schema "tenant_invoices" do field :tenant_id, :string field :period_start, :date field :period_end, :date field :currency, :string, default: "AUD" field :subtotal_cents, :integer, default: 0 field :tax_cents, :integer, default: 0 field :total_cents, :integer, default: 0 field :status, :string, default: "issued" field :issued_at, :utc_datetime field :paid_at, :utc_datetime field :finance_invoice_id, :string field :pushed_to_finance_at, :utc_datetime has_many :lines, ArcadiaCloud.Billing.TenantInvoiceLine, foreign_key: :invoice_id timestamps(type: :utc_datetime) end @required ~w(tenant_id period_start period_end)a @optional ~w(currency subtotal_cents tax_cents total_cents status issued_at paid_at finance_invoice_id pushed_to_finance_at)a def changeset(invoice, attrs) do invoice |> cast(attrs, @required ++ @optional) |> validate_required(@required) |> validate_inclusion(:status, @statuses) |> unique_constraint([:tenant_id, :period_start]) end end