ruby_danfe 0.9.0 → 1.11.5

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 (43) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +4 -0
  4. data/README.md +122 -0
  5. data/Rakefile +28 -0
  6. data/lib/ruby_danfe.rb +1 -325
  7. data/lib/ruby_danfe/cst.rb +28 -0
  8. data/lib/ruby_danfe/dacte_generator.rb +511 -0
  9. data/lib/ruby_danfe/danfe_generator.rb +287 -0
  10. data/lib/ruby_danfe/danfe_nfce_generator.rb +237 -0
  11. data/lib/ruby_danfe/descricao.rb +44 -0
  12. data/lib/ruby_danfe/document.rb +80 -0
  13. data/lib/ruby_danfe/helper.rb +68 -0
  14. data/lib/ruby_danfe/options.rb +24 -0
  15. data/lib/ruby_danfe/railtie.rb +20 -0
  16. data/lib/ruby_danfe/ruby_danfe.rb +49 -0
  17. data/lib/ruby_danfe/version.rb +3 -0
  18. data/lib/ruby_danfe/xml.rb +58 -0
  19. data/ruby_danfe.gemspec +26 -11
  20. data/spec/features/ruby_danfe_spec.rb +59 -0
  21. data/spec/fixtures/4_decimals_nfe_simples_nacional.xml +1 -0
  22. data/spec/fixtures/cte.xml +1 -0
  23. data/spec/fixtures/nfe_date_format_infoadprod_infoadfisco_issues.xml +42 -0
  24. data/spec/fixtures/nfe_simples_nacional.xml +1 -0
  25. data/spec/fixtures/nfe_with_fci.xml +1 -0
  26. data/spec/fixtures/nfe_with_ns.xml +4 -0
  27. data/spec/fixtures/nfe_without_ns.xml +2 -0
  28. data/spec/lib/cst_spec.rb +51 -0
  29. data/spec/lib/descricao_spec.rb +129 -0
  30. data/spec/lib/helper_spec.rb +88 -0
  31. data/spec/lib/options_spec.rb +13 -0
  32. data/spec/lib/ruby_danfe_spec.rb +43 -0
  33. data/spec/spec_helper.rb +21 -0
  34. data/spec/support/be_same_file_as.rb +9 -0
  35. data/test/danfe.xml +42 -0
  36. data/test/generate.rb +8 -0
  37. data/test/generate_nfce.rb +8 -0
  38. data/test/nfce.xml +147 -0
  39. data/test/nfe_simples_nacional.xml +1 -0
  40. data/test/nfe_with_fci.xml +1 -0
  41. data/test/nfe_with_ns.xml +4 -0
  42. data/test/nfe_without_ns.xml +2 -0
  43. metadata +167 -75
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ .idea
2
+ .DS_store
3
+ *sublime-*
4
+ Gemfile.lock
5
+ pkg
6
+ *.pdf
7
+ coverage
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format documentation --order rand
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ruby_danfe.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # Ruby DANFE
2
+
3
+ It generates PDF files for Brazilian DANFE (_Documento Auxiliar da Nota Fiscal Eletrônica_) from a valid NF-e XML.
4
+
5
+ It also generates Brazilian DACTE (_Documento Auxiliar do Conhecimento de Transporte Eletrônico_).
6
+
7
+ This project is inspired on [NFePHP class](http://www.assembla.com/wiki/show/nfephp/DanfeNFePHP).
8
+
9
+ ## Installing
10
+
11
+ gem install ruby_danfe
12
+
13
+ ## Usage
14
+
15
+ If you have the xml saved in a file:
16
+
17
+ require "ruby_danfe"
18
+ RubyDanfe.generate("sample.pdf", "sample.xml")
19
+
20
+ If you have the xml in a variable:
21
+
22
+ xml = "string xml"
23
+ pdf = RubyDanfe.generatePDF(xml)
24
+ pdf.render_file "output.pdf"
25
+
26
+ You can use some options too! In this example, the product's field quantity will be rendered with 4 decimals after comma:
27
+
28
+ xml = "string xml"
29
+ RubyDanfe.options = {"quantity_decimals" => 4}
30
+ pdf = RubyDanfe.generatePDF(xml)
31
+ pdf.render_file "output.pdf"
32
+
33
+ If you have some especific option that is global for your project, you can create a file at config/ruby_danfe.yml, then the ruby_danfe always will load this options. Example:
34
+
35
+ project_name/config/ruby_danfe.yml
36
+
37
+ ruby_danfe:
38
+ options:
39
+ quantity_decimals: 3
40
+ numerify_prod_qcom: false
41
+
42
+
43
+ ## Development
44
+
45
+ ### Installing dependencies
46
+
47
+ You can install all necessaries dependencies using bunder like above:
48
+
49
+ $ bundle install
50
+
51
+ ### Tests
52
+
53
+ #### Manual tests
54
+
55
+ At `test` folder you will find the `generate.rb` file. It shows how to generate a pdf file from a valid xml.
56
+
57
+ You can use it following the steps above:
58
+
59
+ $ cd test
60
+ $ ruby generate.rb nfe_with_ns.xml
61
+
62
+ You can also use an special version of irb with all classes pre-loaded. Just use:
63
+
64
+ $ rake console
65
+ RubyDanfe.generate("output.pdf", "test/nfe_with_ns.xml")
66
+
67
+ or
68
+
69
+ $ rake console
70
+ my_xml_string = ""
71
+ file = File.new("test/nfe_with_ns.xml", "r")
72
+ while (line = file.gets)
73
+ my_xml_string = my_xml_string + line
74
+ end
75
+ file.close
76
+
77
+ xml = RubyDanfe::XML.new(my_xml_string)
78
+ pdf = RubyDanfe.generatePDF(xml)
79
+
80
+ pdf.render_file "output.pdf"
81
+
82
+ #### Automated tests with RSpec
83
+
84
+ You can run all specs using:
85
+
86
+ $ rspec
87
+
88
+ In the `spec/fixtures` folder, you are going to find some xml files. Each one represent a different NF-e context.
89
+
90
+ Each xml file must have its respective pdf file.
91
+
92
+ If you did some change that caused general visual changes at output pdfs, so you have to rebuild all fixtures pdf files.
93
+
94
+ You can do this automagically running the following taks:
95
+
96
+ $ rake spec:fixtures:recreate_pdfs
97
+
98
+ #### Code coverage
99
+
100
+ Code coverage is available through of SimpleCov. Just run `rspec` and open the coverage report in your browser.
101
+
102
+ ### Building and publishing
103
+
104
+ You can build using one of the above tasks
105
+
106
+ $ rake build # Build ruby_danfe-X.X.X.gem into the pkg directory
107
+ $ rake install # Build and install ruby_danfe-X.X.X.gem into system gems
108
+ $ rake release # Create tag vX.X.X and build and push ruby_danfe-X.X.X.gem to Rubygems
109
+
110
+ ## Contributing
111
+
112
+ We encourage you to contribute to Ruby DANFE!
113
+
114
+ 1. Fork it
115
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
116
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
117
+ 4. Push to the branch (`git push origin my-new-feature`)
118
+ 5. Create new Pull Request
119
+
120
+ ## License
121
+
122
+ Ruby DANFE is released under the [MIT License](http://www.opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ require "bundler/gem_tasks"
2
+ require "ruby_danfe"
3
+
4
+ desc "Open an irb session preloaded ruby_danfe classes"
5
+ task :console do
6
+ sh "irb -rubygems -I lib -r ruby_danfe.rb"
7
+ end
8
+
9
+ namespace :spec do
10
+ namespace :fixtures do
11
+ desc "Recreate all pdfs fixtures. Use this task always that output pdf format is changed."
12
+ task :recreate_pdfs do
13
+ Dir["spec/fixtures/nfe*.xml"].each do |f|
14
+ puts "Recreating #{f}.fixture.pdf"
15
+ RubyDanfe.generate("#{f}.fixture.pdf", "#{f}")
16
+ end
17
+
18
+ puts "Recreating spec/fixtures/4_decimals_nfe_simples_nacional.xml.fixture.pdf"
19
+ RubyDanfe.options = {"quantity_decimals" => 4}
20
+ RubyDanfe.generate("spec/fixtures/4_decimals_nfe_simples_nacional.xml.fixture.pdf", "spec/fixtures/4_decimals_nfe_simples_nacional.xml")
21
+
22
+ Dir["spec/fixtures/cte*.xml"].each do |f|
23
+ puts "Recreating #{f}.fixture.pdf"
24
+ RubyDanfe.generate("#{f}.fixture.pdf", "#{f}", :dacte)
25
+ end
26
+ end
27
+ end
28
+ end
data/lib/ruby_danfe.rb CHANGED
@@ -1,325 +1 @@
1
- require 'rubygems'
2
- require 'prawn'
3
- require 'prawn/measurement_extensions'
4
- require 'barby'
5
- require 'barby/barcode/code_128'
6
- require 'barby/outputter/prawn_outputter'
7
- require 'nokogiri'
8
-
9
- def numerify(number, decimals = 2)
10
- return '' if !number || number == ''
11
- int, frac = ("%.#{decimals}f" % number).split('.')
12
- int.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1\.")
13
- int + "," + frac
14
- end
15
-
16
- def invert(y)
17
- 28.7.cm - y
18
- end
19
-
20
- module RubyDanfe
21
-
22
- version = "0.9.0"
23
-
24
- class XML
25
- def initialize(xml)
26
- @xml = Nokogiri::XML(xml)
27
- end
28
- def [](xpath)
29
- node = @xml.css(xpath)
30
- return node ? node.text : ''
31
- end
32
- def render
33
- RubyDanfe.render @xml.to_s
34
- end
35
- def collect(xpath, &block)
36
- result = []
37
- @xml.xpath(xpath).each do |det|
38
- result << yield(det)
39
- end
40
- result
41
- end
42
- end
43
-
44
- class Document < Prawn::Document
45
-
46
-
47
- def ititle(h, w, x, y, title)
48
- self.text_box title, :size => 10, :at => [x.cm, invert(y.cm) - 2], :width => w.cm, :height => h.cm, :style => :bold
49
- end
50
-
51
- def ibarcode(h, w, x, y, info)
52
- Barby::Code128C.new(info).annotate_pdf(self, :x => x.cm, :y => invert(y.cm), :width => w.cm, :height => h.cm) if info != ''
53
- end
54
-
55
- def irectangle(h, w, x, y)
56
- self.stroke_rectangle [x.cm, invert(y.cm)], w.cm, h.cm
57
- end
58
-
59
- def ibox(h, w, x, y, title = '', info = '', options = {})
60
- box [x.cm, invert(y.cm)], w.cm, h.cm, title, info, options
61
- end
62
-
63
- def idate(h, w, x, y, title = '', info = '', options = {})
64
- tt = info.split('-')
65
- ibox h, w, x, y, title, "#{tt[2]}/#{tt[1]}/#{tt[0]}", options
66
- end
67
-
68
- def box(at, w, h, title = '', info = '', options = {})
69
- options = {
70
- :align => :left,
71
- :size => 10,
72
- :style => nil,
73
- :valign => :top,
74
- :border => 1
75
- }.merge(options)
76
- self.stroke_rectangle at, w, h if options[:border] == 1
77
- self.text_box title, :size => 6, :at => [at[0] + 2, at[1] - 2], :width => w - 4, :height => 8 if title != ''
78
- self.text_box info, :size => options[:size], :at => [at[0] + 2, at[1] - (title != '' ? 14 : 4) ], :width => w - 4, :height => h - (title != '' ? 14 : 4), :align => options[:align], :style => options[:style], :valign => options[:valign]
79
- end
80
-
81
- def inumeric(h, w, x, y, title = '', info = '', options = {})
82
- numeric [x.cm, invert(y.cm)], w.cm, h.cm, title, info, options
83
- end
84
-
85
- def numeric(at, w, h, title = '', info = '', options = {})
86
- options = {:decimals => 2}.merge(options)
87
- info = numerify(info, options[:decimals]) if info != ''
88
- box at, w, h, title, info, options.merge({:align => :right})
89
- end
90
-
91
- def itable(h, w, x, y, data, options = {}, &block)
92
- self.bounding_box [x.cm, invert(y.cm)], :width => w.cm, :height => h.cm do
93
- self.table data, options do |table|
94
- yield(table)
95
- end
96
- end
97
- end
98
- end
99
-
100
- def self.generatePDF(xml)
101
-
102
- pdf = Document.new(
103
- :page_size => 'A4',
104
- :page_layout => :portrait,
105
- :left_margin => 0,
106
- :right_margin => 0,
107
- :top_margin => 0,
108
- :botton_margin => 0
109
- )
110
-
111
- pdf.font "Times-Roman" # Official font
112
-
113
- pdf.repeat :all do
114
-
115
- # CANHOTO
116
-
117
- pdf.ibox 0.85, 16.10, 0.25, 0.42, "RECEBEMOS DE " + xml['emit/xNome'] + " OS PRODUTOS CONSTANTES DA NOTA FISCAL INDICADA ABAIXO"
118
- pdf.ibox 0.85, 4.10, 0.25, 1.27, "DATA DE RECEBIMENTO"
119
- pdf.ibox 0.85, 12.00, 4.35, 1.27, "IDENTIFICAÇÃO E ASSINATURA DO RECEBEDOR"
120
-
121
- pdf.ibox 1.70, 4.50, 16.35, 0.42, '',
122
- "NF-e\n" +
123
- "N°. " + xml['ide/nNF'] + "\n" +
124
- "SÉRIE " + xml['ide/serie'], {:align => :center, :valign => :center}
125
-
126
- # EMITENTE
127
-
128
- pdf.ibox 3.92, 7.46, 0.25, 2.54, '',
129
- xml['emit/xNome'] + "\n" +
130
- xml['enderEmit/xLgr'] + ", " + xml['enderEmit/nro'] + "\n" +
131
- xml['enderEmit/xBairro'] + " - " + xml['enderEmit/CEP'] + "\n" +
132
- xml['enderEmit/xMun'] + "/" + xml['enderEmit/UF'] + "\n" +
133
- xml['enderEmit/fone'] + " " + xml['enderEmit/email'], {:align => :center, :valign => :center}
134
-
135
- pdf.ibox 3.92, 3.08, 7.71, 2.54
136
-
137
- pdf.ibox 0.60, 3.08, 7.71, 2.54, '', "DANFE", {:size => 12, :align => :center, :border => 0, :style => :bold}
138
- pdf.ibox 1.20, 3.08, 7.71, 3.14, '', "DOCUMENTO AUXILIAR DA NOTA FISCAL ELETRÔNICA", {:size => 8, :align => :center, :border => 0}
139
- pdf.ibox 0.60, 3.08, 7.71, 4.34, '', "#{xml['ide/tpNF']} - " + (xml['ide/tpNF'] == '0' ? 'ENTRADA' : 'SAÍDA'), {:size => 8, :align => :center, :border => 0}
140
-
141
- pdf.ibox 1.00, 3.08, 7.71, 4.94, '',
142
- "N°. " + xml['ide/nNF'] + "\n" +
143
- "SÉRIE " + xml['ide/serie'], {:size => 8, :align => :center, :valign => :center, :border => 0, :style => :bold}
144
-
145
- pdf.ibox 2.20, 10.02, 10.79, 2.54
146
- pdf.ibarcode 1.50, 8.00, 10.9010, 4.44, xml['chNFe']
147
- pdf.ibox 0.85, 10.02, 10.79, 4.74, "CHAVE DE ACESSO", xml['chNFe'].gsub(/(\d)(?=(\d\d\d\d)+(?!\d))/, "\\1 "), {:style => :bold, :align => :center}
148
- pdf.ibox 0.85, 10.02, 10.79, 5.60 , '', "Consulta de autenticidade no portal nacional da NF-e www.nfe.fazenda.gov.br/portal ou no site da Sefaz Autorizadora", {:align => :center, :size => 8}
149
- pdf.ibox 0.85, 10.54, 0.25, 6.46, "NATUREZA DA OPERAÇÃO", xml['ide/natOp']
150
- pdf.ibox 0.85, 10.02, 10.79, 6.46, "PROTOCOLO DE AUTORIZAÇÃO DE USO", xml['infProt/nProt'] + ' ' + xml['infProt/dhRecbto'], {:align => :center}
151
-
152
- pdf.ibox 0.85, 6.86, 0.25, 7.31, "INSCRIÇÃO ESTADUAL", xml['emit/IE']
153
- pdf.ibox 0.85, 6.86, 7.11, 7.31, "INSC.ESTADUAL DO SUBST. TRIBUTÁRIO", xml['emit/IE_ST']
154
- pdf.ibox 0.85, 6.84, 13.97, 7.31, "CNPJ", xml['emit/CNPJ']
155
-
156
- # TITULO
157
-
158
- pdf.ititle 0.42, 10.00, 0.25, 8.16, "DESTINATÁRIO / REMETENTE"
159
-
160
- pdf.ibox 0.85, 12.32, 0.25, 8.58, "NOME/RAZÃO SOCIAL", xml['dest/xNome']
161
- pdf.ibox 0.85, 5.33, 12.57, 8.58, "CNPJ/CPF", xml['dest/CNPJ'] if xml['dest/CNPJ'] != ''
162
- pdf.ibox 0.85, 5.33, 12.57, 8.58, "CNPJ/CPF", xml['dest/CPF'] if xml['dest/CPF'] != ''
163
- pdf.idate 0.85, 2.92, 17.90, 8.58, "DATA DA EMISSÃO", xml['ide/dEmi'], {:align => :right}
164
- pdf.ibox 0.85, 10.16, 0.25, 9.43, "ENDEREÇO", xml['enderDest/xLgr'] + " " + xml['enderDest/nro']
165
- pdf.ibox 0.85, 4.83, 10.41, 9.43, "BAIRRO", xml['enderDest/xBairro']
166
- pdf.ibox 0.85, 2.67, 15.24, 9.43, "CEP", xml['enderDest/CEP']
167
- pdf.idate 0.85, 2.92, 17.90, 9.43, "DATA DA SAÍDA/ENTRADA", xml['ide/dSaiEnt'], {:align => :right}
168
- pdf.ibox 0.85, 7.11, 0.25, 10.28, "MUNICÍPIO", xml['enderDest/xMun']
169
- pdf.ibox 0.85, 4.06, 7.36, 10.28, "FONE/FAX", xml['enderDest/fone']
170
- pdf.ibox 0.85, 1.14, 11.42, 10.28, "UF", xml['enderDest/UF']
171
- pdf.ibox 0.85, 5.33, 12.56, 10.28, "INSCRIÇÃO ESTADUAL", xml['dest/IE']
172
- pdf.idate 0.85, 2.92, 17.90, 10.28, "HORA DE SAÍDA", xml['ide/dSaiEnt'], {:align => :right}
173
-
174
- # FATURAS
175
-
176
- pdf.ititle 0.42, 10.00, 0.25, 11.12, "FATURA / DUPLICATAS"
177
- pdf.ibox 0.85, 20.57, 0.25, 11.51
178
-
179
- if false
180
- pdf.box [0, 563], 63, 44, "Número"
181
- pdf.box [63, 563], 63, 44, "Vencimento"
182
- pdf.box [126, 563], 63, 44, "Valor"
183
- pdf.box [189, 563], 63, 44, "Número"
184
- pdf.box [252, 563], 63, 44, "Vencimento"
185
- pdf.box [315, 563], 63, 44, "Valor"
186
- pdf.box [378, 563], 63, 44, "Número"
187
- pdf.box [441, 563], 63, 44, "Vencimento"
188
- pdf.box [504, 563], 60, 44, "Valor"
189
- end
190
-
191
- pdf.ititle 0.42, 5.60, 0.25, 12.36, "CÁLCULO DO IMPOSTO"
192
-
193
- pdf.inumeric 0.85, 4.06, 0.25, 12.78, "BASE DE CÁLCULO DO ICMS", xml['ICMSTot/vBC']
194
- pdf.inumeric 0.85, 4.06, 4.31, 12.78, "VALOR DO ICMS", xml['ICMSTot/vICMS']
195
- pdf.inumeric 0.85, 4.06, 8.37, 12.78, "BASE DE CÁLCULO DO ICMS ST", xml['ICMSTot/vBCST']
196
- pdf.inumeric 0.85, 4.06, 12.43, 12.78, "VALOR DO ICMS ST", xml['ICMSTot/vST']
197
- pdf.inumeric 0.85, 4.32, 16.49, 12.78, "VALOR TOTAL DOS PRODUTOS", xml['ICMSTot/vProd']
198
- pdf.inumeric 0.85, 3.46, 0.25, 13.63, "VALOR DO FRETE", xml['ICMSTot/vFrete']
199
- pdf.inumeric 0.85, 3.46, 3.71, 13.63, "VALOR DO SEGURO", xml['ICMSTot/vSeg']
200
- pdf.inumeric 0.85, 3.46, 7.17, 13.63, "DESCONTO", xml['ICMSTot/vDesc']
201
- pdf.inumeric 0.85, 3.46, 10.63, 13.63, "OUTRAS DESPESAS ACESSORIAS", xml['ICMSTot/vOutro']
202
- pdf.inumeric 0.85, 3.46, 14.09, 13.63, "VALOR DO IPI", xml['ICMSTot/vIPI']
203
- pdf.inumeric 0.85, 3.27, 17.55, 13.63, "VALOR TOTAL DA NOTA", xml['ICMSTot/vNF'], :style => :bold
204
-
205
- pdf.ititle 0.42, 10.00, 0.25, 14.48, "TRANSPORTADOR / VOLUMES TRANSPORTADOS"
206
-
207
- pdf.ibox 0.85, 9.02, 0.25, 14.90, "RAZÃO SOCIAL", xml['transporta/xNome']
208
- pdf.ibox 0.85, 2.79, 9.27, 14.90, "FRETE POR CONTA", xml['transp/modFrete'] == '0' ? ' 0 - EMITENTE' : '1 - DEST.'
209
- pdf.ibox 0.85, 1.78, 12.06, 14.90, "CODIGO ANTT", xml['veicTransp/RNTC']
210
- pdf.ibox 0.85, 2.29, 13.84, 14.90, "PLACA DO VEÍCULO", xml['veicTransp/placa']
211
- pdf.ibox 0.85, 0.76, 16.13, 14.90, "UF", xml['veicTransp/UF']
212
- pdf.ibox 0.85, 3.94, 16.89, 14.90, "CNPJ/CPF", xml['transporta/CNPJ']
213
- pdf.ibox 0.85, 9.02, 0.25, 15.75, "ENDEREÇO", xml['transporta/xEnder']
214
- pdf.ibox 0.85, 6.86, 9.27, 15.75, "MUNICÍPIO", xml['transporta/xMun']
215
- pdf.ibox 0.85, 0.76, 16.13, 15.75, "UF", xml['transporta/UF']
216
- pdf.ibox 0.85, 3.94, 16.89, 15.75, "INSCRIÇÂO ESTADUAL", xml['transporta/IE']
217
- pdf.ibox 0.85, 2.92, 0.25, 16.60, "QUANTIDADE", xml['vol/qVol']
218
- pdf.ibox 0.85, 3.05, 3.17, 16.60, "ESPÉCIE", xml['vol/esp']
219
- pdf.ibox 0.85, 3.05, 6.22, 16.60, "MARCA", xml['vol/marca']
220
- pdf.ibox 0.85, 4.83, 9.27, 16.60, "NUMERAÇÃO"
221
- pdf.inumeric 0.85, 3.43, 14.10, 16.60, "PESO BRUTO", xml['vol/pesoB'], {:decimals => 3}
222
- pdf.inumeric 0.85, 3.30, 17.53, 16.60, "PESO LÍQUIDO", xml['vol/pesoL'], {:decimals => 3}
223
-
224
- pdf.ititle 0.42, 10.00, 0.25, 17.45, "DADOS DO PRODUTO / SERVIÇO"
225
-
226
- pdf.ibox 6.77, 2.00, 0.25, 17.87, "CÓDIGO"
227
- pdf.ibox 6.77, 4.50, 2.25, 17.87, "DESCRIÇÃO"
228
- pdf.ibox 6.77, 1.50, 6.75, 17.87, "NCM"
229
- pdf.ibox 6.77, 0.80, 8.25, 17.87, "CST"
230
- pdf.ibox 6.77, 1.00, 9.05, 17.87, "CFOP"
231
- pdf.ibox 6.77, 1.00, 10.05, 17.87, "UNID"
232
- pdf.ibox 6.77, 1.50, 11.05, 17.87, "QUANT"
233
- pdf.ibox 6.77, 1.50, 12.55, 17.87, "VALOR UNIT"
234
- pdf.ibox 6.77, 1.50, 14.05, 17.87, "VALOR TOT"
235
- pdf.ibox 6.77, 1.50, 15.55, 17.87, "BASE CÁLC"
236
- pdf.ibox 6.77, 1.00, 17.05, 17.87, "VL ICMS"
237
- pdf.ibox 6.77, 1.00, 18.05, 17.87, "VL IPI"
238
- pdf.ibox 6.77, 0.90, 19.05, 17.87, "% ICMS"
239
- pdf.ibox 6.77, 0.86, 19.95, 17.87, "% IPI"
240
-
241
- pdf.horizontal_line 0.25.cm, 21.50.cm, :at => invert(18.17.cm)
242
-
243
- pdf.ititle 0.42, 10.00, 0.25, 24.64, "CÁLCULO DO ISSQN"
244
-
245
- pdf.ibox 0.85, 5.08, 0.25, 25.06, "INSCRIÇÃO MUNICIPAL", xml['emit/IM']
246
- pdf.ibox 0.85, 5.08, 5.33, 25.06, "VALOR TOTAL DOS SERVIÇOS", xml['total/vServ']
247
- pdf.ibox 0.85, 5.08, 10.41, 25.06, "BASE DE CÁLCULO DO ISSQN", xml['total/vBCISS']
248
- pdf.ibox 0.85, 5.28, 15.49, 25.06, "VALOR DO ISSQN", xml['total/ISSTot']
249
-
250
- pdf.ititle 0.42, 10.00, 0.25, 25.91, "DADOS ADICIONAIS"
251
-
252
- pdf.ibox 3.07, 12.93, 0.25, 26.33, "INFORMAÇÕES COMPLEMENTARES", xml['infAdic/infCpl'], {:size => 8, :valign => :top}
253
-
254
- pdf.ibox 3.07, 7.62, 13.17, 26.33, "RESERVADO AO FISCO"
255
-
256
- end
257
-
258
-
259
- pdf.font_size(6) do
260
- pdf.itable 6.37, 21.50, 0.25, 18.17,
261
- xml.collect('//xmlns:det') { |det|
262
- [
263
- det.css('prod/cProd').text, #I02
264
- det.css('prod/xProd').text, #I04
265
- det.css('prod/NCM').text, #I05
266
- det.css('ICMS/*/orig').text, #N11
267
- det.css('prod/CFOP').text, #I08
268
- det.css('prod/uCom').text, #I09
269
- numerify(det.css('prod/qCom').text), #I10
270
- numerify(det.css('prod/vUnCom').text), #I10a
271
- numerify(det.css('prod/vProd').text), #I11
272
- numerify(det.css('ICMS/*/vBC').text), #N15
273
- numerify(det.css('ICMS/*/vICMS').text), #N17
274
- numerify(det.css('IPI/*/vIPI').text), #O14
275
- numerify(det.css('ICMS/*/pICMS').text), #N16
276
- numerify(det.css('IPI/*/pIPI').text) #O13
277
- ]
278
- },
279
- :column_widths => {
280
- 0 => 2.00.cm,
281
- 1 => 4.50.cm,
282
- 2 => 1.50.cm,
283
- 3 => 0.80.cm,
284
- 4 => 1.00.cm,
285
- 5 => 1.00.cm,
286
- 6 => 1.50.cm,
287
- 7 => 1.50.cm,
288
- 8 => 1.50.cm,
289
- 9 => 1.50.cm,
290
- 10 => 1.00.cm,
291
- 11 => 1.00.cm,
292
- 12 => 0.90.cm,
293
- 13 => 0.86.cm
294
- },
295
- :cell_style => {:padding => 2, :border_width => 0} do |table|
296
- pdf.dash(5);
297
- table.column(6..13).style(:align => :right)
298
- table.column(0..13).border_width = 1
299
- table.column(0..13).borders = [:bottom]
300
- end
301
- end
302
-
303
- pdf.page_count.times do |i|
304
- pdf.go_to_page(i + 1)
305
- pdf.ibox 1.00, 3.08, 7.71, 5.54, '',
306
- "FOLHA #{i + 1} de #{pdf.page_count}", {:size => 8, :align => :center, :valign => :center, :border => 0, :style => :bold}
307
- end
308
-
309
- return pdf
310
-
311
- end
312
-
313
- def self.render(xml_string)
314
- xml = XML.new(xml_string)
315
- pdf = generatePDF(xml)
316
- return pdf.render
317
- end
318
-
319
- def self.generate(pdf_filename, xml_filename)
320
- xml = XML.new(File.new(xml_filename))
321
- pdf = generatePDF(xml)
322
- pdf.render_file pdf_filename
323
- end
324
-
325
- end
1
+ require_relative 'ruby_danfe/railtie.rb'