br_danfe 0.0.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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