def send_letter(self): self.valida_carta_correcao_eletronica() tz = pytz.timezone(self.env.user.partner_id.tz) or pytz.utc dt_evento = datetime.utcnow() dt_evento = pytz.utc.localize(dt_evento).astimezone(tz) carta = { 'idLote': self.id, 'estado': self.eletronic_doc_id.company_id.state_id.ibge_code, 'ambiente': int(self.eletronic_doc_id.company_id.tipo_ambiente), 'modelo': self.eletronic_doc_id.model, 'eventos': [{ 'invoice_id': self.eletronic_doc_id.id, 'CNPJ': re.sub("[^0-9]", "", self.eletronic_doc_id.company_id.cnpj_cpf), 'cOrgao': self.eletronic_doc_id.company_id.state_id.ibge_code, 'tpAmb': self.eletronic_doc_id.company_id.tipo_ambiente, 'dhEvento': dt_evento.strftime('%Y-%m-%dT%H:%M:%S-03:00'), 'chNFe': self.eletronic_doc_id.chave_nfe, 'xCorrecao': self.correcao, 'tpEvento': '110110', 'descEvento': 'Carta de Correcao', 'xCondUso': COND_USO, 'nSeqEvento': self.sequential, 'Id': "ID110110%s%02d" % (self.eletronic_doc_id.chave_nfe, self.sequential), }], } cert = self.eletronic_doc_id.company_id.with_context({ 'bin_size': False }).nfe_a1_file cert_pfx = base64.decodestring(cert) certificado = Certificado( cert_pfx, self.eletronic_doc_id.company_id.nfe_a1_password) resposta = recepcao_evento_carta_correcao(certificado, **carta) retorno = resposta['object'].getchildren()[0] if retorno.cStat == 128 and retorno.retEvento.infEvento.cStat in (135, 136): eventos = self.env['carta.correcao.eletronica.evento'] eventos.create({ 'id_cce': carta['eventos'][0]['Id'], 'eletronic_doc_id': self.eletronic_doc_id.id, 'datahora_evento': datetime.now(), 'tipo_evento': carta['eventos'][0]['tpEvento'], 'sequencial_evento': carta['eventos'][0]['nSeqEvento'], 'correcao': carta['eventos'][0]['xCorrecao'], 'message': retorno.retEvento.infEvento.xMotivo, 'protocolo': retorno.retEvento.infEvento.nProt, }) self.eletronic_doc_id._create_attachment('cce', self.eletronic_doc_id, resposta['sent_xml']) self.eletronic_doc_id._create_attachment('cce_ret', self.eletronic_doc_id, resposta['received_xml']) else: mensagem = "%s - %s" % (retorno.cStat, retorno.xMotivo) if retorno.cStat == 128: mensagem = "%s - %s" % (retorno.retEvento.infEvento.cStat, retorno.retEvento.infEvento.xMotivo) self.write({ 'state': 'error', 'message': mensagem, 'sent_xml': base64.b64encode(resposta['sent_xml'].encode('utf-8')), 'sent_xml_name': 'cce-envio.xml', 'received_xml': base64.b64encode(resposta['received_xml'].encode('utf-8')), 'received_xml_name': 'cce-retorno.xml', }) return { "type": "ir.actions.act_window", "res_model": "wizard.carta.correcao.eletronica", "views": [[False, "form"]], "name": u"Carta de Correção", "target": "new", "res_id": self.id, }
def send_letter(self): self.valida_carta_correcao_eletronica() numero_evento = len(self.eletronic_doc_id.cartas_correcao_ids) + 1 carta = { 'invoice_id': self.eletronic_doc_id.id, 'CNPJ': re.sub("[^0-9]", "", self.eletronic_doc_id.company_id.cnpj_cpf or ''), 'cOrgao': self.eletronic_doc_id.company_id.state_id.ibge_code, 'tpAmb': self.eletronic_doc_id.company_id.tipo_ambiente, 'estado': self.eletronic_doc_id.company_id.state_id.ibge_code, 'ambiente': int(self.eletronic_doc_id.company_id.tipo_ambiente), 'dhEvento': datetime.now().strftime('%Y-%m-%dT%H:%M:%S-00:00'), 'chNFe': self.eletronic_doc_id.chave_nfe, 'xCorrecao': self.correcao, 'tpEvento': '110110', 'nSeqEvento': numero_evento, 'idLote': self.id, 'Id': "ID110110%s%02d" % (self.eletronic_doc_id.chave_nfe, numero_evento) } cert = self.eletronic_doc_id.company_id.with_context({ 'bin_size': False }).nfe_a1_file cert_pfx = base64.decodestring(cert) certificado = Certificado( cert_pfx, self.eletronic_doc_id.company_id.nfe_a1_password) resposta = recepcao_evento_carta_correcao(certificado, **carta) retorno = resposta['object'].Body.nfeRecepcaoEventoResult.retEnvEvento if retorno.cStat == 128 and retorno.retEvento.infEvento.cStat in (135, 136): eventos = self.env['carta.correcao.eletronica.evento'] eventos.create({ 'id_cce': carta['Id'], 'eletronic_doc_id': self.eletronic_doc_id.id, 'datahora_evento': datetime.now(), 'tipo_evento': carta['tpEvento'], 'sequencial_evento': carta['nSeqEvento'], 'correcao': carta['xCorrecao'], 'message': retorno.retEvento.infEvento.xMotivo, 'protocolo': retorno.retEvento.infEvento.nProt, }) self.eletronic_doc_id._create_attachment('cce', self.eletronic_doc_id, resposta['sent_xml']) self.eletronic_doc_id._create_attachment('cce_ret', self.eletronic_doc_id, resposta['received_xml']) else: mensagem = "%s - %s" % (retorno.cStat, retorno.xMotivo) if retorno.cStat == 128: mensagem = "%s - %s" % (retorno.retEvento.infEvento.cStat, retorno.retEvento.infEvento.xMotivo) self.write({ 'state': 'error', 'message': mensagem, 'sent_xml': base64.b64encode(resposta['sent_xml']), 'sent_xml_name': 'cce-envio.xml', 'received_xml': base64.b64encode(resposta['received_xml']), 'received_xml_name': 'cce-retorno.xml', }) return { "type": "ir.actions.act_window", "res_model": "wizard.carta.correcao.eletronica", "views": [[False, "form"]], "name": "Carta de Correção", "target": "new", "res_id": self.id, }