defmodule ArcadiaCloud.Repo.Migrations.CreateTenantInvoices do use Ecto.Migration def change do # Revenue-side invoices: what a tenant owes Sky AI. Distinct from # cloud_invoices, which are what DO bills Sky AI (COGS). One invoice # per tenant per period; lines are grouped by deployment. create table(:tenant_invoices, primary_key: false) do add :id, :binary_id, primary_key: true add :tenant_id, :string, null: false add :period_start, :date, null: false add :period_end, :date, null: false add :currency, :string, null: false, default: "AUD" add :subtotal_cents, :integer, null: false, default: 0 add :tax_cents, :integer, null: false, default: 0 add :total_cents, :integer, null: false, default: 0 add :status, :string, null: false, default: "issued" add :issued_at, :utc_datetime add :paid_at, :utc_datetime # set when pushed to skyai-finance as AR (separate chunk) add :finance_invoice_id, :string add :pushed_to_finance_at, :utc_datetime timestamps(type: :utc_datetime) end create unique_index(:tenant_invoices, [:tenant_id, :period_start]) create index(:tenant_invoices, [:status]) create table(:tenant_invoice_lines, primary_key: false) do add :id, :binary_id, primary_key: true add :invoice_id, references(:tenant_invoices, type: :binary_id, on_delete: :delete_all), null: false # NULL for tenant-level lines (GST, credits, adjustments). add :deployment_id, references(:cloud_deployments, type: :binary_id, on_delete: :nilify_all) add :kind, :string, null: false add :resource_kind, :string add :description, :string add :qty, :decimal add :unit, :string add :unit_price_cents, :integer add :amount_cents, :integer, null: false add :meta, :map, default: %{} timestamps(type: :utc_datetime, updated_at: false) end create index(:tenant_invoice_lines, [:invoice_id]) create index(:tenant_invoice_lines, [:deployment_id]) create index(:tenant_invoice_lines, [:resource_kind]) end end