Class: Ibandit::IBAN

Inherits:
Object
  • Object
show all
Defined in:
lib/ibandit/iban.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argument) ⇒ IBAN

Returns a new instance of IBAN.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/ibandit/iban.rb', line 9

def initialize(argument)
  if argument.is_a?(String)
    input = argument.to_s.gsub(/\s+/, '').upcase

    if pseudo_iban?(input)
      local_details = PseudoIBANSplitter.new(input).split
      build_iban_from_local_details(local_details)
    else
      @iban = input
      extract_swift_details_from_iban!
    end
  elsif argument.is_a?(Hash)
    build_iban_from_local_details(argument)
  else
    raise TypeError, 'Must pass an IBAN string or hash of local details'
  end

  @errors = {}
end

Instance Attribute Details

#account_numberObject (readonly)

Returns the value of attribute account_number.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def 
  @account_number
end

#bank_codeObject (readonly)

Returns the value of attribute bank_code.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def bank_code
  @bank_code
end

#branch_codeObject (readonly)

Returns the value of attribute branch_code.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def branch_code
  @branch_code
end

#check_digitsObject (readonly)

Returns the value of attribute check_digits.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def check_digits
  @check_digits
end

#country_codeObject (readonly)

Returns the value of attribute country_code.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def country_code
  @country_code
end

#errorsObject (readonly)

Returns the value of attribute errors.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def errors
  @errors
end

#ibanObject (readonly)

Returns the value of attribute iban.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def iban
  @iban
end

#swift_account_numberObject (readonly)

Returns the value of attribute swift_account_number.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def 
  
end

#swift_bank_codeObject (readonly)

Returns the value of attribute swift_bank_code.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def swift_bank_code
  @swift_bank_code
end

#swift_branch_codeObject (readonly)

Returns the value of attribute swift_branch_code.



5
6
7
# File 'lib/ibandit/iban.rb', line 5

def swift_branch_code
  @swift_branch_code
end

Instance Method Details

#bbanObject



58
59
60
# File 'lib/ibandit/iban.rb', line 58

def bban
  iban[4..-1] unless iban.nil?
end

#iban_national_idObject

Component parts #



41
42
43
44
45
46
47
# File 'lib/ibandit/iban.rb', line 41

def iban_national_id
  return unless decomposable?

  national_id = swift_bank_code.to_s
  national_id += swift_branch_code.to_s
  national_id.slice(0, structure[:iban_national_id_length])
end

#local_check_digitsObject



49
50
51
52
53
54
55
56
# File 'lib/ibandit/iban.rb', line 49

def local_check_digits
  return unless decomposable? && structure[:local_check_digit_position]

  iban.slice(
    structure[:local_check_digit_position] - 1,
    structure[:local_check_digit_length]
  )
end

#passes_country_specific_checks?Boolean

Returns:

  • (Boolean)


251
252
253
254
255
256
257
258
259
# File 'lib/ibandit/iban.rb', line 251

def passes_country_specific_checks?
  return unless valid_country_code?

  case country_code
  when 'DE' then supports_iban_determination?
  when 'SE' then valid_swedish_details?
  else true
  end
end

#pseudo_ibanObject



62
63
64
65
66
67
68
69
# File 'lib/ibandit/iban.rb', line 62

def pseudo_iban
  @pseudo_iban ||= PseudoIBANAssembler.new(
    country_code: country_code,
    bank_code: bank_code,
    branch_code: branch_code,
    account_number: 
  ).assemble
end

#supports_iban_determination?Boolean

Returns:

  • (Boolean)


261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
# File 'lib/ibandit/iban.rb', line 261

def supports_iban_determination?
  return unless valid_format?
  return true unless country_code == 'DE'

  begin
    GermanDetailsConverter.convert(
      country_code: country_code,
      bank_code: swift_bank_code,
      account_number: 
    )
    true
  rescue UnsupportedAccountDetails
    @errors[:account_number] = Ibandit.translate(:does_not_support_payments)
    false
  end
