committed by
Danimar Ribeiro
9 changed files with 6809 additions and 1 deletions
-
12pytrustnfe/exceptions.py
-
8pytrustnfe/nfe/__init__.py
-
9pytrustnfe/xml/schemas/enviNFe_v3.10.xsd
-
6060pytrustnfe/xml/schemas/leiauteNFe_v3.10.xsd
-
9pytrustnfe/xml/schemas/nfe_v3.10.xsd
-
571pytrustnfe/xml/schemas/tiposBasico_v3.10.xsd
-
98pytrustnfe/xml/schemas/xmldsig-core-schema_v1.01.xsd
-
41pytrustnfe/xml/validate.py
-
2setup.py
@ -0,0 +1,12 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Alessandro Fernandes Martini, Trustcode |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
|
|||
class NFeValidationException(ValueError): |
|||
"""Exceção para erro na validação do esquema da NFe""" |
|||
|
|||
def __init__(self, message, *args, **kwargs): |
|||
self.erros = kwargs['erros'] |
|||
self.sent_xml = kwargs['sent_xml'] |
|||
super(NFeValidationException, self).__init__(message, *args, **kwargs) |
|||
@ -0,0 +1,9 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified"> |
|||
<xs:include schemaLocation="leiauteNFe_v3.10.xsd"/> |
|||
<xs:element name="enviNFe" type="TEnviNFe"> |
|||
<xs:annotation> |
|||
<xs:documentation>Schema XML de validação do Pedido de Concessão de Autorização da Nota Fiscal Eletrônica</xs:documentation> |
|||
</xs:annotation> |
|||
</xs:element> |
|||
</xs:schema> |
|||
6060
pytrustnfe/xml/schemas/leiauteNFe_v3.10.xsd
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,9 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified"> |
|||
<xs:include schemaLocation="leiauteNFe_v3.10.xsd"/> |
|||
<xs:element name="NFe" type="TNFe"> |
|||
<xs:annotation> |
|||
<xs:documentation>Nota Fiscal Eletrônica</xs:documentation> |
|||
</xs:annotation> |
|||
</xs:element> |
|||
</xs:schema> |
|||
@ -0,0 +1,571 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!-- PL_008 - 30/07/2013- NT 2013/005 --> |
|||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:nfe="http://www.portalfiscal.inf.br/nfe" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified"> |
|||
<xs:simpleType name="TCodUfIBGE"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Código da UF da tabela do IBGE</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:enumeration value="11"/> |
|||
<xs:enumeration value="12"/> |
|||
<xs:enumeration value="13"/> |
|||
<xs:enumeration value="14"/> |
|||
<xs:enumeration value="15"/> |
|||
<xs:enumeration value="16"/> |
|||
<xs:enumeration value="17"/> |
|||
<xs:enumeration value="21"/> |
|||
<xs:enumeration value="22"/> |
|||
<xs:enumeration value="23"/> |
|||
<xs:enumeration value="24"/> |
|||
<xs:enumeration value="25"/> |
|||
<xs:enumeration value="26"/> |
|||
<xs:enumeration value="27"/> |
|||
<xs:enumeration value="28"/> |
|||
<xs:enumeration value="29"/> |
|||
<xs:enumeration value="31"/> |
|||
<xs:enumeration value="32"/> |
|||
<xs:enumeration value="33"/> |
|||
<xs:enumeration value="35"/> |
|||
<xs:enumeration value="41"/> |
|||
<xs:enumeration value="42"/> |
|||
<xs:enumeration value="43"/> |
|||
<xs:enumeration value="50"/> |
|||
<xs:enumeration value="51"/> |
|||
<xs:enumeration value="52"/> |
|||
<xs:enumeration value="53"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TCodMunIBGE"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Código do Município da tabela do IBGE</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="[0-9]{7}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TChNFe"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Chave da Nota Fiscal Eletrônica</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="44"/> |
|||
<xs:pattern value="[0-9]{44}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TProt"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do Protocolo de Status</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="15"/> |
|||
<xs:pattern value="[0-9]{15}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TRec"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do Recibo do envio de lote de NF-e</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="15"/> |
|||
<xs:pattern value="[0-9]{15}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TStat"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Código da Mensagem enviada</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="3"/> |
|||
<xs:pattern value="[0-9]{3}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TCnpj"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do CNPJ</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="14"/> |
|||
<xs:pattern value="[0-9]{14}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TCnpjVar"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do CNPJ tmanho varíavel (3-14)</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="14"/> |
|||
<xs:pattern value="[0-9]{3,14}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TCnpjOpc"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do CNPJ Opcional</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="14"/> |
|||
<xs:pattern value="[0-9]{0}|[0-9]{14}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TCpf"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do CPF</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="11"/> |
|||
<xs:pattern value="[0-9]{11}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TCpfVar"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do CPF de tamanho variável (3-11)</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="11"/> |
|||
<xs:pattern value="[0-9]{3,11}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_0204v"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com até 2 dígitos inteiros, podendo ter de 1 até 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{1,4}|[1-9]{1}[0-9]{0,1}(\.[0-9]{1,4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_0302a04"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com até 3 dígitos inteiros, podendo ter de 2 até 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{2,4}|[1-9]{1}[0-9]{0,2}(\.[0-9]{2,4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_0302a04Opc"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com até 3 dígitos inteiros e 2 até 4 decimais. Utilizados em TAGs opcionais, não aceita valor zero.</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0\.[0-9]{2,4}|[1-9]{1}[0-9]{0,2}(\.[0-9]{2,4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_0302Max100"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 3 inteiros (no máximo 100), com 2 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0(\.[0-9]{2})?|100(\.00)?|[1-9]{1}[0-9]{0,1}(\.[0-9]{2})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_0302a04Max100"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 3 inteiros (no máximo 100), com até 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="[1-9]{1}(\.[0-9]{2,4})?|[1-9]{1}[0-9]{1}(\.[0-9]{2,4})?|100(\.0{2,4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_0803v"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 8 inteiros, podendo ter de 1 até 3 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{3}|[1-9]{1}[0-9]{0,7}(\.[0-9]{1,3})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1104"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 11 inteiros, podendo ter 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{4}|[1-9]{1}[0-9]{0,10}(\.[0-9]{4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1104v"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 11 inteiros, podendo ter de 1 até 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{1,4}|[1-9]{1}[0-9]{0,10}|[1-9]{1}[0-9]{0,10}(\.[0-9]{1,4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1104Opc"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 11 inteiros, podendo ter 4 decimais (utilizado em tags opcionais)</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0\.[1-9]{1}[0-9]{3}|0\.[0-9]{3}[1-9]{1}|0\.[0-9]{2}[1-9]{1}[0-9]{1}|0\.[0-9]{1}[1-9]{1}[0-9]{2}|[1-9]{1}[0-9]{0,10}(\.[0-9]{4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1110v"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 11 inteiros, podendo ter de 1 até 10 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{1,10}|[1-9]{1}[0-9]{0,10}|[1-9]{1}[0-9]{0,10}(\.[0-9]{1,10})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1203"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 12 inteiros, podendo ter 3 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{3}|[1-9]{1}[0-9]{0,11}(\.[0-9]{3})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1204"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 12 inteiros e 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{1,4}|[1-9]{1}[0-9]{0,11}|[1-9]{1}[0-9]{0,11}(\.[0-9]{4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1204v"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 12 inteiros de 1 até 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{1,4}|[1-9]{1}[0-9]{0,11}|[1-9]{1}[0-9]{0,11}(\.[0-9]{1,4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1204Opc"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 12 inteiros com 1 até 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0\.[0-9]{1,4}|[1-9]{1}[0-9]{0,11}|[1-9]{1}[0-9]{0,11}(\.[0-9]{1,4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1204temperatura"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 12 inteiros, 1 a 4 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0\.[1-9]{1}[0-9]{3}|0\.[0-9]{3}[1-9]{1}|0\.[0-9]{2}[1-9]{1}[0-9]{1}|0\.[0-9]{1}[1-9]{1}[0-9]{2}|[1-9]{1}[0-9]{0,11}(\.[0-9]{4})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1302"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDec_1302Opc"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais, utilizado em tags opcionais</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0\.[0-9]{1}[1-9]{1}|0\.[1-9]{1}[0-9]{1}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TIeDest"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="14"/> |
|||
<xs:pattern value="ISENTO|[0-9]{2,14}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TIeDestNaoIsento"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="14"/> |
|||
<xs:pattern value="[0-9]{2,14}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TIeST"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Inscrição Estadual do ST // acrescentado EM 24/10/08</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="14"/> |
|||
<xs:pattern value="[0-9]{2,14}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TIe"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:maxLength value="14"/> |
|||
<xs:pattern value="[0-9]{2,14}|ISENTO"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TMod"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Modelo Documento Fiscal</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:enumeration value="55"/> |
|||
<xs:enumeration value="65"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TNF"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Número do Documento Fiscal</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="[1-9]{1}[0-9]{0,8}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TSerie"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Série do Documento Fiscal </xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="0|[1-9]{1}[0-9]{0,2}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TUf"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Sigla da UF</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:enumeration value="AC"/> |
|||
<xs:enumeration value="AL"/> |
|||
<xs:enumeration value="AM"/> |
|||
<xs:enumeration value="AP"/> |
|||
<xs:enumeration value="BA"/> |
|||
<xs:enumeration value="CE"/> |
|||
<xs:enumeration value="DF"/> |
|||
<xs:enumeration value="ES"/> |
|||
<xs:enumeration value="GO"/> |
|||
<xs:enumeration value="MA"/> |
|||
<xs:enumeration value="MG"/> |
|||
<xs:enumeration value="MS"/> |
|||
<xs:enumeration value="MT"/> |
|||
<xs:enumeration value="PA"/> |
|||
<xs:enumeration value="PB"/> |
|||
<xs:enumeration value="PE"/> |
|||
<xs:enumeration value="PI"/> |
|||
<xs:enumeration value="PR"/> |
|||
<xs:enumeration value="RJ"/> |
|||
<xs:enumeration value="RN"/> |
|||
<xs:enumeration value="RO"/> |
|||
<xs:enumeration value="RR"/> |
|||
<xs:enumeration value="RS"/> |
|||
<xs:enumeration value="SC"/> |
|||
<xs:enumeration value="SE"/> |
|||
<xs:enumeration value="SP"/> |
|||
<xs:enumeration value="TO"/> |
|||
<xs:enumeration value="EX"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TUfEmi"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Sigla da UF de emissor // acrescentado em 24/10/08 </xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:enumeration value="AC"/> |
|||
<xs:enumeration value="AL"/> |
|||
<xs:enumeration value="AM"/> |
|||
<xs:enumeration value="AP"/> |
|||
<xs:enumeration value="BA"/> |
|||
<xs:enumeration value="CE"/> |
|||
<xs:enumeration value="DF"/> |
|||
<xs:enumeration value="ES"/> |
|||
<xs:enumeration value="GO"/> |
|||
<xs:enumeration value="MA"/> |
|||
<xs:enumeration value="MG"/> |
|||
<xs:enumeration value="MS"/> |
|||
<xs:enumeration value="MT"/> |
|||
<xs:enumeration value="PA"/> |
|||
<xs:enumeration value="PB"/> |
|||
<xs:enumeration value="PE"/> |
|||
<xs:enumeration value="PI"/> |
|||
<xs:enumeration value="PR"/> |
|||
<xs:enumeration value="RJ"/> |
|||
<xs:enumeration value="RN"/> |
|||
<xs:enumeration value="RO"/> |
|||
<xs:enumeration value="RR"/> |
|||
<xs:enumeration value="RS"/> |
|||
<xs:enumeration value="SC"/> |
|||
<xs:enumeration value="SE"/> |
|||
<xs:enumeration value="SP"/> |
|||
<xs:enumeration value="TO"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TAmb"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Ambiente</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:enumeration value="1"/> |
|||
<xs:enumeration value="2"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TVerAplic"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Versão do Aplicativo</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="nfe:TString"> |
|||
<xs:minLength value="1"/> |
|||
<xs:maxLength value="20"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TMotivo"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Motivo</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="nfe:TString"> |
|||
<xs:maxLength value="255"/> |
|||
<xs:minLength value="1"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TJust"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Justificativa</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="nfe:TString"> |
|||
<xs:minLength value="15"/> |
|||
<xs:maxLength value="255"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TServ"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Serviço solicitado</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="nfe:TString"/> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="Tano"> |
|||
<xs:annotation> |
|||
<xs:documentation> Tipo ano</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="[0-9]{2}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TMed"> |
|||
<xs:annotation> |
|||
<xs:documentation> Tipo temp médio em segundos</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="[0-9]{1,4}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TString"> |
|||
<xs:annotation> |
|||
<xs:documentation> Tipo string genérico</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="[!-ÿ]{1}[ -ÿ]{0,}[!-ÿ]{1}|[!-ÿ]{1}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TData"> |
|||
<xs:annotation> |
|||
<xs:documentation> Tipo data AAAA-MM-DD</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="(((20(([02468][048])|([13579][26]))-02-29))|(20[0-9][0-9])-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TTime"> |
|||
<xs:annotation> |
|||
<xs:documentation> Tipo hora HH:MM:SS // tipo acrescentado na v2.0</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0-9])"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TDateTimeUTC"> |
|||
<xs:annotation> |
|||
<xs:documentation>Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm)</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="(((20(([02468][048])|([13579][26]))-02-29))|(20[0-9][0-9])-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))T(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d([\-,\+](0[0-9]|10|11):00|([\+](12):00))"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TPlaca"> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:pattern value="[A-Z]{2,3}[0-9]{4}|[A-Z]{3,4}[0-9]{3}"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
<xs:simpleType name="TCOrgaoIBGE"> |
|||
<xs:annotation> |
|||
<xs:documentation>Tipo Código de orgão (UF da tabela do IBGE + 90 RFB)</xs:documentation> |
|||
</xs:annotation> |
|||
<xs:restriction base="xs:string"> |
|||
<xs:whiteSpace value="preserve"/> |
|||
<xs:enumeration value="11"/> |
|||
<xs:enumeration value="12"/> |
|||
<xs:enumeration value="13"/> |
|||
<xs:enumeration value="14"/> |
|||
<xs:enumeration value="15"/> |
|||
<xs:enumeration value="16"/> |
|||
<xs:enumeration value="17"/> |
|||
<xs:enumeration value="21"/> |
|||
<xs:enumeration value="22"/> |
|||
<xs:enumeration value="23"/> |
|||
<xs:enumeration value="24"/> |
|||
<xs:enumeration value="25"/> |
|||
<xs:enumeration value="26"/> |
|||
<xs:enumeration value="27"/> |
|||
<xs:enumeration value="28"/> |
|||
<xs:enumeration value="29"/> |
|||
<xs:enumeration value="31"/> |
|||
<xs:enumeration value="32"/> |
|||
<xs:enumeration value="33"/> |
|||
<xs:enumeration value="35"/> |
|||
<xs:enumeration value="41"/> |
|||
<xs:enumeration value="42"/> |
|||
<xs:enumeration value="43"/> |
|||
<xs:enumeration value="50"/> |
|||
<xs:enumeration value="51"/> |
|||
<xs:enumeration value="52"/> |
|||
<xs:enumeration value="53"/> |
|||
<xs:enumeration value="90"/> |
|||
<xs:enumeration value="91"/> |
|||
<xs:enumeration value="92"/> |
|||
</xs:restriction> |
|||
</xs:simpleType> |
|||
</xs:schema> |
|||
@ -0,0 +1,98 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!-- ***************************************************--> |
|||
<!-- *** Schema específico para assinaturas XML ***--> |
|||
<!-- *** a partir de certificados do padrão (X509) ***--> |
|||
<!-- *** ICP-Brasil - Projeto Nota Fiscal Eletrônica ***--> |
|||
<!-- ***************************************************--> |
|||
<!-- Schema for XML Signatures--> |
|||
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.1"> |
|||
<element name="Signature" type="ds:SignatureType"/> |
|||
<complexType name="SignatureType"> |
|||
<sequence> |
|||
<element name="SignedInfo" type="ds:SignedInfoType"/> |
|||
<element name="SignatureValue" type="ds:SignatureValueType"/> |
|||
<element name="KeyInfo" type="ds:KeyInfoType"/> |
|||
</sequence> |
|||
<attribute name="Id" type="ID" use="optional"/> |
|||
</complexType> |
|||
<complexType name="SignatureValueType"> |
|||
<simpleContent> |
|||
<extension base="base64Binary"> |
|||
<attribute name="Id" type="ID" use="optional"/> |
|||
</extension> |
|||
</simpleContent> |
|||
</complexType> |
|||
<complexType name="SignedInfoType"> |
|||
<sequence> |
|||
<element name="CanonicalizationMethod"> |
|||
<complexType> |
|||
<attribute name="Algorithm" type="anyURI" use="required" fixed="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> |
|||
</complexType> |
|||
</element> |
|||
<element name="SignatureMethod"> |
|||
<complexType> |
|||
<attribute name="Algorithm" type="anyURI" use="required" fixed="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> |
|||
</complexType> |
|||
</element> |
|||
<element name="Reference" type="ds:ReferenceType"/> |
|||
</sequence> |
|||
<attribute name="Id" type="ID" use="optional"/> |
|||
</complexType> |
|||
<complexType name="ReferenceType"> |
|||
<sequence> |
|||
<element name="Transforms" type="ds:TransformsType"> |
|||
<!-- Garante a unicidade do atributo --> |
|||
<unique name="unique_Transf_Alg"> |
|||
<selector xpath="./*"/> |
|||
<field xpath="@Algorithm"/> |
|||
</unique> |
|||
</element> |
|||
<element name="DigestMethod"> |
|||
<complexType> |
|||
<attribute name="Algorithm" type="anyURI" use="required" fixed="http://www.w3.org/2000/09/xmldsig#sha1"/> |
|||
</complexType> |
|||
</element> |
|||
<element name="DigestValue" type="ds:DigestValueType"/> |
|||
</sequence> |
|||
<attribute name="Id" type="ID" use="optional"/> |
|||
<attribute name="URI" use="required"> |
|||
<simpleType> |
|||
<restriction base="anyURI"> |
|||
<minLength value="2"/> |
|||
</restriction> |
|||
</simpleType> |
|||
</attribute> |
|||
<attribute name="Type" type="anyURI" use="optional"/> |
|||
</complexType> |
|||
<complexType name="TransformsType"> |
|||
<sequence> |
|||
<element name="Transform" type="ds:TransformType" minOccurs="2" maxOccurs="2"/> |
|||
</sequence> |
|||
</complexType> |
|||
<complexType name="TransformType"> |
|||
<sequence minOccurs="0" maxOccurs="unbounded"> |
|||
<element name="XPath" type="string"/> |
|||
</sequence> |
|||
<attribute name="Algorithm" type="ds:TTransformURI" use="required"/> |
|||
</complexType> |
|||
<complexType name="KeyInfoType"> |
|||
<sequence> |
|||
<element name="X509Data" type="ds:X509DataType"/> |
|||
</sequence> |
|||
<attribute name="Id" type="ID" use="optional"/> |
|||
</complexType> |
|||
<complexType name="X509DataType"> |
|||
<sequence> |
|||
<element name="X509Certificate" type="base64Binary"/> |
|||
</sequence> |
|||
</complexType> |
|||
<simpleType name="DigestValueType"> |
|||
<restriction base="base64Binary"/> |
|||
</simpleType> |
|||
<simpleType name="TTransformURI"> |
|||
<restriction base="anyURI"> |
|||
<enumeration value="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> |
|||
<enumeration value="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> |
|||
</restriction> |
|||
</simpleType> |
|||
</schema> |
|||
@ -0,0 +1,41 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Alessandro Fernandes Martini <alessandrofmartini@gmail.com>, Trustcode |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import os |
|||
import re |
|||
|
|||
from lxml import etree |
|||
|
|||
PATH = os.path.dirname(os.path.abspath(__file__)) |
|||
SCHEMA = os.path.join(PATH, 'schemas/nfe_v3.10.xsd') |
|||
|
|||
|
|||
def pop_encoding(xml): |
|||
xml = xml.split('\n') |
|||
if re.match(r'<\?xml version=', xml[0]): |
|||
xml.pop(0) |
|||
return '\n'.join(xml) |
|||
|
|||
|
|||
def valida_nfe(nfe): |
|||
xml = pop_encoding(nfe).encode('utf-8') |
|||
nfe = etree.fromstring(xml) |
|||
esquema = etree.XMLSchema(etree.parse(SCHEMA)) |
|||
esquema.validate(nfe) |
|||
erros = [x.message for x in esquema.error_log] |
|||
error_msg = '{field} inválido: {valor}.' |
|||
unexpected = '{unexpected} não é esperado. O valor esperado é {expected}' |
|||
namespace = '{http://www.portalfiscal.inf.br/nfe}' |
|||
mensagens = [] |
|||
for erro in erros: |
|||
campo = re.findall(r"'([^']*)'", erro)[0] |
|||
nome = campo[campo.find('}') + 1: ] |
|||
valor = nfe.find('.//' + campo).text |
|||
if 'Expected is' in erro: |
|||
expected_name = re.findall('\(.*?\)', erro) |
|||
valor = unexpected.format(unexpected=nome, expected=expected_name) |
|||
mensagem = error_msg.format(field=campo.replace(namespace, ''), |
|||
valor=valor) |
|||
mensagens.append(mensagem) |
|||
return "\n".join(mensagens) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue