9 changed files with 671 additions and 105 deletions
-
4pynfe/data/XSDs/README
-
3pynfe/processamento/assinatura.py
-
77pynfe/processamento/validacao.py
-
15run_tests.py
-
196tests/01-basico.txt
-
34tests/02-modelo-07-validacao.txt
-
223tests/xml/NFe.xml
-
1tests/xml/NFe_assinada.xml
-
223tests/xml/NFe_falhaSchema.xml
@ -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) |
|||
@ -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 |
|||
@ -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
File diff suppressed because it is too large
View File
@ -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> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue