Validação de arquivo xml antes do envio...

1,081 views
Skip to first unread message

Bernardo Hoehl

unread,
Sep 17, 2010, 5:05:09 PM9/17/10
to nfe...@googlegroups.com
Amigos,


Eu estou tentando atualizar um antigo validador de NFs e tenho alguma dificuldade.

Gostaria de entender um pouco melhor como funciona a rotina de validação...

Em primeiro, se o padrão é UTF-8, por que não existe suporte aos nossos caracteres especiais do português brasileiro?

Coloquei um caracter "ç" no texto de um XML e validei no validador on-line do RS... Por que funciona?

Quais são os caracteres permitidos no texto do XML?? menores que 128 na tabela ASCII?

Nas 232 páginas do manual, não consigo encontrar que texto diz que caracter é válido ou não...

Por que um apostolo, como em D'angelo e Cia, não é válido se ele é número 39 na tabela ASCII??

Estou fazendo tentativas e erros usando o Software Gratuito do Sefaz para testes, mas me parece que ele é meio mal feitinho...

A validação seguindo o Manual, examinando

Tipo
Ocorrência
Tamanho

não é o suficiente???

Obrigado por seus comentários,


Bernardo Höhl
Rio de Janeiro


Bernardo Hoehl

unread,
Sep 17, 2010, 5:18:56 PM9/17/10
to nfe...@googlegroups.com
Página 83 do manual:

Todos os textos de um documento XML passam por uma análise do “parser” específico da linguagem. Alguns caracteres afetam o funcionamento deste “parser”, não podendo aparecer no texto de uma forma não controlada.
Os caracteres que afetam o “parser” são:

> (sinal de maior), < (sinal de menor), 
& (e-comercial),
“ (aspas),
‘ (sinal de apóstrofe).

Alguns destes caracteres podem aparecer especialmente no campo de Razão Social, Endereço e Informação Adicional. Para resolver esses casos, é recomendável o uso de uma seqüência de “escape” em substituição ao caractere que causa o problema.


FerreiraH.

