  
Dim CodAtiv

' Codigo de ativação
CodAtiv = "123123123"

rem ***********************************************************************************************
rem ***********************************************************************************************

Dim LOG
Const ForReading=1, ForWriting=2, ForAppending=8

rem ***********************************************************************************************
rem ***********************************************************************************************
rem *******************************  Gravar Log do aplicativo *************************************
Function GravarLog (linha1, linha2, linha3, pula)
arquivo = "c:\sweda\SATscript-log-vb.txt"    
dim hand    
dim lin1, lin2
Set hand = LOG.OpenTextFile(arquivo, ForAppending, True)
lin1 = CStr(linha1)
lin2 = CStr(linha2)  
lin3 = CStr(linha3)
Dim linha
linha = lin1 & lin2 & lin3
If pula then 
   linha = linha & vbCrLf
 End If   
hand.Write (linha)
hand.Close
End Function
rem ******************************************** FIM **********************************************
rem ***********************************************************************************************
rem ***********************************************************************************************
rem ***********************************************************************************************


rem ***********************************************************************************************
rem ***********************************************************************************************
rem **************************** Incrementa número da sessão **************************************
rem Exemplo:  LPad(12345, 7, "0")
rem 0012345
Function LPad(s, l, c)
  Dim n : n = 0
  Dim r
  If l > Len(s) Then 
      n = l - Len(s)
      r = String(n, c) & s
  else
      r = ""   
  End If
  If Len(r) = 0 OR r = "000000" OR r = "999999" Then
      r = "000001" 
  End If
  LPad = r
End Function

rem ***********************************************************************************************
rem ***********************************************************************************************
rem ***********************************************************************************************
rem ***********************************************************************************************

Set LOG = CreateObject("Scripting.FileSystemObject")
Set CONSOLE = CreateObject ("Scripting.FileSystemObject")
Set stdout = CONSOLE.GetStandardStream (1)

If LOG.FolderExists ("\SWEDA") = False Then
   LOG.CreateFolder ("\SWEDA")
End If

' Chama dll SWEDA
rem -----------------------------------------------------------------------------------------------
set SATsw = CreateObject("SATscript.DLL.object")
rem -----------------------------------------------------------------------------------------------

call GravarLog ("inicio do log", "", "", True)

stdout.WriteLine "Iniciando Comunicacao com o SAT"

Dim nSessao, Fim, Args, resto
Dim XML, handxml, dados
Dim Caixa, PosIniXml, PosFimXml
Dim CnpjSwHouse
Dim SignSwHouse
Dim c_nSessao, sessaorx, erro, retorno, retorno_venda
Dim nn, PosIni, PosFim
Dim MErro
Dim CSefaz
Dim MSefaz
Dim timestamp
Dim Id
Dim total
Dim CPF, CNPJ, Codigo
Dim DadosCanc
Dim Doc

nSessao = "000000"

rem *************************** Consulta entre AC e Equipamento SAT *****************************************
rem Esta função é usada para testes de comunicação entre o AC e o Equipamento SAT

stdout.WriteLine "Consultando o SAT... ConsultarSAT()"

nSessao = LPad(nSessao + 1, 6, "0")

'arg1 = Número aleatório gerado pelo AC para controle da comunicação.
call GravarLog ("ConsultarSAT (", nSessao, ")", True)

rem ****************************************************************************************************    
retorno = SATsw.ConsultarSAT (nSessao)
rem ****************************************************************************************************    

call GravarLog ("retorno ConsultarSAT = ",retorno,"",True)

rem *************************** Consulta do Status Operacional do Equipamento SAT ***************************
rem Essa função é responsável por verificar a situação de funcionamento do Equipamento SAT.

'arg1 = Número aleatório gerado pelo AC para controle da comunicação.
'arg2 = Senha definida pelo contribuinte no software de ativação.

stdout.WriteLine "Consultando o SAT... ConsultarStatusOperacional()"

nSessao = LPad(nSessao + 1, 6, "0")

