示例#1
0
 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)
示例#2
0
    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
示例#3
0
    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()
示例#4
0
    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