br_danfe 0.14.4 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -0
  3. data/Gemfile.lock +48 -33
  4. data/Guardfile +2 -2
  5. data/README.md +39 -0
  6. data/br_danfe.gemspec +5 -4
  7. data/config/locales/pt-BR.yml +1 -0
  8. data/lib/br_danfe.rb +1 -1
  9. data/lib/br_danfe/danfe.rb +8 -5
  10. data/lib/br_danfe/danfe_lib/base.rb +2 -2
  11. data/lib/br_danfe/danfe_lib/nfce.rb +14 -12
  12. data/lib/br_danfe/danfe_lib/nfe.rb +39 -27
  13. data/lib/br_danfe/danfe_lib/nfe_lib/dest.rb +1 -1
  14. data/lib/br_danfe/danfe_lib/nfe_lib/emit_header.rb +5 -5
  15. data/lib/br_danfe/document_builder.rb +1 -1
  16. data/lib/br_danfe/helper.rb +11 -7
  17. data/lib/br_danfe/mdfe.rb +55 -0
  18. data/lib/br_danfe/mdfe_lib/authorization_protocol.rb +24 -0
  19. data/lib/br_danfe/mdfe_lib/document.rb +26 -0
  20. data/lib/br_danfe/mdfe_lib/drivers.rb +70 -0
  21. data/lib/br_danfe/mdfe_lib/fisco_control.rb +40 -0
  22. data/lib/br_danfe/mdfe_lib/header.rb +78 -0
  23. data/lib/br_danfe/mdfe_lib/mdfe_identification.rb +69 -0
  24. data/lib/br_danfe/mdfe_lib/notes.rb +94 -0
  25. data/lib/br_danfe/mdfe_lib/totalizer.rb +57 -0
  26. data/lib/br_danfe/mdfe_lib/vehicles.rb +80 -0
  27. data/lib/br_danfe/qr_code.rb +22 -0
  28. data/lib/br_danfe/version.rb +1 -1
  29. data/spec/br_danfe/danfe_lib/nfce_spec.rb +12 -1
  30. data/spec/br_danfe/danfe_lib/nfe_lib/emit_header_spec.rb +2 -2
  31. data/spec/br_danfe/danfe_lib/nfe_lib/infadic_spec.rb +3 -3
  32. data/spec/br_danfe/danfe_lib/nfe_spec.rb +17 -1
  33. data/spec/br_danfe/danfe_spec.rb +16 -0
  34. data/spec/br_danfe/helper_spec.rb +12 -0
  35. data/spec/br_danfe/mdfe_lib/authorization_protocol_spec.rb +35 -0
  36. data/spec/br_danfe/mdfe_lib/document_spec.rb +20 -0
  37. data/spec/br_danfe/mdfe_lib/drivers_spec.rb +88 -0
  38. data/spec/br_danfe/mdfe_lib/fisco_control_spec.rb +55 -0
  39. data/spec/br_danfe/mdfe_lib/header_spec.rb +126 -0
  40. data/spec/br_danfe/mdfe_lib/mdfe_identification_spec.rb +104 -0
  41. data/spec/br_danfe/mdfe_lib/notes_spec.rb +97 -0
  42. data/spec/br_danfe/mdfe_lib/totalizer_spec.rb +63 -0
  43. data/spec/br_danfe/mdfe_lib/vehicles_spec.rb +66 -0
  44. data/spec/br_danfe/mdfe_spec.rb +46 -0
  45. data/spec/br_danfe/{danfe_lib/nfce_lib/qr_code_spec.rb → qr_code_spec.rb} +10 -5
  46. data/spec/fixtures/cce/lib/barcode#render.pdf +5 -3
  47. data/spec/fixtures/cce/v1.00/cce.fixture.pdf +15 -13
  48. data/spec/fixtures/mdfe/lib/document#render.pdf +0 -0
  49. data/spec/fixtures/mdfe/lib/document#text.align.pdf +0 -0
  50. data/spec/fixtures/mdfe/lib/document#text.pad.pdf +0 -0
  51. data/spec/fixtures/mdfe/lib/document#text.simple.pdf +0 -0
  52. data/spec/fixtures/mdfe/lib/document#text.size.pdf +0 -0
  53. data/spec/fixtures/mdfe/lib/document#text.style.pdf +0 -0
  54. data/spec/fixtures/mdfe/lib/fisco_control#barcode.pdf +0 -0
  55. data/spec/fixtures/mdfe/lib/header#render-qr-code.pdf +0 -0
  56. data/spec/fixtures/mdfe/lib/header#render-with_logo.pdf +0 -0
  57. data/spec/fixtures/mdfe/lib/header#render-without_logo.pdf +0 -0
  58. data/spec/fixtures/mdfe/lib/mdfe-with-multiple-pages.pdf +1945 -0
  59. data/spec/fixtures/mdfe/lib/mdfe.fixture.pdf +1286 -0
  60. data/spec/fixtures/mdfe/lib/notes#render-big-aditional-information.pdf +1943 -0
  61. data/spec/fixtures/mdfe/lib/xml-mdfe-multiples-pages.xml +116 -0
  62. data/spec/fixtures/mdfe/lib/xml-mdfe.xml +250 -0
  63. data/spec/fixtures/nfce/lib/document#render.pdf +17 -17
  64. data/spec/fixtures/nfce/lib/footer#render-with_additional_information.pdf +12 -12
  65. data/spec/fixtures/nfce/lib/footer#render.pdf +10 -10
  66. data/spec/fixtures/nfce/lib/header#render-homologation.pdf +0 -0
  67. data/spec/fixtures/nfce/lib/header#render-long_name_with_logo.pdf +0 -0
  68. data/spec/fixtures/nfce/lib/header#render-long_name_without_logo.pdf +16 -16
  69. data/spec/fixtures/nfce/lib/header#render-short_name_with_logo.pdf +0 -0
  70. data/spec/fixtures/nfce/lib/header#render-short_name_without_logo.pdf +16 -16
  71. data/spec/fixtures/nfce/lib/key#render.pdf +14 -14
  72. data/spec/fixtures/nfce/lib/nfce_identification#render.pdf +16 -16
  73. data/spec/fixtures/nfce/lib/product_list#render-with_many_products.pdf +43 -43
  74. data/spec/fixtures/nfce/lib/product_list#render-with_many_products_and_long_names.pdf +47 -47
  75. data/spec/fixtures/nfce/lib/product_list#render-with_single_product.pdf +25 -25
  76. data/spec/fixtures/nfce/lib/product_list#render-with_single_product_and_long_name.pdf +27 -27
  77. data/spec/fixtures/nfce/lib/qr_code#render.pdf +0 -0
  78. data/spec/fixtures/nfce/lib/recipient#render-company.pdf +13 -13
  79. data/spec/fixtures/nfce/lib/recipient#render-consumer_without_document.pdf +12 -12
  80. data/spec/fixtures/nfce/lib/recipient#render-foreign.pdf +13 -13
  81. data/spec/fixtures/nfce/lib/recipient#render-individual.pdf +13 -13
  82. data/spec/fixtures/nfce/lib/recipient#render-unidentified_consumer.pdf +11 -11
  83. data/spec/fixtures/nfce/lib/total_list#does_not_render-payment_methods.pdf +19 -19
  84. data/spec/fixtures/nfce/lib/total_list#render-grouped_payment_methods.pdf +26 -26
  85. data/spec/fixtures/nfce/lib/total_list#render-totals.pdf +19 -19
  86. data/spec/fixtures/nfce/lib/total_list#render-without_payment.pdf +28 -28
  87. data/spec/fixtures/nfce/lib/total_list#render.pdf +28 -28
  88. data/spec/fixtures/nfce/v4.00/multiples_xmls_on_the_same_pdf.pdf +1229 -0
  89. data/spec/fixtures/nfce/v4.00/nfce-unauthorized-hom.fixture.pdf +0 -0
  90. data/spec/fixtures/nfce/v4.00/nfce-unauthorized-prod.fixture.pdf +0 -0
  91. data/spec/fixtures/nfce/v4.00/rendered_nfce.fixture.pdf +0 -0
  92. data/spec/fixtures/nfce/v4.00/saved_nfce.fixture.pdf +0 -0
  93. data/spec/fixtures/nfe/lib/dest#render-v2.00.pdf +0 -0
  94. data/spec/fixtures/nfe/lib/dest#render-v3.10.pdf +0 -0
  95. data/spec/fixtures/nfe/lib/dest#render-v4.00.pdf +0 -0
  96. data/spec/fixtures/nfe/lib/dest#render-with-address-bigger.pdf +0 -0
  97. data/spec/fixtures/nfe/lib/dest#render-with_cnpj.pdf +0 -0
  98. data/spec/fixtures/nfe/lib/dest#render-with_cpf.pdf +0 -0
  99. data/spec/fixtures/nfe/lib/dest#render-with_ie.pdf +0 -0
  100. data/spec/fixtures/nfe/lib/dest#render-without-address-complement.pdf +0 -0
  101. data/spec/fixtures/nfe/lib/det_body#render-csosn.pdf +662 -662
  102. data/spec/fixtures/nfe/lib/det_body#render-cst.pdf +410 -410
  103. data/spec/fixtures/nfe/lib/det_body#render-fci.pdf +272 -272
  104. data/spec/fixtures/nfe/lib/det_body#render-icms_st.pdf +272 -272
  105. data/spec/fixtures/nfe/lib/det_body#render-quantity_with_custom_precision.pdf +270 -270
  106. data/spec/fixtures/nfe/lib/det_body#render-three_pages.pdf +6213 -6213
  107. data/spec/fixtures/nfe/lib/det_body#render-two_pages.pdf +6083 -6083
  108. data/spec/fixtures/nfe/lib/det_body#render-unit_price_with_custom_precision.pdf +270 -270
  109. data/spec/fixtures/nfe/lib/det_body#render-with_infadprod.pdf +272 -272
  110. data/spec/fixtures/nfe/lib/det_body#render-with_issqn.pdf +2859 -2859
  111. data/spec/fixtures/nfe/lib/det_body#render-without_issqn.pdf +2859 -2859
  112. data/spec/fixtures/nfe/lib/document#lcnpj-blank.pdf +0 -0
  113. data/spec/fixtures/nfe/lib/document#lcnpj-invalid.pdf +0 -0
  114. data/spec/fixtures/nfe/lib/document#lcnpj-valid.pdf +0 -0
  115. data/spec/fixtures/nfe/lib/document#lie-blank-uf-invalid.pdf +0 -0
  116. data/spec/fixtures/nfe/lib/document#lie-blank.pdf +0 -0
  117. data/spec/fixtures/nfe/lib/document#lie-invalid.pdf +0 -0
  118. data/spec/fixtures/nfe/lib/document#lie-valid.pdf +0 -0
  119. data/spec/fixtures/nfe/lib/dup#render.pdf +0 -0
  120. data/spec/fixtures/nfe/lib/emit_header#render-second_page.pdf +511 -509
  121. data/spec/fixtures/nfe/lib/emit_header#render-with_logo.pdf +510 -508
  122. data/spec/fixtures/nfe/lib/emit_header#render-without_logo.pdf +507 -505
  123. data/spec/fixtures/nfe/lib/icmstot#render.pdf +0 -0
  124. data/spec/fixtures/nfe/lib/infadic#address-shipment.pdf +0 -0
  125. data/spec/fixtures/nfe/lib/infadic#render-all_the_informations.pdf +0 -0
  126. data/spec/fixtures/nfe/lib/infadic#render-difal.pdf +0 -0
  127. data/spec/fixtures/nfe/lib/infadic#render-extra_volume.pdf +0 -0
  128. data/spec/fixtures/nfe/lib/infadic#render-with_complementary_information.pdf +0 -0
  129. data/spec/fixtures/nfe/lib/infadic#render-with_fisco_additional_information.pdf +0 -0
  130. data/spec/fixtures/nfe/lib/infadic#render-with_street_data.pdf +0 -0
  131. data/spec/fixtures/nfe/lib/infadic#render.pdf +0 -0
  132. data/spec/fixtures/nfe/lib/infadic_vol#render-extra_volume.pdf +0 -0
  133. data/spec/fixtures/nfe/lib/issqn#render-with_issqn.pdf +0 -0
  134. data/spec/fixtures/nfe/lib/issqn#render-with_one_issqn_value.pdf +0 -0
  135. data/spec/fixtures/nfe/lib/ticket#render.pdf +0 -0
  136. data/spec/fixtures/nfe/lib/transp#render-modfrete_0.pdf +0 -0
  137. data/spec/fixtures/nfe/lib/transp#render-modfrete_1.pdf +0 -0
  138. data/spec/fixtures/nfe/lib/transp#render-modfrete_2.pdf +0 -0
  139. data/spec/fixtures/nfe/lib/transp#render-modfrete_3.pdf +0 -0
  140. data/spec/fixtures/nfe/lib/transp#render-modfrete_4.pdf +0 -0
  141. data/spec/fixtures/nfe/lib/transp#render-modfrete_9.pdf +0 -0
  142. data/spec/fixtures/nfe/lib/transp#render.pdf +0 -0
  143. data/spec/fixtures/nfe/lib/vol#render-blank-boxes.pdf +0 -0
  144. data/spec/fixtures/nfe/lib/vol#render.pdf +0 -0
  145. data/spec/fixtures/nfe/v2.00/custom_options.fixture.pdf +733 -733
  146. data/spec/fixtures/nfe/v2.00/nfe_simples_nacional.xml.fixture.pdf +730 -730
  147. data/spec/fixtures/nfe/v2.00/nfe_with_extra_volumes.xml.fixture.pdf +3449 -3445
  148. data/spec/fixtures/nfe/v2.00/nfe_with_fci.xml.fixture.pdf +929 -927
  149. data/spec/fixtures/nfe/v2.00/nfe_with_ns.xml.fixture.pdf +3424 -3420
  150. data/spec/fixtures/nfe/v2.00/nfe_without_ns.xml.fixture.pdf +1178 -1176
  151. data/spec/fixtures/nfe/v3.10/multiples.xmls.on.the.same.pdf.pdf +11471 -0
  152. data/spec/fixtures/nfe/v3.10/nfe_simples_nacional.xml.fixture.pdf +1495 -1495
  153. data/spec/fixtures/nfe/v3.10/with_footer.fixture.pdf +2444 -2444
  154. data/spec/fixtures/nfe/v3.10/with_issqn.fixture.pdf +2142 -2142
  155. data/spec/fixtures/nfe/v3.10/with_three_pages.fixture.pdf +7096 -7096
  156. data/spec/fixtures/nfe/v3.10/without_issqn.fixture.pdf +2811 -2811
  157. data/spec/fixtures/qr_code/qr_code#render.pdf +0 -0
  158. metadata +90 -39
  159. data/lib/br_danfe/danfe_lib/nfce_lib/qr_code.rb +0 -25
  160. data/lib/br_danfe/danfe_lib/nfe_lib/cep.rb +0 -11
  161. data/spec/br_danfe/danfe_lib/nfe_lib/cep_spec.rb +0 -10
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrDanfe::MdfeLib::Drivers do
4
+ let(:xml_as_string) do
5
+ <<~XML
6
+ <?xml version="1.0" encoding="UTF-8"?>
7
+ <mdfeProc xmlns="http://www.portalfiscal.inf.br/mdfe" versao="3.00">
8
+ <MDFe xmlns="http://www.portalfiscal.inf.br/mdfe">
9
+ <infMDFe Id="MDFe32210717781119000141580010000001211000000003" versao="3.00">
10
+ <infModal versaoModal="3.00">
11
+ <rodo>
12
+ <infANTT/>
13
+ <veicTracao>
14
+ <placa>RQM8B64</placa>
15
+ <RENAVAM>01259587867</RENAVAM>
16
+ <tara>0</tara>
17
+ <capKG>1500</capKG>
18
+ <capM3>0</capM3>
19
+ <condutor>
20
+ <xNome>EDUARDO DANIEL</xNome>
21
+ <CPF>11585756709</CPF>
22
+ </condutor>
23
+ <tpRod>04</tpRod>
24
+ <tpCar>02</tpCar>
25
+ <UF>ES</UF>
26
+ </veicTracao>
27
+ <veicReboque>
28
+ <placa>RVA1B90</placa>
29
+ <RENAVAM>123456789</RENAVAM>
30
+ <tara>0</tara>
31
+ <capKG>1500</capKG>
32
+ <capM3>0</capM3>
33
+ <condutor>
34
+ <xNome>JOAO DA SILVA</xNome>
35
+ <CPF>9876654312</CPF>
36
+ </condutor>
37
+ <tpRod>04</tpRod>
38
+ <tpCar>02</tpCar>
39
+ <UF>SC</UF>
40
+ </veicReboque>
41
+ <veicReboque>
42
+ <placa>DFE4U78</placa>
43
+ <RENAVAM>045784572</RENAVAM>
44
+ <tara>0</tara>
45
+ <capKG>1500</capKG>
46
+ <capM3>0</capM3>
47
+ <condutor>
48
+ <xNome>ANTÔNIO DA SILVA</xNome>
49
+ <CPF>9856478238</CPF>
50
+ </condutor>
51
+ <tpRod>04</tpRod>
52
+ <tpCar>02</tpCar>
53
+ <UF>SC</UF>
54
+ </veicReboque>
55
+ </rodo>
56
+ </infModal>
57
+ </infMDFe>
58
+ </MDFe>
59
+ </mdfeProc>
60
+ XML
61
+ end
62
+
63
+ let(:pdf) { BrDanfe::MdfeLib::Document.new }
64
+ let(:xml) { BrDanfe::XML.new(xml_as_string) }
65
+
66
+ subject { described_class.new(pdf, xml) }
67
+
68
+ let(:pdf_text) do
69
+ PDF::Inspector::Text.analyze(pdf.render).strings.join("\n")
70
+ end
71
+
72
+ describe '#generate' do
73
+ it 'generates the title' do
74
+ title = 'Condutor'
75
+
76
+ subject.generate
77
+ expect(pdf_text).to include title
78
+ end
79
+
80
+ it 'generates the title of table' do
81
+ cpf = 'CPF'
82
+ name = 'Nome'
83
+
84
+ subject.generate
85
+ expect(pdf_text).to include cpf, name
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrDanfe::MdfeLib::FiscoControl do
4
+ let(:base_dir) { './spec/fixtures/mdfe/lib/' }
5
+ let(:output_pdf) { "#{base_dir}output.pdf" }
6
+
7
+ let(:xml_as_string) do
8
+ <<~XML
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <mdfeProc xmlns="http://www.portalfiscal.inf.br/mdfe" versao="3.00">
11
+ <protMDFe versao="3.00" xmlns="http://www.portalfiscal.inf.br/mdfe">
12
+ <infProt Id="MDFe932210002534081">
13
+ <chMDFe>32210717781119000141580010000001211000000003</chMDFe>
14
+ </infProt>
15
+ </protMDFe>
16
+ </mdfeProc>
17
+ XML
18
+ end
19
+
20
+ let(:pdf) { BrDanfe::MdfeLib::Document.new }
21
+ let(:xml) { BrDanfe::XML.new(xml_as_string) }
22
+
23
+ subject { described_class.new(pdf, xml) }
24
+
25
+ let(:pdf_text) do
26
+ PDF::Inspector::Text.analyze(pdf.render).strings.join("\n")
27
+ end
28
+
29
+ describe '#generate' do
30
+ after { File.delete(output_pdf) if File.exist?(output_pdf) }
31
+
32
+ it 'generates the title' do
33
+ title = 'CONTROLE DO FISCO'
34
+
35
+ subject.generate
36
+ expect(pdf_text).to include title
37
+ end
38
+
39
+ it 'generates the bar code' do
40
+ expect(File.exist?(output_pdf)).to be false
41
+
42
+ subject.generate
43
+ pdf.render_file output_pdf
44
+
45
+ expect("#{base_dir}fisco_control#barcode.pdf").to have_same_content_of file: output_pdf
46
+ end
47
+
48
+ it 'generates the nfe key' do
49
+ nfe_key = "Chave de Acesso\n32210717781119000141580010000001211000000003"
50
+
51
+ subject.generate
52
+ expect(pdf_text).to include nfe_key
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrDanfe::MdfeLib::Header do
4
+ let(:xml_as_string) do
5
+ <<~XML
6
+ <?xml version="1.0" encoding="UTF-8"?>
7
+ <mdfeProc xmlns="http://www.portalfiscal.inf.br/mdfe" versao="3.00">
8
+ <MDFe xmlns="http://www.portalfiscal.inf.br/mdfe">
9
+ <infMDFe Id="MDFe32210717781119000141580010000001211000000003" versao="3.00">
10
+ <ide>
11
+ <mod>58</mod>
12
+ <serie>1</serie>
13
+ <nMDF>121</nMDF>
14
+ <cMDF>00000000</cMDF>
15
+ <dhEmi>2021-07-01T17:30:00-03:00</dhEmi>
16
+ <UFIni>ES</UFIni>
17
+ <UFFim>ES</UFFim>
18
+ </ide>
19
+ <emit>
20
+ <CNPJ>17781119000141</CNPJ>
21
+ <IE>082942625</IE>
22
+ <xNome>VENTURIM AGROCRIATIVA LTDA EPP</xNome>
23
+ <xFant>VENTURIM CONSERVAS</xFant>
24
+ <enderEmit>
25
+ <xLgr>RODOVIA ES 473 KM 13</xLgr>
26
+ <nro>0</nro>
27
+ <cMun>3205069</cMun>
28
+ <xMun>VENDA NOVA DO IMIGRANTE</xMun>
29
+ <CEP>29375000</CEP>
30
+ <UF>ES</UF>
31
+ </enderEmit>
32
+ </emit>
33
+ </infMDFe>
34
+ <infMDFeSupl>
35
+ <qrCodMDFe>https://dfe-portal.svrs.rs.gov.br/mdfe/QRCode?chMDFe=32210717781119000141580010000001211000000003&amp;tpAmb=1</qrCodMDFe>
36
+ </infMDFeSupl>
37
+ </MDFe>
38
+ </mdfeProc>
39
+ XML
40
+ end
41
+
42
+ let(:pdf) { BrDanfe::MdfeLib::Document.new }
43
+ let(:xml) { BrDanfe::XML.new(xml_as_string) }
44
+
45
+ let(:base_dir) { './spec/fixtures/mdfe/lib/' }
46
+ let(:output_pdf) { "#{base_dir}output.pdf" }
47
+
48
+ let(:logo_dimensions) { { width: 100, height: 100 } }
49
+ let(:logo) { 'spec/fixtures/logo.png' }
50
+
51
+ subject { described_class.new(pdf, xml, logo, logo_dimensions) }
52
+
53
+ let(:pdf_text) do
54
+ PDF::Inspector::Text.analyze(pdf.render).strings.join("\n")
55
+ end
56
+
57
+ after { File.delete(output_pdf) if File.exist?(output_pdf) }
58
+
59
+ describe '#generate' do
60
+ it 'generates the emitter informations' do
61
+ emitter_name = 'VENTURIM AGROCRIATIVA LTDA EPP'
62
+ emitter_address = "RODOVIA ES 473 KM 13, nº 0\nVENDA NOVA DO IMIGRANTE - ES CEP 29.375-000"
63
+
64
+ emitter_cnpj = "CNPJ: \n17781119000141"
65
+ emitter_ie = "IE: \n082942625"
66
+
67
+ subject.generate
68
+
69
+ expect(pdf_text).to include emitter_name
70
+ expect(pdf_text).to include emitter_address
71
+ expect(pdf_text).to include emitter_cnpj
72
+ expect(pdf_text).to include emitter_ie
73
+ end
74
+
75
+ it'generates the DAMDFE title' do
76
+ title = "DAMDFE\n - Documento Auxiliar de Manifesto Eletrônico de Documentos Fiscais"
77
+
78
+ subject.generate
79
+
80
+ expect(pdf_text).to include title
81
+ end
82
+
83
+ it 'generates the qr code' do
84
+ expect(File.exist?(output_pdf)).to be false
85
+
86
+ subject.generate
87
+ pdf.render_file output_pdf
88
+
89
+ expect("#{base_dir}header#render-qr-code.pdf").to have_same_content_of file: output_pdf
90
+ end
91
+
92
+ it 'generates the company CNPJ' do
93
+ cnpj = "CNPJ: \n17781119000141"
94
+
95
+ subject.generate
96
+
97
+ expect(pdf_text).to include cnpj
98
+ end
99
+
100
+ describe 'logo' do
101
+ context 'with logo' do
102
+ it 'generates the logo' do
103
+ expect(File.exist?(output_pdf)).to be false
104
+
105
+ subject.generate
106
+ pdf.render_file output_pdf
107
+
108
+ expect("#{base_dir}header#render-with_logo.pdf").to have_same_content_of file: output_pdf
109
+ end
110
+ end
111
+
112
+ context 'without logo' do
113
+ let(:logo) { '' }
114
+
115
+ it 'does not generate the logo' do
116
+ expect(File.exist?(output_pdf)).to be false
117
+
118
+ subject.generate
119
+ pdf.render_file output_pdf
120
+
121
+ expect("#{base_dir}header#render-without_logo.pdf").to have_same_content_of file: output_pdf
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrDanfe::MdfeLib::MdfeIdentification do
4
+ let(:xml_as_string) do
5
+ <<~XML
6
+ <?xml version="1.0" encoding="UTF-8"?>
7
+ <mdfeProc xmlns="http://www.portalfiscal.inf.br/mdfe" versao="3.00">
8
+ <MDFe xmlns="http://www.portalfiscal.inf.br/mdfe">
9
+ <infMDFe Id="MDFe32210717781119000141580010000001211000000003" versao="3.00">
10
+ <ide>
11
+ <cUF>32</cUF>
12
+ <tpAmb>1</tpAmb>
13
+ <tpEmit>2</tpEmit>
14
+ <mod>58</mod>
15
+ <serie>1</serie>
16
+ <nMDF>121</nMDF>
17
+ <cMDF>00000000</cMDF>
18
+ <cDV>3</cDV>
19
+ <modal>1</modal>
20
+ <dhEmi>2021-07-01T17:30:00-03:00</dhEmi>
21
+ <tpEmis>1</tpEmis>
22
+ <procEmi>0</procEmi>
23
+ <verProc>hivelog-mdfe-0.1.0</verProc>
24
+ <UFIni>ES</UFIni>
25
+ <UFFim>SC</UFFim>
26
+ <infMunCarrega>
27
+ <cMunCarrega>3205069</cMunCarrega>
28
+ <xMunCarrega>VENDA NOVA DO IMIGRANTE</xMunCarrega>
29
+ </infMunCarrega>
30
+ <dhIniViagem>2021-07-01T17:30:00-03:00</dhIniViagem>
31
+ </ide>
32
+ </infMDFe>
33
+ </MDFe>
34
+ </mdfeProc>
35
+ XML
36
+ end
37
+
38
+ let(:pdf) { BrDanfe::MdfeLib::Document.new }
39
+ let(:xml) { BrDanfe::XML.new(xml_as_string) }
40
+
41
+ subject { described_class.new(pdf, xml) }
42
+
43
+ let(:pdf_text) do
44
+ PDF::Inspector::Text.analyze(pdf.render).strings.join("\n")
45
+ end
46
+
47
+ describe '#generate' do
48
+ it 'generates the model' do
49
+ model = "Modelo\n58"
50
+
51
+ subject.generate(1)
52
+
53
+ expect(pdf_text).to include model
54
+ end
55
+
56
+ it 'generates the series' do
57
+ series = "Série\n1"
58
+
59
+ subject.generate(1)
60
+
61
+ expect(pdf_text).to include series
62
+ end
63
+
64
+ it 'generates the number' do
65
+ number = "Número\n121"
66
+
67
+ subject.generate(1)
68
+
69
+ expect(pdf_text).to include number
70
+ end
71
+
72
+ it 'generates the page number' do
73
+ pages = "FL\n1/1"
74
+
75
+ subject.generate(1)
76
+
77
+ expect(pdf_text).to include pages
78
+ end
79
+
80
+ it 'generates the emitted date and hour' do
81
+ datetime = "Data e hora de Emissão\n01/07/2021 17:30:00"
82
+
83
+ subject.generate(1)
84
+
85
+ expect(pdf_text).to include datetime
86
+ end
87
+
88
+ it 'generates the origin uf' do
89
+ origin_uf = "UF Carreg.\nES"
90
+
91
+ subject.generate(1)
92
+
93
+ expect(pdf_text).to include origin_uf
94
+ end
95
+
96
+ it 'generates the destination uf' do
97
+ destination_uf = "UF Descarreg.\nSC"
98
+
99
+ subject.generate(1)
100
+
101
+ expect(pdf_text).to include destination_uf
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrDanfe::MdfeLib::Notes do
4
+ def xml_as_string(options = {})
5
+ params = {
6
+ infAdFisco: '<infAdFisco>EXEMPLO INFORMAÇÕES ADICIONAIS FISCO</infAdFisco>',
7
+ infCpl: '<infCpl>EXEMPLO INFORMAÇÕES ADICIONAIS CONTRIBUINTE</infCpl>'
8
+ }.merge(options)
9
+
10
+ <<~XML
11
+ <?xml version="1.0" encoding="UTF-8"?>
12
+ <mdfeProc xmlns="http://www.portalfiscal.inf.br/mdfe" versao="3.00">
13
+ <MDFe xmlns="http://www.portalfiscal.inf.br/mdfe">
14
+ <infMDFe Id="MDFe32210717781119000141580010000001211000000003" versao="3.00">
15
+ <infAdic>
16
+ #{params[:infAdFisco]}
17
+ #{params[:infCpl]}
18
+ </infAdic>
19
+ </infMDFe>
20
+ </MDFe>
21
+ </mdfeProc>
22
+ XML
23
+ end
24
+
25
+ let(:base_dir) { './spec/fixtures/mdfe/lib/' }
26
+ let(:output_pdf) { "#{base_dir}output.pdf" }
27
+
28
+ let(:pdf) { BrDanfe::MdfeLib::Document.new }
29
+ let(:xml) { BrDanfe::XML.new(xml_as_string) }
30
+
31
+ subject { described_class.new(pdf, xml) }
32
+
33
+ let(:pdf_text) do
34
+ PDF::Inspector::Text.analyze(pdf.render).strings.join("\n")
35
+ end
36
+
37
+ before { pdf.move_cursor_to 345 }
38
+
39
+ describe '#generate' do
40
+ it 'generates the title' do
41
+ title = 'Observações'
42
+
43
+ subject.generate
44
+ expect(pdf_text).to include title
45
+ end
46
+
47
+ it 'generates additional information for fisco when xml has content in infAdFisco tag' do
48
+ fisco_information = "INFORMAÇÕES ADICIONAIS DE INTERESSE DO FISCO\nEXEMPLO INFORMAÇÕES ADICIONAIS FISCO"
49
+
50
+ subject.generate
51
+ expect(pdf_text).to include fisco_information
52
+ end
53
+
54
+ it 'does not generate the additional information for fisco when xml does not have content in infAdFisco tag' do
55
+ fisco_information = "INFORMAÇÕES ADICIONAIS DE INTERESSE DO FISCO\n"
56
+
57
+ xml = BrDanfe::XML.new(xml_as_string(infAdFisco: '', infCpl: ''))
58
+ subject = described_class.new(pdf, xml)
59
+ subject.generate
60
+ expect(pdf_text).not_to include fisco_information
61
+ end
62
+
63
+ it 'generates the additional information for taxpayer when xml has content in infCpl tag' do
64
+ taxpayer_information = "INFORMAÇÕES ADICIONAIS DE INTERESSE DO CONTRIBUINTE\nEXEMPLO INFORMAÇÕES ADICIONAIS CONTRIBUINTE"
65
+
66
+ subject.generate
67
+ expect(pdf_text).to include taxpayer_information
68
+ end
69
+
70
+ it 'does not generate the additional information for taxpayer when xml does not have content in infCpl tag' do
71
+ taxpayer_information = "INFORMAÇÕES ADICIONAIS DE INTERESSE DO CONTRIBUINTE\n"
72
+
73
+ xml = BrDanfe::XML.new(xml_as_string(infAdFisco: '', infCpl: ''))
74
+ subject = described_class.new(pdf, xml)
75
+ subject.generate
76
+ expect(pdf_text).not_to include taxpayer_information
77
+ end
78
+
79
+ after { File.delete(output_pdf) if File.exist?(output_pdf) }
80
+
81
+ it 'creates a new page if aditional information do not fit on first page' do
82
+ expect(File.exist?(output_pdf)).to be false
83
+
84
+ xml = BrDanfe::XML.new(
85
+ xml_as_string(
86
+ infAdFisco: "<infAdFisco>#{'alguma coisa ' * 153}</infAdFisco>",
87
+ infCpl: "<infCpl>#{'alguma coisa ' * 2000}<infCpl>"
88
+ )
89
+ )
90
+ subject = described_class.new(pdf, xml)
91
+ subject.generate
92
+ pdf.render_file output_pdf
93
+
94
+ expect("#{base_dir}notes#render-big-aditional-information.pdf").to have_same_content_of file: output_pdf
95
+ end
96
+ end
97
+ end