Browse Source

Trabalhando na serializacao para XML

tags/0.1
Marinho Brandão 16 years ago
parent
commit
6b320bd3b1
  1. 3
      pynfe/entidades/base.py
  2. 3
      pynfe/entidades/cliente.py
  3. 4
      pynfe/entidades/emitente.py
  4. 3
      pynfe/entidades/notafiscal.py
  5. 3
      pynfe/entidades/produto.py
  6. 3
      pynfe/entidades/transportadora.py
  7. 43
      pynfe/processamento/serializacao.py
  8. 2
      tests/02-modelo-00-definicoes-gerais.txt
  9. 2
      tests/03-processamento-01-serializacao-xml.txt

3
pynfe/entidades/base.py

@ -13,6 +13,9 @@ class Entidade(object):
if self._fonte_dados: if self._fonte_dados:
self._fonte_dados.adicionar_objeto(self) self._fonte_dados.adicionar_objeto(self)
def __repr__(self):
return '<%s %s>'%(self.__class__.__name__, str(self))
class Lote(object): class Lote(object):
pass pass

3
pynfe/entidades/cliente.py

@ -50,3 +50,6 @@ class Cliente(Entidade):
# - Telefone # - Telefone
endereco_telefone = str() endereco_telefone = str()
def __str__(self):
return ' '.join([self.tipo_documento, self.numero_documento])

4
pynfe/entidades/emitente.py

@ -54,6 +54,6 @@ class Emitente(Entidade):
# Logotipo # Logotipo
logotipo = None logotipo = None
def __repr__(self):
return '<Emitente cnpj="%s" razao_social="%s"/>'%(self.cnpj, self.razao_social)
def __str__(self):
return self.cnpj

3
pynfe/entidades/notafiscal.py

@ -294,6 +294,9 @@ class NotaFiscal(Entidade):
super(NotaFiscal, self).__init__(*args, **kwargs) super(NotaFiscal, self).__init__(*args, **kwargs)
def __str__(self):
return ' '.join([self.modelo, self.serie, self.numero_nf])
def adicionar_nota_fiscal_referenciada(self, **kwargs): def adicionar_nota_fiscal_referenciada(self, **kwargs):
u"""Adiciona uma instancia de Nota Fisca referenciada""" u"""Adiciona uma instancia de Nota Fisca referenciada"""
self.notas_fiscais_referenciadas.append(NotaFiscalReferenciada(**kwargs)) self.notas_fiscais_referenciadas.append(NotaFiscalReferenciada(**kwargs))

3
pynfe/entidades/produto.py

@ -61,6 +61,9 @@ class Produto(Entidade):
super(Produto, self).__init__(*args, **kwargs) super(Produto, self).__init__(*args, **kwargs)
def __str__(self):
return ' '.join([self.codigo, self.descricao])
def adicionar_icms(self, **kwargs): def adicionar_icms(self, **kwargs):
u"""Adiciona uma instancia de ICMS a lista de ICMS do produto""" u"""Adiciona uma instancia de ICMS a lista de ICMS do produto"""
self.icms.append(ProdutoICMS(**kwargs)) self.icms.append(ProdutoICMS(**kwargs))

3
pynfe/entidades/transportadora.py

@ -27,3 +27,6 @@ class Transportadora(Entidade):
# - Municipio (obrigatorio) # - Municipio (obrigatorio)
endereco_municipio = str() endereco_municipio = str()
def __str__(self):
return ' '.join([self.tipo_documento, self.numero_documento])

43
pynfe/processamento/serializacao.py

