Skip to content

Commit 34bef47

Browse files
authored
Merge pull request #381 from leogregianin/main
Adiciona serialização de fatura e duplicatas
2 parents 46596ac + d36801c commit 34bef47

File tree

2 files changed

+115
-1
lines changed

2 files changed

+115
-1
lines changed

pynfe/processamento/serializacao.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,6 +1788,34 @@ def _serializar_nota_fiscal(
17881788
lacres, "nLacre"
17891789
).text = lacre.numero_lacre
17901790

1791+
# Cobrança
1792+
if (nota_fiscal.fatura_numero) or (nota_fiscal.duplicatas and len(nota_fiscal.duplicatas) > 0):
1793+
cobr = etree.SubElement(raiz, "cobr")
1794+
1795+
# Fatura 0-1
1796+
if nota_fiscal.fatura_numero:
1797+
fat = etree.SubElement(cobr, "fat")
1798+
etree.SubElement(fat, "nFat").text = nota_fiscal.fatura_numero
1799+
etree.SubElement(fat, "vOrig").text = "{:.2f}".format(
1800+
nota_fiscal.fatura_valor_original
1801+
)
1802+
etree.SubElement(fat, "vDesc").text = "{:.2f}".format(
1803+
nota_fiscal.fatura_valor_desconto
1804+
)
1805+
etree.SubElement(fat, "vLiq").text = "{:.2f}".format(
1806+
nota_fiscal.fatura_valor_liquido
1807+
)
1808+
1809+
# Duplicata 0-N
1810+
if nota_fiscal.duplicatas and len(nota_fiscal.duplicatas) > 0:
1811+
for num, item in enumerate(nota_fiscal.duplicatas):
1812+
dup = etree.SubElement(cobr, "dup")
1813+
etree.SubElement(dup, "nDup").text = item.numero
1814+
etree.SubElement(dup, "dVenc").text = item.data_vencimento.strftime(
1815+
"%Y-%m-%d"
1816+
)
1817+
etree.SubElement(dup, "vDup").text = "{:.2f}".format(item.valor)
1818+
17911819
# Pagamento
17921820
""" Obrigatório o preenchimento do Grupo Informações de Pagamento para NF-e e NFC-e.
17931821
Para as notas com finalidade de Ajuste ou Devolução

tests/test_nfe_serializacao_geral.py

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ def preenche_notafiscal_produto_cst00(self):
113113
transporte_modalidade_frete=1,
114114
informacoes_adicionais_interesse_fisco="Mensagem complementar",
115115
totais_tributos_aproximado=Decimal("21.06"),
116+
fatura_numero="12345",
117+
fatura_valor_original=Decimal("117.00"),
118+
fatura_valor_desconto=Decimal("0.00"),
119+
fatura_valor_liquido=Decimal("117.00"),
116120
)
117121

118122
self.notafiscal.adicionar_produto_servico(
@@ -163,7 +167,25 @@ def preenche_notafiscal_produto_cst00(self):
163167
email="pynfe@pynfe.io",
164168
fone="11912341234",
165169
)
166-
170+
171+
self.notafiscal.adicionar_duplicata(
172+
numero='1',
173+
data_vencimento=datetime.datetime(2025, 1, 27, 12, 0, 0, tzinfo=utc),
174+
valor=Decimal("39.00"),
175+
)
176+
177+
self.notafiscal.adicionar_duplicata(
178+
numero='1',
179+
data_vencimento=datetime.datetime(2025, 1, 28, 12, 0, 0, tzinfo=utc),
180+
valor=Decimal("39.00"),
181+
)
182+
183+
self.notafiscal.adicionar_duplicata(
184+
numero='1',
185+
data_vencimento=datetime.datetime(2025, 1, 29, 12, 0, 0, tzinfo=utc),
186+
valor=Decimal("39.00"),
187+
)
188+
167189
self.notafiscal.adicionar_pagamento(
168190
t_pag="03",
169191
x_pag="Cartao Credito",
@@ -396,6 +418,68 @@ def notas_referenciadas_test(self):
396418
self.assertEqual(chave_1, "12345678901234567890123456789012345678900001")
397419
self.assertEqual(chave_2, "12345678901234567890123456789012345678900002")
398420

421+
def fatura_test(self):
422+
numero_fatura = self.xml_assinado.xpath("//ns:cobr/ns:fat/ns:nFat", namespaces=self.ns)[
423+
0
424+
].text
425+
valor_original = self.xml_assinado.xpath("//ns:cobr/ns:fat/ns:vOrig", namespaces=self.ns)[
426+
0
427+
].text
428+
valor_desconto = self.xml_assinado.xpath("//ns:cobr/ns:fat/ns:vDesc", namespaces=self.ns)[
429+
0
430+
].text
431+
valor_liquido = self.xml_assinado.xpath("//ns:cobr/ns:fat/ns:vLiq", namespaces=self.ns)[
432+
0
433+
].text
434+
435+
self.assertEqual(numero_fatura, "12345")
436+
self.assertEqual(valor_original, "117.00")
437+
self.assertEqual(valor_desconto, "0.00")
438+
self.assertEqual(valor_liquido, "117.00")
439+
440+
def duplicatas_test(self):
441+
numero_duplicata_1 = self.xml_assinado.xpath(
442+
"//ns:cobr/ns:dup/ns:nDup", namespaces=self.ns
443+
)[0].text
444+
data_vencimento_1 = self.xml_assinado.xpath(
445+
"//ns:cobr/ns:dup/ns:dVenc", namespaces=self.ns
446+
)[0].text
447+
valor_duplicata_1 = self.xml_assinado.xpath(
448+
"//ns:cobr/ns:dup/ns:vDup", namespaces=self.ns
449+
)[0].text
450+
451+
numero_duplicata_2 = self.xml_assinado.xpath(
452+
"//ns:cobr/ns:dup/ns:nDup", namespaces=self.ns
453+
)[1].text
454+
data_vencimento_2 = self.xml_assinado.xpath(
455+
"//ns:cobr/ns:dup/ns:dVenc", namespaces=self.ns
456+
)[1].text
457+
valor_duplicata_2 = self.xml_assinado.xpath(
458+
"//ns:cobr/ns:dup/ns:vDup", namespaces=self.ns
459+
)[1].text
460+
461+
numero_duplicata_3 = self.xml_assinado.xpath(
462+
"//ns:cobr/ns:dup/ns:nDup", namespaces=self.ns
463+
)[2].text
464+
data_vencimento_3 = self.xml_assinado.xpath(
465+
"//ns:cobr/ns:dup/ns:dVenc", namespaces=self.ns
466+
)[2].text
467+
valor_duplicata_3 = self.xml_assinado.xpath(
468+
"//ns:cobr/ns:dup/ns:vDup", namespaces=self.ns
469+
)[2].text
470+
471+
self.assertEqual(numero_duplicata_1, "1")
472+
self.assertEqual(data_vencimento_1, "2025-01-27")
473+
self.assertEqual(valor_duplicata_1, "39.00")
474+
475+
self.assertEqual(numero_duplicata_2, "1")
476+
self.assertEqual(data_vencimento_2, "2025-01-28")
477+
self.assertEqual(valor_duplicata_2, "39.00")
478+
479+
self.assertEqual(numero_duplicata_3, "1")
480+
self.assertEqual(data_vencimento_3, "2025-01-29")
481+
self.assertEqual(valor_duplicata_3, "39.00")
482+
399483
def responsavel_tecnico_test(self):
400484
cnpj = self.xml_assinado.xpath("//ns:infRespTec/ns:CNPJ", namespaces=self.ns)[
401485
0
@@ -437,6 +521,8 @@ def test_notafiscal_geral(self):
437521
self.dados_emitente_test()
438522
self.dados_destinatario_test()
439523
self.notas_referenciadas_test()
524+
self.fatura_test()
525+
self.duplicatas_test()
440526
self.responsavel_tecnico_test()
441527
self.digestvalue_da_assinatura_test()
442528

0 commit comments

Comments
 (0)