banktools-br 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []