br_invoices_pdf 0.2.6.alpha.18 → 0.2.6.alpha.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +17 -0
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +1 -0
- data/Gemfile +2 -0
- data/Rakefile +2 -0
- data/bin/console +1 -0
- data/br_invoices_pdf.gemspec +1 -0
- data/lib/br_invoices_pdf/cfe/parser/access_key.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser/cnpj.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser/company_attributes.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser/cpf.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser/document_number.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser/fisco_obs.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser/payment.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser/payments.rb +6 -16
- data/lib/br_invoices_pdf/cfe/parser/products_data.rb +4 -2
- data/lib/br_invoices_pdf/cfe/parser/sat.rb +3 -1
- data/lib/br_invoices_pdf/cfe/parser.rb +5 -3
- data/lib/br_invoices_pdf/cfe/renderer/base_renderer.rb +5 -62
- data/lib/br_invoices_pdf/cfe/renderer/company_identification.rb +3 -0
- data/lib/br_invoices_pdf/cfe/renderer/fisco_info.rb +3 -0
- data/lib/br_invoices_pdf/cfe/renderer/header.rb +3 -0
- data/lib/br_invoices_pdf/cfe/renderer/payment_forms.rb +6 -12
- data/lib/br_invoices_pdf/cfe/renderer/product_table.rb +4 -48
- data/lib/br_invoices_pdf/cfe/renderer/qr_code.rb +5 -9
- data/lib/br_invoices_pdf/cfe/renderer/taxes_info.rb +5 -2
- data/lib/br_invoices_pdf/cfe/renderer/totals.rb +3 -24
- data/lib/br_invoices_pdf/cfe/renderer.rb +4 -18
- data/lib/br_invoices_pdf/cfe.rb +2 -1
- data/lib/br_invoices_pdf/errors/invalid_document_type.rb +2 -0
- data/lib/br_invoices_pdf/generator.rb +2 -0
- data/lib/br_invoices_pdf/nfce/parser/additional_info.rb +17 -0
- data/lib/br_invoices_pdf/nfce/parser/company.rb +25 -0
- data/lib/br_invoices_pdf/nfce/parser/customer.rb +32 -0
- data/lib/br_invoices_pdf/nfce/parser/emission_details.rb +51 -0
- data/lib/br_invoices_pdf/nfce/parser/payments.rb +30 -0
- data/lib/br_invoices_pdf/nfce/parser/products.rb +39 -0
- data/lib/br_invoices_pdf/nfce/parser/totals.rb +25 -0
- data/lib/br_invoices_pdf/nfce/parser.rb +33 -0
- data/lib/br_invoices_pdf/nfce/renderer/base_renderer.rb +22 -0
- data/lib/br_invoices_pdf/nfce/renderer/company_identification.rb +37 -0
- data/lib/br_invoices_pdf/nfce/renderer/customer_identification.rb +47 -0
- data/lib/br_invoices_pdf/nfce/renderer/fiscal_message.rb +46 -0
- data/lib/br_invoices_pdf/nfce/renderer/header.rb +32 -0
- data/lib/br_invoices_pdf/nfce/renderer/payment_forms.rb +73 -0
- data/lib/br_invoices_pdf/nfce/renderer/product_table.rb +23 -0
- data/lib/br_invoices_pdf/nfce/renderer/qr_code.rb +56 -0
- data/lib/br_invoices_pdf/nfce/renderer/taxes_info.rb +28 -0
- data/lib/br_invoices_pdf/nfce/renderer/totals.rb +30 -0
- data/lib/br_invoices_pdf/nfce/renderer.rb +37 -0
- data/lib/br_invoices_pdf/nfce.rb +11 -0
- data/lib/br_invoices_pdf/util/base_renderer.rb +121 -0
- data/lib/br_invoices_pdf/util/enum.rb +20 -0
- data/lib/br_invoices_pdf/util/mount_params.rb +26 -0
- data/lib/br_invoices_pdf/util/nfce_check_urls.rb +102 -0
- data/lib/br_invoices_pdf/util/pdf_renderer.rb +33 -0
- data/lib/br_invoices_pdf/util/product_table.rb +57 -0
- data/lib/br_invoices_pdf/util/xml_locate.rb +21 -0
- data/lib/br_invoices_pdf/version.rb +3 -1
- data/lib/br_invoices_pdf.rb +12 -0
- data/nfce.xml +160 -0
- metadata +32 -4
- data/lib/br_invoices_pdf/cfe/parser/base_parser.rb +0 -19
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'br_invoices_pdf/nfce/renderer/company_identification'
|
4
|
+
require 'br_invoices_pdf/nfce/renderer/customer_identification'
|
5
|
+
require 'br_invoices_pdf/nfce/renderer/header'
|
6
|
+
require 'br_invoices_pdf/nfce/renderer/product_table'
|
7
|
+
require 'br_invoices_pdf/nfce/renderer/totals'
|
8
|
+
require 'br_invoices_pdf/nfce/renderer/payment_forms'
|
9
|
+
require 'br_invoices_pdf/nfce/renderer/taxes_info'
|
10
|
+
require 'br_invoices_pdf/nfce/renderer/fiscal_message'
|
11
|
+
require 'br_invoices_pdf/nfce/renderer/qr_code'
|
12
|
+
|
13
|
+
module BrInvoicesPdf
|
14
|
+
module Nfce
|
15
|
+
module Renderer
|
16
|
+
extend Util::PdfRenderer
|
17
|
+
|
18
|
+
module_function
|
19
|
+
|
20
|
+
RENDERERS = [
|
21
|
+
CompanyIdentification,
|
22
|
+
Header,
|
23
|
+
ProductTable,
|
24
|
+
Totals,
|
25
|
+
PaymentForms,
|
26
|
+
TaxesInfo,
|
27
|
+
FiscalMessage,
|
28
|
+
CustomerIdentification,
|
29
|
+
QrCode
|
30
|
+
].freeze
|
31
|
+
|
32
|
+
def pdf(data, options)
|
33
|
+
generate_pdf(data, options, RENDERERS)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'br_invoices_pdf/nfce/parser'
|
4
|
+
require 'br_invoices_pdf/nfce/renderer/base_renderer'
|
5
|
+
require 'br_invoices_pdf/nfce/renderer'
|
6
|
+
|
7
|
+
module BrInvoicesPdf
|
8
|
+
module Cfe
|
9
|
+
BrInvoicesPdf.register(:nfce, Nfce::Renderer, Nfce::Parser)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrInvoicesPdf
|
4
|
+
module Util
|
5
|
+
module BaseRenderer
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def box(pdf, position, width)
|
9
|
+
pdf.bounding_box(position, width: width) do
|
10
|
+
pdf.pad(2) do
|
11
|
+
pdf.indent(2, 2) do
|
12
|
+
yield
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
pdf.stroke_bounds
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def insert_box_info(pdf, data, xpos = 0)
|
21
|
+
third_width = page_content_width(pdf) * 0.333333333
|
22
|
+
ypos = pdf.cursor
|
23
|
+
box_info(data[:totals]).each do |(title, value)|
|
24
|
+
insert_box(pdf, title: title, value: value, xpos: xpos, ypos: ypos, third_width: third_width)
|
25
|
+
xpos += third_width
|
26
|
+
end
|
27
|
+
end
|
28
|
+
private_class_method :insert_box_info
|
29
|
+
|
30
|
+
# :reek:FeatureEnvy
|
31
|
+
def insert_box(pdf, params)
|
32
|
+
box(pdf, [params[:xpos], params[:ypos]], params[:third_width]) do
|
33
|
+
insert_texts(pdf, params[:title], params[:value])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
private_class_method :insert_box
|
37
|
+
|
38
|
+
def insert_texts(pdf, title, value)
|
39
|
+
pdf.text(title, style: :italic)
|
40
|
+
pdf.text(value, align: :right)
|
41
|
+
end
|
42
|
+
private_class_method :insert_texts
|
43
|
+
|
44
|
+
# :reek:FeatureEnvy
|
45
|
+
def pdf_setup(pdf)
|
46
|
+
pdf.bounding_box([0, pdf.cursor], width: page_content_width(pdf)) do
|
47
|
+
pdf.pad(10) do
|
48
|
+
pdf.indent(10, 10) do
|
49
|
+
yield
|
50
|
+
end
|
51
|
+
end
|
52
|
+
pdf.stroke_bounds
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
PAYMENTS_TABLE_BASE_DATA = [['FORMA DE PAGAMENTO', 'VALOR']].freeze
|
57
|
+
# :reek:FeatureEnvy
|
58
|
+
def mount_payment_data(data)
|
59
|
+
data[:payments].reduce(PAYMENTS_TABLE_BASE_DATA) do |result, cur|
|
60
|
+
result + [[cur[:type], format_currency(cur[:amount])]]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
private_class_method :mount_payment_data
|
64
|
+
|
65
|
+
def generate_qr_code_data(qr_code_string, qrcode_size)
|
66
|
+
qrcode = RQRCode::QRCode.new(qr_code_string)
|
67
|
+
blob = qrcode.as_png(size: qrcode_size.to_i, border_modules: 0).to_blob
|
68
|
+
StringIO.new(blob)
|
69
|
+
end
|
70
|
+
private_class_method :generate_qr_code_data
|
71
|
+
|
72
|
+
def execute_payment_form(pdf, date_from_table)
|
73
|
+
pdf.font_size(6) do
|
74
|
+
width = page_content_width(pdf)
|
75
|
+
table_data = date_from_table
|
76
|
+
render_table(pdf, table_data, width)
|
77
|
+
end
|
78
|
+
|
79
|
+
pdf.move_down(5)
|
80
|
+
end
|
81
|
+
private_class_method :execute_payment_form
|
82
|
+
|
83
|
+
CNPJ_FORMAT = '%02d.%03d.%03d/%04d-%02d'
|
84
|
+
# :reek:FeatureEnvy
|
85
|
+
def format_cnpj(cnpj)
|
86
|
+
format(CNPJ_FORMAT, cnpj[0, 2].to_i, cnpj[2, 3].to_i, cnpj[5, 3].to_i,
|
87
|
+
cnpj[8, 4].to_i, cnpj[12, 2].to_i)
|
88
|
+
end
|
89
|
+
|
90
|
+
CPF_FORMAT = '%d.%d.%d-%d'
|
91
|
+
# :reek:FeatureEnvy
|
92
|
+
def format_cpf(cpf)
|
93
|
+
format(CPF_FORMAT, cpf[0, 3], cpf[3, 3], cpf[6, 3], cpf[9, 2])
|
94
|
+
end
|
95
|
+
|
96
|
+
# :reek:FeatureEnvy
|
97
|
+
def format_currency(number_string)
|
98
|
+
number = BigDecimal(number_string)
|
99
|
+
format('%.2f', number.truncate(2)).tr('.', ',')
|
100
|
+
end
|
101
|
+
|
102
|
+
# :reek:FeatureEnvy
|
103
|
+
def format_number(number_string, prec: 4)
|
104
|
+
number = BigDecimal(number_string)
|
105
|
+
format("%.#{prec}f", number.truncate(prec)).tr('.', ',')
|
106
|
+
end
|
107
|
+
|
108
|
+
# :reek:FeatureEnvy
|
109
|
+
def page_paper_width(name)
|
110
|
+
(name.is_a?(Array) ? name : PDF::Core::PageGeometry::SIZES[name]).first
|
111
|
+
end
|
112
|
+
|
113
|
+
# :reek:FeatureEnvy
|
114
|
+
def page_content_width(pdf)
|
115
|
+
page = pdf.page
|
116
|
+
margins = page.margins
|
117
|
+
page_paper_width(page.size) - margins[:left] - margins[:right]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrInvoicesPdf
|
4
|
+
module Util
|
5
|
+
module Enum
|
6
|
+
PAYMENT_TYPES = {
|
7
|
+
'01' => 'Dinheiro',
|
8
|
+
'02' => 'Cheque',
|
9
|
+
'03' => 'Cartão de Crédito',
|
10
|
+
'04' => 'Cartão de Débito',
|
11
|
+
'05' => 'Crédito Loja',
|
12
|
+
'10' => 'Vale Alimentação',
|
13
|
+
'11' => 'Vale Refeição',
|
14
|
+
'12' => 'Vale Presente',
|
15
|
+
'13' => 'Vale Combustível',
|
16
|
+
'99' => 'Outros'
|
17
|
+
}.freeze
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrInvoicesPdf
|
4
|
+
module Util
|
5
|
+
module MountParams
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def mount(xml, params)
|
9
|
+
params.reduce({}) do |response, (param, path)|
|
10
|
+
{ **response, param => locate_element(xml, path) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def address_params(root_path, local)
|
15
|
+
{
|
16
|
+
streetname: "#{root_path}/ender#{local}/xLgr",
|
17
|
+
number: "#{root_path}/ender#{local}/nro",
|
18
|
+
district: "#{root_path}/ender#{local}/xBairro",
|
19
|
+
city: "#{root_path}/ender#{local}/xMun",
|
20
|
+
state: "#{root_path}/ender#{local}/UF"
|
21
|
+
}.freeze
|
22
|
+
end
|
23
|
+
private_class_method :address_params
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrInvoicesPdf
|
4
|
+
module Util
|
5
|
+
module NfceCheckUrls
|
6
|
+
URLS = {
|
7
|
+
'12': {
|
8
|
+
'1': 'http://www.sefaznet.ac.gov.br/nfce/consulta',
|
9
|
+
'2': 'http://hml.sefaznet.ac.gov.br/nfce/consulta'
|
10
|
+
},
|
11
|
+
'27': {
|
12
|
+
'1': 'http://nfce.sefaz.al.gov.br/consultaNFCe.htm',
|
13
|
+
'2': 'http://nfce.sefaz.al.gov.br/consultaNFCe.htm'
|
14
|
+
},
|
15
|
+
'16': {
|
16
|
+
'1': 'https://www.sefaz.ap.gov.br/sate/seg/SEGf_AcessarFuncao.jsp?cdFuncao=FIS_1261',
|
17
|
+
'2': 'https://www.sefaz.ap.gov.br/sate1/seg/SEGf_AcessarFuncao.jsp?cdFuncao=FIS_1261'
|
18
|
+
},
|
19
|
+
'13': {
|
20
|
+
'1': 'http://sistemas.sefaz.am.gov.br/nfceweb/formConsulta.do',
|
21
|
+
'2': 'http://homnfce.sefaz.am.gov.br/nfceweb/formConsulta.do'
|
22
|
+
},
|
23
|
+
'29': {
|
24
|
+
'1': 'http://nfe.sefaz.ba.gov.br/servicos/nfce/default.aspx',
|
25
|
+
'2': 'http://hnfe.sefaz.ba.gov.br/servicos/nfce/default.aspx'
|
26
|
+
},
|
27
|
+
'23': {
|
28
|
+
'1': 'http://nfceh.sefaz.ce.gov.br/pages/consultaNota.jsf',
|
29
|
+
'2': 'http://nfceh.sefaz.ce.gov.br/pages/consultaNota.jsf'
|
30
|
+
},
|
31
|
+
'53': {
|
32
|
+
'1': 'http://dec.fazenda.df.gov.br/NFCE/',
|
33
|
+
'2': 'http://dec.fazenda.df.gov.br/NFCE/'
|
34
|
+
},
|
35
|
+
'32': {
|
36
|
+
'1': 'http://app.sefaz.es.gov.br/ConsultaNFCe',
|
37
|
+
'2': 'http://homologacao.sefaz.es.gov.br/ConsultaNFCe'
|
38
|
+
},
|
39
|
+
'21': {
|
40
|
+
'1': 'http://www.nfce.sefaz.ma.gov.br/portal/consultaNFe.do?method=preFilterCupom&',
|
41
|
+
'2': 'http://www.hom.nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp'
|
42
|
+
},
|
43
|
+
'51': {
|
44
|
+
'1': 'http://www.sefaz.mt.gov.br/nfce/consultanfce',
|
45
|
+
'2': 'http://homologacao.sefaz.mt.gov.br/nfce/consultanfce'
|
46
|
+
},
|
47
|
+
'50': {
|
48
|
+
'1': 'http://www.dfe.ms.gov.br/nfce',
|
49
|
+
'2': 'http://www.dfe.ms.gov.br/nfce'
|
50
|
+
},
|
51
|
+
'15': {
|
52
|
+
'1': 'https://appnfc.sefa.pa.gov.br/portal/view/consultas/nfce/consultanfce.seam',
|
53
|
+
'2': 'https://appnfc.sefa.pa.gov.br/portal-homologacao/view/consultas/nfce/consultanfce.seam'
|
54
|
+
},
|
55
|
+
'25': {
|
56
|
+
'1': 'http://www.receita.pb.gov.br/nfce',
|
57
|
+
'2': 'http://www.receita.pb.gov.br/nfcehom'
|
58
|
+
},
|
59
|
+
'41': {
|
60
|
+
'1': 'http://www.fazenda.pr.gov.br/',
|
61
|
+
'2': 'http://www.fazenda.pr.gov.br/'
|
62
|
+
},
|
63
|
+
'22': {
|
64
|
+
'1': 'http://webas.sefaz.pi.gov.br/nfceweb/consultarNFCe.jsf',
|
65
|
+
'2': 'http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf'
|
66
|
+
},
|
67
|
+
'33': {
|
68
|
+
'1': 'http://www.nfce.fazenda.rj.gov.br/consulta',
|
69
|
+
'2': 'http://www.nfce.fazenda.rj.gov.br/consulta'
|
70
|
+
},
|
71
|
+
'24': {
|
72
|
+
'1': 'http://nfce.set.rn.gov.br/consultarNFCe.aspx',
|
73
|
+
'2': 'http://nfce.set.rn.gov.br/consultarNFCe.aspx'
|
74
|
+
},
|
75
|
+
'43': {
|
76
|
+
'1': 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx',
|
77
|
+
'2': 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx'
|
78
|
+
},
|
79
|
+
'11': {
|
80
|
+
'1': 'http://www.nfce.sefin.ro.gov.br/',
|
81
|
+
'2': 'http://www.nfce.sefin.ro.gov.br/'
|
82
|
+
},
|
83
|
+
'14': {
|
84
|
+
'1': 'https://www.sefaz.rr.gov.br/nfce/servlet/wp_consulta_nfce',
|
85
|
+
'2': 'http://200.174.88.103:8080/nfce/servlet/wp_consulta_nfce'
|
86
|
+
},
|
87
|
+
'35': {
|
88
|
+
'1': 'https://www.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaPublica.aspx',
|
89
|
+
'2': 'https://www.homologacao.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaPublica.aspx'
|
90
|
+
},
|
91
|
+
'28': {
|
92
|
+
'1': 'http://www.nfce.se.gov.br/portal/portalNoticias.jsp',
|
93
|
+
'2': 'http://www.hom.nfe.se.gov.br/portal/portalNoticias.jsp'
|
94
|
+
},
|
95
|
+
'17': {
|
96
|
+
'1': 'http://apps.sefaz.to.gov.br/portal-nfce/consultarNFCe.jsf',
|
97
|
+
'2': 'http://apps.sefaz.to.gov.br/portal-nfce-homologacao/consultarNFCe.jsf'
|
98
|
+
}
|
99
|
+
}.freeze
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrInvoicesPdf
|
4
|
+
module Util
|
5
|
+
module PdfRenderer
|
6
|
+
extend Util::BaseRenderer
|
7
|
+
|
8
|
+
module_function
|
9
|
+
|
10
|
+
AUTO_HEIGHT_MOCK = 2000
|
11
|
+
|
12
|
+
# :reek:FeatureEnvy
|
13
|
+
def generate_pdf(data, options, renderers)
|
14
|
+
page_width = Util::BaseRenderer.page_paper_width(options[:page_size])
|
15
|
+
|
16
|
+
Prawn::Document.new(options.merge(page_size: [page_width, AUTO_HEIGHT_MOCK])) do |pdf|
|
17
|
+
pdf_content(pdf, data, page_width: page_width, renderers: renderers)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def pdf_content(pdf, data, options)
|
22
|
+
pdf.font_size(7) do
|
23
|
+
options[:renderers].each do |renderer|
|
24
|
+
renderer.execute(pdf, data)
|
25
|
+
end
|
26
|
+
|
27
|
+
page = pdf.page
|
28
|
+
page.dictionary.data[:MediaBox] = [0, pdf.y - page.margins[:bottom], options[:page_width], AUTO_HEIGHT_MOCK]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrInvoicesPdf
|
4
|
+
module Util
|
5
|
+
module ProductTable
|
6
|
+
module_function
|
7
|
+
|
8
|
+
PRODUCT_TABLE_BASE_DATA = [['CÓD.', 'DESCRIÇÃO', 'QTD.', 'UND.', 'V.UNIT', 'V.TOT']].freeze
|
9
|
+
# :reek:FeatureEnvy
|
10
|
+
def product_table_data(data)
|
11
|
+
data[:products].reduce(PRODUCT_TABLE_BASE_DATA) do |result, cur|
|
12
|
+
result + [[
|
13
|
+
cur[:code],
|
14
|
+
cur[:description],
|
15
|
+
format_number(cur[:quantity]),
|
16
|
+
cur[:unit_label],
|
17
|
+
format_currency(cur[:unit_value]),
|
18
|
+
format_currency(cur[:total_value])
|
19
|
+
]]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
private_class_method :product_table_data
|
23
|
+
|
24
|
+
def format_table(pdf, table_data)
|
25
|
+
width = page_content_width(pdf)
|
26
|
+
pdf.table(table_data, width: width) do |table|
|
27
|
+
format_row(table.row(0))
|
28
|
+
format_columns(table)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
private_class_method :format_table
|
32
|
+
|
33
|
+
def format_row(row)
|
34
|
+
row.font_style = :bold
|
35
|
+
row.align = :center
|
36
|
+
end
|
37
|
+
private_class_method :format_row
|
38
|
+
|
39
|
+
# :reek:FeatureEnvy
|
40
|
+
def format_columns(table)
|
41
|
+
table.columns(0..5).valign = :center
|
42
|
+
table.columns([2, 4, 5]).align = :right
|
43
|
+
table.column(3).align = :center
|
44
|
+
table_widths(table, table.width)
|
45
|
+
end
|
46
|
+
private_class_method :format_columns
|
47
|
+
|
48
|
+
# :reek:FeatureEnvy
|
49
|
+
def table_widths(table, width)
|
50
|
+
table.column(0).width = width * 0.16
|
51
|
+
table.columns([2, 3]).width = width * 0.155
|
52
|
+
table.column([4, 5]).width = width * 0.135
|
53
|
+
end
|
54
|
+
private_class_method :table_widths
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrInvoicesPdf
|
4
|
+
module Util
|
5
|
+
module XmlLocate
|
6
|
+
module_function
|
7
|
+
|
8
|
+
ROOT_PATH = 'NFe/infNFe'
|
9
|
+
|
10
|
+
def locate_element(xml, path)
|
11
|
+
element = xml.locate(path).first
|
12
|
+
element.text if element.is_a?(Ox::Element)
|
13
|
+
end
|
14
|
+
|
15
|
+
def node_locate(element, path)
|
16
|
+
value = element.nodes.first.locate(path).first
|
17
|
+
value.text if value.is_a?(Ox::Element)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/br_invoices_pdf.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
|
1
5
|
require 'ox'
|
2
6
|
require 'prawn'
|
3
7
|
require 'prawn/table'
|
@@ -39,4 +43,12 @@ module BrInvoicesPdf
|
|
39
43
|
end
|
40
44
|
end
|
41
45
|
|
46
|
+
require 'br_invoices_pdf/util/xml_locate'
|
47
|
+
require 'br_invoices_pdf/util/nfce_check_urls'
|
48
|
+
require 'br_invoices_pdf/util/mount_params'
|
49
|
+
require 'br_invoices_pdf/util/enum'
|
50
|
+
require 'br_invoices_pdf/util/base_renderer'
|
51
|
+
require 'br_invoices_pdf/util/pdf_renderer'
|
52
|
+
require 'br_invoices_pdf/util/product_table'
|
42
53
|
require 'br_invoices_pdf/cfe'
|
54
|
+
require 'br_invoices_pdf/nfce'
|
data/nfce.xml
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
|
2
|
+
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
|
3
|
+
<infNFe Id="NFe53171022769530000131654000000000601171025449" versao="3.10">
|
4
|
+
<ide>
|
5
|
+
<cUF>53</cUF>
|
6
|
+
<cNF>17102544</cNF>
|
7
|
+
<natOp>Venda</natOp>
|
8
|
+
<indPag>0</indPag>
|
9
|
+
<mod>65</mod>
|
10
|
+
<serie>400</serie>
|
11
|
+
<nNF>60</nNF>
|
12
|
+
<dhEmi>2017-10-04T16:56:24-03:00</dhEmi>
|
13
|
+
<tpNF>1</tpNF>
|
14
|
+
<idDest>1</idDest>
|
15
|
+
<cMunFG>5300108</cMunFG>
|
16
|
+
<tpImp>4</tpImp>
|
17
|
+
<tpEmis>1</tpEmis>
|
18
|
+
<cDV>9</cDV>
|
19
|
+
<tpAmb>2</tpAmb>
|
20
|
+
<finNFe>1</finNFe>
|
21
|
+
<indFinal>1</indFinal>
|
22
|
+
<indPres>1</indPres>
|
23
|
+
<procEmi>0</procEmi>
|
24
|
+
<verProc>1.0</verProc>
|
25
|
+
</ide>
|
26
|
+
<emit>
|
27
|
+
<CNPJ>22769530000131</CNPJ>
|
28
|
+
<xNome>PDVEND</xNome>
|
29
|
+
<enderEmit>
|
30
|
+
<xLgr>Avenida</xLgr>
|
31
|
+
<nro>LT 06</nro>
|
32
|
+
<xBairro>NORTE (AGUAS CLARAS)</xBairro>
|
33
|
+
<cMun>5300108</cMun>
|
34
|
+
<xMun>brasilia</xMun>
|
35
|
+
<UF>DF</UF>
|
36
|
+
<CEP>71916500</CEP>
|
37
|
+
</enderEmit>
|
38
|
+
<IE>0772733700120</IE>
|
39
|
+
<CRT>1</CRT>
|
40
|
+
</emit>
|
41
|
+
<dest>
|
42
|
+
<CNPJ>25504949000150</CNPJ>
|
43
|
+
<xNome>NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL</xNome>
|
44
|
+
<indIEDest>9</indIEDest>
|
45
|
+
</dest>
|
46
|
+
<det nItem="1">
|
47
|
+
<prod>
|
48
|
+
<cProd>LATA9308</cProd>
|
49
|
+
<cEAN></cEAN>
|
50
|
+
<xProd>NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL</xProd>
|
51
|
+
<NCM>01061200</NCM>
|
52
|
+
<CFOP>5102</CFOP>
|
53
|
+
<uCom>UN</uCom>
|
54
|
+
<qCom>1</qCom>
|
55
|
+
<vUnCom>0.91</vUnCom>
|
56
|
+
<vProd>0.91</vProd>
|
57
|
+
<cEANTrib></cEANTrib>
|
58
|
+
<uTrib>UN</uTrib>
|
59
|
+
<qTrib>1</qTrib>
|
60
|
+
<vUnTrib>0.91</vUnTrib>
|
61
|
+
<indTot>1</indTot>
|
62
|
+
</prod>
|
63
|
+
<imposto>
|
64
|
+
<ICMS>
|
65
|
+
<ICMSSN102>
|
66
|
+
<orig>0</orig>
|
67
|
+
<CSOSN>102</CSOSN>
|
68
|
+
</ICMSSN102>
|
69
|
+
</ICMS>
|
70
|
+
</imposto>
|
71
|
+
</det>
|
72
|
+
<det nItem="2">
|
73
|
+
<prod>
|
74
|
+
<cProd>BUG4933</cProd>
|
75
|
+
<cEAN></cEAN>
|
76
|
+
<xProd>Bugnnn</xProd>
|
77
|
+
<NCM>01061200</NCM>
|
78
|
+
<CFOP>5102</CFOP>
|
79
|
+
<uCom>UN</uCom>
|
80
|
+
<qCom>1</qCom>
|
81
|
+
<vUnCom>4.90</vUnCom>
|
82
|
+
<vProd>4.90</vProd>
|
83
|
+
<cEANTrib></cEANTrib>
|
84
|
+
<uTrib>UN</uTrib>
|
85
|
+
<qTrib>1</qTrib>
|
86
|
+
<vUnTrib>4.90</vUnTrib>
|
87
|
+
<indTot>1</indTot>
|
88
|
+
</prod>
|
89
|
+
<imposto>
|
90
|
+
<ICMS>
|
91
|
+
<ICMSSN102>
|
92
|
+
<orig>0</orig>
|
93
|
+
<CSOSN>102</CSOSN>
|
94
|
+
</ICMSSN102>
|
95
|
+
</ICMS>
|
96
|
+
</imposto>
|
97
|
+
</det>
|
98
|
+
<total>
|
99
|
+
<ICMSTot>
|
100
|
+
<vBC>0.00</vBC>
|
101
|
+
<vICMS>0.00</vICMS>
|
102
|
+
<vICMSDeson>0.00</vICMSDeson>
|
103
|
+
<vBCST>0.00</vBCST>
|
104
|
+
<vST>0.00</vST>
|
105
|
+
<vProd>5.81</vProd>
|
106
|
+
<vFrete>0.00</vFrete>
|
107
|
+
<vSeg>0.00</vSeg>
|
108
|
+
<vDesc>0.00</vDesc>
|
109
|
+
<vII>0.00</vII>
|
110
|
+
<vIPI>0.00</vIPI>
|
111
|
+
<vPIS>0.00</vPIS>
|
112
|
+
<vCOFINS>0.00</vCOFINS>
|
113
|
+
<vOutro>0.00</vOutro>
|
114
|
+
<vNF>5.81</vNF>
|
115
|
+
</ICMSTot>
|
116
|
+
</total>
|
117
|
+
<transp>
|
118
|
+
<modFrete>9</modFrete>
|
119
|
+
</transp>
|
120
|
+
<pag>
|
121
|
+
<tPag>01</tPag>
|
122
|
+
<vPag>5.81</vPag>
|
123
|
+
<vTroco>0.19</vTroco>
|
124
|
+
</pag>
|
125
|
+
</infNFe>
|
126
|
+
<infAdic>
|
127
|
+
<infCpl>
|
128
|
+
Tributos aproximados: (Lei Federal 12.741/2012): R$ 0,00 (0%)
|
129
|
+
</infCpl>
|
130
|
+
</infAdic>
|
131
|
+
<infNFeSupl>
|
132
|
+
<qrCode><![CDATA[http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?chNFe=53171022769530000131654000000000601171025449&nVersao=100&tpAmb=2&cDest=25504949000150&dhEmi=323031372d31302d30345431363a35363a32342d30333a3030&vNF=5.81&vICMS=0.00&digVal=6d3658314668464774314435487850794d677a557276412b646c733d&cIdToken=000001&cHashQRCode=62F1D30A95E4E08FC5A29D506FF935FD37C8614E]]></qrCode>
|
133
|
+
</infNFeSupl>
|
134
|
+
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
135
|
+
<SignedInfo>
|
136
|
+
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
|
137
|
+
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
|
138
|
+
<Reference URI="#NFe53171022769530000131654000000000601171025449">
|
139
|
+
<Transforms>
|
140
|
+
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
|
141
|
+
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
|
142
|
+
</Transforms>
|
143
|
+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
|
144
|
+
<DigestValue>m6X1FhFGt1D5HxPyMgzUrvA+dls=</DigestValue>
|
145
|
+
</Reference>
|
146
|
+
</SignedInfo>
|
147
|
+
<SignatureValue>ERawIQpTAZxMjiD0s9CJRKNOwv7RjONCMBT+XMDscTLzgRd9a6My8fau29D9tGJwOKGVJ12aRTqr34B+ECnSwyJ9qTE+l1C9pVRY2ypLUhJW5Q3FCg+Zke3MDmDqmJVv44jA5O2s8UIhuw2hVQgz32Gr38ZRkytEU5Xcd5sEOoinClNNtrGduUDVdfeEsIuTfL4TIbkmf5dnqje+P6ZNmSFuwDeb2TH2MG8R/EBSazPM+PR7nGId5cCMj1edfMeSsR6MXMnju7t/8N5qUGpKwmwPC/jQtmFVse18f2joIO4HfeGz9tIP92TNUVnrjTTWmMBrHVWqiT8ogxgXX/SFfQ==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></NFe>
|
148
|
+
<protNFe versao="3.10">
|
149
|
+
<infProt>
|
150
|
+
<tpAmb>2</tpAmb>
|
151
|
+
<verAplic>SVRSnfce201707171030</verAplic>
|
152
|
+
<chNFe>53171022769530000131654000000000601171025449</chNFe>
|
153
|
+
<dhRecbto>2017-10-04T16:56:26-03:00</dhRecbto>
|
154
|
+
<nProt>353170000106963</nProt>
|
155
|
+
<digVal>m6X1FhFGt1D5HxPyMgzUrvA+dls=</digVal>
|
156
|
+
<cStat>100</cStat>
|
157
|
+
<xMotivo>Autorizado o uso da NF-e</xMotivo>
|
158
|
+
</infProt>
|
159
|
+
</protNFe>
|
160
|
+
</nfeProc>
|