def setar_datas_core(self): for holiday in self: if holiday.data_inicio and holiday.data_fim: data_inicio = data_hora_horario_brasilia( parse_datetime(holiday.data_inicio + ' 00:00:00')) holiday.date_from = str(UTC.normalize(data_inicio))[:19] data_fim = data_hora_horario_brasilia( parse_datetime(holiday.data_fim + ' 23:59:59')) holiday.date_to = str(UTC.normalize(data_fim))[:19] elif holiday.date_from and holiday.date_to: holiday.data_inicio = fields.Date.from_string( holiday.date_from) holiday.data_fim = fields.Date.from_string(holiday.date_to)
def _compute_permite_cancelamento(self): # # Este método deve ser alterado por módulos integrados, para verificar # regras de negócio que proíbam o cancelamento de um documento fiscal, # como por exemplo, a existência de boletos emitidos no financeiro, # que precisariam ser cancelados antes, caso tenham sido enviados # para o banco, a verificação de movimentações de estoque confirmadas, # a contabilização definitiva do documento etc. # for documento in self: if documento.modelo not in (MODELO_FISCAL_NFE, MODELO_FISCAL_NFCE): super(SpedDocumento, documento)._compute_permite_cancelamento() continue if documento.emissao != TIPO_EMISSAO_PROPRIA: super(SpedDocumento, documento)._compute_permite_cancelamento() continue documento.permite_cancelamento = False if documento.data_hora_autorizacao: tempo_autorizado = UTC.normalize(agora()) tempo_autorizado -= \ parse_datetime(documento.data_hora_autorizacao + ' GMT') if (documento.state_nfe == SITUACAO_NFE_AUTORIZADA and tempo_autorizado.days < 1): documento.permite_cancelamento = True
def cancela_nfe(self): super(SpedDocumento, self).cancela_nfe() self.ensure_one() processador = self.processador_nfe() xml = self.arquivo_xml_autorizacao_id.datas.decode('base64') xml = xml.decode('utf-8') procNFe = ProcNFe_310() procNFe.xml = xml procNFe.NFe.monta_chave() evento = EventoCancNFe_100() evento.infEvento.tpAmb.valor = procNFe.NFe.infNFe.ide.tpAmb.valor evento.infEvento.cOrgao.valor = procNFe.NFe.chave[:2] evento.infEvento.CNPJ.valor = procNFe.NFe.infNFe.emit.CNPJ.valor evento.infEvento.chNFe.valor = procNFe.NFe.chave evento.infEvento.dhEvento.valor = agora() evento.infEvento.detEvento.nProt.valor = \ procNFe.protNFe.infProt.nProt.valor evento.infEvento.detEvento.xJust.valor = self.justificativa or '' if processador.certificado: processador.certificado.assina_xmlnfe(evento) processador.salvar_arquivo = True processo = processador.enviar_lote_cancelamento(lista_eventos=[evento]) # # O cancelamento foi aceito e vinculado à NF-e # if self.chave in processo.resposta.dic_procEvento: procevento = processo.resposta.dic_procEvento[self.chave] retevento = procevento.retEvento if retevento.infEvento.cStat.valor not in ('155', '135'): mensagem = 'Erro no cancelamento' mensagem += '\nCódigo: ' + retevento.infEvento.cStat.valor mensagem += '\nMotivo: ' + \ retevento.infEvento.xMotivo.valor raise UserError(mensagem) # # Grava o protocolo de cancelamento # self.grava_xml_cancelamento(self.chave, evento) self.grava_xml_autorizacao_cancelamento(self.chave, procevento) # # Regera o DANFE com a tarja de cancelamento # if self.modelo == MODELO_FISCAL_NFE: processador.danfe.NFe = procNFe.NFe processador.danfe.protNFe = procNFe.protNFe processador.danfe.procEventoCancNFe = procevento processador.danfe.salvar_arquivo = False processador.danfe.gerar_danfe() self.grava_pdf(procNFe.NFe, processador.danfe.conteudo_pdf) processador.danfe.NFe = NFe_310() processador.danfe.protNFe = None processador.danfe.procEventoCancNFe = None elif self.modelo == MODELO_FISCAL_NFCE: processador.danfce.NFe = procNFe.NFe processador.danfce.protNFe = procNFe.protNFe processador.danfce.procEventoCancNFe = procevento processador.danfce.salvar_arquivo = False processador.danfce.gerar_danfce() self.grava_pdf(procNFe.NFe, processador.danfce.conteudo_pdf) processador.danfce.NFe = NFCe_310() processador.danfce.protNFe = None processador.danfce.procEventoCancNFe = None data_cancelamento = retevento.infEvento.dhRegEvento.valor data_cancelamento = UTC.normalize(data_cancelamento) self.data_hora_cancelamento = data_cancelamento self.protocolo_cancelamento = \ procevento.retEvento.infEvento.nProt.valor # # Cancelamento extemporâneo # self.executa_antes_cancelar() if procevento.retEvento.infEvento.cStat.valor == '155': self.situacao_fiscal = SITUACAO_FISCAL_CANCELADO_EXTEMPORANEO self.state_nfe = SITUACAO_NFE_CANCELADA elif procevento.retEvento.infEvento.cStat.valor == '135': self.situacao_fiscal = SITUACAO_FISCAL_CANCELADO self.state_nfe = SITUACAO_NFE_CANCELADA self.executa_depois_cancelar()
def envia_nfe(self): super(SpedDocumento, self).envia_nfe() self.ensure_one() processador = self.processador_nfe() # # A NFC-e deve ter data de emissão no máx. 5 minutos antes # da transmissão; por isso, definimos a hora de emissão aqui no # envio # if self.modelo == MODELO_FISCAL_NFCE: self.data_hora_emissao = fields.Datetime.now() self.data_hora_entrada_saida = self.data_hora_emissao nfe = self.monta_nfe(processador) if self.modelo == MODELO_FISCAL_NFE: processador.danfe.NFe = nfe processador.danfe.salvar_arquivo = False processador.danfe.gerar_danfe() self.grava_pdf(nfe, processador.danfe.conteudo_pdf) elif self.modelo == MODELO_FISCAL_NFCE: processador.danfce.NFe = nfe processador.danfce.salvar_arquivo = False processador.danfce.gerar_danfce() self.grava_pdf(nfe, processador.danfce.conteudo_pdf) # # Envia a nota # processo = None for p in processador.processar_notas([nfe]): processo = p # # Se o último processo foi a consulta do status do serviço, significa # que ele não está online... # if processo.webservice == WS_NFE_SITUACAO: self.state_nfe = SITUACAO_NFE_EM_DIGITACAO # # Se o último processo foi a consulta da nota, significa que ela já # está emitida # elif processo.webservice == WS_NFE_CONSULTA: if processo.resposta.cStat.valor in ('100', '150'): self.chave = processo.resposta.chNFe.valor self.executa_antes_autorizar() self.state_nfe = SITUACAO_NFE_AUTORIZADA self.executa_depois_autorizar() elif processo.resposta.cStat.valor in ('110', '301', '302'): self.chave = processo.resposta.chNFe.valor self.executa_antes_denegar() self.situacao_fiscal = SITUACAO_FISCAL_DENEGADO self.state_nfe = SITUACAO_NFE_DENEGADA self.executa_depois_denegar() else: self.state_nfe = SITUACAO_NFE_EM_DIGITACAO # # Se o último processo foi o envio do lote, significa que a consulta # falhou, mas o envio não # elif processo.webservice == WS_NFE_ENVIO_LOTE: # # Lote recebido, vamos guardar o recibo # if processo.resposta.cStat.valor == '103': self.recibo = processo.resposta.infRec.nRec.valor else: mensagem = 'Código de retorno: ' + \ processo.resposta.cStat.valor mensagem += '\nMensagem: ' + \ processo.resposta.xMotivo.valor self.mensagem_nfe = mensagem self.state_nfe = SITUACAO_NFE_REJEITADA # # Se o último processo foi o retorno do recibo, a nota foi rejeitada, # denegada, autorizada, ou ainda não tem resposta # elif processo.webservice == WS_NFE_CONSULTA_RECIBO: # # Consulta ainda sem resposta, a nota ainda não foi processada # if processo.resposta.cStat.valor == '105': self.state_nfe = SITUACAO_NFE_ENVIADA # # Lote processado # elif processo.resposta.cStat.valor == '104': protNFe = processo.resposta.protNFe[0] # # Autorizada ou denegada # if protNFe.infProt.cStat.valor in ('100', '150', '110', '301', '302'): procNFe = processo.resposta.dic_procNFe[nfe.chave] self.grava_xml(procNFe.NFe) self.grava_xml_autorizacao(procNFe) if self.modelo == MODELO_FISCAL_NFE: self.grava_pdf(nfe, procNFe.danfe_pdf) elif self.modelo == MODELO_FISCAL_NFCE: self.grava_pdf(nfe, procNFe.danfce_pdf) data_autorizacao = protNFe.infProt.dhRecbto.valor data_autorizacao = UTC.normalize(data_autorizacao) self.data_hora_autorizacao = data_autorizacao self.protocolo_autorizacao = protNFe.infProt.nProt.valor self.chave = protNFe.infProt.chNFe.valor if protNFe.infProt.cStat.valor in ('100', '150'): self.executa_antes_autorizar() self.state_nfe = SITUACAO_NFE_AUTORIZADA self.executa_depois_autorizar() else: self.executa_antes_denegar() self.situacao_fiscal = SITUACAO_FISCAL_DENEGADO self.state_nfe = SITUACAO_NFE_DENEGADA self.executa_depois_denegar() else: mensagem = 'Código de retorno: ' + \ protNFe.infProt.cStat.valor mensagem += '\nMensagem: ' + \ protNFe.infProt.xMotivo.valor self.mensagem_nfe = mensagem self.state_nfe = SITUACAO_NFE_REJEITADA else: # # Rejeitada por outros motivos, falha no schema etc. etc. # mensagem = 'Código de retorno: ' + \ processo.resposta.cStat.valor mensagem += '\nMensagem: ' + \ processo.resposta.xMotivo.valor self.mensagem_nfe = mensagem self.state_nfe = SITUACAO_NFE_REJEITADA
def envia_cce(self): self.ensure_one() processador = self.documento_id.processador_nfe() xml = self.documento_id.arquivo_xml_autorizacao_id.datas.decode( 'base64') xml = xml.decode('utf-8') procNFe = ProcNFe_310() procNFe.xml = xml procNFe.NFe.monta_chave() evento = EventoCCe_100() evento.infEvento.tpAmb.valor = procNFe.NFe.infNFe.ide.tpAmb.valor evento.infEvento.cOrgao.valor = procNFe.NFe.chave[:2] evento.infEvento.CNPJ.valor = procNFe.NFe.infNFe.emit.CNPJ.valor evento.infEvento.chNFe.valor = procNFe.NFe.chave evento.infEvento.dhEvento.valor = agora() #self.correcao = ## ## Correção ASP - Cláudia copiou e colou e veio esse caracter esquisito ## #if self.correcao: #self.correcao = self.correcao.replace('\u200b', ' ') evento.infEvento.detEvento.xCorrecao.valor = self.correcao or '' evento.infEvento.nSeqEvento.valor = self.sequencia or 1 if processador.certificado: processador.certificado.assina_xmlnfe(evento) processador.salvar_arquivo = True processo = processador.enviar_lote_cce(lista_eventos=[evento]) # # A CC-e foi aceita e vinculada à NF-e # if self.documento_id.chave in processo.resposta.dic_procEvento: procevento = \ processo.resposta.dic_procEvento[self.documento_id.chave] retevento = procevento.retEvento if retevento.infEvento.cStat.valor not in ('135', '136'): mensagem = 'Erro na carta de correção' mensagem += '\nCódigo: ' + retevento.infEvento.cStat.valor mensagem += '\nMotivo: ' + \ retevento.infEvento.xMotivo.valor raise UserError(mensagem) self.grava_xml(procNFe.NFe, evento) self.grava_xml_autorizacao(procNFe.NFe, procevento) data_autorizacao = retevento.infEvento.dhRegEvento.valor data_autorizacao = UTC.normalize(data_autorizacao) # # Gera o DAEDE da nova CC-e # processador.daede.NFe.xml = procNFe.NFe.xml processador.daede.protNFe = procNFe.protNFe processador.daede.procEventos = [procevento] processador.daede.salvar_arquivo = False processador.daede.gerar_daede() self.grava_pdf(procNFe.NFe, processador.daede.conteudo_pdf) self.data_hora_autorizacao = data_autorizacao self.protocolo_autorizacao = \ procevento.retEvento.infEvento.nProt.valor