FONTE NFE VB.NET
- Adicionei um botão ao projeto NFe do forum = VALIDAR SCHEMA xml com o seguinte codigo:
If Trim(CAMINHONFEGERADA.Text) = [Ô][Ô] Then
MsgBox([Ô]Informe o Nome do Arquivo XML, e, Tente Novamente.[Ô], MsgBoxStyle.Exclamation)
Exit Sub
End If
[ô]preparando arquivo para validação
Dim xDoc As New XmlDocument : xDoc.Load(CAMINHONFEGERADA.Text)
[ô]Salva o Arquivo
xDoc.Save(My.Application.Info.DirectoryPath & [Ô]\NFE\validaXML.xml[Ô])
Dim resultado As String = ValidaXML.ValidarXML(xDoc, My.Application.Info.DirectoryPath & [Ô]\[Ô] & [Ô]NFe_v2.00.xsd[Ô])
If resultado.Trim().Length = 0 Then
resultado = [Ô]Validação Concluida Com Sucesso[Ô]
End If
textBox1.Text = resultado
...e a função validarXML que já existia no projeto da NFe baixado:
Public Function ValidarXML(ByVal documento As XmlDocument, ByVal SchemaNf As String) As String
Dim xmlSaida As Stream = New MemoryStream()
documento.Save(xmlSaida)
xmlSaida.Flush()
xmlSaida.Position = 0
Dim retorno As String = [Ô][Ô]
If (documento IsNot Nothing) AndAlso (File.Exists(SchemaNf)) Then
[ô]COMPARA XML COM ESQUEMA SELECIONADO
Dim cStreamReader As New StreamReader(xmlSaida)
Dim cXmlTextReader As New XmlTextReader(cStreamReader)
Dim reader As New XmlValidatingReader(cXmlTextReader)
Dim schemaCollection As New XmlSchemaCollection()
schemaCollection.Add([Ô]http://www.portalfiscal.inf.br/nfe[Ô], SchemaNf)
reader.Schemas.Add(schemaCollection)
AddHandler reader.ValidationEventHandler, AddressOf reader_ValidationEventHandler
Erro = [Ô][Ô]
Try
While reader.Read()
End While
Catch ex As Exception
Erro = ex.Message
End Try
reader.Close()
If Erro <> [Ô][Ô] Then
retorno = [Ô]Resultado da validação [Ô] & vbCr & vbLf & vbCr & vbLf
retorno += Erro
retorno += vbCr & vbLf & [Ô]...Fim da validação[Ô]
End If
Else
retorno = [Ô]Documento XML inválido ou arquivo do Schema não foi encontrado.[Ô]
End If
Return retorno
End Function
- Baixei também a última atualização dos schemas no portal da NFe nacional e substitui os que vinheram no projeto da NFe do forum.
- Ao validar o schema xml de qualquer arquivo, do mundo real, já processado pela sefaz e autorizado obtenho sempre o mesmo retorno:
Retorno:
Elemento [ô]http://www.portalfiscal.inf.br/nfe:xMotivo[ô] não foi declarado.
<protNFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] versao=[Ô]2.00[Ô]>
<infProt Id=[Ô]NFe1[Ô]>
<tpAmb>1</tpAmb>
<verAplic>NFEPE_P_04.00.01.018</verAplic>
<chNFe>261212093399360007015500100001147311260?????</chNFe>
<dhRecbto>2012-12-08T09:54:47</dhRecbto>
<nProt>1261200530?????</nProt>
<digVal>sGqvKyGyd7NiwfB2gEUDT+FzKWY=</digVal>
<cStat>100</cStat
><xMotivo>Autorizado o uso da NF-e</xMotivo>
</infProt>
</protNFe>
Porque isso, já que a tag xMotivo consta no arquivo xml?
O objetivo desse codigo seria poder verificar a integridade de um arquivo xml recebido.
Citação::
...obg a todos do forum pelas preciosas dicas fornecidas..
.
.
.
O objetivo desse codigo seria poder verificar a integridade de um arquivo xml recebido.
A validação feita através da função ValidarXML, não testa a integridade, nem a validade da NFE já processada.
Essa função tem por objetivo, validar apenas os XMLs assinados e se todas as tags necessárias estão na sequencia correta na montagem do xml, bem como se o conteúdo/tamanho dos campos estão sendo preenchidos corretamente(tipo de dados e tamanho).
Por exemplo :
O campo nChave deve ter OBRIGATORIAMENTE tamanho = 44 e conter somente numeros.
Esta é a validação que a função executa, porém ela não calcula o digito verificador, nem testa o CNPJ, não faz nenhuma validação sobre essa integridade e veracidade dos dados.
Citação:.:
:
...obg a todos do forum pelas preciosas dicas fornecidas..
.
.
.
O objetivo desse codigo seria poder verificar a integridade de um arquivo xml recebido.
A validação feita através da função ValidarXML, não testa a integridade, nem a validade da NFE já processada.
Essa função tem por objetivo, validar apenas os XMLs assinados e se todas as tags necessárias estão na sequencia correta na montagem do xml, bem como se o conteúdo/tamanho dos campos estão sendo preenchidos corretamente(tipo de dados e tamanho).
Por exemplo :
O campo nChave deve ter OBRIGATORIAMENTE tamanho = 44 e conter somente numeros.
Esta é a validação que a função executa, porém ela não calcula o digito verificador, nem testa o CNPJ, não faz nenhuma validação sobre essa integridade e veracidade dos dados.
Tentando entender:
- o arquivo xml montado e assinado antes de ser autorizado é diferente do arquivo xml já autorizado. Observei que algumas tags mudam de nome. Nesse caso, se eu desejasse validar o schema do arquivo xml já autorizado seria apenas uma questão de indicar um outro layout xsd???? se sim qual seria???
Ex: só assinado
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô]?>
-<[txt-color=#e80000]enviNFe[/txt-color] versao=[Ô]2.00[Ô] xmlns=[Ô]http://www.portalfiscal.inf.br/nfe:inviNFe[Ô]><idLote>000000000000187</idLote>-<NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>-<infNFe ....
Ex: autorizado
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô]?>
-<[txt-color=#e80000]nfeProc[/txt-color] xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] versao=[Ô]2.00[Ô]>-<NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>-<infNFe versao=[Ô]2.00[Ô] ....
Os Schemas de validação são somente para validar os xmls antes de enviar.
Citação:Tentando entender:
- o arquivo xml montado e assinado antes de ser autorizado é diferente do arquivo xml já autorizado. Observei que algumas tags mudam de nome. Nesse caso, se eu desejasse validar o schema do arquivo xml já autorizado seria apenas uma questão de indicar um outro layout xsd???? se sim qual seria???
Ex: só assinado
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô]?>
-<enviNFe versao=[Ô]2.00[Ô] xmlns=[Ô]http://www.portalfiscal.inf.br/nfe:inviNFe[Ô]><idLote>000000000000187</idLote>-<NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>-<infNFe ....
Ex: autorizado
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô]?>
-<nfeProc xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] versao=[Ô]2.00[Ô]>-<NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>-<infNFe versao=[Ô]2.00[Ô] ....
Você deve utilizar os EVENTOS da NFe para esta questão.
obrigado
Citação::
DPCI, o que vc está tentando fazer é verificar a veracidade de uma NFE.
Os Schemas de validação são somente para validar os xmls antes de enviar.
Tentando entender:
- o arquivo xml montado e assinado antes de ser autorizado é diferente do arquivo xml já autorizado. Observei que algumas tags mudam de nome. Nesse caso, se eu desejasse validar o schema do arquivo xml já autorizado seria apenas uma questão de indicar um outro layout xsd???? se sim qual seria???
Ex: só assinado
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô]?>
-<enviNFe versao=[Ô]2.00[Ô] xmlns=[Ô]http://www.portalfiscal.inf.br/nfe:inviNFe[Ô]><idLote>000000000000187</idLote>-<NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>-<infNFe ....
Ex: autorizado
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô]?>
-<nfeProc xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] versao=[Ô]2.00[Ô]>-<NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>-<infNFe versao=[Ô]2.00[Ô] ....
Você deve utilizar os EVENTOS da NFe para esta questão.
é isso mesmo foxman, valeu pela dica...
Então os eventos no projeto são aqueles das classes do webservice (tipo NFeConsulta2). Notei que as classes dali tem a mesma estrutura variando os endereços do wsdl.
Gostaria de saber se tem como consultar uma NF-e já autorizada, através da leitura do arquivo xml, usando um evento... E se existir se só preciso montar uma nova classe no webservice com aquela estrutura e colocar nela os wsdl???
eu sei q tem para xml mas para txt eu nunca vi!!
alguem conhece ou pode me endicar!! ou dar o caminho para a luzzz srrss
valeuu obrigado...
No projeto NF-e tenho a função que seleciona e ou confirma o certificado:
Public Function SelecionarCertificado(ByVal CerSerie As String) As X509Certificate2
Dim certificate As New X509Certificate2
Try
Dim certificatesSel As X509Certificate2Collection
Dim store As New X509Store([Ô]MY[Ô], StoreLocation.CurrentUser)
store.Open(OpenFlags.OpenExistingOnly)
Dim certificates As X509Certificate2Collection = store.Certificates.Find(X509FindType.FindByTimeValid, DateTime.Now, True).Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.DigitalSignature, True)
If (CerSerie = [Ô][Ô]) Then
certificatesSel = X509Certificate2UI.SelectFromCollection(certificates, [Ô]Certificados Digitais[Ô], [Ô]Selecione o Certificado Digital para uso no aplicativo[Ô], X509SelectionFlag.SingleSelection)
If (certificatesSel.Count = 0) Then
certificate.Reset()
Throw New Exception([Ô]Nenhum Certificado Digital Foi Selecionado ou o Certificado Selecionado Está Com Problemas.[Ô])
Else
certificate = certificatesSel.Item(0)
End If
Else
certificatesSel = certificates.Find(X509FindType.FindBySerialNumber, CerSerie, True)
If (certificatesSel.Count = 0) Then
certificate.Reset()
Throw New Exception([Ô]Certificado Digital Não Encontrado[Ô])
Else
certificate = certificatesSel.Item(0)
End If
End If
store.Close()
Return certificate
Catch exception As Exception
Throw New Exception(exception.Message)
Return certificate
End Try
End Function