Example #1
0
    def monta_nfe(self):
        self.ensure_one()

        if self.documento_id.modelo != MODELO_FISCAL_NFE and \
                self.documento_id.modelo != MODELO_FISCAL_NFCE:
            return

        di = DI_310()

        di.nDI.valor = self.numero_documento
        di.dDI.valor = self.data_registro[:10]
        di.xLocDesemb.valor = self.local_desembaraco
        di.UFDesemb.valor = self.uf_desembaraco_id.uf
        di.dDesemb.valor = self.data_desembaraco[:10]
        di.tpViaTransp.valor = self.via_trans_internacional
        di.vAFRMM.valor = D(self.vr_afrmm)
        di.tpIntermedio.valor = self.forma_importacao

        if self.participante_id:
            di.CNPJ.valor = limpa_formatacao(self.participante_id.cnpj_cpf)
            di.UFTerceiro.valor = self.participante_id.estado
            di.cExportador.valor = \
                limpa_formatacao(self.participante_id.cnpj_cpf)

        #
        # Sempre existe pelo menos uma adição
        #
        adi = Adi_310()

        adi.nAdicao.valor = self.numero_adicao
        adi.nSeqAdic.valor = self.sequencial

        if self.participante_id:
            adi.cFabricante.valor = \
                limpa_formatacao(self.participante_id.cnpj_cpf)

        adi.vDescDI.valor = D(self.vr_desconto)
        adi.nDraw.valor = self.numero_drawback

        di.adi.append(adi)

        #
        # Agora, se houver mais
        #
        for adicao in self.adicao_ids:
            adi = Adi_310()

            adi.nAdicao.valor = adicao.numero_adicao
            adi.nSeqAdic.valor = adicao.sequencial

            if self.participante_id:
                adi.cFabricante.valor = \
                    limpa_formatacao(self.participante_id.cnpj_cpf)

            adi.vDescDI.valor = D(adicao.vr_desconto)
            adi.nDraw.valor = adicao.numero_drawback

            di.adi.append(adi)

        return di
Example #2
0
    def _monta_nfe_emitente(self, emit):
        empresa = self.empresa_id

        emit.CNPJ.valor = limpa_formatacao(empresa.cnpj_cpf)
        emit.xNome.valor = empresa.razao_social
        emit.xFant.valor = empresa.fantasia or ''
        emit.enderEmit.xLgr.valor = empresa.endereco
        emit.enderEmit.nro.valor = empresa.numero
        emit.enderEmit.xCpl.valor = empresa.complemento or ''
        emit.enderEmit.xBairro.valor = empresa.bairro
        emit.enderEmit.cMun.valor = empresa.municipio_id.codigo_ibge[:7]
        emit.enderEmit.xMun.valor = empresa.cidade
        emit.enderEmit.UF.valor = empresa.estado
        emit.enderEmit.CEP.valor = limpa_formatacao(empresa.cep)
        # emit.enderEmit.cPais.valor = '1058'
        # emit.enderEmit.xPais.valor = 'Brasil'
        emit.enderEmit.fone.valor = limpa_formatacao(empresa.fone or '')
        emit.IE.valor = limpa_formatacao(empresa.ie or '')
        #
        # Usa o regime tributário da NF e não da empresa, e trata o código
        # interno 3.1 para o lucro real, que na NF deve ir somente 3
        #
        emit.CRT.valor = self.regime_tributario[0]

        if self.modelo == MODELO_FISCAL_NFCE:
            emit.csc.id = empresa.csc_id or 1
            emit.csc.codigo = empresa.csc_codigo or ''
Example #3
0
    def _monta_nfe_endereco_entrega(self, entrega):
        return
        if not self.endereco_entrega_id:
            return

        entrega.xLgr.valor = self.endereco_entrega_id.endereco or ''
        entrega.nro.valor = self.endereco_entrega_id.numero or ''
        entrega.xCpl.valor = self.endereco_entrega_id.complemento or ''
        entrega.xBairro.valor = self.endereco_entrega_id.bairro or ''
        entrega.cMun.valor = \
            self.endereco_entrega_id.municipio_id.codigo_ibge[:7]
        entrega.xMun.valor = self.endereco_entrega_id.municipio_id.nome
        entrega.UF.valor = self.endereco_entrega_id.municipio_id.estado_id.uf

        if self.endereco_entrega_id.cnpj_cpf:
            if len(self.endereco_entrega_id.cnpj_cpf) == 18:
                entrega.CNPJ.valor = \
                    limpa_formatacao(self.endereco_entrega_id.cnpj_cpf)
            else:
                entrega.CPF.valor = \
                    limpa_formatacao(self.endereco_entrega_id.cnpj_cpf)
