Packages

phoenix_kit

1.7.29
1.7.210 1.7.209 1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules billing schemas payment_option.ex
Raw

lib/modules/billing/schemas/payment_option.ex

defmodule PhoenixKit.Modules.Billing.PaymentOption do
@moduledoc """
Payment option schema for checkout.
Represents available payment methods during checkout, including:
- Offline methods: Cash on Delivery (COD), Bank Transfer
- Online methods: Stripe, PayPal, Razorpay
## Type
- `offline` - Payment handled outside the system (COD, bank transfer)
- `online` - Payment processed through a provider (Stripe, PayPal)
## Billing Profile Requirement
Some payment methods (like COD or Bank Transfer) require billing information
for invoicing purposes. Online card payments typically don't need this as
the payment provider handles customer details.
"""
use Ecto.Schema
import Ecto.Changeset
@types ~w(offline online)
@codes ~w(cod bank_transfer stripe paypal razorpay)
schema "phoenix_kit_payment_options" do
field :uuid, Ecto.UUID
# Identity
field :name, :string
field :code, :string
field :type, :string, default: "offline"
# Provider (for online payments)
field :provider, :string
# Display
field :description, :string
field :instructions, :string
field :icon, :string, default: "hero-banknotes"
# Configuration
field :active, :boolean, default: false
field :position, :integer, default: 0
field :requires_billing_profile, :boolean, default: true
# Additional settings
field :settings, :map, default: %{}
timestamps(type: :utc_datetime)
end
@doc """
Changeset for creating and updating payment options.
"""
def changeset(payment_option, attrs) do
payment_option
|> cast(attrs, [
:name,
:code,
:type,
:provider,
:description,
:instructions,
:icon,
:active,
:position,
:requires_billing_profile,
:settings
])
|> validate_required([:name, :code, :type])
|> validate_inclusion(:type, @types)
|> validate_inclusion(:code, @codes)
|> unique_constraint(:code)
|> maybe_generate_uuid()
|> validate_provider()
end
@doc """
Returns true if this payment option is an online payment.
"""
def online?(%__MODULE__{type: "online"}), do: true
def online?(_), do: false
@doc """
Returns true if this payment option is an offline payment.
"""
def offline?(%__MODULE__{type: "offline"}), do: true
def offline?(_), do: false
@doc """
Returns true if this payment option requires a billing profile.
"""
def requires_billing?(%__MODULE__{requires_billing_profile: true}), do: true
def requires_billing?(_), do: false
@doc """
Returns list of valid type values.
"""
def types, do: @types
@doc """
Returns list of valid code values.
"""
def codes, do: @codes
@doc """
Returns the icon name for a payment option.
"""
def icon_name(%__MODULE__{icon: icon}) when is_binary(icon), do: icon
def icon_name(%__MODULE__{code: "cod"}), do: "hero-banknotes"
def icon_name(%__MODULE__{code: "bank_transfer"}), do: "hero-building-library"
def icon_name(%__MODULE__{code: "stripe"}), do: "hero-credit-card"
def icon_name(%__MODULE__{code: "paypal"}), do: "hero-credit-card"
def icon_name(%__MODULE__{code: "razorpay"}), do: "hero-credit-card"
def icon_name(_), do: "hero-credit-card"
# Private helpers
defp maybe_generate_uuid(changeset) do
case get_field(changeset, :uuid) do
nil -> put_change(changeset, :uuid, Ecto.UUID.generate())
_ -> changeset
end
end
defp validate_provider(changeset) do
type = get_field(changeset, :type)
provider = get_field(changeset, :provider)
if type == "online" and is_nil(provider) do
add_error(changeset, :provider, "is required for online payment options")
else
changeset
end
end
end