br_danfe 0.0.9 → 0.2.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.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -3
  3. data/br_danfe.gemspec +1 -0
  4. data/config/locales/pt-BR.yml +14 -0
  5. data/lib/br_danfe/cce.rb +28 -0
  6. data/lib/br_danfe/cce_lib/barcode.rb +24 -0
  7. data/lib/br_danfe/cce_lib/correction.rb +22 -0
  8. data/lib/br_danfe/cce_lib/document.rb +44 -0
  9. data/lib/br_danfe/cce_lib/footer.rb +15 -0
  10. data/lib/br_danfe/cce_lib/header.rb +15 -0
  11. data/lib/br_danfe/cce_lib/nfe_key.rb +23 -0
  12. data/lib/br_danfe/cce_lib/protocol.rb +23 -0
  13. data/lib/br_danfe/danfe.rb +16 -16
  14. data/lib/br_danfe/danfe_lib/cep.rb +9 -0
  15. data/lib/br_danfe/danfe_lib/consts.rb +6 -0
  16. data/lib/br_danfe/danfe_lib/cst.rb +30 -0
  17. data/lib/br_danfe/danfe_lib/dest.rb +86 -0
  18. data/lib/br_danfe/danfe_lib/det_body.rb +75 -0
  19. data/lib/br_danfe/danfe_lib/det_header.rb +40 -0
  20. data/lib/br_danfe/danfe_lib/document.rb +135 -0
  21. data/lib/br_danfe/danfe_lib/dup.rb +52 -0
  22. data/lib/br_danfe/danfe_lib/emit.rb +23 -0
  23. data/lib/br_danfe/danfe_lib/emit_header.rb +82 -0
  24. data/lib/br_danfe/danfe_lib/helper.rb +64 -0
  25. data/lib/br_danfe/danfe_lib/icmstot.rb +33 -0
  26. data/lib/br_danfe/danfe_lib/infadic.rb +80 -0
  27. data/lib/br_danfe/danfe_lib/issqn.rb +24 -0
  28. data/lib/br_danfe/danfe_lib/options.rb +24 -0
  29. data/lib/br_danfe/danfe_lib/phone.rb +13 -0
  30. data/lib/br_danfe/danfe_lib/plate.rb +9 -0
  31. data/lib/br_danfe/danfe_lib/ticket.rb +17 -0
  32. data/lib/br_danfe/danfe_lib/transp.rb +51 -0
  33. data/lib/br_danfe/danfe_lib/vol.rb +41 -0
  34. data/lib/br_danfe/danfe_lib/xml.rb +38 -0
  35. data/lib/br_danfe/danfe_lib/xprod.rb +48 -0
  36. data/lib/br_danfe/version.rb +1 -1
  37. data/lib/br_danfe.rb +1 -1
  38. data/spec/features/cce_spec.rb +28 -0
  39. data/spec/features/danfe_spec.rb +3 -3
  40. data/spec/fixtures/cce/lib/barcode#render.pdf +511 -0
  41. data/spec/fixtures/cce/lib/correction#render.pdf +100 -0
  42. data/spec/fixtures/cce/lib/document#box.pdf +55 -0
  43. data/spec/fixtures/cce/lib/document#box.with.block.pdf +72 -0
  44. data/spec/fixtures/cce/lib/document#text.align.pdf +70 -0
  45. data/spec/fixtures/cce/lib/document#text.pad.pdf +70 -0
  46. data/spec/fixtures/cce/lib/document#text.simple.pdf +70 -0
  47. data/spec/fixtures/cce/lib/document#text.size.pdf +70 -0
  48. data/spec/fixtures/cce/lib/document#text.style.pdf +70 -0
  49. data/spec/fixtures/cce/lib/footer#render.pdf +114 -0
  50. data/spec/fixtures/cce/lib/header#render.pdf +72 -0
  51. data/spec/fixtures/cce/lib/nfe_key#render.pdf +88 -0
  52. data/spec/fixtures/cce/lib/protocol#render.pdf +88 -0
  53. data/spec/fixtures/cce/v1.00/cce.fixture.pdf +659 -0
  54. data/spec/fixtures/cce/v1.00/cce.xml +1 -0
  55. data/spec/fixtures/{lib → nfe/lib}/dest#render-v2.00.pdf +0 -0
  56. data/spec/fixtures/{lib → nfe/lib}/dest#render-v3.10.pdf +0 -0
  57. data/spec/fixtures/{lib → nfe/lib}/dest#render-with_cnpj.pdf +0 -0
  58. data/spec/fixtures/{lib → nfe/lib}/dest#render-with_cpf.pdf +0 -0
  59. data/spec/fixtures/{lib → nfe/lib}/dest#render-with_ie.pdf +0 -0
  60. data/spec/fixtures/{lib → nfe/lib}/det_body#render-csosn.pdf +0 -0
  61. data/spec/fixtures/{lib → nfe/lib}/det_body#render-cst.pdf +0 -0
  62. data/spec/fixtures/{lib → nfe/lib}/det_body#render-fci.pdf +0 -0
  63. data/spec/fixtures/{lib → nfe/lib}/det_body#render-icms_st.pdf +0 -0
  64. data/spec/fixtures/{lib → nfe/lib}/det_header#render.pdf +0 -0
  65. data/spec/fixtures/{lib → nfe/lib}/document#lcnpj-blank.pdf +0 -0
  66. data/spec/fixtures/{lib → nfe/lib}/document#lcnpj-invalid.pdf +0 -0
  67. data/spec/fixtures/{lib → nfe/lib}/document#lcnpj-valid.pdf +0 -0
  68. data/spec/fixtures/{lib → nfe/lib}/document#lie-blank.pdf +0 -0
  69. data/spec/fixtures/{lib → nfe/lib}/document#lie-invalid.pdf +0 -0
  70. data/spec/fixtures/{lib → nfe/lib}/document#lie-valid.pdf +0 -0
  71. data/spec/fixtures/{lib → nfe/lib}/dup#render.pdf +0 -0
  72. data/spec/fixtures/{lib → nfe/lib}/emit#render.pdf +0 -0
  73. data/spec/fixtures/{lib → nfe/lib}/emit_header#render-with_logo.pdf +0 -0
  74. data/spec/fixtures/{lib → nfe/lib}/emit_header#render-without_logo.pdf +0 -0
  75. data/spec/fixtures/{lib → nfe/lib}/icmstot#render.pdf +0 -0
  76. data/spec/fixtures/{lib → nfe/lib}/infadic#render-extra_volume.pdf +0 -0
  77. data/spec/fixtures/{lib → nfe/lib}/infadic#render.pdf +0 -0
  78. data/spec/fixtures/{lib → nfe/lib}/issqn#render.pdf +0 -0
  79. data/spec/fixtures/{lib → nfe/lib}/ticket#render.pdf +0 -0
  80. data/spec/fixtures/{lib → nfe/lib}/transp#render-modfrete_0.pdf +0 -0
  81. data/spec/fixtures/{lib → nfe/lib}/transp#render-modfrete_1.pdf +0 -0
  82. data/spec/fixtures/{lib → nfe/lib}/transp#render-modfrete_2.pdf +0 -0
  83. data/spec/fixtures/{lib → nfe/lib}/transp#render-modfrete_9.pdf +0 -0
  84. data/spec/fixtures/{lib → nfe/lib}/transp#render.pdf +0 -0
  85. data/spec/fixtures/{lib → nfe/lib}/vol#render-blank-boxes.pdf +0 -0
  86. data/spec/fixtures/{lib → nfe/lib}/vol#render.pdf +0 -0
  87. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_simples_nacional.xml +0 -0
  88. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_simples_nacional.xml.fixture.pdf +0 -0
  89. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_with_extra_volumes.xml +0 -0
  90. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_with_extra_volumes.xml.fixture.pdf +0 -0
  91. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_with_fci.xml +0 -0
  92. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_with_fci.xml.fixture.pdf +0 -0
  93. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_with_logo.xml +0 -0
  94. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_with_ns.xml +0 -0
  95. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_with_ns.xml.fixture.pdf +0 -0
  96. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_without_ns.xml +0 -0
  97. data/spec/fixtures/{v2.00 → nfe/v2.00}/nfe_without_ns.xml.fixture.pdf +0 -0
  98. data/spec/fixtures/{v3.10 → nfe/v3.10}/nfe_simples_nacional.xml +0 -0
  99. data/spec/fixtures/{v3.10 → nfe/v3.10}/nfe_simples_nacional.xml.fixture.pdf +0 -0
  100. data/spec/lib/cce_lib/barcode_spec.rb +26 -0
  101. data/spec/lib/cce_lib/correction_spec.rb +26 -0
  102. data/spec/lib/cce_lib/document_spec.rb +115 -0
  103. data/spec/lib/cce_lib/footer_spec.rb +25 -0
  104. data/spec/lib/cce_lib/header_spec.rb +25 -0
  105. data/spec/lib/cce_lib/nfe_key_spec.rb +26 -0
  106. data/spec/lib/cce_lib/protocol_spec.rb +26 -0
  107. data/spec/lib/{cep_spec.rb → danfe_lib/cep_spec.rb} +2 -2
  108. data/spec/lib/{cst_spec.rb → danfe_lib/cst_spec.rb} +3 -3
  109. data/spec/lib/{dest_spec.rb → danfe_lib/dest_spec.rb} +4 -4
  110. data/spec/lib/{det_body_spec.rb → danfe_lib/det_body_spec.rb} +4 -4
  111. data/spec/lib/{det_header_spec.rb → danfe_lib/det_header_spec.rb} +4 -4
  112. data/spec/lib/{document_spec.rb → danfe_lib/document_spec.rb} +3 -3
  113. data/spec/lib/{dup_spec.rb → danfe_lib/dup_spec.rb} +4 -4
  114. data/spec/lib/{emit_header_spec.rb → danfe_lib/emit_header_spec.rb} +4 -4
  115. data/spec/lib/{emit_spec.rb → danfe_lib/emit_spec.rb} +4 -4
  116. data/spec/lib/{helper_spec.rb → danfe_lib/helper_spec.rb} +11 -11
  117. data/spec/lib/{icmstot_spec.rb → danfe_lib/icmstot_spec.rb} +4 -4
  118. data/spec/lib/{infadic_spec.rb → danfe_lib/infadic_spec.rb} +4 -4
  119. data/spec/lib/{issqn_spec.rb → danfe_lib/issqn_spec.rb} +4 -4
  120. data/spec/lib/{options_spec.rb → danfe_lib/options_spec.rb} +3 -3
  121. data/spec/lib/{phone_spec.rb → danfe_lib/phone_spec.rb} +3 -3
  122. data/spec/lib/{plate_spec.rb → danfe_lib/plate_spec.rb} +2 -2
  123. data/spec/lib/{ticket_spec.rb → danfe_lib/ticket_spec.rb} +4 -4
  124. data/spec/lib/{transp_spec.rb → danfe_lib/transp_spec.rb} +4 -4
  125. data/spec/lib/{vol_spec.rb → danfe_lib/vol_spec.rb} +4 -4
  126. data/spec/lib/{xml_spec.rb → danfe_lib/xml_spec.rb} +2 -2
  127. data/spec/lib/{xprod_spec.rb → danfe_lib/xprod_spec.rb} +5 -5
  128. metadata +242 -174
  129. data/lib/br_danfe/cep.rb +0 -7
  130. data/lib/br_danfe/consts.rb +0 -4
  131. data/lib/br_danfe/cst.rb +0 -28
  132. data/lib/br_danfe/dest.rb +0 -84
  133. data/lib/br_danfe/det_body.rb +0 -73
  134. data/lib/br_danfe/det_header.rb +0 -38
  135. data/lib/br_danfe/document.rb +0 -133
  136. data/lib/br_danfe/dup.rb +0 -50
  137. data/lib/br_danfe/emit.rb +0 -21
  138. data/lib/br_danfe/emit_header.rb +0 -80
  139. data/lib/br_danfe/helper.rb +0 -62
  140. data/lib/br_danfe/icmstot.rb +0 -31
  141. data/lib/br_danfe/infadic.rb +0 -78
  142. data/lib/br_danfe/issqn.rb +0 -22
  143. data/lib/br_danfe/options.rb +0 -22
  144. data/lib/br_danfe/phone.rb +0 -11
  145. data/lib/br_danfe/plate.rb +0 -7
  146. data/lib/br_danfe/ticket.rb +0 -15
  147. data/lib/br_danfe/transp.rb +0 -49
  148. data/lib/br_danfe/vol.rb +0 -39
  149. data/lib/br_danfe/xml.rb +0 -36
  150. data/lib/br_danfe/xprod.rb +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ef778a09a4e83800cce83668b534ec0175a1a93
