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
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
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
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