Browse Source

Merge branch 'master' of github.com:marinho/PyNFe

tags/0.1
Marinho Brandao 15 years ago
parent
commit
97bcf38983
  1. 4
      pynfe/data/XSDs/README
  2. 3
      pynfe/processamento/assinatura.py
  3. 77
      pynfe/processamento/validacao.py
  4. 15
      run_tests.py
  5. 196
      tests/01-basico.txt
  6. 34
      tests/02-modelo-07-validacao.txt
  7. 223
      tests/xml/NFe.xml
  8. 1
      tests/xml/NFe_assinada.xml
  9. 223
      tests/xml/NFe_falhaSchema.xml

4
pynfe/data/XSDs/README

@ -58,10 +58,10 @@ Descrição unitária de cada schema
- Pedido de Cancelamento de NF-e processado - Pedido de Cancelamento de NF-e processado
- inclui: leiauteCancNFe_v1.07 - inclui: leiauteCancNFe_v1.07
- procInutNFe_v1.07:
- procInutNFe_v1.07
- Pedido de inutilzação de númeração de NF-e processado - Pedido de inutilzação de númeração de NF-e processado
- inclui: leiauteInutNFe_v1.07 - inclui: leiauteInutNFe_v1.07
- procNFe_v1.10 - procNFe_v1.10
- NF-e processada - NF-e processada
- incluid: leiauteNFe_v1.10
- incluid: leiauteNFe_v1.10

3
pynfe/processamento/assinatura.py

@ -243,5 +243,4 @@ class AssinaturaA1(Assinatura):
doc_xml.freeDoc() doc_xml.freeDoc()
# E, por fim, desativa todas as funções ativadas anteriormente # E, por fim, desativa todas as funções ativadas anteriormente
self._desativar_funcoes_criptograficas()
self._desativar_funcoes_criptograficas()

77
pynfe/processamento/validacao.py

@ -1,3 +1,76 @@
class Validacao(object):
pass
#-*- coding:utf-8 -*-
from os import path
try:
from lxml import etree
except ImportError:
try:
# Python 2.5 - cElementTree
import xml.etree.cElementTree as etree
except ImportError:
try:
# Python 2.5 - ElementTree
import xml.etree.ElementTree as etree
except ImportError:
try:
# Instalacao normal do cElementTree
import cElementTree as etree
except ImportError:
try:
# Instalacao normal do ElementTree
import elementtree.ElementTree as etree
except ImportError:
raise Exception('Falhou ao importar lxml/ElementTree')
XSD_FOLDER = "pynfe/data/XSDs/"
XSD_NFE="nfe_v1.10.xsd"
XSD_NFE_PROCESSADA="procNFe_v1.10.xsd"
XSD_PD_CANCELAR_NFE="procCancNFe_v1.07.xsd"
XSD_PD_INUTILIZAR_NFE="procInutNFe_v1.07.xsd"
def get_xsd(xsd_file):
"""Retorna o caminho absoluto para um arquivo xsd.
Argumentos:
xsd_file - nome do arquivo xsd (utilizar nomes definidos em validacao.py)
"""
return path.abspath(path.join(XSD_FOLDER, xsd_file))
class Validacao(object):
'''Valida documentos xml a partir do xsd informado.'''
def __init__(self):
self.clear_cache()
def clear_cache(self):
self.MEM_CACHE = {}
def validar_xml(self, xml_path, xsd_file, use_assert=False):
'''Valida um arquivo xml.
Argumentos:
xml_path - caminho para arquivo xml
xsd_file - caminho para o arquivo xsd
use_assert - levantar exceção caso documento não valide?
'''
return self.validar_etree(etree.parse(xml_path), xsd_file, use_assert)
def validar_etree(self, xml_doc, xsd_file, use_assert=False):
'''Valida um documento lxml diretamente.
Argumentos:
xml_doc - documento etree
xsd_file - caminho para o arquivo xsd
use_assert - levantar exceção caso documento não valide?
'''
xsd_filepath = get_xsd(xsd_file)
try:
# checa se o schema ja existe no cache
xsd_schema = self.MEM_CACHE[xsd_filepath]
except:
# lê xsd e atualiza cache
xsd_doc = etree.parse(xsd_filepath)
xsd_schema = etree.XMLSchema(xsd_doc)
self.MEM_CACHE[xsd_file] = xsd_schema
return use_assert and xsd_schema.assertValid(xml_doc) \
or xsd_schema.validate(xml_doc)

