2 changed files with 445 additions and 1 deletions
@ -0,0 +1,444 @@ |
|||
# -*- coding: utf-8 -*- |
|||
import random |
|||
|
|||
from .base import Entidade |
|||
from pynfe import get_version |
|||
from pynfe.utils.flags import MDFE_STATUS, CODIGO_BRASIL, CODIGOS_ESTADOS |
|||
|
|||
from pynfe.utils import so_numeros |
|||
|
|||
from decimal import Decimal |
|||
|
|||
|
|||
class Manifesto(Entidade): |
|||
status = MDFE_STATUS[0] |
|||
|
|||
# - UF - converter para codigos em CODIGOS_ESTADOS |
|||
uf = str() |
|||
|
|||
# tpAmb |
|||
|
|||
# - Tipo Emitente |
|||
# 1=Transportadora; 2=Carga própria; 3=CTe Globalizado |
|||
tipo_emitente = int() |
|||
|
|||
# - Tipo transportador - 0=nenhum; 1=etc; 2=tac; 3=ctc |
|||
tipo_transportador = int() |
|||
|
|||
# Manifesto fixo 58 |
|||
# - Modelo (formato: NN) |
|||
modelo = 58 |
|||
|
|||
# - Serie (obrigatorio - formato: NNN) |
|||
serie = str() |
|||
|
|||
# - Numero MDFe (obrigatorio) |
|||
numero_mdfe = str() |
|||
|
|||
# - Código numérico aleatório que compõe a chave de acesso |
|||
codigo_numerico_aleatorio = str() |
|||
|
|||
# - Digito verificador do codigo numerico aleatorio |
|||
dv_codigo_numerico_aleatorio = str() |
|||
|
|||
# - Tipo do modal de transporte |
|||
# 1=Rodoviario; 2=Aereo; 3=Aquaviario; 4=Ferroviario |
|||
modal = 1 |
|||
|
|||
# - Data da Emissao (obrigatorio) |
|||
data_emissao = None |
|||
|
|||
# - Forma de emissao (obrigatorio - seleciona de lista) - NF_FORMAS_EMISSAO |
|||
forma_emissao = str() |
|||
|
|||
# - Processo de emissão da NF-e (obrigatorio - seleciona de lista) - NF_PROCESSOS_EMISSAO |
|||
processo_emissao = 0 |
|||
|
|||
# - Versao do processo de emissão do MDF-e |
|||
versao_processo_emissao = get_version() |
|||
|
|||
# - UF inicio. Exemplo SP, MT, PR |
|||
UFIni = str() |
|||
|
|||
# - UF final. Exemplo SP, MT, PR |
|||
UFFim = str() |
|||
|
|||
# - Digest value da NF-e (somente leitura) |
|||
digest_value = None |
|||
|
|||
# - Protocolo (somente leitura) |
|||
protocolo = str() |
|||
|
|||
# - Data (somente leitura) |
|||
data = None |
|||
|
|||
# - Municípios carregamento (lista 1 para * / ManyToManyField) |
|||
municipio_carrega = None |
|||
|
|||
# - Percurso da viagem (lista 1 para * / ManyToManyField) |
|||
percurso = None |
|||
|
|||
# Data inicial da viagem |
|||
dhIniViagem = None |
|||
|
|||
# - Emitente (lista 1 para * / ManyToManyField) |
|||
emitente = None |
|||
|
|||
# - Modal rodoviario (lista 1 para * / ManyToManyField) |
|||
modal_rodoviario = None |
|||
|
|||
# - Documentos vinculados NFe ou CTe (lista 1 para * / ManyToManyField) |
|||
documentos = None |
|||
|
|||
# - Seguradora (lista 1 para * / ManyToManyField) |
|||
seguradora = None |
|||
|
|||
# - Produto predominante |
|||
produto = None |
|||
|
|||
# - Resumo dos Totais do MDF-e |
|||
totais = None |
|||
|
|||
# - Lacres |
|||
lacres = None |
|||
|
|||
# - Informacoes Adicionais |
|||
# - Informacoes adicionais de interesse do fisco |
|||
informacoes_adicionais_interesse_fisco = str() |
|||
|
|||
# - Informacoes complementares de interesse do contribuinte |
|||
informacoes_complementares_interesse_contribuinte = str() |
|||
|
|||
def __init__(self, *args, **kwargs): |
|||
self.municipio_carrega = [] |
|||
self.percurso = [] |
|||
self.modal_rodoviario = [] |
|||
self.documentos = [] |
|||
self.seguradora = [] |
|||
self.produto = [] |
|||
self.lacres = [] |
|||
self.responsavel_tecnico = [] |
|||
super(Manifesto, self).__init__(*args, **kwargs) |
|||
|
|||
def __str__(self): |
|||
return ' '.join([str(self.modelo), self.serie, self.numero_mdfe]) |
|||
|
|||
def adicionar_municipio_carrega(self, **kwargs): |
|||
obj = ManifestoMunicipioCarrega(**kwargs) |
|||
self.municipio_carrega.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_percurso(self, **kwargs): |
|||
obj = ManifestoPercurso(**kwargs) |
|||
self.percurso.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_modal_rodoviario(self, **kwargs): |
|||
obj = ManifestoRodoviario(**kwargs) |
|||
self.modal_rodoviario.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_documentos(self, **kwargs): |
|||
obj = ManifestoDocumentos(**kwargs) |
|||
self.documentos.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_seguradora(self, **kwargs): |
|||
obj = ManifestoSeguradora(**kwargs) |
|||
self.seguradora.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_produto(self, **kwargs): |
|||
obj = ManifestoProduto(**kwargs) |
|||
self.produto.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_totais(self, **kwargs): |
|||
obj = ManifestoTotais(**kwargs) |
|||
self.totais.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_lacres(self, **kwargs): |
|||
obj = ManifestoLacres(**kwargs) |
|||
self.lacres.append(obj) |
|||
return obj |
|||
|
|||
def adicionar_responsavel_tecnico(self, **kwargs): |
|||
""" Adiciona uma instancia de Responsavel Tecnico """ |
|||
obj = ManifestoResponsavelTecnico(**kwargs) |
|||
self.responsavel_tecnico.append(obj) |
|||
return obj |
|||
|
|||
def _codigo_numerico_aleatorio(self): |
|||
self.codigo_numerico_aleatorio = str(random.randint(0, 99999999)).zfill(8) |
|||
return self.codigo_numerico_aleatorio |
|||
|
|||
def _dv_codigo_numerico(self, key): |
|||
assert len(key) == 43 |
|||
|
|||
weights = [2, 3, 4, 5, 6, 7, 8, 9] |
|||
weights_size = len(weights) |
|||
key_numbers = [int(k) for k in key] |
|||
key_numbers.reverse() |
|||
|
|||
key_sum = 0 |
|||
for i, key_number in enumerate(key_numbers): |
|||
# cycle though weights |
|||
i = i % weights_size |
|||
key_sum += key_number * weights[i] |
|||
|
|||
remainder = key_sum % 11 |
|||
if remainder == 0 or remainder == 1: |
|||
self.dv_codigo_numerico_aleatorio = '0' |
|||
return '0' |
|||
self.dv_codigo_numerico_aleatorio = str(11 - remainder) |
|||
return str(self.dv_codigo_numerico_aleatorio) |
|||
|
|||
@property |
|||
# @memoize |
|||
def identificador_unico(self): |
|||
# Monta 'Id' da tag raiz <infMDFe> |
|||
# Ex.: MDFe35080599999090910270580010000000011518005123 |
|||
key = "%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nMDF)s%(tpEmis)s%(cMDF)s"%{ |
|||
'uf': CODIGOS_ESTADOS[self.uf], |
|||
'ano': self.data_emissao.strftime('%y'), |
|||
'mes': self.data_emissao.strftime('%m'), |
|||
'cnpj': so_numeros(self.emitente.cpfcnpj).zfill(14), |
|||
'mod': self.modelo, |
|||
'serie': str(self.serie).zfill(3), |
|||
'nMDF': str(self.numero_mdfe).zfill(9), |
|||
'tpEmis': str(self.forma_emissao), |
|||
'cMDF': self._codigo_numerico_aleatorio(), |
|||
} |
|||
return "MDFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nMDF)s%(tpEmis)s%(cMDF)s%(cDV)s"%{ |
|||
'uf': CODIGOS_ESTADOS[self.uf], |
|||
'ano': self.data_emissao.strftime('%y'), |
|||
'mes': self.data_emissao.strftime('%m'), |
|||
'cnpj': so_numeros(self.emitente.cpfcnpj).zfill(14), |
|||
'mod': self.modelo, |
|||
'serie': str(self.serie).zfill(3), |
|||
'nMDF': str(self.numero_mdfe).zfill(9), |
|||
'tpEmis': str(self.forma_emissao), |
|||
'cMDF': str(self.codigo_numerico_aleatorio), |
|||
'cDV': self._dv_codigo_numerico(key), |
|||
} |
|||
|
|||
|
|||
class ManifestoMunicipioCarrega(Entidade): |
|||
# - Codigo municipio |
|||
cMunCarrega = str() |
|||
|
|||
# - Nome do municipio |
|||
xMunCarrega = str() |
|||
|
|||
|
|||
class ManifestoPercurso(Entidade): |
|||
# - Nome da UF (2 digitos) |
|||
UFPer = str() |
|||
|
|||
|
|||
class ManifestoRodoviario(Entidade): |
|||
rntrc = str() |
|||
ciot = None |
|||
pedagio = None |
|||
contratante = None |
|||
pagamento = None |
|||
veiculo_tracao = None |
|||
veiculo_reboque = None |
|||
|
|||
|
|||
class ManifestoCIOT(Entidade): |
|||
numero_ciot = str() |
|||
cpfcnpj = str() |
|||
|
|||
|
|||
class ManifestoPedagio(Entidade): |
|||
cnpj_fornecedor = str() |
|||
cpfcnpj_pagador = str() |
|||
numero_compra = str() |
|||
valor_pedagio = Decimal() |
|||
|
|||
|
|||
class ManifestoContratante(Entidade): |
|||
nome = str() |
|||
cpfcnpj = str() |
|||
|
|||
|
|||
class ManifestoVeiculoTracao(Entidade): |
|||
cInt = str() |
|||
placa = str() |
|||
RENAVAM = str() |
|||
tara = str() |
|||
capKG = str() |
|||
capM3 = str() |
|||
proprietario = None |
|||
condutor = None |
|||
tpRod = str() |
|||
tpCar = str() |
|||
UF = str() |
|||
|
|||
|
|||
class ManifestoVeiculoReboque(Entidade): |
|||
cInt = str() |
|||
placa = str() |
|||
RENAVAM = str() |
|||
tara = str() |
|||
capKG = str() |
|||
capM3 = str() |
|||
proprietario = None |
|||
tpCar = str() |
|||
UF = str() |
|||
|
|||
|
|||
class ManifestoCondutor(Entidade): |
|||
nome_motorista = str() |
|||
cpf_motorista = str() |
|||
|
|||
|
|||
class ManifestoDocumentos(Entidade): |
|||
|
|||
# Código do municipio de descarga |
|||
cMunDescarga = str() |
|||
# Nome do municipio de descarga |
|||
xMunDescarga = str() |
|||
|
|||
# Documentos vinculados |
|||
documentos_nfe = None |
|||
documentos_cte = None |
|||
|
|||
|
|||
class ManifestoDocumentosNFe(Entidade): |
|||
chave_acesso_nfe = str() |
|||
|
|||
|
|||
class ManifestoDocumentosCTe(Entidade): |
|||
chave_acesso_cte = str() |
|||
|
|||
|
|||
class ManifestoSeguradora(Entidade): |
|||
|
|||
# infResp - Responsavel seguro |
|||
# 1=Emitente; 2=Tomador |
|||
responsavel_seguro = str() |
|||
# - CNPJ do responsavel |
|||
cnpj_responsavel = str() |
|||
|
|||
# infSeg - Seguradora |
|||
# - Nome da seguradora |
|||
nome_seguradora = str() |
|||
# - CNPJ seguradora |
|||
cnpj_seguradora = str() |
|||
|
|||
# Apolice do Seguro |
|||
numero_apolice = str() |
|||
|
|||
# Lista de Averbacoes |
|||
averbacoes = None |
|||
|
|||
|
|||
class ManifestoAverbacao(Entidade): |
|||
# Numero da Averbacao |
|||
numero = str() |
|||
|
|||
|
|||
class ManifestoProduto(Entidade): |
|||
|
|||
# Tipo de carga |
|||
# 01=GranelSolido |
|||
# 02=GranelLiquido |
|||
# 03=Frigorificada |
|||
# 04=Conteinerizada |
|||
# 05=CargaGeral |
|||
# 06=Neogranel |
|||
# 07=PerigosaGranelSolido |
|||
# 08=PerigosaGranelLiquido |
|||
# 09=PerigosaCargaFrigorificada |
|||
# 10=PerigosaConteinerizada |
|||
# 11=PerigosaCargaGeral |
|||
tipo_carga = str() |
|||
|
|||
nome_produto = str() |
|||
cean = str() |
|||
ncm = str() |
|||
|
|||
|
|||
class ManifestoEmitente(Entidade): |
|||
# Dados do Emitente |
|||
|
|||
# - CPF ou CNPJ (obrigatorio) |
|||
cpfcnpj = str() |
|||
|
|||
# - Inscricao Estadual (obrigatorio) |
|||
inscricao_estadual = str() |
|||
|
|||
# - Nome/Razao Social (obrigatorio) |
|||
razao_social = str() |
|||
|
|||
# - Nome Fantasia |
|||
nome_fantasia = str() |
|||
|
|||
# Endereco |
|||
# - Logradouro (obrigatorio) |
|||
endereco_logradouro = str() |
|||
|
|||
# - Numero (obrigatorio) |
|||
endereco_numero = str() |
|||
|
|||
# - Complemento |
|||
endereco_complemento = str() |
|||
|
|||
# - Bairro (obrigatorio) |
|||
endereco_bairro = str() |
|||
|
|||
# - Codigo Municipio (opt) |
|||
endereco_cod_municipio = str() |
|||
|
|||
# - Municipio (obrigatorio) |
|||
endereco_municipio = str() |
|||
|
|||
# - CEP |
|||
endereco_cep = str() |
|||
|
|||
# - UF (obrigatorio) |
|||
endereco_uf = str() |
|||
|
|||
# - Telefone |
|||
endereco_telefone = str() |
|||
|
|||
# - Email |
|||
endereco_email = str() |
|||
|
|||
def __str__(self): |
|||
return self.cpfcnpj |
|||
|
|||
|
|||
class ManifestoTotais(Entidade): |
|||
|
|||
# Quantidade total de CT-e relacionados no Manifesto |
|||
qCTe = int() |
|||
|
|||
# Quantidade total de NF-e relacionadas no Manifesto |
|||
qNFe = int() |
|||
|
|||
# Valor total da carga / mercadorias transportadas |
|||
vCarga = Decimal() |
|||
|
|||
# - Código da unidade de medida do Peso Bruto da Carga / Mercadorias transportadas |
|||
# Unidades: 01 – KG; 02 - TON |
|||
cUnid = str() |
|||
|
|||
# - Peso Bruto Total da Carga / Mercadorias transportadas |
|||
qCarga = Decimal() |
|||
|
|||
|
|||
class ManifestoLacres(Entidade): |
|||
nLacre = str() |
|||
|
|||
|
|||
class ManifestoResponsavelTecnico(Entidade): |
|||
# NT 2018/003 |
|||
cnpj = str() |
|||
contato = str() |
|||
email = str() |
|||
fone = str() |
|||
csrt = str() |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue