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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +4 -0
- data/README.md +62 -0
- data/Rakefile +6 -0
- data/banktools-br.gemspec +24 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/banktools-br/account.rb +42 -0
- data/lib/banktools-br/agency.rb +40 -0
- data/lib/banktools-br/banks/account.rb +75 -0
- data/lib/banktools-br/banks/agency.rb +35 -0
- data/lib/banktools-br/banks/banrisul/account.rb +31 -0
- data/lib/banktools-br/banks/banrisul/agency.rb +7 -0
- data/lib/banktools-br/banks/banrisul.rb +2 -0
- data/lib/banktools-br/banks/bb/account.rb +31 -0
- data/lib/banktools-br/banks/bb/agency.rb +7 -0
- data/lib/banktools-br/banks/bb.rb +2 -0
- data/lib/banktools-br/banks/bradesco/account.rb +31 -0
- data/lib/banktools-br/banks/bradesco/agency.rb +7 -0
- data/lib/banktools-br/banks/bradesco.rb +2 -0
- data/lib/banktools-br/banks/caixa_economica/account.rb +33 -0
- data/lib/banktools-br/banks/caixa_economica/agency.rb +7 -0
- data/lib/banktools-br/banks/caixa_economica.rb +2 -0
- data/lib/banktools-br/banks/citybank/account.rb +30 -0
- data/lib/banktools-br/banks/citybank/agency.rb +7 -0
- data/lib/banktools-br/banks/citybank.rb +2 -0
- data/lib/banktools-br/banks/digit_calculator.rb +47 -0
- data/lib/banktools-br/banks/hsbc/account.rb +30 -0
- data/lib/banktools-br/banks/hsbc/agency.rb +7 -0
- data/lib/banktools-br/banks/hsbc.rb +2 -0
- data/lib/banktools-br/banks/itau/account.rb +30 -0
- data/lib/banktools-br/banks/itau/agency.rb +7 -0
- data/lib/banktools-br/banks/itau.rb +2 -0
- data/lib/banktools-br/banks/santander/account.rb +28 -0
- data/lib/banktools-br/banks/santander/agency.rb +7 -0
- data/lib/banktools-br/banks/santander.rb +2 -0
- data/lib/banktools-br/banks/utilities.rb +30 -0
- data/lib/banktools-br/banks.rb +18 -0
- data/lib/banktools-br/version.rb +3 -0
- data/lib/banktools-br.rb +8 -0
- 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
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
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,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,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,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,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,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,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,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,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,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,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
|
data/lib/banktools-br.rb
ADDED
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: []
|