15
run_tests.py

@ -1,11 +1,24 @@
import sys, doctest, os, glob import sys, doctest, os, glob
from getopt import gnu_getopt as getopt
CUR_DIR = os.path.dirname(os.path.abspath(__file__)) CUR_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, CUR_DIR) sys.path.insert(0, CUR_DIR)
if __name__ == '__main__': if __name__ == '__main__':
run_level = None
optlist, args = getopt(sys.argv[1:], "l:", ['--level='])
for opt, arg in optlist:
if opt in ("-l", "--list"):
run_level = arg.zfill(2)
# Test each package # Test each package
test_files = glob.glob('%s/*.txt' % os.path.join(CUR_DIR, 'tests'))
if run_level is None:
search_path = '%s/*.txt' % os.path.join(CUR_DIR, 'tests')
else: search_path = '%s/%s-*.txt' % \
(os.path.join(CUR_DIR, 'tests'), run_level)
test_files = glob.glob(search_path)
test_files = map(lambda i: i[len(CUR_DIR)+1:], test_files) test_files = map(lambda i: i[len(CUR_DIR)+1:], test_files)
# Run the tests # Run the tests

196
tests/01-basico.txt

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

34
tests/02-modelo-07-validacao.txt

@ -0,0 +1,34 @@
Validação
---------
A validação dos arquivos de nota fiscal são controladas pelo módulo validacao.
>>> from pynfe.processamento.validacao import *
A classe Validacao é utilizada para validar os tanto arquivos xml quanto documentos
etree. Não há problemas em utilizar list-comprehension com a mesma pois ela implementa
um cache simples.
>>> from lxml import etree
>>> validador = Validacao()
>>>
>>> nfe = 'tests/xml/NFe.xml'
>>> nfe_assin = 'tests/xml/NFe_assinada.xml'
>>> nfe_inval = 'tests/xml/NFe_falhaSchema.xml'
>>>
>>> try: validador.validar_xml(nfe, XSD_NFE, True)
... except Exception, e: print unicode(repr(e))
True
>>> try: validador.validar_xml(nfe_inval, XSD_NFE, False)
... except Exception, e: print unicode(repr(e))
False
>>> try: validador.validar_xml(nfe_assin, XSD_NFE_PROCESSADA, True)
... except Exception, e: print unicode(repr(e))
True
Note que o schema utilizado para validação contra o xml é definido por variáveis
globais presentes no módulo. São elas:
- XSD_NFE : valida nfe's não certificadas
- XSD_NFE_PROCESSADA : valida nfe's certificadas
- XSD_PD_CANCELAR_NFE : valida um pedido de cancelamento de nfe
- XSD_PD_INUTILIZAR_NFE : valida um pedido de inutilização de nfe

223
tests/xml/NFe.xml

