banktools-br 0.1.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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/CHANGELOG.md +5 -0
  6. data/Gemfile +4 -0
  7. data/README.md +62 -0
  8. data/Rakefile +6 -0
  9. data/banktools-br.gemspec +24 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/banktools-br/account.rb +42 -0
  13. data/lib/banktools-br/agency.rb +40 -0
  14. data/lib/banktools-br/banks/account.rb +75 -0
  15. data/lib/banktools-br/banks/agency.rb +35 -0
  16. data/lib/banktools-br/banks/banrisul/account.rb +31 -0
  17. data/lib/banktools-br/banks/banrisul/agency.rb +7 -0
  18. data/lib/banktools-br/banks/banrisul.rb +2 -0
  19. data/lib/banktools-br/banks/bb/account.rb +31 -0
  20. data/lib/banktools-br/banks/bb/agency.rb +7 -0
  21. data/lib/banktools-br/banks/bb.rb +2 -0
  22. data/lib/banktools-br/banks/bradesco/account.rb +31 -0
  23. data/lib/banktools-br/banks/bradesco/agency.rb +7 -0
  24. data/lib/banktools-br/banks/bradesco.rb +2 -0
  25. data/lib/banktools-br/banks/caixa_economica/account.rb +33 -0
  26. data/lib/banktools-br/banks/caixa_economica/agency.rb +7 -0
  27. data/lib/banktools-br/banks/caixa_economica.rb +2 -0
  28. data/lib/banktools-br/banks/citybank/account.rb +30 -0
  29. data/lib/banktools-br/banks/citybank/agency.rb +7 -0
  30. data/lib/banktools-br/banks/citybank.rb +2 -0
  31. data/lib/banktools-br/banks/digit_calculator.rb +47 -0
  32. data/lib/banktools-br/banks/hsbc/account.rb +30 -0
  33. data/lib/banktools-br/banks/hsbc/agency.rb +7 -0
  34. data/lib/banktools-br/banks/hsbc.rb +2 -0
  35. data/lib/banktools-br/banks/itau/account.rb +30 -0
  36. data/lib/banktools-br/banks/itau/agency.rb +7 -0
  37. data/lib/banktools-br/banks/itau.rb +2 -0
  38. data/lib/banktools-br/banks/santander/account.rb +28 -0
  39. data/lib/banktools-br/banks/santander/agency.rb +7 -0
  40. data/lib/banktools-br/banks/santander.rb +2 -0
  41. data/lib/banktools-br/banks/utilities.rb +30 -0
  42. data/lib/banktools-br/banks.rb +18 -0
  43. data/lib/banktools-br/version.rb +3 -0
  44. data/lib/banktools-br.rb +8 -0
  45. metadata +143 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8bfc502f0aab0f35e60eb43234328897e249fabd
