Olá, Pessoal!
O código abaixo faz a geração de dados para a MATRIZ DE TRIBUTAÇÃO DO IMPORTADOR, novo serviço disponível no site da Sefaz de alguns estados brasileiros.
Este código-fonte está em VISUAL STUDIO 2012 para VB.NET e já dá uma idéia de como gerar o XML para atender aos requesitos da Sefaz.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Catch ex As Exception
End Try
Dim Ano As String = ""
Dim Mes As String = ""
Dim Dia As String = ""
Dim sDataIni As String = Now
Dim myConnectionMatrix As MySqlConnection
Dim myCommand2IM As MySqlCommand
Dim dsR As MySqlDataReader
Ano = Trim(Replace(Mid(sDataIni, 7, 4), "/", ""))
Mes = Trim(Replace(Mid(sDataIni, 4, 2), "/", ""))
Dia = Trim(Replace(Mid(sDataIni, 1, 2), "/", ""))
sInicio = Ano + "-" + Mes + "-" + Dia
sTimes = CStr(Now)
sHora = Mid(sTimes, 12, 8)
Dim sDataGeracao As String = Ano + "-" + Mes + "-" + Dia + " " + sHora
myConnectionMatrix = New MySqlConnection("server=192.168.40.65; user id=root; password=3007722108; database=orca; pooling=false;")
myConnectionMatrix.Open()
Dim myCommandsEQ As MySqlCommand
Dim sSequencia As String = ""
sSQL = "SELECT ifnull(count(sequencial),0) FROM GERARXML"
myCommandsEQ = New MySqlCommand(sSQL, myConnectionMatrix)
dsR = myCommandsEQ.ExecuteReader
If dsR.Read() Then
sSequencia = dsR(0)
End If
dsR.Close()
sSequencia = sSequencia + 1
'If Len(sSequencia) = 1 Then
' sNumeroMatrizDi = "0000000000000" + sSequencia
' ElseIf Len(sSequencia) = 2 Then
'sNumeroMatrizDi = "000000000000" + sSequencia
'ElseIf Len(sSequencia) = 3 Then
'sNumeroMatrizDi = "00000000000" + sSequencia
'ElseIf Len(sSequencia) = 4 Then
'sNumeroMatrizDi = "0000000000" + sSequencia
'End If
'Gerar sequencial da XML
sSQL = "INSERT INTO GERARXML VALUES(" & CInt(sSequencia) & ",'" & sDataGeracao & "','" & sNumeroMatrizDi & "')"
'Pega os valores das data definidas dentro da tabela padrão
myCommand2IM = New MySqlCommand(sSQL, myConnectionMatrix)
dsR = myCommand2IM.ExecuteReader
dsR.Close()
'Ler os dados
sSQL = "SELECT * FROM matriztrib WHERE DATAREGISTRO = '" & sInicio & "' ORDER BY CODPROD"
'Pega os valores das data definidas dentro da tabela padrão
myCommand2IM = New MySqlCommand(sSQL, myConnectionMatrix)
dsR = myCommand2IM.ExecuteReader
Dim sInicioBenf As String = ""
Dim sFimBenef As String = ""
Dim sImportador As String = ""
'Gerar o XML de cada item
'Abre o Arquivo para Criação do XML
'----------------------------------
'sNumeroMatrizDi = sNumeroMatrizDi + 1
'Cabeçalho do Arquivo
'--------------------
Dim sData As String = CStr(Now)
Ano = Trim(Replace(Mid(sData, 7, 4), "/", ""))
Mes = Trim(Replace(Mid(sData, 4, 2), "/", ""))
Dia = Trim(Replace(Mid(sData, 1, 2), "/", ""))
sArquivo = "MatrizDI_" + sNumeroMatrizDi + "_" + DateTime.Now.ToString("ddMMyy") + "_" + DateTime.Now.ToString("hhmmss") + ".xml"
Dim arq As New StreamWriter("C:\Temp\" + sArquivo, False)
'arq.WriteLine("" & "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "??>")
arq.WriteLine("<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "??>")
arq.WriteLine("<enviMatrizDIe xmlns=" & Chr(34) & "http://www.sefaz.am.gov.br/die" & Chr(34) & " xmlns:xsi=" & Chr(34) & "http://www.w3.org/2001/XMLSchema-instance" & Chr(34) & " versao=" & Chr(34) & "1.00" & Chr(34) & " xsi:schemaLocation=" & Chr(34) & "http://www.sefaz.am.gov.br/die enviGabaritoDIe_v1.00.xsd" & Chr(34) & "?>")
arq.WriteLine("<MatrizDIe?>")
arq.WriteLine("<InfMatrizDIe Id=" & Chr(34) & "MatrizDIe" & sNumeroMatrizDi & Chr(34) & " versao=" & Chr(34) & "1.00" & Chr(34) & "?>")
arq.WriteLine("<Importador?>")
If dsR.Read Then
sImportador = dsR(0)
sImportador = Replace(sImportador, ".", "")
sImportador = Replace(sImportador, "-", "")
arq.WriteLine("<tipoImportador?>" & dsR(1) & "</tipoImportador?>")
arq.WriteLine("<cdImportador?>" & sImportador & "</cdImportador?>")
End If
dsR.Close()
arq.WriteLine("</Importador?>")
myCommand2IM = New MySqlCommand(sSQL, myConnectionMatrix)
dsR = myCommand2IM.ExecuteReader
While dsR.Read
arq.WriteLine("<ItemMatriz?>")
arq.WriteLine("<cdNcmProdFinal?>" & dsR(2) & "</cdNcmProdFinal?>")
arq.WriteLine("<cdSuframa?>" & dsR(3) & "</cdSuframa?>")
arq.WriteLine("<cdDestinacao?>" & dsR(4) & "</cdDestinacao?>")
arq.WriteLine("<cdUtilizacao?>" & dsR(5) & "</cdUtilizacao?>")
arq.WriteLine("<cdTributacao?>" & dsR(6) & "</cdTributacao?>")
arq.WriteLine("<numDecreto?>" & Replace(dsR(7), "/", "") & "</numDecreto?>")
arq.WriteLine("<tpDocumentoConcessivo?>" & "1" & "</tpDocumentoConcessivo?>")
arq.WriteLine("<numDocumentoConcessivo?>" & Replace(dsR(8), "/", "") & "</numDocumentoConcessivo?>")
sInicioBenf = dsR(9)
Ano = Trim(Replace(Mid(sInicioBenf, 7, 4), "/", ""))
Mes = Trim(Replace(Mid(sInicioBenf, 4, 2), "/", ""))
Dia = Trim(Replace(Mid(sInicioBenf, 1, 2), "/", ""))
sInicioBenf = Ano + Mes + Dia
arq.WriteLine("<dtInicioBeneficio?>" & sInicioBenf & "</dtInicioBeneficio?>")
sFimBenef = dsR(10)
Ano = Trim(Replace(Mid(sFimBenef, 7, 4), "/", ""))
Mes = Trim(Replace(Mid(sFimBenef, 4, 2), "/", ""))
Dia = Trim(Replace(Mid(sFimBenef, 1, 2), "/", ""))
sFimBenef = Ano + Mes + Dia
arq.WriteLine("<dtFimBeneficio?>" & sFimBenef & "</dtFimBeneficio?>")
arq.WriteLine("</ItemMatriz?>")
End While
arq.WriteLine("</InfMatrizDIe?>")
arq.WriteLine("</MatrizDIe?>")
arq.WriteLine("</enviMatrizDIe?>")
dsR.Close()
arq.Close()
' Create an XML document instance and load the XML data.
Dim doc As XmlDocument = New XmlDocument()
' This code assumes that the XML file is in the same folder.
doc.Load("C:\Temp\" + sArquivo)
' Save the XML to a file.
doc.Save("C:\Temp\" + sArquivo)
MsgBox("Arquivo XML criado com sucesso", MsgBoxStyle.Information, "Matriz Trubutação")
End Sub
Pontosa observar:
1. A notação "?>" ou "??>" no final de cada tag deve ser substituída por ">" ou "/>" conforme o caso. Trata-se do editor de textos do blog que infelizmente foge ao meu controle!
2. A notação "&" é o "é comercial" necessário para separar campos no VB.NET;
3. o campo Id (MatrizDIe) é a identificação da matriz, e o número que o segue deve,
para facilitar, referir-se à inscrição da empresa no Cadastro de Contribuintes do Estado com 14 casas, ou seja, a informação é numérica e o comprimento da informação é
de 14 dígitos. Alguns estão colocando aqui um contador, mas este não é o procedimento
correto.
4. Aqui transformamos o arquivo-texto criado em um documento XML propriamente dito:
' Create an XML document instance and load the XML data.
Dim doc As XmlDocument = New XmlDocument()
' This code assumes that the XML file is in the same folder.
doc.Load("C:\Temp\" + sArquivo)
No momento em que doc.Load é realizado o arquivo XML é verificado em relação ao arquivo XSD carregado inicialmente - linha que contêm o http://www.w3.org/2001/XMLSchema-instance.
Você pode acrescentar aqui um comando Try para indicar os erros dos arquivos XML que está gerando.
' Save the XML to a file.
doc.Save("C:\Temp\" + sArquivo)
Após o salvamento o arquivo XML está pronto para ser assinado. A assinatura pode ser realizada com um certificado digital do Serasa e vocês podem utilizar o mesmo código-fonte que postei aqui para realizar a assinatura deste documento.
Segue um bom site que fala um pouco sobre assinaturas digitais:
http://inginheiiro.wikidot.com/
Segue um bom site que fala um pouco sobre assinaturas digitais:
http://inginheiiro.wikidot.com/
Sucesso a todos em 2014!