Skip to content

Commit 1316958

Browse files
authored
Implementação da consulta de CTe pela Chave (#401)
* Implementação da consulta de CTe pelo XML * Testes unitários
1 parent 4e647b3 commit 1316958

4 files changed

Lines changed: 64 additions & 0 deletions

File tree

pynfe/processamento/comunicacao.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,6 +1246,17 @@ def consulta_distribuicao(self, cnpj=None, cpf=None, chave=None, nsu=0, consulta
12461246
# Monta XML para envio da requisição
12471247
xml = self._construir_xml_soap("CTeDistribuicaoDFe", raiz)
12481248
return self._post(url, xml)
1249+
1250+
def consulta(self, chave):
1251+
url = self._get_url("CONSULTA")
1252+
# Monta XML do corpo da requisição
1253+
raiz = etree.Element("consSitCTe", versao=self._versao, xmlns=NAMESPACE_CTE)
1254+
etree.SubElement(raiz, "tpAmb").text = str(self._ambiente)
1255+
etree.SubElement(raiz, "xServ").text = "CONSULTAR"
1256+
etree.SubElement(raiz, "chCTe").text = chave
1257+
# Monta XML para envio da requisição
1258+
xml = self._construir_xml_soap("cteConsultaCT", raiz)
1259+
return self._post(url, xml)
12491260

12501261
def _get_url_an(self, consulta):
12511262
ambiente = "https://www1." # produção

pynfe/utils/webservices.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,41 +552,49 @@
552552
},
553553
"MT": {
554554
"STATUS": "sefaz.mt.gov.br/ctews/services/CteStatusServico",
555+
"CONSULTA": "sefaz.mt.gov.br/ctews2/services/CTeConsultaV4?wsdl",
555556
"HTTPS": "https://cte.",
556557
"HOMOLOGACAO": "https://homologacao.",
557558
},
558559
"MS": {
559560
"STATUS": "cte.ms.gov.br/ws/CteStatusServico",
561+
"CONSULTA": "cte.ms.gov.br/ws/CTeConsultaV4",
560562
"HTTPS": "https://producao.",
561563
"HOMOLOGACAO": "https://homologacao.",
562564
},
563565
"MG": {
564566
"STATUS": "fazenda.mg.gov.br/cte/services/CteStatusServico",
567+
"CONSULTA": "fazenda.mg.gov.br/cte/services/CTeConsultaV4",
565568
"HTTPS": "https://cte.",
566569
"HOMOLOGACAO": "https://hcte.",
567570
},
568571
"PR": {
569572
"STATUS": "fazenda.pr.gov.br/cte/CteStatusServico?wsdl",
573+
"CONSULTA": "fazenda.pr.gov.br/cte4/CTeConsultaV4?wsdl",
570574
"HTTPS": "https://cte.",
571575
"HOMOLOGACAO": "https://homologacao.",
572576
},
573577
"RS": {
574578
"STATUS": "svrs.rs.gov.br/ws/ctestatusservico/CteStatusServico.asmx",
579+
"CONSULTA": "svrs.rs.gov.br/ws/CTeConsultaV4/CTeConsultaV4.asmx",
575580
"HTTPS": "https://cte.",
576581
"HOMOLOGACAO": "https://cte-homologacao.",
577582
},
578583
"SP": {
579584
"STATUS": "fazenda.sp.gov.br/cteWEB/services/cteStatusServico.asmx",
585+
"CONSULTA": "fazenda.sp.gov.br/CTeWS/WS/CTeConsultaV4.asmx",
580586
"HTTPS": "https://nfe.",
581587
"HOMOLOGACAO": "https://homologacao.nfe.",
582588
},
583589
"SVRS": {
584590
"STATUS": "svrs.rs.gov.br/ws/ctestatusservico/CteStatusServico.asmx",
591+
"CONSULTA": "svrs.rs.gov.br/ws/CTeConsultaV4/CTeConsultaV4.asmx",
585592
"HTTPS": "https://cte.",
586593
"HOMOLOGACAO": "https://cte-homologacao.",
587594
},
588595
"SVSP": {
589596
"STATUS": "fazenda.sp.gov.br/cteWEB/services/CteStatusServico.asmx",
597+
"CONSULTA": "fazenda.sp.gov.br/CTeWS/WS/CTeConsultaV4.asmx",
590598
"HTTPS": "https://nfe.",
591599
"HOMOLOGACAO": "https://homologacao.nfe.",
592600
},

tests/processamento/__init__.py

Whitespace-only changes.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import unittest
2+
from unittest.mock import MagicMock
3+
from pynfe.processamento.comunicacao import ComunicacaoCTe
4+
from pynfe.utils import etree
5+
6+
7+
class TestComunicacaoCTe(unittest.TestCase):
8+
"""
9+
Testa a classe ComunicacaoCTe
10+
"""
11+
12+
def test_consulta(self):
13+
chave = '35190912345678000123570010000000011000000018'
14+
url_esperada = 'https://url.ficticia/consulta'
15+
resposta_mock = '<resposta>ok</resposta>'
16+
17+
comunicacao = ComunicacaoCTe(
18+
uf="rs",
19+
certificado="./tests/certificado.pfx",
20+
certificado_senha=bytes("123456", "utf-8"),
21+
homologacao=True
22+
)
23+
comunicacao._versao = "3.00"
24+
comunicacao._ambiente = 1
25+
comunicacao._get_url = MagicMock(return_value=url_esperada)
26+
comunicacao._construir_xml_soap = MagicMock(side_effect=lambda metodo, xml: f"<soap>{etree.tostring(xml).decode()}</soap>")
27+
comunicacao._post = MagicMock(return_value=resposta_mock)
28+
29+
resposta = comunicacao.consulta(chave)
30+
xml_gerado = comunicacao._construir_xml_soap.call_args[0][1]
31+
chave_extraida = xml_gerado.find(".//{*}chCTe").text
32+
33+
comunicacao._get_url.assert_called_once_with("CONSULTA")
34+
comunicacao._construir_xml_soap.assert_called_once()
35+
comunicacao._post.assert_called_once_with(url_esperada, f"<soap>{etree.tostring(xml_gerado).decode()}</soap>")
36+
self.assertEqual(resposta, resposta_mock)
37+
self.assertEqual(chave_extraida, chave)
38+
self.assertEqual(xml_gerado.find(".//{*}tpAmb").text, "1")
39+
self.assertEqual(xml_gerado.find(".//{*}xServ").text, "CONSULTAR")
40+
self.assertTrue(xml_gerado.tag.endswith("consSitCTe"))
41+
self.assertIn("xmlns", xml_gerado.attrib)
42+
43+
44+
if __name__ == '__main__':
45+
unittest.main()

0 commit comments

Comments
 (0)