Skip to content

Commit f14eed0

Browse files
committed
Adiciona teste para NFCe somente com CPF
1 parent 0ed653e commit f14eed0

1 file changed

Lines changed: 366 additions & 0 deletions

File tree

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

0 commit comments

Comments
 (0)