Para montar esse txt algumas regras básicas devem ser obedecidas:
- Todas as linhas devem terminar com "|" (pipe) e em seguida um "LF" (Line Feed ou "\n").
- Nos campos separados por "|" (pipe) não podem apenas ter espaços em branco, ou existe dado ou fica sem nada.
- Não são permitidos quaisquer caracteres especiais, exceto o "LF" ("\n") ao final da linha.
- Recomenda-se não usar acentuação, por exemplo "Ç" substitua por "C"
- Não são permitidas aspas (simples ou duplas)
- Caso alguma variável não exista, ou não seja necessária, seu campo deve ser deixado "VAZIO". ex. A|versao|Id||, nesse caso não temos o último valor "pk_nItem"
- Não devem ser inclusos campos que não serão usadas. ex. BA02|refNFe| se não existir uma referência a NFe, ignore o campo, ele não existe, mas não faça "BA02||"
(texto extraído diretamente do Manual da SEFAZ)
- Campos que representam códigos (CNPJ, CPF, CEP, CST, NCM, EAN, etc.) devem ser informados com o tamanho fixo previsto, sem formatação e com o preenchimento dos zeros não significativos;
- Campos numéricos que representam valores e quantidades são de tamanho variável, respeitando o tamanho máximo previsto para o campo e a quantidade de casas decimais. O preenchimento de zeros não significativos causa erro de validação do Schema XML. Os campos numéricos devem ser informados sem o separador de milhar, com uso do ponto decimal para indicar a parte fracionária se existente respeitando-se a quantidade de dígitos prevista no leiaute;
- O uso de caracteres acentuados e símbolos especiais para o preenchimento dos campos alfanuméricos devem ser evitados.
- Os espaços informados no início e no final do campo alfanumérico também devem ser evitados;
- As datas devem ser informadas no formato “AAAA-MM-DD”;
- A forma e a obrigatoriedade de preenchimento dos campos da Nota Fiscal Eletrônica estão previstas na legislação aplicável para a operação que se pretende realizar;
- Inexistindo conteúdo (valor zero ou vazio) para um campo não obrigatório, a TAG deste campo não deverá ser informada no arquivo da NF-e;
- Tratando-se de operações com o exterior, uma vez que o campo CNPJ é obrigatório não informar o conteúdo deste campo;
- No caso das pessoas desobrigadas de inscrição no CNPJ/MF, deverá ser informado o CPF da pessoa, exceto nas operações com o exterior.
Como testar o TXT ? Vide ValidTXT
O TXT que foi criado pode ser validado, com relação a sua estrutura básica usando a classe ValidTXT::class.
use NFePHP\NFe\Common\ValidTXT;
$txt = file_get_contents('nfe.txt');
$errors = ValidTXT::isValid($txt);
print_r($errors);
O método estático isValid(), irá retornar um ARRAY contendo os erros encontrados ou um array VAZIO caso nenhum erro seja localizado.
NOTA: Esta analise é apenas feita sobre a estrutura do TXT e não sobre o conteúdo dos campos, portanto isso não irá impedir que surjam erros tentar converter ou ainda após a analise do XML pelo autorizador (SEFAZ).
IMPORTANTE: A estrutura tanto do XML como do TXT depende da versão do layout da SEFAZ, neste caso estamos indicando a estrutura da versão 3.10 do layout.
O arquivo TXT sempre inicia com NOTAFISCAL|numero de notas|, onde o número de notas indica o total de NFes contidas nessa string. Esse campo ocorre apenas uma vez.
Cada nova NFe inicia com A|versao|Id|pk_nItem|, onde versão é a versão do layout usado (3.10 ou 4.00) e Id é a chave da NFe, ex. NFe35170349607369000156550010000022260003815585, pk_nItem não é usado normalmente.
Estrutura, layout 4.00 SEBRAE Em desenvolvimento
v3.10
B|cUF|cNF|natOp|indPag|mod|serie|nNF|dhEmi|dhSaiEnt|tpNF|idDest|cMunFG|tpImp|tpEmis|cDV|tp Amb|finNFe|indFinal|indPres|procEmi|verProc|dhCont|xJust|
v4.00
B|cUF|cNF|natOp|mod|serie|nNF|dhEmi|dhSaiEnt|tpNF|idDest|cMunFG|tpImp|tpEmis|cDV|tpAmb|finNFe|indFinal|indPres|procEmi|verProc|dhCont|xJust|
I|cProd|cEAN|xProd|NCM|cBenef|EXTIPI|CFOP|uCom|qCom|vUnCom|vProd|cEANTrib|uTrib|qTrib|vUnTrib|vFrete|vSeg|vDesc|vOutro|indTot|xPed|nItemPed|nFCI|
I05C|CEST|indEscala|CNPJFab|
I80|nLote|qLote|dFab|dVal|cAgreg|
v3.10
K|nLote|qLote|dFab|dVal|vPMC|
v4.00
K|cProdANVISA|vPMC|
v3.10
LA|cProdANP|pMixGN|CODIF|qTemp|UFCons|
v4.00
LA|cProdANP|descANP|pGLP|pGNn|pGNi|vPart|CODIF|qTemp|UFCons|
N02|orig|CST|modBC|vBC|pICMS|vICMS|pFCP|vFCP|
N03|orig|CST|modBC|vBC|pICMS|vICMS|vBCFCP|pFCP|vFCP|modBCST|pMVAST|pRedBCST|vBCST|pICMSST|vICMSST|vBCFCPST|pFCPST|vFCPST|
N04|orig|CST|modBC|pRedBC|vBC|pICMS|vICMS|BCFCP|pFCP|vFCP|vICMSDeson|motDesICMS|
N05|orig|CST|modBCST|pMVAST|pRedBCST|vBCST|pICMSST|vICMSST|vBCFCPST|pFCPST|vFCPST|vICMSDeson|motDesICMS|
N07|orig|CST|modBC|pRedBC|vBC|pICMS|vICMSOp|pDif|vICMSDif|vICMS|vBCFCP|pFCP|vFCP|
N08|orig|CST|vBCSTRet|pST|vICMSSTRet|vBCFCPSTRet|pFCPSTRet|vFCPSTRet|
N09|orig|CST|modBC|pRedBC|vBC|pICMS|vICMS|vBCFCP|pFCP|vFCP|modBCST|pMVAST|pRedBCST|vBCST|pICMSST|vICMSST|vBCFCPST|pFCPST|vFCPST|vICMSDeson|motDesICMS|
N10|orig|CST|modBC|vBC|pRedBC|pICMS|vICMS|vBCFCP|pFCP|vFCP|modBCST|pMVAST|pRedBCST|vBCST|pICMSST|vICMSST|vBCFCPST|pFCPST|vFCPST|vICMSDeson|motDesICMS|
N10e|orig|CSOSN|modBCST|pMVAST|pRedBCST|vBCST|pICMSST|vICMSST|vBCFCPST|pFCPST|vFCPST|pCredSN|vCredICMSSN|pCredSN|vCredICMSSN|
N10f|orig|CSOSN|modBCST|pMVAST|pRedBCST|vBCST|pICMSST|vICMSST|vBCFCPST|pFCPST|vFCPST|
N10g|orig|CSOSN|vBCSTRet|pST|vICMSSTRet|vBCFCPSTRet|pFCPSTRet|vFCPSTRet|
N10h|orig|CSOSN|modBC|vBC|pRedBC|pICMS|vICMS|modBCST|pMVAST|pRedBCST|vBCST|pICMSST|vICMSST|vBCFCPST|pFCPST|vFCPST|pCredSN|vCredICMSSN|
NA|vBCUFDest|vBCFCPUFDest|pFCPUFDest|pICMSUFDest|pICMSInter|pICMSInterPart|vFCPUFDest|vICMSUFDest|vICMSFRemet|
W02|vBC|vICMS|vICMSDeson|vFCP|vBCST|vST|vFCPST|vFCPSTRet|vProd|vFrete|vSeg|vDesc|vII|vIPI|vIPIDevol|vPIS|vCOFINS|vOutro|vNF|vTotTrib|
O|clEnq|CNPJProd|cSelo|qSelo|cEnq|
Y|vTroco|
YA|indPag|tPag|vPag|CNPJ|tBand|cAut|tpIntegra|
ZX01|qrcode|urlChave|