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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +17 -0
  3. data/.rubocop.yml +1 -0
  4. data/CHANGELOG.md +1 -0
  5. data/Gemfile +2 -0
  6. data/Rakefile +2 -0
  7. data/bin/console +1 -0
  8. data/br_invoices_pdf.gemspec +1 -0
  9. data/lib/br_invoices_pdf/cfe/parser/access_key.rb +3 -1
  10. data/lib/br_invoices_pdf/cfe/parser/cnpj.rb +3 -1
  11. data/lib/br_invoices_pdf/cfe/parser/company_attributes.rb +3 -1
  12. data/lib/br_invoices_pdf/cfe/parser/cpf.rb +3 -1
  13. data/lib/br_invoices_pdf/cfe/parser/document_number.rb +3 -1
  14. data/lib/br_invoices_pdf/cfe/parser/fisco_obs.rb +3 -1
  15. data/lib/br_invoices_pdf/cfe/parser/payment.rb +3 -1
  16. data/lib/br_invoices_pdf/cfe/parser/payments.rb +6 -16
  17. data/lib/br_invoices_pdf/cfe/parser/products_data.rb +4 -2
  18. data/lib/br_invoices_pdf/cfe/parser/sat.rb +3 -1
  19. data/lib/br_invoices_pdf/cfe/parser.rb +5 -3
  20. data/lib/br_invoices_pdf/cfe/renderer/base_renderer.rb +5 -62
  21. data/lib/br_invoices_pdf/cfe/renderer/company_identification.rb +3 -0
  22. data/lib/br_invoices_pdf/cfe/renderer/fisco_info.rb +3 -0
  23. data/lib/br_invoices_pdf/cfe/renderer/header.rb +3 -0
  24. data/lib/br_invoices_pdf/cfe/renderer/payment_forms.rb +6 -12
  25. data/lib/br_invoices_pdf/cfe/renderer/product_table.rb +4 -48
  26. data/lib/br_invoices_pdf/cfe/renderer/qr_code.rb +5 -9
  27. data/lib/br_invoices_pdf/cfe/renderer/taxes_info.rb +5 -2
  28. data/lib/br_invoices_pdf/cfe/renderer/totals.rb +3 -24
  29. data/lib/br_invoices_pdf/cfe/renderer.rb +4 -18
  30. data/lib/br_invoices_pdf/cfe.rb +2 -1
  31. data/lib/br_invoices_pdf/errors/invalid_document_type.rb +2 -0
  32. data/lib/br_invoices_pdf/generator.rb +2 -0
  33. data/lib/br_invoices_pdf/nfce/parser/additional_info.rb +17 -0
  34. data/lib/br_invoices_pdf/nfce/parser/company.rb +25 -0
  35. data/lib/br_invoices_pdf/nfce/parser/customer.rb +32 -0
  36. data/lib/br_invoices_pdf/nfce/parser/emission_details.rb +51 -0
  37. data/lib/br_invoices_pdf/nfce/parser/payments.rb +30 -0
  38. data/lib/br_invoices_pdf/nfce/parser/products.rb +39 -0
  39. data/lib/br_invoices_pdf/nfce/parser/totals.rb +25 -0
  40. data/lib/br_invoices_pdf/nfce/parser.rb +33 -0
  41. data/lib/br_invoices_pdf/nfce/renderer/base_renderer.rb +22 -0
  42. data/lib/br_invoices_pdf/nfce/renderer/company_identification.rb +37 -0
  43. data/lib/br_invoices_pdf/nfce/renderer/customer_identification.rb +47 -0
  44. data/lib/br_invoices_pdf/nfce/renderer/fiscal_message.rb +46 -0
  45. data/lib/br_invoices_pdf/nfce/renderer/header.rb +32 -0
  46. data/lib/br_invoices_pdf/nfce/renderer/payment_forms.rb +73 -0
  47. data/lib/br_invoices_pdf/nfce/renderer/product_table.rb +23 -0
  48. data/lib/br_invoices_pdf/nfce/renderer/qr_code.rb +56 -0
  49. data/lib/br_invoices_pdf/nfce/renderer/taxes_info.rb +28 -0
  50. data/lib/br_invoices_pdf/nfce/renderer/totals.rb +30 -0
  51. data/lib/br_invoices_pdf/nfce/renderer.rb +37 -0
  52. data/lib/br_invoices_pdf/nfce.rb +11 -0
  53. data/lib/br_invoices_pdf/util/base_renderer.rb +121 -0
  54. data/lib/br_invoices_pdf/util/enum.rb +20 -0
  55. data/lib/br_invoices_pdf/util/mount_params.rb +26 -0
  56. data/lib/br_invoices_pdf/util/nfce_check_urls.rb +102 -0
  57. data/lib/br_invoices_pdf/util/pdf_renderer.rb +33 -0
  58. data/lib/br_invoices_pdf/util/product_table.rb +57 -0
  59. data/lib/br_invoices_pdf/util/xml_locate.rb +21 -0
  60. data/lib/br_invoices_pdf/version.rb +3 -1
  61. data/lib/br_invoices_pdf.rb +12 -0
  62. data/nfce.xml +160 -0
  63. metadata +32 -4
  64. 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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BrInvoicesPdf
2
- VERSION = '0.2.6'.freeze
4
+ VERSION = '0.2.6'
3
5
  end