4
- data.tar.gz: 064e8583d023106ec7ee027f4b8ee3a723d6de3f
3
+ metadata.gz: 3aa10ea5b153e530d84292516071252c98e42cfb
4
+ data.tar.gz: 75b0d0bfbb184b14ae05423cb0b813290d6ff71e
5
5
  SHA512:
6
- metadata.gz: 4320de3465acd3d64ffe433aad431e5ebd7dc142a38235ba3610cc3cddb358cfd03885c5721eea9e4f32bc1535c58f543ade41569623d858da9f49f52fc02613
7
- data.tar.gz: 0b1694491477d599e375a46df0a581b64d358c0273ef4c265a5d87869f0258362ea73170e96c3d10b4864d5048a7379b1a13f7b302a05b02d11ec0f189244022
6
+ metadata.gz: 58441eae637e4f5f0116f4c570285ffdc48d812c95b3e0cfb55bb9dedb758795d7b87a89519e9a3273236053bc9605d50aa0e149249ce69d70bbf0b1110ef715
7
+ data.tar.gz: 79cc04952937048b9e5be375e42dc3093caef7cf5bd81af04851b38348e7027ab833c2310efa8b4fb0e4e94d832ca82a28dedf4e40e1f8fcadba0092e7261eb7
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Code Climate](https://codeclimate.com/github/asseinfo/br_danfe.png)](https://codeclimate.com/github/asseinfo/br_danfe) [![Build Status](https://travis-ci.org/asseinfo/br_danfe.png?branch=master)](https://travis-ci.org/asseinfo/br_danfe)
4
4
 
5
- This gem generates PDF files for Brazilian DANFE (_Documento Auxiliar da Nota Fiscal Eletrônica_) from a valid NF-e XML.
5
+ This gem generates PDF files for Brazilian DANFE (_Documento Auxiliar da Nota Fiscal Eletrônica_) from a valid NF-e XML. It also can generates PDF file for CC-e (_Carta de Correção Eletrônica_).
6
6
 
7
7
  [See an example here.](https://github.com/asseinfo/br_danfe/blob/master/spec/fixtures/v2.00/nfe_with_logo.xml.fixture.pdf?raw=true)
8
8
 
@@ -22,7 +22,8 @@ XML version | Supported?
22
22
 
23
23
  ## Usage
24
24
 
25
- ### Usage in Ruby
25
+ ### DANFE - _Documento Auxiliar da Nota Fiscal Eletrônica_
26
+ #### Usage in Ruby
26
27
 
27
28
  xml = File.read("nfe.xml")
28
29
 
@@ -30,7 +31,7 @@ XML version | Supported?
30
31
  danfe.options.logo_path = "logo.png"
31
32
  danfe.save_pdf("nfe.pdf")
32
33
 
33
- ### Usage in Rails Controller
34
+ #### Usage in Rails Controller
34
35
 
35
36
  class DanfeController < ApplicationController
36
37
  def new
@@ -43,6 +44,28 @@ XML version | Supported?
43
44
  end
44
45
  end
45
46
 
47
+ ### CC-e - _Carta de Correção Eletrônica_
48
+
49
+ #### Usage in Ruby
50
+
51
+ xml = File.read("cce.xml")
52
+
53
+ cce = BrDanfe::Cce.new(xml)
54
+ cce.save_pdf("nfe.pdf")
55
+
56
+ #### Usage in Rails Controller
57
+
58
+ class CCeController < ApplicationController
59
+ def new
60
+ invoice = Invoice.find(params[:id])
61
+ xml_as_string = invoice.generate_xml # your method that generates the CC-e's xml
62
+
63
+ cce = BrDanfe::Cce.new(xml_as_string)
64
+
65
+ send_data cce.render_pdf, filename: "cce.pdf", type: "application/pdf"
66
+ end
67
+ end
68
+
46
69
  ## I18n
47
70
 
48
71
  By default, your rails application must be configured to `pt-Br`.
data/br_danfe.gemspec CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency "i18n"
25
25
  spec.add_dependency "br_documents", ">= 0.0.8"
26
26
 
27
+ spec.add_development_dependency "byebug", "3.5.1"
27
28
  spec.add_development_dependency "rspec", ">= 3.0.0"
28
29
  spec.add_development_dependency "simplecov", ">= 0.9.0"
29
30
  spec.add_development_dependency "codeclimate-test-reporter"
@@ -1,4 +1,18 @@
1
1
  pt-BR:
2
+ cce:
3
+ title: "Carta de Correção Eletrônica - CCe"
4
+ protocol: "PROTOCOLO DE AUTORIZAÇÃO"
5
+ key: "CHAVE DE ACESSO"
6
+ legal_note: "A Carta de Correção é disciplinada pelo § 1o-A do art. 7o
7
+ do Convênio S/N, de 15 de dezembro de 1970 e pode ser
8
+ utilizada para regularização de erro ocorrido na emissão de
9
+ documento fiscal, desde que o erro não esteja relacionado com:\n
10
+ I. as variáveis que determinam o valor do imposto tais como:
11
+ base de cálculo, alíquota, diferença de preço, quantidade,
12
+ valor da operação ou da prestação;\n
13
+ II. a correção de dados cadastrais que implique mudança do
14
+ remetente ou do destinatário;\n
15
+ III. a data de emissão ou de saída."
2
16
  danfe:
3
17
  chNFe: "CHAVE DE ACESSO"
4
18
  infProt: "PROTOCOLO DE AUTORIZAÇÃO DE USO"
@@ -0,0 +1,28 @@
1
+ module BrDanfe
2
+ class Cce
3
+ def initialize(xml)
4
+ @xml = xml
5
+ @pdf = CceLib::Document.new
6
+ end
7
+
8
+ def save_pdf(filename)
9
+ generate
10
+ @pdf.render_file filename
11
+ end
12
+
13
+ def render_pdf
14
+ generate
15
+ @pdf.render
16
+ end
17
+
18
+ private
19
+ def generate
20
+ CceLib::Header.new(@pdf).render
21
+ CceLib::Barcode.new(@pdf, @xml).render
22
+ CceLib::NfeKey.new(@pdf, @xml).render
23
+ CceLib::Protocol.new(@pdf, @xml).render
24
+ CceLib::Correction.new(@pdf, @xml).render
25
+ CceLib::Footer.new(@pdf).render
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ module BrDanfe
2
+ module CceLib
3
+ class Barcode
4
+ def initialize(pdf, xml)
5
+ @pdf = pdf
6
+ @xml = Nokogiri::XML(xml)
7
+ end
8
+
9
+ def render
10
+ @pdf.box(height: 50) do
11
+ @pdf.move_down 40
12
+ barcode = Barby::Code128C.new(nfe_key)
13
+ barcode.annotate_pdf(@pdf, x: @pdf.cursor, y: @pdf.cursor, height: 40)
14
+ end
15
+ end
16
+
17
+ private
18
+ def nfe_key
19
+ node = @xml.css("procEventoNFe > evento > infEvento > chNFe")
20
+ return node ? node.text : ""
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ module BrDanfe
2
+ module CceLib
3
+ class Correction
4
+ def initialize(pdf, xml)
5
+ @pdf = pdf
6
+ @xml = Nokogiri::XML(xml)
7
+ end
8
+
9
+ def render
10
+ @pdf.box(height: 490) do
11
+ @pdf.text correction
12
+ end
13
+ end
14
+
15
+ private
16
+ def correction
17
+ node = @xml.css("procEventoNFe > evento > infEvento > detEvento > xCorrecao")
18
+ return node ? node.text : ""
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,44 @@
1
+ module BrDanfe
2
+ module CceLib
3
+ class Document
4
+ def initialize
5
+ @document = Prawn::Document.new(
6
+ page_size: "A4",
7
+ page_layout: :portrait,
8
+ left_margin: 30,
9
+ right_margin: 30,
10
+ top_margin: 30,
11
+ botton_margin: 30)
12
+
13
+ @document.font "Times-Roman"
14
+ @document.line_width = 0.3
15
+ end
16
+
17
+ def method_missing(method_name, *args, &block)
18
+ @document.send(method_name, *args, &block)
19
+ end
20
+
21
+ def box(height:, pad:5, &block)
22
+ bounding_box([0, cursor], width: page_width, height: height) do
23
+ pad(pad) { indent(pad) { yield if block_given? } }
24
+ stroke_bounds
25
+ end
26
+ end
27
+
28
+ def text(text, options = {})
29
+ pad = options.delete(:pad) || 0
30
+ options = { align: :left, size: 12, style: nil }.merge(options)
31
+
32
+ pad(pad) do
33
+ @document.text text, size: options[:size], style: options[:style],
34
+ align: options[:align]
35
+ end
36
+ end
37
+
38
+ private
39
+ def page_width
40
+ page.dimensions[2] - (page.margins[:left] + page.margins[:right])
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,15 @@
1
+ module BrDanfe
2
+ module CceLib
3
+ class Footer
4
+ def initialize(pdf)
5
+ @pdf = pdf
6
+ end
7
+
8
+ def render
9
+ @pdf.box(height: 110) do
10
+ @pdf.text I18n.t("cce.legal_note")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module BrDanfe
2
+ module CceLib
3
+ class Header
4
+ def initialize(pdf)
5
+ @pdf = pdf
6
+ end
7
+
8
+ def render
9
+ @pdf.box(height: 40) do
10
+ @pdf.text I18n.t("cce.title"), align: :center, size: 25, pad: 6
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module BrDanfe
2
+ module CceLib
3
+ class NfeKey
4
+ def initialize(pdf, xml)
5
+ @pdf = pdf
6
+ @xml = Nokogiri::XML(xml)
7
+ end
8
+
9
+ def render
10
+ @pdf.box(height: 36) do
11
+ @pdf.text I18n.t("cce.key"), size: 8, style: :bold
12
+ @pdf.text nfe_key, pad: 5
13
+ end
14
+ end
15
+
16
+ private
17
+ def nfe_key
18
+ node = @xml.css("procEventoNFe > evento > infEvento > chNFe")
19
+ return node ? node.text : ""
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module BrDanfe
2
+ module CceLib
3
+ class Protocol
4
+ def initialize(pdf, xml)
5
+ @pdf = pdf
6
+ @xml = Nokogiri::XML(xml)
7
+ end
8
+
9
+ def render
10
+ @pdf.box(height: 36) do
11
+ @pdf.text I18n.t("cce.protocol"), size: 8, style: :bold
12
+ @pdf.text protocol, pad: 5
13
+ end
14
+ end
15
+
16
+ private
17
+ def protocol
18
+ node = @xml.css("procEventoNFe > retEvento > infEvento > nProt")
19
+ return node ? node.text : ""
20
+ end
21
+ end
22
+ end
23
+ end
@@ -3,9 +3,9 @@ module BrDanfe
3
3
  attr_reader :options
4
4
 
5
5
  def initialize(xml)
6
- @xml = XML.new(xml)
7
- @pdf = Document.new
8
- @options = Options.new
6
+ @xml = DanfeLib::XML.new(xml)
7
+ @pdf = DanfeLib::Document.new
8
+ @options = DanfeLib::Options.new
9
9
 
10
10
  create_watermark
11
11
  end
@@ -37,11 +37,11 @@ module BrDanfe
37
37
  end
38
38
 
39
39
  def generate
40
- @pdf.stamp("has_no_fiscal_value") if Helper.has_no_fiscal_value?(@xml)
40
+ @pdf.stamp("has_no_fiscal_value") if DanfeLib::Helper.has_no_fiscal_value?(@xml)
41
41
 
42
42
  @pdf.repeat(:all) { repeat_on_each_page }
43
43
 
44
- DetBody.new(@pdf, @xml).render
44
+ DanfeLib::DetBody.new(@pdf, @xml).render
45
45
 
46
46
  @pdf.page_count.times do |i|
47
47
  @pdf.go_to_page(i + 1)
@@ -54,17 +54,17 @@ module BrDanfe
54
54
  end
55
55
 
56
56
  def repeat_on_each_page
57
- Ticket.new(@pdf, @xml).render
58
- EmitHeader.new(@pdf, @xml, @options.logo_path).render
59
- Emit.new(@pdf, @xml).render
60
- Dest.new(@pdf, @xml).render
61
- Dup.new(@pdf, @xml).render
62
- Icmstot.new(@pdf, @xml).render
63
- Transp.new(@pdf, @xml).render
64
- nVol = Vol.new(@pdf, @xml).render
65
- DetHeader.new(@pdf).render
66
- Issqn.new(@pdf, @xml).render
67
- Infadic.new(@pdf, @xml).render(nVol)
57
+ DanfeLib::Ticket.new(@pdf, @xml).render
58
+ DanfeLib::EmitHeader.new(@pdf, @xml, @options.logo_path).render
59
+ DanfeLib::Emit.new(@pdf, @xml).render
60
+ DanfeLib::Dest.new(@pdf, @xml).render
61
+ DanfeLib::Dup.new(@pdf, @xml).render
62
+ DanfeLib::Icmstot.new(@pdf, @xml).render
63
+ DanfeLib::Transp.new(@pdf, @xml).render
64
+ nVol = DanfeLib::Vol.new(@pdf, @xml).render
65
+ DanfeLib::DetHeader.new(@pdf).render
66
+ DanfeLib::Issqn.new(@pdf, @xml).render
67
+ DanfeLib::Infadic.new(@pdf, @xml).render(nVol)
68
68
  end
69
69
  end
70
70
  end
@@ -0,0 +1,9 @@
1
+ module BrDanfe
2
+ module DanfeLib
3
+ class Cep
4
+ def self.format(cep)
5
+ cep.sub(/(\d{2})(\d{3})(\d{3})/, "\\1.\\2-\\3")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ module BrDanfe
2
+ module DanfeLib
3
+ LINE_HEIGHT = 0.80
4
+ SPACE_BETWEEN_GROUPS = 0.52
5
+ end
6
+ end
@@ -0,0 +1,30 @@
1
+ module BrDanfe
2
+ module DanfeLib
3
+ class Cst
4
+ def self.to_danfe(xml)
5
+ value = origin(xml)
6
+
7
+ if csosn?(xml)
8
+ value += xml.css("ICMS/*/CSOSN").text
9
+ elsif cst?(xml)
10
+ value += xml.css("ICMS/*/CST").text
11
+ end
12
+
13
+ value
14
+ end
15
+
16
+ private
17
+ def self.origin(xml)
18
+ xml.css("ICMS/*/orig").text
19
+ end
20
+
21
+ def self.cst?(xml)
22
+ xml.css("ICMS/*/CST").text != ""
23
+ end
24
+
25
+ def self.csosn?(xml)
26
+ xml.css("ICMS/*/CSOSN").text != ""
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,86 @@
1
+ module BrDanfe
2
+ module DanfeLib
3
+ class Dest
4
+ Y = 8.58
5
+
6
+ def initialize(pdf, xml)
7
+ @pdf = pdf
8
+ @xml = xml
9
+
10
+ @ltitle = Y - 0.42
11
+ @l1 = Y
12
+ @l2 = Y + LINE_HEIGHT
13
+ @l3 = Y + (LINE_HEIGHT * 2)
14
+ end
15
+
16
+ def render
17
+ @pdf.ititle 0.42, 10.00, 0.25, @ltitle, "dest.title"
18
+
19
+ render_line1
20
+ render_line2
21
+ render_line3
22
+
23
+ render_dates_block
24
+ end
25
+
26
+ private
27
+ def render_line1
28
+ @pdf.lbox LINE_HEIGHT, 12.32, 0.25, @l1, @xml, "dest/xNome"
29
+ render_cnpj_cpf
30
+ end
31
+
32
+ def render_cnpj_cpf
33
+ if @xml["dest/CNPJ"] == ""
34
+ @pdf.i18n_lbox LINE_HEIGHT, 4.87, 12.57, @l1, "dest.CPF", cpf
35
+ else
36
+ @pdf.lcnpj LINE_HEIGHT, 4.87, 12.57, @l1, @xml, "dest/CNPJ"
37
+ end
38
+ end
39
+
40
+ def cpf
41
+ cpf = BrDocuments::CnpjCpf::Cpf.new(@xml["dest/CPF"])
42
+ cpf.formatted
43
+ end
44
+
45
+ def render_line2
46
+ @pdf.i18n_lbox LINE_HEIGHT, 10.16, 0.25, @l2, "enderDest.xLgr", street
47
+ @pdf.lbox LINE_HEIGHT, 4.83, 10.41, @l2, @xml, "enderDest/xBairro"
48
+ @pdf.i18n_lbox LINE_HEIGHT, 2.20, 15.24, @l2, "enderDest.CEP", cep
49
+ end
50
+
51
+ def street
52
+ @xml["enderDest/xLgr"] + " " + @xml["enderDest/nro"]
53
+ end
54
+
55
+ def cep
56
+ Cep.format(@xml["enderDest/CEP"])
57
+ end
58
+
59
+ def render_line3
60
+ @pdf.lbox LINE_HEIGHT, 7.11, 0.25, @l3, @xml, "enderDest/xMun"
61
+ @pdf.i18n_lbox LINE_HEIGHT, 4.06, 7.36, @l3, "enderDest.fone", phone
62
+ @pdf.lbox LINE_HEIGHT, 1.14, 11.42, @l3, @xml, "enderDest/UF"
63
+ @pdf.lie LINE_HEIGHT, 4.88, 12.56, @l3, @xml, "enderDest/UF", "dest/IE"
64
+ end
65
+
66
+ def render_dates_block
67
+ @pdf.ldate LINE_HEIGHT, 2.92, 17.90, @l1, "ide.dEmi", @xml["ide/dEmi"], { align: :right }
68
+
69
+ if @xml.version_310?
70
+ dSaiEnt = "ide/dhSaiEnt"
71
+ hSaiEnt = "ide/dhSaiEnt"
72
+ else
73
+ dSaiEnt = "ide/dSaiEnt"
74
+ hSaiEnt = "ide/hSaiEnt"
75
+ end
76
+
77
+ @pdf.ldate LINE_HEIGHT, 2.92, 17.90, @l2, "ide.dSaiEnt", @xml[dSaiEnt], { align: :right }
78
+ @pdf.ltime LINE_HEIGHT, 2.92, 17.90, @l3, "ide.hSaiEnt", @xml[hSaiEnt], { align: :right }
79
+ end
80
+
81
+ def phone
82
+ Phone.format(@xml["enderDest/fone"])
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,75 @@
1
+ module BrDanfe
2
+ module DanfeLib
3
+ class DetBody
4
+ def initialize(pdf, xml)
5
+ @pdf = pdf
6
+ @xml = xml
7
+ end
8
+
9
+ def render
10
+ options = {
11
+ column_widths: column_widths,
12
+ cell_style: { padding: 2, border_width: 0 }
13
+ }
14
+
15
+ @pdf.font_size(6) do
16
+ @pdf.bounding_box [0.25.cm, Helper.invert(18.17.cm)], width: 21.50.cm, height: 6.37.cm do
17
+ @pdf.table products, options do |table|
18
+ table.column(6..13).style(align: :right)
19
+ table.column(0..13).border_width = 0.3
20
+ table.column(0..13).border_lines = [:dotted]
21
+ table.column(0..13).borders = [:bottom]
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+ def products
29
+ @xml.collect("xmlns", "det") { |det| product(det) }
30
+ end
31
+
32
+ def product(det)
33
+ [
34
+ det.css("prod/cProd").text,
35
+ Xprod.new(det).render,
36
+ det.css("prod/NCM").text,
37
+ Cst.to_danfe(det),
38
+ det.css("prod/CFOP").text,
39
+ det.css("prod/uCom").text,
40
+ numerify(det, "prod/qCom"),
41
+ numerify(det, "prod/vUnCom"),
42
+ numerify(det, "prod/vProd"),
43
+ numerify(det, "ICMS/*/vBC"),
44
+ numerify(det, "ICMS/*/vICMS"),
45
+ numerify(det, "IPI/*/vIPI"),
46
+ numerify(det, "ICMS/*/pICMS"),
47
+ numerify(det, "IPI/*/pIPI")
48
+ ]
49
+ end
50
+
51
+ def numerify(det, xpath)
52
+ Helper.numerify(det.css("#{xpath}").text)
53
+ end
54
+
55
+ def column_widths
56
+ {
57
+ 0 => 2.00.cm,
58
+ 1 => 4.90.cm,
59
+ 2 => 1.30.cm,
60
+ 3 => 0.80.cm,
61
+ 4 => 1.00.cm,
62
+ 5 => 1.00.cm,
63
+ 6 => 1.30.cm,
64
+ 7 => 1.50.cm,
65
+ 8 => 1.50.cm,
66
+ 9 => 1.50.cm,
67
+ 10 => 1.00.cm,
68
+ 11 => 1.00.cm,
69
+ 12 => 0.90.cm,
70
+ 13 => 0.86.cm
71
+ }
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,40 @@
1
+ module BrDanfe
2
+ module DanfeLib
3
+ Y = 17.39 + SPACE_BETWEEN_GROUPS
4
+
5
+ class DetHeader
6
+ def initialize(pdf)
7
+ @pdf = pdf
8
+
9
+ @ltitle = Y - 0.42
10
+ @l1 = Y
11
+ end
12
+
13
+ def render
14
+ @pdf.ititle 0.42, 10.00, 0.25, @ltitle, "det.title"
15
+
16
+ column(2.00, 0.25, "prod.cProd")
17
+ column(4.90, 2.25, "prod.xProd")
18
+ column(1.30, 7.15, "prod.NCM")
19
+ column(0.80, 8.45, "ICMS.CST")
20
+ column(1.00, 9.25, "prod.CFOP")
21
+ column(1.00, 10.25, "prod.uCom")
22
+ column(1.30, 11.25, "prod.qCom")
23
+ column(1.50, 12.55, "prod.vUnCom")
24
+ column(1.50, 14.05, "prod.vProd")
25
+ column(1.50, 15.55, "ICMS.vBC")
26
+ column(1.00, 17.05, "ICMS.vICMS")
27
+ column(1.00, 18.05, "IPI.vIPI")
28
+ column(0.90, 19.05, "ICMS.pICMS")
29
+ column(0.86, 19.95, "IPI.pIPI")
30
+
31
+ @pdf.horizontal_line 0.25.cm, 20.81.cm, at: Helper.invert(18.17.cm)
32
+ end
33
+
34
+ private
35
+ def column(w, x, title)
36
+ @pdf.ibox 6.70, w, x, @l1, I18n.t("danfe.det.#{title}")
37
+ end
38
+ end
39
+ end
40
+ end