unread,
Sep 18, 2010, 8:05:33 PM9/18/10
to nfe...@googlegroups.com
    function scape_array(&$array, $key) {
        /*
//trocando os caracteres a ser escapados
> (sinal de maior),&lt;
< (sinal de menor),&gt;
& (e-comercial),&amp;
" (aspas),&quot;
' (sinal de apóstrofe).&#39;
*/
         if(is_array($array)) {
            array_walk ($array, array($this, 'scape_array'));//scape_array
         } else {
            $order = array("&",">", "<", '"',"'");
            $replace = array('&amp;','&lt;', '&gt;', '&quot;','&#39;');
            $array = str_replace($order, $replace, $array);
        //echo "funcoes.php 2884 scape_array $array  \n";
--
Ferreira Helder
B2Stok.net ERP Php5-Gtk2
PhpGtkEditor
PhpSDL
PhpGladeTools
Voce pode colaborar

Edmar Wiggers

unread,
Sep 18, 2010, 9:47:25 PM9/18/10
to nfe...@googlegroups.com
Oi Bernardo,

Tb acho feio o próprio governo dizer para não usarmos caracteres
acentuados do nosso idioma.

Sobre a validação do XML: Sugiro que a montagem do XML seja feita não
utilizando concatenação simples, e sim usando um objeto/biblioteca,
que nesse caso vc não tem q se preocupar com escaping, etc. A
conversão TXT -> XML do NFePHP é feita usando a classe DOMDocument do
PHP, eu faço da mesma forma e não tive problemas.

Sobre o cedilha: Aparentemente valida sem problemas. Tenho NF-e's
contendo cedilhas nas informações complementares (infCpl) que foram
validadas em produção na Sefaz Virtual do RS e também em homologação
na Sefaz do Paraná (ainda não estou em produção no PR).

Abraço

Em 17 de setembro de 2010 18:05, Bernardo Hoehl
<bern...@correiofacil.com> escreveu:

> --
> Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
> Para Postar: nfe...@googlegroups.com
> Para Sair do Grupo: nfephp+un...@googlegroups.com
> Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
> -------
> FAQ: https://www.assembla.com/wiki/show/nfephp/FAQ
> Como Participar: https://www.assembla.com/wiki/show/nfephp/Como_participar
> Como Utilizar: http://www.assembla.com/wiki/show/nfephp/Como_utilizar
>

--
Edmar Wiggers
Macrovita Alimentos
Tel.: 48-3233-4615 / 48-9966-0074
Email: e...@macrovita.com.br
Web: www.macrovita.com.br

Bernardo Hoehl

unread,
Sep 19, 2010, 12:34:49 PM9/19/10
to nfe...@googlegroups.com
Obrigado Edmar e Ferreira por seus comentários.

Noto que todos programas de NFe substituem cedilhas, tils, agudos, etc...

Onde no manual diz que devemos fazer isso?

Li muito e não encontro onde...

De onde veio esta idéia?

Unicode suporta até mesmo chinês...

FerreiraH.

unread,
Sep 19, 2010, 2:52:28 PM9/19/10
to nfe...@googlegroups.com
Me parece que o validador é que não suporta
Também o Mysql no meu caso preciso corrigir tudo para aceitar nomes de clientes do o apostrofe.
No meu caso eu faço um array com toda a nota depois eu troco estes caracteres que atrapalham a validação ai eu faço a converção do array utilizando aquela função que postei outro dia e passando o array já com o jeitinho brasileiro para o txttoxml.php

Mas se voce verificar no sintegra a maioria dos nomes de rua e Razão social não são acentuado.

Já foi postado onde vou repetir

Manual_de_integracao_contribuinte_v30.pdf

Pág. 71 / 145
Nota Fiscal Eletrônica

Tratamento de caracteres especiais no texto de XML

Todos os textos de um documento XML passam por uma análise do “parser” específico da
linguagem. Alguns caracteres afetam o funcionamento deste “parser”, não podendo
aparecer no texto de uma forma não controlada.
Os caracteres que afetam o “parser” são:





> (sinal de maior),
< (sinal de menor),
& (e-comercial),
“ (aspas),
‘ (sinal de apóstrofe).
Alguns destes caracteres podem aparecer especialmente no campo de Razão Social,
Endereço e Informação Adicional. Para resolver esses casos, é recomendável o uso de uma
seqüência de “escape” em substituição ao caractere que causa o problema.
Ex. a denominação: DIAS & DIAS LTDA deve ser informada como: DIAS &amp; DIAS LTDA
no XML para não afetar o funcionamento do "parser".
caractere
<
>
&
"
'
seqüência de escape
&lt;
&gt;
&amp;
&quot;
&#39;





--
manual_de_integracao_contribuinte_v30.pdf

Edmar Wiggers

unread,
Sep 19, 2010, 4:34:40 PM9/19/10
to nfe...@googlegroups.com
Além da página 71 indicada pelo Ferreira, vide também a página 132 do
Manual de Integração v3.0:

"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;"

Em 19 de setembro de 2010 15:52, FerreiraH.
<helder.m...@gmail.com> escreveu:

--

Bernardo Höhl

unread,
Sep 19, 2010, 4:56:32 PM9/19/10
to nfe...@googlegroups.com
Eu lembro ter lido este texto.

Mas "evitado" não é proibido. É?

Por exemplo:

[]{}#%€£¥@():

Acima não são acentuados e podem ser usados?

Eu esperava que num manual tão extenso houvesse uma definição mais
precisa.

Atenciosamente,

Bernardo Hõhl

http://www.rutenium.com.br
http://www.macfacil.com.br/blog/

FerreiraH.

unread,
Sep 19, 2010, 5:40:50 PM9/19/10
to nfe...@googlegroups.com

Os campos numéricos devem ser informados sem o separador de milhar, com uso do ponto decimal (Brasil deveria ser virgula) para indicar a parte fracionária se existente respeitando-se a quantidade de dígitos prevista no leiaute;
As datas devem ser informadas no formato “AAAA-MM-DD”; (outro absurdo AMERICANISMO)

Esta aqui é importante IE é uma tag obrigatoria logo deve aparecer quando o cliente é pessoa fisica

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;


Em 19 de setembro de 2010 17:56, Bernardo Höhl <bern...@correiofacil.com> escreveu:
Eu lembro ter lido este texto.

Mas "evitado" não é proibido. É?

Por exemplo:

[]{}#%€£¥@():

Acima não são acentuados e podem ser usados?

Eu esperava que num manual tão extenso houvesse uma definição mais precisa.

Atenciosamente,

Bernardo Hõhl

http://www.rutenium.com.br
http://www.macfacil.com.br/blog/

Em 19/09/2010, às 17:34, Edmar Wiggers <e...@macrovita.com.br> escreveu:
Além da página 71 indicada pelo Ferreira, vide também a página 132 do
Manual de Integração v3.0:

"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;"

Em 19 de setembro de 2010 15:52, FerreiraH.
<helder.m...@gmail.com> escreveu:
Me parece que o validador é que não suporta
Também o Mysql no meu caso preciso corrigir tudo para aceitar nomes de

clientes do o apostrofe.
No meu caso eu faço um array com toda a nota depois eu troco estes
caracteres que atrapalham a validação ai eu faço a converção do array
utilizando aquela função que postei outro dia e passando o array já com o

jeitinho brasileiro para o txttoxml.php

Mas se voce verificar no sintegra a maioria dos nomes de rua e Razão social

Edmar Wiggers

unread,
Sep 19, 2010, 9:08:57 PM9/19/10
to nfe...@googlegroups.com
Concordo q evitado não é proibido, provavelmente pr isso o cedilha valida OK.

Fica a recomendação de usar uma biblioteca q faça escaping automático
para montar o XML, acredito q evita a maioria dos problemas.

Em 19 de setembro de 2010 17:56, Bernardo Höhl
<bern...@correiofacil.com> escreveu:

> Eu lembro ter lido este texto.
>
> Mas "evitado" não é proibido. É?
>
> Por exemplo:
>
> []{}#%€£¥@():
>
> Acima não são acentuados e podem ser usados?
>
> Eu esperava que num manual tão extenso houvesse uma definição mais precisa.
>
> Atenciosamente,
>
> Bernardo Hõhl
>
> http://www.rutenium.com.br
> http://www.macfacil.com.br/blog/
>
> Em 19/09/2010, às 17:34, Edmar Wiggers <e...@macrovita.com.br> escreveu:
>
>> Além da página 71 indicada pelo Ferreira, vide também a página 132 do
>> Manual de Integração v3.0:
>>
>> "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;"
>>
>> Em 19 de setembro de 2010 15:52, FerreiraH.
>> <helder.m...@gmail.com> escreveu:
>>>
>>> Me parece que o validador é que não suporta

>>> Também o Mysql no meu caso preciso corrigir tudo para aceitar nomes de


>>> clientes do o apostrofe.
>>> No meu caso eu faço um array com toda a nota depois eu troco estes
>>> caracteres que atrapalham a validação ai eu faço a converção do array

>>> utilizando aquela função que postei outro dia e passando o array já com o

Edmar Wiggers

unread,
Sep 19, 2010, 9:12:49 PM9/19/10
to nfe...@googlegroups.com
Em 19 de setembro de 2010 18:40, FerreiraH.
<helder.m...@gmail.com> escreveu:

>
> Os campos numéricos devem ser informados sem o separador de milhar, com uso
> do ponto decimal (Brasil deveria ser virgula) para indicar a parte
> fracionária se existente respeitando-se a quantidade de dígitos prevista no
> leiaute;
> As datas devem ser informadas no formato “AAAA-MM-DD”; (outro absurdo
> AMERICANISMO)

Meio off-topic, mas considero AAAA-MM-DD bem melhor que dd/mm/aaaa, pq
ordena automaticamente de forma cronológica em qq lugar, e não gera
dúvida entre dd/mm/aaaa (nosso e europeu) e mm/dd/aaaa (americano).
Além disso é padrão ISO/internacional (
http://en.wikipedia.org/wiki/ISO_8601 , não é formato americano, que
eu saiba é usado no dia a dia apenas no Japão).

Edmar Wiggers

unread,
Sep 19, 2010, 9:15:21 PM9/19/10
to nfe...@googlegroups.com
Em 19 de setembro de 2010 22:12, Edmar Wiggers <e...@macrovita.com.br> escreveu:
> Em 19 de setembro de 2010 18:40, FerreiraH.
> <helder.m...@gmail.com> escreveu:
>>
>> Os campos numéricos devem ser informados sem o separador de milhar, com uso
>> do ponto decimal (Brasil deveria ser virgula) para indicar a parte
>> fracionária se existente respeitando-se a quantidade de dígitos prevista no
>> leiaute;
>> As datas devem ser informadas no formato “AAAA-MM-DD”; (outro absurdo
>> AMERICANISMO)
>
> Meio off-topic, mas considero AAAA-MM-DD bem melhor que dd/mm/aaaa, pq
> ordena automaticamente de forma cronológica em qq lugar, e não gera
> dúvida entre dd/mm/aaaa (nosso e europeu) e mm/dd/aaaa (americano).
> Além disso é padrão ISO/internacional (
> http://en.wikipedia.org/wiki/ISO_8601 , não é formato americano, que
> eu saiba é usado no dia a dia apenas no Japão).

Agora é off-topic mesmo, desculpem:
http://en.wikipedia.org/wiki/Date_and_time_notation_by_country
aaaa-mm-dd é usado em mais países na Ásia

Bernardo Hoehl

unread,
Sep 19, 2010, 10:44:51 PM9/19/10
to nfe...@googlegroups.com
Eu acho que deveriamos usar o Unix Time Stamp...

Contagem de segundos desde zero hora de 1º de janeiro de 1970...

É minha opinião...

Bernardo Hoehl

unread,
Sep 19, 2010, 10:55:12 PM9/19/10
to nfe...@googlegroups.com
Desculpe amigos,

O que acontece é que eu estou usando o NfePHP apenas no envio do xml, consulta e cancelamento.

Não conheço código PHP, mas parece que o PHP tem uma extensa biblioteca que faz as coisas bem mais faceis para vocês...

Tenho grande admiração e gratidão a todos vocês.

O que ocorre é que gostaria de entender como funciona a cabeça dos caras que desenvolveram o NFe, e como é realmente a validação. Mas é falha, de qualquer forma.

Minha rotinas antigas são todas em Applescript, e de alguma forma tenho que escrever tudo na unha ou a melhor opção chamar um unix shell para resolver cada problema.

Voltando a caracteres válidos, por exemplo, estas descrições de produtos são válidas?

Abaixo:

1) Gesso Nº 3 (saco plastico) embalagem 1kg ---> Veja o que temos depois do "N"

2) Silica Coloidal Concentracao 30% (frasco plastico) embalagem 500ml --> Sinal percentual

