def send_request_to_sefaz(self):
        for item in self:

            event_obj = self.env['l10n_br_account.document_event']

            validate_nfe_configuration(item.company_id)
            validate_nfe_invalidate_number(item.company_id, item)

            results = []
            try:
                processo = invalidate(item.company_id, item)
                vals = {
                    'type':
                    str(processo.webservice),
                    'status':
                    processo.resposta.infInut.cStat.valor,
                    'response':
                    '',
                    'company_id':
                    item.company_id.id,
                    'origin':
                    '[INU] {0} - {1}'.format(str(item.number_start),
                                             str(item.number_end)),
                    'message':
                    processo.resposta.infInut.xMotivo.valor,
                    'state':
                    'done',
                    # 'document_event_ids': item.id} TODO: Fix me!
                }
                results.append(vals)

            except Exception as e:
                _logger.error(e.message, exc_info=True)
                vals = {
                    'type':
                    '-1',
                    'status':
                    '000',
                    'response':
                    'response',
                    'company_id':
                    item.company_id.id,
                    'origin':
                    '[INU] {0} - {1}'.format(str(item.number_start),
                                             str(item.number_end)),
                    'file_sent':
                    'False',
                    'file_returned':
                    'False',
                    'message':
                    'Erro desconhecido ' + e.message,
                    'state':
                    'done',
                    # 'document_event_ids': item.id TODO: Fix me!
                }
                results.append(vals)
            finally:
                for result in results:
                    event_obj.create(result)
            return processo
    def action_download_xml(self):
        validate_nfe_configuration(self.company_id)
        nfe_result = download_nfe(self.company_id, [self.chNFe])
        env_events = self.env['l10n_br_account.document_event']

        if nfe_result['code'] == '140':
            event = self._create_event('Download NFe concluido',
                                       nfe_result,
                                       type_event='10')
            env_events.create(event)
            file_name = 'NFe%s.xml' % self.chNFe
            self.env['ir.attachment'].create({
                'name':
                file_name,
                'datas':
                base64.b64encode(nfe_result['file_returned']),
                'datas_fname':
                file_name,
                'description':
                u'XML NFe - Download manifesto do destinatário',
                'res_model':
                'nfe.mde',
                'res_id':
                self.id
            })

        else:
            event = self._create_event('Download NFe não efetuado',
                                       nfe_result,
                                       type_event='10')
            event = env_events.create(event)
            self._create_attachment(event, nfe_result)
        return True
Exemplo n.º 3
0
    def sefaz_check(self):

        validate_nfe_configuration(self.company_id)

        for partner in self:
            if partner.cnpj_cpf:
                cnpj_cpf = partner.cnpj_cpf

                estato = partner.state_id.code or None
                ie = partner.inscr_est or None
                ie = ie if ie != 'ISENTO' else None

                processo = check_partner(self.company_id, cnpj_cpf, estato, ie)
                xml = processo.resposta.xml.encode('utf-8')

                tree = ET.fromstring(xml)
                info = {}

                for child in tree:
                    info[child.tag[36:]] = child.text
                    for infCons in child:
                        info[infCons.tag[36:]] = infCons.text
                        for infCad in infCons:
                            info[infCad.tag[36:]] = infCad.text
                            for end in infCad:
                                info[end.tag[36:]] = end.text

                if info['cStat'] not in ('111', '112'):
                    raise orm.except_orm(
                        _("Erro ao se comunicar com o SEFAZ"),
                        _("%s - %s") % (info.get('cStat', ''),
                                        info.get('xMotivo', '')))
                if info['cSit'] not in ('1',):
                    raise orm.except_orm(
                        _("Situação Cadastral Vigente:"),
                        _("NÃO HABILITADO"))

                city_id = state_id = None
                if "cMun" in info:
                    city_id = self.env['l10n_br_base.city'].search(
                        [('ibge_code', '=', info['cMun'][2:])])[0]
                    state_id = self.env['res.country.state'].search(
                        [('ibge_code', '=', info['cMun'][:2]),
                         ('country_id.code', '=', 'BR')])[0]

                result = {
                    'district': info.get('xBairro', ''),
                    'street': info.get('xLgr', ''),
                    'zip': info.get('CEP', ''),
                    'street2': info.get('xCpl', ''),
                    'legal_name': info.get('xNome', ''),
                    'number': info.get('nro', ''),
                    'l10n_br_city_id': city_id,
                    'state_id': state_id,
                    'habilitado_sintegra': info['cSit'],
                }
                partner.write(result)
        return
