bank_slip 0.3.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8eab2d7997e6d41a3ec758c29854687d094a8f38
4
+ data.tar.gz: 568e42044873bb81e08631b092ffcf7916d1a467
5
+ SHA512:
6
+ metadata.gz: 063764cd326215f48aa2d39b1b8130d118ce13c803a952d11a74dca495d063f5f46631fbf78d3a8c9d82ccc2ce115427e50a9cdb840115ba9d1e819474494166
7
+ data.tar.gz: d9d80085851d481e5712df3179f9c5a4666823e6eef728c63a66328bdf0d90ac69ae78a6158e087b3b0d4149b2b94ec4f44c286a878c22102cc3c1a36072b900
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.pdf
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bank_slip.gemspec
4
+ gemspec
5
+
6
+
7
+ gem "rake", "~> 10.0" , group: [:development, :test]
8
+ gem "rspec", "~> 3", group: [:development, :test]
9
+ gem 'pdf-inspector', :require => "pdf/inspector", group: [:development, :test]
10
+ gem 'pry', group: [:development, :test]
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # BankSlip
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/bank_slip`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'bank_slip'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install bank_slip
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ 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` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ 1. Fork it ( https://github.com/[my-github-username]/bank_slip/fork )
36
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
37
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
38
+ 4. Push to the branch (`git push origin my-new-feature`)
39
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bank_slip.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bank_slip/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bank_slip"
8
+ spec.version = BankSlip::VERSION
9
+ spec.licenses = ["MIT"]
10
+
11
+ spec.summary = %q{Bank Slip for Municipal Collection Document.}
12
+ spec.description = %q{Generate Bank Slip for Municipal Collection Document.}
13
+ spec.homepage = "https://github.com/marcomoura/bank-slip"
14
+ spec.authors = ["Marco Moura"]
15
+ spec.email = ["marco.moura@gmail.com"]
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "bundler", "~> 1.9"
23
+ spec.add_dependency "barby"
24
+ spec.add_dependency "prawn"
25
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "bank_slip"
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,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,104 @@
1
+ # Barcode data according to febraban specification
2
+ #
3
+ # POSITION | SIZE | CONTENT |
4
+ # 01 – 01 | 1 | Product | Fixed: 8
5
+ # 02 – 02 | 1 | Segment | Fixed: 1 for City Halls
6
+ # 03 – 03 | 1 | Real or Reference value | 6 and mod10 for DV or 8 and mod11 for DV
7
+ # 04 – 04 | 1 | Dígito verificador geral | mod10 or mod11
8
+ # 05 – 15 | 11 | Value | value in Reais
9
+
10
+ # 16 – 19 | 4 | Company or organization | code of 4 digits febraban
11
+ # 20 – 44 | 25 | Free | AAAAMMDD + free use
12
+
13
+ # 16 – 23 | 8 | Company or organization | code of 8 digits bank (start CNPJ)
14
+ # 24 – 44 | 21 | Free | AAAAMMDD + free use
15
+ #
16
+ #
17
+ require 'barby'
18
+ require 'barby/barcode/code_25_interleaved'
19
+ require 'barby/outputter/prawn_outputter'
20
+
21
+ module BankSlip
22
+ class Barcode
23
+
24
+ # > options = {value: 1, identification_code: 2, document_number: 10, payment_date: Date.new(2010, 3, 10)}
25
+ # > barcode = BankSlip::Barcode.new(options)
26
+ def initialize(value:, identification_code:, payment_date:,
27
+ segment: 1, effective_reference: 6,
28
+ free_digits: 0, product: 8)
29
+ @value = value
30
+ @segment = segment
31
+ @identification_code = identification_code
32
+ @payment_date = payment_date
33
+ @product = product
34
+ @effective_reference = effective_reference
35
+ @free_digits = free_digits
36
+ fail "identification_code #{identification_code} too long, #{identification_length} characters is the maximum allowed, for the segment #{segment}" unless valid_identification_code?
37
+ end
38
+
39
+ # > barcode.digits
40
+ # => "81640000000000100022010031000000000000000010"
41
+ def digits
42
+ @digits ||= numbers.insert(3, digit(numbers).to_s)
43
+ end
44
+
45
+ # > barcode.numerical_representation
46
+ # => ["81640000000 5", "00010002201 1", "00310000000 3", "00000000010 9"]
47
+ def numerical_representation
48
+ @numerical_representation ||= digits.scan(/\d{11}/).collect {|p| "#{p} #{digit(p)}" }
49
+ end
50
+
51
+ private
52
+
53
+ def valid_identification_code?
54
+ @identification_code.to_s.size.eql?(identification_length)
55
+ end
56
+
57
+ def numbers
58
+ @numbers ||= [
59
+ @product,
60
+ @segment,
61
+ @effective_reference,
62
+ leading_zeros(@value),
63
+ mask_id,
64
+ @payment_date.strftime('%Y%m%d'),
65
+ free_digits_leading_zeros
66
+ ]
67
+ .join('')
68
+ end
69
+
70
+ def leading_zeros(n, length = 11)
71
+ "%0#{length}d" % n
72
+ end
73
+
74
+ def mask_id
75
+ leading_zeros(@identification_code, identification_length)
76
+ end
77
+
78
+ def free_digits_leading_zeros
79
+ length = 21 - identification_length
80
+ leading_zeros(@free_digits, length)
81
+ end
82
+
83
+ def digit(code_number)
84
+ d = BankSlip::CheckDigit.new(number: code_number)
85
+ d.calc
86
+ end
87
+
88
+ # The Indentification code is defined by the segment
89
+ # Use 4 digits (FEBRABAN code) for the segments:
90
+ # 1. Prefeituras;
91
+ # 2. Saneamento;
92
+ # 3. Energia Elétrica e Gás;
93
+ # 4. Telecomunicações;
94
+ # 5. Órgãos Governamentais;
95
+ # 6. Carnes e Assemelhados ou demais
96
+ #
97
+ # Use 8 digits (CNPJ) for the segments:
98
+ # 7. Multas de transito
99
+ # 9. Uso exclusivo do banco
100
+ def identification_length
101
+ %w{7 9}.include?(@segment.to_s) ? 8 : 4
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,30 @@
1
+ module BankSlip
2
+ class CheckDigit
3
+ def initialize(number:)
4
+ @number = number
5
+ end
6
+
7
+ def calc
8
+ r = result
9
+ r == 10 ? 0 : r
10
+ end
11
+
12
+ private
13
+
14
+ def result
15
+ result_string = ""
16
+ @number.reverse.split("").each_with_index do |c, index|
17
+ result_string << (c.to_i * ((1 + index) % 2 + 1)).to_s
18
+ end
19
+
20
+ 10 - sum(result_string) % 10
21
+ end
22
+
23
+ def sum(result_string)
24
+ total = 0
25
+ result_string.each_char { |c| total += c.to_i }
26
+ total
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,232 @@
1
+ require "prawn"
2
+ require "prawn/measurement_extensions"
3
+
4
+ module BankSlip
5
+ class Pdf
6
+ include Prawn::View
7
+
8
+ def self.render(data)
9
+ new(data).create.render
10
+ end
11
+
12
+ def initialize(data)
13
+ @data = data
14
+ # Measures
15
+ @vHEADER_HEIGHT = 0.82.in
16
+ @vBODY_HEIGHT = 2.35.in
17
+ @vINFO_WIDTH = 6.15.in
18
+ @vVALUES_WIDTH = 7.65.in - @vINFO_WIDTH
19
+ @vLINE_HEIGHT = 0.335.in
20
+ @vFOOTER_HEIGHT = 4.25.in - @vHEADER_HEIGHT - @vBODY_HEIGHT
21
+ @vFOOTER_LEFT_WIDTH = 2.5.in
22
+ end
23
+
24
+ def create
25
+ content(0, 'CONTRIBUINTE')
26
+ footer_payer
27
+ cut_line
28
+ content(5.3.in, 'BANCO')
29
+ footer_payeer
30
+ add_barcode
31
+ self
32
+ end
33
+
34
+ private
35
+
36
+ def border
37
+ stroke_color '999999'
38
+ line_width 1
39
+ stroke_bounds
40
+ end
41
+
42
+ def add_digit(numbers, left_padding = 0)
43
+ bounding_box([0.185.in + left_padding, 0.85.in], width: 1.05.in, height: 0.17.in) do
44
+ move_down 0.03.in
45
+ stroke_color '444444'
46
+ stroke_bounds
47
+ text numbers, size: 9, style: :bold, align: :center
48
+ end
49
+ end
50
+
51
+ def copy_for(caption)
52
+ bounding_box [bounds.left - 0.05.in, bounds.top_left[1] - 0.7.in], width: bounds.right, height: 0.82.in do
53
+ text "VIA #{caption}", size: 7, style: :normal, align: :right
54
+ end
55
+ end
56
+
57
+ def content(initial_y, caption)
58
+ bounding_box [0, bounds.top_left()[1] - initial_y], width: 7.65.in, height: 3.17.in do
59
+ border
60
+ header_content
61
+ copy_for(caption)
62
+
63
+ # Info to the left
64
+ bounding_box([0.in, bounds.top_left[1] - @vHEADER_HEIGHT], width: @vINFO_WIDTH, height: @vBODY_HEIGHT) do
65
+ stroke do
66
+ stroke_color 'AAAAAA'
67
+ line bounds.bottom_left, bounds.bottom_right
68
+ end
69
+
70
+ draw_line("Nome Oficial" , @data[:payer][:official_name] , @vINFO_WIDTH , @vLINE_HEIGHT , 0 , 0 , 'E6E6E6')
71
+ draw_line("CPF/CNPJ" , @data[:payer][:cpf_cnpj] , @vINFO_WIDTH/4 , @vLINE_HEIGHT , 0 , 1)
72
+ draw_line("Inscrição Municipal" , @data[:payer][:city_registration] , @vINFO_WIDTH/4 , @vLINE_HEIGHT , 1 , 1)
73
+ draw_line("Emissão" , @data[:stub][:emission_date] , @vINFO_WIDTH/4 , @vLINE_HEIGHT , 2 , 1 , 'E6E6E6')
74
+ draw_line("Incidência" , @data[:stub][:incidence] , @vINFO_WIDTH/4 , @vLINE_HEIGHT , 3 , 1 , 'E6E6E6')
75
+ draw_line("Receita" , @data[:stub][:revenue_description] , @vINFO_WIDTH , @vLINE_HEIGHT , 0 , 2)
76
+
77
+ move_down 0.1.in
78
+ indent(0.1.in) do
79
+ text 'Outras Informações', size: 8
80
+ text @data[:stub][:other_information]
81
+ end
82
+
83
+ text_box "PAGÁVEL EM QUALQUER AGENTE ARRECADADOR AUTORIZADO ATÉ #{@data[:stub][:expiration_date]}.\n" +
84
+ "O VALOR PARA PAGAMENTO DESTE DOCUMENTO NÃO PODE SER ATUALIZADO. ",
85
+ at: [bounds.bottom_left[0] + 0.075.in, bounds.bottom_left[0] + 0.8.in],
86
+ height: 0.75.in,
87
+ size: 8,
88
+ style: :normal,
89
+ valign: :bottom
90
+
91
+ end # Info to the left
92
+
93
+ # Values to the right
94
+ bounding_box([@vINFO_WIDTH, bounds.top_left[1] - @vHEADER_HEIGHT], width: @vVALUES_WIDTH, height: @vBODY_HEIGHT) do
95
+ # Bottom line
96
+ stroke do
97
+ stroke_color 'AAAAAA'
98
+ line bounds.bottom_left, bounds.bottom_right
99
+ line bounds.top_left, bounds.bottom_left
100
+ end
101
+
102
+ draw_line("Vencimento da Guia" , @data[:stub][:expiration_date] , @vVALUES_WIDTH , @vLINE_HEIGHT , 0 , 0 , 'E6E6E6' , :right)
103
+ draw_line("Valor (R$)" , @data[:stub][:value] , @vVALUES_WIDTH , @vLINE_HEIGHT , 0 , 1 , 'FFFFFF' , :right)
104
+ draw_line("Multa/Juros (R$)" , @data[:stub][:fine_and_interest] , @vVALUES_WIDTH , @vLINE_HEIGHT , 0 , 2 , 'FFFFFF' , :right)
105
+ draw_line("Outros Acréscimos (R$)" , @data[:stub][:adjustment] , @vVALUES_WIDTH , @vLINE_HEIGHT , 0 , 3 , 'FFFFFF' , :right)
106
+ draw_line("Descontos (R$)" , "-#{@data[:stub][:discounts]}" , @vVALUES_WIDTH , @vLINE_HEIGHT , 0 , 4 , 'FFFFFF' , :right)
107
+ draw_line("Taxa de Expediente (R$)" , @data[:stub][:transaction_fee] , @vVALUES_WIDTH , @vLINE_HEIGHT , 0 , 5 , 'FFFFFF' , :right)
108
+ draw_line("Total (R$)" , @data[:stub][:total] , @vVALUES_WIDTH , @vLINE_HEIGHT , 0 , 6 , 'E6E6E6' , :right , '000000')
109
+ end # Values to the right
110
+ end
111
+ end
112
+
113
+ def footer_payer
114
+ move_down 0.1.in
115
+ text "Documento No. #{@data[:stub][:document_number]}", size: 8
116
+ bounding_box([0, bounds.top_left[1] - 0.4.in - @vHEADER_HEIGHT - @vBODY_HEIGHT],
117
+ width: 194.mm, height: 22.mm) do
118
+
119
+ move_down 0.05.in
120
+ indent 0.05.in do
121
+ text 'AUTENTICAÇÃO MECÂNICA', size: 7, align: :left
122
+ end
123
+
124
+ stroke do
125
+ stroke_color '999999'
126
+ line bounds.top_left, bounds.top_right
127
+ line bounds.top_left, bounds.bottom_left
128
+ end
129
+ end
130
+ end
131
+
132
+ def footer_payeer
133
+ move_down 0.1.in
134
+ text "Documento No. #{@data[:stub][:document_number]}", size: 8
135
+ bounding_box([bounds.right - 2.55.in, bounds.bottom_left[1] + 0.7.in],
136
+ width: 65.mm, height: 22.mm) do
137
+
138
+ move_down 0.05.in
139
+ indent 0.03.in do
140
+ text 'AUTENTICAÇÃO MECÂNICA', size: 7, align: :center
141
+ end
142
+
143
+ stroke do
144
+ stroke_color '999999'
145
+ line bounds.top_left, bounds.top_right
146
+ line [bounds.top_left, 0], [bounds.top_left[0]+50, 0]
147
+ end
148
+ end
149
+ end
150
+
151
+ def draw_line(label, value, width, height, column = 0, line = 0, bg_color = 'FFFFFF', align = :left, stroke = 'AAAAAA')
152
+ bounding_box([0.in + column * width, bounds.top_left[1] - line * height], width: width, height: height) do
153
+ if bg_color != 'FFFFFF'
154
+ fill_color bg_color
155
+ transparent(0.6) do
156
+ fill_rectangle [bounds.top_left[0] + 1, bounds.top_left[1] - 1], width, height
157
+ end
158
+ fill_color '000000'
159
+ end
160
+
161
+ draw_line_text(label, value, width, height, align)
162
+ stroke_color stroke
163
+ line_width 1
164
+ stroke_bounds
165
+ end
166
+ end
167
+
168
+ def draw_line_text(label, value, width, height, align)
169
+ bounding_box([bounds.top_left[0], bounds.top_left[1] - 0.05.in], width: width - 0.075.in, height: height - 0.05.in) do
170
+ indent(0.075.in) do
171
+ text label, size: 7, style: :normal, leading: 0.025.in
172
+ text value.to_s, size: 8, style: :bold, align: align
173
+ end
174
+ end
175
+ end
176
+
177
+ def header_content
178
+ bounding_box [0,bounds.top_left()[1]], width: 7.65.in, height: @vHEADER_HEIGHT do
179
+ stroke do
180
+ stroke_color 'AAAAAA'
181
+ line bounds.bottom_left, bounds.bottom_right
182
+ end
183
+ indent 0.1.in do
184
+ unless @data[:header][:logo].nil?
185
+ img = image @data[:header][:logo], fit: [0.71.in, 0.68.in], position: :left, vposition: :center
186
+ image_width = img.scaled_width + 0.15.in
187
+ move_up img.scaled_height - 0.15.in
188
+ else
189
+ image_width = 0
190
+ move_down 0.2.in
191
+ end
192
+ indent image_width do
193
+ text @data[:header][:title] , size: 10 , style: :bold , leading: -0.01.in
194
+ text @data[:header][:subtitle], size: 8 , style: :normal, leading: 0.02.in
195
+ move_down 0.05.in
196
+ text @data[:header][:document], size: 13, style: :bold
197
+ end
198
+ end
199
+ end
200
+ end
201
+
202
+ def cut_line
203
+ dash 3
204
+ stroke_line [bounds.left, 5.3.in, bounds.right + 0.1.in, 5.3.in]
205
+ undash
206
+ font 'ZapfDingbats' do
207
+ text_box "#", size: 18, rotate: 180, at: [bounds.right, 5.3.in + 0.13.in]
208
+ end
209
+ end
210
+
211
+ def add_barcode
212
+ bounding_box([-13, 65],
213
+ width: 7.65.in - @vFOOTER_LEFT_WIDTH,
214
+ height: @vFOOTER_HEIGHT) do
215
+ add_digit(barcode.numerical_representation[0])
216
+ add_digit(barcode.numerical_representation[1], 1.242.in)
217
+ add_digit(barcode.numerical_representation[2], (1.242.in * 2))
218
+ add_digit(barcode.numerical_representation[3], (1.242.in * 3))
219
+ end
220
+ add_bar
221
+ end
222
+
223
+ def add_bar
224
+ Barby::Code25Interleaved.new(barcode.digits)
225
+ .annotate_pdf(self, x: 0, y: -10, xdim: 0.85, height: 0.5.in)
226
+ end
227
+
228
+ def barcode
229
+ @_barcode ||= BankSlip::Barcode.new(@data[:barcode])
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,3 @@
1
+ module BankSlip
2
+ VERSION = "0.3.1"
3
+ end
data/lib/bank_slip.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "bank_slip/version"
2
+ require "bank_slip/barcode"
3
+ require "bank_slip/check_digit"
4
+ require "bank_slip/pdf"
5
+
6
+ module BankSlip
7
+ # Your code goes here...
8
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bank_slip
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Marco Moura
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-10-06 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.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: barby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: prawn
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Generate Bank Slip for Municipal Collection Document.
56
+ email:
57
+ - marco.moura@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".travis.yml"
64
+ - Gemfile
65
+ - README.md
66
+ - Rakefile
67
+ - bank_slip.gemspec
68
+ - bin/console
69
+ - bin/setup
70
+ - lib/bank_slip.rb
71
+ - lib/bank_slip/barcode.rb
72
+ - lib/bank_slip/check_digit.rb
73
+ - lib/bank_slip/pdf.rb
74
+ - lib/bank_slip/version.rb
75
+ homepage: https://github.com/marcomoura/bank-slip
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.4.5.1
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: Bank Slip for Municipal Collection Document.
99
+ test_files: []