Skip to content

Commit 9676264

Browse files
committed
Criação de testes para pis cofins da nfce
1 parent 4a15313 commit 9676264

File tree

2 files changed

+296
-6
lines changed

2 files changed

+296
-6
lines changed

pynfe/processamento/serializacao.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,9 +1123,7 @@ def _serializar_imposto_pis(
11231123
((produto_servico.pis_valor_base_calculo == 0) and
11241124
(produto_servico.pis_aliquota_percentual == 0) and
11251125
(produto_servico.pis_valor == 0) and
1126-
(produto_servico.quantidade_comercial == 0) and
1127-
(produto_servico.pis_aliquota_reais == 0) and
1128-
(produto_servico.pis_modalidade not in ["04", "05", "06", "07", "08", "09", "49", "99"])):
1126+
(produto_servico.pis_modalidade not in ("04", "05", "06", "07", "08", "09", "49", "99"))):
11291127
return
11301128

11311129
pisnt = ("04", "05", "06", "07", "08", "09")
@@ -1198,9 +1196,7 @@ def _serializar_imposto_cofins(
11981196
((produto_servico.cofins_valor_base_calculo == 0) and
11991197
(produto_servico.cofins_aliquota_percentual == 0) and
12001198
(produto_servico.cofins_valor == 0) and
1201-
(produto_servico.quantidade_comercial == 0) and
1202-
(produto_servico.cofins_aliquota_reais == 0) and
1203-
(produto_servico.cofins_modalidade not in ["04", "05", "06", "07", "08", "09", "49", "99"])):
1199+
(produto_servico.cofins_modalidade not in ("04", "05", "06", "07", "08", "09", "49", "99"))):
12041200
return
12051201

