Usuários SAC valdirdill 188 Posted October 23, 2020 Usuários SAC Report Share Posted October 23, 2020 Bom dia, Estou tentando validar o xml anexo com ACBrNFe1.NotasFiscais.Validar... ocorre o erro "...no matching global declarationo available...'' (print em anexo). No validador da SEFAZ-RS não dá nenhum erro. Para adiantar uma possível análise, informe que relatei a situação chat do SAC e tive a resposta: "Big Wings: Testei aqui pelo Notepad++, validando o XML todo contra o schema procNFe_v4.00.xsd ele valida, mas se extrair o grupo <NFe> e validar contra o nfe_v4.00.xsd, que é o que o ACBr faz, causa erro de validação. Acho melhor abrir um tópico no fórum". Alguma sugestão da causa/solução dessa situação? Obrigado. 50201004970863000142550010000110291706594010-NFe.xml Valdir Dill Rio de Janeiro - RJ Link to post Share on other sites
Italo Giurizzato Junior 9,885 Posted October 23, 2020 Report Share Posted October 23, 2020 Bom dia Valdir, Você pode incluir o namespace na tag NFe sem nenhum problema. O que não pode é alterar alguma tag que esta dentro do grupo infNFe. Quando a assinatura é realizada no XML da NF-e, ela leva em consideração o conteúdo do grupo infNFe. A tag NFe esta fora desse grupo, logo incluir o namespace que esta faltando não vai alterar em nada na autenticidade da nota. Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP Link to post Share on other sites
Usuários SAC valdirdill 188 Posted October 23, 2020 Author Usuários SAC Report Share Posted October 23, 2020 Não entendi. Eu estou ciente que uma vírgula que seja alterada no XML vai invalidar o XML todo. Mas não foi esse o caso. Esse XML é um arquivo baixado pelo usuário direto do portal da SEFAZ. Outro ponto, como já mencionei, é que o XML é validado no validador da SEFAZ-RS. Obrigado. Valdir Dill Rio de Janeiro - RJ Link to post Share on other sites
Fundadores Daniel Simoes 8,704 Posted October 23, 2020 Fundadores Report Share Posted October 23, 2020 @valdirdill, você usa LibXML2 ou MSXML, na configuração de DFeSSL ? Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Link to post Share on other sites
Italo Giurizzato Junior 9,885 Posted October 23, 2020 Report Share Posted October 23, 2020 Valdir, Se você alterar uma virgula dentro do grupo <infNFe> vai invalidar o XML, sim. Mas não é isso que você vai fazer. Você vai incluir o namespace na tag NFe que esta fora do grupo <infNFe>, logo não vai invalidar o XML. O validador da SEFAZ pode até validar o XML sem o namespace, mas o validador do ACBr não valida. Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP Link to post Share on other sites
Usuários SAC valdirdill 188 Posted October 23, 2020 Author Usuários SAC Report Share Posted October 23, 2020 5 minutos atrás, Daniel Simoes disse: @valdirdill, você usa LibXML2 ou MSXML, na configuração de DFeSSL ? LibXML2 Valdir Dill Rio de Janeiro - RJ Link to post Share on other sites
Fundadores Daniel Simoes 8,704 Posted October 23, 2020 Fundadores Report Share Posted October 23, 2020 Por favor teste, usando MSXML Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Link to post Share on other sites
Usuários SAC valdirdill 188 Posted October 23, 2020 Author Usuários SAC Report Share Posted October 23, 2020 45 minutos atrás, Daniel Simoes disse: Por favor teste, usando MSXML Mesmo resultado. Valdir Dill Rio de Janeiro - RJ Link to post Share on other sites
Italo Giurizzato Junior 9,885 Posted October 23, 2020 Report Share Posted October 23, 2020 Valdir, Vamos aos porquês. Porque no validar da SEFAZ diz que o XML é valido? Simples, se o XML possuir a tag procNFe o validador da SEFAZ se utiliza do schema procNFe_v4.00.xsd, se não tem a tag e sim a tag NFe ele usa o schema nfe_v4.00.xsd para validar o XML. O tem XML possui a tag procNFe e esta tem o namespace, logo ele é validado com sucesso. Porque no validador do ACBrNFe diz que o XML é invalido? Simples, o componente extrai da tag procNFe a tag NFe e suas filhas e usa o schema nfe_v4.00.xsd para validar, como a tag NFe esta sem o namespace ocorre o erro. O componente tem esse comportamento de pegar somente a tag NFe e suas filhas para validar, pois antes de enviar a nota para a SEFAZ a mesma é validade e o XML antes do seu envio não tem a tag procNFe. Analisando o código do componente notamos que é mais simples acrescentar o namespace caso este não exista no momento da validação em vez de trocar os schemas. O XML original não é afetado, pois tudo ocorre em memória e o XML é validade sem ocorre o erro por falta de namespace. 1 Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP Link to post Share on other sites
Usuários SAC valdirdill 188 Posted October 23, 2020 Author Usuários SAC Report Share Posted October 23, 2020 4 minutos atrás, Italo Jurisato Junior disse: Valdir, Vamos aos porquês. Porque no validar da SEFAZ diz que o XML é valido? Simples, se o XML possuir a tag procNFe o validador da SEFAZ se utiliza do schema procNFe_v4.00.xsd, se não tem a tag e sim a tag NFe ele usa o schema nfe_v4.00.xsd para validar o XML. O tem XML possui a tag procNFe e esta tem o namespace, logo ele é validado com sucesso. Porque no validador do ACBrNFe diz que o XML é invalido? Simples, o componente extrai da tag procNFe a tag NFe e suas filhas e usa o schema nfe_v4.00.xsd para validar, como a tag NFe esta sem o namespace ocorre o erro. O componente tem esse comportamento de pegar somente a tag NFe e suas filhas para validar, pois antes de enviar a nota para a SEFAZ a mesma é validade e o XML antes do seu envio não tem a tag procNFe. Analisando o código do componente notamos que é mais simples acrescentar o namespace caso este não exista no momento da validação em vez de trocar os schemas. O XML original não é afetado, pois tudo ocorre em memória e o XML é validade sem ocorre o erro por falta de namespace. Certo, entendi. Então o XML que fica lá na SEFAZ não é o mesmo daquele gerado pelo sistema (via Acbr)? Porque a pergunta? porque antes do nosso sistema enviar o XML é feita a validação dele e valida, tudo certo. Porém, agora, ao tentar fazer a mesma validação, mas no arquivo baixado do portal, dá o erro. Portanto, se antes validade e agora não...me perdoe se estou falando besteira, rs...mas é o que eu entendi da situação. Valdir Dill Rio de Janeiro - RJ Link to post Share on other sites
Italo Giurizzato Junior 9,885 Posted October 23, 2020 Report Share Posted October 23, 2020 Boa tarde Valdir, Eu não sei como a SEFAZ trabalha. Se ela disponibiliza o mesmo XML enviado para você realizar o Download ou se ela gera um novo com base nos dados contidos no XML enviado. Pelo jeito a SEFAZ-MS deve gerar um novo XML, outra coisa que não sei se você notou esse XML que você baixou possui 2 assinaturas. Uma é do emitente e a outra é da SEFAZ que se encontra dentro do grupo protNFe. Não sei se são todas, mas existem SEFAZ que ao baixar o XML da nota caso tenha eventos vinculados a mesma como por exemplo carta de correção, o XML referente aos eventos fazem parte do XML da nota, ou seja, um XML só contendo os dados da nota mais os dados dos eventos. Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP Link to post Share on other sites
Usuários SAC valdirdill 188 Posted October 23, 2020 Author Usuários SAC Report Share Posted October 23, 2020 1 hora atrás, Italo Jurisato Junior disse: Boa tarde Valdir, Eu não sei como a SEFAZ trabalha. Se ela disponibiliza o mesmo XML enviado para você realizar o Download ou se ela gera um novo com base nos dados contidos no XML enviado. Pelo jeito a SEFAZ-MS deve gerar um novo XML, outra coisa que não sei se você notou esse XML que você baixou possui 2 assinaturas. Uma é do emitente e a outra é da SEFAZ que se encontra dentro do grupo protNFe. Não sei se são todas, mas existem SEFAZ que ao baixar o XML da nota caso tenha eventos vinculados a mesma como por exemplo carta de correção, o XML referente aos eventos fazem parte do XML da nota, ou seja, um XML só contendo os dados da nota mais os dados dos eventos. Ok. Entendido. Só mais uma questão: você poderia me dar uma ajudazinha, rs, em relação ao código para incluir esse namespace no XML antes de validá-lo? Pelo que você fala, parece ser coisa simples, mas não estou sabendo começar, rs... Obrigado. Valdir Dill Rio de Janeiro - RJ Link to post Share on other sites
Solution Italo Giurizzato Junior 9,885 Posted October 23, 2020 Solution Report Share Posted October 23, 2020 Valdir, Na unit ACBrNFeNotasFiscais procure pela função ObterNFeXML. Ela tem que ficar da seguinte forma: function NotaFiscal.ObterNFeXML(const AXML: String): String; var DeclaracaoXML: String; begin DeclaracaoXML := ObtemDeclaracaoXML(AXML); Result := RetornarConteudoEntre(AXML, '<NFe xmlns', '</NFe>'); if not EstaVazio(Result) then Result := '<NFe xmlns' + Result + '</NFe>' else begin Result := LerTagXML(AXML, 'NFe'); if not EstaVazio(Result) then Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>' end; if not EstaVazio(Result) then Result := DeclaracaoXML + Result; end; A linha que devemos alterar é a linha: Result := '<NFe>' + Result + '</NFe>' o correto é: Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>' 4 Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP Link to post Share on other sites
Usuários SAC valdirdill 188 Posted October 23, 2020 Author Usuários SAC Report Share Posted October 23, 2020 4 minutos atrás, Italo Jurisato Junior disse: Valdir, Na unit ACBrNFeNotasFiscais procure pela função ObterNFeXML. Ela tem que ficar da seguinte forma: function NotaFiscal.ObterNFeXML(const AXML: String): String; var DeclaracaoXML: String; begin DeclaracaoXML := ObtemDeclaracaoXML(AXML); Result := RetornarConteudoEntre(AXML, '<NFe xmlns', '</NFe>'); if not EstaVazio(Result) then Result := '<NFe xmlns' + Result + '</NFe>' else begin Result := LerTagXML(AXML, 'NFe'); if not EstaVazio(Result) then Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>' end; if not EstaVazio(Result) then Result := DeclaracaoXML + Result; end; A linha que devemos alterar é a linha: Result := '<NFe>' + Result + '</NFe>' o correto é: Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>' Ok. Muito obrigado pela ajuda. 1 Valdir Dill Rio de Janeiro - RJ Link to post Share on other sites
Recommended Posts