defmodule ArcadiaCloud.Repo.Migrations.CreateBilling do use Ecto.Migration def change do # Hourly snapshot of DO account balance + month-to-date usage. # Drives the live-accrual side of the cost dashboard. create table(:cloud_balance_snapshots, primary_key: false) do add :id, :binary_id, primary_key: true add :provider, :string, null: false add :month_to_date_balance_cents, :integer add :account_balance_cents, :integer add :month_to_date_usage_cents, :integer add :generated_at, :utc_datetime, null: false add :raw, :map timestamps(type: :utc_datetime, updated_at: false) end create index(:cloud_balance_snapshots, [:provider, :generated_at]) # Monthly invoice summary headers (one row per provider invoice). create table(:cloud_invoices, primary_key: false) do add :id, :binary_id, primary_key: true add :provider, :string, null: false add :provider_invoice_id, :string, null: false add :invoice_period, :date, null: false add :amount_cents, :integer add :status, :string, default: "open", null: false add :issued_at, :utc_datetime add :csv_fetched_at, :utc_datetime add :lines_ingested_at, :utc_datetime add :raw, :map timestamps(type: :utc_datetime) end create unique_index(:cloud_invoices, [:provider, :provider_invoice_id]) create index(:cloud_invoices, [:invoice_period]) # Per-line-item COGS. One row per CSV line of a provider invoice. # Matched to cloud_resources where possible by (kind, name, region). create table(:cloud_cost_lines, primary_key: false) do add :id, :binary_id, primary_key: true add :invoice_id, references(:cloud_invoices, type: :binary_id, on_delete: :delete_all), null: false add :resource_id, references(:cloud_resources, type: :binary_id, on_delete: :nilify_all) add :invoice_period, :date, null: false add :kind, :string add :description, :string add :qty, :decimal add :unit, :string add :unit_cost_cents, :integer add :amount_cents, :integer, null: false add :start_at, :utc_datetime add :end_at, :utc_datetime add :project_name, :string add :category, :string add :matched_at, :utc_datetime add :raw, :map timestamps(type: :utc_datetime, updated_at: false) end create index(:cloud_cost_lines, [:invoice_id]) create index(:cloud_cost_lines, [:resource_id]) create index(:cloud_cost_lines, [:invoice_period]) create index(:cloud_cost_lines, [:kind]) end end