end

#to_s(format = :compact) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/ibandit/iban.rb', line 29

def to_s(format = :compact)
  case format
  when :compact   then iban.to_s
  when :formatted then formatted
  else raise ArgumentError, "invalid format '#{format}'"
  end
end

#valid?Boolean

Validations #

Returns:

  • (Boolean)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/ibandit/iban.rb', line 75

def valid?
  [
    valid_country_code?,
    valid_characters?,
    valid_check_digits?,
    valid_length?,
    valid_bank_code_length?,
    valid_branch_code_length?,
    ,
    valid_format?,
    valid_bank_code_format?,
    valid_branch_code_format?,
    ,
    valid_local_modulus_check?,
    passes_country_specific_checks?
  ].all?
end

#valid_account_number_format?Boolean

Returns:

  • (Boolean)


231
232
233
234
235
236
237
238
239
240
# File 'lib/ibandit/iban.rb', line 231

def 
  return unless 

  if  =~ Regexp.new(structure[:account_number_format])
    true
  else
    @errors[:account_number] = Ibandit.translate(:is_invalid)
    false
  end
end

#valid_account_number_length?Boolean

Returns:

  • (Boolean)


166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/ibandit/iban.rb', line 166

def 
  return unless valid_country_code?

  if .nil?
    @errors[:account_number] = Ibandit.translate(:is_required)
    return false
  end

  if .length == structure[:account_number_length]
    return true
  end

  @errors[:account_number] =
    Ibandit.translate(:wrong_length,
                      expected: structure[:account_number_length])
  false
end

#valid_bank_code_format?Boolean

Returns:

  • (Boolean)


208
209
210
211
212
213
214
215
216
217
# File 'lib/ibandit/iban.rb', line 208

def valid_bank_code_format?
  return unless valid_bank_code_length?

  if swift_bank_code =~ Regexp.new(structure[:bank_code_format])
    true
  else
    @errors[:bank_code] = Ibandit.translate(:is_invalid)
    false
  end
end

#valid_bank_code_length?Boolean

Returns:

  • (Boolean)


132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/ibandit/iban.rb', line 132

def valid_bank_code_length?
  return unless valid_country_code?

  if swift_bank_code.nil? || swift_bank_code.length == 0
    @errors[:bank_code] = Ibandit.translate(:is_required)
    return false
  end

  return true if swift_bank_code.length == structure[:bank_code_length]

  @errors[:bank_code] =
    Ibandit.translate(:wrong_length, expected: structure[:bank_code_length])
  false
end

#valid_branch_code_format?Boolean

Returns:

  • (Boolean)


219
220
221
222
223
224
225
226
227
228
229
# File 'lib/ibandit/iban.rb', line 219

def valid_branch_code_format?
  return unless valid_branch_code_length?
  return true unless structure[:branch_code_format]

  if swift_branch_code =~ Regexp.new(structure[:branch_code_format])
    true
  else
    @errors[:branch_code] = Ibandit.translate(:is_invalid)
    false
  end
end

#valid_branch_code_length?Boolean

Returns:

  • (Boolean)


147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/ibandit/iban.rb', line 147

def valid_branch_code_length?
  return unless valid_country_code?
  if swift_branch_code.to_s.length == structure[:branch_code_length]
    return true
  end

  if structure[:branch_code_length] == 0
    @errors[:branch_code] = Ibandit.translate(:not_used_in_country,
                                              country_code: country_code)
  elsif swift_branch_code.nil? || swift_branch_code.length == 0
    @errors[:branch_code] = Ibandit.translate(:is_required)
  else
    @errors[:branch_code] =
      Ibandit.translate(:wrong_length,
                        expected: structure[:branch_code_length])
  end
  false
end

#valid_characters?Boolean

Returns:

  • (Boolean)


184
185
186
187
188
189
190
191
192
193
194
# File 'lib/ibandit/iban.rb', line 184

