defmodule DaProductApp.Repo.Migrations.CreateSettlementMis do use Ecto.Migration @moduledoc """ Daily Settlement MIS (Payment Output MIS) — header record. One row per settlement run date. Holds aggregated totals and the 2-level Finance Team approval workflow state. Workflow: generated → level1_approved (Level 1 Finance reviewer) → approved (Level 2 Finance approver) → payout file generated OR generated → discarded (with reason) See settlement_mis_items for line-level transaction detail. """ def change do create table(:settlement_mis) do add :mis_date, :date, null: false, comment: "Settlement date this MIS covers" add :source_dump_ref, :string, size: 100, comment: "Dump file(s) this MIS was generated from" # Aggregated totals add :total_merchants, :integer, default: 0 add :total_transactions, :integer, default: 0 add :gross_total_amount, :decimal, precision: 14, scale: 2, default: 0 add :total_mdr_charges, :decimal, precision: 14, scale: 2, default: 0 add :total_vat, :decimal, precision: 14, scale: 2, default: 0 add :total_ar_recovery, :decimal, precision: 14, scale: 2, default: 0 add :total_adjustments, :decimal, precision: 14, scale: 2, default: 0 add :total_net_payable, :decimal, precision: 14, scale: 2, default: 0 add :currency, :string, size: 5, default: "AED" # 2-level Finance approval workflow add :approval_status, :string, size: 20, null: false, default: "pending", comment: "pending | level1_approved | approved | discarded" add :level1_reviewed_by, :bigint, comment: "users.id — Level 1 Finance reviewer" add :level1_reviewed_at, :naive_datetime add :level2_approved_by, :bigint, comment: "users.id — Level 2 Finance approver" add :level2_approved_at, :naive_datetime add :discarded_by, :bigint, comment: "users.id" add :discarded_at, :naive_datetime add :discard_reason, :text add :generated_at, :naive_datetime, null: false add :inserted_at, :naive_datetime, null: false add :updated_at, :naive_datetime, null: false end create unique_index(:settlement_mis, [:mis_date], name: :settlement_mis_date_unique) create index(:settlement_mis, [:approval_status]) create index(:settlement_mis, [:mis_date]) end end