diff --git a/pynfe/processamento/autorizador_nfse.py b/pynfe/processamento/autorizador_nfse.py index 369d2df..8144f81 100644 --- a/pynfe/processamento/autorizador_nfse.py +++ b/pynfe/processamento/autorizador_nfse.py @@ -242,8 +242,10 @@ class SerializacaoGinfes(InterfaceAutorizador): # importa global _tipos, servico_consultar_nfse_envio_v03 global servico_enviar_lote_rps_envio_v03, cabecalho_v03 + global servico_cancelar_nfse_envio_v03 _tipos = import_module('pynfe.utils.nfse.ginfes._tipos') servico_consultar_nfse_envio_v03 = import_module('pynfe.utils.nfse.ginfes.servico_consultar_nfse_envio_v03') + servico_cancelar_nfse_envio_v03 = import_module('pynfe.utils.nfse.ginfes.servico_cancelar_nfse_envio_v03') servico_enviar_lote_rps_envio_v03 = import_module('pynfe.utils.nfse.ginfes.servico_enviar_lote_rps_envio_v03') cabecalho_v03 = import_module('pynfe.utils.nfse.ginfes.cabecalho_v03') @@ -365,6 +367,33 @@ class SerializacaoGinfes(InterfaceAutorizador): enviarLote.LoteRps = lote return enviarLote.toxml(element_name='ns1:EnviarLoteRpsEnvio') + def cancelar(self, nfse): + """Retorna string de um XML gerado a partir do + XML Schema (XSD). Binding gerado pelo modulo PyXB.""" + # id nfse + id_nfse = _tipos.tcIdentificacaoNfse() + id_nfse.Numero = nfse.identificador + id_nfse.Cnpj = nfse.emitente.cnpj + id_nfse.InscricaoMunicipal = nfse.emitente.inscricao_municipal + id_nfse.CodigoMunicipio = nfse.emitente.endereco_cod_municipio + + # Info Pedido de cancelamento + info_pedido = _tipos.tcInfPedidoCancelamento() + info_pedido.Id = '1' + info_pedido.IdentificacaoNfse = id_nfse + info_pedido.CodigoCancelamento = 'C001' + + # Pedido + pedido = _tipos.tcPedidoCancelamento() + pedido.InfPedidoCancelamento = info_pedido + + # Cancelamento + cancelar = servico_cancelar_nfse_envio_v03.CancelarNfseEnvio() + cancelar.Pedido = pedido + + return cancelar.toxml(element_name='CancelarNfseEnvio') + + def cabecalho(self): # info cabecalho = cabecalho_v03.cabecalho() diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index 3f15639..4143e1d 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -427,16 +427,28 @@ class ComunicacaoNfse(Comunicacao): # comunica via wsdl return self._post2(url, xml, 'consultaFaixa') - def cancelar(self, autorizador, nota): + def cancelar(self, autorizador, xml): + # url do serviço + url = self._get_url(autorizador) + # Betha if autorizador.upper() == 'BETHA': self._namespace = NAMESPACE_BETHA self._versao = '2.02' - # url do serviço - url = self._get_url(autorizador) - # xml - xml = etree.tostring(nota, encoding='unicode', pretty_print=False) - # comunica via wsdl - return self._post2(url, xml, 'cancelar') + # comunica via wsdl + return self._post(url, xml, 'cancelar') + # Ginfes + elif autorizador.upper() == 'GINFES': + self._namespace = 'http://www.ginfes.com.br/cabecalho_v03.xsd' + self._versao = '3' + # xml + xml = '' + xml + # comunica via wsdl + return xml + #return self._post_https(url, xml, 'consulta') + # TODO outros autorizadres + else: + raise Exception('Autorizador não suportado!') + def _cabecalho(self, retorna_string=True): u"""Monta o XML do cabeçalho da requisição wsdl""" diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 758909e..94106b6 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -612,7 +612,16 @@ class SerializacaoNfse(object): if self.autorizador.lower() == 'ginfes': from pynfe.processamento.autorizador_nfse import SerializacaoGinfes return SerializacaoGinfes().consultar_nfse(emitente, numero, inicio, fim) - + + def cancelar(self, nfse): + if self.autorizador.lower() == 'ginfes': + from pynfe.processamento.autorizador_nfse import SerializacaoGinfes + return SerializacaoGinfes().cancelar(nfse) + elif self.autorizador.lower() == 'betha': + from pynfe.processamento.autorizador_nfse import SerializacaoBetha + return SerializacaoBetha().cancelar(nfse) + else: + raise Exception('Autorizador não suportado para cancelamento!') class SerializacaoPipes(Serializacao): """Serialização utilizada pela SEFAZ-SP para a importação de notas.""" diff --git a/pynfe/utils/nfse/ginfes/servico_cancelar_nfse_envio_v03.py b/pynfe/utils/nfse/ginfes/servico_cancelar_nfse_envio_v03.py index 02bbf02..5b3c22c 100644 --- a/pynfe/utils/nfse/ginfes/servico_cancelar_nfse_envio_v03.py +++ b/pynfe/utils/nfse/ginfes/servico_cancelar_nfse_envio_v03.py @@ -24,8 +24,8 @@ if pyxb.__version__ != _PyXBVersion: raise pyxb.PyXBVersionError(_PyXBVersion) # Import bindings for namespaces imported into schema -import _tipos as _ImportedBinding__tipos -import _dsig as _ImportedBinding__dsig +from pynfe.utils.nfse.ginfes import _tipos as _ImportedBinding__tipos +from pynfe.utils.nfse.ginfes import _dsig as _ImportedBinding__dsig import pyxb.binding.datatypes # NOTE: All namespace declarations are reserved within the binding