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
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 ''
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)
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'))
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
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())
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]
def caminho_sped(self): filestore = config.filestore(self._cr.dbname) return os.path.join(filestore, 'sped', limpa_formatacao(self.cnpj_cpf))