3) Quartzo moído malha #325 (saco de papel) embalagem 25kg --> Cerquilha, vulgarmente chamado pelo atendentes de operadoras telefônicas por "joguinho da velha"

No meu entendimento todas 3 frases acima não conteem caracteres acentuados ou simbolos.

O que acham?

Obrigado!


Bernardo

===================

FerreiraH.

unread,
Sep 19, 2010, 11:03:41 PM9/19/10
to nfe...@googlegroups.com
Olha não sou muito rígido (ou chato ), e as vezes acabo não sendo tão preciosista se é que esta palavra existe, como não tenho tempo não vou procurar no wiki.
Mas o que eu quis dizer com americanismo, foi que o governo brasileiro não prima por nacionalismo.
Agora se a regra é para utilizar do jeito que eles querem que seja assim façamos pois, o autoritarismo e o fim da liberdade de expressão bate a nossa porta.
Então se é off ou não é topic so sei que ou voce faz conforme o manual ou não funciona .

FerreiraH.

unread,
Sep 19, 2010, 11:13:21 PM9/19/10
to nfe...@googlegroups.com
Sefaz RS - Nota Fiscal Eletrônica - Validador de Mensagens do Projeto NF-e

Usa este link para validar se assinado verifica se esta assinado corretamente tambem