4
+ data.tar.gz: 9a19870af26eaeaa4d50e75a895fbffe27356e29
5
+ SHA512:
6
+ metadata.gz: 5d926a4ae3eb58a39ebf4e1e02b7a4965791d291a370b457bf6c389dcb26746a1f70a29519a61487a31d1dca272a5a21b702482493440b8c949e71532bd26972
7
+ data.tar.gz: cc68c5f492f4ec60d3459723252cb71466273d5cae1c89617645c988ce2c7bf8512b5b69225ad612b9520de55b378f46abaaf11d8db7b0c465cf6e6e85ff909f
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.0
4
+ before_install: gem install bundler -v 1.11.2
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # CHANGELOG
2
+
3
+ ## 0.1.0
4
+
5
+ * Initial Version supporting (Banrisul, BB, Bradesco, Caixa Economica, Citybank, HSBC, Itau, Santander)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in banktools-br.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # BanktoolsBR
2
+
3
+ This gem to normalize, validate and prettify brazilian bank account and agencies according to the bank.
4
+
5
+ ## Support
6
+
7
+ This gem supports the follow bank account validations:
8
+
9
+ * Banrisul
10
+ * BB
11
+ * Bradesco
12
+ * Caixa Economica
13
+ * Citybank
14
+ * HSBC
15
+ * Itau
16
+ * Santander
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ ```ruby
23
+ gem 'banktools-br'
24
+ ```
25
+
26
+ And then execute:
27
+
28
+ $ bundle
29
+
30
+ Or install it yourself as:
31
+
32
+ $ gem install banktools-br
33
+
34
+ ## Usage
35
+
36
+ ```ruby
37
+ agency = BanktoolsBR::Agency.new('001', '1584')
38
+ agency.valid? # true
39
+
40
+ account = BanktoolsBR::Account.new('001', '1584', '002.101.69-6')
41
+ account.valid? # true
42
+ account.to_s # 00210169-6
43
+ ```
44
+
45
+ ## TODO
46
+
47
+ Implement digit validation for the follow bank agencies:
48
+
49
+ * BB
50
+ * Banrisul
51
+ * Bradesco
52
+
53
+ ## Development
54
+
55
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
56
+
57
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
58
+
59
+ ## Contributing
60
+
61
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Noverde/banktools-br.
62
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'banktools-br/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "banktools-br"
8
+ spec.version = BanktoolsBR::VERSION
9
+ spec.authors = ["Noverde Team"]
10
+ spec.email = ["dev@noverde.com.br"]
11
+
12
+ spec.summary = %q{Gem to validate, normalize and prettify bank account numbers and agency from Brazil}
13
+ spec.homepage = "https://github.com/Noverde/banktools-br"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.11"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "rspec", "~> 3.0"
23
+ spec.add_development_dependency "pry-byebug"
24
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "banktools-br"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,42 @@
1
+ module BanktoolsBR
2
+ class Account
3
+ # Construct Account object
4
+ #
5
+ # @param [String] bank code according to BC
6
+ # @param [String] bank agency number
7
+ # @param [String] bank account number + verification digit
8
+ # @return the object
9
+ def initialize(bank_code, bank_agency, bank_account)
10
+ @bank_code = bank_code
11
+ @bank_agency = bank_agency
12
+ @bank_account = bank_account
13
+ end
14
+
15
+ # Validates account verification digit based on bank code.
16
+ #
17
+ # @return [true, false]
18
+ # @raise [BanktoolsBR::UnsupportedBank] if bank code is not supported.
19
+ def valid?
20
+ case @bank_code
21
+ when '001'
22
+ BanktoolsBR::Banks::BB::Account.new(@bank_agency, @bank_account).valid?
23
+ when '033'
24
+ BanktoolsBR::Banks::Santander::Account.new(@bank_agency, @bank_account).valid?
25
+ when '041'
26
+ BanktoolsBR::Banks::Banrisul::Account.new(@bank_agency, @bank_account).valid?
27
+ when '104'
28
+ BanktoolsBR::Banks::CaixaEconomica::Account.new(@bank_agency, @bank_account).valid?
29
+ when '237'
30
+ BanktoolsBR::Banks::Bradesco::Account.new(@bank_agency, @bank_account).valid?
31
+ when '341'
32
+ BanktoolsBR::Banks::Itau::Account.new(@bank_agency, @bank_account).valid?
33
+ when '399'
34
+ BanktoolsBR::Banks::HSBC::Account.new(@bank_agency, @bank_account).valid?
35
+ when '745'
36
+ BanktoolsBR::Banks::Citybank::Account.new(@bank_agency, @bank_account).valid?
37
+ else
38
+ raise BanktoolsBR::UnsupportedBank, "Bank: #{@bank_code} is not supported."
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,40 @@
1
+ module BanktoolsBR
2
+ class Agency
3
+ # Construct Agency object
4
+ #
5
+ # @param [String] bank code according to BC
6
+ # @param [String] bank agency number
7
+ # @return the object
8
+ def initialize(bank_code, bank_agency)
9
+ @bank_code = bank_code
10
+ @bank_agency = bank_agency
11
+ end
12
+
13
+ # Validates agency based on bank code.
14
+ #
15
+ # @return [true, false]
16
+ # @raise [BanktoolsBR::UnsupportedBank] if bank code is not supported.
17
+ def valid?
18
+ case @bank_code
19
+ when '001'
20
+ BanktoolsBR::Banks::BB::Agency.new(@bank_agency).valid?
21
+ when '033'
22
+ BanktoolsBR::Banks::Santander::Agency.new(@bank_agency).valid?
23
+ when '041'
24
+ BanktoolsBR::Banks::Banrisul::Agency.new(@bank_agency).valid?
25
+ when '104'
26
+ BanktoolsBR::Banks::CaixaEconomica::Agency.new(@bank_agency).valid?
27
+ when '237'
28
+ BanktoolsBR::Banks::Bradesco::Agency.new(@bank_agency).valid?
29
+ when '341'
30
+ BanktoolsBR::Banks::Itau::Agency.new(@bank_agency).valid?
31
+ when '399'
32
+ BanktoolsBR::Banks::HSBC::Agency.new(@bank_agency).valid?
33
+ when '745'
34
+ BanktoolsBR::Banks::Citybank::Agency.new(@bank_agency).valid?
35
+ else
36
+ raise BanktoolsBR::UnsupportedBank, "Bank: #{@bank_code} is not supported."
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,75 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ class Account
4
+ include Utilities
5
+
6
+ attr_reader :bank_agency, :bank_account
7
+
8
+ # Constructs Bank Account object.
9
+ #
10
+ # @param [String] bank agency number
11
+ # @param [String] bank account number
12
+ # @return the object
13
+ def initialize(bank_agency, bank_account)
14
+ @bank_agency = bank_agency
15
+ @bank_account = bank_account
16
+ end
17
+
18
+ # Prettify account number, remove spaces, invalid numbers and fills with left zeros according to bank account length.
19
+ #
20
+ # @return [String] account number with digit
21
+ def to_s
22
+ account_number = sanitize_numbers(bank_account).rjust(bank_account_length, '0')
23
+
24
+ [extract_number_without_digit(account_number, bank_account_length), extract_digit(bank_account)].join('-')
25
+ end
26
+
27
+ # Validates account number based on their length and verification digit.
28
+ #
29
+ # @return [true, false]
30
+ def valid?
31
+ (sanitize_numbers(bank_account).length == bank_account_length) &&
32
+ (verification_digit == correct_verification_digit)
33
+ end
34
+
35
+ # Bank account number without digit
36
+ #
37
+ # @return [String]
38
+ def bank_account_without_digit
39
+ extract_number_without_digit(bank_account, bank_account_length)
40
+ end
41
+
42
+ # Full account number (bank_agency + bank_account_without_digit)
43
+ #
44
+ # @return [String]
45
+ def full_account_number
46
+ sanitize_numbers(bank_agency) + bank_account_without_digit
47
+ end
48
+
49
+ # Verification digit from account
50
+ #
51
+ # @return [String]
52
+ def verification_digit
53
+ extract_digit(bank_account)
54
+ end
55
+
56
+ private
57
+
58
+ # Sets the bank account length.
59
+ #
60
+ # @!visibility private
61
+ # @raise Not Implemented if main class method is called
62
+ def bank_account_length
63
+ raise 'Not Implemented, you must implement this method on child class'
64
+ end
65
+
66
+ # Calculates the correct verification digit for account.
67
+ #
68
+ # @!visibility private
69
+ # @raise Not Implemented if main class method is called
70
+ def correct_verification_digit
71
+ raise 'Not Implemented, you must implement this method on child class'
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,35 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ class Agency
4
+ include Utilities
5
+
6
+ attr_reader :bank_agency
7
+
8
+ # Constructs Agency class.
9
+ #
10
+ # @param [String] the bank agency number
11
+ # @return the object
12
+ def initialize(bank_agency)
13
+ @bank_agency = bank_agency
14
+ end
15
+
16
+ # Validates the agency number based on their length.
17
+ #
18
+ # @return [true, false]
19
+ def valid?
20
+ (sanitize_numbers(bank_agency).length == bank_agency_length)
21
+ end
22
+
23
+ private
24
+
25
+ # Sets the bank agency length.
26
+ # Default: 4
27
+ #
28
+ # @!visibility private
29
+ # @return [Integer] the bank agency length
30
+ def bank_agency_length
31
+ 4
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Banrisul
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 10
13
+ end
14
+
15
+ # Calculates the correct verification digit for account using mod 11
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ digit_calculator = BanktoolsBR::Banks::DigitCalculator.new(bank_account_without_digit, [3, 2, 4, 7, 6, 5, 4, 3, 2])
21
+ digit = digit_calculator.sum_numbers % 11
22
+
23
+ return '0' if digit == 0
24
+ return '6' if digit == 1
25
+
26
+ (11 - digit).to_s
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Banrisul
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/banrisul/agency'
2
+ require 'banktools-br/banks/banrisul/account'
@@ -0,0 +1,31 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module BB
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 9
13
+ end
14
+
15
+ # Calculates the correct verification digit for account using mod 11
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ digit_calculator = BanktoolsBR::Banks::DigitCalculator.new(bank_account_without_digit, [9, 8, 7, 6, 5, 4, 3, 2])
21
+ digit = digit_calculator.mod(11)
22
+
23
+ return 'X' if 10 == digit
24
+ return '0' if 11 == digit
25
+
26
+ digit.to_s
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module BB
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/bb/agency'
2
+ require 'banktools-br/banks/bb/account'
@@ -0,0 +1,31 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Bradesco
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 8
13
+ end
14
+
15
+ # Calculates the correct verification digit for account using mod 11
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ digit_calculator = BanktoolsBR::Banks::DigitCalculator.new(bank_account_without_digit, [2, 7, 6, 5, 4, 3, 2])
21
+ digit = digit_calculator.sum_numbers % 11
22
+
23
+ return '0' if digit == 0
24
+ return 'P' if digit == 1
25
+
26
+ (11 - digit).to_s
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Bradesco
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/bradesco/agency'
2
+ require 'banktools-br/banks/bradesco/account'
@@ -0,0 +1,33 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module CaixaEconomica
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 12
13
+ end
14
+
15
+ # Calculates the correct verification digit for account using mod 11
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ sum_digit = (BanktoolsBR::Banks::DigitCalculator.new(full_account_number, [8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]).sum_numbers * 10)
21
+ div_digit = (sum_digit / 11)
22
+ mul_digit = (div_digit * 11)
23
+
24
+ digit = sum_digit - mul_digit
25
+
26
+ return '0' if 10 == digit
27
+
28
+ digit.to_s
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module CaixaEconomica
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/caixa_economica/agency'
2
+ require 'banktools-br/banks/caixa_economica/account'
@@ -0,0 +1,30 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Citybank
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 11
13
+ end
14
+
15
+ # Calculates the correct verification digit for account using mod 11
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ digit_calculator = BanktoolsBR::Banks::DigitCalculator.new(bank_account_without_digit, [11, 10, 9, 8, 7, 6, 5, 4, 3, 2])
21
+ digit = digit_calculator.sum_numbers % 11
22
+
23
+ return '0' if (digit == 0 || digit == 1)
24
+
25
+ (11 - digit).to_s
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Citybank
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/citybank/agency'
2
+ require 'banktools-br/banks/citybank/account'
@@ -0,0 +1,47 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ class DigitCalculator
4
+ # Constructs the digit calculator with string number and weights
5
+ #
6
+ # @param [String] full number with digit
7
+ # @param [Array <Integer>] weight for each char from full number
8
+ # @return the object
9
+ def initialize(string_number, weights)
10
+ @string_number = string_number
11
+ @weights = weights
12
+ end
13
+
14
+ # Sum numbers with their weight and if sends sum_digits_when_greater_than_9 variable as true, the result of sum
15
+ # should be sum the chars again.
16
+ #
17
+ # @param [true, false] the option to sum digits when result is greater than 9
18
+ # @return [Integer]
19
+ def sum_numbers(sum_digits_when_greater_than_9 = false)
20
+ raise BanktoolsBR::Banks::DigitWeightsInvalid, 'String number size is different from weight values size' if @string_number.size != @weights.size
21
+
22
+ final_value = 0
23
+
24
+ @string_number.chars.each_with_index do |char, i|
25
+ result = char.to_i * @weights[i]
26
+
27
+ if sum_digits_when_greater_than_9 && result > 9
28
+ result = result.to_s[0].to_i + result.to_s[1].to_i
29
+ end
30
+
31
+ final_value += result
32
+ end
33
+
34
+ final_value
35
+ end
36
+
37
+ # Calculates the subtraction of mod number with sum numbers mod.
38
+ #
39
+ # @param [Integer] the mod number
40
+ # @param [true, false] the option to sum digits when result is greater than 9
41
+ # @return [Integer] result of mod subtract itself.
42
+ def mod(mod_number, sum_digits_when_greater_than_9 = false)
43
+ (mod_number - (sum_numbers(sum_digits_when_greater_than_9) % mod_number))
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module HSBC
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 7
13
+ end
14
+
15
+ # Calculates the correct verification digit for account using mod 11
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ digit_calculator = BanktoolsBR::Banks::DigitCalculator.new(full_account_number, [8, 9, 2, 3, 4, 5, 6, 7, 8, 9])
21
+ digit = digit_calculator.sum_numbers % 11
22
+
23
+ return '0' if (digit == 0 || digit == 10)
24
+
25
+ digit.to_s
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module HSBC
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/hsbc/agency'
2
+ require 'banktools-br/banks/hsbc/account'
@@ -0,0 +1,30 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Itau
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 6
13
+ end
14
+
15
+ # Calculates the correct verification digit for account using mod 10
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ digit_calculator = BanktoolsBR::Banks::DigitCalculator.new(full_account_number, [2, 1, 2, 1, 2, 1, 2, 1, 2])
21
+ digit = digit_calculator.mod(10, true)
22
+
23
+ return '0' if digit == 10
24
+
25
+ digit.to_s
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Itau
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/itau/agency'
2
+ require 'banktools-br/banks/itau/account'
@@ -0,0 +1,28 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Santander
4
+ class Account < BanktoolsBR::Banks::Account
5
+ private
6
+
7
+ # Sets the bank account length.
8
+ #
9
+ # @!visibility private
10
+ # @return [Integer] the maximum bank account length
11
+ def bank_account_length
12
+ 9
13
+ end
14
+
15
+ # Calculates the correct verification digit.
16
+ #
17
+ # @!visibility private
18
+ # @return [String] the verification digit
19
+ def correct_verification_digit
20
+ digit_calculator = BanktoolsBR::Banks::DigitCalculator.new(full_account_number, [9, 7, 3, 1, 9, 7, 1, 3, 1, 9, 7, 3])
21
+ digit = 10 - digit_calculator.sum_numbers.to_s.chars.last.to_i
22
+
23
+ digit.to_s
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Santander
4
+ class Agency < BanktoolsBR::Banks::Agency ; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'banktools-br/banks/santander/agency'
2
+ require 'banktools-br/banks/santander/account'
@@ -0,0 +1,30 @@
1
+ module BanktoolsBR
2
+ module Banks
3
+ module Utilities
4
+ # Sanitizes string numbers with dashes, dots and non number verification digits.
5
+ #
6
+ # @param [String] full number with digit
7
+ # @return [String] the string number sanitized
8
+ def sanitize_numbers(string_number)
9
+ string_number.to_s.gsub(/[PX]$/i, '0').gsub(/[^0-9]/, '')
10
+ end
11
+
12
+ # Extracts the last char for the string number.
13
+ #
14
+ # @param [String] full number with digit
15
+ # @return [String] the verification digit from number
16
+ def extract_digit(full_number)
17
+ full_number.to_s.chars.last.upcase
18
+ end
19
+
20
+ # Extracts only the number without digit.
21
+ #
22
+ # @param [String] full number with digit
23
+ # @param [Integer] maximum size of full number
24
+ # @return [String] number without digit
25
+ def extract_number_without_digit(full_number, maximum_size)
26
+ sanitize_numbers(full_number).slice(0, maximum_size - 1)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ require 'banktools-br/banks/digit_calculator'
2
+ require 'banktools-br/banks/utilities'
3
+ require 'banktools-br/banks/agency'
4
+ require 'banktools-br/banks/account'
5
+ require 'banktools-br/banks/itau'
6
+ require 'banktools-br/banks/bb'
7
+ require 'banktools-br/banks/caixa_economica'
8
+ require 'banktools-br/banks/santander'
9
+ require 'banktools-br/banks/banrisul'
10
+ require 'banktools-br/banks/bradesco'
11
+ require 'banktools-br/banks/hsbc'
12
+ require 'banktools-br/banks/citybank'
13
+
14
+ module BanktoolsBR
15
+ module Banks
16
+ class DigitWeightsInvalid < StandardError ; end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module BanktoolsBR
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,8 @@
1
+ require 'banktools-br/version'
2
+ require 'banktools-br/banks'
3
+ require 'banktools-br/account'
4
+ require 'banktools-br/agency'
5
+
6
+ module BanktoolsBR
7
+ class UnsupportedBank < StandardError ; end
8
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: banktools-br
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Noverde Team
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-02-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ - dev@noverde.com.br
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".travis.yml"
79
+ - CHANGELOG.md
80
+ - Gemfile
81
+ - README.md
82
+ - Rakefile
83
+ - banktools-br.gemspec
84
+ - bin/console
85
+ - bin/setup
86
+ - lib/banktools-br.rb
87
+ - lib/banktools-br/account.rb
88
+ - lib/banktools-br/agency.rb
89
+ - lib/banktools-br/banks.rb
90
+ - lib/banktools-br/banks/account.rb
91
+ - lib/banktools-br/banks/agency.rb
92
+ - lib/banktools-br/banks/banrisul.rb
93
+ - lib/banktools-br/banks/banrisul/account.rb
94
+ - lib/banktools-br/banks/banrisul/agency.rb
95
+ - lib/banktools-br/banks/bb.rb
96
+ - lib/banktools-br/banks/bb/account.rb
97
+ - lib/banktools-br/banks/bb/agency.rb
98
+ - lib/banktools-br/banks/bradesco.rb
99
+ - lib/banktools-br/banks/bradesco/account.rb
100
+ - lib/banktools-br/banks/bradesco/agency.rb
101
+ - lib/banktools-br/banks/caixa_economica.rb
102
+ - lib/banktools-br/banks/caixa_economica/account.rb
103
+ - lib/banktools-br/banks/caixa_economica/agency.rb
104
+ - lib/banktools-br/banks/citybank.rb
105
+ - lib/banktools-br/banks/citybank/account.rb
106
+ - lib/banktools-br/banks/citybank/agency.rb
107
+ - lib/banktools-br/banks/digit_calculator.rb
108
+ - lib/banktools-br/banks/hsbc.rb
109
+ - lib/banktools-br/banks/hsbc/account.rb
110
+ - lib/banktools-br/banks/hsbc/agency.rb
111
+ - lib/banktools-br/banks/itau.rb
112
+ - lib/banktools-br/banks/itau/account.rb
113
+ - lib/banktools-br/banks/itau/agency.rb
114
+ - lib/banktools-br/banks/santander.rb
115
+ - lib/banktools-br/banks/santander/account.rb
116
+ - lib/banktools-br/banks/santander/agency.rb
117
+ - lib/banktools-br/banks/utilities.rb
118
+ - lib/banktools-br/version.rb
119
+ homepage: https://github.com/Noverde/banktools-br
120
+ licenses: []
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.5.1
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Gem to validate, normalize and prettify bank account numbers and agency from
142
+ Brazil
143
+ test_files: []