Example #4
0
    def _valida_cep(self):
        valores = {}
        res = {'value': valores}

        if not self.cep:
            return res

        cep = limpa_formatacao(self.cep)
        if (not cep.isdigit()) or len(cep) != 8:
            raise ValidationError('CEP inválido!')

        valores['cep'] = cep[:5] + '-' + cep[5:]

        return res
    def _valida_cnpj_cpf(self):
        self.ensure_one()

        valores = {}
        res = {'value': valores}

        if not self.cnpj_cpf:
            return res

        cnpj_cpf = limpa_formatacao(self.cnpj_cpf or '')

        if cnpj_cpf[:2] != 'EX':
            if not valida_cnpj(cnpj_cpf) and not valida_cpf(cnpj_cpf):
                raise ValidationError(_(u'CNPJ/CPF inválido'))

        if len(cnpj_cpf) == 14:
            valores['cnpj_cpf'] = formata_cnpj(cnpj_cpf)
            valores['tipo_pessoa'] = TIPO_PESSOA_JURIDICA
            valores['regime_tributario'] = REGIME_TRIBUTARIO_SIMPLES
            valores['contribuinte'] = INDICADOR_IE_DESTINATARIO_ISENTO

        else:
            valores['cnpj_cpf'] = formata_cpf(cnpj_cpf)
            valores['tipo_pessoa'] = TIPO_PESSOA_FISICA
            valores['regime_tributario'] = REGIME_TRIBUTARIO_LUCRO_PRESUMIDO
            valores['contribuinte'] = \
                INDICADOR_IE_DESTINATARIO_NAO_CONTRIBUINTE

        if cnpj_cpf[:2] == 'EX':
            valores['tipo_pessoa'] = TIPO_PESSOA_ESTRANGEIRO
            valores['regime_tributario'] = REGIME_TRIBUTARIO_LUCRO_PRESUMIDO
            valores['contribuinte'] = \
                INDICADOR_IE_DESTINATARIO_NAO_CONTRIBUINTE

        if self.id:
            cnpj_ids = self.search([('cnpj_cpf', '=', cnpj_cpf),
                                    ('id', '!=', self.id),
                                    ('eh_empresa', '=', False),
                                    ('eh_grupo', '=', False)])
        else:
            cnpj_ids = self.search([('cnpj_cpf', '=', cnpj_cpf),
                                    ('eh_empresa', '=', False),
                                    ('eh_grupo', '=', False)])

        if len(cnpj_ids) > 0:
            raise ValidationError(_(u'CNPJ/CPF já existe no cadastro!'))

        return res
    def _valida_cep(self):
        self.ensure_one()

        valores = {}
        res = {'value': valores}

        if not self.cep:
            return res

        cep = limpa_formatacao(self.cep)
        if (not cep.isdigit()) or len(cep) != 8:
            raise ValidationError(u'CEP inválido!')

        valores.update(cep=cep[:5] + '-' + cep[5:])

        return res
    def busca_documentos(self):
        for consulta in self:
            #import ipdb; ipdb.set_trace();

            processador = self.empresa_id.processador_nfe()
            processador.ambiente = int(AMBIENTE_NFE_PRODUCAO)
            cnpj = limpa_formatacao(self.empresa_id.cnpj_cpf)

            processo = processador.consultar_notas_destinadas(
                cnpj=cnpj,
                ultimo_nsu=self.ultimo_nsu or '0',
                tipo_nfe=CONS_NFE_TODAS,
                tipo_emissao=CONS_NFE_EMISSAO_TODOS_EMITENTES,
            )

            print(processo.envio.xml.encode('utf-8'))
            print('resposta')
            print(processo.resposta.original.encode('utf-8'))
