From 3d0b0974e97e1d959900abbda50347555c3c68cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marinho=20Brand=C3=A3o?= Date: Mon, 11 Jan 2010 23:44:38 -0200 Subject: [PATCH] Trabalhando no modelo da entidade de Nota Fiscal --- README | 3 + pynfe/entidades/notafiscal.py | 253 ++++++++++++++++++++++++++++++++++- pynfe/entidades/produto.py | 2 + pynfe/utils/flags.py | 10 ++ tests/02-modelo-05-notafiscal.txt | 275 +++++++++++++++++++++++++++++++++++++- 5 files changed, 536 insertions(+), 7 deletions(-) diff --git a/README b/README index e414e7a..f441e60 100644 --- a/README +++ b/README @@ -80,3 +80,6 @@ ReferĂȘncias - Descricao do Code128 na Wikipedia - http://en.wikipedia.org/wiki/Code_128 +- Lista de codigos para campo EX TIPI + - http://www.fisconet.com.br/ipi/tipi/04.htm + diff --git a/pynfe/entidades/notafiscal.py b/pynfe/entidades/notafiscal.py index dbeaad9..ceac583 100644 --- a/pynfe/entidades/notafiscal.py +++ b/pynfe/entidades/notafiscal.py @@ -1,13 +1,260 @@ from base import Entidade +from pynfe.utils.flags import NF_STATUS + +from decimal import Decimal + +NF_TIPOS_DOCUMENTO = ( + (0, 'Entrada'), + (1, 'Saida'), +) + +NF_TIPOS_IMPRESSAO_DANFE = ( + 'Retrato', + 'Paisagem', +) + +NF_FORMAS_PAGAMENTO = ( + (0, 'Pagamento a vista'), + (1, 'Pagamento a prazo'), + (2, 'Outros'), +) + +NF_FORMAS_EMISSAO = ( + 'Normal', + 'Contingencia', + 'Contingencia com SCAN', + 'Contingencia via DPEC', + 'Contingencia FS-DA', +) + +NF_FINALIDADES_EMISSAO = ( + (1, 'NF-e normal'), + (2, 'NF-e complementar'), + (3, 'NF-e de ajuste'), +) + +NF_REFERENCIADA_TIPOS = ( + 'Nota Fiscal eletronica', + 'Nota Fiscal', +) + +NF_PRODUTOS_ESPECIFICOS = ( + 'Veiculo', + 'Medicamento', + 'Armamento', + 'Combustivel', +) class NotaFiscal(Entidade): - pass + status = NF_STATUS[0] + + # Nota Fisca eletronica + # - Modelo (formato: NN) + modelo = str() + + # - 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() + + # - Tipo impressao DANFE (obrigatorio - seleciona de lista) - NF_TIPOS_IMPRESSAO_DANFE + tipo_impressao_danfe = str() + + # - Data de saida/entrada + data_saida_entrada = None + + # - Forma de pagamento (obrigatorio - seleciona de lista) - NF_FORMAS_PAGAMENTO + forma_pagamento = str() + + # - 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 + 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 + + # - Endereco (ver se pode copiar do Cliente) + # - Logradouro (obrigatorio) + destinatario_endereco_logradouro = str() + + # - Numero (obrigatorio) + destinatario_endereco_numero = str() + + # - Complemento + destinatario_endereco_complemento = str() + + # - Bairro (obrigatorio) + destinatario_endereco_bairro = str() + + # - CEP + destinatario_endereco_cep = str() + + # - Pais (seleciona de lista) + destinatario_endereco_pais = 'BRASIL' + + # - UF (obrigatorio) + destinatario_endereco_uf = str() + + # - Municipio (obrigatorio) + destinatario_endereco_municipio = str() + + # - Telefone + destinatario_endereco_telefone = str() + + # - 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_servicos = None + + def __init__(self, *args, **kwargs): + self.notas_fiscais_referenciadas = [] + self.produtos_servicos = [] + + super(NotaFiscal, self).__init__(*args, **kwargs) + + def adicionar_nota_fiscal_referenciada(self, **kwargs): + u"""Adiciona uma instancia de Nota Fisca referenciada""" + self.notas_fiscais_referenciadas.append(NotaFiscalReferenciada(**kwargs)) + + def adicionar_produto_servico(self, **kwargs): + u"""Adiciona uma instancia de Produto""" + self.produtos_servicos.append(NotaFiscalProduto(**kwargs)) + class NotaFiscalReferenciada(Entidade): - pass + # - 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): - pass + # - 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() class NotaFiscalDeclaracaoImportacao(Entidade): pass diff --git a/pynfe/entidades/produto.py b/pynfe/entidades/produto.py index b405da9..c316d2d 100644 --- a/pynfe/entidades/produto.py +++ b/pynfe/entidades/produto.py @@ -59,6 +59,8 @@ class Produto(Entidade): def __init__(self, *args, **kwargs): self.icms = [] + super(Produto, self).__init__(*args, **kwargs) + def adicionar_icms(self, **kwargs): u"""Adiciona uma instancia de ICMS a lista de ICMS do produto""" self.icms.append(ProdutoICMS(**kwargs)) diff --git a/pynfe/utils/flags.py b/pynfe/utils/flags.py index 2623d6e..b67a010 100644 --- a/pynfe/utils/flags.py +++ b/pynfe/utils/flags.py @@ -32,3 +32,13 @@ ICMS_MODALIDADES = ( 'Valor da Operacao', ) +NF_STATUS = ( + 'Em Digitacao', + 'Validada', + 'Assinada', + 'Em processamento', + 'Autorizada', + 'Rejeitada', + 'Cancelada', +) + diff --git a/tests/02-modelo-05-notafiscal.txt b/tests/02-modelo-05-notafiscal.txt index f6bd6b4..5d6cceb 100644 --- a/tests/02-modelo-05-notafiscal.txt +++ b/tests/02-modelo-05-notafiscal.txt @@ -21,74 +21,341 @@ Nenhum dos campos deve permitir acentos e/ou cedilhas. - Autorizada - Rejeitada - Cancelada - - NF-e + + >>> hasattr(NotaFiscal, 'status') + True + + - Nota Fisca eletronica - Modelo (formato: NN) + + >>> hasattr(NotaFiscal, 'modelo') + True + - Serie (obrigatorio - formato: NNN) + + >>> hasattr(NotaFiscal, 'serie') + True + - Numero NF (obrigatorio) + + >>> hasattr(NotaFiscal, 'numero_nf') + True + - Data da Emissao (obrigatorio) + + >>> hasattr(NotaFiscal, 'data_emissao') + True + - Natureza da Operacao (obrigatorio) + + >>> hasattr(NotaFiscal, 'natureza_operacao') + True + - Tipo do Documento (obrigatorio - seleciona de lista) + - 0 - Entrada + - 1 - Saida + + >>> hasattr(NotaFiscal, 'tipo_documento') + True + - Tipo impressao DANFE (obrigatorio - seleciona de lista) + - Retrato + - Paisagem + + >>> hasattr(NotaFiscal, 'tipo_impressao_danfe') + True + - Data de saida/entrada + + >>> hasattr(NotaFiscal, 'data_saida_entrada') + True + - Forma de pagamento (obrigatorio - seleciona de lista) + - 0 - Pagamento a vista + - 1 - Pagamento a prazo + - 2 - Outros + + >>> hasattr(NotaFiscal, 'forma_pagamento') + True + + - Forma de emissao (obrigatorio - seleciona de lista) + - Normal + - Contingencia + - Contingencia com SCAN + - Contingencia via DPEC + - Contingencia FS-DA + + >>> hasattr(NotaFiscal, 'forma_emissao') + True + + - Finalidade de emissao (obrigatorio - seleciona de lista) + - 1 - NF-e normal + - 2 - NF-e complementar + - 3 - NF-e de ajuste + + >>> hasattr(NotaFiscal, 'finalidade_emissao') + True + + - UF + + >>> hasattr(NotaFiscal, 'uf') + True + + - Municipio de ocorrencia + + >>> hasattr(NotaFiscal, 'municipio') + True + - Digest value da NF-e (somente leitura) + + >>> hasattr(NotaFiscal, 'digest_value') + True + - Valor total da nota (somente leitura) + + >>> hasattr(NotaFiscal, 'valor_total_nota') + True + - Valor ICMS da nota (somente leitura) + + >>> hasattr(NotaFiscal, 'valor_icms_nota') + True + - Valor ICMS ST da nota (somente leitura) + + >>> hasattr(NotaFiscal, 'valor_icms_st_nota') + True + - Protocolo (somente leitura) + + >>> hasattr(NotaFiscal, 'protocolo') + True + - Data (somente leitura) + + >>> hasattr(NotaFiscal, 'data') + True + - Notas Fiscais Referenciadas (lista 1 para * / ManyToManyField) + + >>> hasattr(NotaFiscal, 'notas_fiscais_referenciadas') + True + - Tipo (seleciona de lista) + + >>> hasattr(NotaFiscalReferenciada, 'tipo') + True + - Nota Fiscal eletronica - Chave de Acesso + + >>> hasattr(NotaFiscalReferenciada, 'chave_acesso') + True + - Nota Fiscal - UF + + >>> hasattr(NotaFiscalReferenciada, 'uf') + True + - Mes e ano de emissao + + >>> hasattr(NotaFiscalReferenciada, 'mes_ano_emissao') + True + - CNPJ + + >>> hasattr(NotaFiscalReferenciada, 'cnpj') + True + - Serie (XXX) + + >>> hasattr(NotaFiscalReferenciada, 'serie') + True + - Numero + + >>> hasattr(NotaFiscalReferenciada, 'numero') + True + - Modelo -- Emitente + + >>> hasattr(NotaFiscalReferenciada, 'modelo') + True + +- Emitente (CNPJ ???) + + >>> hasattr(NotaFiscal, 'emitente') + True + - Destinatario/Remetente - Identificacao (seleciona de Clientes) + + >>> hasattr(NotaFiscal, 'destinatario_remetente') + True + - Endereco (ver se pode copiar do Cliente) - Logradouro (obrigatorio) + + >>> hasattr(NotaFiscal, 'destinatario_endereco_logradouro') + True + - Numero (obrigatorio) + + >>> hasattr(NotaFiscal, 'destinatario_endereco_numero') + True + - Complemento + + >>> hasattr(NotaFiscal, 'destinatario_endereco_complemento') + True + - Bairro (obrigatorio) + + >>> hasattr(NotaFiscal, 'destinatario_endereco_bairro') + True + - CEP + + >>> hasattr(NotaFiscal, 'destinatario_endereco_cep') + True + - Pais (seleciona de lista) + + >>> hasattr(NotaFiscal, 'destinatario_endereco_pais') + True + - UF (obrigatorio) + + >>> hasattr(NotaFiscal, 'destinatario_endereco_uf') + True + - Municipio (obrigatorio) + + >>> hasattr(NotaFiscal, 'destinatario_endereco_municipio') + True + - Telefone + + >>> hasattr(NotaFiscal, 'destinatario_endereco_telefone') + True + - Local Retirada/Entrega - Local de retirada diferente do emitente (Sim/Nao) + + >>> hasattr(NotaFiscal, 'local_retirada_diferente_emitente') + True + - Local de entrega diferente do destinatario (Sim/Nao) + + >>> hasattr(NotaFiscal, 'local_entrega_diferente_destinatario') + True + - Produtos e Servicos (lista 1 para * / ManyToManyField) + + >>> hasattr(NotaFiscal, 'produtos_servicos') + True + - Dados - Codigo (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'codigo') + True + - Descricao (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'descricao') + True + - EAN + + >>> hasattr(NotaFiscalProduto, 'ean') + True + - NCM + + >>> hasattr(NotaFiscalProduto, 'ncm') + True + - EX TIPI + + >>> hasattr(NotaFiscalProduto, 'ex_tipi') + True + - CFOP (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'cfop') + True + - Genero + + >>> hasattr(NotaFiscalProduto, 'genero') + True + - Unidade Comercial (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'unidade_comercial') + True + - Quantidade Comercial (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'quantidade_comercial') + True + - Valor Unitario Comercial (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'valor_unitario_comercial') + True + - Unidade Tributavel (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'unidade_tributavel') + True + - Quantidade Tributavel (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'quantidade_tributavel') + True + - Valor Unitario Tributavel (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'valor_unitario_tributavel') + True + - EAN Tributavel - - Tot. Frete - - Tot. Seguro + + >>> hasattr(NotaFiscalProduto, 'ean_tributavel') + True + + - Total Frete + + >>> hasattr(NotaFiscalProduto, 'total_frete') + True + + - Total Seguro + + >>> hasattr(NotaFiscalProduto, 'total_seguro') + True + - Desconto + + >>> hasattr(NotaFiscalProduto, 'desconto') + True + - Valor tot bruto (obrigatorio) + + >>> hasattr(NotaFiscalProduto, 'valor_total_bruto') + True + - Produto especifico (seleciona de lista) - Veiculo - Medicamento - Armamento - Combustivel + + >>> hasattr(NotaFiscalProduto, 'produto_especifico') + True + - Tributos - ICMS - Situacao tributaria (obrigatorio - seleciona de lista)