@ -0,0 +1,223 @@
<?xml version="1.0" encoding="utf-8"?>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe35080599999090910270550010000000015180051273" versao="1.10">
<ide>
<cUF>35</cUF>
<cNF>518005127</cNF>
<natOp>Venda a vista</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>1</serie>
<nNF>1</nNF>
<dEmi>2008-05-06</dEmi>
<dSaiEnt>2008-05-06</dSaiEnt>
<tpNF>0</tpNF>
<cMunFG>3550308</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>NF-eletronica.com</verProc>
</ide>
<emit>
<CNPJ>99999090910270</CNPJ>
<xNome>NF-e Associacao NF-e</xNome>
<xFant>NF-e</xFant>
<enderEmit>
<xLgr>Rua Central</xLgr>
<nro>100</nro>
<xCpl>Fundos</xCpl>
<xBairro>Distrito Industrial</xBairro>
<cMun>3502200</cMun>
<xMun>Angatuba</xMun>
<UF>SP</UF>
<CEP>17100171</CEP>
<cPais>1058</cPais>
<xPais>Brasil</xPais>
<fone>1733021717</fone>
</enderEmit>
<IE>123456789012</IE>
</emit>
<dest>
<CNPJ>00000000000191</CNPJ>
<xNome>DISTRIBUIDORA DE AGUAS MINERAIS</xNome>
<enderDest>
<xLgr>AV DAS FONTES</xLgr>
<nro>1777</nro>
<xCpl>10 ANDAR</xCpl>
<xBairro>PARQUE FONTES</xBairro>
<cMun>5030801</cMun>
<xMun>Sao Paulo</xMun>
<UF>SP</UF>
<CEP>13950000</CEP>
<cPais>1058</cPais>
<xPais>BRASIL</xPais>
<fone>1932011234</fone>
</enderDest>
<IE></IE>
</dest>
<retirada>
<CNPJ>99171171000194</CNPJ>
<xLgr>AV PAULISTA</xLgr>
<nro>12345</nro>
<xCpl>TERREO</xCpl>
<xBairro>CERQUEIRA CESAR</xBairro>
<cMun>3550308</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</retirada>
<entrega>
<CNPJ>99299299000194</CNPJ>
<xLgr>AV FARIA LIMA</xLgr>
<nro>1500</nro>
<xCpl>15 ANDAR</xCpl>
<xBairro>PINHEIROS</xBairro>
<cMun>3550308</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</entrega>
<det nItem="1">
<prod>
<cProd>00001</cProd>
<cEAN />
<xProd>Agua Mineral</xProd>
<CFOP>5101</CFOP>
<uCom>dz</uCom>
<qCom>1000000.0000</qCom>
<vUnCom>1</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib />
<uTrib>und</uTrib>
<qTrib>12000000.0000</qTrib>
<vUnTrib>1</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<det nItem="2">
<prod>
<cProd>00002</cProd>
<cEAN />
<xProd>Agua Mineral</xProd>
<CFOP>5101</CFOP>
<uCom>pack</uCom>
<qCom>5000000.0000</qCom>
<vUnCom>2</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib />
<uTrib>und</uTrib>
<qTrib>3000000.0000</qTrib>
<vUnTrib>0.3333</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<total>
<ICMSTot>
<vBC>20000000.00</vBC>
<vICMS>18.00</vICMS>
<vBCST>0</vBCST>
<vST>0</vST>
<vProd>20000000.00</vProd>
<vFrete>0</vFrete>
<vSeg>0</vSeg>
<vDesc>0</vDesc>
<vII>0</vII>
<vIPI>0</vIPI>
<vPIS>130000.00</vPIS>
<vCOFINS>400000.00</vCOFINS>
<vOutro>0</vOutro>
<vNF>20000000.00</vNF>
</ICMSTot>
</total>
<transp>
<modFrete>0</modFrete>
<transporta>
<CNPJ>99171171000191</CNPJ>
<xNome>Distribuidora de Bebidas Fazenda de SP Ltda.</xNome>
<IE>171999999119</IE>
<xEnder>Rua Central 100 - Fundos - Distrito Industrial</xEnder>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</transporta>
<veicTransp>
<placa>BXI1717</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</veicTransp>
<reboque>
<placa>BXI1818</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</reboque>
<vol>
<qVol>10000</qVol>
<esp>CAIXA</esp>
<marca>LINDOYA</marca>
<nVol>500</nVol>
<pesoL>1000000000.000</pesoL>
<pesoB>1200000000.000</pesoB>
<lacres>
<nLacre>XYZ10231486</nLacre>
</lacres>
</vol>
</transp>
<infAdic>
<infAdFisco>Nota Fiscal de exemplo NF-eletronica.com</infAdFisco>
</infAdic>
</infNFe>
</NFe>

1
tests/xml/NFe_assinada.xml
File diff suppressed because it is too large
View File

223
tests/xml/NFe_falhaSchema.xml