Example #8
0
    def monta_nfe(self):
        self.ensure_one()

        if self.documento_id.modelo != MODELO_FISCAL_NFE and \
                self.documento_id.modelo != MODELO_FISCAL_NFCE:
            return

        pag = Pag_310()
        pag.tPag.valor = self.forma_pagamento
        pag.vPag.valor = str(D(self.valor))
        # Troco somente na NF-e 4.00
        # pag.vTroco.valor = str(D(self.troco))

        if self.forma_pagamento in FORMA_PAGAMENTO_CARTOES:
            pag.card.CNPJ.valor = limpa_formatacao(self.cnpj_cpf or '')
            pag.card.tBand.valor = self.bandeira_cartao
            pag.card.cAut.valor = self.integracao_cartao

        return pag
    def _valida_cnpj_cpf(self):
        self.ensure_one()

        valores = {}
        res = {'value': valores}

        if not self.cnpj_cpf:
            return res

        cnpj_cpf = limpa_formatacao(self.cnpj_cpf or '')

        if cnpj_cpf[:2] != 'EX':
            if not valida_cnpj(cnpj_cpf) and not valida_cpf(cnpj_cpf):
                raise ValidationError('CNPJ/CPF inválido')

        if len(cnpj_cpf) == 14:
            valores.update(cnpj_cpf=formata_cnpj(cnpj_cpf))
            valores.update(tipo_pessoa='J')
            valores.update(regime_tributario='1')
        else:
            valores.update(cnpj_cpf=formata_cpf(cnpj_cpf))
            valores.update(tipo_pessoa='F')
            valores.update(regime_tributario='3')

        if cnpj_cpf[:2] == 'EX':
            valores.update(tipo_pessoa='E')
            valores.update(regime_tributario='3')

        if self.id:
            cnpj_ids = self.search([('cnpj_cpf', '=', cnpj_cpf),
                                    ('id', '!=', self.id),
                                    ('eh_empresa', '=', False),
                                    ('eh_grupo', '=', False)])
        else:
            cnpj_ids = self.search([('cnpj_cpf', '=', cnpj_cpf),
                                    ('eh_empresa', '=', False),
                                    ('eh_grupo', '=', False)])

        if len(cnpj_ids) > 0:
            raise ValidationError(u'CNPJ/CPF já existe no cadastro!')

        return res
Example #10
0
    def _monta_nfe_transporte(self, transp):
        if self.modelo != MODELO_FISCAL_NFE:
            return
        #
        # Temporário até o início da NF-e 4.00
        #
        if self.modalidade_frete == MODALIDADE_FRETE_REMETENTE_PROPRIO:
            transp.modFrete.valor = MODALIDADE_FRETE_REMETENTE_CIF
        elif self.modalidade_frete == MODALIDADE_FRETE_DESTINATARIO_PROPRIO:
            transp.modFrete.valor = MODALIDADE_FRETE_DESTINATARIO_FOB
        else:
            transp.modFrete.valor = \
                self.modalidade_frete or MODALIDADE_FRETE_SEM_FRETE

        if self.transportadora_id:
            if len(self.transportadora_id.cnpj_cpf) == 14:
                transp.transporta.CPF.valor = \
                    limpa_formatacao(self.transportadora_id.cnpj_cpf)
            else:
                transp.transporta.CNPJ.valor = \
                    limpa_formatacao(self.transportadora_id.cnpj_cpf)

            transp.transporta.xNome.valor = \
                self.transportadora_id.razao_social or ''
            transp.transporta.IE.valor = \
                limpa_formatacao(self.transportadora_id.ie or 'ISENTO')
            ender = self.transportadora_id.endereco or ''
            ender += ' '
            ender += self.transportadora_id.numero or ''
            ender += ' '
            ender += self.transportadora_id.complemento or ''
            transp.transporta.xEnder.valor = ender.strip()
            transp.transporta.xMun.valor = self.transportadora_id.cidade or ''
            transp.transporta.UF.valor = self.transportadora_id.estado or ''

        if self.veiculo_id:
            transp.veicTransp.placa.valor = self.veiculo_id.placa or ''
            transp.veicTransp.UF.valor = self.veiculo_id.estado_id.uf or ''
            transp.veicTransp.RNTC.valor = self.veiculo_id.rntrc or ''

        transp.reboque = []
        if self.reboque_1_id:
            reb = Reboque_310()
            reb.placa.valor = self.reboque_1_id.placa or ''
            reb.UF.valor = self.reboque_1_id.estado_id.uf or ''
            reb.RNTC.valor = self.reboque_1_id.rntrc or ''
            transp.reboque.append(reb)
        if self.reboque_2_id:
            reb = Reboque_310()
            reb.placa.valor = self.reboque_2_id.placa or ''
            reb.UF.valor = self.reboque_2_id.estado_id.uf or ''
            reb.RNTC.valor = self.reboque_2_id.rntrc or ''
            transp.reboque.append(reb)
        if self.reboque_3_id:
            reb = Reboque_310()
            reb.placa.valor = self.reboque_3_id.placa or ''
            reb.UF.valor = self.reboque_3_id.estado_id.uf or ''
            reb.RNTC.valor = self.reboque_3_id.rntrc or ''
            transp.reboque.append(reb)
        if self.reboque_4_id:
            reb = Reboque_310()
            reb.placa.valor = self.reboque_4_id.placa or ''
            reb.UF.valor = self.reboque_4_id.estado_id.uf or ''
            reb.RNTC.valor = self.reboque_4_id.rntrc or ''
            transp.reboque.append(reb)
        if self.reboque_5_id:
            reb = Reboque_310()
            reb.placa.valor = self.reboque_5_id.placa or ''
            reb.UF.valor = self.reboque_5_id.estado_id.uf or ''
            reb.RNTC.valor = self.reboque_5_id.rntrc or ''
            transp.reboque.append(reb)

        #
        # Volumes
        #
        transp.vol = []
        for volume in self.volume_ids:
            transp.vol.append(volume.monta_nfe())