pelo que tenho noticias os unicos que deve ser trocados são aqueles já mencionados no manual.
Eu fiquei varios anos desenvolvendo um erp e sempre tentei colocar pontos para separar milhar e virgulas para decimal afinal é padrão
Mas apanhei muito do PHP windows e GNU-linux em algumas veses funcionava depois não funcionava ai quando fui integrar as notas fiscais eletronicas tive de desfazer tudo e colocar os pontos como decimal, revirar as datas, e tirar acentos.
Esses são os caras.

Bernardo Hoehl

unread,
Sep 19, 2010, 11:28:29 PM9/19/10
to nfe...@googlegroups.com
O problema é que provavelmente o que é hoje "obrigatório", venha ser "proibido" ano que vem...

Sempre repassam a responsabilidade ou onus para outrém...

Roberto Leite Machado

unread,
Sep 20, 2010, 7:22:36 AM9/20/10
to nfe...@googlegroups.com
Senhores, alguns esclarecimentos

1 - Uso de acentuação
O problema está nos próprios ERP e na diversidade de codificações, por isso é melhor tirar ! (inclusive nos sistema da SEFAZ, eles também misturam UNIX, LINUX, E RUINDOWS)

2 - Caracteres especiais
Como $&<>*!}{[]º  também devem ser evitados devido ao problema acima citado

3 - Padrão data YYYY-MM-DD
Isto não é um padrão americano é um padrão internacional (ISO) e muito melhor do que qualquer outro para uso em programação e banco de dados, só como exemplo tente colocar dd/mm/yyyy ou mm/dd/yyyy em ordem crescente ou decrescente ... vai dar errado  e o padrão americano é mm/dd/yyyy.

4 - Quanto aos símbolos mencionados %, º e # 
Nas descrições de produto podem ser usado o % e a # mas não use o º 

5 - Evitar ao máximo qualquer acentuação nas razões sociais, e tomar muito cuidado nos endereços, códigos e unidades são campos usados pela SEFAZ e que devem estar coerentes com o registro no órgão 

6 - Unidades
Neste caso eu fico louco de raiva as vezes pois a pratica comercial deveria utilizar as unidades do S.I. (sistema internacional) e como sou engenheiro fico indignado com coisas como "MT" "MTQ" "KG" "LT" mas a caca do sistema muitas vezes não valida se colocar a unidade correta, além dos clientes que não entendem as unidades corretas. Fazer o que, né !!

Roberto



Rodrigo Fernando

unread,
Sep 20, 2010, 7:52:33 AM9/20/10
to nfe...@googlegroups.com
Pessoal, bom dia

Estou pensando em algo aqui e gostaria de saber se algu�m tem esta
solu��o ou ja viu algo assim.

Alguns fornecedores da empresa n�o enviam o XML, dificultando a
implanta��o da NFE aqui.

Recebo o arquivo impresso com a chave.

Existe algum site que com a chave da sefaz, eu consiga fazer o download
deste XML?

Obrigado

Rodrigo Fernando

Marcos

unread,
Sep 20, 2010, 7:56:06 AM9/20/10
to nfe...@googlegroups.com
eu instru� meu depto financeiro a s� pagar NFEs quando tivermos o XML.

Marcos

Roberto Leite Machado

unread,
Sep 20, 2010, 10:52:18 AM9/20/10
to nfe...@googlegroups.com
Negativo. Somente o emitente pode enviar o xml.

Recomendo que você exija o xml, é sua obrigação manter estes xml de terceiros o DANFE não vale NADA, nem adianta guardar e é obrigação do emitente mandar para você.

Nas empresas onde trabalho somente é possível receber mercadorias com nota fiscal modelo 55 se xml tiver sido previamente inserido no sistema e validado.
Notas fiscais de outros modelos são aceitas normalmente (sem verificação)  

Roberto

Em 20 de setembro de 2010 08:56, Marcos <mar...@unitron.com.br> escreveu:
eu instruí meu depto financeiro a só pagar NFEs quando tivermos o XML.

Marcos




On 20/09/2010 08:52, Rodrigo Fernando wrote:
Pessoal, bom dia

Estou pensando em algo aqui e gostaria de saber se alguém tem esta
solução ou ja viu algo assim.

Alguns fornecedores da empresa não enviam o XML, dificultando a
implantação da NFE aqui.


Recebo o arquivo impresso com a chave.

Existe algum site que com a chave da sefaz, eu consiga fazer o download
deste XML?

Obrigado

Rodrigo Fernando

Felipe Bonato

unread,
Sep 20, 2010, 11:08:18 AM9/20/10
to nfe...@googlegroups.com

Senhores,

 

Alguns de meus clientes começaram a reclamar que o programa da receita visualizador de NF-e acusa que o existe um erro no meu certificado da NF-e.

 

 

Porem o mesmo passou por todo o procedimento.

 

Assinado, validade, transmitido e confirmado.

 

 

O que poderia estar ocorrendo ???

 

O problema e no programa da receita ou podemos estar cometendo algum equivoco.

 

 

 

Felipe Bonato

FerreiraH.

unread,
Sep 20, 2010, 12:05:14 PM9/20/10
to nfe...@googlegroups.com
o erro ocorre ao protocolar quando voce pega a nota enviada e junta o protocolo o  xml da nota é alterado acrecentando algumas tag
a correção é retirar estes acrescimos.
se voce comparar os arquivos enviado com o arquivo protocolado voce verá

Correção

verificar se sua função addProt()

contem
//salva o xml como string em uma variável
            $procXML = $procnfe->saveXML();
            //remove as informações indesejadas
            $procXML = str_replace('default:','',$procXML);
            $procXML = str_replace("\n",'',$procXML);
            $procXML = str_replace("\r",'',$procXML);
            $procXML = str_replace('NFe xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:default="http://www.w3.org/2000/09/xmldsig#"','NFe xmlns="http://www.portalfiscal.inf.br/nfe"',$procXML);

            return $procXML;



--

Leandro Santana

unread,
Sep 20, 2010, 12:51:01 PM9/20/10
to nfe...@googlegroups.com

É ISSO MESMO, EU TAMBÉM ESTAVA COM O MESMO PROBLEMA. ISSO RESOLVEU

 


Leandro Santana

Tecnologia da Informação - TI
( Celular:  (11) 7232-0066
* leandro...@gmail.com

 

"de fazer convergir em Cristo, na dispensação da plenitude dos tempos, todas as coisas, tanto as do céu, como as da terra;" - Efésios 1:10

Rodrigo Fernando

unread,
Sep 20, 2010, 2:02:23 PM9/20/10
to nfe...@googlegroups.com
Roberto,

Muito obrigado.

Quanto a obrigatoriedade achei interessante. Será que na legislação tem algo assim, informando esta obrigatoriedade?

Porque alguns fornecedores estão passando endereços web, onde logo e baixo o xml.

Atte,
Rodrigo Fernando

Felipe Bonato

unread,
Sep 20, 2010, 2:48:25 PM9/20/10
to nfe...@googlegroups.com

Ferreira,

 

Obrigado pela ajuda, porem não encontrei esta parte do código no meu ToolsNFePHP.class.php

 Posso estar com o arquivo errado ????

 

Segue abaixo minha rotina addProt();

 

 

 

    public function addProt($nfefile, $protfile) {

            //protocolo do lote enviado

            $prot = new DOMDocument(); //cria objeto DOM

            $prot->formatOutput = false;

            $prot->preserveWhiteSpace = false;

            //NFe enviada

            $docnfe = new DOMDocument(); //cria objeto DOM

            $docnfe->formatOutput = false;

            $docnfe->preserveWhiteSpace = false;

 

            $xmlnfe = file_get_contents($nfefile);

            $docnfe->loadXML($xmlnfe,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);

            $nfe = $docnfe->getElementsByTagName("NFe")->item(0);

 

            //carrega o protocolo e seus dados

            $xmlprot = file_get_contents($protfile);

            $prot->loadXML($xmlprot,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);

            $tpAmb = $prot->getElementsByTagName("tpAmb")->item(0)->nodeValue;

            $verAplic = $prot->getElementsByTagName("verAplic")->item(0)->nodeValue;

            $chNFe=$prot->getElementsByTagName("chNFe")->item(0)->nodeValue;

            $dhRecbto=$prot->getElementsByTagName("dhRecbto")->item(0)->nodeValue;

            $nProt=$prot->getElementsByTagName("nProt")->item(0)->nodeValue;

            $digVal=$prot->getElementsByTagName("digVal")->item(0)->nodeValue;

            $cStat=$prot->getElementsByTagName("cStat")->item(0)->nodeValue;

            $xMotivo=$prot->getElementsByTagName("xMotivo")->item(0)->nodeValue;

 

            //NFe processada com a tag do protocolo

            $procnfe = new DOMDocument('1.0', 'utf-8');

            $procnfe->formatOutput = false;

            $procnfe->preserveWhiteSpace = false;

            //cria a tag nfeProc

            $nfeProc = $procnfe->appendChild($procnfe->createElement('nfeProc'));

            //estabele o atributo de versão

            $nfeProc_att1 = $nfeProc->appendChild($procnfe->createAttribute('versao'));

                $nfeProc_att1->appendChild($procnfe->createTextNode('1.10'));

            //estabelece o atributo xmlns

            $nfeProc_att2 = $nfeProc->appendChild($procnfe->createAttribute('xmlns'));

                $nfeProc_att2->appendChild($procnfe->createTextNode($this->URLnfe));

 

            //inclui NFe

            $node = $procnfe->importNode($nfe, true);

            $nfeProc = $nfeProc->appendChild($node);

 

            //cria tag protNFe

            $protNFe = $nfeProc->appendChild($procnfe->createElement('protNFe'));

            //estabele o atributo de versão

            $protNFe_att1 = $protNFe->appendChild($procnfe->createAttribute('versao'));

            $protNFe_att1->appendChild($procnfe->createTextNode('1.10'));

            //cria tag infProt

            $infProt = $protNFe->appendChild($procnfe->createElement('infProt'));

            $infProt->appendChild($procnfe->createElement('tpAmb',$tpAmb));

            $infProt->appendChild($procnfe->createElement('verAplic',$verAplic));

            $infProt->appendChild($procnfe->createElement('chNFe',$chNFe));

            $infProt->appendChild($procnfe->createElement('dhRecbto',$dhRecbto));

            $infProt->appendChild($procnfe->createElement('nProt',$nProt));

            $infProt->appendChild($procnfe->createElement('digVal',$digVal));

            $infProt->appendChild($procnfe->createElement('cStat',$cStat));

            $infProt->appendChild($procnfe->createElement('xMotivo',$xMotivo));

 

            return $procnfe->saveXML();

 

    } //fim da função

 

 

 

Como devo proeder ???

 

 

Já agradecendo antecipadamente,

 

 

Felipe Bonato

 

 

 

 

 

De: nfe...@googlegroups.com [mailto:nfe...@googlegroups.com] Em nome de FerreiraH.
Enviada em: segunda-feira, 20 de setembro de 2010 13:05
Para: nfe...@googlegroups.com
Assunto: Re: [nfephp] Erro de Leitura do Certificado Digital pelo Programa da Receita

 

o erro ocorre ao protocolar quando voce pega a nota enviada e junta o protocolo o  xml da nota é alterado acrecentando algumas tag

FerreiraH.

unread,
Sep 20, 2010, 4:20:37 PM9/20/10
to nfe...@googlegroups.com
    /**
     * addProt
     * Este método adiciona a tag do protocolo a NFe, preparando a mesma
     * para impressão e envio ao destinatário.
     *
     * @param string $nfefile path completo para o arquivo contendo a NFe
     * @param string $protfile path completo para o arquivo contendo o protocolo
     * @return string Retorna a NFe com o protocolo
     */
    public function addProt($nfefile, $protfile) {
            //protocolo do lote enviado
            $prot = new DOMDocument(); //cria objeto DOM
            $prot->formatOutput = false;
            $prot->preserveWhiteSpace = false;
            //NFe enviada
            $docnfe = new DOMDocument(); //cria objeto DOM
            $docnfe->formatOutput = false;
            $docnfe->preserveWhiteSpace = false;

            $xmlnfe = file_get_contents($nfefile);
            $docnfe->loadXML($xmlnfe,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
            $nfe = $docnfe->getElementsByTagName("NFe")->item(0);

            //carrega o protocolo e seus dados
            $xmlprot = file_get_contents($protfile);
            $prot->loadXML($xmlprot,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
            $tpAmb = $prot->getElementsByTagName("tpAmb")->item(0)->nodeValue;
            $verAplic = $prot->getElementsByTagName("verAplic")->item(0)->nodeValue;
            $chNFe=$prot->getElementsByTagName("chNFe")->item(0)->nodeValue;
            $dhRecbto=$prot->getElementsByTagName("dhRecbto")->item(0)->nodeValue;
            $nProt=$prot->getElementsByTagName("nProt")->item(0)->nodeValue;
            $digVal=$prot->getElementsByTagName("digVal")->item(0)->nodeValue;
            $cStat=$prot->getElementsByTagName("cStat")->item(0)->nodeValue;
            $xMotivo=$prot->getElementsByTagName("xMotivo")->item(0)->nodeValue;

            //NFe processada com a tag do protocolo
            $procnfe = new DOMDocument('1.0', 'utf-8');
            $procnfe->formatOutput = false;
            $procnfe->preserveWhiteSpace = false;
            //cria a tag nfeProc
            $nfeProc = $procnfe->createElement('nfeProc');
            $procnfe->appendChild($nfeProc);
            //estabele o atributo de versão
            $nfeProc_att1 = $nfeProc->appendChild($procnfe->createAttribute('versao'));
                $nfeProc_att1->appendChild($procnfe->createTextNode('1.10'));
            //estabelece o atributo xmlns
            $nfeProc_att2 = $nfeProc->appendChild($procnfe->createAttribute('xmlns'));
                $nfeProc_att2->appendChild($procnfe->createTextNode($this->URLnfe));

            //inclui NFe
            $node = $procnfe->importNode($nfe, true);
            $nfeProc->appendChild($node);

            //cria tag protNFe
            $protNFe = $procnfe->createElement('protNFe');
            $nfeProc->appendChild($protNFe);
            //estabele o atributo de versão
            $protNFe_att1 = $protNFe->appendChild($procnfe->createAttribute('versao'));
            $protNFe_att1->appendChild($procnfe->createTextNode('1.10'));
            //cria tag infProt
            $infProt = $procnfe->createElement('infProt');
            $protNFe->appendChild($infProt);
            $infProt->appendChild($procnfe->createElement('tpAmb',$tpAmb));
            $infProt->appendChild($procnfe->createElement('verAplic',$verAplic));
            $infProt->appendChild($procnfe->createElement('chNFe',$chNFe));
            $infProt->appendChild($procnfe->createElement('dhRecbto',$dhRecbto));
            $infProt->appendChild($procnfe->createElement('nProt',$nProt));
            $infProt->appendChild($procnfe->createElement('digVal',$digVal));
            $infProt->appendChild($procnfe->createElement('cStat',$cStat));
            $infProt->appendChild($procnfe->createElement('xMotivo',$xMotivo));
            //salva o xml como string em uma variável
            $procXML = $procnfe->saveXML();
            //remove as informações indesejadas
            $procXML = str_replace('default:','',$procXML);
            $procXML = str_replace("\n",'',$procXML);
            $procXML = str_replace("\r",'',$procXML);
            $procXML = str_replace('NFe xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:default="http://www.w3.org/2000/09/xmldsig#"','NFe xmlns="http://www.portalfiscal.inf.br/nfe"',$procXML);

            return $procXML;

    } //fim da função

Felipe Bonato

unread,
Sep 20, 2010, 4:36:19 PM9/20/10
to nfe...@googlegroups.com

Obrigado pela sua atenção e pelo seu tempo

 

Vou testar e te aviso.

Roberto Leite Machado

unread,
Sep 20, 2010, 6:08:13 PM9/20/10
to nfe...@googlegroups.com
Rodrigo

A obrigatoriedade do emitente é disponibilizar o xml,  se o teu fornecedor colocou no site tá perfeito mas ele tem que te mandar um email avisando onde baixar.
Quanto a obrigatoriedade de armazenar tá na legislação .... você tem que acessar o site do fulano, baixar o xml, verificar sua validade e armazenar por xxx anos .

Abraço
Roberto
Reply all
Reply to author
Forward
0 new messages