Giter Club home page Giter Club logo

nfelib's Introduction

nfelib - bindings Python para e ler e gerir XML de NF-e, NFS-e nacional, CT-e, MDF-e, BP-e

PyPI Downloads

Porque escolher a nfelib

  • Simples e confiável. As outras bibliotecas costumam ter dezenas de milhares de linhas de código feito tudo manualmente para fazer o que o nfelib faz tudo automaticamente com algumas linhas para gerir código com o xsdata a partir dos últimos pacotes xsd da Fazenda. O xsdata é uma biblioteca de databinding extremamente bem escrita e bem testada. A própria nfelib tem testes para ler e gerir todos documentos fiscais.
  • Completa: já que gerir os bindings ficou trivial, a nfelib mantém atualizada todos os bindings para interagir com todos os serviços e eventos de NF-e, NFS-e nacional, CT-e, MDF-e, BP-e. Os testes detetam também quando sai uma nova versão de algum esquema.

Instalação

pip install nfelib

Como usar

NF-e

>>> # Ler o XML de uma NF-e:
>>> from nfelib.nfe.bindings.v4_0.proc_nfe_v4_00 import NfeProc
>>> nfe_proc = NfeProc.from_path("nfelib/nfe/samples/v4_0/leiauteNFe/NFe35200159594315000157550010000000012062777161.xml")
>>> # (pode ser usado também o metodo from_xml(xml) )
>>>
>>> nfe_proc.NFe.infNFe.emit.CNPJ
'59594315000157'
>>> nfe_proc.NFe.infNFe.emit
Tnfe.InfNfe.Emit(CNPJ='59594315000157', CPF=None, xNome='Akretion LTDA', xFant='Akretion', enderEmit=TenderEmi(xLgr='Rua Paulo Dias', nro='586', xCpl=None, xBairro=None, cMun='3501152', xMun='Alumínio', UF=<TufEmi.SP: 'SP'>, CEP='18125000', cPais=<TenderEmiCPais.VALUE_1058: '1058'>, xPais=<TenderEmiXPais.BRASIL: 'Brasil'>, fone='2130109965'), IE='755338250133', IEST=None, IM=None, CNAE=None, CRT=<EmitCrt.VALUE_1: '1'>)
>>> nfe_proc.NFe.infNFe.emit.enderEmit.UF.value
'SP'
>>>
>>> # Serializar uma NF-e:
>>> nfe_proc.to_xml()
'<?xml version="1.0" encoding="UTF-8"?>\n<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">\n  <NFe>\n    <infNFe versao="4.00" Id="35200159594315000157550010000000012062777161">\n      <ide>\n        <cUF>35</cUF>\n        <cNF>06277716</cNF>\n        <natOp>Venda</natOp>\n        <mod>55</mod>\n        <serie>1</serie>\n        <nNF>1</nNF>\n        <dhEmi>2020-01-01T12:00:00+01:00</dhEmi>\n        <dhSaiEnt>2020-01-01T12:00:00+01:00</dhSaiEnt>\n        <tpNF>1</tpNF>\n        <idDest>1</idDest>\n [...]
>>>
>>> # Montar uma NFe do zero:
>>> from nfelib.nfe.bindings.v4_0.nfe_v4_00 import Nfe
>>> nfe=Nfe(infNFe=Nfe.InfNfe(emit=Nfe.InfNfe.Emit(xNome="Minha Empresa", CNPJ='59594315000157')))
>>> nfe
Nfe(infNFe=Tnfe.InfNfe(ide=None, emit=Tnfe.InfNfe.Emit(CNPJ='59594315000157', CPF=None, xNome='Minha Empresa', xFant=None, enderEmit=None, IE=None, IEST=None, IM=None, CNAE=None, CRT=None), avulsa=None, dest=None, retirada=None, entrega=None, autXML=[], det=[], total=None, transp=None, cobr=None, pag=None, infIntermed=None, infAdic=None, exporta=None, compra=None, cana=None, infRespTec=None, infSolicNFF=None, versao=None, Id=None), infNFeSupl=None, signature=None)
>>> 
>>> # Validar o XML de uma nota:
>>> nfe.validate_xml()
["Element '{http://www.portalfiscal.inf.br/nfe}infNFe': The attribute 'versao' is required but missing.", "Element '{http://www.portalfiscal.inf.br/nfe}infNFe': The attribute 'Id' is required but missing." [...]

NFS-e padrão nacional

>>> # Ler uma NFS-e:
>>>> from nfelib.nfse.bindings.v1_0.nfse_v1_00 import Nfse
>>> nfse = Nfse.from_path("alguma_nfse.xml")
>>>
>>> # Serializar uma NFS-e:
>>> nfse.to_xml()
>>> # Ler uma DPS:
>>>> from nfelib.nfse.bindings.v1_0.dps_v1_00 import Dps
>>> dps = Nfse.from_path("nfelib/nfse/samples/v1_0/GerarNFSeEnvio-env-loterps.xml")
>>>
>>> # Serializar uma DPS:
>>> dps.to_xml()

MDF-e

>>> # Ler um MDF-e:
>>>> from nfelib.mdfe.bindings.v3_0.mdfe_v3_00 import Mdfe
>>> mdfe = Mdfe.from_path("nfelib/mdfe/samples/v3_0/ComPagtoPIX_41210780568835000181580010402005751006005791-procMDFe.xml")
>>>
>>> # Serializar um MDF-e:
>>> mdfe.to_xml()

CT-e

>>> # Ler um CT-e:
>>>> from nfelib.cte.bindings.v4_0.cte_v4_00 import Cte
>>> cte = Cte.from_path("nfelib/cte/samples/v4_0/43120178408960000182570010000000041000000047-cte.xml")
>>>
>>> # Serializar um CT-e:
>>> cte.to_xml()

BP-e

>>> # Ler um BP-e:
>>>> from nfelib.bpe.bindings.v1_0.bpe_v1_00 import Bpe
>>> bpe = Bpe.from_path("algum_bpe.xml")
>>>
>>> # Serializar um BP-e:
>>> bpe.to_xml()

Desenvolvimento / testes

Para rodar os testes:

pytest

Para atualizar os bindings:

  1. baixar o novo zip dos esquemas e atualizar a pasta nfelib/<nfe|nfse|cte|mdfe|bpe>/schemas/<versao>/

  2. gerir os bindings de um pacote de esquemas xsd, por examplo da NF-e:

    xsdata generate nfelib/nfe/schemas/v4_0 --package nfelib.nfe.bindings.v4_0

Para gerir todos bindings com xsdata:

./script.sh

Versões dos esquemas e pastas

A nfelib usa apenas 2 dígitos para caracterizar a versão. Isso foi decidido observando que a Fazenda nunca usa o terceiro dígito da versão e que a mudança do segundo dígito já caracteriza uma mudança maior. Nisso qualquer alteração de esquema que não mudar o primeiro nem o segundo dígito da versão do esquema vai na mesma pasta e se sobreponha a antiga versão, assumindo que é possível usar o mais novo esquema no lugar do antigo (por exemplo é possível ler uma NFe 4.00 pacote nº 9j (NT 2022.003 v.1.00b) com os bindings da versão nfe pacote nº 9k (NT 2023.001 v.1.20).

Pelo contrário, caso houver uma mudança maior afetando os 2 primeiros dígitos como NFe 3.0 e NFe 3.1 ou NFe 3.1 e NFe 4.0, será possível também suportar as várias versões ao mesmo tempo usando pastas diferentes. Assim seria possível por exemplo emitir a futura NFe 5.0 e ainda importar uma NFe 4.0.

nfelib's People

Contributors

antoniospneto avatar felipemotter avatar felipezago avatar mbcosta avatar mileo avatar renatonlima avatar rvalyi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nfelib's Issues

classes mais leves removando as assinaturas

assinatura eh gerenciada por fora geralmente, entao vale a pena tirar os elementos
<xs:element ref="ds:Signature"/>
e <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema_v1.01.xsd"/>
no procprocessamento que isso alivia bastante o python gerido.

Validação de xml

Sei que não é um problema, mas preciso saber se existe algum método onde eu ja passo o xml(nfce) e verifico se ele é valido baseado no schema da sefaz

Validação de CNPJs

Implementação das seguintes regras de validações:

207 Rejeição: CNPJ do emitente inválido

Ao carregar um XML deve ser validado o valor da TAG: infNFe/emit/CNPJ se o valor é um CNPJ válido.

208 Rejeição: CNPJ do destinatário inválido

Ao carregar um XML deve ser validado o valor da TAG: infNFe/dest/CNPJ se o valor é um CNPJ válido.

Deve ser adicionado a dependência do erpbrasil.base para utilizar o método de validação do CNPJ.

Não traz o nó 'protNFe'

Não consigo pegar os atributos de protNFe. Quando é feito o parse do arquivo, não é carregado este nós junto. Por favor, me ajudem com isso. Desde já, grato.

dynamic tax class constructor

The ICMS, IPI and other taxes have as much subclasses as the number of possible tags. This is quite verbose and it would be better to have a dynamic factory of the proper tax classes according to their constructor values.

Complexity of generate code

Your call... This might not be important...

McCabe measure of cyclomatic complexity is built into flake8 with a recommended default value of 10.

Perhaps this block of generated code might be a bit too complex.

$ flake8 . --select=C --max-complexity=37

./nfelib/v4_00/retDistDFeInt.py:177:1:      C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retConsStatServ.py:177:1:      C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retEnvEvento.py:177:1:    C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retInutNFe.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/distDFeInt.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retEnvCCe.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retEnvEventoCancNFe.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retConsReciNFe.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retEnviNFe.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retConsCad.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retConsSitNFe.py:177:1: C901 'TryExcept 177' is too complex (164)
./nfelib/v4_00/retEnvConfRecebto.py:177:1: C901 'TryExcept 177' is too complex (164)

Inconpatibilidade com AWS Lambda

Olá.

Estou tentando utilizar a lib com AWS Lambda mas não estou conseguindo.
Mesmo criando uma layer na hora de importar da erro de timeout.

import json
from nfelib.v4_00 import leiauteNFe_sub as parser



def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

image

Alguém já teve esse problema, conseguem me ajudar?

doc

better example: get_emit().get_CPF() -> get_emit().get_CNPJ()

Gerar danfe

Com essa biblioteca, é possível montar o PDF de um DANFE com os dados de um DANFE já gerado e validado?

Validações da Tag de Identificação do Emitente

Validações da Tag de Identificação do Emitente

Campo-Seq Modelo Regra de Validação Aplic. Msg Efeito Descrição Erro
C02-10 55/65 Se informado CNPJ do emitente: – CNPJ com zeros, nulo ou DV inválido Obrig. 207 Rej. Rejeição: CNPJ do emitente inválido
C02-20 55/65 Se informado CNPJ do emitente: – CNPJ Base do Emitente difere do CNPJ Base da primeira NF-e do Lote recebido (NT 2018.001) Facul. 560 Rej. Rejeição: CNPJ base/CPF do emitente difere do CNPJ base/CPF da primeira NF-e do lote recebido
C02-30 55/65 Se informado CNPJ do Emitente: - Série difere da faixa para emitente CNPJ: faixa 000-909 (NT 2018.001) Obrig. 503 Rej. Rejeição: CNPJ do emitente com Série incompatível
C02a-04 65 Se informado CPF do emitente: – Se NFC-e (modelo 65) (NT 2015.002) Obrig. 337 Rej. Rejeição: NFC-e para emitente pessoa física
C02a-08 55 Se informado CPF do emitente: – Se NF-e (modelo 55) Observação: Regra de validação opcional a critério da UF. (NT 2018.001) Obrig. 652 Rej. Rejeição: NF-e para emitente pessoa física
C02a-10 55 Se informado CPF do emitente: – Série difere da faixa para emitente CPF: 890-899 e 910-969 (NT 2018.001/ NT 2015.002) Obrig. 495 Rej. Rejeição: CPF do Emitente com Série incompatível
C02a-14 55 Se informado CPF do Emitente: – Série difere da faixa para emitente CPF: 890-899 e 910-919 Observação: Regra de validação opcional a critério da UF. Permite a emissão de NF-e por pessoa física, somente no serviço de Nota Fiscal Avulsa no site da UF. (NT 2018.001) Obrig. 407 Rej. Rejeição: CPF do Emitente somente no serviço de Nota Fiscal Avulsa no site do Fisco
C02a-20 55 Se informado CPF do emitente: – CPF com zeros, nulo, 111..., 222..., ..., ou DV inválido (NT 2012/003) (NT 2015.002) Obrig. 401 Rej. Rejeição: CPF do emitente inválido
C02a-30 55 Se informado CPF do emitente: – CPF do Emitente difere do CPF da primeira NF-e do Lote recebido (NT 2018.001) Facul. 560 Rej. Rejeição: CNPJ Base/CPF do emitente difere do CNPJ Base/CPF da primeira NF-e do lote recebido
C10-10 55/65 Código do Município do Emitente inexistente (Tabela Municípios IBGE) (NT 2015.002) Obrig. 272 Rej. Rejeição: Código Município do Emitente inexistente
C10-20 55/65 Código do Município do Emitente (2 primeiras posições) difere do Código da UF do emitente Obrig. 273 Rej. Rejeição: Código Município do Emitente: difere da UF do emitente
C12-10 55/65 Sigla da UF do Emitente difere da UF do Web Service Obrig. 247 Rej. Rejeição: Sigla da UF do Emitente diverge da UF autorizadora
C17-10 55/65 IE Emitente com zeros ou nulo Obrig. 229 Rej. Rejeição: IE do emitente não informada
C17-20 55/65 Se IE diferente de “ISENTO”, validar a Inscrição Estadual: - IE Emitente inválida para a UF: erro no tamanho, na composição da IE, ou no dígito verificador (*2) (NT 2018.001) Obrig. 209 Rej. Rejeição: IE do emitente inválida
C17-30 55/65 Se IE informada com “ISENTO”: - Se modelo = 65 ou Série difere da faixa 890-919 (NT 2018.001) Obrig. 554 Rej. Rejeição: IE do Emitente informada como ISENTO indevidamente
C18-10 65 NFC-e não deve informar IE de Substituto Tributário (tag:emit/IEST) Obrig. 718 Rej. Rejeição: NFC-e não deve informar IE de Substituto Tributário
C18-14 55 Se informada a IE do Substituto Tributário para uma operação com Exterior ou Operação Interna (tag:idDest=1 ou 3) Exceção: A critério da UF, poderá ser aceita a informação da IE-ST em operação interna. (NT 2015.002) Obrig. 347 Rej. Rejeição: Informada IE do substituto tributário em operação que não é interestadual
C18-20 55 Se informada operação de Faturamento Direto para veículos novos (id:J02, tag:tpOp = 2): – UF do Local de Entrega (id:G09) não informada Observação: A UF é necessária na validação da IEST nestas operações. Vide Convênio ICMS 51/00. Obrig. 478 Rej. Rejeição: Local da entrega não informado para faturamento direto de veículos novos
C18-30 55 Se informada a IE do Substituto Tributário: – IEST inválida para a UF: erro no tamanho, na composição da IE, ou no dígito verificador (*2) UF a ser utilizada na validação: – UF do Local de Entrega para operação de Faturamento Direto de veículos novos (id:G09, caso tpOP, id:J02 = 2); – UF do destinatário (UF, campo E12) nos demais casos. (NT 2015.002) Obrig. 211 Rej. Rejeição: IE do substituto inválida
C18-40 55 Se informada a IE do Substituto Tributário: - IEST idêntica à IE do emitente ou do destinatário (NT 2015.002) Obrig. 363 Rej. Rejeição: IE do substituto tributário idêntica à IE do emitente ou do destinatário
C21-10 55/65 Regime Tributário SN, com excesso de sublimite não é permitido para Emitentes desta UF (id:CRT=2). Nota: Regra de validação opcional, a critério da UF. (NT 2015.002) Facul. 812 Rej. Rejeição: Regime Tributário SN, com excesso de sublimite não é permitido para Emitentes desta UF
D01-10 55/65 Informado grupo “avulsa” pela empresa (tag:procEmi<>1 e 2). Obrig. 403 Rej. Rejeição: O grupo de informações da NF-e avulsa é de uso exclusivo do Fisco
D01-20 55/65 Não informado grupo "avulsa" na emissão de Nota Fiscal pelo Fisco (tag:procEmi=1 ou 2) Obrig. 369 Rej. Rejeição: Não informado o grupo avulsa na emissão pelo Fisco

arquivo iniciando com <?xml version="1.0" ?>

Quando coloco para ler um xml, aparece o seguinte erro:

'NoneType' object has no attribute 'get_emit'

Aparece tambem esses textos no terminal:

<?xml version="1.0" ?> <TNFe/>

Alguma ideia de como passar desse ponto?

Obrigado!

Esse pacote foi depreciado

Vi que a ultima atualização foi em 2021 e que tem muitas issues aberta.
Gostaria de saber esse pacote existe ainda ou se ele foi movido para outro lugar

pre-process file to remove signature stuff?

Eventually we trim the lib down a little. Seems we would have to do it in Python. Still is it a good idea? For instance will we want to import the signatures from the incoming invoices into the ERP?

Pegar o id

OLá pessoal, como eu poderia pegar a ID ?

Tentei assim:
notaXML.infNFe.id
notaXML.protNFe.infProt.chNFe e assim e não foi...

AttributeError: 'TNFe' object has no attribute 'protNFe'

Outros atributos da nota, eu consigo pegar normalmente se estiverem dentro do infNfe.

migração 1.x / generateDS -> 2.x xsdata - WORK IN PROGRESS

PORQUE MUDAR PRO XSDATA

  1. xsdata é uma lib absurda! apareceu do nada em 2020 e muita gente ja considera a melhor lib para lidar com xsd independente de qualquer linguagem, o que não é pouca coisa considerando os investimentos que tiveram nos projetos concorrentes por 2 decadas, Java ou .Net em especial.
  2. o xsdata tem uma suite de tests super completa, é testada com os xsds mais exigentes que existem (tests do W3C, UBL...)
  3. o codigo do xsdata é examplar, muito bem testado
  4. o desenvolvedor do xsdata é super reativo
  5. xsdata deu conta de todos documentos fiscais do Brasil com 10x menos trabalho do que o generateDS (eu tinha feito uns 6 patches no generateDS para suportar a nfelib 1.x).
  6. xsdata foi pensado para lidar com pacotes de varios xsd e includes de arquivos, o que é exactamente o que temos no Brasil. Com o generateDS a gente tinha que fazer varias gambiarras para suportar isso, como conservar apenas alguns arquivos geridos para não duplicar muito codigo.
  7. os bindings xsdata são dataclass Python padrão. Nisso é um codigo 5x mais compacto do que os bindings geridos pelo generateDS. Isso nos permitiu de trabalhar tudo na mesma branch com os schemas e o codigo gerido. Enquanto na versão 1.x a gente tinha os schemas na branch master e a gente gerava os bindings numa outra branch com muito codigo, como se fosse um pouco um codigo compilado onde seria muito mais dificil acompanhar mudanças (atualizar o generateDS mudava bastante o codigo gerido por examplo). Com xsdata, apenas evoluçoes dos esquemas mudam o codigo dos bindings e fica super facil acompanhar.
  8. assim como o generateDS, o xsdata foi pensado para ser extendido e gerar outros modelos. Foi o que eu fiz pro Odoo no https://github.com/akretion/xsdata-odoo para gerar os mixins abstratos dos modelos de dados fiscais no Odoo, nosso foco principal na Akretion.
  9. enquanto isso, o generateDS serveu, mas hoje esta no caminho de ser abandonado pro xsdata. O codigo do generateDS não é muito moderno, da até um pouco de medo e esta hospedado no mercurial no Sourceforge hoje, algo que ninguem mais usa...

para maiores informações: https://www.youtube.com/watch?v=6gFOe7Wh8uA

COMO MIGRAR

  1. O caminho onde estão os bindings mudou. Pois com a experiença da nfelib 1.x, refinamos para suportar mais facilemente varios documentos fiscais e varias versões. Em especial, agora apenas 2 digitos caracterizam a versão nas pastas: assumimos que se menos de 2 digitos mudam se trata de uma mudança menor que iria apenas atualizar os schemas existentes enquanto se tiver uma mudança no primeiro ou segundo digito (por examplo NFe 4.0.x para NFe 4.1.x) ai poderiamos ter varias pastas para suportar varias versões ao mesmo tempo.
  2. O nome das classes dos bindings mudou. O xsdata deixou tudo mais "pythonico", os nomes ficaram parecidos. Basta buscar pelo nome da tag original nos arquivos de bindings para ver como ficou o nome com xsdata.
  3. Salve algumas exceções que vc pode encontrar la lista de substituçoẽs https://github.com/akretion/nfelib/blob/master-xsdata/.xsdata.xml#L20 o nome dos campos não mudou e ficam igual dos elementos dos xsd.

EXAMPLOS

IMPORTAÇAO DE XML

Antes:
https://github.com/akretion/nfelib/blob/master_gen_v4_00/tests/nfe/test_nfelib.py#L27

Depois:
https://github.com/akretion/nfelib/blob/master-xsdata/tests/nfe/test_nfe.py#L54

SERIALIZAÇAO DE XML

Antes:
https://github.com/akretion/nfelib/blob/master_gen_v4_00/tests/nfe/test_nfelib.py#L29

Depois:
https://github.com/akretion/nfelib/blob/master-xsdata/tests/nfe/test_nfe.py#L56

TRANSMISSÂO SOAP

Antes:
Para quem usava erpbrasil.edoc para transmitir o codigo relevante era feito aqui: https://github.com/erpbrasil/erpbrasil.edoc/blob/master/src/erpbrasil/edoc/nfe.py

Depois:
O mesmo tipo de transmissão pode agora ser feito usando esse wrapper "legacy" pro erpbrasil.edoc:
https://github.com/akretion/nfelib/blob/master/nfelib/nfe/ws/edoc_legacy.py

Validações da Tag de Documento Fiscal Referenciado

Validações da Tag de Documento Fiscal Referenciado

Campo-Seq Modelo Regra de Validação Aplic. Msg Efeito Descrição Erro
BA01-10 65 NFC-e não pode referenciar outros documentos (tag:NFref) Obrig. 708 Rej. Rejeição: NFC-e não pode referenciar documento fiscal
BA02-10 55 Se informada uma NF-e referenciada (tag:refNFe): - Dígito Verificador da Chave de Acesso inválido (NT 2015.002) Facul. 547 Rej. Rejeição: Chave de Acesso referenciada com Dígito Verificador inválido[nOcor:nnn]
BA02-14 55 Se informada uma NF-e referenciada (tag:refNFe): - Chave de Acesso referenciada com UF inválida (NT 2015.002) Facul. 522 Rej. Rejeição: Chave de Acesso referenciada com UF inválida[nOcor:nnn]
BA02-20 55 Se informada uma NF-e referenciada (tag:refNFe): - Chave de Acesso referenciada com Ano Emissão < 06 ou > que o Ano corrente (NT 2015.002) Facul. 524 Rej. Rejeição: Chave de Acesso referenciada com Ano-Mês inválido[nOcor:nnn]
BA02-24 55 Se informada uma NF-e referenciada (tag:refNFe): - Chave de Acesso referenciada com Mês Emissão < 01 ou > 12 NT 2015.002) Facul. 524 Rej. Rejeição: Chave de Acesso referenciada com Ano-Mês inválido[nOcor:nnn]
BA02-30 55 Se informada uma NF-e referenciada (tag:refNFe): - Série = [0-909] e CNPJ zerado ou dígito inválido, ou - Série = [910-969] e CPF zerado ou dígito inválido (NT 2018.001) Facul. 552 Rej. Rejeição: Chave de Acesso referenciada com CNPJ/CPF inválido[nOcor:nnn]
BA02-34 55 Se informada uma NF-e referenciada (tag:refNFe): - Modelo da NF-e referenciada diferente de 55/65/59 (NT 2013/003) (NT 2015.002) Facul. 679 Rej. Rejeição: Chave de Acesso referenciada com Modelo inválido[nOcor:nnn]
BA02-40 55 Se informada uma NF-e referenciada (tag:refNFe): - Chave de Acesso referenciada com Número zerado (NT 2015.002) Facul. 683 Rej. Rejeição: Chave de Acesso referenciada com Número inválido[nOcor:nnn]
BA02-44 55 Se informada uma NF-e referenciada (tag:refNFe): - Verificar duplicidade da NF-e referenciada (duplicidade da tag refNFe) (NT 2013/003) (NT 2015.002) Facul. 680 Rej. Rejeição: Chave de Acesso referenciada em duplicidade na NF-e [nOcor:nnn]
BA02-50 55 Se informada uma NF-e referenciada (tag:refNFe): - Nota Fiscal referenciada com a mesma Chave de Acesso da Nota Fiscal atual (NT 2015.002) Obrig. 316 Rej. Rejeição: Chave de Acesso referenciada com a mesma Chave de Acesso da Nota Fiscal atual [nOcor:nnn]
BA03-10 55 Se informada NF Modelo 1 ou NF Modelo 2 referenciada (tag:refNF): - Verificar duplicidade de Nota Fiscal Modelo 1 ou 2 referenciada (mesmo CNPJ, Modelo, Série, Número) (NT 2016.002) Facul. 681 Rej. Rejeição: Duplicidade de NF Modelo 1 referenciada (CNPJ, Modelo, Série e Número) [nOcor: nnn]
BA05-10 55 Se informada NF Modelo 1 referenciada (tag:refNF): - NF modelo 1 referenciada emitida há mais de 20 anos da data atual ou com data de emissão superior ao Ano-Mês atual (NT 2015.002) Facul. 317 Rej. Rejeição: NF modelo 1 referenciada com data de emissão inválida [nOcor:nnn]
BA06-10 55 Se informada NF Modelo 1 referenciada (tag:refNF): - CNPJ com zeros, nulo ou DV inválido Facul. 548 Rej. Rejeição: NF modelo 1 referenciada com data de emissão inválida [nOcor:nnn]
BA10-10 55 Se informada NF de Produtor referenciada (tag:refNFP): - Verificar duplicidade de Nota Fiscal de Produtor referenciada (mesma IE, Modelo, Série, Número) (NT 2013/003) (NT 2015.002) Facul. 682 Rej. Rejeição: Duplicidade de NF de Produtor referenciada (IE, Modelo, Série e Número) [nOcor: 999]
BA10-20 55 Contranota de Produtor sem Nota Fiscal referenciada: - não informada NF de Produtor referenciada (tag:refNFP); - e não informada Nota Fiscal referenciada (tag:refNFe). Observação 1: A Contranota de Produtor é identificada como uma Nota Fiscal de entrada (tag:tpNF=0) e remetente da mesma UF com IE de Produtor Rural. Observação 2: A utilização e controle da Contranota de Produtor é opcional, a critério da UF. Facul. 318 Rej. Rejeição: Contranota de Produtor sem Nota Fiscal referenciada
BA10-30 55 Contranota de Produtor não pode referenciar somente Nota Fiscal de entrada: - não informada NF de Produtor referenciada (tag:refNFP); - e não informada Nota Fiscal referenciada (tag:refNFe) de saída (tag:tpNF=1). Observação 1: Identificação de Contranota de Produtor conforme observação da validação anterior. Observação 2: A utilização e controle da Contranota de Produtor é opcional, a critério da UF. (NT 2015.002) Facul. 319 Rej. Rejeição: Contranota de Produtor não pode referenciar somente Nota Fiscal de entrada
BA10-40 55 Contranota de Produtor referencia somente Nota Fiscal de outro emitente. Não existe nenhuma das ocorrências abaixo: - IE da NF de Produtor referenciada (tag: refNFP/IE) idêntica à IE do Emitente (tag: emit/IE) ou do Remetente (tag: dest/IE); - IE do emitente da NF referenciada (tag: emit/IE) idêntica à IE do Emitente (tag: emit/IE) ou do Remetente (tag: dest/IE). Observação 1: Identificação de Contranota de Produtor conforme Observação 1 da regra BA10-20. Observação 2: A utilização e controle da Contranota de Produtor é opcional, a critério da UF. Observação 3: A critério da UF, a validação da IE do emitente da NF referenciada (tag: emit/IE) pode ser substituída por: o CNPJ-8 do emitente da NF referenciada (tag:emit/CNPJ) idêntico ao CNPJ-8 do Emitente (tag: emit/CNPJ) ou do Remetente (tag: dest/CNPJ) (NT 2019.001 v1.00). Facul. 320 Rej. Rejeição: Contranota de Produtor referencia somente NF de outro emitente
BA10-50 55 Contranota de Produtor só pode referenciar NF-e (tag: refNFe) ou NF de Produtor Modelo 4 (tag: refNFP): Observação 1: Identificação de Contranota de Produtor conforme Observação 1 da regra BA10-20. Observação 2: Regra opcional, a critério da UF. (NT 2019.001 v1.00) Facul. 922 Rej. Rejeição: Contranota de Produtor só pode referenciar NF-e ou NF de Produtor Modelo 4
BA12-10 55 Se informada NF de Produtor referenciada (tag:refNFP): - NF de produtor referenciada emitida a mais de 20 anos da data atual ou com data de emissão superior ao Ano-Mês atual (NT 2015.002) Facul. 322 Rej. Rejeição: NF de produtor referenciada com data de emissão inválida [nOcor:nnn]
BA13-10 55 Se informada NF de Produtor referenciada (tag:refNFP): - CNPJ com zeros, nulo ou DV inválido Facul. 549 Rej. Rejeição: CNPJ da NF referenciada de produtor inválido [nOcor: 999]
BA14-10 55 Se informada NF de Produtor referenciada (tag:refNFP): - CPF com zeros, nulo, 111..., 222, ..., ou DV inválido (NT 2012/003) Facul. 550 Rej. Rejeição: CPF da NF referenciada de produtor inválido.
BA15-10 55 Se informada NF de Produtor referenciada (tag:refNFP): - IE com zeros, nulo ou DV inválido para a UF. Facul. 551 Rej. Rejeição: IE da NF referenciada de produtor inválido.
BA19-10 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada com Dígito Verificador inválido (NT 2015.002) Facul. 547 Rej. Rejeição: Chave de Acesso referenciada com Dígito Verificador inválido[nOcor:nnn]
BA19-14 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada com UF inválida (NT 2015.002) Facul. 522 Rej. Rejeição: Chave de Acesso referenciada com UF inválida[nOcor:nnn]
BA19-20 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada com Ano Emissão < 06 ou > que o Ano corrente (NT 2015.002) Facul. 524 Rej. Rejeição: Chave de Acesso referenciada com Ano-Mês inválido[nOcor:nnn]
BA19-24 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada com Mês Emissão < 01 ou > 12 (NT 2015.002) Facul. 524 Rej. Rejeição: Chave de Acesso referenciada com Ano-Mês inválido [nOcor: 999]
BA19-30 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada com CNPJ zerado ou CNPJ com DV inválido (NT 2015.002) Facul. 552 Rej. Rejeição: Chave de Acesso referenciada com CNPJ inválido[nOcor:nnn]
BA19-34 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada com Modelo diferente de 57 (NT 2013/003) (NT 2015.002) Facul. 679 Rej. Rejeição: Chave de Acesso referenciada com Modelo inválido[nOcor:nnn]
BA19-40 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada com Número zerado (NT 2015.002) Facul. 683 Rej. Rejeição: Chave de Acesso referenciada com Número inválido[nOcor:nnn]
BA19-44 55 Se informado CT-e Referenciado (tag:refCTe): - Chave de Acesso referenciada em duplicidade na NF-e (duplicidade da tag refCTe) (NT 2013/003) (NT 2015.002) Facul. 680 Rej. Rejeição: Chave de Acesso referenciada em duplicidade na NF-e [nOcor:nnn]
BA20-10 55 Se informado Cupom Fiscal referenciado (tag:refECF): - Verificar duplicidade de Cupom Fiscal referenciado (mesmo Modelo, Número de Ordem e COO) (NT 2013/003) Facul. 684 Rej. Rejeição: Duplicidade de Cupom Fiscal referenciado (Modelo, Número de Ordem e COO) [nOcor: 999]
BA20-20 55 Informado Cupom Fiscal referenciado (tag: refECF) ou informado NF modelo 1 ou 2 referenciada (tag: refNF) em NF-e de operação interestadual ou com o exterior (tag: idDest<>1) (NT 2019.001 v1.00) Facul. 923 Rej. Rejeição: Referenciado documento de operação interna em operação interestadual ou com o exterior
BA20-30 55 Informado Cupom Fiscal referenciado (tag: refECF) em UF que não permite essa referência. Observação: Regra de validação opcional, a critério da UF. (NT 2019.001 v1.00, v.150) Facul. 924 Rej. Rejeição: Informado Cupom Fiscal referenciado

utf-8 errors in Python 2 (ok in Python 3)

when importing nfe's with non ascii chars in Python we have this kind of errors:

>>> len(str(u'blé'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 2: ordinal not in range(128)

the generated code would need to be rewritten like:

>>> len(str((u'blé').encode('utf-8')))
4

(And this works with Python 2 also)
As the error occurs only with Python 2, do we care about it?

Validações de Tags de Identificação do Destinatário

Identificação do Destinatário

Campo-Seq Modelo Regra de Validação Aplic. Msg Efeito Descrição Erro
E01-10 55 NF-e sem a identificação do destinatário (tag:infNFe/dest) Obrig. 719 Rej. Rejeição: NF-e sem a identificação do destinatário
E01-20 65 NFC-e com entrega a domicílio (indPres=4) sem identificação do destinatário (tag:infNFe/dest) Obrig. 787 Rej. Rejeição: NFC-e de entrega a domicílio sem a identificação do destinatário
E02-10 55/65 Se informado CNPJ: – CNPJ com zeros ou dígito de controle inválido Obrig. 208 Rej. Rejeição: CNPJ do destinatário inválido
E02-20 65 Se informado CNPJ: - CNPJ do destinatário = CNPJ do Emitente (NT 2015.002) Obrig. 220 Rej. Rejeição: Destinatário com identificação igual à identificação do emitente
E03-10 55/65 Se informado CPF: – CPF com zeros, nulo, 111..., 222..., ... ou dígito de controle inválido (NT 2013/003) Obrig. 237 Rej. Rejeição: CPF do destinatário inválido
E03a-10 55 Se Operação com Exterior (tag:idDest = 3): – Deve ser informada tag idEstrangeiro (conteúdo da tag pode ser nulo) Obrig. 720 Rej. Rejeição: Na operação com Exterior deve ser informada tag idEstrangeiro
E03a-20 55 Se não é operação com Exterior (tag:idDest<>3): – Informado “idEstrangeiro”, e operação não é com consumidor final(tag:indFinal<> 1) (NT 2015.002) Obrig. 721 Rej. Rejeição: Informado idEstrangeiro e Operação não é com consumidor final.
E03a-30 55/65 Se informado “idEstrangeiro” não pode ser informada “IE” do destinatário (tag: dest/IE). (NT 2019.001 v1.00) Obrig. 925 Rej. Rejeição: NF-e com identificação de estrangeiro e inscrição estadual informada para destinatário
E03a-60 55/65 Se informado “idEstrangeiro”, campo deve conter somente algarismos, letras (maiúsculas e minúsculas) e/ou os caracteres do conjunto que segue: [:.+- /()](NT 2015.002) Obrig. 372 Rej. Rejeição: Destinatário com identificação de estrangeiro com caracteres inválidos
E04-10 55 NF-e sem o nome do destinatário (tag:dest/xNome) Obrig. 724 Rej. Rejeição: NF-e sem o nome do destinatário
E04-20 55/65 Se tag:tpAmb (id:B24) = 2: o xNome (E04) deve ser informado com a literal “NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL” (NT 2011/002) Obrig. 598 Rej. Rejeição: NF-e emitida em ambiente de homologação com Razão Social do destinatário diferente de NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL
E05-10 55 NF-e sem a informação de endereço do destinatário (tag:dest/enderDest) Obrig. 726 Rej. Rejeição: NF-e sem a informação de endereço do destinatário
E05-20 65 NFC-e com entrega a domicílio (indPres=4) sem o endereço do destinatário (tag:dest/enderDest) Obrig. 788 Rej. Rejeição: NFC-e de entrega a domicílio sem o endereço do destinatário
E10-10 55/65 Se endereço destinatário não é no Exterior (dest/UF <> “EX"): – Código Município do destinatário inexistente (Tabela Municípios IBGE) (NT 2015.002) Obrig. 274 Rej. Rejeição: Código Município do Destinatário inexistente
E10-20 55/65 Se endereço destinatário não é no Exterior (dest/UF <> “EX"): – Código Município do destinatário (2 primeiras posições) difere do Código da UF do destinatário Obrig. 275 Rej. Rejeição: Código Município do Destinatário: difere da UF do Destinatário
E10-30 55 Se endereço destinatário é no Exterior (dest/UF = “EX"): – Código Município do destinatário difere de “9999999” Obrig. 509 Rej. Rejeição: Informado código de município diferente de “9999999” para operação com o exterior
E12-10 55 Se endereço destinatário é no Exterior (dest/UF = “EX"): – UF de destino diferente de “EX” Obrig. 727 Rej. Rejeição: Operação com Exterior e UF diferente de EX
E12-30 55 Se Nota Fiscal é de Saída (tpNF=1) e operação é Interestadual (tag:idDest = 2): – UF do destinatário (tag: enderDest/UF) igual à UF do emitente (tag: enderEmit/UF) e CNPJ emissor diferente do CNPJ destinatário (NT 2013/005). Observação: Não rejeitar se existir algum item com a tag UFCons (id:L120) diversa da UF do emitente. Exceção 1: A regra de validação não se aplica se informada UF do local de entrega (tag: entrega/UF) diferente da UF do emitente (tag: enderEmit/UF) e não informada UF do local de retirada (tag: retirada/UF); Exceção 2: A regra de validação não se aplica se informada UF do local de retirada (tag: retirada/UF) diferente da UF do destinatário (tag: enderDest/UF) e não informada UF do local de entrega (tag: entrega/UF); Exceção 3: A regra de validação não se aplica se informadas UF do local de entrega (tag: entrega/UF) e UF do local de retirada (tag: retirada/UF) diferentes entre si; (NT 2015.003) Obrig. 772 Rej. Rejeição: Operação Interestadual e UF de destino igual à UF de origem
E12-40 55 Se Nota Fiscal é de Saída (tpNF=1), operação é Interna no Estado (tag:idDest = 1) e operação não é com Consumidor final: – UF do destinatário (tag: enderDest/UF) difere da UF do emitente (tag: enderEmit/UF). (NT 2015.003) Exceção 1: Se a tag UFCons (id:LA06) foi informada com a mesma UF do emitente não se aplica esta regra (NT 2013/005) Exceção 2: A regra de validação não se aplica se informada UF do local de entrega (tag: entrega/UF) igual à UF do emitente (tag: enderEmit/UF) e não informada UF do local de retirada (tag: retirada/UF); Exceção 3: A regra de validação não se aplica se informada UF do local de retirada (tag: retirada/UF) igual à UF do destinatário (tag: enderDest/UF) e não informada UF do local de entrega (tag: entrega/UF); Exceção 4: A regra de validação não se aplica se informadas UF do local de entrega (tag: entrega/UF) e UF do local de retirada (tag: retirada/UF) iguais entre si; Obrig. 773 Rej. Rejeição: Operação Interna e UF de destino difere da UF de origem
E12-50 55 Se Nota Fiscal é de Entrada (tpNF=0) e operação é Interestadual (tag:idDest = 2): – UF do destinatário (tag: enderDest/UF) igual à UF do emitente (tag: enderEmit/UF) e CNPJ emissor diferente do CNPJ destinatário. Observação: Não rejeitar se existir algum item com a tag UFCons (id:L120) diversa da UF do emitente. Exceção 1: A regra de validação não se aplica se informada UF do local de entrega (tag: entrega/UF) diferente da UF do destinatário (tag: enderDest/UF) e não informada UF do local de retirada (tag: retirada/UF); Exceção 2: A regra de validação não se aplica se informada UF do local de retirada (tag: retirada/UF) diferente da UF do emitente (tag: enderEmit/UF) e não informada UF do local de entrega (tag: entrega/UF); Exceção 3: A regra de validação não se aplica se informadas UF do local de entrega (tag: entrega/UF) e UF do local de retirada (tag: retirada/UF) diferentes entre si; (NT 2015.003) Obrig. 772 Rej. Rejeição: Operação Interestadual e UF de destino igual à UF de origem
E12-60 55 Se Nota Fiscal é de Entrada (tpNF=0), operação é Interna no Estado (tag:idDest = 1) e operação não é com Consumidor final: – UF do destinatário (tag: enderDest/UF) difere da UF do emitente (tag: enderEmit/UF). Exceção 1: Se a tag UFCons (id:LA06) foi informada com a mesma UF do emitente não se aplica esta regra; Exceção 2: A regra de validação não se aplica se informada UF do local de entrega (tag: entrega/UF) igual à UF do destinatário (tag: enderDest/UF) e não informada UF do local de retirada (tag: retirada/UF); Exceção 3: A regra de validação não se aplica se informada UF do local de retirada (tag: retirada/UF) igual à UF do emitente (tag: enderEmit/UF) e não informada UF do local de entrega (tag: entrega/UF); Exceção 4: A regra de validação não se aplica se informadas UF do local de entrega (tag: entrega/UF) e UF do local de retirada (tag: retirada/UF) iguais entre si; (NT 2015.003) Obrig. 773 Rej. Rejeição: Operação Interna e UF de destino difere da UF de origem
E14-04 55/65 Se informado Código País do destinatário (tag: enderDest/cPais): - Código do País inexistente (Tabela do BACEN, vide tabela de apoio publicada no Portal da NF-e). Observação: O Código do País informado na NF-e pode conter ou não zeros não significativos. (NT 2015.002) Obrig. 377 Rej. Rejeição: Código de País do destinatário inexistente
E14-10 55 Se operação com Exterior (tag:idDest=3): – Código País do destinatário = 1058 (Brasil), ou não informado Facul. 510 Rej. Rejeição: Operação com Exterior e Código País destinatário é 1058 (Brasil) ou não informado
E14-20 55/65 Se não é operação com Exterior (tag:idDest<>3) e informado Código País do destinatário: – Código País do destinatário difere de 1058 (Brasil) Exceção: Se idEstrangeiro <> nulo é permitido cPais <> 1058. (NT 2015.002) Facul. 511 Rej. Rejeição: Não é de Operação com Exterior e Código País destinatário difere de 1058 (Brasil)
E14-30 55/65 Se endereço do destinatário é no Exterior (dest/UF = “EX"): - Código do país “cPais” (id: E14) não pode ser 1058 (Brasil). (NT 2019.001 v1.00) Obrig. 926 Rej Rejeição:
E16a-10 65 NFC-e com indicação de IE do destinatário diferente de "Não Contribuinte" (tag:indIEDest <> 9) Obrig. 789 Rej. Rejeição: NFC-e para destinatário contribuinte de ICMS
E16a-20 55 Se operação com Exterior (tag:idDest=3): – Indicação de IE Destinatário diferente "Não Contribuinte" (tag:indIEDest <> 9) (NT 2015.003) Obrig. 790 Rej. Rejeição: Operação com Exterior para destinatário Contribuinte de ICMS
E16a-30 55 Informado destinatário como Contribuinte Isento de Inscrição Estadual (indIEDest=2-ISENTO) em UF que não permite esta situação nas operações interestaduais (idDest=2), conforme abaixo: - AM, BA, CE, GO, MG, MS, MT, PA, PE, RN, SE, SP Exceção 1: Esta regra de validação não se aplica quando houver destaque do ICMS-ST (campo vICMSST) em pelo menos um item da NF-e Exceção 2: Esta regra de validação não se aplica quando houver informação do ICMS-ST retido anteriormente (campo vICMSSTRet) em pelo menos um item da NF-e Exceção 3: A regra de validação não se aplica, em produção, para Nota Fiscal com data de emissão anterior a 01/07/2016 Exceção 4: Esta regra de validação não se aplica nas operações isentas (CST=40-Isenta ou CSOSN=103-Isento), imunes ou não tributadas (CST=41- Não tributada, ou CSOSN=300-Imune, ou CSOSN=400-Não tributada pelo Simples Nacional) Obrig. 805 Rej. Rejeição: A SEFAZ do destinatário não permite Contribuinte Isento de Inscrição Estadual
E16a-35 55 Informado destinatário como Contribuinte Isento de Inscrição Estadual (indIEDest=2-ISENTO) em UF que não permite esta situação nas operações internas (idDest=1) Exceção 1: Esta regra de validação não se aplica quando houver destaque do ICMS-ST (campo vICMSST) em pelo menos um item da NF-e. Exceção 2: Esta regra de validação não se aplica quando houver informação do ICMS-ST retido anteriormente (campo vICMSSTRet) em pelo menos um item da NF-e. Exceção 3: A regra de validação não se aplica, em produção, para Nota Fiscal com data de emissão anterior a 01/07/2016. Exceção 4: Esta regra de validação não se aplica nas operações isentas (CST=40-Isenta ou CSOSN=103-Isento), imunes ou não tributadas (CST=41- Não tributada, ou CSOSN=300-Imune, ou CSOSN=400-Não tributada pelo Simples Nacional) (NT 2015.003) Facul. 805 Rej. Rejeição: A SEFAZ do destinatário não permite Contribuinte Isento de Inscrição Estadual
E16a-40 55 Informado indicador de IE do Destinatário não-contribuinte (tag: indIEDest=9) e não é operação com consumidor final (tag: indFinal<>1) em operação de saída (tag: tpNF=1) que não é com exterior (tag:idDest<>3). (NT 2019.001 v1.00) Obrig. 696 Rej. Rejeição: Operação com não contribuinte deve indicar operação com consumidor final
E17-10 65 Se operação com Exterior (tag:idDest=3): NFC-e com tag IE do Destinatário (tag:dest/IE) Obrig. 729 Rej. Rejeição: NFC-e com informação da IE do destinatário
E17-20 55 NF-e com indicação de Destinatário Contribuinte do ICMS (tag:dest/indIEDest=1), sem informar a IE (tag:dest/IE) Obrig. 728 Rej. Rejeição: NF-e sem informação da IE do destinatário
E17-30 55 NF-e com indicação de Destinatário Contribuinte Isento de IE (tag:dest/indIEDest=2), mas com informação da IE (tag:dest/IE) Obrig. 791 Rej. Rejeição: NF-e com indicação de destinatário isento de IE, com a informação da IE do destinatário
E17-40 55 Se informada a IE do Destinatário: – Não informar a IE do Destinatário se endereço do Destinatário no Exterior (tag:dest/enderDest/UF=”EX”) Obrig. 792 Rej. Rejeição: Informada a IE do destinatário para operação com destinatário no Exterior
E17-50 55 Se informada a IE do Destinatário: – IE inválida para a UF: erro no tamanho, na composição da IE, ou no dígito verificador (*2) Obrig. 210 Rej. Rejeição: IE do destinatário inválida
E18-10 65 NFC-e com Inscrição da Suframa (tag:dest/ISUF) Obrig. 730 Rej. Rejeição: NFC-e com Inscrição Suframa
E18-20 55 Se Inscrição SUFRAMA informada: – Inscrição com dígito verificador inválido Obrig. 235 Rej. Rejeição: Inscrição SUFRAMA inválida
E18-30 55 Se Inscrição SUFRAMA informada: – UF destinatário difere de AC-Acre, ou AM-Amazonas, ou RO-Rondônia, ou RR-Roraima, ou AP-Amapá (só para municípios 1600303-Macapá e 1600600-Santana) Obrig. 251 Rej. Rejeição: UF/Município destinatário não pertence a SUFRAMA

Geração da chave de acesso na criação de um novo documento (NF-e/NFC-e)

Na criação de uma nova NF-e/NFC-e deveria ao criar o Objeto NFeType ser gerado o conteúdo do campo id que contém a chave de acesso da NF-e de forma automática, pois o valor do campo id é um conjunto de informação da NFe:

  • cUF - Código da UF do emitente do Documento Fiscal;
  • AAMM - Ano e Mês de emissão da NF-e;
  • CNPJ - CNPJ do emitente;
  • mod - Modelo do Documento Fiscal;
  • serie - Série do Documento Fiscal;
  • nNF - Número do Documento Fiscal;
  • tpEmis – forma de emissão da NF-e;
  • cNF - Código Numérico que compõe a Chave de Acesso;
  • cDV - Dígito Verificador da Chave de Acesso.

Cálculo do Dígito Verificador da Chave de Acesso da NF-e

O dígito verificador da chave de acesso da NF-e é baseado em um cálculo do módulo 11. O
módulo 11 de um número é calculado multiplicando-se cada algarismo pela sequência de
multiplicadores 2,3,4,5,6,7,8,9,2,3, ..., posicionados da direita para a esquerda.

A somatória dos resultados das ponderações dos algarismos é dividida por 11 e o DV (dígito
verificador) será a diferença entre o divisor (11) e o resto da divisão:
DV = 11 - (resto da divisão)
Quando o resto da divisão for 0 (zero) ou 1 (um), o DV deverá ser igual a 0 (zero).
Exemplo: consideremos que a chave de acesso tem a seguinte sequência de caracteres:

image

Validações de Inscrições Estaduais

Implementar as validações de Inscrições Estaduais:

209 Rejeição: IE do emitente inválida

Ao carregar um XML deve ser validado o valor da TAG: infNFe/emit/IE se o valor é uma inscrição estadual é válida.

210 Rejeição: IE do destinatário inválida

Ao carregar um XML deve ser validado o valor da TAG: infNFe/dest/IE se o valor é uma inscrição estadual é válida.

211 Rejeição: IE do substituto inválida

Deve ser adicionado a dependência do erpbrasil.base para utilizar o método de validação do CNPJ.

xsdata and --compound-field

Na nova branch master-xsdata que usa xsdata, temos um pequeno problema com o elemento IPI da tag Imposto. Da forma como é o xsd, ou precisa de um patch de 1 linha no xsdata, ou precisa usar a opçâo --compound-field do xsdata. Eu detalhei o problema aqui: tefra/xsdata#666

De inicio, pode parecer uma boa usar a opção --compound-field já que resolve o problema no binding gerido como aqui. Porem tem um outro lado da moeda: quando usar essa opção, tem pelo menos 2 campos (IPI do Imposto e um outro no Transp) que viram então um campo composto com uma hierarquia mais funda:

Sem a opção --compound-field e com meu patch tefra/xsdata#666:

            @dataclass
            class Imposto:

                v_tot_trib: Optional[str] = field(
                    default=None,
                    metadata={
                        "name": "vTotTrib",
                        "type": "Element",
                        "namespace": "http://www.portalfiscal.inf.br/nfe",
                        "white_space": "preserve",
                        "pattern": r"0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?",
                    }
                )
                icms: Optional["Tnfe.InfNfe.Det.Imposto.Icms"] = field(
                    default=None,
                    metadata={
                        "name": "ICMS",
                        "type": "Element",
                        "namespace": "http://www.portalfiscal.inf.br/nfe",
                    }
                )
                ipi: Optional[Tipi] = field(
                    default=None,
                    metadata={
                        "name": "IPI",
                        "type": "Element",
                        "namespace": "http://www.portalfiscal.inf.br/nfe",
                    }
                )

Agora com a opção --compound-field e sem meu patch:

            @dataclass
            class Imposto:
                v_tot_trib: Optional[str] = field(
                    default=None,
                    metadata={
                        "name": "vTotTrib",
                        "type": "Element",
                        "namespace": "http://www.portalfiscal.inf.br/nfe",
                        "white_space": "preserve",
                        "pattern": r"0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?",
                    }   
                )  
                icms: Optional["Tnfe.InfNfe.Det.Imposto.Icms"] = field(
                    default=None,
                    metadata={
                        "name": "ICMS",
                        "type": "Element",
                        "namespace": "http://www.portalfiscal.inf.br/nfe",
                    }
                )  
                choice: List[object] = field(
                    default_factory=list,
                    metadata={
                        "type": "Elements",
                        "choices": (
                            {
                                "name": "IPI",
                                "type": Tipi,
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                            {
                                "name": "II",
                                "type": Type["Tnfe.InfNfe.Det.Imposto.Ii"],
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                            {
                                "name": "ISSQN",
                                "type": Type["Tnfe.InfNfe.Det.Imposto.Issqn"],
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                            {
                                "name": "PIS",
                                "type": Type["Tnfe.InfNfe.Det.Imposto.Pis"],
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                            {
                                "name": "PISST",
                                "type": Type["Tnfe.InfNfe.Det.Imposto.Pisst"],
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                            {
                                "name": "COFINS",
                                "type": Type["Tnfe.InfNfe.Det.Imposto.Cofins"],
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                            {
                                "name": "COFINSST",
                                "type": Type["Tnfe.InfNfe.Det.Imposto.Cofinsst"],
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                            {
                                "name": "ICMSUFDest",
                                "type": Type["Tnfe.InfNfe.Det.Imposto.Icmsufdest"],
                                "namespace": "http://www.portalfiscal.inf.br/nfe",
                            },
                        ),
                        "max_occurs": 9,
                    }
                )

Nesse caso o xsdata tem uma espece de gestão de choice.

O grande ponto é que nos temos um interesso não apenas nos bindings Python mas tb nos modelos Odoo geridos pelo plugin https://github.com/akretion/xsdata-odoo
Esses modelos Odoo são de persistência e é interessante que seja muito mais "planos" do que os modelos super fundos do XSD que servem apenas para validação XSD. E usar a opção --compound-field iria atrapalhar nisso porque nos obrigaria a repensar o mapeamento entre um campo Odoo e um campo de um binding dessa lib, criaria mais complexidade no mapping.
Se essa opção tb lidava com as verdadeiras tags choice do xsd como fazia o generateDS (que nos interessa apenas nas visões automáticas, ou seja muito pouco hoje), eu bancaria essa complexidade. Mas não é o caso, seria uma complexidade meio inútil.

Eu fiz uma busca exaustiva e o problema acontece apenas com essa tag IPI na dezena de esquemas de NFe que temos nessa branch. Com tudo o meu fix aqui tefra/xsdata#666 resolve isso perfeitamente (eu gerei tudo de novo e vi que o impacto era apenas o esperado aqui).

Nisso minha escolha é de usar esse patch de uma linha no xsdata ou então no código Python gerido apenas pela tag IPI.

cc @mbcosta @renatonlima @marcelsavegnago @netosjb @felipemotter

Erro de módulo não encontrado

Bom dia a todos!

A versão atual, quando vamos utilizar, dá o seguinte erro:

from nfelib.v4_00 import leiauteNFe_sub as parser
Traceback (most recent call last):
File "", line 1, in
ModuleNotFoundError: No module named 'nfelib.v4_00'

Um fork que tenho de 13 commits atrás funciona normalmente.

Cordiais saudações a todos.
Florêncio

Como gerar NFse

Olá pessoal! Estou tentando gerar uma NFse mas aparentemente os métodos to_xml e validate_xml não estão presentes no objeto. Há alguma forma disso ser feito?

AttributeError: type object 'Nfse' has no attribute 'to_xml'

odoo: extra common Enum file

that being said, the benefit is little only 5 or 6 enums factored in such a schema:
TCodUfIBGE xs:string
TMod xs:string
TUf xs:string
TUfEmi xs:string
TAmb xs:string
TCOrgaoIBGE xs:string
TTransformURI anyURI

Validações da Tag de Local da Retirada

Validações da Tag de Local da Retirada

Campo-Seq Modelo Regra de Validação Aplic. Msg Efeito Descrição Erro
F02-10 55/65 Se informado Local de Retirada com CNPJ: – CNPJ com zeros ou dígito inválido Facul. 512 Rej. Rejeição: CNPJ do Local de Retirada inválido
F02a-10 55/65 Se informado Local de Retirada com CPF: – CPF com zeros, nulo, 111..., 222..., ..., ou dígito de controle inválido (NT 2012/003) Facul. 540 Rej. Rejeição: CPF do Local de Retirada inválido
F07-10 55/65 Se informado Local de Retirada com UF Retirada = “EX”: – Código do Município do Local de Retirada difere de “9999999” Obrig. 513 Rej. Rejeição: Código Município do Local de Retirada deve ser 9999999 para UF retirada = “EX”.
F07-20 55/65 Se informado Local de Retirada com UF Retirada <> “EX”: – Código do Município do Local de Retirada inexistente (Tabela Municípios IBGE) (NT 2015.002) Obrig. 276 Rej. Rejeição: Código Município do Local de Retirada inexistente
F07-30 55/65 Se informado Local de Retirada com UF Retirada <> “EX”: – Código Município do Local de Retirada (2 primeiras posições) difere do Código da UF do Local de Retirada Obrig. 277 Rej. Rejeição: Código Município do Local de Retirada: difere da UF do Local de Retirada
F11-10 55 Se informado Código País do local de retirada (tag: retirada/cPais): - Código do País inexistente (Tabela do BACEN, vide tabela de apoio publicada no Portal da NF-e). Observação: O Código do País pode conter zeros não significativos. (NT2018.005) Obrig. 970 Rej. Rejeição: Código de País inexistente [local de retirada/entrega]
F15-10 55 Se informada a IE do Expedidor: – IE inválida para a UF do Expedidor (id: F09): erro no tamanho, na composição da IE, ou no dígito verificador (NT2018.005) Obrig. 971 Rej. Rejeição: IE inválida [local de retirada/entrega]

Tags obrigatórias devem ser criadas com valor padrão mesmo não informadas na criação dos objetos

Algumas tags como por exemplo a tag do total de frete da NF-e (vFrete dento da tag ICMSTot) deve aparecer com o valor padrão mesmo que não tenha sido declarada na criação do objeto ICMSTotType, pois atualmente essas tags não são geradas no XML o que acaba gerando um XML inválido, pois não contém tags obrigatórias.

Exemplo de um XML de NF-e gerada pelo nfelib:

image

Exemplo de um XML de NF-e esperado:

image

** OBS: ** Um workaround é informar as tag na criação do objeto.

Instalação quebrando

Prezados amigos,

Os últimos Commits estão quebrando a instalação:

ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-66ksj8xy/setup.py'"'"'; file='"'"'/tmp/pip-req-build-66ksj8xy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-ref5mt4v
cwd: /tmp/pip-req-build-66ksj8xy/
Complete output (28 lines):
running bdist_wheel
running build
running build_py
creating build
creating build/lib
creating build/lib/nfelib
copying nfelib/init.py -> build/lib/nfelib
running egg_info
creating nfelib.egg-info
writing nfelib.egg-info/PKG-INFO
writing dependency_links to nfelib.egg-info/dependency_links.txt
writing requirements to nfelib.egg-info/requires.txt
writing top-level names to nfelib.egg-info/top_level.txt
writing manifest file 'nfelib.egg-info/SOURCES.txt'
warning: Failed to find the configured license file 'LICENSE'
reading manifest file 'nfelib.egg-info/SOURCES.txt'
writing manifest file 'nfelib.egg-info/SOURCES.txt'
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/nfelib
copying build/lib/nfelib/init.py -> build/bdist.linux-x86_64/wheel/nfelib
running install_egg_info
Copying nfelib.egg-info to build/bdist.linux-x86_64/wheel/nfelib-1.0.egg-info
running install_scripts
error: [Errno 2] No such file or directory: 'LICENSE'

ERROR: Failed building wheel for nfelib

Eu voltei os últimos 7 commits e ele volta a instalar.

Obrigado e abraços cordiais a todos.

Florêncio

Não tem o metodo get_emit()

AttributeError: 'NoneType' object has no attribute 'get_emit'
Fiz de acordo com o exemplo mostrado e estou recebendo esse erro

nfelib 1.x: instalação dos schemas e XML de tests/examplos fora da pasta da nfelib

Eh interessante distribuir os schemas XML e os arquivos de teste respectivamente para validar as NFe's usando o schema delas e para ter dados de demo mão para fazer testes em outros projetos como fazemos no OCA/l10n-brazil.

Nas o problema é que na nfelib 1.x esses arquivos de schemas e de tests/demos estavam sendo instalados fora da lib numa "dist" install.

Fica facil examplificar na hora de de-instalar a lib:

rvalyi@rvalyi-laptop:~/DEV$ sudo python -m pip uninstall nfelib
Found existing installation: nfelib 1.3.1
Uninstalling nfelib-1.3.1:
  Would remove:
    /usr/local/lib/python3.10/dist-packages/nfelib-1.3.1.dist-info/*
    /usr/local/lib/python3.10/dist-packages/nfelib/*
    /usr/local/lib/python3.10/dist-packages/schemas/README.txt
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/CCe_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/confRecebto_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/consCad_v2.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/consReciNFe_v4.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/consSitNFe_v4.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/consStatServ_v4.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/distDFeInt_v1.01.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/e110110_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/e110111_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/e210200_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/e210210_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/e210220_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/e210240_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/envCCe_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/envConfRecebto_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/envEventoCancNFe_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/envEvento_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/enviNFe_v4.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/eventoCancNFe_v1.00.xsd
    /usr/local/lib/python3.10/dist-packages/schemas/nfe/v4_00/inutNFe_v4.00.xsd
    ...
    /usr/local/lib/python3.10/dist-packages/tests/*

Funcionava, mas com a multiplicação dos tipos de documentos fiscais que vão ser suportados isso não era bem sustentável...

Na nova branch master-xsdata, a futura nfelib 2.x, eu resolvi isso com um novo layout dos arquivos de schemas e de examplos. Vale a pena notar que na nfelib 2.x eu ainda empacotei os bindings generateDS da nfelib 1.x no mesmo caminho para garantir a compatibilidade brackward por um certo tempo (até 2024?).

Sequencia da tag do imposto de importação

Importando uma NF-e de importação direta (NF-e de entrada de mercadoria através de importação) A tag II está na posição errada, em um na NF-e válida:

Captura de Tela 2021-07-19 às 19 55 42

Importando essa NF-e e exportando através do nfelib:

Captura de Tela 2021-07-19 às 19 57 56

simplificação dos bindings de DF-e?

parece que fora alguns tabs, esses arquivos são iguais:

rvalyi@rvalyi-laptop:~/DEV/nfelib2$ find nfelib | grep -i distDFeInt
nfelib/nfe_dist_dfe/schemas/v1_0/retDistDFeInt_v1.01.xsd
nfelib/nfe_dist_dfe/schemas/v1_0/distDFeInt_v1.01.xsd
nfelib/cte_dist_dfe/schemas/v1_0/distDFeInt_v1.00.xsd
nfelib/cte_dist_dfe/schemas/v1_0/retDistDFeInt_v1.00.xsd
nfelib/mdfe_dist_dfe/schemas/v1_0/distDFeInt_v1.00.xsd
nfelib/mdfe_dist_dfe/schemas/v1_0/retDistDFeInt_v1.00.xsd

talvez seria melhor simplificar?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.