Packages

phoenix_kit

1.7.75
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 utils iban_data.ex
Raw

lib/modules/billing/utils/iban_data.ex

defmodule PhoenixKit.Modules.Billing.IbanData do
@moduledoc """
IBAN specifications by country.
Provides IBAN length and SEPA membership data for banking validation.
Data sourced from IBAN.com/structure.
## Examples
iex> IbanData.get_iban_length("EE")
20
iex> IbanData.sepa_member?("EE")
true
iex> IbanData.country_uses_iban?("US")
false
"""
@enforce_keys [:length, :sepa]
defstruct [:length, :sepa]
@type t :: %__MODULE__{
length: pos_integer(),
sepa: boolean()
}
@iban_specs %{
# EU/EEA SEPA Countries
"AD" => %{length: 24, sepa: true},
"AT" => %{length: 20, sepa: true},
"BE" => %{length: 16, sepa: true},
"BG" => %{length: 22, sepa: true},
"CH" => %{length: 21, sepa: true},
"CY" => %{length: 28, sepa: true},
"CZ" => %{length: 24, sepa: true},
"DE" => %{length: 22, sepa: true},
"DK" => %{length: 18, sepa: true},
"EE" => %{length: 20, sepa: true},
"ES" => %{length: 24, sepa: true},
"FI" => %{length: 18, sepa: true},
"FR" => %{length: 27, sepa: true},
"GB" => %{length: 22, sepa: true},
"GI" => %{length: 23, sepa: true},
"GR" => %{length: 27, sepa: true},
"HR" => %{length: 21, sepa: true},
"HU" => %{length: 28, sepa: true},
"IE" => %{length: 22, sepa: true},
"IS" => %{length: 26, sepa: true},
"IT" => %{length: 27, sepa: true},
"LI" => %{length: 21, sepa: true},
"LT" => %{length: 20, sepa: true},
"LU" => %{length: 20, sepa: true},
"LV" => %{length: 21, sepa: true},
"MC" => %{length: 27, sepa: true},
"MD" => %{length: 24, sepa: true},
"ME" => %{length: 22, sepa: true},
"MK" => %{length: 19, sepa: true},
"MT" => %{length: 31, sepa: true},
"NL" => %{length: 18, sepa: true},
"NO" => %{length: 15, sepa: true},
"PL" => %{length: 28, sepa: true},
"PT" => %{length: 25, sepa: true},
"RO" => %{length: 24, sepa: true},
"RS" => %{length: 22, sepa: true},
"SE" => %{length: 24, sepa: true},
"SI" => %{length: 19, sepa: true},
"SK" => %{length: 24, sepa: true},
"SM" => %{length: 27, sepa: true},
"VA" => %{length: 22, sepa: true},
"XK" => %{length: 20, sepa: true},
# Non-SEPA Countries with IBAN
"AE" => %{length: 23, sepa: false},
"AL" => %{length: 28, sepa: false},
"AZ" => %{length: 28, sepa: false},
"BA" => %{length: 20, sepa: false},
"BH" => %{length: 22, sepa: false},
"BR" => %{length: 29, sepa: false},
"BY" => %{length: 28, sepa: false},
"CR" => %{length: 22, sepa: false},
"DO" => %{length: 28, sepa: false},
"EG" => %{length: 29, sepa: false},
"FO" => %{length: 18, sepa: false},
"GE" => %{length: 22, sepa: false},
"GL" => %{length: 18, sepa: false},
"GT" => %{length: 28, sepa: false},
"IL" => %{length: 23, sepa: false},
"IQ" => %{length: 23, sepa: false},
"JO" => %{length: 30, sepa: false},
"KW" => %{length: 30, sepa: false},
"KZ" => %{length: 20, sepa: false},
"LB" => %{length: 28, sepa: false},
"LC" => %{length: 32, sepa: false},
"MR" => %{length: 27, sepa: false},
"MU" => %{length: 30, sepa: false},
"PK" => %{length: 24, sepa: false},
"PS" => %{length: 29, sepa: false},
"QA" => %{length: 29, sepa: false},
"RU" => %{length: 33, sepa: false},
"SA" => %{length: 24, sepa: false},
"SC" => %{length: 31, sepa: false},
"TL" => %{length: 23, sepa: false},
"TN" => %{length: 24, sepa: false},
"TR" => %{length: 26, sepa: false},
"UA" => %{length: 29, sepa: false},
"VG" => %{length: 24, sepa: false}
}
@all_specs Map.new(@iban_specs, fn {code, %{length: length, sepa: sepa}} ->
{code, %{__struct__: __MODULE__, length: length, sepa: sepa}}
end)
@doc """
Get IBAN length for a country.
Returns the expected IBAN length for the country code, or nil if the country
does not use IBAN.
## Examples
iex> IbanData.get_iban_length("EE")
20
iex> IbanData.get_iban_length("DE")
22
iex> IbanData.get_iban_length("US")
nil
"""
def get_iban_length(country_code) when is_binary(country_code) do
case Map.get(@iban_specs, String.upcase(country_code)) do
%{length: length} -> length
_ -> nil
end
end
def get_iban_length(_), do: nil
@doc """
Check if a country is a SEPA member.
## Examples
iex> IbanData.sepa_member?("EE")
true
iex> IbanData.sepa_member?("TR")
false
iex> IbanData.sepa_member?("US")
false
"""
def sepa_member?(country_code) when is_binary(country_code) do
case Map.get(@iban_specs, String.upcase(country_code)) do
%{sepa: true} -> true
_ -> false
end
end
def sepa_member?(_), do: false
@doc """
Check if a country uses IBAN.
## Examples
iex> IbanData.country_uses_iban?("EE")
true
iex> IbanData.country_uses_iban?("US")
false
"""
def country_uses_iban?(country_code) when is_binary(country_code) do
Map.has_key?(@iban_specs, String.upcase(country_code))
end
def country_uses_iban?(_), do: false
@doc """
Get the IBAN specification for a country.
Returns a `%IbanData{}` struct or nil if the country does not use IBAN.
"""
def get_spec(country_code) when is_binary(country_code) do
case Map.get(@iban_specs, String.upcase(country_code)) do
%{length: length, sepa: sepa} -> %__MODULE__{length: length, sepa: sepa}
_ -> nil
end
end
def get_spec(_), do: nil
@doc """
Get all IBAN specifications.
Returns a map of country codes to `%IbanData{}` structs.
"""
def all_specs, do: @all_specs
end