From 96079509afa24b7cdfffcf0aa81b535ffc317ab1 Mon Sep 17 00:00:00 2001 From: Bruno Vieira Costa Date: Thu, 5 Dec 2024 11:21:42 -0300 Subject: [PATCH] multiplos detalhes por consulta de cnpj --- .../nfse/sp/sao_paulo/consulta_cnpj.py | 24 +++++++++++++++---- .../nfse/sp/sao_paulo/consulta_cnpj_test.py | 10 +++++--- abstra_notas/nfse/sp/sao_paulo/envio_rps.py | 6 ++--- .../sp/sao_paulo/exemplos/consulta_cnpj.py | 5 ++-- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj.py b/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj.py index e3ef46d..52f6d2b 100644 --- a/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj.py +++ b/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj.py @@ -1,26 +1,40 @@ from .pedido import Pedido from .retorno import Retorno from dataclasses import dataclass -from lxml.etree import Element, fromstring, ElementBase +from lxml.etree import Element, fromstring, ElementBase, tostring from abstra_notas.assinatura import Assinador -from typing import Literal +from typing import Literal, List from abstra_notas.validacoes.cpfcnpj import cpf_ou_cnpj, normalizar_cpf_ou_cnpj from .remessa import Remessa from .erro import Erro @dataclass -class RetornoConsultaCNPJ(Retorno): +class RetornoConsultaCNPJDetalhe: inscricao_municipal: str emite_nfe: bool + @staticmethod + def ler_xml(xml: ElementBase) -> "RetornoConsultaCNPJDetalhe": + return RetornoConsultaCNPJDetalhe( + inscricao_municipal=xml.find(".//InscricaoMunicipal").text, + emite_nfe=xml.find(".//EmiteNFe").text == "true", + ) + + +@dataclass +class RetornoConsultaCNPJ(Retorno): + detalhes: List[RetornoConsultaCNPJDetalhe] + @staticmethod def ler_xml(xml: ElementBase) -> "RetornoConsultaCNPJ": sucesso = xml.find(".//Sucesso").text == "true" if sucesso: return RetornoConsultaCNPJ( - inscricao_municipal=xml.find(".//InscricaoMunicipal").text, - emite_nfe=xml.find(".//EmiteNFe").text == "true", + detalhes=[ + RetornoConsultaCNPJDetalhe.ler_xml(detalhe) + for detalhe in xml.findall(".//Detalhe") + ] ) else: raise ErroConsultaCNPJ( diff --git a/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj_test.py b/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj_test.py index dc91d7f..eaf6aa2 100644 --- a/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj_test.py +++ b/abstra_notas/nfse/sp/sao_paulo/consulta_cnpj_test.py @@ -1,5 +1,5 @@ from unittest import TestCase -from .consulta_cnpj import ConsultaCNPJ, RetornoConsultaCNPJ +from .consulta_cnpj import ConsultaCNPJ, RetornoConsultaCNPJ, RetornoConsultaCNPJDetalhe from pathlib import Path from lxml.etree import fromstring from .cliente import ClienteMock @@ -30,7 +30,11 @@ def test_exemplo(self): self.assertEqual( resultado, RetornoConsultaCNPJ( - emite_nfe=True, - inscricao_municipal="39616924", + detalhes=[ + RetornoConsultaCNPJDetalhe( + emite_nfe=True, + inscricao_municipal="39616924", + ) + ] ), ) diff --git a/abstra_notas/nfse/sp/sao_paulo/envio_rps.py b/abstra_notas/nfse/sp/sao_paulo/envio_rps.py index 3346b04..e9cbe9e 100644 --- a/abstra_notas/nfse/sp/sao_paulo/envio_rps.py +++ b/abstra_notas/nfse/sp/sao_paulo/envio_rps.py @@ -241,9 +241,9 @@ def __post_init__(self): if self.endereco_cep is not None: self.endereco_cep = normalizar_cep(self.endereco_cep) - assert self.endereco_bairro is None or len( - self.endereco_bairro - ) <= 30, "O bairro deve ter no máximo 30 caracteres" + assert ( + self.endereco_bairro is None or len(self.endereco_bairro) <= 30 + ), "O bairro deve ter no máximo 30 caracteres" if self.endereco_uf is not None: if isinstance(self.endereco_uf, str): diff --git a/abstra_notas/nfse/sp/sao_paulo/exemplos/consulta_cnpj.py b/abstra_notas/nfse/sp/sao_paulo/exemplos/consulta_cnpj.py index 01de4ce..fce6961 100644 --- a/abstra_notas/nfse/sp/sao_paulo/exemplos/consulta_cnpj.py +++ b/abstra_notas/nfse/sp/sao_paulo/exemplos/consulta_cnpj.py @@ -17,8 +17,9 @@ retorno = cliente.consultar_cnpj(pedido) try: - print(f"Inscrição Municipal: {retorno.inscricao_municipal}") - print(f"Emite NFe: {retorno.emite_nfe}") + for detalhe in retorno.detalhes: + print(f"Inscrição Municipal: {detalhe.inscricao_municipal}") + print(f"Emite NFe: {detalhe.emite_nfe}") except Erro as e: print(f"Código: {e.codigo}") print(f"Descrição: {e.descricao}")