Skip to content

Commit 0ed653e

Browse files
committed
Adiciona teste para NFCe sem cliente
1 parent 084edf0 commit 0ed653e

1 file changed

Lines changed: 354 additions & 0 deletions

File tree

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

0 commit comments

Comments
 (0)