@ -0,0 +1,223 @@
<?xml version="1.0" encoding="utf-8"?>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe35080599999090910270550010000000015180051273" versao="1.10">
<ide>
<cUF>35</cUF>
<cNF>518005127</cNF>
<natOp>Venda a vista</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>1</serie>
<nNF>1</nNF>
<dEmi>2008-05-06</dEmi>
<dSaiEnt>2008-05-06</dSaiEnt>
<tpNF>0</tpNF>
<cMunFG>3550308</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>NF-eletronica.com 123456</verProc>
</ide>
<emit>
<CNPJ>99999090910270</CNPJ>
<xNome>NF-e Associacao NF-e</xNome>
<xFant>NF-e</xFant>
<enderEmit>
<xLgr>Rua Central</xLgr>
<nro>100</nro>
<xCpl>Fundos</xCpl>
<xBairro>Distrito Industrial</xBairro>
<cMun>3502200</cMun>
<xMun>Angatuba</xMun>
<UF>SP</UF>
<CEP>17100171</CEP>
<cPais>1058</cPais>
<xPais>Brasil</xPais>
<fone>1733021717</fone>
</enderEmit>
<IE>123456789012</IE>
</emit>
<dest>
<CNPJ>00000000000191</CNPJ>
<xNome>DISTRIBUIDORA DE AGUAS MINERAIS</xNome>
<enderDest>
<xLgr>AV DAS FONTES</xLgr>
<nro>1777</nro>
<xCpl>10 ANDAR</xCpl>
<xBairro>PARQUE FONTES</xBairro>
<cMun>5030801</cMun>
<xMun>Sao Paulo</xMun>
<UF>SP</UF>
<CEP>13950000</CEP>
<cPais>1058</cPais>
<xPais>BRASIL</xPais>
<fone>1932011234</fone>
</enderDest>
<IE></IE>
</dest>
<retirada>
<CNPJ>99171171000194</CNPJ>
<xLgr>AV PAULISTA</xLgr>
<nro>12345</nro>
<xCpl>TERREO</xCpl>
<xBairro>CERQUEIRA CESAR</xBairro>
<cMun>3550308</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</retirada>
<entrega>
<CNPJ>99299299000194</CNPJ>
<xLgr>AV FARIA LIMA</xLgr>
<nro>1500</nro>
<xCpl>15 ANDAR</xCpl>
<xBairro>PINHEIROS</xBairro>
<cMun>3550308</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</entrega>
<det nItem="1">
<prod>
<cProd>00001</cProd>
<cEAN />
<xProd>Agua Mineral</xProd>
<CFOP>5101</CFOP>
<uCom>dz</uCom>
<qCom>1000000.00</qCom>
<vUnCom>1</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib />
<uTrib>und</uTrib>
<qTrib>12000000.00</qTrib>
<vUnTrib>1</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<det nItem="2">
<prod>
<cProd>00002</cProd>
<cEAN />
<xProd>Agua Mineral</xProd>
<CFOP>5101</CFOP>
<uCom>pack</uCom>
<qCom>5000000.0000</qCom>
<vUnCom>2</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib />
<uTrib>und</uTrib>
<qTrib>3000000.0000</qTrib>
<vUnTrib>0.3333</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<total>
<ICMSTot>
<vBC>20000000.00</vBC>
<vICMS>18.00</vICMS>
<vBCST>0</vBCST>
<vST>0</vST>
<vProd>20000000.00</vProd>
<vFrete>0</vFrete>
<vSeg>0</vSeg>
<vDesc>0</vDesc>
<vII>0</vII>
<vIPI>0</vIPI>
<vPIS>130000.00</vPIS>
<vCOFINS>400000.00</vCOFINS>
<vOutro>0</vOutro>
<vNF>20000000.00</vNF>
</ICMSTot>
</total>
<transp>
<modFrete>0</modFrete>
<transporta>
<CNPJ>99171171000191</CNPJ>
<xNome>Distribuidora de Bebidas Fazenda de SP Ltda.</xNome>
<IE>171999999119</IE>
<xEnder>Rua Central 100 - Fundos - Distrito Industrial</xEnder>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</transporta>
<veicTransp>
<placa>BXI1717</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</veicTransp>
<reboque>
<placa>BXI1818</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</reboque>
<vol>
<qVol>10000</qVol>
<esp>CAIXA</esp>
<marca>LINDOYA</marca>
<nVol>500</nVol>
<pesoL>1000000000.000</pesoL>
<pesoB>1200000000.000</pesoB>
<lacres>
<nLacre>XYZ10231486</nLacre>
</lacres>
</vol>
</transp>
<infAdic>
<infAdFisco>Nota Fiscal de exemplo NF-eletronica.com</infAdFisco>
</infAdic>
</infNFe>
</NFe>
Loading…
Cancel
Save