sexta-feira, 28 de fevereiro de 2014

GERAR O ARQUIVO XML PARA MATRIZ DE TRIBUTAÇÃO DO IMPORTADOR


  
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/

Sucesso a todos em 2014!


Nenhum comentário:

UM APLICATIVO DE VERSÍCULOS PARA CELULARES ANDROID

Olá, pessoal! Esse projeto foi criado em 2017 e aprimorado agora em 2018. Foi também criado com o Visual Studio 2015 em C#.NET com o Xa...