ibandit 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.rubocop.yml +5 -1
 - data/CHANGELOG.md +4 -0
 - data/README.md +48 -6
 - data/data/raw/structure_additions.yml +4 -0
 - data/data/structures.yml +3 -0
 - data/ibandit.gemspec +4 -4
 - data/lib/ibandit.rb +3 -0
 - data/lib/ibandit/constants.rb +10 -0
 - data/lib/ibandit/iban.rb +82 -32
 - data/lib/ibandit/iban_assembler.rb +5 -6
 - data/lib/ibandit/local_details_cleaner.rb +29 -11
 - data/lib/ibandit/pseudo_iban_assembler.rb +77 -0
 - data/lib/ibandit/pseudo_iban_splitter.rb +86 -0
 - data/lib/ibandit/swedish_details_converter.rb +80 -33
 - data/lib/ibandit/version.rb +1 -1
 - data/spec/ibandit/iban_assembler_spec.rb +3 -3
 - data/spec/ibandit/iban_spec.rb +61 -4
 - data/spec/ibandit/local_details_cleaner_spec.rb +118 -106
 - data/spec/ibandit/pseudo_iban_assembler_spec.rb +54 -0
 - data/spec/ibandit/pseudo_iban_splitter_spec.rb +36 -0
 - data/spec/ibandit/swedish_details_converter_spec.rb +112 -37
 - metadata +34 -29
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 0bc26110597f8350ef5b91b0b2fbee330c21bc7b
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 3b1d66ea7ceb6b58f275d164e4e873c34416ddd4
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 32ad174ca626b5f73fff4472fc42699146b57d194a871b480cd30765efe7b74d7c918f9f92e75500b2367243521f128282730220818369d6105482ef257f8360
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 9440bd30011a7d61f2dd2beec9ee115ab27c0ca9af6cea75b2022d48ac3e25dfc49e3bfcdeb44665e2c0fe3ce1c3978494e9cd4233c80d25a51c280e596938ee
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    | 
         @@ -12,7 +12,7 @@ LineLength: 
     | 
|
| 
       12 
12 
     | 
    
         
             
              Max: 80
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
            ClassLength:
         
     | 
| 
       15 
     | 
    
         
            -
              Max:  
     | 
| 
      
 15 
     | 
    
         
            +
              Max: 400
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
            # Avoid single-line methods.
         
     | 
| 
       18 
18 
     | 
    
         
             
            SingleLineMethods:
         
     | 
| 
         @@ -39,5 +39,9 @@ Style/AsciiComments: 
     | 
|
| 
       39 
39 
     | 
    
         
             
            Metrics/MethodLength:
         
     | 
| 
       40 
40 
     | 
    
         
             
              Max: 25
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
      
 42 
     | 
    
         
            +
            # Configuration parameters: CountComments.
         
     | 
| 
      
 43 
     | 
    
         
            +
            Metrics/ModuleLength:
         
     | 
| 
      
 44 
     | 
    
         
            +
              Max: 400
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
       42 
46 
     | 
    
         
             
            Style/DotPosition:
         
     | 
| 
       43 
47 
     | 
    
         
             
              EnforcedStyle: 'trailing'
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -97,13 +97,13 @@ county combines them: 
     | 
|
| 
       97 
97 
     | 
    
         
             
            `check_digits`
         
     | 
| 
       98 
98 
     | 
    
         
             
            :    Two digits calculated using part of the ISO/IEC 7064:2003 standard
         
     | 
| 
       99 
99 
     | 
    
         | 
| 
       100 
     | 
    
         
            -
            ` 
     | 
| 
      
 100 
     | 
    
         
            +
            `swift_bank_code`
         
     | 
| 
       101 
101 
     | 
    
         
             
            :    The SWIFT identifier for the bank to which the IBAN refers
         
     | 
| 
       102 
102 
     | 
    
         | 
| 
       103 
     | 
    
         
            -
            ` 
     | 
| 
      
 103 
     | 
    
         
            +
            `swift_branch_code`
         
     | 
| 
       104 
104 
     | 
    
         
             
            :    The SWIFT identifer for the branch to which the IBAN refers (not used in all countries)
         
     | 
| 
       105 
105 
     | 
    
         | 
| 
       106 
     | 
    
         
            -
            ` 
     | 
| 
      
 106 
     | 
    
         
            +
            `swift_account_number`
         
     | 
| 
       107 
107 
     | 
    
         
             
            :    The account number for the account
         
     | 
| 
       108 
108 
     | 
    
         | 
| 
       109 
109 
     | 
    
         
             
            `iban_national_id`
         
     | 
| 
         @@ -116,9 +116,9 @@ iban = Ibandit::IBAN.new("GB82 WEST 1234 5698 7654 32") 
     | 
|
| 
       116 
116 
     | 
    
         | 
| 
       117 
117 
     | 
    
         
             
            iban.country_code              # => "GB"
         
     | 
| 
       118 
118 
     | 
    
         
             
            iban.check_digits              # => "82"
         
     | 
| 
       119 
     | 
    
         
            -
            iban. 
     | 
| 
       120 
     | 
    
         
            -
            iban. 
     | 
| 
       121 
     | 
    
         
            -
            iban. 
     | 
| 
      
 119 
     | 
    
         
            +
            iban.swift_bank_code           # => "WEST"
         
     | 
| 
      
 120 
     | 
    
         
            +
            iban.swift_branch_code         # => "123456"
         
     | 
| 
      
 121 
     | 
    
         
            +
            iban.swift_account_number      # => "98765432"
         
     | 
| 
       122 
122 
     | 
    
         
             
            iban.iban_national_id          # => "WEST123456"
         
     | 
| 
       123 
123 
     | 
    
         
             
            ```
         
     | 