@ -1,4 +1,9 @@
try: try:
set
except:
from sets import Set as set
try:
from lxml import etree from lxml import etree
except ImportError: except ImportError:
try: try:
@ -19,6 +24,9 @@ except ImportError:
except ImportError: except ImportError:
raise Exception('Falhou ao importar lxml/ElementTree') raise Exception('Falhou ao importar lxml/ElementTree')
from pynfe.entidades import Emitente, Cliente, Produto, Transportadora, NotaFiscal
from pynfe.excecoes import NenhumObjetoEncontrado, MuitosObjetosEncontrados
class Serializacao(object): class Serializacao(object):
"""Classe abstrata responsavel por fornecer as funcionalidades basicas para """Classe abstrata responsavel por fornecer as funcionalidades basicas para
exportacao e importacao de Notas Fiscais eletronicas para formatos serializados exportacao e importacao de Notas Fiscais eletronicas para formatos serializados
@ -26,7 +34,7 @@ class Serializacao(object):
Nao deve ser instanciada diretamente!""" Nao deve ser instanciada diretamente!"""
lista_de_nfs = None
_fonte_dados = None
def __new__(cls, *args, **kwargs): def __new__(cls, *args, **kwargs):
if cls == Serializacao: if cls == Serializacao:
@ -34,10 +42,10 @@ class Serializacao(object):
else: else:
return cls(*args, **kwargs) return cls(*args, **kwargs)
def __init__(self, nf_ou_lista):
self.lista_de_nfs = isinstance(nf_ou_lista, list) and nf_ou_lista or [nf_ou_lista]
def __init__(self, fonte_dados):
self._fonte_dados = fonte_dados
def exportar(self, destino):
def exportar(self, **kwargs):
"""Gera o(s) arquivo(s) de exportacao a partir da Nofa Fiscal eletronica """Gera o(s) arquivo(s) de exportacao a partir da Nofa Fiscal eletronica
ou lista delas.""" ou lista delas."""
@ -50,39 +58,52 @@ class Serializacao(object):
raise Exception('Metodo nao implementado') raise Exception('Metodo nao implementado')
class SerializacaoXML(Serializacao): class SerializacaoXML(Serializacao):
def exportar(self, objetos, destino):
def exportar(self, **kwargs):
"""Gera o(s) arquivo(s) de Nofa Fiscal eletronica no padrao oficial da SEFAZ """Gera o(s) arquivo(s) de Nofa Fiscal eletronica no padrao oficial da SEFAZ
e Receita Federal, para ser(em) enviado(s) para o webservice ou para ser(em) e Receita Federal, para ser(em) enviado(s) para o webservice ou para ser(em)
armazenado(s) em cache local.""" armazenado(s) em cache local."""
# Carrega lista de Notas Fiscais
notas_fiscais = self._fonte_dados.obter_lista(_classe=NotaFiscal, **kwargs)
saida = [] saida = []
# Dados do emitente # Dados do emitente
saida.append(self._serializar_emitente(objetos))
saida.append(self._serializar_emitente(self._obter_emitente_de_notas_fiscais(notas_fiscais)))
# Certificado Digital? XXX # Certificado Digital? XXX
# Clientes # Clientes
saida.append(self._serializar_clientes(objetos))
saida.append(self._serializar_clientes(**kwargs))
# Transportadoras # Transportadoras
saida.append(self._serializar_transportadoras(objetos))
saida.append(self._serializar_transportadoras(**kwargs))
# Produtos # Produtos
saida.append(self._serializar_produtos(objetos))
saida.append(self._serializar_produtos(**kwargs))
# Lote de Notas Fiscais # Lote de Notas Fiscais
saida.append(self._serializar_notas_fiscais(objetos))
saida.append(self._serializar_notas_fiscais(**kwargs))
# FIXME # FIXME
return '\n'.join(saida) return '\n'.join(saida)
def importar(self, objetos, origem):
def importar(self, origem):
"""Cria as instancias do PyNFe a partir de arquivos XML no formato padrao da """Cria as instancias do PyNFe a partir de arquivos XML no formato padrao da
SEFAZ e Receita Federal.""" SEFAZ e Receita Federal."""
raise Exception('Metodo nao implementado') raise Exception('Metodo nao implementado')
def _obter_emitente_de_notas_fiscais(self, notas_fiscais):
emitentes = set([nf.emitente for nf in notas_fiscais if nf.emitente])
if len(lista) == 0:
raise NenhumObjetoEncontrado('Nenhum objeto foi encontrado!')
elif len(lista) > 1:
raise MuitosObjetosEncontrados('Muitos objetos foram encontrados!')
return lista[0]
def _serializar_emitente(self, objetos): def _serializar_emitente(self, objetos):
return '' return ''

2
tests/02-modelo-00-definicoes-gerais.txt

@ -102,6 +102,8 @@ O contador de objetos retorna a quantidade de instancias que casem com os argume
>>> fonte_dados.contar_objetos(_classe=Emitente, razao_social='Emitente Novo') >>> fonte_dados.contar_objetos(_classe=Emitente, razao_social='Emitente Novo')
1 1
>>> fonte_dados._objetos
Permitir tambem remover objetos (que por padrao remove apenas da lista da memoria e nao Permitir tambem remover objetos (que por padrao remove apenas da lista da memoria e nao
eh persistente. eh persistente.

2
tests/03-processamento-01-serializacao-xml.txt

@ -4,6 +4,8 @@ PROCESSAMENTO - SERIALIZACAO PARA XML
Gerar arquivos XML Gerar arquivos XML
------------------ ------------------
>>> from pynfe.processamento.serializacao import SerializacaoXML
- Gera os arquivos XML a partir dos dados das instancias da NF-e - Gera os arquivos XML a partir dos dados das instancias da NF-e
- Quando gerados me lote, apenas o primeiro arquivo deve ter o cabecalho - Quando gerados me lote, apenas o primeiro arquivo deve ter o cabecalho
padrao do XML 1.0 padrao do XML 1.0

Loading…
Cancel
Save