br_danfe 0.0.4 → 0.0.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.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/config/locales/pt-BR.yml +3 -3
- data/lib/br_danfe/danfe.rb +8 -4
- data/lib/br_danfe/dest.rb +32 -19
- data/lib/br_danfe/det_body.rb +10 -5
- data/lib/br_danfe/det_header.rb +8 -3
- data/lib/br_danfe/document.rb +16 -25
- data/lib/br_danfe/dup.rb +7 -3
- data/lib/br_danfe/emit.rb +11 -91
- data/lib/br_danfe/emit_header.rb +80 -0
- data/lib/br_danfe/helper.rb +1 -1
- data/lib/br_danfe/icmstot.rb +25 -13
- data/lib/br_danfe/infadic.rb +11 -6
- data/lib/br_danfe/issqn.rb +16 -6
- data/lib/br_danfe/transp.rb +23 -12
- data/lib/br_danfe/version.rb +1 -1
- data/lib/br_danfe/vol.rb +10 -6
- data/spec/fixtures/lib/dest#render-v2.00.pdf +271 -0
- data/spec/fixtures/lib/dest#render-v3.10.pdf +271 -0
- data/spec/fixtures/v2.00/nfe_simples_nacional.xml.fixture.pdf +475 -432
- data/spec/fixtures/v2.00/nfe_with_cpf.xml.fixture.pdf +473 -430
- data/spec/fixtures/v2.00/nfe_with_extra_volumes.xml.fixture.pdf +1019 -807
- data/spec/fixtures/v2.00/nfe_with_fci.xml.fixture.pdf +388 -373
- data/spec/fixtures/v2.00/nfe_with_logo.xml.fixture.pdf +487 -444
- data/spec/fixtures/v2.00/nfe_with_ns.xml.fixture.pdf +981 -769
- data/spec/fixtures/v2.00/nfe_without_ns.xml.fixture.pdf +461 -427
- data/spec/fixtures/v3.10/nfe_simples_nacional.xml.fixture.pdf +661 -548
- data/spec/lib/dest_spec.rb +2 -2
- data/spec/lib/helper_spec.rb +2 -2
- metadata +7 -4
- data/spec/fixtures/lib/dest.pdf +0 -279
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8820182a8bbc65175a5bcf053e329a3583edd374
|
4
|
+
data.tar.gz: e2248c10394096c63619505c8eacb2f65d4f3cef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38ba94bcf2d4b47664f3be6d5f0f00aa58b3c47b12cfb57a547a4e39bb36ca74555fc7bc0471bf5f4eba4e84d5590a836aa06cc1751a4f11f61137cdbbd4bf0a
|
7
|
+
data.tar.gz: 5e77bfccdf34f992a5e775269318cf40ad9c5e7c34578905b8f561cab9170586e248b5f8da89b713507dfafcdf06f02c0f9ec21677e258d45e4a2c20a7b67fb9
|
data/README.md
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
|
5
5
|
This gem generates PDF files for Brazilian DANFE (_Documento Auxiliar da Nota Fiscal Eletrônica_) from a valid NF-e XML.
|
6
6
|
|
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
|
+
|
7
9
|
This gem requires `ruby >= 1.9.x`.
|
8
10
|
|
9
11
|
## Supported NF-e versions
|
data/config/locales/pt-BR.yml
CHANGED
@@ -9,8 +9,8 @@ pt-BR:
|
|
9
9
|
sefaz: "Consulta de autenticidade no portal nacional da NF-e www.nfe.fazenda.gov.br/portal ou no site da Sefaz Autorizadora"
|
10
10
|
ide:
|
11
11
|
dEmi: "DATA DA EMISSÃO"
|
12
|
-
dSaiEnt: "DATA DA SAÍDA
|
13
|
-
hSaiEnt: "HORA DE SAÍDA"
|
12
|
+
dSaiEnt: "DATA DA ENTRADA/SAÍDA"
|
13
|
+
hSaiEnt: "HORA DE ENTRADA/SAÍDA"
|
14
14
|
tpNF:
|
15
15
|
entry: "ENTRADA"
|
16
16
|
departure: "SAÍDA"
|
@@ -119,7 +119,7 @@ pt-BR:
|
|
119
119
|
pesoB: "PESO B.:"
|
120
120
|
pesoL: "PESO LÍQ.:"
|
121
121
|
ticket:
|
122
|
-
xNome: "RECEBEMOS DE %{xNome} OS PRODUTOS CONSTANTES DA NOTA FISCAL INDICADA
|
122
|
+
xNome: "RECEBEMOS DE %{xNome} OS PRODUTOS/SERVIÇOS CONSTANTES DA NOTA FISCAL INDICADA AO LADO"
|
123
123
|
received_at: "DATA DE RECEBIMENTO"
|
124
124
|
receiver: "IDENTIFICAÇÃO E ASSINATURA DO RECEBEDOR"
|
125
125
|
document: "NF-e\nN°. %{nNF}\nSÉRIE %{serie}"
|
data/lib/br_danfe/danfe.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
module BrDanfe
|
2
|
+
LINE_HEIGHT = 0.80
|
3
|
+
SPACE_BETWEEN_GROUPS = 0.52
|
4
|
+
|
2
5
|
class Danfe
|
3
6
|
attr_reader :options
|
4
7
|
|
@@ -55,14 +58,15 @@ module BrDanfe
|
|
55
58
|
|
56
59
|
def repeat_on_each_page
|
57
60
|
Ticket.render(@pdf, @xml)
|
58
|
-
|
61
|
+
EmitHeader.new(@pdf, @xml, @options.logo_path).render
|
62
|
+
Emit.new(@pdf, @xml).render
|
59
63
|
Dest.new(@pdf, @xml).render
|
60
64
|
Dup.new(@pdf, @xml).render
|
61
|
-
Icmstot.
|
62
|
-
Transp.
|
65
|
+
Icmstot.new(@pdf, @xml).render
|
66
|
+
Transp.new(@pdf, @xml).render
|
63
67
|
nVol = Vol.new(@pdf, @xml).render
|
64
68
|
DetHeader.new(@pdf, @xml).render
|
65
|
-
Issqn.
|
69
|
+
Issqn.new(@pdf, @xml).render
|
66
70
|
Infadic.new(@pdf, @xml).render(nVol)
|
67
71
|
end
|
68
72
|
end
|
data/lib/br_danfe/dest.rb
CHANGED
@@ -1,30 +1,38 @@
|
|
1
1
|
module BrDanfe
|
2
2
|
class Dest
|
3
|
+
Y = 8.58
|
4
|
+
|
3
5
|
def initialize(pdf, xml)
|
4
6
|
@pdf = pdf
|
5
7
|
@xml = xml
|
8
|
+
|
9
|
+
@ltitle = Y - 0.42
|
10
|
+
@l1 = Y
|
11
|
+
@l2 = Y + LINE_HEIGHT
|
12
|
+
@l3 = Y + (LINE_HEIGHT * 2)
|
6
13
|
end
|
7
14
|
|
8
15
|
def render
|
9
|
-
@pdf.ititle 0.42, 10.00, 0.25,
|
16
|
+
@pdf.ititle 0.42, 10.00, 0.25, @ltitle, "dest.title"
|
10
17
|
|
11
18
|
render_line1
|
12
19
|
render_line2
|
13
20
|
render_line3
|
21
|
+
|
22
|
+
render_dates_block
|
14
23
|
end
|
15
24
|
|
16
25
|
private
|
17
26
|
def render_line1
|
18
|
-
@pdf.lbox
|
27
|
+
@pdf.lbox LINE_HEIGHT, 12.32, 0.25, @l1, @xml, "dest/xNome"
|
19
28
|
render_cnpj_cpf
|
20
|
-
@pdf.idate 0.85, 2.92, 17.90, 8.58, "ide.dEmi", @xml["ide/dEmi"], { align: :right }
|
21
29
|
end
|
22
30
|
|
23
31
|
def render_cnpj_cpf
|
24
32
|
if @xml["dest/CNPJ"] == ""
|
25
|
-
@pdf.ibox
|
33
|
+
@pdf.ibox LINE_HEIGHT, 4.87, 12.57, @l1, I18n.t("danfe.dest.CPF"), cpf
|
26
34
|
else
|
27
|
-
@pdf.ibox
|
35
|
+
@pdf.ibox LINE_HEIGHT, 4.87, 12.57, @l1, I18n.t("danfe.dest.CNPJ"), cnpj
|
28
36
|
end
|
29
37
|
end
|
30
38
|
|
@@ -39,14 +47,9 @@ module BrDanfe
|
|
39
47
|
end
|
40
48
|
|
41
49
|
def render_line2
|
42
|
-
@pdf.ibox
|
43
|
-
@pdf.lbox
|
44
|
-
@pdf.ibox
|
45
|
-
if @xml.version_310?
|
46
|
-
@pdf.idate 0.85, 2.92, 17.90, 9.43, "ide.dSaiEnt", @xml["ide/dhSaiEnt"], { align: :right }
|
47
|
-
else
|
48
|
-
@pdf.idate 0.85, 2.92, 17.90, 9.43, "ide.dSaiEnt", @xml["ide/dSaiEnt"], { align: :right }
|
49
|
-
end
|
50
|
+
@pdf.ibox LINE_HEIGHT, 10.16, 0.25, @l2, I18n.t("danfe.enderDest.xLgr"), street
|
51
|
+
@pdf.lbox LINE_HEIGHT, 4.83, 10.41, @l2, @xml, "enderDest/xBairro"
|
52
|
+
@pdf.ibox LINE_HEIGHT, 2.20, 15.24, @l2, I18n.t("danfe.enderDest.CEP"), cep
|
50
53
|
end
|
51
54
|
|
52
55
|
def street
|
@@ -58,15 +61,25 @@ module BrDanfe
|
|
58
61
|
end
|
59
62
|
|
60
63
|
def render_line3
|
61
|
-
@pdf.lbox
|
62
|
-
@pdf.ibox
|
63
|
-
@pdf.lbox
|
64
|
-
@pdf.ibox
|
64
|
+
@pdf.lbox LINE_HEIGHT, 7.11, 0.25, @l3, @xml, "enderDest/xMun"
|
65
|
+
@pdf.ibox LINE_HEIGHT, 4.06, 7.36, @l3, I18n.t("danfe.enderDest.fone"), phone
|
66
|
+
@pdf.lbox LINE_HEIGHT, 1.14, 11.42, @l3, @xml, "enderDest/UF"
|
67
|
+
@pdf.ibox LINE_HEIGHT, 4.88, 12.56, @l3, I18n.t("danfe.dest.IE"), ie
|
68
|
+
end
|
69
|
+
|
70
|
+
def render_dates_block
|
71
|
+
@pdf.ldate LINE_HEIGHT, 2.92, 17.90, @l1, "ide.dEmi", @xml["ide/dEmi"], { align: :right }
|
72
|
+
|
65
73
|
if @xml.version_310?
|
66
|
-
|
74
|
+
dSaiEnt = @xml["ide/dhSaiEnt"]
|
75
|
+
hSaiEnt = @xml["ide/dhSaiEnt"]
|
67
76
|
else
|
68
|
-
|
77
|
+
dSaiEnt = @xml["ide/dSaiEnt"]
|
78
|
+
hSaiEnt = @xml["ide/hSaiEnt"]
|
69
79
|
end
|
80
|
+
|
81
|
+
@pdf.ldate LINE_HEIGHT, 2.92, 17.90, @l2, "ide.dSaiEnt", dSaiEnt, { align: :right }
|
82
|
+
@pdf.ltime LINE_HEIGHT, 2.92, 17.90, @l3, "ide.hSaiEnt", hSaiEnt, { align: :right }
|
70
83
|
end
|
71
84
|
|
72
85
|
def phone
|
data/lib/br_danfe/det_body.rb
CHANGED
@@ -6,15 +6,20 @@ module BrDanfe
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def render
|
9
|
+
options = {
|
10
|
+
column_widths: column_widths,
|
11
|
+
cell_style: { padding: 2, border_width: 0 }
|
12
|
+
}
|
13
|
+
|
9
14
|
@pdf.font_size(6) do
|
10
|
-
@pdf.
|
11
|
-
products,
|
12
|
-
column_widths: column_widths,
|
13
|
-
cell_style: {padding: 2, border_width: 0} do |table|
|
15
|
+
@pdf.bounding_box [0.25.cm, Helper.invert(18.17.cm)], width: 21.50.cm, height: 6.37.cm do
|
16
|
+
@pdf.table products, options do |table|
|
14
17
|
table.column(6..13).style(align: :right)
|
15
|
-
table.column(0..13).border_width =
|
18
|
+
table.column(0..13).border_width = 0.3
|
19
|
+
table.column(0..13).border_lines = [:dotted]
|
16
20
|
table.column(0..13).borders = [:bottom]
|
17
21
|
end
|
22
|
+
end
|
18
23
|
end
|
19
24
|
end
|
20
25
|
|
data/lib/br_danfe/det_header.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
module BrDanfe
|
2
|
+
Y = 17.39 + SPACE_BETWEEN_GROUPS
|
3
|
+
|
2
4
|
class DetHeader
|
3
5
|
def initialize(pdf, xml)
|
4
6
|
@pdf = pdf
|
5
7
|
@xml = xml
|
8
|
+
|
9
|
+
@ltitle = Y - 0.42
|
10
|
+
@l1 = Y
|
6
11
|
end
|
7
12
|
|
8
13
|
def render
|
9
|
-
@pdf.ititle 0.42, 10.00, 0.25,
|
14
|
+
@pdf.ititle 0.42, 10.00, 0.25, @ltitle, "det.title"
|
10
15
|
|
11
16
|
column(2.00, 0.25, "prod.cProd")
|
12
17
|
column(4.90, 2.25, "prod.xProd")
|
@@ -23,12 +28,12 @@ module BrDanfe
|
|
23
28
|
column(0.90, 19.05, "ICMS.pICMS")
|
24
29
|
column(0.86, 19.95, "IPI.pIPI")
|
25
30
|
|
26
|
-
@pdf.horizontal_line 0.25.cm, 20.
|
31
|
+
@pdf.horizontal_line 0.25.cm, 20.81.cm, at: Helper.invert(18.17.cm)
|
27
32
|
end
|
28
33
|
|
29
34
|
private
|
30
35
|
def column(w, x, title)
|
31
|
-
@pdf.ibox 6.70, w, x,
|
36
|
+
@pdf.ibox 6.70, w, x, @l1, I18n.t("danfe.det.#{title}")
|
32
37
|
end
|
33
38
|
end
|
34
39
|
end
|
data/lib/br_danfe/document.rb
CHANGED
@@ -7,10 +7,10 @@ module BrDanfe
|
|
7
7
|
left_margin: 0,
|
8
8
|
right_margin: 0,
|
9
9
|
top_margin: 0,
|
10
|
-
botton_margin: 0
|
11
|
-
)
|
10
|
+
botton_margin: 0)
|
12
11
|
|
13
12
|
@document.font "Times-Roman"
|
13
|
+
@document.line_width = 0.3
|
14
14
|
end
|
15
15
|
|
16
16
|
def method_missing(method_name, *args, &block)
|
@@ -21,7 +21,7 @@ module BrDanfe
|
|
21
21
|
title = ""
|
22
22
|
title = I18n.t("danfe.#{i18n}") if i18n != ""
|
23
23
|
|
24
|
-
self.text_box title, size:
|
24
|
+
self.text_box title, size: 8, at: [x.cm, Helper.invert(y.cm) - 4], width: w.cm, height: h.cm, style: :bold
|
25
25
|
end
|
26
26
|
|
27
27
|
def ibarcode(h, w, x, y, info)
|
@@ -40,22 +40,14 @@ module BrDanfe
|
|
40
40
|
ibox(h, w, x, y, label, data, options)
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
43
|
+
def ldate(h, w, x, y, i18n = "", info = "", options = {})
|
44
44
|
data = BrDanfe::Helper::format_date(info)
|
45
|
-
|
46
|
-
label = ""
|
47
|
-
label = I18n.t("danfe.#{i18n}") if i18n != ""
|
48
|
-
|
49
|
-
ibox h, w, x, y, label, data, options
|
45
|
+
i18n_lbox(h, w, x, y, i18n, data, options)
|
50
46
|
end
|
51
47
|
|
52
|
-
def
|
48
|
+
def ltime(h, w, x, y, i18n = "", info = "", options = {})
|
53
49
|
data = BrDanfe::Helper::format_time(info)
|
54
|
-
|
55
|
-
label = ""
|
56
|
-
label = I18n.t("danfe.#{i18n}") if i18n != ""
|
57
|
-
|
58
|
-
ibox h, w, x, y, label, data, options
|
50
|
+
i18n_lbox(h, w, x, y, i18n, data, options)
|
59
51
|
end
|
60
52
|
|
61
53
|
def lnumeric(h, w, x, y, xml, xpath, options = {})
|
@@ -72,14 +64,6 @@ module BrDanfe
|
|
72
64
|
numeric [x.cm, Helper.invert(y.cm)], w.cm, h.cm, label, data, options
|
73
65
|
end
|
74
66
|
|
75
|
-
def itable(h, w, x, y, data, options = {}, &block)
|
76
|
-
self.bounding_box [x.cm, Helper.invert(y.cm)], width: w.cm, height: h.cm do
|
77
|
-
self.table data, options do |table|
|
78
|
-
yield(table)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
67
|
private
|
84
68
|
def numeric(at, w, h, title = "", info = "", options = {})
|
85
69
|
options = {
|
@@ -90,6 +74,13 @@ module BrDanfe
|
|
90
74
|
box at, w, h, title, info, options.merge({align: :right})
|
91
75
|
end
|
92
76
|
|
77
|
+
def i18n_lbox(h, w, x, y, i18n = "", info = "", options = {})
|
78
|
+
label = ""
|
79
|
+
label = I18n.t("danfe.#{i18n}") if i18n != ""
|
80
|
+
|
81
|
+
ibox h, w, x, y, label, info, options
|
82
|
+
end
|
83
|
+
|
93
84
|
def box(at, w, h, title = "", info = "", options = {})
|
94
85
|
options = {
|
95
86
|
align: :left,
|
@@ -106,10 +97,10 @@ module BrDanfe
|
|
106
97
|
if title != ""
|
107
98
|
title_coord = Array.new(at)
|
108
99
|
title_coord[1] -= 2
|
109
|
-
self.text_box title, size: 6,
|
100
|
+
self.text_box title, size: 6, at: title_coord, width: w - 4, height: 8
|
110
101
|
end
|
111
102
|
|
112
|
-
title_adjustment = title == "" ? 4 :
|
103
|
+
title_adjustment = title == "" ? 4 : 13
|
113
104
|
at[1] -= title_adjustment
|
114
105
|
self.text_box info, size: options[:size], at: at, width: w - 4, height: h - title_adjustment, align: options[:align], style: options[:style], valign: options[:valign]
|
115
106
|
end
|
data/lib/br_danfe/dup.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
module BrDanfe
|
2
2
|
class Dup
|
3
|
+
Y = 11.50
|
4
|
+
|
3
5
|
def initialize(pdf, xml)
|
4
6
|
@pdf = pdf
|
5
7
|
@xml = xml
|
8
|
+
|
9
|
+
@ltitle = Y - 0.42
|
6
10
|
end
|
7
11
|
|
8
12
|
def render
|
9
|
-
@pdf.ititle 0.42, 10.00, 0.25,
|
10
|
-
@pdf.ibox 0.85, 20.57, 0.25,
|
13
|
+
@pdf.ititle 0.42, 10.00, 0.25, @ltitle, "dup.title"
|
14
|
+
@pdf.ibox 0.85, 20.57, 0.25, Y
|
11
15
|
|
12
16
|
x = 0.25
|
13
|
-
y =
|
17
|
+
y = Y
|
14
18
|
@xml.collect("xmlns", "dup") do |det|
|
15
19
|
render_dup(det, x, y)
|
16
20
|
x += 2.30
|
data/lib/br_danfe/emit.rb
CHANGED
@@ -1,111 +1,31 @@
|
|
1
1
|
module BrDanfe
|
2
2
|
class Emit
|
3
|
-
|
3
|
+
Y = 6.46
|
4
|
+
L1 = Y
|
5
|
+
L2 = Y + LINE_HEIGHT
|
6
|
+
|
7
|
+
def initialize(pdf, xml)
|
4
8
|
@pdf = pdf
|
5
9
|
@xml = xml
|
6
|
-
@logo_path = logo_path
|
7
10
|
end
|
8
11
|
|
9
12
|
def render
|
10
|
-
|
11
|
-
|
12
|
-
access_key_box
|
13
|
-
sefaz_box
|
14
|
-
operationkind_box
|
15
|
-
protocol_box
|
16
|
-
ie_box
|
17
|
-
ie_st_box
|
18
|
-
cnpj_box
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
def address_box
|
23
|
-
@pdf.ibox 3.92, 8.46, 0.25, 2.54
|
24
|
-
|
25
|
-
@pdf.ibox 3.92, 8.46, 0.25, 2.80, "", @xml["emit/xNome"],
|
26
|
-
{ size: 12, align: :center, border: 0, style: :bold }
|
27
|
-
|
28
|
-
if @logo_path.empty?
|
29
|
-
@pdf.ibox 3.92, 8.46, 0.75, 4, "", address, { align: :left, border: 0 }
|
30
|
-
else
|
31
|
-
@pdf.ibox 3.92, 8.46, 2.75, 4, "", address,
|
32
|
-
{ size: 8, align: :left, border: 0 }
|
33
|
-
|
34
|
-
@pdf.image @logo_path, at: [0.5.cm, Helper.invert(4.cm)],
|
35
|
-
width: 2.cm
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def address
|
40
|
-
formatted = @xml["enderEmit/xLgr"] + ", " + @xml["enderEmit/nro"] + "\n"
|
41
|
-
formatted += @xml["enderEmit/xBairro"] + " - " + cep + "\n"
|
42
|
-
formatted += @xml["enderEmit/xMun"] + "/" + @xml["enderEmit/UF"] + "\n"
|
43
|
-
formatted += phone + " " + @xml["enderEmit/email"]
|
44
|
-
|
45
|
-
formatted
|
46
|
-
end
|
47
|
-
|
48
|
-
def phone
|
49
|
-
Phone.format(@xml["enderEmit/fone"])
|
50
|
-
end
|
51
|
-
|
52
|
-
def cep
|
53
|
-
Cep.format(@xml["enderEmit/CEP"])
|
54
|
-
end
|
55
|
-
|
56
|
-
def danfe_box
|
57
|
-
@pdf.ibox 3.92, 2.08, 8.71, 2.54
|
58
|
-
|
59
|
-
@pdf.ibox 0.60, 2.08, 8.71, 2.54, "", "DANFE",
|
60
|
-
{ size: 12, align: :center, border: 0, style: :bold }
|
61
|
-
|
62
|
-
@pdf.ibox 1.20, 2.08, 8.71, 3.14, "", I18n.t("danfe.others.danfe"),
|
63
|
-
{ size: 8, align: :center, border: 0 }
|
64
|
-
|
65
|
-
@pdf.ibox 0.60, 2.08, 8.71, 4.34, "", "#{@xml['ide/tpNF']} - " + (@xml["ide/tpNF"] == "0" ? I18n.t("danfe.ide.tpNF.entry") : I18n.t("danfe.ide.tpNF.departure")),
|
66
|
-
{ size: 8, align: :center, border: 0 }
|
67
|
-
|
68
|
-
@pdf.ibox 1.00, 2.08, 8.71, 4.94, "",
|
69
|
-
I18n.t("danfe.ide.document", nNF: @xml["ide/nNF"], serie: @xml["ide/serie"]),
|
70
|
-
{ size: 8, align: :center, valign: :center, border: 0, style: :bold }
|
71
|
-
end
|
72
|
-
|
73
|
-
def access_key_box
|
74
|
-
@pdf.ibox 2.20, 10.02, 10.79, 2.54
|
75
|
-
@pdf.ibarcode 1.50, 8.00, 10.9010, 4.44, @xml["chNFe"]
|
76
|
-
@pdf.ibox 0.85, 10.02, 10.79, 4.74, I18n.t("danfe.chNFe"), @xml["chNFe"].gsub(/(\d)(?=(\d\d\d\d)+(?!\d))/, "\\1 "),
|
77
|
-
{ style: :bold, align: :center }
|
78
|
-
end
|
79
|
-
|
80
|
-
def sefaz_box
|
81
|
-
@pdf.ibox 0.85, 10.02, 10.79, 5.60 , "", I18n.t("danfe.others.sefaz"),
|
82
|
-
{ align: :center, size: 8 }
|
83
|
-
end
|
84
|
-
|
85
|
-
def operationkind_box
|
86
|
-
@pdf.lbox 0.85, 10.54, 0.25, 6.46, @xml, "ide/natOp"
|
87
|
-
end
|
88
|
-
|
89
|
-
def protocol_box
|
90
|
-
@pdf.ibox 0.85, 10.02, 10.79, 6.46, I18n.t("danfe.infProt"), @xml["infProt/nProt"] + " " + Helper.format_datetime(@xml["infProt/dhRecbto"]), { align: :center }
|
91
|
-
end
|
92
|
-
|
93
|
-
def ie_box
|
13
|
+
@pdf.lbox LINE_HEIGHT, 10.54, 0.25, L1, @xml, "ide/natOp"
|
14
|
+
@pdf.ibox LINE_HEIGHT, 10.02, 10.79, L1, I18n.t("danfe.infProt"), @xml["infProt/nProt"] + " " + Helper.format_datetime(@xml["infProt/dhRecbto"]), { align: :center }
|
94
15
|
ie(0.25, "IE")
|
95
|
-
end
|
96
|
-
|
97
|
-
def ie_st_box
|
98
16
|
ie(7.11, "IE_ST")
|
17
|
+
cnpj_box
|
99
18
|
end
|
100
19
|
|
20
|
+
private
|
101
21
|
def ie(x, field)
|
102
22
|
ie = BrDocuments::IE::Factory.create(@xml["enderEmit/UF"], @xml["emit/#{field}"])
|
103
|
-
@pdf.ibox
|
23
|
+
@pdf.ibox LINE_HEIGHT, 6.86, x, L2, I18n.t("danfe.emit.#{field}"), ie.formatted
|
104
24
|
end
|
105
25
|
|
106
26
|
def cnpj_box
|
107
27
|
cnpj = BrDocuments::CnpjCpf::Cnpj.new(@xml["emit/CNPJ"])
|
108
|
-
@pdf.ibox
|
28
|
+
@pdf.ibox LINE_HEIGHT, 6.84, 13.97, L2, I18n.t("danfe.emit.CNPJ"), cnpj.formatted
|
109
29
|
end
|
110
30
|
end
|
111
31
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module BrDanfe
|
2
|
+
class EmitHeader
|
3
|
+
def initialize(pdf, xml, logo_path)
|
4
|
+
@pdf = pdf
|
5
|
+
@xml = xml
|
6
|
+
@logo_path = logo_path
|
7
|
+
end
|
8
|
+
|
9
|
+
def render
|
10
|
+
address_box
|
11
|
+
danfe_box
|
12
|
+
access_key_box
|
13
|
+
sefaz_box
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def address_box
|
18
|
+
@pdf.ibox 3.92, 8.46, 0.25, 2.54
|
19
|
+
|
20
|
+
@pdf.ibox 3.92, 8.46, 0.25, 2.80, "", @xml["emit/xNome"],
|
21
|
+
{ size: 12, align: :center, border: 0, style: :bold }
|
22
|
+
|
23
|
+
if @logo_path.empty?
|
24
|
+
@pdf.ibox 3.92, 8.46, 0.75, 4, "", address, { align: :left, border: 0 }
|
25
|
+
else
|
26
|
+
@pdf.ibox 3.92, 8.46, 2.75, 4, "", address,
|
27
|
+
{ size: 8, align: :left, border: 0 }
|
28
|
+
|
29
|
+
@pdf.image @logo_path, at: [0.5.cm, Helper.invert(4.cm)],
|
30
|
+
width: 2.cm
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def address
|
35
|
+
formatted = @xml["enderEmit/xLgr"] + ", " + @xml["enderEmit/nro"] + "\n"
|
36
|
+
formatted += @xml["enderEmit/xBairro"] + " - " + cep + "\n"
|
37
|
+
formatted += @xml["enderEmit/xMun"] + "/" + @xml["enderEmit/UF"] + "\n"
|
38
|
+
formatted += phone + " " + @xml["enderEmit/email"]
|
39
|
+
|
40
|
+
formatted
|
41
|
+
end
|
42
|
+
|
43
|
+
def phone
|
44
|
+
Phone.format(@xml["enderEmit/fone"])
|
45
|
+
end
|
46
|
+
|
47
|
+
def cep
|
48
|
+
Cep.format(@xml["enderEmit/CEP"])
|
49
|
+
end
|
50
|
+
|
51
|
+
def danfe_box
|
52
|
+
@pdf.ibox 3.92, 2.08, 8.71, 2.54
|
53
|
+
|
54
|
+
@pdf.ibox 0.60, 2.08, 8.71, 2.54, "", "DANFE",
|
55
|
+
{ size: 12, align: :center, border: 0, style: :bold }
|
56
|
+
|
57
|
+
@pdf.ibox 1.20, 2.08, 8.71, 3.14, "", I18n.t("danfe.others.danfe"),
|
58
|
+
{ size: 8, align: :center, border: 0 }
|
59
|
+
|
60
|
+
@pdf.ibox 0.60, 2.08, 8.71, 4.34, "", "#{@xml['ide/tpNF']} - " + (@xml["ide/tpNF"] == "0" ? I18n.t("danfe.ide.tpNF.entry") : I18n.t("danfe.ide.tpNF.departure")),
|
61
|
+
{ size: 8, align: :center, border: 0 }
|
62
|
+
|
63
|
+
@pdf.ibox 1.00, 2.08, 8.71, 4.94, "",
|
64
|
+
I18n.t("danfe.ide.document", nNF: @xml["ide/nNF"], serie: @xml["ide/serie"]),
|
65
|
+
{ size: 8, align: :center, valign: :center, border: 0, style: :bold }
|
66
|
+
end
|
67
|
+
|
68
|
+
def access_key_box
|
69
|
+
@pdf.ibox 2.22, 10.02, 10.79, 2.54
|
70
|
+
@pdf.ibarcode 1.50, 8.00, 10.9010, 4.44, @xml["chNFe"]
|
71
|
+
@pdf.ibox 0.85, 10.02, 10.79, 4.76, I18n.t("danfe.chNFe"), @xml["chNFe"].gsub(/(\d)(?=(\d\d\d\d)+(?!\d))/, "\\1 "),
|
72
|
+
{ style: :bold, align: :center }
|
73
|
+
end
|
74
|
+
|
75
|
+
def sefaz_box
|
76
|
+
@pdf.ibox 0.85, 10.02, 10.79, 5.61, "", I18n.t("danfe.others.sefaz"),
|
77
|
+
{ align: :center, size: 8 }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/br_danfe/helper.rb
CHANGED
data/lib/br_danfe/icmstot.rb
CHANGED
@@ -1,19 +1,31 @@
|
|
1
1
|
module BrDanfe
|
2
2
|
class Icmstot
|
3
|
-
|
4
|
-
pdf.ititle 0.42, 5.60, 0.25, 12.36, "ICMSTot.title"
|
3
|
+
Y = 12.35 + SPACE_BETWEEN_GROUPS
|
5
4
|
|
6
|
-
|
7
|
-
pdf
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
pdf.
|
5
|
+
def initialize(pdf, xml)
|
6
|
+
@pdf = pdf
|
7
|
+
@xml = xml
|
8
|
+
|
9
|
+
@ltitle = Y - 0.42
|
10
|
+
@l1 = Y
|
11
|
+
@l2 = Y + LINE_HEIGHT
|
12
|
+
end
|
13
|
+
|
14
|
+
def render
|
15
|
+
@pdf.ititle 0.42, 5.60, 0.25, @ltitle, "ICMSTot.title"
|
16
|
+
|
17
|
+
@pdf.lnumeric LINE_HEIGHT, 4.06, 0.25, @l1, @xml, "ICMSTot/vBC"
|
18
|
+
@pdf.lnumeric LINE_HEIGHT, 4.06, 4.31, @l1, @xml, "ICMSTot/vICMS"
|
19
|
+
@pdf.lnumeric LINE_HEIGHT, 4.06, 8.37, @l1, @xml, "ICMSTot/vBCST"
|
20
|
+
@pdf.lnumeric LINE_HEIGHT, 4.06, 12.43, @l1, @xml, "ICMSTot/vST"
|
21
|
+
@pdf.lnumeric LINE_HEIGHT, 4.32, 16.49, @l1, @xml, "ICMSTot/vProd"
|
22
|
+
|
23
|
+
@pdf.lnumeric LINE_HEIGHT, 3.05, 0.25, @l2, @xml, "ICMSTot/vFrete"
|
24
|
+
@pdf.lnumeric LINE_HEIGHT, 3.05, 3.30, @l2, @xml, "ICMSTot/vSeg"
|
25
|
+
@pdf.lnumeric LINE_HEIGHT, 3.04, 6.35, @l2, @xml, "ICMSTot/vDesc"
|
26
|
+
@pdf.lnumeric LINE_HEIGHT, 3.04, 9.39, @l2, @xml, "ICMSTot/vOutro"
|
27
|
+
@pdf.lnumeric LINE_HEIGHT, 4.06, 12.43, @l2, @xml, "ICMSTot/vIPI"
|
28
|
+
@pdf.lnumeric LINE_HEIGHT, 4.32, 16.49, @l2, @xml, "ICMSTot/vNF", style: :bold
|
17
29
|
end
|
18
30
|
end
|
19
31
|
end
|
data/lib/br_danfe/infadic.rb
CHANGED
@@ -1,29 +1,34 @@
|
|
1
1
|
module BrDanfe
|
2
2
|
class Infadic
|
3
|
+
Y = 25.92 + SPACE_BETWEEN_GROUPS
|
4
|
+
|
3
5
|
def initialize(pdf, xml)
|
4
6
|
@pdf = pdf
|
5
7
|
@xml = xml
|
8
|
+
|
9
|
+
@ltitle = Y - 0.41
|
10
|
+
@l1 = Y
|
6
11
|
end
|
7
12
|
|
8
13
|
def render(nVol)
|
9
|
-
@pdf.ititle 0.42, 10.00, 0.25,
|
14
|
+
@pdf.ititle 0.42, 10.00, 0.25, @ltitle, "infAdic.title"
|
10
15
|
|
11
16
|
if nVol > 1
|
12
17
|
render_extra_volumes
|
13
18
|
else
|
14
|
-
@pdf.ibox 3.07, 12.93, 0.25,
|
19
|
+
@pdf.ibox 3.07, 12.93, 0.25, @l1, I18n.t("danfe.infAdic.infCpl"), @xml["infAdic/infCpl"], { size: 6, valign: :top }
|
15
20
|
end
|
16
21
|
|
17
|
-
@pdf.ibox 3.07, 7.62, 13.
|
22
|
+
@pdf.ibox 3.07, 7.62, 13.19, @l1, I18n.t("danfe.infAdic.reserved")
|
18
23
|
end
|
19
24
|
|
20
25
|
private
|
21
26
|
def render_extra_volumes
|
22
|
-
@pdf.ibox 3.07, 12.93, 0.25,
|
23
|
-
@pdf.ibox 3.07, 12.93, 0.25,
|
27
|
+
@pdf.ibox 3.07, 12.93, 0.25, @l1, I18n.t("danfe.infAdic.infCpl"), "", { size: 8, valign: :top }
|
28
|
+
@pdf.ibox 3.07, 12.93, 0.25, Y + 0.27, "", I18n.t("danfe.infAdic.vol.title"), { size: 5, valign: :top, border: 0 }
|
24
29
|
|
25
30
|
volumes = 0
|
26
|
-
y =
|
31
|
+
y = Y + 0.34
|
27
32
|
@xml.collect("xmlns", "vol") do |det|
|
28
33
|
volumes += 1
|
29
34
|
if volumes > 1
|
data/lib/br_danfe/issqn.rb
CHANGED
@@ -1,12 +1,22 @@
|
|
1
1
|
module BrDanfe
|
2
2
|
class Issqn
|
3
|
-
|
4
|
-
pdf.ititle 0.42, 10.00, 0.25, 24.64, "issqn.title"
|
3
|
+
Y = 24.60 + SPACE_BETWEEN_GROUPS
|
5
4
|
|
6
|
-
|
7
|
-
pdf
|
8
|
-
|
9
|
-
|
5
|
+
def initialize(pdf, xml)
|
6
|
+
@pdf = pdf
|
7
|
+
@xml = xml
|
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, "issqn.title"
|
15
|
+
|
16
|
+
@pdf.lbox LINE_HEIGHT, 5.14, 0.25, @l1, @xml, "emit/IM"
|
17
|
+
@pdf.lbox LINE_HEIGHT, 5.14, 5.39, @l1, @xml, "total/vServ"
|
18
|
+
@pdf.lbox LINE_HEIGHT, 5.14, 10.53, @l1, @xml, "total/vBCISS"
|
19
|
+
@pdf.lbox LINE_HEIGHT, 5.14, 15.67, @l1, @xml, "total/ISSTot"
|
10
20
|
end
|
11
21
|
end
|
12
22
|
end
|