Example #11
0
    def _monta_nfe_destinatario(self, dest):
        participante = self.participante_id

        #
        # Para a NFC-e, o destinatário é sempre não contribuinte
        #
        if self.modelo == MODELO_FISCAL_NFCE:
            dest.indIEDest.valor = INDICADOR_IE_DESTINATARIO_NAO_CONTRIBUINTE

        else:
            dest.indIEDest.valor = participante.contribuinte

            if participante.contribuinte == \
                    INDICADOR_IE_DESTINATARIO_CONTRIBUINTE:
                dest.IE.valor = limpa_formatacao(participante.ie or '')

        #
        # Trata a possibilidade de ausência do destinatário na NFC-e
        #
        if self.modelo == MODELO_FISCAL_NFCE and not participante.cnpj_cpf:
            return

        #
        # Participantes estrangeiros tem a ID de estrangeiro sempre começando
        # com EX
        #
        if participante.cnpj_cpf.startswith('EX'):
            dest.idEstrangeiro.valor = \
                limpa_formatacao(participante.cnpj_cpf or '')

        elif len(participante.cnpj_cpf or '') == 14:
            dest.CPF.valor = limpa_formatacao(participante.cnpj_cpf)

        elif len(participante.cnpj_cpf or '') == 18:
            dest.CNPJ.valor = limpa_formatacao(participante.cnpj_cpf)

        if self.ambiente_nfe == AMBIENTE_NFE_HOMOLOGACAO:
            dest.xNome.valor = 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - ' \
                               'SEM VALOR FISCAL'
        else:
            dest.xNome.valor = participante.razao_social or ''

        #
        # Para a NFC-e, o endereço do participante pode não ter sido
        # preenchido
        #
        dest.enderDest.xLgr.valor = participante.endereco or ''
        dest.enderDest.nro.valor = participante.numero or ''
        dest.enderDest.xCpl.valor = participante.complemento or ''
        dest.enderDest.xBairro.valor = participante.bairro or ''

        if not participante.cnpj_cpf.startswith('EX'):
            dest.enderDest.CEP.valor = limpa_formatacao(participante.cep)
        else:
            dest.enderDest.CEP.valor = '99999999'

        #
        # Pode haver cadastro de participante sem município para NFC-e
        #
        if participante.municipio_id:
            dest.enderDest.cMun.valor = \
                participante.municipio_id.codigo_ibge[:7]
            dest.enderDest.xMun.valor = participante.cidade
            dest.enderDest.UF.valor = participante.estado

            if participante.cnpj_cpf.startswith('EX'):
                dest.enderDest.cPais.valor = \
                    participante.municipio_id.pais_id.codigo_bacen
                dest.enderDest.xPais.valor = \
                    participante.municipio_id.pais_id.nome

        dest.enderDest.fone.valor = limpa_formatacao(participante.fone or '')
        email_dest = participante.email_nfe or ''
        dest.email.valor = email_dest[:60]
Example #12
0
 def caminho_sped(self):
     filestore = config.filestore(self._cr.dbname)
     return os.path.join(filestore, 'sped', limpa_formatacao(self.cnpj_cpf))