def valid_characters?
  return if iban.nil?
  if iban.scan(/[^A-Z0-9]/).any?
    @errors[:characters] =
      Ibandit.translate(:non_alphanumeric_characters,
                        characters: iban.scan(/[^A-Z\d]/).join(' '))
    false
  else
    true
  end
end

#valid_check_digits?Boolean

Returns:

  • (Boolean)


103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/ibandit/iban.rb', line 103

def valid_check_digits?
  return unless decomposable? && valid_characters?

  expected_check_digits = CheckDigit.iban(country_code, bban)
  if check_digits == expected_check_digits
    true
  else
    @errors[:check_digits] =
      Ibandit.translate(:invalid_check_digits,
                        expected_check_digits: expected_check_digits,
                        check_digits: check_digits)
    false
  end
end

#valid_country_code?Boolean

Returns:

  • (Boolean)


93
94
95
96
97
98
99
100
101
# File 'lib/ibandit/iban.rb', line 93

def valid_country_code?
  if Ibandit.structures.key?(country_code)
    true
  else
    @errors[:country_code] = Ibandit.translate(:invalid_country_code,
                                               country_code: country_code)
    false
  end
end

#valid_format?Boolean

Returns:

  • (Boolean)


196
197
198
199
200
201
202
203
204
205
206
# File 'lib/ibandit/iban.rb', line 196

def valid_format?
  return unless valid_country_code?

  if bban =~ Regexp.new(structure[:bban_format])
    true
  else
    @errors[:format] = Ibandit.translate(:invalid_format,
                                         country_code: country_code)
    false
  end
end

#valid_length?Boolean

Returns:

  • (Boolean)


118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/ibandit/iban.rb', line 118

def valid_length?
  return unless valid_country_code? && !iban.nil?

  if iban.length == structure[:total_length]
    true
  else
    @errors[:length] =
      Ibandit.translate(:invalid_length,
                        expected_length: structure[:total_length],
                        length: iban.size)
    false
  end
end

#valid_local_modulus_check?Boolean

Returns:

  • (Boolean)


242
243
244
245
246
247
248
249
# File 'lib/ibandit/iban.rb', line 242

def valid_local_modulus_check?
  return unless valid_format?
  return true unless Ibandit.modulus_checker

  valid_modulus_check_bank_code? &&
    valid_modulus_check_branch_code? &&
    
end

#valid_swedish_details?Boolean

Returns:

  • (Boolean)


278
279
280
281
282
283
284
285
286
# File 'lib/ibandit/iban.rb', line 278

def valid_swedish_details?
  return true unless country_code == 'SE'

  if branch_code
    valid_swedish_local_details?
  else
    valid_swedish_swift_details?
  end
end

#valid_swedish_local_details?Boolean

Returns:

  • (Boolean)


310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/ibandit/iban.rb', line 310

def valid_swedish_local_details?
  unless Sweden::Validator.valid_clearing_code_length?(branch_code)
    @errors[:branch_code] = Ibandit.translate(:is_invalid)
    return false
  end

  valid_serial_number = Sweden::Validator.valid_serial_number_length?(
    clearing_code: branch_code,
    serial_number: 
  )

  unless valid_serial_number
    @errors[:account_number] = Ibandit.translate(:is_invalid)
    return false
  end

  true
end

#valid_swedish_swift_details?Boolean

Returns:

  • (Boolean)


288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
# File 'lib/ibandit/iban.rb', line 288

def valid_swedish_swift_details?
  unless Sweden::Validator.bank_code_exists?(swift_bank_code)
    bank_code_field = bank_code.nil? ? :account_number : :bank_code
    @errors[bank_code_field] = Ibandit.translate(:is_invalid)
    @errors.delete(:bank_code) if bank_code.nil?
    return false
  end

  length_valid =
    Sweden::Validator.(
      bank_code: swift_bank_code,
      account_number: 
    )

  unless length_valid
    @errors[:account_number] = Ibandit.translate(:is_invalid)
    return false
  end

  true
end