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