Exemplo n.º 4
0
    def nfe_export(self):

        for inv in self:

            validate_nfe_configuration(inv.company_id)

            nfe_obj = self._get_nfe_factory(inv.nfe_version)

            # nfe_obj = NFe310()
            nfes = nfe_obj.get_xml(self.env.cr, self.env.uid, self.ids,
                                   int(inv.company_id.nfe_environment),
                                   self.env.context)

            for nfe in nfes:
                # erro = nfe_obj.validation(nfe['nfe'])
                erro = XMLValidator.validation(nfe['nfe'], nfe_obj)
                nfe_key = nfe['key'][3:]
                if erro:
                    raise RedirectWarning(
                        erro, _(u'Erro na validaço da NFe!'))

                inv.write({'nfe_access_key': nfe_key})
                save_dir = os.path.join(
                    monta_caminho_nfe(
                        inv.company_id,
                        chave_nfe=nfe_key) +
                    'tmp/')
                nfe_file = nfe['nfe'].encode('utf8')

                file_path = save_dir + nfe_key + '-nfe.xml'
                try:
                    if not os.path.exists(save_dir):
                        os.makedirs(save_dir)
                    f = open(file_path, 'w')
                except IOError:
                    raise RedirectWarning(
                        _(u'Erro!'), _(u"""Não foi possível salvar o arquivo
                            em disco, verifique as permissões de escrita
                            e o caminho da pasta"""))
                else:
                    f.write(nfe_file)
                    f.close()

                    event_obj = self.env['l10n_br_account.document_event']
                    event_obj.create({
                        'type': '0',
                        'company_id': inv.company_id.id,
                        'origin': '[NF-E]' + inv.internal_number,
                        'file_sent': file_path,
                        'create_date': datetime.datetime.now(),
                        'state': 'draft',
                        'document_event_ids': inv.id
                    })
                    inv.write({'state': 'sefaz_export'})
 def action_confirm_operation(self):
     for record in self:
         validate_nfe_configuration(record.company_id)
         nfe_result = send_event(record.company_id, record.chNFe,
                                 'confirma_operacao')
         env_events = record.env['l10n_br_account.document_event']
         event = record._create_event('Confirmação da operação', nfe_result)
         if nfe_result['code'] == '135':
             record.state = 'confirmado'
         else:
             event['response'] = 'Confirmação da operação sem êxito'
         event = env_events.create(event)
         record._create_attachment(event, nfe_result)
     return True
 def action_not_operation(self):
     for record in self:
         validate_nfe_configuration(record.company_id)
         nfe_result = send_event(record.company_id, record.chNFe,
                                 'nao_realizar_operacao')
         env_events = record.env['l10n_br_account.document_event']
         event = record._create_event('Operação não realizada', nfe_result)
         if nfe_result['code'] == '135':
             record.state = 'nap_realizado'
         else:
             event['response'] = \
                 'Tentativa de Operação não realizada sem êxito'
         event = env_events.create(event)
         record._create_attachment(event, nfe_result)
     return True
    def action_unknown_operation(self):
        validate_nfe_configuration(self.company_id)
        nfe_result = send_event(self.company_id, self.chNFe,
                                'desconhece_operacao')
        env_events = self.env['l10n_br_account.document_event']

        event = self._create_event('Desconhecimento da operação', nfe_result)

        if nfe_result['code'] == '135':
            self.state = 'desconhecido'
        else:
            event['response'] = 'Desconhecimento da operação sem êxito'

        event = env_events.create(event)
        self._create_attachment(event, nfe_result)
        return True
 def action_known_emission(self):
     for record in self:
         validate_nfe_configuration(record.company_id)
         nfe_result = send_event(record.company_id, record.chNFe,
                                 'ciencia_operacao')
         env_events = record.env['l10n_br_account.document_event']
         event = record._create_event('Ciência da operação', nfe_result)
         if nfe_result['code'] == '135':
             record.state = 'ciente'
         elif nfe_result['code'] == '573':
             record.state = 'ciente'
             event['response'] = \
                 'Ciência da operação já previamente realizada'
         else:
             event['response'] = 'Ciência da operação sem êxito'
         event = env_events.create(event)
         record._create_attachment(event, nfe_result)
     return True
