defmodule DaProductApp.Partners.Partner do @moduledoc """ Partner schema representing merchant acquirers/aggregators. Partners are entities that: - Enroll merchants under them - Generate QR codes for merchants - Handle merchant settlements - Provide merchant services """ use Ecto.Schema import Ecto.Changeset @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "partners" do field :partner_code, :string # Unique partner identifier (e.g., "RAZORPAY", "PAYU") field :partner_name, :string # Display name (e.g., "Razorpay Business") field :partner_type, :string # "AGGREGATOR", "ACQUIRER", "PROCESSOR" field :api_endpoint, :string # Partner's API base URL field :api_key, :string # Partner authentication key (encrypted) field :webhook_url, :string # Partner's webhook for callbacks field :webhook_secret, :string # Webhook signature verification field :settlement_account, :string # Partner's settlement account details field :commission_rate, :decimal # Commission % charged by partner field :status, :string, default: "ACTIVE" # "ACTIVE", "SUSPENDED", "INACTIVE" field :contact_email, :string field :contact_phone, :string field :onboarded_at, :utc_datetime field :last_reconciled_at, :utc_datetime has_many :merchants, DaProductApp.Partners.Merchant has_many :transactions, DaProductApp.Transactions.Transaction timestamps(type: :utc_datetime) end def changeset(partner, attrs) do partner |> cast(attrs, [ :partner_code, :partner_name, :partner_type, :api_endpoint, :api_key, :webhook_url, :webhook_secret, :settlement_account, :commission_rate, :status, :contact_email, :contact_phone, :onboarded_at, :last_reconciled_at ]) |> validate_required([:partner_code, :partner_name, :partner_type]) |> validate_inclusion(:partner_type, ["AGGREGATOR", "ACQUIRER", "PROCESSOR"]) |> validate_inclusion(:status, ["ACTIVE", "SUSPENDED", "INACTIVE"]) |> validate_format(:contact_email, ~r/@/) |> unique_constraint(:partner_code) end end