| 
       124 
124 
     | 
    
         | 
| 
         @@ -131,6 +131,23 @@ iban = Ibandit::IBAN.new("ES12 1234 5678 9112 3456 7890") 
     | 
|
| 
       131 
131 
     | 
    
         
             
            iban.local_check_digits        # => "91"
         
     | 
| 
       132 
132 
     | 
    
         
             
            ```
         
     | 
| 
       133 
133 
     | 
    
         | 
| 
      
 134 
     | 
    
         
            +
            In some countries, the SWIFT-defined details differ from the local details that
         
     | 
| 
      
 135 
     | 
    
         
            +
            customers are familiar with.  For this reason, there are also `bank_code`,
         
     | 
| 
      
 136 
     | 
    
         
            +
            `branch_code` and `account_number` methods on an `IBAN` object.  At present,
         
     | 
| 
      
 137 
     | 
    
         
            +
            these only differ from the `swift_` equivalents for Swedish bank accounts.
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 140 
     | 
    
         
            +
            iban = Ibandit::IBAN.new(
         
     | 
| 
      
 141 
     | 
    
         
            +
              country_code: 'SE',
         
     | 
| 
      
 142 
     | 
    
         
            +
              account_number: '7507-1211203'
         
     | 
| 
      
 143 
     | 
    
         
            +
            )
         
     | 
| 
      
 144 
     | 
    
         
            +
            iban.swift_account_number      # => "75071211203"
         
     | 
| 
      
 145 
     | 
    
         
            +
            iban.account_number            # => "1211203"
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
            iban.swift_branch_code         # => nil
         
     | 
| 
      
 148 
     | 
    
         
            +
            iban.branch_code               # => "7507"
         
     | 
| 
      
 149 
     | 
    
         
            +
            ```
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
       134 
151 
     | 
    
         
             
            ### Initializing Ibandit
         
     | 
| 
       135 
152 
     | 
    
         | 
| 
       136 
153 
     | 
    
         
             
            The UK and Ireland both use part of the BIC as the `bank_code` in their IBANs.
         
     | 