args = nSessao & "," & CodAtiv
call GravarLog ("ConsultarStatusOperacional (", args, ")", true)

rem ****************************************************************************************************    
retorno = SATsw.ConsultarStatusOperacional (nSessao, CodAtiv) 
rem ****************************************************************************************************    

call GravarLog ("retorno ConsultarStatusOperacional = ",retorno, "", True)

rem arqxml = "arquivo_dados.xml"
rem arqxml = "arquivo_dados498.xml"
arqxml = "dados_cfop5656.xml"

' Leitura do arquivo conteúdo ANSI
Set XML = CreateObject("Scripting.FileSystemObject")
dim sScriptDir
sScriptDir = XML.GetParentFolderName(WScript.ScriptFullName)
Wscript.Echo "Diretorio do aplicativo = " & sScriptDir

Set handxml = XML.OpenTextFile(arqxml, ForReading)
If handxml.AtEndOfStream <> True then
   dados = handxml.ReadAll
End If
handxml.Close

rem Obtem o número do caixa da venda
PosIniXml = InStr(1,dados,"<numeroCaixa>")
if PosIniXml <> 0 Then
   PosIniXml = PosIniXml + 13 
   PosFimXml = InStr(PosIniXml,dados,"</numeroCaixa>")
   If PosFimXml <> 0 Then
     Caixa = Mid (dados, PosIniXml, PosFimXml - PosIniXml)
   End If  
End If
call GravarLog ("Número do Caixa = ", Caixa, "", true)

rem Obtem o CNPJ da software house

PosIniXml = InStr(1,dados,"<CNPJ>")
if PosIniXml <> 0 Then
   PosIniXml = PosIniXml + 6 
   PosFimXml = InStr(PosIniXml,dados,"</CNPJ>")
   If PosFimXml <> 0 Then
     CnpjSwHouse = Mid (dados, PosIniXml, PosFimXml - PosIniXml)
   End If  
End If
call GravarLog ("CNPJ da Software House = ", CnpjSwHouse, "", true)

rem Obtem a assinatura da Software House

PosIniXml = InStr(1,dados,"<signAC>")
if PosIniXml <> 0 Then
   PosIniXml = PosIniXml + 8 
   PosFimXml = InStr(PosIniXml,dados,"</signAC>")
   If PosFimXml <> 0 Then
      SignSwHouse  = Mid (dados, PosIniXml, PosFimXml - PosIniXml)
   End If  
End If
call GravarLog ("signAC Software House = ", SignSwHouse, "", true)

Id = "CFe35160453485215000106599000078290000105297327"
CPF = "08457238710"


rem *********************************************************************************************************
rem **************************** Cancelamento de venda ******************************************************

stdout.WriteLine "******* Cancelando a VENDA..."
stdout.WriteLine "CancelarUltimaVenda()"

DadosCanc = "<CFeCanc>" 
DadosCanc = DadosCanc & "<infCFe chCanc=" & chr(34) & Id & chr(34) & ">"
DadosCanc = DadosCanc & "<ide>" 
DadosCanc = DadosCanc & "<CNPJ>" & CnpjSwHouse & "</CNPJ>"
DadosCanc = DadosCanc & "<signAC>" & SignSwHouse & "</signAC>"
DadosCanc = DadosCanc & "<numeroCaixa>" & Caixa & "</numeroCaixa>"
DadosCanc = DadosCanc & "</ide>"
DadosCanc = DadosCanc & "<emit></emit>"
DadosCanc = DadosCanc & "<dest>"
If Len(CNPJ) > 0 then
   DadosCanc = DadosCanc & "<CNPJ>" & CNPJ & "</CNPJ>"
ElseIf Len (CPF) > 0 then  
      DadosCanc = DadosCanc & "<CPF>"  & CPF & "</CPF>"    
End If   
DadosCanc = DadosCanc &  "</dest>" 
DadosCanc = DadosCanc &  "<total></total>" 
DadosCanc = DadosCanc &  "<infAdic></infAdic>"
DadosCanc = DadosCanc &  "</infCFe>" 
DadosCanc = DadosCanc &  "</CFeCanc>"

