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.

803 lines
21 KiB

# -*- coding: utf-8 -*-
import random
from base import Entidade
from pynfe import get_version
from pynfe.utils.flags import NF_STATUS, NF_TIPOS_DOCUMENTO, NF_TIPOS_IMPRESSAO_DANFE,\
NF_FORMAS_PAGAMENTO, NF_FORMAS_EMISSAO, NF_FINALIDADES_EMISSAO,\
NF_REFERENCIADA_TIPOS, NF_PRODUTOS_ESPECIFICOS, ICMS_TIPOS_TRIBUTACAO,\
ICMS_ORIGENS, ICMS_MODALIDADES, IPI_TIPOS_TRIBUTACAO, IPI_TIPOS_CALCULO,\
PIS_TIPOS_TRIBUTACAO, PIS_TIPOS_CALCULO, COFINS_TIPOS_TRIBUTACAO,\
COFINS_TIPOS_CALCULO, MODALIDADES_FRETE, ORIGENS_PROCESSO, CODIGO_BRASIL,\
NF_PROCESSOS_EMISSAO, CODIGOS_ESTADOS, TIPOS_DOCUMENTO
from pynfe.utils import so_numeros, memoize
from decimal import Decimal
class NotaFiscal(Entidade):
status = NF_STATUS[0]
# 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()
# Nota Fisca eletronica
# - Modelo (formato: NN)
modelo = int()
# - Serie (obrigatorio - formato: NNN)
serie = str()
# - Numero NF (obrigatorio)
numero_nf = str()
# - Data da Emissao (obrigatorio)
data_emissao = None
# - Natureza da Operacao (obrigatorio)
natureza_operacao = str()
# - Tipo do Documento (obrigatorio - seleciona de lista) - NF_TIPOS_DOCUMENTO
tipo_documento = int()
# - Processo de emissão da NF-e (obrigatorio - seleciona de lista) - NF_PROCESSOS_EMISSAO
processo_emissao = 0
# - Versao do processo de emissão da NF-e
versao_processo_emissao = get_version()
# - Tipo impressao DANFE (obrigatorio - seleciona de lista) - NF_TIPOS_IMPRESSAO_DANFE
tipo_impressao_danfe = int()
# - Data de saida/entrada
data_saida_entrada = None
# - Forma de pagamento (obrigatorio - seleciona de lista) - NF_FORMAS_PAGAMENTO
forma_pagamento = int()
# - Forma de emissao (obrigatorio - seleciona de lista) - NF_FORMAS_EMISSAO
forma_emissao = str()
# - Finalidade de emissao (obrigatorio - seleciona de lista) - NF_FINALIDADES_EMISSAO
finalidade_emissao = int()
# - UF - converter para codigos em CODIGOS_ESTADOS
uf = str()
# - Municipio de ocorrencia
municipio = str()
# - Digest value da NF-e (somente leitura)
digest_value = None
# - Valor total da nota (somente leitura)
valor_total_nota = Decimal()
# - Valor ICMS da nota (somente leitura)
valor_icms_nota = Decimal()
# - Valor ICMS ST da nota (somente leitura)
valor_icms_st_nota = Decimal()
# - Protocolo (somente leitura)
protocolo = str()
# - Data (somente leitura)
data = None
# - Notas Fiscais Referenciadas (lista 1 para * / ManyToManyField)
notas_fiscais_referenciadas = None
# - Emitente (CNPJ ???)
emitente = None
# - Destinatario/Remetente
# - Identificacao (seleciona de Clientes)
destinatario_remetente = None
# - Entrega (XXX sera possivel ter entrega e retirada ao mesmo tempo na NF?)
entrega = None
# - Retirada
retirada = None
# - Local Retirada/Entrega
# - Local de retirada diferente do emitente (Sim/Nao)
local_retirada_diferente_emitente = False
# - Local de entrega diferente do destinatario (Sim/Nao)
local_entrega_diferente_destinatario = False
# - Produtos e Servicos (lista 1 para * / ManyToManyField)
produtos_e_servicos = None
# Totais
# - ICMS
# - Base de calculo (somente leitura)
totais_icms_base_calculo = Decimal()
# - Total do ICMS (somente leitura)
totais_icms_total = Decimal()
# - Base de calculo do ICMS ST (somente leitura)
totais_icms_st_base_calculo = Decimal()
# - Total do ICMS ST (somente leitura)
totais_icms_st_total = Decimal()
# - Total dos produtos e servicos (somente leitura)
totais_icms_total_produtos_e_servicos = Decimal()
# - Total do frete (somente leitura)
totais_icms_total_frete = Decimal()
# - Total do seguro (somente leitura)
totais_icms_total_seguro = Decimal()
# - Total do desconto (somente leitura)
totais_icms_total_desconto = Decimal()
# - Total do II (somente leitura)
totais_icms_total_ii = Decimal()
# - Total do IPI (somente leitura)
totais_icms_total_ipi = Decimal()
# - PIS (somente leitura)
totais_icms_pis = Decimal()
# - COFINS (somente leitura)
totais_icms_cofins = Decimal()
# - Outras despesas acessorias
totais_icms_outras_despesas_acessorias = Decimal()
# - Total da nota
totais_icms_total_nota = Decimal()
# - ISSQN
# - Base de calculo do ISS
totais_issqn_base_calculo_iss = Decimal()
# - Total do ISS
totais_issqn_total_iss = Decimal()
# - PIS sobre servicos
totais_issqn_pis = Decimal()
# - COFINS sobre servicos
totais_issqn_cofins = Decimal()
# - Total dos servicos sob nao-incidencia ou nao tributados pelo ICMS
totais_issqn_total = Decimal()
# - Retencao de Tributos
# - Valor retido de PIS
totais_retencao_valor_retido_pis = Decimal()
# - Valor retido de COFINS
totais_retencao_valor_retido_cofins = Decimal()
# - Valor retido de CSLL
totais_retencao_valor_retido_csll = Decimal()
# - Base de calculo do IRRF
totais_retencao_base_calculo_irrf = Decimal()
# - Valor retido do IRRF
totais_retencao_valor_retido_irrf = Decimal()
# - BC da ret. da Prev. Social
totais_retencao_bc_retencao_previdencia_social = Decimal()
# - Retencao da Prev. Social
totais_retencao_retencao_previdencia_social = Decimal()
# Transporte
# - Modalidade do Frete (obrigatorio - seleciona de lista) - MODALIDADES_FRETE
# - 0 - Por conta do emitente
# - 1 - Por conta do destinatario
transporte_modalidade_frete = int()
# - Transportador (seleciona de Transportadoras)
transporte_transportadora = None
# - Retencao do ICMS
# - Base de calculo
transporte_retencao_icms_base_calculo = Decimal()
# - Aliquota
transporte_retencao_icms_aliquota = Decimal()
# - Valor do servico
transporte_retencao_icms_valor_servico = Decimal()
# - UF
transporte_retencao_icms_uf = str()
# - Municipio
transporte_retencao_icms_municipio = Decimal()
# - CFOP
transporte_retencao_icms_cfop = str()
# - ICMS retido
transporte_retencao_icms_retido = Decimal()
# - Veiculo
# - Placa
transporte_veiculo_placa = str()
# - RNTC
transporte_veiculo_rntc = str()
# - UF
transporte_veiculo_uf = str()
# - Reboque
# - Placa
transporte_reboque_placa = str()
# - RNTC
transporte_reboque_rntc = str()
# - UF
transporte_reboque_uf = str()
# - Volumes (lista 1 para * / ManyToManyField)
transporte_volumes = None
# Cobranca
# - Fatura
# - Numero
fatura_numero = str()
# - Valor original
fatura_valor_original = Decimal()
# - Valor do desconto
fatura_valor_desconto = Decimal()
# - Valor liquido
fatura_valor_liquido = Decimal()
# - Duplicatas (lista 1 para * / ManyToManyField)
duplicatas = None
# Informacoes Adicionais
# - Informacoes Adicionais
# - Informacoes adicionais de interesse do fisco
informacoes_adicionais_interesse_fisco = str()
# - Informacoes complementares de interesse do contribuinte
informacoes_complementares_interesse_contribuinte = str()
# - Observacoes do Contribuinte (lista 1 para * / ManyToManyField)
observacoes_contribuinte = None
# - Processo Referenciado (lista 1 para * / ManyToManyField)
processos_referenciados = None
def __init__(self, *args, **kwargs):
self.notas_fiscais_referenciadas = []
self.produtos_e_servicos = []
self.transporte_volumes = []
self.duplicatas = []
self.observacoes_contribuinte = []
self.processos_referenciados = []
super(NotaFiscal, self).__init__(*args, **kwargs)
def __str__(self):
return ' '.join([str(self.modelo), self.serie, self.numero_nf])
def adicionar_nota_fiscal_referenciada(self, **kwargs):
u"""Adiciona uma instancia de Nota Fisca referenciada"""
obj = NotaFiscalReferenciada(**kwargs)
self.notas_fiscais_referenciadas.append(obj)
return obj
def adicionar_produto_servico(self, **kwargs):
u"""Adiciona uma instancia de Produto"""
obj = NotaFiscalProduto(**kwargs)
self.produtos_e_servicos.append(obj)
return obj
def adicionar_transporte_volume(self, **kwargs):
u"""Adiciona uma instancia de Volume de Transporte"""
obj = NotaFiscalTransporteVolume(**kwargs)
self.transporte_volumes.append(obj)
return obj
def adicionar_duplicata(self, **kwargs):
u"""Adiciona uma instancia de Duplicata"""
obj = NotaFiscalCobrancaDuplicata(**kwargs)
self.duplicatas.append(obj)
return obj
def adicionar_observacao_contribuinte(self, **kwargs):
u"""Adiciona uma instancia de Observacao do Contribuinte"""
obj = NotaFiscalObservacaoContribuinte(**kwargs)
self.observacoes_contribuinte.append(obj)
return obj
def adicionar_processo_referenciado(self, **kwargs):
u"""Adiciona uma instancia de Processo Referenciado"""
obj = NotaFiscalProcessoReferenciado(**kwargs)
self.processos_referenciados.append(obj)
return obj
@property
@memoize
def identificador_unico(self):
# Monta 'Id' da tag raiz <infNFe>
# Ex.: NFe35080599999090910270550010000000011518005123
return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)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.cnpj),
'mod': self.modelo,
'serie': str(self.serie).zfill(3),
'nNF': str(self.numero_nf).zfill(9),
'tpEmis': str(self.forma_emissao),
'cNF': self.codigo_numerico_aleatorio.zfill(8),
'cDV': self.dv_codigo_numerico_aleatorio,
}
class NotaFiscalReferenciada(Entidade):
# - Tipo (seleciona de lista) - NF_REFERENCIADA_TIPOS
tipo = str()
# - Nota Fiscal eletronica
# - Chave de Acesso
chave_acesso = str()
# - Nota Fiscal
# - UF
uf = str()
# - Mes e ano de emissao
mes_ano_emissao = str()
# - CNPJ
cnpj = str()
# - Serie (XXX)
serie = str()
# - Numero
numero = str()
# - Modelo
modelo = str()
class NotaFiscalProduto(Entidade):
# - Dados
# - Codigo (obrigatorio)
codigo = str()
# - Descricao (obrigatorio)
descricao = str()
# - EAN
ean = str()
# - NCM
ncm = str()
# - EX TIPI
ex_tipi = str()
# - CFOP (obrigatorio)
cfop = str()
# - Genero
genero = str()
# - Unidade Comercial (obrigatorio)
unidade_comercial = str()
# - Quantidade Comercial (obrigatorio)
quantidade_comercial = Decimal()
# - Valor Unitario Comercial (obrigatorio)
valor_unitario_comercial = Decimal()
# - Unidade Tributavel (obrigatorio)
unidade_tributavel = str()
# - Quantidade Tributavel (obrigatorio)
quantidade_tributavel = Decimal()
# - Valor Unitario Tributavel (obrigatorio)
valor_unitario_tributavel = Decimal()
# - EAN Tributavel
ean_tributavel = str()
# - Total Frete
total_frete = Decimal()
# - Total Seguro
total_seguro = Decimal()
# - Desconto
desconto = Decimal()
# - Valor total bruto (obrigatorio)
valor_total_bruto = Decimal()
# - Produto especifico (seleciona de lista) - NF_PRODUTOS_ESPECIFICOS
produto_especifico = str()
# - Tributos
# - ICMS
# - Situacao tributaria (obrigatorio - seleciona de lista) - ICMS_TIPOS_TRIBUTACAO
icms_situacao_tributaria = str()
# - Origem (obrigatorio - seleciona de lista) - ICMS_ORIGENS
icms_origem = int()
# - ICMS
# - Modalidade de determinacao da BC ICMS (seleciona de lista) - ICMS_MODALIDADES
icms_modalidade_determinacao_bc = int()
# - Percentual reducao da BC ICMS
icms_percentual_reducao_bc = Decimal()
# - Valor da base de calculo ICMS
icms_valor_base_calculo = Decimal()
# - Aliquota ICMS
icms_aliquota = Decimal()
# - Valor do ICMS
icms_valor = Decimal()
# - ICMS ST
# - Modalidade de determinacao da BC ICMS ST (seleciona de lista) - ICMS_MODALIDADES
icms_st_modalidade_determinacao_bc = str()
# - Percentual reducao da BC ICMS ST
icms_st_percentual_reducao_bc = Decimal()
# - Valor da base de calculo ICMS ST
icms_st_valor_base_calculo = Decimal()
# - Aliquota ICMS ST
icms_st_aliquota = Decimal()
# - Valor do ICMS ST
icms_st_valor = Decimal()
# - IPI
# - Situacao tributaria (seleciona de lista) - IPI_TIPOS_TRIBUTACAO
ipi_situacao_tributaria = str()
# - Classe de enquadramento
# - A informacao para classe de enquadramento do IPI para Cigarros e Bebidas,
# quando aplicavel, deve ser informada utilizando a codificacao prevista nos
# Atos Normativos editados pela Receita Federal
ipi_classe_enquadramento = str()
# - Codigo do enquadramento
ipi_codigo_enquadramento = str()
# - CNPJ do Produtor
ipi_cnpj_produtor = str()
# - Codigo do selo de controle
# - A informacao do codigo de selo, quando aplicavel, deve ser informada
# utilizando a codificacao prevista nos Atos Normativos editados pela Receita
# Federal
ipi_codigo_selo_controle = str()
# - Quantidade do selo de controle
ipi_quantidade_selo_controle = Decimal()
# - Tipo de calculo (seleciona de lista) - IPI_TIPOS_CALCULO
ipi_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
ipi_valor_base_calculo = Decimal()
# - Aliquota
ipi_aliquota = Decimal()
# - Em valor
# - Quantidade total unidade padrao
ipi_quantidade_total_unidade_padrao = Decimal()
# - Valor por unidade
ipi_valor_unidade = Decimal()
# - Valor do IPI
ipi_valor_ipi = Decimal()
# - PIS
# - PIS
# - Situacao tributaria (obrigatorio - seleciona de lista) - PIS_TIPOS_TRIBUTACAO
pis_situacao_tributaria = str()
# - Tipo de calculo (seleciona de lista) - PIS_TIPOS_CALCULO
pis_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
pis_valor_base_calculo = Decimal()
# - Aliquota (percentual)
pis_aliquota_percentual = Decimal()
# - Em valor
# - Aliquota (em reais)
pis_aliquota_reais = Decimal()
# - Quantidade vendida
pis_quantidade_vendida = Decimal()
# - Valor do PIS
pis_valor = Decimal()
# - PIS ST
# - Tipo de calculo (seleciona de lista) - PIS_TIPOS_CALCULO
pis_st_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
pis_st_valor_base_calculo = Decimal()
# - Aliquota (percentual)
pis_st_aliquota_percentual = Decimal()
# - Em valor
# - Aliquota (em reais)
pis_st_aliquota_reais = Decimal()
# - Quantidade vendida
pis_st_quantidade_vendida = Decimal()
# - Valor do PIS ST
pis_st_valor = Decimal()
# - COFINS
# - COFINS
# - Situacao tributaria (obrigatorio - seleciona de lista) - COFINS_TIPOS_TRIBUTACAO
cofins_situacao_tributaria = str()
# - Tipo de calculo (seleciona de lista) - COFINS_TIPOS_CALCULO
cofins_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
cofins_valor_base_calculo = Decimal()
# - Aliquota (percentual)
cofins_aliquota_percentual = Decimal()
# - Em Valor
# - Aliquota (em reais)
cofins_aliquota_reais = Decimal()
# - Quantidade vendida
cofins_quantidade_vendida = Decimal()
# - Valor do COFINS
cofins_valor = Decimal()
# - COFINS ST
# - Tipo de calculo (seleciona de lista) - COFINS_TIPOS_CALCULO
cofins_st_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
cofins_st_valor_base_calculo = Decimal()
# - Aliquota (percentual)
cofins_st_aliquota_percentual = Decimal()
# - Em Valor
# - Aliquota (em reais)
cofins_st_aliquota_reais = Decimal()
# - Quantidade vendida
cofins_st_quantidade_vendida = Decimal()
# - Valor do COFINS ST
cofins_st_valor = Decimal()
# - ISSQN
# - Valor da base de calculo
issqn_valor_base_calculo = Decimal()
# - Aliquota
issqn_aliquota = Decimal()
# - Lista de servico (seleciona de lista)
# - Aceita somente valores maiores que 100, disponiveis no arquivo data/ISSQN/Lista-Servicos.txt
issqn_lista_servico = str()
# - UF
issqn_uf = str()
# - Municipio de ocorrencia
issqn_municipio = str()
# - Valor do ISSQN
issqn_valor = Decimal()
# - Imposto de Importacao
# - Valor base de calculo
imposto_importacao_valor_base_calculo = Decimal()
# - Valor despesas aduaneiras
imposto_importacao_valor_despesas_aduaneiras = Decimal()
# - Valor do IOF
imposto_importacao_valor_iof = Decimal()
# - Valor imposto de importacao
imposto_importacao_valor = Decimal()
# - Informacoes Adicionais
# - Texto livre de informacoes adicionais
informacoes_adicionais = str()
# - Declaracao de Importacao (lista 1 para * / ManyToManyField)
declaracoes_importacao = None
def __init__(self, *args, **kwargs):
self.declaracoes_importacao = []
super(NotaFiscalProduto, self).__init__(*args, **kwargs)
def adicionar_declaracao_importacao(self, **kwargs):
u"""Adiciona uma instancia de Declaracao de Importacao"""
self.declaracoes_importacao.append(NotaFiscalDeclaracaoImportacao(**kwargs))
class NotaFiscalDeclaracaoImportacao(Entidade):
# - Numero DI/DSI/DA
numero_di_dsi_da = str()
# - Data de registro
data_registro = None
# - Codigo exportador
codigo_exportador = str()
# - Desembaraco aduaneiro
# - UF
desembaraco_aduaneiro_uf = str()
# - Local
desembaraco_aduaneiro_local = str()
# - Data
desembaraco_aduaneiro_data = str()
# - Adicoes (lista 1 para * / ManyToManyField)
adicoes = None
def __init__(self, *args, **kwargs):
self.declaracoes_importacao = []
super(NotaFiscalDeclaracaoImportacao, self).__init__(*args, **kwargs)
def adicionar_adicao(self, **kwargs):
u"""Adiciona uma instancia de Adicao de Declaracao de Importacao"""
self.adicoes.append(NotaFiscalDeclaracaoImportacaoAdicao(**kwargs))
class NotaFiscalDeclaracaoImportacaoAdicao(Entidade):
# - Numero
numero = str()
# - Desconto
desconto = str()
# - Codigo fabricante
codigo_fabricante = str()
class NotaFiscalTransporteVolume(Entidade):
# - Quantidade
quantidade = Decimal()
# - Especie
especie = str()
# - Marca
marca = str()
# - Numeracao
numeracao = str()
# - Peso Liquido (kg)
peso_liquido = Decimal()
# - Peso Bruto (kg)
peso_bruto = Decimal()
# - Lacres (lista 1 para * / ManyToManyField)
lacres = None
def __init__(self, *args, **kwargs):
self.lacres = []
super(NotaFiscalTransporteVolume, self).__init__(*args, **kwargs)
def adicionar_lacre(self, **kwargs):
u"""Adiciona uma instancia de Lacre de Volume de Transporte"""
self.lacres.append(NotaFiscalTransporteVolumeLacre(**kwargs))
class NotaFiscalTransporteVolumeLacre(Entidade):
# - Numero de lacres
numero_lacre = str()
class NotaFiscalCobrancaDuplicata(Entidade):
# - Numero
numero = str()
# - Data de vencimento
data_vencimento = None
# - Valor
valor = Decimal()
class NotaFiscalObservacaoContribuinte(Entidade):
# - Nome do campo
nome_campo = str()
# - Observacao
observacao = str()
class NotaFiscalProcessoReferenciado(Entidade):
# - Identificador do processo
identificador_processo = str()
# - Origem (seleciona de lista) - ORIGENS_PROCESSO
# - SEFAZ
# - Justica federal
# - Justica estadual
# - Secex/RFB
# - Outros
origem = str()
class NotaFiscalEntregaRetirada(Entidade):
# - Tipo de Documento (obrigatorio) - default CNPJ
tipo_documento = 'CNPJ'
# - Numero do Documento (obrigatorio)
numero_documento = str()
# - Endereco
# - Logradouro (obrigatorio)
endereco_logradouro = str()
# - Numero (obrigatorio)
endereco_numero = str()
# - Complemento
endereco_complemento = str()
# - Bairro (obrigatorio)
endereco_bairro = str()
# - CEP
endereco_cep = str()
# - Pais (seleciona de lista)
endereco_pais = CODIGO_BRASIL
# - UF (obrigatorio)
endereco_uf = str()
# - Municipio (obrigatorio)
endereco_municipio = str()
# - Telefone
endereco_telefone = str()