sábado, 11 de abril de 2009

NF-E: GERANDO RECIBO DE LOTE EM VB.NET

A seguir é apresentado um pequeno aplicativo gerado em VB.Net 2008 para gerar o pedido de recibo de um lote NF-e enviado a Sefaz. Você deve construir o formulário de acordo com o modelo abaixo apresentado:

Dois Textboxs, três pequenos botões, duas labels e um OpenDialog. A tela gerada deverá ficar como a apresentada abaixo:





Para gerar o código do XML para o pedido de lote, vamos nos aproveitar de um código válido de pedido de lote. Acrescente a seguinte função a seu aplicativo. Ela será chamada quando o botão Pedir Recibo for pressionado, sendo alterada para os dados do arquivo de retorno de lote que você selecionar da pasta retorno:

Function criarDocumentoXML(ByVal Protocolo As String) As XDocument
'Usa o código de um recibo existente como base para a geração
'de um novo arquivo xml de pedido de lote

Return
< ?xml version="1.0" encoding="UTF-8"?>
<consReciNFe xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema" versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<tpamb>2</tpamb>
<nrec>130000000177443</nrec>
</consReciNFe>


Return

End Function






Na cláusula general do formulário acrescente essas duas classes:


Imports System.Xml
Imports System.Xml.Linq




No OpenDialog altere as seguintes propriedades:


Filename: *.xml
InitialDirectory: C:\NF-E\Retorno



Dentro do botão com as reticências (...) acrescente o código de chamada do OpenDialog:



Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

OpenFileDialog1.ShowDialog()
TxtArquivo.Text = OpenFileDialog1.FileName

End Sub




Esse simples código fará a abertura do diretório C:\NF-e\Retorno. Dentro dele, você deverá clicar em um arquivo num-lot de retorno válido. No exemplo da figura foi selecionado o arquivo 13090404672291000115550040000000270000000730-num-lot.xml.



Já deu para perceber o que estamos fazendo?


Vamos selecionar um arquivo num-lot de retorno da NF-e e usar o layout de um arquivo de pedido de lote pré-existente para gerar um novo arquivo de pedido de lote para o arquivo num-lot que selecionarmos.


Para fazer isso, fornecemos o arquivo num-lot. Mas também precisaremos do arquivo de recibo para pegar o número do Protocolo. Usaremos o arquivo num-lot selecionado para pegar o número do recibo constante dentro do mesmo e abrir o arquivo de recibo em sequência dentro do botão Gerar Lote.

O código para o botão Gerar Recibo é apresentado abaixo:



Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim NomeArquivoRecibo As String
Dim Protocolo As String
Dim Status As String
Dim ArquivoLote As String
'Dim CodigoErro As String
Dim Texto As String
' Dim NomeNfe As String
' Dim Tamanho As Integer
Dim Zeros As String

If TxtArquivo.Text = "" Then
MsgBox("Arquivo XML nÆo selecinado!!")
Exit Sub
TxtArquivo.Focus()
End If
Zeros = ""
ArquivoLote = TxtArquivo.Text
Status = ""
Protocolo = ""


'Abrir o arquivo de Status de Retorno
Dim xml As XElement = XElement.Load(ArquivoLote)
Dim elements As IEnumerable(Of XElement) = Xml.Elements()
Texto = xml.Element("NumeroLoteGerado").Value
If Len(Texto) = 1 Then Zeros = "00000000000000"
If Len(Texto) = 2 Then Zeros = "0000000000000"
If Len(Texto) = 3 Then Zeros = "000000000000"
If Len(Texto) = 4 Then Zeros = "00000000000"
NomeArquivoRecibo = "C:\NF-E\Retorno\" + Zeros + Texto + "-rec.xml"

'Abrir arquivo de recibo com os dados do arquivo de lote selecionado
'Dim testeXML As XElement = XElement.Load(NomeArquivoRecibo)
Dim reader As XmlTextReader = New XmlTextReader(NomeArquivoRecibo)
Do While (reader.Read())

Select reader.NodeType
Case XmlNodeType.Element
If reader.Name = "cStat" Then
Status = reader.ReadString
End If
'Obter o n£mero do protocolo
If reader.Name = "nRec" Then
Protocolo = reader.ReadString
End If

End Select
Loop
'Console.ReadLine()
reader.Close()
NomeProtocolo = Protocolo
If (Status <> "103") And (Protocolo = "") Then
MsgBox("Problemas com a Nf-e. Erro de Status: " + Status)
End If

'Gerando o novo arquivo de pedido de recibo
Dim arquivo As String = "C:\NF-E\Envio\" + Protocolo + "-ped-rec.xml"
Dim doc = criarDocumentoXML(Protocolo)
'Salvar o XML gerado
doc.Save(arquivo)


'Abrir agora o arquivo XML criado e inserir o Protocolo encontrado!!
Dim arquivo2 As String = "C:\NF-E\envio\" + Protocolo + "-ped-rec.xml"
Dim xDoc As New XmlDocument : xDoc.Load(arquivo)
'Declara um objeto Lista de Nodes
Dim nodeList As Xml.XmlNodeList
'Obtem todos os nodes para a lista com o nome desejado
nodeList = xDoc.GetElementsByTagName("nRec")
'Faz um la‡o para ler os nodes e alterar o seu conte£do.
For i As Integer = (nodeList.Count - 1) To 0 Step -1
nodeList.Item(i).InnerText = Protocolo
Next
'Salva o Arquivo
xDoc.Save(arquivo2)
LstValida.Text = arquivo2
MsgBox("Arquivo XML gerado com sucesso.")
'Timer1.Enabled = True
'carregaXML()

End Sub




O botão Close irá fechar o formulário chamado. Estou chamando este formulário de um outro:


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

'Fecha o formulário aberto. Altere para o comando END se for necessário sair do aplicativo
Me.Close()


End Sub




Com isso, apresentamos um modo rápido de gerar um pedido de recibo de um arquivo de lote.

Abraços a todos!!

Nenhum comentário:

UM APLICATIVO PARA LEITURA DEVOCIONAL ANUAL DA BIBLIA EM ANDROID

Olá, pessoal!  Este novo projeto foi criado em Visual Studio 2019 em C#.Net com o Xamarin. Já está disponível no Google Play para vocês baix...