defmodule DaProductApp.RiskManagement.RiskRuleHit do use Ecto.Schema import Ecto.Changeset @derive {Jason.Encoder, only: [ :id, :transaction_id, :transaction_type, :rule_id, :merchant_id, :category, :status, :triggered_at, :supervisor_id, :action_taken, :action_at, :notes, :metadata, :inserted_at, :updated_at ]} @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "risk_rule_hits" do field :transaction_id, :integer field :transaction_type, :string # 'QR' or 'POS' field :merchant_id, :string field :category, :string # Cat A, Cat B, Cat C, Cat D field :status, :string, default: "Hold" field :triggered_at, :utc_datetime field :supervisor_id, :integer field :action_taken, :string field :action_at, :utc_datetime field :notes, :string field :metadata, :map belongs_to :rule, DaProductApp.RiskManagement.RiskRule timestamps(type: :utc_datetime) end @required_fields [:transaction_id, :transaction_type, :rule_id, :triggered_at] @optional_fields [:merchant_id, :category, :status, :supervisor_id, :action_taken, :action_at, :notes, :metadata] @all_fields @required_fields ++ @optional_fields @valid_transaction_types ["QR", "POS"] @valid_statuses ["Hold", "Alert", "Reviewed", "Released", "Request Docs"] @valid_actions ["Hold", "Release", "Released", "Request Docs", "Escalate", "Reviewed"] def changeset(rule_hit, attrs) do rule_hit |> cast(attrs, @all_fields) |> validate_required(@required_fields) |> validate_inclusion(:transaction_type, @valid_transaction_types) |> validate_inclusion(:status, @valid_statuses) |> validate_inclusion(:action_taken, @valid_actions, message: "must be one of: #{Enum.join(@valid_actions, ", ")}") |> validate_length(:notes, max: 2000) |> unique_constraint([:transaction_id, :rule_id, :transaction_type]) end def valid_transaction_types, do: @valid_transaction_types def valid_statuses, do: @valid_statuses def valid_actions, do: @valid_actions end