Skip to content

Commit d4aab02

Browse files
authored
Merge pull request #188 from leogregianin/tests/add-more
Aumenta cobertura de testes
2 parents 8204b66 + 95c5914 commit d4aab02

15 files changed

+4215
-1946
lines changed

pynfe/processamento/serializacao.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,8 @@ def _serializar_imposto_icms(self, produto_servico, tag_raiz='imposto', retorna_
371371
icms_item = etree.SubElement(icms, 'ICMS'+produto_servico.icms_modalidade)
372372
etree.SubElement(icms_item, 'orig').text = str(produto_servico.icms_origem)
373373
etree.SubElement(icms_item, 'CST').text = produto_servico.icms_modalidade
374+
etree.SubElement(icms_item, 'modBC').text = str(produto_servico.icms_modalidade_determinacao_bc)
375+
etree.SubElement(icms_item, 'vBC').text = str(produto_servico.icms_valor_base_calculo) # Valor da BC do ICMS
374376
etree.SubElement(icms_item, 'pICMS').text = '{:.2f}'.format(produto_servico.icms_aliquota or 0) # Alíquota do imposto
375377
etree.SubElement(icms_item, 'vICMS').text = '{:.2f}'.format(produto_servico.icms_valor or 0) # Valor do ICMS
376378

tests/test_nfce_serializacao.py

Lines changed: 386 additions & 0 deletions
Large diffs are not rendered by default.

tests/test_nfe_serializacao.py

Lines changed: 0 additions & 1946 deletions
This file was deleted.

tests/test_nfe_serializacao_cst_00.py

Lines changed: 332 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 324 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,324 @@
1+
#!/usr/bin/env python
2+
# *-* encoding: utf8 *-*
3+
4+
import unittest
5+
6+
from pynfe.entidades.cliente import Cliente
7+
from pynfe.entidades.emitente import Emitente
8+
from pynfe.entidades.notafiscal import NotaFiscal
9+
from pynfe.entidades.fonte_dados import _fonte_dados
10+
from pynfe.processamento.serializacao import SerializacaoXML
11+
from pynfe.processamento.assinatura import AssinaturaA1
12+
from pynfe.processamento.validacao import Validacao
13+
from pynfe.utils.flags import (
14+
CODIGO_BRASIL,
15+
NAMESPACE_NFE,
16+
NAMESPACE_SIG,
17+
XSD_FOLDER_NFE,
18+
XSD_NFE,
19+
XSD_NFE_PROCESSADA,
20+
)
21+
from decimal import Decimal
22+
import datetime
23+
24+
25+
class SerializacaoNFeTestCase(unittest.TestCase):
26+
"""
27+
Imprimir o XML completo:
28+
print(etree.tostring(self.xml_assinado))
29+
30+
"""
31+
32+
def setUp(self):
33+
self.certificado = "./tests/certificado.pfx"
34+
self.senha = bytes('123456', 'utf-8')
35+
self.uf = 'pr'
36+
self.homologacao = True
37+
38+
self.ns = {'ns': NAMESPACE_NFE}
39+
self.ns_sig = {'ns': NAMESPACE_SIG}
40+
41+
self.validacao = Validacao()
42+
self.xsd_procNFe = self.validacao.get_xsd(
43+
xsd_file=XSD_NFE_PROCESSADA,
44+
xsd_folder=XSD_FOLDER_NFE
45+
)
46+
self.xsd_nfe = self.validacao.get_xsd(
47+
xsd_file=XSD_NFE,
48+
xsd_folder=XSD_FOLDER_NFE
49+
)
50+
51+
def preenche_emitente(self):
52+
self.emitente = Emitente(
53+
razao_social='NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
54+
nome_fantasia='Nome Fantasia da Empresa',
55+
cnpj='99999999000199', # cnpj apenas números
56+
codigo_de_regime_tributario='1', # 1 para simples nacional ou 3 para normal
57+
inscricao_estadual='9999999999', # numero de IE da empresa
58+
inscricao_municipal='12345',
59+
cnae_fiscal='9999999', # cnae apenas números
60+
endereco_logradouro='Rua da Paz',
61+
endereco_numero='666',
62+
endereco_bairro='Sossego',
63+
endereco_municipio='Paranavaí',
64+
endereco_uf='PR',
65+
endereco_cep='87704000',
66+
endereco_pais=CODIGO_BRASIL
67+
)
68+
return self.emitente
69+
70+
def preenche_destinatario(self):
71+
self.cliente = Cliente(
72+
razao_social='JOSE DA SILVA',
73+
tipo_documento='CPF', # CPF ou CNPJ
74+
75+
numero_documento='12345678900', # numero do cpf ou cnpj
76+
indicador_ie=9, # 9=Não contribuinte
77+
endereco_logradouro='Rua dos Bobos',
78+
endereco_numero='Zero',
79+
endereco_complemento='Ao lado de lugar nenhum',
80+
endereco_bairro='Aquele Mesmo',
81+
endereco_municipio='Brasilia',
82+
endereco_uf='DF',
83+
endereco_cep='12345123',
84+
endereco_pais=CODIGO_BRASIL,
85+
endereco_telefone='11912341234',
86+
)
87+
return self.cliente
88+
89+
def preenche_notafiscal_produto_cst10(self):
90+
91+
utc = datetime.timezone.utc
92+
data_emissao = datetime.datetime(2021, 1, 14, 12, 0, 0, tzinfo=utc)
93+
data_saida_entrada = datetime.datetime(2021, 1, 14, 13, 10, 20, tzinfo=utc)
94+
95+
self.notafiscal = NotaFiscal(
96+
emitente=self.emitente,
97+
cliente=self.cliente,
98+
uf='PR',
99+
natureza_operacao='VENDA', # venda, compra, transferência, devolução, etc
100+
forma_pagamento=0, # 0=Pagamento à vista; 1=Pagamento a prazo; 2=Outros.
101+
tipo_pagamento=1,
102+
modelo=55, # 55=NF-e; 65=NFC-e
103+
serie='1',
104+
numero_nf='111', # Número do Documento Fiscal.
105+
data_emissao=data_emissao,
106+
data_saida_entrada=data_saida_entrada,
107+
tipo_documento=1, # 0=entrada; 1=saida
108+
municipio='4118402', # Código IBGE do Município
109+
tipo_impressao_danfe=1, # 0=Sem geração de DANFE;1=DANFE normal, Retrato;2=DANFE normal Paisagem;3=DANFE Simplificado;4=DANFE NFC-e;
110+
forma_emissao='1', # 1=Emissão normal (não em contingência);
111+
cliente_final=1, # 0=Normal;1=Consumidor final;
112+
indicador_destino=1,
113+
indicador_presencial=1,
114+
finalidade_emissao='1', # 1=NF-e normal;2=NF-e complementar;3=NF-e de ajuste;4=Devolução de mercadoria.
115+
processo_emissao='0', # 0=Emissão de NF-e com aplicativo do contribuinte;
116+
transporte_modalidade_frete=1,
117+
informacoes_adicionais_interesse_fisco='Mensagem complementar',
118+
totais_tributos_aproximado=Decimal('21.06'),
119+
)
120+
121+
self.notafiscal.adicionar_produto_servico(
122+
codigo='000328', # id do produto
123+
descricao='Produto teste',
124+
ncm='99999999',
125+
# cest='0100100', # NT2015/003
126+
ean='1234567890121',
127+
cfop='5102',
128+
unidade_comercial='UN',
129+
quantidade_comercial=Decimal('12'), # 12 unidades
130+
valor_unitario_comercial=Decimal('9.75'), # preço unitário
131+
valor_total_bruto=Decimal('117.00'), # preço total
132+
unidade_tributavel='UN',
133+
quantidade_tributavel=Decimal('12'),
134+
valor_unitario_tributavel=Decimal('9.75'),
135+
ean_tributavel='SEM GTIN',
136+
ind_total=1,
137+
icms_modalidade='10',
138+
icms_origem=0,
139+
icms_csosn='400',
140+
pis_modalidade='51',
141+
cofins_modalidade='51',
142+
pis_valor_base_calculo=Decimal('117.00'),
143+
pis_aliquota_percentual=Decimal('0.65'),
144+
pis_valor=Decimal('0.76'),
145+
cofins_valor_base_calculo=Decimal('117.00'),
146+
cofins_aliquota_percentual=Decimal('3.00'),
147+
cofins_valor=Decimal('3.51'),
148+
valor_tributos_aprox='21.06',
149+
numero_pedido='12345',
150+
numero_item='1',
151+
nfci='12345678-AAAA-FFFF-1234-000000000000',
152+
informacoes_adicionais='Informações adicionais',
153+
ipi_valor_ipi_dev=Decimal('0.00'),
154+
pdevol=Decimal('0.00'),
155+
)
156+
self.notafiscal.adicionar_nota_fiscal_referenciada(
157+
chave_acesso='12345678901234567890123456789012345678900001'
158+
)
159+
self.notafiscal.adicionar_nota_fiscal_referenciada(
160+
chave_acesso='12345678901234567890123456789012345678900002'
161+
)
162+
163+
self.notafiscal.adicionar_responsavel_tecnico(
164+
cnpj='99999999000199',
165+
contato='Teste PyNFe',
166+
167+
fone='11912341234'
168+
)
169+
170+
def serializa_nfe(self):
171+
serializador = SerializacaoXML(_fonte_dados, homologacao=self.homologacao)
172+
return serializador.exportar()
173+
174+
def assina_xml(self):
175+
a1 = AssinaturaA1(self.certificado, self.senha)
176+
return a1.assinar(self.xml)
177+
178+
def validacao_com_xsd_do_xml_gerado_sem_processar(self):
179+
self.validacao.validar_etree(
180+
xml_doc=self.xml_assinado,
181+
xsd_file=self.xsd_nfe,
182+
use_assert=True
183+
)
184+
185+
def total_e_produto_cst10_test(self):
186+
# Produto
187+
cProd = self.xml_assinado.xpath('//ns:det/ns:prod/ns:cProd', namespaces=self.ns)[0].text
188+
cEAN = self.xml_assinado.xpath('//ns:det/ns:prod/ns:cEAN', namespaces=self.ns)[0].text
189+
xProd = self.xml_assinado.xpath('//ns:det/ns:prod/ns:xProd', namespaces=self.ns)[0].text
190+
NCM = self.xml_assinado.xpath('//ns:det/ns:prod/ns:NCM', namespaces=self.ns)[0].text
191+
# CEST = self.xml_assinado.xpath('//ns:det/ns:prod/ns:CEST', namespaces=self.ns)[0].text
192+
# indEscala = self.xml_assinado.xpath('//ns:det/ns:prod/ns:indEscala', namespaces=self.ns)[0].text
193+
CEST = None
194+
indEscala = None
195+
CFOP = self.xml_assinado.xpath('//ns:det/ns:prod/ns:CFOP', namespaces=self.ns)[0].text
196+
uCom = self.xml_assinado.xpath('//ns:det/ns:prod/ns:uCom', namespaces=self.ns)[0].text
197+
qCom = self.xml_assinado.xpath('//ns:det/ns:prod/ns:qCom', namespaces=self.ns)[0].text
198+
vUnCom = self.xml_assinado.xpath('//ns:det/ns:prod/ns:vUnCom', namespaces=self.ns)[0].text
199+
vProd = self.xml_assinado.xpath('//ns:det/ns:prod/ns:vProd', namespaces=self.ns)[0].text
200+
cEANTrib = self.xml_assinado.xpath('//ns:det/ns:prod/ns:cEANTrib', namespaces=self.ns)[0].text
201+
uTrib = self.xml_assinado.xpath('//ns:det/ns:prod/ns:uTrib', namespaces=self.ns)[0].text
202+
qTrib = self.xml_assinado.xpath('//ns:det/ns:prod/ns:qTrib', namespaces=self.ns)[0].text
203+
vUnTrib = self.xml_assinado.xpath('//ns:det/ns:prod/ns:vUnTrib', namespaces=self.ns)[0].text
204+
indTot = self.xml_assinado.xpath('//ns:det/ns:prod/ns:indTot', namespaces=self.ns)[0].text
205+
xPed = self.xml_assinado.xpath('//ns:det/ns:prod/ns:xPed', namespaces=self.ns)[0].text
206+
nItemPed = self.xml_assinado.xpath('//ns:det/ns:prod/ns:nItemPed', namespaces=self.ns)[0].text
207+
nFCI = self.xml_assinado.xpath('//ns:det/ns:prod/ns:nFCI', namespaces=self.ns)[0].text
208+
209+
self.assertEqual(cProd, '000328')
210+
self.assertEqual(cEAN, '1234567890121')
211+
self.assertEqual(xProd, 'Produto teste')
212+
self.assertEqual(NCM, '99999999')
213+
self.assertEqual(CEST, None)
214+
self.assertEqual(indEscala, None)
215+
self.assertEqual(CFOP, '5102')
216+
self.assertEqual(uCom, 'UN')
217+
self.assertEqual(qCom, '12')
218+
self.assertEqual(vUnCom, '9.7500000000')
219+
self.assertEqual(vProd, '117.00')
220+
self.assertEqual(cEANTrib, 'SEM GTIN')
221+
self.assertEqual(uTrib, 'UN')
222+
self.assertEqual(qTrib, '12')
223+
self.assertEqual(vUnTrib, '9.7500000000')
224+
self.assertEqual(indTot, '1')
225+
self.assertEqual(xPed, '12345')
226+
self.assertEqual(nItemPed, '1')
227+
self.assertEqual(nFCI, '12345678-AAAA-FFFF-1234-000000000000')
228+
229+
# Impostos
230+
# ICMS
231+
orig = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:ICMS/ns:ICMS10/ns:orig', namespaces=self.ns)[0].text
232+
CST = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:ICMS/ns:ICMS10/ns:CST', namespaces=self.ns)[0].text
233+
modBC = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:ICMS/ns:ICMS10/ns:modBC', namespaces=self.ns)[0].text
234+
vBC = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:ICMS/ns:ICMS10/ns:vBC', namespaces=self.ns)[0].text
235+
pICMS = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:ICMS/ns:ICMS10/ns:pICMS', namespaces=self.ns)[0].text
236+
vICMS = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:ICMS/ns:ICMS10/ns:vICMS', namespaces=self.ns)[0].text
237+
pFCP = None
238+
vFCP = None
239+
240+
self.assertEqual(orig, '0')
241+
self.assertEqual(CST, '10')
242+
self.assertEqual(modBC, '0')
243+
self.assertEqual(vBC, '0')
244+
self.assertEqual(pICMS, '0.00')
245+
self.assertEqual(vICMS, '0.00')
246+
# self.assertEqual(pFCP, '0.00')
247+
# self.assertEqual(vFCP, '0.00')
248+
self.assertEqual(pFCP, None)
249+
self.assertEqual(vFCP, None)
250+
251+
# PIS
252+
CST_PIS = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:CST', namespaces=self.ns)[0].text
253+
self.assertEqual(CST_PIS, '51')
254+
255+
# # COFINS
256+
CST_COFINS = self.xml_assinado.xpath('//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:CST', namespaces=self.ns)[0].text
257+
self.assertEqual(CST_COFINS, '51')
258+
259+
# Informações Adicionais do produto
260+
infAdProd = self.xml_assinado.xpath('//ns:det/ns:infAdProd', namespaces=self.ns)[0].text
261+
self.assertEqual(infAdProd, 'Informacoes adicionais')
262+
263+
# Totalizadores
264+
vBC = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vBC', namespaces=self.ns)[0].text
265+
vICMS = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vICMS', namespaces=self.ns)[0].text
266+
vICMSDeson = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vICMSDeson', namespaces=self.ns)[0].text
267+
vFCP = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vFCP', namespaces=self.ns)[0].text
268+
vBCST = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vBCST', namespaces=self.ns)[0].text
269+
vST = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vST', namespaces=self.ns)[0].text
270+
vFCPST = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vFCPST', namespaces=self.ns)[0].text
271+
vFCPSTRet = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vFCPSTRet', namespaces=self.ns)[0].text
272+
vProd = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vProd', namespaces=self.ns)[0].text
273+
vFrete = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vFrete', namespaces=self.ns)[0].text
274+
vSeg = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vSeg', namespaces=self.ns)[0].text
275+
vDesc = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vDesc', namespaces=self.ns)[0].text
276+
vII = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vII', namespaces=self.ns)[0].text
277+
vIPI = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vIPI', namespaces=self.ns)[0].text
278+
vIPIDevol = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vIPIDevol', namespaces=self.ns)[0].text
279+
vPIS = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vPIS', namespaces=self.ns)[0].text
280+
vCOFINS = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vCOFINS', namespaces=self.ns)[0].text
281+
vOutro = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vOutro', namespaces=self.ns)[0].text
282+
vNF = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vNF', namespaces=self.ns)[0].text
283+
vTotTrib = self.xml_assinado.xpath('//ns:total/ns:ICMSTot/ns:vTotTrib', namespaces=self.ns)[0].text
284+
285+
self.assertEqual(vBC, '0.00')
286+
self.assertEqual(vICMS, '0.00')
287+
self.assertEqual(vICMSDeson, '0.00')
288+
self.assertEqual(vFCP, '0.00')
289+
self.assertEqual(vBCST, '0.00')
290+
self.assertEqual(vST, '0.00')
291+
self.assertEqual(vFCPST, '0.00')
292+
self.assertEqual(vFCPSTRet, '0.00')
293+
self.assertEqual(vProd, '117.00')
294+
self.assertEqual(vFrete, '0.00')
295+
self.assertEqual(vSeg, '0.00')
296+
self.assertEqual(vDesc, '0.00')
297+
self.assertEqual(vII, '0.00')
298+
self.assertEqual(vIPI, '0.00')
299+
self.assertEqual(vIPIDevol, '0.00')
300+
self.assertEqual(vPIS, '0.76')
301+
self.assertEqual(vCOFINS, '3.51')
302+
self.assertEqual(vOutro, '0.00')
303+
self.assertEqual(vNF, '117.00')
304+
self.assertEqual(vTotTrib, '21.06')
305+
306+
def test_notafiscal_produto_cst10(self):
307+
# Preenche as classes do pynfe
308+
self.emitente = self.preenche_emitente()
309+
self.cliente = self.preenche_destinatario()
310+
self.notafiscal = self.preenche_notafiscal_produto_cst10()
311+
312+
# Serializa e assina o XML
313+
self.xml = self.serializa_nfe()
314+
self.xml_assinado = self.assina_xml()
315+
316+
# Teste do conteúdo das tags do XML
317+
self.total_e_produto_cst10_test()
318+
319+
# Testa a validação do XML com os schemas XSD
320+
self.validacao_com_xsd_do_xml_gerado_sem_processar()
321+
322+
323+
if __name__ == '__main__':
324+
unittest.main()

0 commit comments

Comments
 (0)