For i=1 to 3 Step 1
    If Len(Id) = 0 Then
        exit For
    End If    
    nSessao = LPad(nSessao + 1, 6, "0")
    c_nSessao = nSessao
    args = nSessao & "," & CodAtiv & "," & Id & DadosCanc
    call GravarLog ("CancelarUltimaVenda (", args, ")", true)   
rem ****************************************************************************************************    
    retorno = SATsw.CancelarUltimaVenda (nSessao, CodAtiv, Id, DadosCanc) 
rem ****************************************************************************************************        
    call GravarLog ("retorno CancelarUltimaVenda = ",retorno, "", True)

    stdout.WriteLine retorno

    retorno_venda = retorno

rem [[[[[[[[[ O registro retornado pelo SAT está gravado em UTF-8 no arquivo c:\SWEDA\RETORNO.TXT ]]]]]]]]]
rem [[[[[[[[[ O string <retorno> retorna TAMBÉM os campos (menos o CANC VENDA), mas em UNICODE.   ]]]]]]]]]
rem [[[[[[[[[ O canc.venda não é retornado em string <retorno> porque se for muito grande pode    ]]]]]]]]]
rem [[[[[[[[[ gerar ERRO RUN TIME,("ESPAÇO INSUFICIENTE DE ARMAZENAMENTO PARA PROCESSAR ESTE COMANDO").]]]]]]]]] 
rem [[[[[[[[[ Se conteúdo for inválido ou sem respota, string <retorno> será vazio                ]]]]]]]]]
rem [[[[[[[[[ O CFe recebido em base64 foi decodificado e gravado em UTF-8 em c:\SWEDA\CFeCanc.xml ]]]]]]]]]
rem [[[[[[[[[ Aplicativo deve renomear arquivo com prefixo "AC" + chave de consulta e extensão 'xml' ]]]]]]]]]
rem [[[[[[[[[ Exemplo:  ADC35160153485215000106599000016520116171179358.xml                       ]]]]]]]]]

If Len(retorno) > 15 Then
   sessaorx = Mid (retorno, 1, 6)
   erro = Mid (retorno, 8, 5)
   if erro = "07000" AND sessaorx = c_nSessao Then
      call GravarLog ("<<< Veio o cancelamento da venda de contingencia!!!!!! >>>", "", "", true)
      stdout.WriteLine "******* VENDA CANCELADA - <<< Veio o cancelamento da venda de contingencia!!!!!! >>>"
   Exit For
   End If
End If

rem Nao veio a venda de contingencia. Ou foi devido à falha de recepção ou a venda não foi recebida no SAT.

rem *************************** Comando de Consulta do número de sessão *************************************
rem O AC poderá verificar se a última sessão requisitada foi processada em caso de não recebimento do retorno 
rem da operação. O equipamento SAT-CF-e retornará exatamente o resultado da sessão consultada.

'arg1 = Número aleatório gerado pelo AC para controle da comunicação.
'arg2 = Senha definida pelo contribuinte no software de ativação.
'arg3 = Número de sessão a ser consultado no SAT-CF-e.
    nSessao = LPad(nSessao + 1, 6, "0")
    args = nSessao & "," & CodAtiv & "," & c_nSessao

    stdout.WriteLine "ConsultarNumeroSessao()"

    call GravarLog ("ConsultarNumeroSessao (", args, ")", true)

rem ****************************************************************************************************        
    retorno = SATsw.ConsultarNumeroSessao (_
                   nSessao,_ 
                   CodAtiv,_ 
                   c_nSessao)
rem ****************************************************************************************************    

    stdout.WriteLine retorno

    call GravarLog ("retorno ConsultarNumeroSessao = ",retorno, "", True)

    if Len(retorno) > 6 Then
       sessaorx = Mid (retorno, 1, 6)
       erro = Mid (retorno, 8, 5)
       if erro = "07000" AND sessaorx =  c_nSessao Then
          call GravarLog ("<<< Cancelamento da Venda contingencia recuperada do SAT via consulta de sessao - OK!!!!!! >>>","","",true)
          stdout.WriteLine "******* VENDA CANCELADA - <<< Cancelamento da Venda contingencia recuperada do SAT via consulta de sessao - OK!!!!!! >>>"
          Exit For
       End If
    End If