@@ -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>MIIHrDCCBZSgAwIBAgIIEJkXBwNgdPIwDQYJKoZIhvcNAQELBQAwgYkxCzAJBgNVBAYTAkJSMRMwEQYDVQQKEwpJQ1AtQnJhc2lsMTQwMgYDVQQLEytBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhIHYyMRIwEAYDVQQLEwlBQyBTT0xVVEkxGzAZBgNVBAMTEkFDIFNPTFVUSSBNdWx0aXBsYTAeFw0xNzA3MDMyMTI4MzhaFw0xODA3MDMxOTM3MDBaMIHVMQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE0MDIGA1UECxMrQXV0b3JpZGFkZSBDZXJ0aWZpY2Fkb3JhIFJhaXogQnJhc2lsZWlyYSB2MjESMBAGA1UECxMJQUMgU09MVVRJMRswGQYDVQQLExJBQyBTT0xVVEkgTXVsdGlwbGExGjAYBgNVBAsTEUNlcnRpZmljYWRvIFBKIEExMS4wLAYDVQQDEyVQRFZFTkQgVEVDTk9MT0dJQSBMVERBOjIyNzY5NTMwMDAwMTMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwcM4kLIofV0ugsrun7P24zlg+23yqX3NCo0cYCrS5z8JCnMgPLxu5+9x0XCXnW2HPAnODC9aj8J/Mosc1NkX2/JJ5NmEUhsX3n4SoZvGHGToQHF8tTP/Y76cta7UQP1LdqhN2vZESFW9hK6QjNTFmkJzKXvYAF6es6l68TZ81mOuKEN3nyD5oP+UP2K9IjIUjkf0BUs/pfftVNRs4PrBcptvntS3VRVrYMITdROS6QLmCQS1ajrQ8ajmbMyR11Szke34Liigi5iBPemaBNDebPHilhRM9s8+FIFRrVE4Iu34+0xcJAS1ysBpcPjpGzJ9rHkPGdWsHO0s+HDyio8XwIDAQABo4ICyDCCAsQwVAYIKwYBBQUHAQEESDBGMEQGCCsGAQUFBzAChjhodHRwOi8vY2NkLmFjc29sdXRpLmNvbS5ici9sY3IvYWMtc29sdXRpLW11bHRpcGxhLXYxLnA3YjAdBgNVHQ4EFgQUHIOKxo6/5YKAEZQjCy/AnDq3B+4wCQYDVR0TBAIwADAfBgNVHSMEGDAWgBQ1rjEU9l7Sek9Y/jSoGmeXCsSbBzBeBgNVHSAEVzBVMFMGBmBMAQIBJjBJMEcGCCsGAQUFBwIBFjtodHRwczovL2NjZC5hY3NvbHV0aS5jb20uYnIvZG9jcy9kcGMtYWMtc29sdXRpLW11bHRpcGxhLnBkZjCB3gYDVR0fBIHWMIHTMD6gPKA6hjhodHRwOi8vY2NkLmFjc29sdXRpLmNvbS5ici9sY3IvYWMtc29sdXRpLW11bHRpcGxhLXYxLmNybDA/oD2gO4Y5aHR0cDovL2NjZDIuYWNzb2x1dGkuY29tLmJyL2xjci9hYy1zb2x1dGktbXVsdGlwbGEtdjEuY3JsMFCgTqBMhkpodHRwOi8vcmVwb3NpdG9yaW8uaWNwYnJhc2lsLmdvdi5ici9sY3IvQUNTT0xVVEkvYWMtc29sdXRpLW11bHRpcGxhLXYxLmNybDAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIGwBgNVHREEgagwgaWBE2JydW5vQHBkdmVuZC5jb20uYnKgIAYFYEwBAwKgFxMVQlJVTk8gVkVMT1NPIEZFUlJFSVJBoBkGBWBMAQMDoBATDjIyNzY5NTMwMDAwMTMxoDgGBWBMAQMEoC8TLTIzMDgxOTg1MDA2NDIyMjIxNzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMKAXBgVgTAEDB6AOEwwwMDAwMDAwMDAwMDAwDQYJKoZIhvcNAQELBQADggIBABJtpJjKDqJ0rtP7pI1K6mT3sUzHxH1VAvEzHlk+Iw6rQBrdTwBdFbFTKFMz9RJmiSSde6C96yYX7vxzgmsA7u5MZ9iSsZ9ivH4GzNj+OgpdDFwz/lv5rCv09PMV4Iu6+uVlulALErc7YBelAv8iak2AqjXpLJkZLTHsWlzPpnmjfS3YSKhdtJY0g+WAJDEF0ZzLLf+dxKNdUtNJKDCmqWKhTIxWd727M4pyJjMcB+x8z+mzdWQwrhWvUwysWtFa7QrTCdgeH0EZi8+KUZAOQZD7ESIZhXx7mxu75KAuKkyb0izzaR8Ddrkrn59wkJvvt5bO56TCFiHBUT4xdt65k0sLkL5U4+1TpRlgR2g73uq3Ua0EVZckTjvs/vdti0I1uRLfZJM6K1ahQj0a9fpVT7/PIXo+xoDTCmwM0xBhmMn6r/dOrEyHupKDNJPrBlkKObZmKbkEx7vCaW75KcUGUg5qFP36J74LL37ggHkfXnp0W3HFNfAR39GhuG1j3cHRqIrratHsS+N2XZPLnqhJPDiQUL+rc/6egd05UpVliINeIWvCsbejaC0FzV7k8VqHnvrfuzOXkszDzvoKv0p30TfogtOdZscluc+ujWmLZUPqVaWqyhJHX9HLzkbap1ZrJU3cJIhclAagBie5yhFaSOKPYc33wbhIdyByXKLnjYoN</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>