Packages
phoenix_kit
1.7.29
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
Current section
Files
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
"""
@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}
}
@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 all IBAN specifications.
Returns a map of country codes to their IBAN specifications.
"""
def all_specs, do: @iban_specs
end