You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
444 lines
11 KiB
444 lines
11 KiB
# -*- 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()
|