def cancel_api(certificate, password, vals):
    cert_pfx = base64.decodestring(certificate)
    certificado = Certificado(cert_pfx, password)
    canc = {
        'cnpj_remetente': vals['cnpj_cpf'],
        'inscricao_municipal': vals['inscricao_municipal'],
        'numero_nfse': vals['numero'],
        'codigo_verificacao': vals['protocolo_nfe'],
        'assinatura': '%s%012d' % (
            vals['inscricao_municipal'],
            vals['numero'],
        )
    }

    if vals['ambiente'] == 'homologacao':
        return {
            'code': 200,
            'message': 'Nota Fiscal Cancelada',
        }

    resposta = cancelamento_nfe(certificado, cancelamento=canc)
    retorno = resposta['object']
    if retorno.Cabecalho.Sucesso:
        return {
            'code': 200,
            'message': 'Nota Fiscal Cancelada',
        }
    else:
        return {
            'code': 400,
            'api_code': retorno.Erro.Codigo,
            'message': retorno.Erro.Descricao,
        }
예제 #2
0
    def cancel_nfse(self):
        if self.city_code == '50308':  # São Paulo
            pfx_stream = base64.b64decode(self.certificate)
            certificado = Certificado(pfx_stream, self.password)

            company = self.invoice_id.company_id
            canc = {
                'cnpj_remetente':
                re.sub('[^0-9]', '', company.cnpj_cpf),
                'inscricao_municipal':
                re.sub('[^0-9]', '', company.inscr_mun),
                'numero_nfse':
                self.invoice_id.internal_number,
                'codigo_verificacao':
                self.invoice_id.verify_code,
                'assinatura':
                '%s%s' % (re.sub('[^0-9]', '', company.inscr_mun),
                          self.invoice_id.internal_number.zfill(12))
            }
            resposta = cancelamento_nfe(certificado, cancelamento=canc)

            status = self._create_status(resposta, 'cancelamento')
            return status

        return super(BaseNfse, self).cancel_nfse()
예제 #3
0
    def action_cancel_document(self, context=None, justificativa=None):
        if self.model not in ('001'):
            return super(
                InvoiceEletronic,
                self).action_cancel_document(justificativa=justificativa)

        _logger.info('Cancelling NFS-e Paulistana (%s)' % self.numero)
        cert = self.company_id.with_context({'bin_size': False}).nfe_a1_file
        cert_pfx = base64.decodestring(cert)
        certificado = Certificado(cert_pfx, self.company_id.nfe_a1_password)

        if self.ambiente == 'homologacao' or \
           self.company_id.tipo_ambiente_nfse == 'homologacao':
            self.state = 'cancel'
            self.codigo_retorno = '100'
            self.mensagem_retorno = 'Nota Fiscal Paulistana Cancelada'
            return
        company = self.company_id
        canc = {
            'cnpj_remetente':
            re.sub('[^0-9]', '', company.cnpj_cpf),
            'inscricao_municipal':
            re.sub('[^0-9]', '', company.inscr_mun),
            'numero_nfse':
            self.numero_nfse,
            'codigo_verificacao':
            self.verify_code,
            'assinatura':
            '%s%s' % (re.sub('[^0-9]', '',
                             company.inscr_mun), self.numero_nfse.zfill(12))
        }
        resposta = cancelamento_nfe(certificado, cancelamento=canc)
        retorno = resposta['object']
        if retorno.Cabecalho.Sucesso:
            self.write({
                'state': 'cancel',
                'codigo_retorno': '100',
                'mensagem_retorno': 'Nota Fiscal Paulistana Cancelada',
            })
        else:
            self.write({
                'codigo_retorno': retorno.Erro.Codigo,
                'mensagem_retorno': retorno.Erro.Descricao,
            })

        self.env['invoice.eletronic.event'].create({
            'code':
            self.codigo_retorno,
            'name':
            self.mensagem_retorno,
            'invoice_eletronic_id':
            self.id,
        })
        self._create_attachment('canc', self, resposta['sent_xml'])
        self._create_attachment('canc-ret', self, resposta['received_xml'])
        _logger.info('Cancelling NFS-e (%s) was finished with status %s' %
                     (self.numero, self.codigo_retorno))
예제 #4
0
    def test_cancelamento_nfse_ok(self):
        pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
        pfx = Certificado(pfx_source, '123456')
        cancelamento = self._get_cancelamento()

        path = os.path.join(os.path.dirname(__file__), 'XMLs')
        xml_return = open(os.path.join(
            path, 'paulistana_canc_ok.xml'), 'r').read()

        with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
            retorno = mock.MagicMock()
            client.return_value = retorno
            retorno.service.CancelamentoNFe.return_value = xml_return

            retorno = cancelamento_nfe(pfx, cancelamento=cancelamento)

            self.assertEqual(retorno['received_xml'], xml_return)
            self.assertEqual(retorno['object'].Cabecalho.Sucesso, True)
예제 #5
0
    def test_cancelamento_nfse_ok(self):
        pfx_source = open(os.path.join(self.caminho, "teste.pfx"), "rb").read()
        pfx = Certificado(pfx_source, "123456")
        cancelamento = self._get_cancelamento()

        path = os.path.join(os.path.dirname(__file__), "XMLs")
        xml_return = open(os.path.join(path, "paulistana_canc_ok.xml"),
                          "r").read()

        with mock.patch("pytrustnfe.nfse.paulistana.get_authenticated_client"
                        ) as client:
            retorno = mock.MagicMock()
            client.return_value = retorno
            retorno.service.CancelamentoNFe.return_value = xml_return

            retorno = cancelamento_nfe(pfx, cancelamento=cancelamento)

            self.assertEqual(retorno["received_xml"], xml_return)
            self.assertEqual(retorno["object"].Cabecalho.Sucesso, True)