| 
         @@ -420,6 +437,31 @@ iban = Ibandit::IBAN.new( 
     | 
|
| 
       420 
437 
     | 
    
         
             
            iban.iban                     # => "GB60BARC20000055779911"
         
     | 
| 
       421 
438 
     | 
    
         
             
            ```
         
     | 
| 
       422 
439 
     | 
    
         | 
| 
      
 440 
     | 
    
         
            +
            ### Pseudo-IBANs
         
     | 
| 
      
 441 
     | 
    
         
            +
             
     | 
| 
      
 442 
     | 
    
         
            +
            In some countries, it is not possible to recover local banking details from an
         
     | 
| 
      
 443 
     | 
    
         
            +
            IBAN.  For this reason, Ibandit has a concept of a *pseudo-IBAN*.  This is a
         
     | 
| 
      
 444 
     | 
    
         
            +
            string with a similar structure to an IBAN that can be decomposed into local
         
     | 
| 
      
 445 
     | 
    
         
            +
            banking details.  Pseudo-IBANs can be recognized by the fact that they have `ZZ`
         
     | 
| 
      
 446 
     | 
    
         
            +
            as the third and fourth characters (these would be check digits for a regular
         
     | 
| 
      
 447 
     | 
    
         
            +
            IBAN).
         
     | 
| 
      
 448 
     | 
    
         
            +
             
     | 
| 
      
 449 
     | 
    
         
            +
            ```
         
     | 
| 
      
 450 
     | 
    
         
            +
            iban = Ibandit::IBAN.new(
         
     | 
| 
      
 451 
     | 
    
         
            +
              country_code: 'SE',
         
     | 
| 
      
 452 
     | 
    
         
            +
              branch_code: '7507',
         
     | 
| 
      
 453 
     | 
    
         
            +
              account_number: '1211203'
         
     | 
| 
      
 454 
     | 
    
         
            +
            )
         
     | 
| 
      
 455 
     | 
    
         
            +
            iban.pseudo_iban              # => "SEZZX7507XXX1211203"
         
     | 
| 
      
 456 
     | 
    
         
            +
             
     | 
| 
      
 457 
     | 
    
         
            +
            iban = Ibandit::IBAN.new('SEZZX7507XXX1211203')
         
     | 
| 
      
 458 
     | 
    
         
            +
            iban.country_code             # => "SE"
         
     | 
| 
      
 459 
     | 
    
         
            +
            iban.branch_code              # => "7507"
         
     | 
| 
      
 460 
     | 
    
         
            +
            iban.account_number           # => "1211203"
         
     | 
| 
      
 461 
     | 
    
         
            +
            ```
         
     | 
| 
      
 462 
     | 
    
         
            +
             
     | 
| 
      
 463 
     | 
    
         
            +
            At present, pseudo-IBANs are only available for Swedish bank accounts.
         
     | 
| 
      
 464 
     | 
    
         
            +
             
     | 
| 
       423 
465 
     | 
    
         
             
            ## Other libraries
         
     | 
| 
       424 
466 
     | 
    
         | 
| 
       425 
467 
     | 
    
         
             
            Another gem, [iban-tools](https://github.com/alphasights/iban-tools), also
         
     | 
| 
         @@ -76,6 +76,10 @@ QA: 
     | 
|
| 
       76 
76 
     | 
    
         
             
            SA:
         
     | 
| 
       77 
77 
     | 
    
         
             
              :bank_code_format: \d{2}
         
     | 
| 
       78 
78 
     | 
    
         
             
              :account_number_format: '[A-Z0-9]{18}'
         
     | 
| 
      
 79 
     | 
    
         
            +
            SE:
         
     | 
| 
      
 80 
     | 
    
         
            +
              :pseudo_iban_bank_code_length: 0
         
     | 
| 
      
 81 
     | 
    
         
            +
              :pseudo_iban_branch_code_length: 5
         
     | 
| 
      
 82 
     | 
    
         
            +
              :pseudo_iban_account_number_length: 10
         
     | 
| 
       79 
83 
     | 
    
         
             
            SI:
         
     | 
| 
       80 
84 
     | 
    
         
             
              :bank_code_format: \d{5}
         
     | 
| 
       81 
85 
     | 
    
         
             
              :account_number_format: \d{8}\d{2}
         
     | 
    
        data/data/structures.yml
    CHANGED
    
    | 
         @@ -736,6 +736,9 @@ SE: 
     | 
|
| 
       736 
736 
     | 
    
         
             
              :bban_format: \d{3}\d{16}\d{1}
         
     | 
| 
       737 
737 
     | 
    
         
             
              :bank_code_format: \d{3}
         
     | 
| 
       738 
738 
     | 
    
         
             
              :account_number_format: \d{16}\d{1}
         
     | 
| 
      
 739 
     | 
    
         
            +
              :pseudo_iban_bank_code_length: 0
         
     | 
| 
      
 740 
     | 
    
         
            +
              :pseudo_iban_branch_code_length: 5
         
     | 
| 
      
 741 
     | 
    
         
            +
              :pseudo_iban_account_number_length: 10
         
     | 
| 
       739 
742 
     | 
    
         
             
            SI:
         
     | 
| 
       740 
743 
     | 
    
         
             
              :bank_code_position: 5
         
     | 
| 
       741 
744 
     | 
    
         
             
              :bank_code_length: 5
         
     | 
    
        data/ibandit.gemspec
    CHANGED
    
    | 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require File.expand_path('../lib/ibandit/version', __FILE__)
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Gem::Specification.new do |gem|
         
     | 
| 
       4 
     | 
    
         
            -
              gem.add_development_dependency 'rspec',           '~> 3. 
     | 
| 
       5 
     | 
    
         
            -
              gem.add_development_dependency 'rspec-its',       '~> 1. 
     | 
| 
       6 
     | 
    
         
            -
              gem.add_development_dependency 'rubocop',         '~> 0. 
     | 
| 
       7 
     | 
    
         
            -
              gem.add_development_dependency 'sax-machine',     '~> 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              gem.add_development_dependency 'rspec',           '~> 3.3'
         
     | 
| 
      
 5 
     | 
    
         
            +
              gem.add_development_dependency 'rspec-its',       '~> 1.2'
         
     | 
| 
      
 6 
     | 
    
         
            +
              gem.add_development_dependency 'rubocop',         '~> 0.33.0'
         
     | 
| 
      
 7 
     | 
    
         
            +
              gem.add_development_dependency 'sax-machine',     '~> 1.3'
         
     | 
| 
       8 
8 
     | 
    
         
             
              gem.add_development_dependency 'nokogiri',        '~> 1.6'
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              gem.add_runtime_dependency 'i18n', '~> 0.7.0'
         
     | 
    
        data/lib/ibandit.rb
    CHANGED
    
    | 
         @@ -1,11 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'i18n'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'ibandit/version'
         
     | 
| 
       3 
3 
     | 
    
         
             
            require 'ibandit/errors'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'ibandit/constants'
         
     | 
| 
       4 
5 
     | 
    
         
             
            require 'ibandit/iban'
         
     | 
| 
       5 
6 
     | 
    
         
             
            require 'ibandit/german_details_converter'
         
     | 
| 
       6 
7 
     | 
    
         
             
            require 'ibandit/swedish_details_converter'
         
     | 
| 
       7 
8 
     | 
    
         
             
            require 'ibandit/iban_splitter'
         
     | 
| 
       8 
9 
     | 
    
         
             
            require 'ibandit/iban_assembler'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'ibandit/pseudo_iban_assembler'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'ibandit/pseudo_iban_splitter'
         
     | 
| 
       9 
12 
     | 
    
         
             
            require 'ibandit/local_details_cleaner'
         
     | 
| 
       10 
13 
     | 
    
         
             
            require 'ibandit/check_digit'
         
     | 
| 
       11 
14 
     | 
    
         | 
| 
         @@ -0,0 +1,10 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Ibandit
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Constants
         
     | 
| 
      
 3 
     | 
    
         
            +
                SUPPORTED_COUNTRY_CODES = %w(AT BE BG CY CZ DE DK EE ES FI FR GB GR HR HU IE
         
     | 
| 
      
 4 
     | 
    
         
            +
                                             IS IT LT LU LV MC MT NL NO PL PT RO SE SI SK
         
     | 
| 
      
 5 
     | 
    
         
            +
                                             SM).freeze
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                PSEUDO_IBAN_COUNTRY_CODES = %w(SE).freeze
         
     | 
| 
      
 8 
     | 
    
         
            +
                PSEUDO_IBAN_CHECK_DIGITS = 'ZZ'.freeze
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/ibandit/iban.rb
    CHANGED
    
    | 
         @@ -2,13 +2,21 @@ require 'yaml' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module Ibandit
         
     | 
| 
       4 
4 
     | 
    
         
             
              class IBAN
         
     | 
| 
       5 
     | 
    
         
            -
                attr_reader :errors, :iban, 
     | 
| 
       6 
     | 
    
         
            -
                            :branch_code, :account_number
         
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :errors, :iban, :country_code, :check_digits, :bank_code,
         
     | 
| 
      
 6 
     | 
    
         
            +
                            :branch_code, :account_number, :swift_bank_code,
         
     | 
| 
      
 7 
     | 
    
         
            +
                            :swift_branch_code, :swift_account_number
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
       8 
9 
     | 
    
         
             
                def initialize(argument)
         
     | 
| 
       9 
10 
     | 
    
         
             
                  if argument.is_a?(String)
         
     | 
| 
       10 
     | 
    
         
            -
                     
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                    input = argument.to_s.gsub(/\s+/, '').upcase
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    if pseudo_iban?(input)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      local_details = PseudoIBANSplitter.new(input).split
         
     | 
| 
      
 15 
     | 
    
         
            +
                      build_iban_from_local_details(local_details)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    else
         
     | 
| 
      
 17 
     | 
    
         
            +
                      @iban = input
         
     | 
| 
      
 18 
     | 
    
         
            +
                      extract_swift_details_from_iban!
         
     | 
| 
      
 19 
     | 
    
         
            +
                    end
         
     | 
| 
       12 
20 
     | 
    
         
             
                  elsif argument.is_a?(Hash)
         
     | 
| 
       13 
21 
     | 
    
         
             
                    build_iban_from_local_details(argument)
         
     | 
| 
       14 
22 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -33,8 +41,8 @@ module Ibandit 
     | 
|
| 
       33 
41 
     | 
    
         
             
                def iban_national_id
         
     | 
| 
       34 
42 
     | 
    
         
             
                  return unless decomposable?
         
     | 
| 
       35 
43 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
                  national_id =  
     | 
| 
       37 
     | 
    
         
            -
                  national_id +=  
     | 
| 
      
 44 
     | 
    
         
            +
                  national_id = swift_bank_code.to_s
         
     | 
| 
      
 45 
     | 
    
         
            +
                  national_id += swift_branch_code.to_s
         
     | 
| 
       38 
46 
     | 
    
         
             
                  national_id.slice(0, structure[:iban_national_id_length])
         
     | 
| 
       39 
47 
     | 
    
         
             
                end
         
     | 
| 
       40 
48 
     | 
    
         | 
| 
         @@ -51,6 +59,15 @@ module Ibandit 
     | 
|
| 
       51 
59 
     | 
    
         
             
                  iban[4..-1] unless iban.nil?
         
     | 
| 
       52 
60 
     | 
    
         
             
                end
         
     | 
| 
       53 
61 
     | 
    
         | 
| 
      
 62 
     | 
    
         
            +
                def pseudo_iban
         
     | 
| 
      
 63 
     | 
    
         
            +
                  @pseudo_iban ||= PseudoIBANAssembler.new(
         
     | 
| 
      
 64 
     | 
    
         
            +
                    country_code: country_code,
         
     | 
| 
      
 65 
     | 
    
         
            +
                    bank_code: bank_code,
         
     | 
| 
      
 66 
     | 
    
         
            +
                    branch_code: branch_code,
         
     | 
| 
      
 67 
     | 
    
         
            +
                    account_number: account_number
         
     | 
| 
      
 68 
     | 
    
         
            +
                  ).assemble
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
       54 
71 
     | 
    
         
             
                ###############
         
     | 
| 
       55 
72 
     | 
    
         
             
                # Validations #
         
     | 
| 
       56 
73 
     | 
    
         
             
                ###############
         
     | 
| 
         @@ -115,12 +132,12 @@ module Ibandit 
     | 
|
| 
       115 
132 
     | 
    
         
             
                def valid_bank_code_length?
         
     | 
| 
       116 
133 
     | 
    
         
             
                  return unless valid_country_code?
         
     | 
| 
       117 
134 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
                  if  
     | 
| 
      
 135 
     | 
    
         
            +
                  if swift_bank_code.nil? || swift_bank_code.length == 0
         
     | 
| 
       119 
136 
     | 
    
         
             
                    @errors[:bank_code] = Ibandit.translate(:is_required)
         
     | 
| 
       120 
137 
     | 
    
         
             
                    return false
         
     | 
| 
       121 
138 
     | 
    
         
             
                  end
         
     | 
| 
       122 
139 
     | 
    
         | 
| 
       123 
     | 
    
         
            -
                  return true if  
     | 
| 
      
 140 
     | 
    
         
            +
                  return true if swift_bank_code.length == structure[:bank_code_length]
         
     | 
| 
       124 
141 
     | 
    
         | 
| 
       125 
142 
     | 
    
         
             
                  @errors[:bank_code] =
         
     | 
| 
       126 
143 
     | 
    
         
             
                    Ibandit.translate(:wrong_length, expected: structure[:bank_code_length])
         
     | 
| 
         @@ -129,12 +146,14 @@ module Ibandit 
     | 
|
| 
       129 
146 
     | 
    
         | 
| 
       130 
147 
     | 
    
         
             
                def valid_branch_code_length?
         
     | 
| 
       131 
148 
     | 
    
         
             
                  return unless valid_country_code?
         
     | 
| 
       132 
     | 
    
         
            -
                   
     | 
| 
      
 149 
     | 
    
         
            +
                  if swift_branch_code.to_s.length == structure[:branch_code_length]
         
     | 
| 
      
 150 
     | 
    
         
            +
                    return true
         
     | 
| 
      
 151 
     | 
    
         
            +
                  end
         
     | 
| 
       133 
152 
     | 
    
         | 
| 
       134 
153 
     | 
    
         
             
                  if structure[:branch_code_length] == 0
         
     | 
| 
       135 
154 
     | 
    
         
             
                    @errors[:branch_code] = Ibandit.translate(:not_used_in_country,
         
     | 
| 
       136 
155 
     | 
    
         
             
                                                              country_code: country_code)
         
     | 
| 
       137 
     | 
    
         
            -
                  elsif  
     | 
| 
      
 156 
     | 
    
         
            +
                  elsif swift_branch_code.nil? || swift_branch_code.length == 0
         
     | 
| 
       138 
157 
     | 
    
         
             
                    @errors[:branch_code] = Ibandit.translate(:is_required)
         
     | 
| 
       139 
158 
     | 
    
         
             
                  else
         
     | 
| 
       140 
159 
     | 
    
         
             
                    @errors[:branch_code] =
         
     | 
| 
         @@ -147,12 +166,14 @@ module Ibandit 
     | 
|
| 
       147 
166 
     | 
    
         
             
                def valid_account_number_length?
         
     | 
| 
       148 
167 
     | 
    
         
             
                  return unless valid_country_code?
         
     | 
| 
       149 
168 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
                  if  
     | 
| 
      
 169 
     | 
    
         
            +
                  if swift_account_number.nil?
         
     | 
| 
       151 
170 
     | 
    
         
             
                    @errors[:account_number] = Ibandit.translate(:is_required)
         
     | 
| 
       152 
171 
     | 
    
         
             
                    return false
         
     | 
| 
       153 
172 
     | 
    
         
             
                  end
         
     | 
| 
       154 
173 
     | 
    
         | 
| 
       155 
     | 
    
         
            -
                   
     | 
| 
      
 174 
     | 
    
         
            +
                  if swift_account_number.length == structure[:account_number_length]
         
     | 
| 
      
 175 
     | 
    
         
            +
                    return true
         
     | 
| 
      
 176 
     | 
    
         
            +
                  end
         
     | 
| 
       156 
177 
     | 
    
         | 
| 
       157 
178 
     | 
    
         
             
                  @errors[:account_number] =
         
     | 
| 
       158 
179 
     | 
    
         
             
                    Ibandit.translate(:wrong_length,
         
     | 
| 
         @@ -187,7 +208,7 @@ module Ibandit 
     | 
|
| 
       187 
208 
     | 
    
         
             
                def valid_bank_code_format?
         
     | 
| 
       188 
209 
     | 
    
         
             
                  return unless valid_bank_code_length?
         
     | 
| 
       189 
210 
     | 
    
         | 
| 
       190 
     | 
    
         
            -
                  if  
     | 
| 
      
 211 
     | 
    
         
            +
                  if swift_bank_code =~ Regexp.new(structure[:bank_code_format])
         
     | 
| 
       191 
212 
     | 
    
         
             
                    true
         
     | 
| 
       192 
213 
     | 
    
         
             
                  else
         
     | 
| 
       193 
214 
     | 
    
         
             
                    @errors[:bank_code] = Ibandit.translate(:is_invalid)
         
     | 
| 
         @@ -199,7 +220,7 @@ module Ibandit 
     | 
|
| 
       199 
220 
     | 
    
         
             
                  return unless valid_branch_code_length?
         
     | 
| 
       200 
221 
     | 
    
         
             
                  return true unless structure[:branch_code_format]
         
     | 
| 
       201 
222 
     | 
    
         | 
| 
       202 
     | 
    
         
            -
                  if  
     | 
| 
      
 223 
     | 
    
         
            +
                  if swift_branch_code =~ Regexp.new(structure[:branch_code_format])
         
     | 
| 
       203 
224 
     | 
    
         
             
                    true
         
     | 
| 
       204 
225 
     | 
    
         
             
                  else
         
     | 
| 
       205 
226 
     | 
    
         
             
                    @errors[:branch_code] = Ibandit.translate(:is_invalid)
         
     | 
| 
         @@ -210,7 +231,7 @@ module Ibandit 
     | 
|
| 
       210 
231 
     | 
    
         
             
                def valid_account_number_format?
         
     | 
| 
       211 
232 
     | 
    
         
             
                  return unless valid_account_number_length?
         
     | 
| 
       212 
233 
     | 
    
         | 
| 
       213 
     | 
    
         
            -
                  if  
     | 
| 
      
 234 
     | 
    
         
            +
                  if swift_account_number =~ Regexp.new(structure[:account_number_format])
         
     | 
| 
       214 
235 
     | 
    
         
             
                    true
         
     | 
| 
       215 
236 
     | 
    
         
             
                  else
         
     | 
| 
       216 
237 
     | 
    
         
             
                    @errors[:account_number] = Ibandit.translate(:is_invalid)
         
     | 
| 
         @@ -242,8 +263,8 @@ module Ibandit 
     | 
|
| 
       242 
263 
     | 
    
         
             
                  begin
         
     | 
| 
       243 
264 
     | 
    
         
             
                    GermanDetailsConverter.convert(
         
     | 
| 
       244 
265 
     | 
    
         
             
                      country_code: country_code,
         
     | 
| 
       245 
     | 
    
         
            -
                      bank_code:  
     | 
| 
       246 
     | 
    
         
            -
                      account_number:  
     | 
| 
      
 266 
     | 
    
         
            +
                      bank_code: swift_bank_code,
         
     | 
| 
      
 267 
     | 
    
         
            +
                      account_number: swift_account_number
         
     | 
| 
       247 
268 
     | 
    
         
             
                    )
         
     | 
| 
       248 
269 
     | 
    
         
             
                    true
         
     | 
| 
       249 
270 
     | 
    
         
             
                  rescue UnsupportedAccountDetails
         
     | 
| 
         @@ -255,7 +276,10 @@ module Ibandit 
     | 
|
| 
       255 
276 
     | 
    
         
             
                def valid_swedish_details?
         
     | 
| 
       256 
277 
     | 
    
         
             
                  return true unless country_code == 'SE'
         
     | 
| 
       257 
278 
     | 
    
         | 
| 
       258 
     | 
    
         
            -
                  bank_details = { 
     | 
| 
      
 279 
     | 
    
         
            +
                  bank_details = {
         
     | 
| 
      
 280 
     | 
    
         
            +
                    bank_code: swift_bank_code,
         
     | 
| 
      
 281 
     | 
    
         
            +
                    account_number: swift_account_number
         
     | 
| 
      
 282 
     | 
    
         
            +
                  }
         
     | 
| 
       259 
283 
     | 
    
         | 
| 
       260 
284 
     | 
    
         
             
                  unless SwedishDetailsConverter.valid_bank_code?(bank_details)
         
     | 
| 
       261 
285 
     | 
    
         
             
                    bank_code_field = bank_code.nil? ? :account_number : :bank_code
         
     | 
| 
         @@ -279,28 +303,41 @@ module Ibandit 
     | 
|
| 
       279 
303 
     | 
    
         
             
                private
         
     | 
| 
       280 
304 
     | 
    
         | 
| 
       281 
305 
     | 
    
         
             
                def decomposable?
         
     | 
| 
       282 
     | 
    
         
            -
                  [iban, country_code,  
     | 
| 
      
 306 
     | 
    
         
            +
                  [iban, country_code, swift_bank_code, swift_account_number].none?(&:nil?)
         
     | 
| 
       283 
307 
     | 
    
         
             
                end
         
     | 
| 
       284 
308 
     | 
    
         | 
| 
       285 
309 
     | 
    
         
             
                def build_iban_from_local_details(details_hash)
         
     | 
| 
       286 
310 
     | 
    
         
             
                  local_details = LocalDetailsCleaner.clean(details_hash)
         
     | 
| 
       287 
311 
     | 
    
         | 
| 
       288 
     | 
    
         
            -
                  @country_code 
     | 
| 
       289 
     | 
    
         
            -
                  @account_number 
     | 
| 
       290 
     | 
    
         
            -
                  @branch_code 
     | 
| 
       291 
     | 
    
         
            -
                  @bank_code 
     | 
| 
       292 
     | 
    
         
            -
             
     | 
| 
       293 
     | 
    
         
            -
                  @ 
     | 
| 
      
 312 
     | 
    
         
            +
                  @country_code         = try_dup(local_details[:country_code])
         
     | 
| 
      
 313 
     | 
    
         
            +
                  @account_number       = try_dup(local_details[:account_number])
         
     | 
| 
      
 314 
     | 
    
         
            +
                  @branch_code          = try_dup(local_details[:branch_code])
         
     | 
| 
      
 315 
     | 
    
         
            +
                  @bank_code            = try_dup(local_details[:bank_code])
         
     | 
| 
      
 316 
     | 
    
         
            +
             
     | 
| 
      
 317 
     | 
    
         
            +
                  @swift_account_number = try_dup(local_details[:swift_account_number])
         
     | 
| 
      
 318 
     | 
    
         
            +
                  @swift_branch_code    = try_dup(local_details[:swift_branch_code])
         
     | 
| 
      
 319 
     | 
    
         
            +
                  @swift_bank_code      = try_dup(local_details[:swift_bank_code])
         
     | 
| 
      
 320 
     | 
    
         
            +
             
     | 
| 
      
 321 
     | 
    
         
            +
                  @iban                 = IBANAssembler.assemble(swift_details)
         
     | 
| 
      
 322 
     | 
    
         
            +
                  @check_digits         = @iban.slice(2, 2) unless @iban.nil?
         
     | 
| 
       294 
323 
     | 
    
         
             
                end
         
     | 
| 
       295 
324 
     | 
    
         | 
| 
       296 
     | 
    
         
            -
                def  
     | 
| 
       297 
     | 
    
         
            -
                   
     | 
| 
      
 325 
     | 
    
         
            +
                def extract_swift_details_from_iban!
         
     | 
| 
      
 326 
     | 
    
         
            +
                  swift_details = IBANSplitter.split(@iban)
         
     | 
| 
      
 327 
     | 
    
         
            +
             
     | 
| 
      
 328 
     | 
    
         
            +
                  @country_code         = swift_details[:country_code]
         
     | 
| 
      
 329 
     | 
    
         
            +
                  @check_digits         = swift_details[:check_digits]
         
     | 
| 
       298 
330 
     | 
    
         | 
| 
       299 
     | 
    
         
            -
                  @ 
     | 
| 
       300 
     | 
    
         
            -
                  @ 
     | 
| 
       301 
     | 
    
         
            -
                  @ 
     | 
| 
       302 
     | 
    
         
            -
             
     | 
| 
       303 
     | 
    
         
            -
                   
     | 
| 
      
 331 
     | 
    
         
            +
                  @swift_bank_code      = swift_details[:bank_code]
         
     | 
| 
      
 332 
     | 
    
         
            +
                  @swift_branch_code    = swift_details[:branch_code]
         
     | 
| 
      
 333 
     | 
    
         
            +
                  @swift_account_number = swift_details[:account_number]
         
     | 
| 
      
 334 
     | 
    
         
            +
             
     | 
| 
      
 335 
     | 
    
         
            +
                  return if Constants::PSEUDO_IBAN_COUNTRY_CODES.
         
     | 
| 
      
 336 
     | 
    
         
            +
                            include?(@country_code)
         
     | 
| 
      
 337 
     | 
    
         
            +
             
     | 
| 
      
 338 
     | 
    
         
            +
                  @bank_code      = swift_details[:bank_code]
         
     | 
| 
      
 339 
     | 
    
         
            +
                  @branch_code    = swift_details[:branch_code]
         
     | 
| 
      
 340 
     | 
    
         
            +
                  @account_number = swift_details[:account_number]
         
     | 
| 
       304 
341 
     | 
    
         
             
                end
         
     | 
| 
       305 
342 
     | 
    
         | 
| 
       306 
343 
     | 
    
         
             
                def try_dup(object)
         
     | 
| 
         @@ -339,5 +376,18 @@ module Ibandit 
     | 
|
| 
       339 
376 
     | 
    
         
             
                    :bank_code
         
     | 
| 
       340 
377 
     | 
    
         
             
                  end
         
     | 
| 
       341 
378 
     | 
    
         
             
                end
         
     | 
| 
      
 379 
     | 
    
         
            +
             
     | 
| 
      
 380 
     | 
    
         
            +
                def swift_details
         
     | 
| 
      
 381 
     | 
    
         
            +
                  {
         
     | 
| 
      
 382 
     | 
    
         
            +
                    country_code: @country_code,
         
     | 
| 
      
 383 
     | 
    
         
            +
                    account_number: @swift_account_number,
         
     | 
| 
      
 384 
     | 
    
         
            +
                    branch_code: @swift_branch_code,
         
     | 
| 
      
 385 
     | 
    
         
            +
                    bank_code: @swift_bank_code
         
     | 
| 
      
 386 
     | 
    
         
            +
                  }
         
     | 
| 
      
 387 
     | 
    
         
            +
                end
         
     | 
| 
      
 388 
     | 
    
         
            +
             
     | 
| 
      
 389 
     | 
    
         
            +
                def pseudo_iban?(input)
         
     | 
| 
      
 390 
     | 
    
         
            +
                  input.slice(2, 2) == Constants::PSEUDO_IBAN_CHECK_DIGITS
         
     | 
| 
      
 391 
     | 
    
         
            +
                end
         
     | 
| 
       342 
392 
     | 
    
         
             
              end
         
     | 
| 
       343 
393 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,9 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Ibandit
         
     | 
| 
       2 
2 
     | 
    
         
             
              module IBANAssembler
         
     | 
| 
       3 
     | 
    
         
            -
                SUPPORTED_COUNTRY_CODES = %w(AT BE BG CY CZ DE DK EE ES FI FR GB GR HR HU IE
         
     | 
| 
       4 
     | 
    
         
            -
                                             IS IT LT LU LV MC MT NL NO PL PT RO SE SI SK
         
     | 
| 
       5 
     | 
    
         
            -
                                             SM).freeze
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
3 
     | 
    
         
             
                EXCEPTION_COUNTRY_CODES = %w(IT SM BE).freeze
         
     | 
| 
       8 
4 
     | 
    
         | 
| 
       9 
5 
     | 
    
         
             
                def self.assemble(local_details)
         
     | 
| 
         @@ -67,8 +63,11 @@ module Ibandit 
     | 
|
| 
       67 
63 
     | 
    
         
             
                ##################
         
     | 
| 
       68 
64 
     | 
    
         | 
| 
       69 
65 
     | 
    
         
             
                def self.can_assemble?(local_details)
         
     | 
| 
       70 
     | 
    
         
            -
                   
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
      
 66 
     | 
    
         
            +
                  supported_country_code?(local_details) && valid_arguments?(local_details)
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                def self.supported_country_code?(local_details)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  Constants::SUPPORTED_COUNTRY_CODES.include?(local_details[:country_code])
         
     | 
| 
       72 
71 
     | 
    
         
             
                end
         
     | 
| 
       73 
72 
     | 
    
         | 
| 
       74 
73 
     | 
    
         
             
                def self.valid_arguments?(local_details)
         
     | 
| 
         @@ -1,12 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Ibandit
         
     | 
| 
       2 
2 
     | 
    
         
             
              module LocalDetailsCleaner
         
     | 
| 
       3 
     | 
    
         
            -
                SUPPORTED_COUNTRY_CODES = %w(AT BE BG CY CZ DE DK EE ES FI FR GB GR HR HU IE
         
     | 
| 
       4 
     | 
    
         
            -
                                             IS IT LT LU LV MC MT NL NO PL PT RO SE SI SK
         
     | 
| 
       5 
     | 
    
         
            -
                                             SM).freeze
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
3 
     | 
    
         
             
                def self.clean(local_details)
         
     | 
| 
       8 
4 
     | 
    
         
             
                  country_code = local_details[:country_code]
         
     | 
| 
       9 
5 
     | 
    
         | 
| 
      
 6 
     | 
    
         
            +
                  unless explicit_swift_details?(country_code)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    local_details = swift_details_for(local_details).merge(local_details)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       10 
10 
     | 
    
         
             
                  return local_details unless can_clean?(country_code, local_details)
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                  local_details.merge(
         
     | 
| 
         @@ -18,10 +18,14 @@ module Ibandit 
     | 
|
| 
       18 
18 
     | 
    
         
             
                ###########
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                def self.can_clean?(country_code, local_details)
         
     | 
| 
       21 
     | 
    
         
            -
                  SUPPORTED_COUNTRY_CODES.include?(country_code) &&
         
     | 
| 
      
 21 
     | 
    
         
            +
                  Constants::SUPPORTED_COUNTRY_CODES.include?(country_code) &&
         
     | 
| 
       22 
22 
     | 
    
         
             
                    fields_for?(country_code, local_details)
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
                def self.explicit_swift_details?(country_code)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  Constants::PSEUDO_IBAN_COUNTRY_CODES.include?(country_code)
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       25 
29 
     | 
    
         
             
                def self.fields_for?(country_code, opts)
         
     | 
| 
       26 
30 
     | 
    
         
             
                  required_fields(country_code).all? { |argument| opts[argument] }
         
     | 
| 
       27 
31 
     | 
    
         
             
                end
         
     | 
| 
         @@ -149,7 +153,7 @@ module Ibandit 
     | 
|
| 
       149 
153 
     | 
    
         | 
| 
       150 
154 
     | 
    
         
             
                  {
         
     | 
| 
       151 
155 
     | 
    
         
             
                    bank_code:      bank_code.rjust(4, '0'),
         
     | 
| 
       152 
     | 
    
         
            -
                    account_number: account_number. 
     | 
| 
      
 156 
     | 
    
         
            +
                    account_number: account_number.delete('-').rjust(10, '0')
         
     | 
| 
       153 
157 
     | 
    
         
             
                  }
         
     | 
| 
       154 
158 
     | 
    
         
             
                end
         
     | 
| 
       155 
159 
     | 
    
         | 
| 
         @@ -437,14 +441,19 @@ module Ibandit 
     | 
|
| 
       437 
441 
     | 
    
         
             
                end
         
     | 
| 
       438 
442 
     | 
    
         | 
| 
       439 
443 
     | 
    
         
             
                def self.clean_se_details(local_details)
         
     | 
| 
       440 
     | 
    
         
            -
                  converted_details =
         
     | 
| 
       441 
     | 
    
         
            -
                     
     | 
| 
      
 444 
     | 
    
         
            +
                  converted_details = SwedishDetailsConverter.new(
         
     | 
| 
      
 445 
     | 
    
         
            +
                    branch_code: local_details[:branch_code],
         
     | 
| 
      
 446 
     | 
    
         
            +
                    account_number: local_details[:account_number]
         
     | 
| 
      
 447 
     | 
    
         
            +
                  ).convert
         
     | 
| 
       442 
448 
     | 
    
         | 
| 
       443 
     | 
    
         
            -
                  bank_code = local_details[:bank_code] || 
     | 
| 
      
 449 
     | 
    
         
            +
                  bank_code = local_details[:bank_code] ||
         
     | 
| 
      
 450 
     | 
    
         
            +
                              converted_details[:swift_bank_code]
         
     | 
| 
       444 
451 
     | 
    
         | 
| 
       445 
452 
     | 
    
         
             
                  {
         
     | 
| 
       446 
     | 
    
         
            -
                     
     | 
| 
       447 
     | 
    
         
            -
                     
     | 
| 
      
 453 
     | 
    
         
            +
                    account_number:       converted_details[:account_number],
         
     | 
| 
      
 454 
     | 
    
         
            +
                    branch_code:          converted_details[:branch_code],
         
     | 
| 
      
 455 
     | 
    
         
            +
                    swift_bank_code:      bank_code,
         
     | 
| 
      
 456 
     | 
    
         
            +
                    swift_account_number: converted_details[:swift_account_number]
         
     | 
| 
       448 
457 
     | 
    
         
             
                  }
         
     | 
| 
       449 
458 
     | 
    
         
             
                end
         
     | 
| 
       450 
459 
     | 
    
         | 
| 
         @@ -477,5 +486,14 @@ module Ibandit 
     | 
|
| 
       477 
486 
     | 
    
         
             
                  hufo + reikningsnumer + kennitala
         
     | 
| 
       478 
487 
     | 
    
         
             
                end
         
     | 
| 
       479 
488 
     | 
    
         
             
                private_class_method :pad_is_account_number
         
     | 
| 
      
 489 
     | 
    
         
            +
             
     | 
| 
      
 490 
     | 
    
         
            +
                def self.swift_details_for(local_details)
         
     | 
| 
      
 491 
     | 
    
         
            +
                  {
         
     | 
| 
      
 492 
     | 
    
         
            +
                    swift_bank_code:      local_details[:bank_code],
         
     | 
| 
      
 493 
     | 
    
         
            +
                    swift_branch_code:    local_details[:branch_code],
         
     | 
| 
      
 494 
     | 
    
         
            +
                    swift_account_number: local_details[:account_number]
         
     | 
| 
      
 495 
     | 
    
         
            +
                  }
         
     | 
| 
      
 496 
     | 
    
         
            +
                end
         
     | 
| 
      
 497 
     | 
    
         
            +
                private_class_method :swift_details_for
         
     | 
| 
       480 
498 
     | 
    
         
             
              end
         
     | 
| 
       481 
499 
     | 
    
         
             
            end
         
     |