Module: Ibandit::LocalDetailsCleaner
- Defined in:
- lib/ibandit/local_details_cleaner.rb
Constant Summary collapse
- SUPPORTED_COUNTRY_CODES =
%w(AT BE CY DE EE ES FI FR GB GR IE IT LT LU LV MC MT NL NO PT SE SI SK SM).freeze
Class Method Summary collapse
-
.can_clean?(country_code, local_details) ⇒ Boolean
Helpers #.
- .clean(local_details) ⇒ Object
-
.clean_at_details(local_details) ⇒ Object
Country-specific logic #.
- .clean_be_details(local_details) ⇒ Object
- .clean_cy_details(local_details) ⇒ Object
- .clean_de_details(local_details) ⇒ Object
- .clean_ee_details(local_details) ⇒ Object
- .clean_es_details(local_details) ⇒ Object
- .clean_fi_details(local_details) ⇒ Object
- .clean_fr_details(local_details) ⇒ Object
- .clean_gb_details(local_details) ⇒ Object
- .clean_gr_details(local_details) ⇒ Object
- .clean_ie_details(local_details) ⇒ Object
- .clean_it_details(local_details) ⇒ Object
- .clean_lt_details(local_details) ⇒ Object
- .clean_lu_details(local_details) ⇒ Object
- .clean_lv_details(local_details) ⇒ Object
- .clean_mc_details(local_details) ⇒ Object
- .clean_mt_details(local_details) ⇒ Object
- .clean_nl_details(local_details) ⇒ Object
- .clean_no_details(local_details) ⇒ Object
- .clean_pt_details(local_details) ⇒ Object
- .clean_se_details(local_details) ⇒ Object
- .clean_si_details(local_details) ⇒ Object
- .clean_sk_details(local_details) ⇒ Object
- .clean_sm_details(local_details) ⇒ Object
- .fields_for?(country_code, opts) ⇒ Boolean
- .required_fields(country_code) ⇒ Object
Class Method Details
.can_clean?(country_code, local_details) ⇒ Boolean
Helpers #
19 20 21 22 |
# File 'lib/ibandit/local_details_cleaner.rb', line 19 def self.can_clean?(country_code, local_details) SUPPORTED_COUNTRY_CODES.include?(country_code) && fields_for?(country_code, local_details) end |
.clean(local_details) ⇒ Object
6 7 8 9 10 11 12 13 |
# File 'lib/ibandit/local_details_cleaner.rb', line 6 def self.clean(local_details) country_code = local_details[:country_code] return local_details unless can_clean?(country_code, local_details) local_details.merge( public_send(:"clean_#{country_code.downcase}_details", local_details)) end |
.clean_at_details(local_details) ⇒ Object
Country-specific logic #
47 48 49 50 51 52 53 54 55 |
# File 'lib/ibandit/local_details_cleaner.rb', line 47 def self.clean_at_details(local_details) # Account number may be 4-11 digits long. # Add leading zeros to account number if < 11 digits. return {} unless local_details[:account_number].length >= 4 { bank_code: local_details[:bank_code], account_number: local_details[:account_number].rjust(11, '0') } end |
.clean_be_details(local_details) ⇒ Object
57 58 59 60 61 62 63 64 |
# File 'lib/ibandit/local_details_cleaner.rb', line 57 def self.clean_be_details(local_details) account_number = local_details[:account_number].tr('-', '') { bank_code: local_details[:bank_code] || account_number.slice(0, 3), account_number: account_number } end |
.clean_cy_details(local_details) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/ibandit/local_details_cleaner.rb', line 66 def self.clean_cy_details(local_details) # Account number may be 7-16 digits long. # Add leading zeros to account number if < 16 digits. cleaned_bank_code = local_details[:bank_code].gsub(/[-\s]/, '') bank_code = cleaned_bank_code.slice(0, 3) branch_code = if local_details[:branch_code] local_details[:branch_code] elsif cleaned_bank_code.length > 3 cleaned_bank_code[3..-1] end account_number = if local_details[:account_number].length >= 7 local_details[:account_number].rjust(16, '0') else local_details[:account_number] end { bank_code: bank_code, branch_code: branch_code, account_number: account_number } end |
.clean_de_details(local_details) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/ibandit/local_details_cleaner.rb', line 92 def self.clean_de_details(local_details) # Account number may be up to 10 digits long. # Add leading zeros to account number if < 10 digits. # # There are many exceptions to the way German bank details translate # into an IBAN, detailed into a 200 page document compiled by the # Bundesbank, and handled by the GermanDetailsConverter class. converted_details = begin GermanDetailsConverter.convert(local_details) rescue UnsupportedAccountDetails local_details.dup end return {} unless converted_details[:account_number].length >= 4 { bank_code: converted_details[:bank_code], account_number: converted_details[:account_number].rjust(10, '0') } end |
.clean_ee_details(local_details) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/ibandit/local_details_cleaner.rb', line 114 def self.clean_ee_details(local_details) # Account number may be up to 14 characters long. # Add leading zeros to account number if < 14 digits. # # Bank code can be found by extracted from the first two digits of the # account number and converted using the rules at # http://www.pangaliit.ee/en/settlements-and-standards/bank-codes-of-estonian-banks domestic_bank_code = local_details[:account_number].gsub(/\A0+/, '').slice(0, 2) iban_bank_code = case domestic_bank_code when '11' then '22' when '93' then '00' else domestic_bank_code end account_number = local_details[:account_number].rjust(14, '0') { bank_code: iban_bank_code, account_number: account_number } end |
.clean_es_details(local_details) ⇒ Object
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/ibandit/local_details_cleaner.rb', line 136 def self.clean_es_details(local_details) # This method supports being passed the component IBAN parts, as defined # by SWIFT, or a single 20 digit string. if local_details[:bank_code] && local_details[:branch_code] bank_code = local_details[:bank_code] branch_code = local_details[:branch_code] account_number = local_details[:account_number] else cleaned_account_number = local_details[:account_number].tr('-', '') bank_code = cleaned_account_number.slice(0, 4) branch_code = cleaned_account_number.slice(4, 4) account_number = cleaned_account_number[8..-1] end { bank_code: bank_code, branch_code: branch_code, account_number: account_number } end |
.clean_fi_details(local_details) ⇒ Object
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/ibandit/local_details_cleaner.rb', line 158 def self.clean_fi_details(local_details) # Finnish account numbers need to be expanded into "electronic format" # by adding zero-padding. The expansion method depends on the first # character of the bank code. account_number = if %w(4 5 6).include?(local_details[:bank_code][0]) [ local_details[:account_number][0], local_details[:account_number][1..-1].rjust(7, '0') ].join else local_details[:account_number].rjust(8, '0') end { bank_code: local_details[:bank_code], account_number: account_number } end |
.clean_fr_details(local_details) ⇒ Object
178 179 180 181 182 183 184 |
# File 'lib/ibandit/local_details_cleaner.rb', line 178 def self.clean_fr_details(local_details) { bank_code: local_details[:bank_code], branch_code: local_details[:branch_code], account_number: local_details[:account_number].gsub(/[-\s]/, '') } end |
.clean_gb_details(local_details) ⇒ Object
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/ibandit/local_details_cleaner.rb', line 186 def self.clean_gb_details(local_details) # Account number may be 6-8 digits # Add leading zeros to account number if < 8 digits. branch_code = local_details[:branch_code].gsub(/[-\s]/, '') if local_details[:bank_code] bank_code = local_details[:bank_code] else bic = Ibandit.find_bic('GB', branch_code) bank_code = bic.nil? ? nil : bic.slice(0, 4) end account_number = local_details[:account_number].gsub(/[-\s]/, '') account_number = account_number.rjust(8, '0') if account_number.length > 5 { bank_code: bank_code, branch_code: branch_code, account_number: account_number } end |
.clean_gr_details(local_details) ⇒ Object
208 209 210 211 212 |
# File 'lib/ibandit/local_details_cleaner.rb', line 208 def self.clean_gr_details(local_details) # Greek IBANs construction is idiosyncratic to the individual banks, and # no central specification is published. local_details end |
.clean_ie_details(local_details) ⇒ Object
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
# File 'lib/ibandit/local_details_cleaner.rb', line 214 def self.clean_ie_details(local_details) # Ireland uses the same local details as the United Kingdom branch_code = local_details[:branch_code].gsub(/[-\s]/, '') if local_details[:bank_code] bank_code = local_details[:bank_code] else bic = Ibandit.find_bic('IE', branch_code) bank_code = bic.nil? ? nil : bic.slice(0, 4) end account_number = local_details[:account_number].gsub(/[-\s]/, '') account_number = account_number.rjust(8, '0') if account_number.length > 5 { bank_code: bank_code, branch_code: branch_code, account_number: account_number } end |
.clean_it_details(local_details) ⇒ Object
235 236 237 238 239 240 241 242 |
# File 'lib/ibandit/local_details_cleaner.rb', line 235 def self.clean_it_details(local_details) # Add leading zeros to account number if < 12 digits. { bank_code: local_details[:bank_code], branch_code: local_details[:branch_code], account_number: local_details[:account_number].rjust(12, '0') } end |
.clean_lt_details(local_details) ⇒ Object
244 245 246 247 |
# File 'lib/ibandit/local_details_cleaner.rb', line 244 def self.clean_lt_details(local_details) # Lithuanian national bank details were replaced with IBANs in 2004. local_details end |
.clean_lu_details(local_details) ⇒ Object
249 250 251 252 |
# File 'lib/ibandit/local_details_cleaner.rb', line 249 def self.clean_lu_details(local_details) # Luxembourgian national bank details were replaced with IBANs in 2002. local_details end |
.clean_lv_details(local_details) ⇒ Object
254 255 256 257 |
# File 'lib/ibandit/local_details_cleaner.rb', line 254 def self.clean_lv_details(local_details) # Latvian national bank details were replaced with IBANs in 2004. local_details end |
.clean_mc_details(local_details) ⇒ Object
259 260 261 262 |
# File 'lib/ibandit/local_details_cleaner.rb', line 259 def self.clean_mc_details(local_details) # Monaco uses the same local details method as France clean_fr_details(local_details) end |
.clean_mt_details(local_details) ⇒ Object
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 |
# File 'lib/ibandit/local_details_cleaner.rb', line 264 def self.clean_mt_details(local_details) # Add leading zeros to account number if < 18 digits. branch_code = local_details[:branch_code] if local_details[:bank_code] bank_code = local_details[:bank_code] else bic = Ibandit.find_bic('MT', branch_code) bank_code = bic.nil? ? nil : bic.slice(0, 4) end account_number = local_details[:account_number].gsub(/[-\s]/, '') account_number = account_number.rjust(18, '0') { bank_code: bank_code, branch_code: branch_code, account_number: account_number } end |
.clean_nl_details(local_details) ⇒ Object
285 286 287 288 289 290 291 |
# File 'lib/ibandit/local_details_cleaner.rb', line 285 def self.clean_nl_details(local_details) # Add leading zeros to account number if < 10 digits. { bank_code: local_details[:bank_code], account_number: local_details[:account_number].rjust(10, '0') } end |
.clean_no_details(local_details) ⇒ Object
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
# File 'lib/ibandit/local_details_cleaner.rb', line 293 def self.clean_no_details(local_details) # This method supports being passed the component IBAN parts, as defined # by SWIFT, or a single 11 digit string. if local_details[:bank_code] bank_code = local_details[:bank_code] account_number = local_details[:account_number] else cleaned_acct_number = local_details[:account_number].gsub(/[-.\s]/, '') bank_code = cleaned_acct_number.slice(0, 4) account_number = cleaned_acct_number[4..-1] end { bank_code: bank_code, account_number: account_number } end |
.clean_pt_details(local_details) ⇒ Object
312 313 314 |
# File 'lib/ibandit/local_details_cleaner.rb', line 312 def self.clean_pt_details(local_details) local_details end |
.clean_se_details(local_details) ⇒ Object
316 317 318 319 320 321 322 323 324 325 326 |
# File 'lib/ibandit/local_details_cleaner.rb', line 316 def self.clean_se_details(local_details) converted_details = SwedishDetailsConverter.convert(local_details[:account_number]) bank_code = local_details[:bank_code] || converted_details[:bank_code] { bank_code: bank_code, account_number: converted_details[:account_number] } end |
.clean_si_details(local_details) ⇒ Object
328 329 330 331 332 333 334 |
# File 'lib/ibandit/local_details_cleaner.rb', line 328 def self.clean_si_details(local_details) # Add leading zeros to account number if < 10 digits. { bank_code: local_details[:bank_code], account_number: local_details[:account_number].rjust(10, '0') } end |
.clean_sk_details(local_details) ⇒ Object
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 |
# File 'lib/ibandit/local_details_cleaner.rb', line 336 def self.clean_sk_details(local_details) # The SWIFT definition of a Slovakian IBAN includes both the account # number prefix and the account number. This method therefore supports # passing those fields concatenated. account_number = if local_details.include?(:account_number_prefix) [ local_details[:account_number_prefix].rjust(6, '0'), local_details[:account_number].rjust(10, '0') ].join else local_details[:account_number].tr('-', '').rjust(16, '0') end { bank_code: local_details[:bank_code], account_number: account_number } end |
.clean_sm_details(local_details) ⇒ Object
356 357 358 359 |
# File 'lib/ibandit/local_details_cleaner.rb', line 356 def self.clean_sm_details(local_details) # San Marino uses the same local details method as France clean_it_details(local_details) end |
.fields_for?(country_code, opts) ⇒ Boolean
24 25 26 |
# File 'lib/ibandit/local_details_cleaner.rb', line 24 def self.fields_for?(country_code, opts) required_fields(country_code).all? { |argument| opts[argument] } end |
.required_fields(country_code) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/ibandit/local_details_cleaner.rb', line 28 def self.required_fields(country_code) case country_code when 'AT', 'CY', 'DE', 'FI', 'LT', 'LU', 'LV', 'NL', 'SI', 'SK' %i(bank_code account_number) when 'BE', 'EE', 'ES', 'SE', 'NO' %i(account_number) when 'GB', 'IE', 'MT' if Ibandit.bic_finder.nil? then %i(bank_code branch_code account_number) else %i(branch_code account_number) end else %i(bank_code branch_code account_number) end end |