Exemplo n.º 9
0
    def cancel_invoice_online(self, justificative):
        event_obj = self.env['l10n_br_account.document_event']

        for inv in self:
            if inv.state in ('open', 'paid'):

                validate_nfe_configuration(self.company_id)
                validate_invoice_cancel(inv)

                results = []
                try:
                    processo = cancel(
                        self.company_id,
                        inv.nfe_access_key,
                        inv.nfe_protocol_number,
                        justificative)
                    vals = {
                        'type': str(processo.webservice),
                        'status': processo.resposta.cStat.valor,
                        'response': '',
                        'company_id': self.company_id.id,
                        'origin': '[NF-E] {0}'.format(inv.internal_number),
                        'message': processo.resposta.xMotivo.valor,
                        'state': 'done',
                        'document_event_ids': inv.id}

                    self.attach_file_event(None, 'can', 'xml')

                    for prot in processo.resposta.retEvento:
                        vals["status"] = prot.infEvento.cStat.valor
                        vals["message"] = prot.infEvento.xEvento.valor
                        if vals["status"] in (
                                '101',  # Cancelamento de NF-e
                                # homologado
                                '128',
                                # Loto do evento processado
                                '135',  # Evento registrado e
                                # vinculado a NFC-e
                                '151',  # Cancelamento de NF-e
                                # homologado fora de prazo
                                '155'):  # Cancelamento homologado fora prazo
                            # Fixme:
                            result = super(AccountInvoice, self)\
                                .action_cancel()
                            if result:
                                self.write({'state': 'sefaz_cancelled',
                                            'nfe_status': vals["status"] +
                                            ' - ' + vals["message"]
                                            })
                                obj_cancel = self.env[
                                    'l10n_br_account.invoice.cancel']
                                obj = obj_cancel.create({
                                    'invoice_id': inv.id,
                                    'justificative': justificative,
                                })
                                vals['cancel_document_event_id'] = obj.id
                    results.append(vals)
                except Exception as e:
                    _logger.error(e.message, exc_info=True)
                    vals = {
                        'type': '-1',
                        'status': '000',
                        'response': 'response',
                        'company_id': self.company_id.id,
                        'origin': '[NF-E] {0}'.format(inv.internal_number),
                        'file_sent': 'OpenFalse',
                        'file_returned': 'False',
                        'message': 'Erro desconhecido ' + e.message,
                        'state': 'done',
                        'document_event_ids': inv.id
                    }
                    results.append(vals)
                finally:
                    for result in results:
                        event_obj.create(result)

            elif inv.state in ('sefaz_export', 'sefaz_exception'):
                _logger.error(
                    _(u'Invoice in invalid state to cancel online'),
                    exc_info=True)
                # TODO
        return
    def schedule_download(self, raise_error=False):
        companies = self.env['res.company'].search([])
        for company in companies:
            try:
                validate_nfe_configuration(company)
                nfe_result = distribuicao_nfe(company, company.last_nsu_nfe)

                env_events = self.env['l10n_br_account.document_event']

                if nfe_result['code'] == '137' or nfe_result['code'] == '138':

                    event = {
                        'type': '12', 'company_id': company.id,
                        'response': 'Consulta distribuição: sucesso',
                        'status': nfe_result['code'],
                        'message': nfe_result['message'],
                        'create_date': datetime.now(),
                        'write_date': datetime.now(),
                        'end_date': datetime.now(),
                        'state': 'done', 'origin': 'Scheduler Download'
                    }

                    obj = env_events.create(event)
                    self.env['ir.attachment'].create(
                        {
                            'name': u"Consulta manifesto - {0}".format(
                                company.cnpj_cpf),
                            'datas': base64.b64encode(
                                nfe_result['file_returned']),
                            'datas_fname': u"Consulta manifesto - {0}".format(
                                company.cnpj_cpf),
                            'description': u'Consulta distribuição: sucesso',
                            'res_model': 'l10n_br_account.document_event',
                            'res_id': obj.id
                        })

                    env_mde = self.env['nfe.mde']

                    for nfe in nfe_result['list_nfe']:
                        if nfe['schema'] == 'resNFe_v1.00.xsd':
                            root = objectify.fromstring(nfe['xml'])
                            cnpj_forn = self._mask_cnpj(('%014d' % root.CNPJ))

                            partner = self.env['res.partner'].search(
                                [('cnpj_cpf', '=', cnpj_forn)])

                            invoice_eletronic = {
                                'chNFe': root.chNFe,
                                'nSeqEvento': nfe['NSU'], 'xNome': root.xNome,
                                'tpNF': str(root.tpNF), 'vNF': root.vNF,
                                'cSitNFe': str(root.cSitNFe),
                                'state': 'pending',
                                'dataInclusao': datetime.now(),
                                'CNPJ': cnpj_forn,
                                'IE': root.IE,
                                'partner_id': partner.id,
                                'dEmi': datetime.strptime(str(root.dhEmi)[:19],
                                                          '%Y-%m-%dT%H:%M:%S'),
                                'company_id': company.id,
                                'formInclusao': u'Verificação agendada'
                            }

                            obj_nfe = env_mde.create(invoice_eletronic)
                            file_name = 'resumo_nfe-%s.xml' % nfe['NSU']
                            self.env['ir.attachment'].create(
                                {
                                    'name': file_name,
                                    'datas': base64.b64encode(nfe['xml']),
                                    'datas_fname': file_name,
                                    'description': u'NFe via manifesto',
                                    'res_model': 'nfe.mde',
                                    'res_id': obj_nfe.id
                                })

                        company.last_nsu_nfe = nfe['NSU']
                else:

                    event = {
                        'type': '12',
                        'response': 'Consulta distribuição com problemas',
                        'company_id': company.id,
                        'file_returned': nfe_result['file_returned'],
                        'file_sent': nfe_result['file_sent'],
                        'message': nfe_result['message'],
                        'create_date': datetime.now(),
                        'write_date': datetime.now(),
                        'end_date': datetime.now(),
                        'status': nfe_result['code'],
                        'state': 'done', 'origin': 'Scheduler Download'
                    }

                    obj = env_events.create(event)
                    self.env['ir.attachment'].create(
                        {
                            'name': u"Consulta manifesto - {0}".format(
                                company.cnpj_cpf),
                            'datas': base64.b64encode(
                                nfe_result['file_returned']),
                            'datas_fname': u"Consulta manifesto - {0}".format(
                                company.cnpj_cpf),
                            'description': u'Consulta manifesto com erro',
                            'res_model': 'l10n_br_account.document_event',
                            'res_id': obj.id
                        })

            except Exception:
                _logger.error("Erro ao consultar Manifesto", exc_info=True)
                if raise_error:
                    raise UserError(
                        u'Atenção',
                        u'Não foi possivel efetuar a consulta!\n '
                        u'Verifique o log')
    def query_nfe_batch(self, raise_error=False):
        nfe_mdes = []
        for company in self:
            try:
                validate_nfe_configuration(company)
                last_nsu = (long(company.last_nsu_nfe) if company.last_nsu_nfe
                            else company.get_last_dfe_nsu())
                nfe_result = distribuicao_nfe(company, last_nsu)
                _logger.info('%s.query_nfe_batch(), lastNSU: %s', company,
                             last_nsu)
            except Exception:
                _logger.error("Erro ao consultar Manifesto", exc_info=True)
                if raise_error:
                    raise UserError(
                        u'Atenção', u'Não foi possivel efetuar a consulta!\n '
                        u'Verifique o log')
            else:
                if company.last_nsu_nfe:
                    # do this here instead of in get_last_dfe_nsu() in case the
                    # exception gets swallowed in the `except` above.
                    company.sudo().last_nsu_nfe = ''
                env_events = self.env['l10n_br_account.document_event']

                if nfe_result['code'] == '137' or nfe_result['code'] == '138':

                    event = {
                        'type': '12',
                        'company_id': company.id,
                        'response': 'Consulta distribuição: sucesso',
                        'status': nfe_result['code'],
                        'message': nfe_result['message'],
                        'create_date': datetime.now(),
                        'write_date': datetime.now(),
                        'end_date': datetime.now(),
                        'state': 'done',
                        'origin': 'Scheduler Download'
                    }

                    obj = env_events.create(event)
                    self.env['ir.attachment'].create({
                        'name':
                        u"Consulta manifesto - {0}".format(company.cnpj_cpf),
                        'datas':
                        base64.b64encode(nfe_result['file_returned']),
                        'datas_fname':
                        u"Consulta manifesto - {0}".format(company.cnpj_cpf),
                        'description':
                        u'Consulta distribuição: sucesso',
                        'res_model':
                        'l10n_br_account.document_event',
                        'res_id':
                        obj.id
                    })

                    env_mde = self.env['nfe.mde']
                    for nfe in nfe_result['list_nfe']:
                        exists_nsu = self.env['nfe.mde'].search([
                            ('nSeqEvento', '=', nfe['NSU']),
                            ('company_id', '=', company.id),
                        ]).id
                        nfe_xml = nfe['xml'].encode('utf-8')
                        root = objectify.fromstring(nfe_xml)
                        if nfe['schema'] == u'procNFe_v3.10.xsd' and \
                                not exists_nsu:
                            chave_nfe = root.protNFe.infProt.chNFe
                            exists_chnfe = self.env['nfe.mde'].search([
                                ('chNFe', '=', chave_nfe)
                            ]).id

                            if not exists_chnfe:
                                cnpj_forn = self._mask_cnpj(
                                    ('%014d' % root.NFe.infNFe.emit.CNPJ))
                                partner = self.env['res.partner'].search([
                                    ('cnpj_cpf', '=', cnpj_forn)
                                ])

                                invoice_eletronic = {
                                    'nNFe':
                                    root.NFe.infNFe.ide.nNF,
                                    'chNFe':
                                    chave_nfe,
                                    'nSeqEvento':
                                    nfe['NSU'],
                                    'xNome':
                                    root.NFe.infNFe.emit.xNome,
                                    'tpNF':
                                    str(root.NFe.infNFe.ide.tpNF),
                                    'vNF':
                                    root.NFe.infNFe.total.ICMSTot.vNF,
                                    # 'cSitNFe': str(root.cSitNFe),
                                    'state':
                                    'pending',
                                    'dataInclusao':
                                    datetime.now(),
                                    'CNPJ':
                                    cnpj_forn,
                                    'IE':
                                    root.NFe.infNFe.emit.IE,
                                    'partner_id':
                                    partner.id,
                                    'dEmi':
                                    datetime.strptime(
                                        str(root.NFe.infNFe.ide.dhEmi)[:19],
                                        '%Y-%m-%dT%H:%M:%S'),
                                    'company_id':
                                    company.id,
                                    'formInclusao':
                                    u'Verificação agendada'
                                }
                                obj_nfe = env_mde.create(invoice_eletronic)
                                file_name = 'resumo_nfe-%s.xml' % nfe['NSU']
                                self.env['ir.attachment'].create({
                                    'name':
                                    file_name,
                                    'datas':
                                    base64.b64encode(nfe_xml),
                                    'datas_fname':
                                    file_name,
                                    'description':
                                    u'NFe via manifesto',
                                    'res_model':
                                    'nfe.mde',
                                    'res_id':
                                    obj_nfe.id
                                })
                        elif nfe['schema'] == 'resNFe_v1.01.xsd' and \
                                not exists_nsu:
                            chave_nfe = root.chNFe
                            exists_chnfe = self.env['nfe.mde'].search([
                                ('chNFe', '=', chave_nfe)
                            ]).id

                            if not exists_chnfe:
                                cnpj_forn = self._mask_cnpj(
                                    ('%014d' % root.CNPJ))
                                partner = self.env['res.partner'].search([
                                    ('cnpj_cpf', '=', cnpj_forn)
                                ])

                                invoice_eletronic = {
                                    # 'nNFe': root.NFe.infNFe.ide.nNF,
                                    'chNFe':
                                    chave_nfe,
                                    'nSeqEvento':
                                    nfe['NSU'],
                                    'xNome':
                                    root.xNome,
                                    'tpNF':
                                    str(root.tpNF),
                                    'vNF':
                                    root.vNF,
                                    'cSitNFe':
                                    str(root.cSitNFe),
                                    'state':
                                    'pending',
                                    'dataInclusao':
                                    datetime.now(),
                                    'CNPJ':
                                    cnpj_forn,
                                    'IE':
                                    root.IE,
                                    'partner_id':
                                    partner.id,
                                    'dEmi':
                                    datetime.strptime(
                                        str(root.dhEmi)[:19],
                                        '%Y-%m-%dT%H:%M:%S'),
                                    'company_id':
                                    company.id,
                                    'formInclusao':
                                    u'Verificação agendada - '
                                    u'manifestada por outro app'
                                }

                                obj_nfe = env_mde.create(invoice_eletronic)
                                file_name = 'resumo_nfe-%s.xml' % nfe['NSU']
                                self.env['ir.attachment'].create({
                                    'name':
                                    file_name,
                                    'datas':
                                    base64.b64encode(nfe_xml),
                                    'datas_fname':
                                    file_name,
                                    'description':
                                    u'NFe via manifesto',
                                    'res_model':
                                    'nfe.mde',
                                    'res_id':
                                    obj_nfe.id
                                })

                        nfe_mdes.append(nfe)
                else:

                    event = {
                        'type': '12',
                        'response': 'Consulta distribuição com problemas',
                        'company_id': company.id,
                        'file_returned': nfe_result['file_returned'],
                        'file_sent': nfe_result['file_sent'],
                        'message': nfe_result['message'],
                        'create_date': datetime.now(),
                        'write_date': datetime.now(),
                        'end_date': datetime.now(),
                        'status': nfe_result['code'],
                        'state': 'done',
                        'origin': 'Scheduler Download'
                    }

                    obj = env_events.create(event)

                    if nfe_result['file_returned']:
                        self.env['ir.attachment'].create({
                            'name':
                            u"Consulta manifesto - {0}".format(
                                company.cnpj_cpf),
                            'datas':
                            base64.b64encode(nfe_result['file_returned']),
                            'datas_fname':
                            u"Consulta manifesto - {0}".format(
                                company.cnpj_cpf),
                            'description':
                            u'Consulta manifesto com erro',
                            'res_model':
                            'l10n_br_account.document_event',
                            'res_id':
                            obj.id
                        })
        return nfe_mdes