' Se continua vindo erro - abandona sem retransmitir para não ter risco de duplicar (ver exceção erro 11003).    
    ' Houve erro (diferente de 4000,5000,6000...    ?
' Se for <secao não existe> assume que SAT não recebeu a venda
    resto = CLng(erro) Mod 1000
    if resto <> 0 AND erro <> "11003" Then
        call GravarLog ("******* FALHA de comunicação com o SAT!","","",True)
        stdout.WriteLine retorno        
        stdout.WriteLine "******* FALHA de comunicacao com o SAT!"

        stdout.WriteLine "<<<<<<< Atraves da funcao ExtrairLog(...) pode ser obtida a causa do erro >>>>>>>"
        call GravarLog ("<<<<<<< Atraves da funcao ExtrairLog(...) pode ser obtida a causa do erro >>>>>>>","","",True)        
        
        retorno_venda = ""
        Exit For
    End If        

' Tenta retransmitir a venda porque SAT não recebeu a venda atual enviada.
   if i <> 3 then
      call GravarLog ("******* Retransmite o cancelamento novamente porque SAT não tinha recebido","","",true)
      retorno_venda = ""
      stdout.WriteLine
  else
      call GravarLog ("******* ERRO - CANCELAMENTO   N A O   ENVIADO!","","",true)
      stdout.WriteLine retorno
      stdout.WriteLine "******* ERRO - CANCELAMENTO   N A O   ENVIADO!"
      retorno_venda = ""
  End If   
Next

MErro = ""
CSefaz = ""
MSefaz = ""
timestamp = ""
Id = ""
Total = ""
CNPJ = ""
CPF = ""

If Len(retorno_venda) > 0 Then
    PosIni = 0
    nn = 1
    Fim = 0
    Do while Fim = 0 AND nn < 12 
        PosIni = PosIni + 1         
        PosFim = InStr(PosIni,retorno_venda,"|")
        if PosFim = 0 Then
           Fim = 1
           PosFim = Len(retorno_venda)
        End If    
        if (PosFim-PosIni) >= 1 Then
           Select Case nn
              Case 4	
                  MErro = Mid (retorno_venda, PosIni, PosFim - PosIni)
              Case 5
                  CSefaz = Mid (retorno_venda, PosIni, PosFim - PosIni)
              Case 6
                  MSefaz = Mid (retorno_venda, PosIni, PosFim - PosIni)
              Case 8
                  timestamp = Mid (retorno_venda, PosIni, PosFim - PosIni)
              Case 9
                  Id = Mid (retorno_venda, PosIni, PosFim - PosIni)
              Case 10	
                  total = Mid (retorno_venda, PosIni, PosFim - PosIni)
              Case 11
                  Codigo = Mid (retorno_venda, PosIni, PosFim - PosIni)
                  if Len(Codigo) > 11 Then
                     CNPJ = Codigo
                  else
                     CPF  = Codigo
                 End If   
          End Select
       End If                
       nn = nn + 1
       PosIni = PosFim
    Loop
call GravarLog ("Mensagem de Erro = ", MErro,"",true)
call GravarLog ("Codigo SEFAZ     = ", CSefaz,"",true)
call GravarLog ("Mensagem SEFAZ   = ", MSefaz,"",true)
call GravarLog ("TIME STAMP       = ", timestamp,"",true)
call GravarLog ("Chave de Consulta= ", Id,"",true)
call GravarLog ("Total            = ", total,"",true)
call GravarLog ("C N P J          = ", CNPJ,"",true)
call GravarLog ("C P F            = ", CPF,"",true)  
End If
 
retorno = SATsw.ImprimeXML_SI300("c:\SWEDA\CFeCanc.xml")
stdout.WriteLine retorno




