예제 #1
0
    def action_send_eletronic_invoice(self):
        super(InvoiceEletronic, self).action_send_eletronic_invoice()
        if self.model == '001' and self.state not in ('done', 'cancel'):
            self.state = 'error'

            _logger.info('Sending NFS-e Paulistana (%s) %s' % (
                self.numero, self.partner_id.name))
            nfse_values = self._prepare_eletronic_invoice_values()
            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 == 'producao':
                resposta = envio_lote_rps(certificado, nfse=nfse_values)
            else:
                resposta = teste_envio_lote_rps(
                    certificado, nfse=nfse_values)
            retorno = resposta['object']
            if retorno.Cabecalho.Sucesso:
                self.write({
                    'state': 'done',
                    'codigo_retorno': '100',
                    'mensagem_retorno': 'Nota Paulistana emitida com sucesso',
                })

                # Apenas producão tem essa tag
                if self.ambiente == 'producao':
                    self.verify_code = \
                        retorno.ChaveNFeRPS.ChaveNFe.CodigoVerificacao
                    self.numero_nfse = retorno.ChaveNFeRPS.ChaveNFe \
                        .NumeroNFe

                for inv_line in self.invoice_id.invoice_line_ids:
                    if inv_line.product_id.fiscal_type == 'service':
                        inv_line.write(
                            {'state': 'transmitido',
                             'numero_nfse': self.numero_nfse})

            else:
                self.write({
                    'codigo_retorno': retorno.Erro.Codigo,
                    'mensagem_retorno': retorno.Erro.Descricao,
                })
                self.notify_user()

            self.env['invoice.eletronic.event'].create({
                'code': self.codigo_retorno,
                'name': self.mensagem_retorno,
                'invoice_eletronic_id': self.id,
            })
            self._create_attachment(
                'nfse-envio', self, resposta['sent_xml'])
            self._create_attachment(
                'nfse-ret', self, resposta['received_xml'])
            _logger.info('NFS-e Paulistana (%s) finished with status %s' % (
                self.numero, self.codigo_retorno))
예제 #2
0
    def test_envio_nfse(self):
        pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
        pfx = Certificado(pfx_source, '123456')
        rps = [
            {
                'assinatura': '123',
                'serie': '1',
                'numero': '1',
                'data_emissao': '2016-08-29',
                'codigo_atividade': '07498',
                'total_servicos': '2.00',
                'total_deducoes': '3.00',
                'prestador': {
                    'inscricao_municipal': '123456'
                },
                'tomador': {
                    'tipo_cpfcnpj': '1',
                    'cpf_cnpj': '12345678923256',
                    'inscricao_municipal': '123456',
                    'razao_social': 'Trustcode',
                    'tipo_logradouro': '1',
                    'logradouro': 'Vinicius de Moraes, 42',
                    'numero': '42',
                    'bairro': 'Corrego',
                    'cidade': 'Floripa',
                    'uf': 'SC',
                    'cep': '88037240',
                },
                'codigo_atividade': '07498',
                'aliquota_atividade': '5.00',
                'descricao': 'Venda de servico'
            }
        ]
        nfse = {
            'cpf_cnpj': '12345678901234',
            'data_inicio': '2016-08-29',
            'data_fim': '2016-08-29',
            'lista_rps': rps
        }

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

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

            retorno = envio_lote_rps(pfx, nfse=nfse)

            self.assertEqual(retorno['received_xml'], xml_return)
            self.assertEqual(retorno['object'].Cabecalho.Sucesso, True)
            self.assertEqual(
                retorno['object'].ChaveNFeRPS.ChaveNFe.NumeroNFe, 446)
            self.assertEqual(
                retorno['object'].ChaveNFeRPS.ChaveRPS.NumeroRPS, 6)
예제 #3
0
    def test_nfse_signature(self):
        pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
        pfx = Certificado(pfx_source, '123456')

        nfse = self._get_nfse()
        path = os.path.join(os.path.dirname(__file__), 'XMLs')
        xml_sent = open(os.path.join(path, 'paulistana_signature.xml'),
                        'r').read()

        with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client'
                        ) as client:
            retorno = mock.MagicMock()
            client.return_value = retorno
            retorno.service.EnvioLoteRPS.return_value = '<xml></xml>'

            retorno = envio_lote_rps(pfx, nfse=nfse)
            self.assertEqual(retorno['sent_xml'], xml_sent)
