|
|
|
@ -1,145 +1,145 @@ |
|
|
|
TESTES BASICOS |
|
|
|
============== |
|
|
|
|
|
|
|
|
|
|
|
>>> try: |
|
|
|
... set |
|
|
|
... set |
|
|
|
... except: |
|
|
|
... from sets import Set as set |
|
|
|
... from sets import Set as set |
|
|
|
<type 'set'> |
|
|
|
|
|
|
|
|
|
|
|
A biblioteca deve fornecer uma colecao de utilitarios para consumir |
|
|
|
o webservice da NF-e. |
|
|
|
|
|
|
|
|
|
|
|
Componentes |
|
|
|
----------- |
|
|
|
|
|
|
|
|
|
|
|
A separacao entre os componentes da biblioteca deve seguir o seguinte |
|
|
|
modelo: |
|
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------- |
|
|
|
| MODELO DE ENTIDADES | |
|
|
|
| MODELO DE ENTIDADES | |
|
|
|
--------------------------------------------------------------------- |
|
|
|
| | |
|
|
|
| ------------ -------------- | |
|
|
|
| | Entidade |-------<>| FonteDados | | |
|
|
|
| ------------ -------------- | |
|
|
|
| A | |
|
|
|
| | | |
|
|
|
| ----especializacao-------------------------- | |
|
|
|
| | | | | | |
|
|
|
| ------------ ----------- ----------- ------------------ | |
|
|
|
| | Emitente | | Produto | | Cliente | | Transportadora | | |
|
|
|
| ------------ ----------- ----------- ------------------ | |
|
|
|
| *| *| *| *| | |
|
|
|
| ------------------------------associacao---- | |
|
|
|
| | | |
|
|
|
| V* | |
|
|
|
| --------------- ---------------- | |
|
|
|
| | Nota Fiscal |------<>| Lote de NF-e | | |
|
|
|
| --------------- 1 * ---------------- | |
|
|
|
| | |
|
|
|
| | |
|
|
|
| ------------ -------------- | |
|
|
|
| | Entidade |-------<>| FonteDados | | |
|
|
|
| ------------ -------------- | |
|
|
|
| A | |
|
|
|
| | | |
|
|
|
| ----especializacao-------------------------- | |
|
|
|
| | | | | | |
|
|
|
| ------------ ----------- ----------- ------------------ | |
|
|
|
| | Emitente | | Produto | | Cliente | | Transportadora | | |
|
|
|
| ------------ ----------- ----------- ------------------ | |
|
|
|
| *| *| *| *| | |
|
|
|
| ------------------------------associacao---- | |
|
|
|
| | | |
|
|
|
| V* | |
|
|
|
| --------------- ---------------- | |
|
|
|
| | Nota Fiscal |------<>| Lote de NF-e | | |
|
|
|
| --------------- 1 * ---------------- | |
|
|
|
| | |
|
|
|
--------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------------- |
|
|
|
| PROCESSAMENTO | |
|
|
|
| PROCESSAMENTO | |
|
|
|
---------------------------------------------------------------------------- |
|
|
|
| | |
|
|
|
| ------------------ -------------- -------------------------------- | |
|
|
|
| | Serializacao | | DANFE | | Comunicacao | | |
|
|
|
| ------------------ -------------- -------------------------------- | |
|
|
|
| | exportar() | | imprimir() | | transmitir() | | |
|
|
|
| | importar() | -------------- | cancelar() | | |
|
|
|
| ------------------ | situacao_nfe() | | |
|
|
|
| | status_servico() | | |
|
|
|
| ---------------------- | consultar_cadastro() | | |
|
|
|
| | Validacao | | inutilizar_faixa_numeracao() | | |
|
|
|
| ---------------------- -------------------------------- | |
|
|
|
| | validar_arquivo() | | |
|
|
|
| | validar_xml() | | |
|
|
|
| | validar_etree() | ---------------------- | |
|
|
|
| | validar_objetos() | | Assinatura | | |
|
|
|
| ---------------------- ---------------------- | |
|
|
|
| | assinar_arquivo() | | |
|
|
|
| | assinar_xml() | | |
|
|
|
| | assinar_etree() | | |
|
|
|
| | assinar_objetos() | | |
|
|
|
| ---------------------- | |
|
|
|
| | |
|
|
|
| ------------------ -------------- -------------------------------- | |
|
|
|
| | Serializacao | | DANFE | | Comunicacao | | |
|
|
|
| ------------------ -------------- -------------------------------- | |
|
|
|
| | exportar() | | imprimir() | | transmitir() | | |
|
|
|
| | importar() | -------------- | cancelar() | | |
|
|
|
| ------------------ | situacao_nfe() | | |
|
|
|
| | status_servico() | | |
|
|
|
| ---------------------- | consultar_cadastro() | | |
|
|
|
| | Validacao | | inutilizar_faixa_numeracao() | | |
|
|
|
| ---------------------- -------------------------------- | |
|
|
|
| | validar_arquivo() | | |
|
|
|
| | validar_xml() | | |
|
|
|
| | validar_etree() | ---------------------- | |
|
|
|
| | validar_objetos() | | Assinatura | | |
|
|
|
| ---------------------- ---------------------- | |
|
|
|
| | assinar_arquivo() | | |
|
|
|
| | assinar_xml() | | |
|
|
|
| | assinar_etree() | | |
|
|
|
| | assinar_objetos() | | |
|
|
|
| ---------------------- | |
|
|
|
---------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
Os pacotes da biblioteca sao: |
|
|
|
|
|
|
|
- utils (contem todas as funcionalidades utilitarias dentro da |
|
|
|
|
|
|
|
- utils (contem todas as funcionalidades utilitarias dentro da |
|
|
|
biblioteca, incluindo flags e funcoes genericas) |
|
|
|
|
|
|
|
|
|
|
|
>>> from pynfe import utils |
|
|
|
>>> set([attr for attr in dir(utils) if not attr.startswith('__')]) >= set(['flags']) |
|
|
|
True |
|
|
|
|
|
|
|
|
|
|
|
- entidades (contem todas as entidades da biblioteca) |
|
|
|
|
|
|
|
|
|
|
|
>>> from pynfe import entidades |
|
|
|
>>> set([attr for attr in dir(entidades) if not attr.startswith('__')]) == set([ |
|
|
|
... 'Cliente', 'Emitente', 'LoteNotaFiscal', 'NotaFiscal', 'Produto', |
|
|
|
... 'Transportadora', 'base', 'cliente', 'emitente', 'lotes', 'notafiscal', |
|
|
|
... 'produto', 'transportadora', 'fonte_dados', '_fonte_dados','certificado', |
|
|
|
... 'CertificadoA1']) |
|
|
|
... 'Cliente', 'Emitente', 'LoteNotaFiscal', 'NotaFiscal', 'Produto', |
|
|
|
... 'Transportadora', 'base', 'cliente', 'emitente', 'lotes', 'notafiscal', |
|
|
|
... 'produto', 'transportadora', 'fonte_dados', '_fonte_dados','certificado', |
|
|
|
... 'CertificadoA1']) |
|
|
|
True |
|
|
|
|
|
|
|
|
|
|
|
- processamento (contem todas as funcionalidades de processamento da |
|
|
|
biblioteca |
|
|
|
|
|
|
|
|
|
|
|
>>> from pynfe import processamento |
|
|
|
>>> set([attr for attr in dir(processamento) if not attr.startswith('__')]) == set([ |
|
|
|
... 'AssinaturaA1', 'ComunicacaoSefaz', 'DANFE', 'SerializacaoXML', 'Validacao', |
|
|
|
... 'assinatura', 'comunicacao', 'danfe', 'serializacao', 'validacao']) |
|
|
|
... 'AssinaturaA1', 'ComunicacaoSefaz', 'DANFE', 'SerializacaoXML', 'Validacao', |
|
|
|
... 'assinatura', 'comunicacao', 'danfe', 'serializacao', 'validacao']) |
|
|
|
True |
|
|
|
|
|
|
|
|
|
|
|
Ha ainda uma pasta dentro da pasta 'pynfe', chamada 'data', que deve |
|
|
|
armazenar listas longas de municipios, CNAEs, situacoes tributarias, |
|
|
|
XSD's, etc. |
|
|
|
|
|
|
|
|
|
|
|
>>> import os |
|
|
|
>>> DATA = os.path.join(os.curdir, 'pynfe', 'data') |
|
|
|
>>> DATA |
|
|
|
'./pynfe/data' |
|
|
|
|
|
|
|
|
|
|
|
>>> os.path.isdir(DATA) |
|
|
|
True |
|
|
|
|
|
|
|
|
|
|
|
Geracao e importacao de XML |
|
|
|
--------------------------- |
|
|
|
|
|
|
|
|
|
|
|
As objetos Python devem ser traduzidos para arquivos XML e o caminho |
|
|
|
inverso, de introspecao, tambem deve ser feito, atraves de uma fabrica. |
|
|
|
|
|
|
|
|
|
|
|
>>> from pynfe.processamento.serializacao import Serializacao |
|
|
|
|
|
|
|
|
|
|
|
>>> bool(Serializacao.exportar) |
|
|
|
True |
|
|
|
|
|
|
|
|
|
|
|
>>> bool(Serializacao.importar) |
|
|
|
True |
|
|
|
|
|
|
|
|
|
|
|
A classe basica de Serializacao eh abstrata, ou seja, nao pode ser |
|
|
|
instanciada diretamente. |
|
|
|
|
|
|
|
|
|
|
|
>>> lista_de_nfs = [] |
|
|
|
|
|
|
|
|
|
|
|
>>> try: |
|
|
|
... Serializacao(lista_de_nfs) |
|
|
|
... Serializacao(lista_de_nfs) |
|
|
|
... except Exception, e: |
|
|
|
... print e.message |
|
|
|
... print e.message |
|
|
|
Esta classe nao pode ser instanciada diretamente! |
|
|
|
|
|
|
|
|
|
|
|
Classe de serializacao especifica para XML, usando lxml |
|
|
|
|
|
|
|
|
|
|
|
>>> from pynfe.processamento.serializacao import SerializacaoXML |
|
|
|
|
|
|
|
|
|
|
|
Esse procedimento sera feito por padrao atraves da lxml, devido ao seu |
|
|
|
desempenho, mas pode ser extendido para outros formatos, dependendo do |
|
|
|
objetivo pretendido. |
|
|
|
|
|
|
|
|
|
|
|
>>> try: |
|
|
|
... from lxml import etree |
|
|
|
... except ImportError: |
|
|
|
@ -148,7 +148,7 @@ objetivo pretendido. |
|
|
|
... import xml.etree.cElementTree as etree |
|
|
|
... except ImportError: |
|
|
|
... try: |
|
|
|
... # Python 2.5 |
|
|
|
... # Python 2.5 |
|
|
|
... import xml.etree.ElementTree as etree |
|
|
|
... except ImportError: |
|
|
|
... try: |
|
|
|
@ -160,45 +160,45 @@ objetivo pretendido. |
|
|
|
... import elementtree.ElementTree as etree |
|
|
|
... except ImportError: |
|
|
|
... print("A importacao do lxml falhou") |
|
|
|
|
|
|
|
|
|
|
|
Consumacao de WebService |
|
|
|
------------------------ |
|
|
|
|
|
|
|
|
|
|
|
O webservice a ser consumido esta no padrao SOAP, que no Python sera |
|
|
|
interpretado pela biblioteca SUDS. |
|
|
|
|
|
|
|
|
|
|
|
>>> import suds |
|
|
|
|
|
|
|
|
|
|
|
Para executar estes testes é preciso instalar a soaplib, para servir |
|
|
|
WSDL via SOAP, num servidor falso (mock). |
|
|
|
|
|
|
|
|
|
|
|
>>> import soaplib |
|
|
|
|
|
|
|
|
|
|
|
Certificados Digitais |
|
|
|
--------------------- |
|
|
|
|
|
|
|
|
|
|
|
A biblioteca deve suportar certificados digitais X.509 v.3 do tipo |
|
|
|
A1. O tipo A3 é certificado por hardware e provavelmente bem mais |
|
|
|
complexo de colocar em prática. |
|
|
|
|
|
|
|
|
|
|
|
eCNPJ A1 |
|
|
|
|
|
|
|
|
|
|
|
A3 depende de configurar seu numero de serie. No Windows |
|
|
|
usa-se a DLL CAPICOM. Ao que tudo indica, o OpenSSL nao suporta esse |
|
|
|
tipo. |
|
|
|
|
|
|
|
|
|
|
|
A transmissao utiliza SSL3. |
|
|
|
|
|
|
|
|
|
|
|
No Windows o arquivo é usado como .pfx (pkcs12) |
|
|
|
|
|
|
|
|
|
|
|
No Linux o arquivo deve ser convertido para .pem |
|
|
|
|
|
|
|
|
|
|
|
Impressao do DANFE |
|
|
|
------------------ |
|
|
|
|
|
|
|
|
|
|
|
Alem disso, deve gerar PDFs da DANFE, utilizando a engine Geraldo |
|
|
|
Reports. |
|
|
|
|
|
|
|
|
|
|
|
>>> import geraldo |
|
|
|
>>> import PIL |
|
|
|
>>> from pynfe.utils import bar_code_128 |
|
|
|
|