12061202
cofinsnt = ("04", "05", "06", "07", "08", "09")
Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
#!/usr/bin/env python
2+
# *-* encoding: utf8 *-*
3+
4+
import datetime
5+
import unittest
6+
from decimal import Decimal
7+
8+
from pynfe.entidades.emitente import Emitente
9+
from pynfe.entidades.fonte_dados import _fonte_dados
10+
from pynfe.entidades.notafiscal import NotaFiscal
11+
from pynfe.processamento.assinatura import AssinaturaA1
12+
from pynfe.processamento.serializacao import SerializacaoXML
13+
from pynfe.processamento.validacao import Validacao
14+
from pynfe.utils.flags import (
15+
CODIGO_BRASIL,
16+
NAMESPACE_NFE,
17+
NAMESPACE_SIG,
18+
XSD_FOLDER_NFE,
19+
XSD_NFE,
20+
XSD_NFE_PROCESSADA,
21+
)
22+
# from pynfe.utils import etree
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, xsd_folder=XSD_FOLDER_NFE
44+
)
45+
self.xsd_nfe = self.validacao.get_xsd(
46+
xsd_file=XSD_NFE, xsd_folder=XSD_FOLDER_NFE
47+
)
48+
49+
def preenche_emitente(self):
50+
self.emitente = Emitente(
51+
razao_social="NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
52+
nome_fantasia="Nome Fantasia da Empresa",
53+
cnpj="99999999000199", # cnpj apenas números
54+
codigo_de_regime_tributario="3", # 1 para simples nacional ou 3 para normal
55+
inscricao_estadual="9999999999", # numero de IE da empresa
56+
inscricao_municipal="12345",
57+
cnae_fiscal="9999999", # cnae apenas números
58+
endereco_logradouro="Rua da Paz",
59+
endereco_numero="666",
60+
endereco_bairro="Sossego",
61+
endereco_municipio="Paranavaí",
62+
endereco_uf="PR",
63+
endereco_cep="87704000",
64+
endereco_pais=CODIGO_BRASIL,
65+
)
66+
return self.emitente
67+
68+
def preenche_notafiscal_produto_com_piscofins(self):
69+
utc = datetime.timezone.utc
70+
data_emissao = datetime.datetime(2021, 1, 14, 12, 0, 0, tzinfo=utc)
71+
data_saida_entrada = datetime.datetime(2021, 1, 14, 13, 10, 20, tzinfo=utc)
72+
73+
self.notafiscal = NotaFiscal(
74+
emitente=self.emitente,
75+
cliente=None,
76+
uf="PR",
77+
natureza_operacao="VENDA", # venda, compra, transferência, devolução, etc
78+
forma_pagamento=0, # 0=Pagamento à vista; 1=Pagamento a prazo; 2=Outros.
79+
tipo_pagamento=1,
80+
modelo=65, # 55=NF-e; 65=NFC-e
81+
serie="1",
82+
numero_nf="111", # Número do Documento Fiscal.
83+
data_emissao=data_emissao,
84+
data_saida_entrada=data_saida_entrada,
85+
tipo_documento=1, # 0=entrada; 1=saida
86+
municipio="4118402", # Código IBGE do Município
87+
tipo_impressao_danfe=1, # 1=DANFE normal
88+
forma_emissao="1", # 1=Emissão normal (não em contingência);
89+
cliente_final=1, # 0=Normal;1=Consumidor final;
90+
indicador_destino=1,
91+
indicador_presencial=1,
92+
finalidade_emissao="1", # 1=NF-e normal
93+
processo_emissao="0", # 0=Emissão de NF-e com aplicativo do contribuinte;
94+
transporte_modalidade_frete=1,
95+
informacoes_adicionais_interesse_fisco="Mensagem complementar",
96+
totais_tributos_aproximado=Decimal("1.01"),
97+
valor_troco=Decimal('3.00'),
98+
)
99+
100+
self.notafiscal.adicionar_produto_servico(
101+
codigo="000328", # id do produto
102+
descricao="Produto teste",
103+
ncm="99999999",
104+
# cest='0100100', # NT2015/003
105+
ean="1234567890121",
106+
cfop="5102",
107+
unidade_comercial="UN",
108+
quantidade_comercial=Decimal("12"),
109+
valor_unitario_comercial=Decimal("9.67"),
110+
valor_total_bruto=Decimal("116.03999999999999"),
111+
unidade_tributavel="UN",
112+
quantidade_tributavel=Decimal("12"),
113+
valor_unitario_tributavel=Decimal("9.67"),
114+
ean_tributavel="SEM GTIN",
115+
ind_total=1,
116+
icms_modalidade="00",
117+
icms_origem=0,
118+
icms_csosn="",
119+
pis_modalidade="51",
120+
pis_valor_base_calculo=Decimal("116.03999999999999"),
121+
pis_aliquota_percentual=Decimal("0.65"),
122+
pis_valor=Decimal("0.79"),
123+
cofins_modalidade="51",
124+
cofins_valor_base_calculo=Decimal("116.03999999999999"),
125+
cofins_aliquota_percentual=Decimal("3.00"),
126+
cofins_valor=Decimal("3.48"),
127+
valor_tributos_aprox="1.01",
128+
)
129+
130+
def preenche_notafiscal_produto_sem_piscofins(self):
131+
utc = datetime.timezone.utc
132+
data_emissao = datetime.datetime(2021, 1, 14, 12, 0, 0, tzinfo=utc)
133+
data_saida_entrada = datetime.datetime(2021, 1, 14, 13, 10, 20, tzinfo=utc)
134+
135+
self.notafiscal = NotaFiscal(
136+
emitente=self.emitente,
137+
cliente=None,
138+
uf="PR",
139+
natureza_operacao="VENDA", # venda, compra, transferência, devolução, etc
140+
forma_pagamento=0, # 0=Pagamento à vista; 1=Pagamento a prazo; 2=Outros.
141+
tipo_pagamento=1,
142+
modelo=65, # 55=NF-e; 65=NFC-e
143+
serie="1",
144+
numero_nf="111", # Número do Documento Fiscal.
145+
data_emissao=data_emissao,
146+
data_saida_entrada=data_saida_entrada,
147+
tipo_documento=1, # 0=entrada; 1=saida
148+
municipio="4118402", # Código IBGE do Município
149+
tipo_impressao_danfe=1, # 1=DANFE normal
150+
forma_emissao="1", # 1=Emissão normal (não em contingência);
151+
cliente_final=1, # 0=Normal;1=Consumidor final;
152+
indicador_destino=1,
153+
indicador_presencial=1,
154+
finalidade_emissao="1", # 1=NF-e normal
155+
processo_emissao="0", # 0=Emissão de NF-e com aplicativo do contribuinte;
156+
transporte_modalidade_frete=1,
157+
informacoes_adicionais_interesse_fisco="Mensagem complementar",
158+
totais_tributos_aproximado=Decimal("1.01"),
159+
valor_troco=Decimal('3.00'),
160+
)
161+
162+
self.notafiscal.adicionar_produto_servico(
163+
codigo="000328", # id do produto
164+
descricao="Produto teste",
165+
ncm="99999999",
166+
# cest='0100100', # NT2015/003
167+
ean="1234567890121",
168+
cfop="5102",
169+
unidade_comercial="UN",
170+
quantidade_comercial=Decimal("12"),
171+
valor_unitario_comercial=Decimal("9.67"),
172+
valor_total_bruto=Decimal("116.03999999999999"),
173+
unidade_tributavel="UN",
174+
quantidade_tributavel=Decimal("12"),
175+
valor_unitario_tributavel=Decimal("9.67"),
176+
ean_tributavel="SEM GTIN",
177+
ind_total=1,
178+
icms_modalidade="00",
179+
icms_origem=0,
180+
icms_csosn="",
181+
pis_modalidade="51",
182+
cofins_modalidade="51",
183+
valor_tributos_aprox="1.01",
184+
)
185+
186+
def serializa_nfe(self):
187+
serializador = SerializacaoXML(
188+
fonte_dados=_fonte_dados, homologacao=self.homologacao, so_cpf=True
189+
)
190+
return serializador.exportar()
191+
192+
def assina_xml(self):
193+
a1 = AssinaturaA1(self.certificado, self.senha)
194+
return a1.assinar(self.xml)
195+
196+
def validacao_com_xsd_do_xml_gerado_sem_processar(self):
197+
self.validacao.validar_etree(
198+
xml_doc=self.xml_assinado, xsd_file=self.xsd_nfe, use_assert=True
199+
)
200+
201+
def validacao_pis_cofins_nao_informado(self):
202+
try:
203+
CST_PIS = self.xml_assinado.xpath(
204+
"//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:CST",
205+
namespaces=self.ns
206+
)[0].text
207+
except:
208+
CST_PIS = None
209+
self.assertEqual(CST_PIS, None)
210+
211+
try:
212+
vPIS = self.xml_assinado.xpath(
213+
"//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:vPIS",
214+
namespaces=self.ns
215+
)[0].text
216+
except:
217+
vPIS = None
218+
self.assertEqual(vPIS, None)
219+
220+
# COFINS
221+
try:
222+
CST_COFINS = self.xml_assinado.xpath(
223+
"//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:CST",
224+
namespaces=self.ns
225+
)[0].text
226+
except:
227+
CST_COFINS = None
228+
self.assertEqual(CST_COFINS, None)
229+
230+
try:
231+
vCOFINS = self.xml_assinado.xpath(
232+
"//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:vCOFINS",
233+
namespaces=self.ns
234+
)[0].text
235+
except:
236+
vCOFINS = None
237+
self.assertEqual(vCOFINS, None)
238+
239+
def validacao_pis_cofins_informado(self):
240+
CST_PIS = self.xml_assinado.xpath(
241+
"//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:CST",
242+
namespaces=self.ns
243+
)[0].text
244+
self.assertEqual(CST_PIS, "51")
245+
246+
vPIS = self.xml_assinado.xpath(
247+
"//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:vPIS",
248+
namespaces=self.ns
249+
)[0].text
250+
self.assertEqual(vPIS, "0.79")
251+
252+
# COFINS
253+
CST_COFINS = self.xml_assinado.xpath(
254+
"//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:CST",
255+
namespaces=self.ns
256+
)[0].text
257+
self.assertEqual(CST_COFINS, "51")
258+
259+
vCOFINS = self.xml_assinado.xpath(
260+
"//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:vCOFINS",
261+
namespaces=self.ns
262+
)[0].text
263+
self.assertEqual(vCOFINS, "3.48")
264+
265+
def test_notafiscal_com_pis_cofins_opcional_sem_informar(self):
266+
267+
# Preenche as classes do pynfe
268+
self.emitente = self.preenche_emitente()
269+
self.notafiscal = self.preenche_notafiscal_produto_sem_piscofins()
270+
271+
# Serializa e assina o XML
272+
self.xml = self.serializa_nfe()
273+
self.xml_assinado = self.assina_xml()
274+
# print(etree.tostring(self.xml_assinado))
275+
276+
# Validação
277+
self.validacao_pis_cofins_nao_informado()
278+
279+
def test_notafiscal_com_pis_cofins_informado(self):
280+
281+
# Preenche as classes do pynfe
282+
self.emitente = self.preenche_emitente()
283+
self.notafiscal = self.preenche_notafiscal_produto_com_piscofins()
284+
285+
# Serializa e assina o XML
286+
self.xml = self.serializa_nfe()
287+
self.xml_assinado = self.assina_xml()
288+
# print(etree.tostring(self.xml_assinado))
289+
290+
self.validacao_pis_cofins_informado()
291+
292+
293+
if __name__ == "__main__":
294+
unittest.main()

0 commit comments

Comments
 (0)