diff --git a/pynfe/entidades/base.py b/pynfe/entidades/base.py index 2376556..1988de4 100644 --- a/pynfe/entidades/base.py +++ b/pynfe/entidades/base.py @@ -1,5 +1,11 @@ +# -*- coding: utf-8 -*- + class Entidade(object): - pass + def __init__(self, **kwargs): + # Codigo para dinamizar a criacao de instancias de entidade, + # aplicando os valores dos atributos na instanciacao + for k, v in kwargs: + setattr(self, k, v) class Lote(object): pass diff --git a/pynfe/entidades/cliente.py b/pynfe/entidades/cliente.py index 2d5c80b..e1d6535 100644 --- a/pynfe/entidades/cliente.py +++ b/pynfe/entidades/cliente.py @@ -1,5 +1,56 @@ +# -*- coding: utf-8 -*- from base import Entidade +TIPOS_DOCUMENTO = ( + 'CNPJ', + 'CPF', +) + class Cliente(Entidade): - pass + # Dados do Cliente + # - Nome/Razão Social (obrigatorio) + razao_social = str() + + # - Tipo de Documento (obrigatorio) - default CNPJ - TIPOS_DOCUMENTO + tipo_documento = 'CNPJ' + + # - Numero do Documento (obrigatorio) + numero_documento = str() + + # - Inscricao Estadual + inscricao_estadual = str() + + # - Inscricao SUFRAMA + inscricao_suframa = str() + + # - Isento do ICMS (Sim/Nao) + isento_icms = False + + # 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 = 'BRASIL' + + # - UF (obrigatorio) + endereco_uf = str() + + # - Municipio (obrigatorio) + endereco_municipio = str() + + # - Telefone + endereco_telefone = str() diff --git a/pynfe/entidades/produto.py b/pynfe/entidades/produto.py index 11ae695..08155de 100644 --- a/pynfe/entidades/produto.py +++ b/pynfe/entidades/produto.py @@ -1,5 +1,119 @@ +# -*- coding: utf-8 -*- from base import Entidade +from decimal import Decimal + class Produto(Entidade): - pass + # Dados do Produto + # - Descricao (obrigatorio) + descricao = str() + + # - Codigo (obrigatorio) - nao pode ser alterado quando em edicao + codigo = str() + + # - EAN + ean = str() + + # - EAN Unid. Tributavel + ean_unidade_tributavel = str() + + # - EX TIPI + ex_tipi = str() + + # - Genero + genero = str() + + # - NCM + ncm = str() + + # - Unid. Com. + unidade_comercial = str() + + # - Valor Unitario Com. + valor_unitario_comercial = Decimal() + + # - Unid. Trib. + unidade_tributavel = str() + + # - Qtd. Trib. + quantidade_tributavel = Decimal() + + # - Valor Unitario Trib. + valor_unitario_tributavel = Decimal() + + # Impostos + # - ICMS (lista 1 para * / ManyToManyField) + icms = None + + # - IPI + # - Classe de Enquadramento (cigarros e bebidas) + ipi_classe_enquadramento = str() + + # - Codigo de Enquadramento Legal + ipi_codigo_enquadramento_legal = str() + + # - CNPJ do Produtor + ipi_cnpj_produtor = str() + + def __init__(self, *args, **kwargs): + self.icms = [] + + def adicionar_icms(self, **kwargs): + u"""Adiciona uma instancia de ICMS a lista de ICMS do produto""" + self.icms.append(ProdutoICMS(**kwargs)) + +ICMS_TIPOS_TRIBUTACAO = ( + ('00', 'ICMS 00 - Tributada integralmente'), + ('10', 'ICMS 10 - Tributada com cobranca do ICMS por substituicao tributaria'), + ('20', 'ICMS 20 - Com reducao da base de calculo'), + ('30', 'ICMS 30 - Isenta ou nao tributada e com cobranca do ICMS por substituicao tributaria'), + ('40', 'ICMS 40 - Isenta'), + ('41', 'ICMS 41 - Nao tributada'), + ('50', 'ICMS 50 - Suspensao'), + ('51', 'ICMS 51 - Diferimento'), + ('60', 'ICMS 60 - Cobrado anteriormente por substituicao tributaria'), + ('70', 'ICMS 70 - Com reducao da base de calculo e cobranca do ICMS por substituicao tributaria'), + ('90', 'ICMS 90 - Outras'), +) + +ICMS_ORIGENS = ( + 'Nacional', + 'Estrangeira - Importacao Direta', + 'Estrangeira - Adquirida no Mercado Interno', +) + +ICMS_MODALIDADES = ( + 'Margem Valor Agregado', + 'Pauta (valor)', + 'Preco Tabelado Max. (valor)', + 'Valor da Operacao', +) + +class ProdutoICMS(Entidade): + # - Tipo de Tributacao (seleciona de lista) - ICMS_TIPOS_TRIBUTACAO + tipo_tributacao = str() + + # - Origem (seleciona de lista) - ICMS_ORIGENS + origem = str() + + # - Modalidade de determinacao da Base de Calculo (seleciona de lista) - ICMS_MODALIDADES + modalidade = str() + + # - Aliquota ICMS + aliquota = Decimal() + + # - Percentual de reducao da Base de Calculo + percentual_reducao = Decimal() + + # - Modalidade de determinacao da Base de Calculo do ICMS ST (seleciona de lista) - ICMS_MODALIDADES + st_modalidade = str() + + # - Aliquota ICMS ST + st_aliquota = Decimal() + + # - Percentual de reducao do ICMS ST + st_percentual_reducao = Decimal() + + # - Percentual da margem de Valor Adicionado ICMS ST + st_percentual_margem_valor_adicionado = Decimal() diff --git a/tests/02-modelo-02-produto.txt b/tests/02-modelo-02-produto.txt index 418f119..819d069 100644 --- a/tests/02-modelo-02-produto.txt +++ b/tests/02-modelo-02-produto.txt @@ -7,21 +7,76 @@ Nenhum dos campos deve permitir acentos e/ou cedilhas. ST = Substituicao Tributaria + >>> from pynfe.entidades import Produto + >>> from pynfe.entidades.produto import ProdutoICMS + - Dados do Produto - Descricao (obrigatorio) + + >>> hasattr(Produto, 'descricao') + True + - Codigo (obrigatorio) - nao pode ser alterado quando em edicao + + >>> hasattr(Produto, 'codigo') + True + - EAN + + >>> hasattr(Produto, 'ean') + True + - EAN Unid. Tributavel + + >>> hasattr(Produto, 'ean_unidade_tributavel') + True + - EX TIPI + + >>> hasattr(Produto, 'ex_tipi') + True + - Genero + + >>> hasattr(Produto, 'genero') + True + - NCM + + >>> hasattr(Produto, 'ncm') + True + - Unid. Com. + + >>> hasattr(Produto, 'unidade_comercial') + True + - Valor Unitario Com. + + >>> hasattr(Produto, 'valor_unitario_comercial') + True + - Unid. Trib. + + >>> hasattr(Produto, 'unidade_tributavel') + True + - Qtd. Trib. + + >>> hasattr(Produto, 'quantidade_tributavel') + True + - Valor Unitario Trib. + + >>> hasattr(Produto, 'valor_unitario_tributavel') + True + - Impostos - ICMS (lista 1 para * / ManyToManyField) + + >>> hasattr(Produto, 'icms') + True + - Tipo de Tributacao (seleciona de lista) - ICMS 00 - Tributada integralmente - ICMS 10 - Tributada com cobranca do ICMS por substituicao tributaria @@ -34,27 +89,74 @@ ST = Substituicao Tributaria - ICMS 60 - Cobrado anteriormente por substituicao tributaria - ICMS 70 - Com reducao da base de calculo e cobranca do ICMS por substituicao tributaria - ICMS 90 - Outras + + >>> hasattr(ProdutoICMS, 'tipo_tributacao') + True + - Origem (seleciona de lista) - Nacional - Estrangeira - Importacao Direta - Estrangeira - Adquirida no Mercado Interno + + >>> hasattr(ProdutoICMS, 'origem') + True + - Modalidade de determinacao da Base de Calculo (seleciona de lista) - Margem Valor Agregado - Pauta (valor) - Preco Tabelado Max. (valor) - Valor da Operacao + + >>> hasattr(ProdutoICMS, 'modalidade') + True + - Aliquota ICMS + + >>> hasattr(ProdutoICMS, 'aliquota') + True + - Percentual de reducao da Base de Calculo + + >>> hasattr(ProdutoICMS, 'percentual_reducao') + True + - Modalidade de determinacao da Base de Calculo do ICMS ST (seleciona de lista) - Margem Valor Agregado - Pauta (valor) - Preco Tabelado Max. (valor) - Valor da Operacao - - Aliquota ICSM ST + + >>> hasattr(ProdutoICMS, 'st_modalidade') + True + + - Aliquota ICMS ST + + >>> hasattr(ProdutoICMS, 'st_aliquota') + True + - Percentual de reducao do ICMS ST + + >>> hasattr(ProdutoICMS, 'st_percentual_reducao') + True + - Percentual da margem de Valor Adicionado ICMS ST + + >>> hasattr(ProdutoICMS, 'st_percentual_margem_valor_adicionado') + True + - IPI - Classe de Enquadramento (cigarros e bebidas) + + >>> hasattr(Produto, 'ipi_classe_enquadramento') + True + - Codigo de Enquadramento Legal + + >>> hasattr(Produto, 'ipi_codigo_enquadramento_legal') + True + - CNPJ do Produtor + >>> hasattr(Produto, 'ipi_cnpj_produtor') + True + diff --git a/tests/02-modelo-03-cliente.txt b/tests/02-modelo-03-cliente.txt index 3890ca6..25d64f5 100644 --- a/tests/02-modelo-03-cliente.txt +++ b/tests/02-modelo-03-cliente.txt @@ -5,23 +5,84 @@ Modelo das entidades e como elas se relacionam. Nenhum dos campos deve permitir acentos e/ou cedilhas. + >>> from pynfe.entidades import Cliente + - Dados do Cliente - Nome/Razão Social (obrigatorio) + + >>> hasattr(Cliente, 'razao_social') + True + - Tipo de Documento (obrigatorio) - default CNPJ - CNPJ - CPF + + >>> hasattr(Cliente, 'tipo_documento') + True + - Numero do Documento (obrigatorio) + + >>> hasattr(Cliente, 'numero_documento') + True + - Inscricao Estadual + + >>> hasattr(Cliente, 'inscricao_estadual') + True + - Inscricao SUFRAMA + + >>> hasattr(Cliente, 'inscricao_suframa') + True + - Isento do ICMS (Sim/Nao) + + >>> hasattr(Cliente, 'isento_icms') + True + - Endereco - Logradouro (obrigatorio) + + >>> hasattr(Cliente, 'endereco_logradouro') + True + - Numero (obrigatorio) + + >>> hasattr(Cliente, 'endereco_numero') + True + - Complemento + + >>> hasattr(Cliente, 'endereco_complemento') + True + - Bairro (obrigatorio) + + >>> hasattr(Cliente, 'endereco_bairro') + True + - CEP + + >>> hasattr(Cliente, 'endereco_cep') + True + - Pais (seleciona de lista) + + >>> hasattr(Cliente, 'endereco_pais') + True + - UF (obrigatorio) + + >>> hasattr(Cliente, 'endereco_uf') + True + - Municipio (obrigatorio) + + >>> hasattr(Cliente, 'endereco_municipio') + True + - Telefone + >>> hasattr(Cliente, 'endereco_telefone') + True +