예제 #4
0
    def action_send_eletronic_invoice(self):
        super(InvoiceEletronic, self).action_send_eletronic_invoice()
        if self.model == '001':
            self.state = 'error'

            nfse_values = self._prepare_eletronic_invoice_values()
            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 == 'producao':
                resposta = envio_lote_rps(certificado, nfse=nfse_values)
            else:
                resposta = teste_envio_lote_rps(certificado, nfse=nfse_values)
            retorno = resposta['object']
            if retorno.Cabecalho.Sucesso:
                self.state = 'done'
                self.codigo_retorno = '100'
                self.mensagem_retorno = \
                    'Nota Fiscal Paulistana emitida com sucesso'

                if self.ambiente == 'producao':  # Apenas producão tem essa tag
                    self.verify_code = \
                        retorno.ChaveNFeRPS.ChaveNFe.CodigoVerificacao
                    self.numero_nfse = retorno.ChaveNFeRPS.ChaveNFe.NumeroNFe

            else:
                self.codigo_retorno = retorno.Erro.Codigo
                self.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('nfse-envio', self, resposta['sent_xml'])
            self._create_attachment('nfse-ret', self, resposta['received_xml'])
예제 #5
0
    def test_nfse_signature(self):
        pfx_source = open(os.path.join(self.caminho, "teste.pfx"), "rb").read()
        pfx = Certificado(pfx_source, "123456")

        nfse = self._get_nfse()
        path = os.path.join(os.path.dirname(__file__), "XMLs")
        xml_sent = open(os.path.join(path, "paulistana_signature.xml"),
                        "r").read()

        with mock.patch("pytrustnfe.nfse.paulistana.get_authenticated_client"
                        ) as client:
            retorno = mock.MagicMock()
            client.return_value = retorno
            retorno.service.EnvioLoteRPS.return_value = "<xml></xml>"

            retorno = envio_lote_rps(pfx, nfse=nfse)
            # f = open(os.path.join(path, "paulistana_signature.xml"), "w")
            # f.write(retorno["sent_xml"])
            # f.close()
            self.assertEqual(retorno["sent_xml"], xml_sent)
예제 #6
0
    def send_rps(self):
        self.ensure_one()
        if self.city_code == '50308':  # São Paulo
            self.date_format = '%Y-%m-%d'
            nfse = self._get_nfse_object()

            pfx_stream = base64.b64decode(self.certificate)
            certificado = Certificado(pfx_stream, self.password)
            if self.invoice_id.company_id.nfse_environment == '2':
                resposta = teste_envio_lote_rps(certificado, nfse=nfse)
            else:
                resposta = envio_lote_rps(certificado, nfse=nfse)
            status = self._create_status(resposta, 'envio_rps')
            if status['success'] and \
               self.invoice_id.company_id.nfse_environment == '1':
                status['verify_code'] = \
                    resposta['object'].ChaveNFeRPS.ChaveNFe.CodigoVerificacao
                status['nfse_number'] = \
                    resposta['object'].ChaveNFeRPS.ChaveNFe.NumeroNFe
            return status

        return super(BaseNfse, self).send_rps()
예제 #7
0
    def test_envio_nfse(self):
        pfx_source = open(os.path.join(self.caminho, "teste.pfx"), "rb").read()
        pfx = Certificado(pfx_source, "123456")

        nfse = self._get_nfse()
        path = os.path.join(os.path.dirname(__file__), "XMLs")
        xml_return = open(os.path.join(path, "paulistana_resultado.xml"),
                          "r").read()

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

            retorno = envio_lote_rps(pfx, nfse=nfse)

            self.assertEqual(retorno["received_xml"], xml_return)
            self.assertEqual(retorno["object"].Cabecalho.Sucesso, True)
            self.assertEqual(retorno["object"].ChaveNFeRPS.ChaveNFe.NumeroNFe,
                             446)
            self.assertEqual(retorno["object"].ChaveNFeRPS.ChaveRPS.NumeroRPS,
                             6)
def send_api(certificate, password, edocs):
    cert_pfx = base64.decodestring(certificate)
    certificado = Certificado(cert_pfx, password)

    nfse_values = _convert_values(edocs)
    if edocs[0]['ambiente'] == 'producao':
        resposta = envio_lote_rps(certificado, nfse=nfse_values)
    else:
        resposta = teste_envio_lote_rps(certificado, nfse=nfse_values)
    retorno = resposta['object']
    if retorno.Cabecalho.Sucesso:
        if edocs[0]['ambiente'] == 'producao':
            return {
                'code': 201,
                'entity': {
                    'protocolo_nfe':
                    retorno.ChaveNFeRPS.ChaveNFe.CodigoVerificacao,
                    'numero_nfe': retorno.ChaveNFeRPS.ChaveNFe.NumeroNFe,
                },
                'xml': resposta['sent_xml'].encode('utf-8'),
            }
        else:
            return {
                'code': 201,
                'entity': {
                    'protocolo_nfe': 'homologacao',
                    'numero_nfe': 1000,
                },
                'xml': resposta['sent_xml'].encode('utf-8'),
            }
    else:
        return {
            'code': 400,
            'api_code': retorno.Erro.Codigo,
            'message': retorno.Erro.Descricao,
        }