43
Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 1/10 - Conhecendo a Lógica de Funcionamento Publicado em: 17/10/2005 Antes de iniciarmos a lógica de funcionamento do TEF, vamos verificar quais são os pré-requisitos que precisamos conhecer para a sua implementação: - Aplicativo de Automação Comercial É responsável pela impressão do Cupom Fiscal e do Comprovante da transação TEF. - Gerenciador Padrão É o módulo responsável pelo direcionamento da transação para os respectivos Módulos TEF (American Express, Redecard e Visanet) e efetua o tratamento das atividades, permitindo que o Aplicativo de Automação Comercial interaja com as Administradoras de Cartão de Crédito e de Débito, de forma simples e eficiente. - Módulo TEF É o componente que interage com o usuário para coleta de dados da transação a ser executada. Cada rede possui um Módulo TEF próprio. Comunicação entre o Aplicativo de Automação Comercial e o Gerenciador Padrão - Lógica de Funcionamento A comunicação entre o seu Aplicativo e o Gerenciador Padrão é realizada através de arquivos no formato "texto" com mensagens próprias. Os diretórios utilizados para a troca destes arquivos, são: C:\TEF_DIAL\REQ e C:\TEF_DIAL\RESP (ambos default do Gerenciador Padrão).

TEF Bematech

Embed Size (px)

Citation preview

Page 1: TEF Bematech

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 1/10 - Conhecendo a Lógica de FuncionamentoPublicado em: 17/10/2005

Antes de iniciarmos a lógica de funcionamento do TEF, vamos verificar quais são os pré-requisitos que precisamos conhecer para a sua implementação:

- Aplicativo de Automação Comercial

É responsável pela impressão do Cupom Fiscal e do Comprovante da transação TEF.

- Gerenciador Padrão

É o módulo responsável pelo direcionamento da transação para os respectivos Módulos TEF (American Express, Redecard e Visanet) e efetua o tratamento das atividades, permitindo que o Aplicativo de Automação Comercial interaja com as Administradoras de Cartão de Crédito e de Débito, de forma simples e eficiente.

- Módulo TEF

É o componente que interage com o usuário para coleta de dados da transação a ser executada. Cada rede possui um Módulo TEF próprio.

Comunicação entre o Aplicativo de Automação Comercial e o Gerenciador Padrão - Lógica de Funcionamento

A comunicação entre o seu Aplicativo e o Gerenciador Padrão é realizada através de arquivos no formato "texto" com mensagens próprias. Os diretórios utilizados para a troca destes arquivos, são: C:\TEF_DIAL\REQ e C:\TEF_DIAL\RESP (ambos default do Gerenciador Padrão).

O seu Aplicativo criará o arquivo INTPOS.001 solicitando a realização da transação TEF e enviará para o diretório C:\TEF_DIAL\REQ. Este diretório é usado pelo seu Aplicação para envio de dados ao Gerenciador Padrão.

Page 2: TEF Bematech

Os dados de resposta do Gerenciador Padrão, após o processamento da transação pelo Módulo TEF (American Express, Redecard ou Visanet), serão enviados para o diretório C:\TEF_DIAL\RESP. Este diretório é usado pelo seu Aplicativo para receber as respostas do Gerenciador Padrão.

O seu Aplicativo, após ter enviado o INTPOS.001 para o Gerenciador Padrão (C:\TEF_DIAL\REQ), deverá aguardar por 7 segundos o recebimento do arquivo INTPOS.STS enviado pelo Gerenciador Padrão (C:\TEF_DIAL\RESP). Esse processo significa que o Gerenciador Padrão recebeu o INTPOS.001 com a solicitação da transação TEF, enviado pelo seu Aplicativo. Caso o Gerenciador Padrão não disponibilize este arquivo no tempo previsto, você poderá informar ao operador que houve algum problema, como por exemplo: "O Gerenciador se encontra desativado, favor verificar!".

Após o envio do INTPOS.STS, o Gerenciador Padrão irá exibir a tela com os Módulos TEF disponíveis para a escolha.

O seu Aplicativo deverá aguardar o arquivo INTPOS.001 com o resultado da transação. Este arquivo será gerado no diretório C:\TEF_DIAL\RESP.

Após seu Aplicativo realizar a impressão do comprovante TEF, deverá ser enviado um arquivo INTPOS.001, ao Gerenciador Padrão (C:\TEF_DIAL\REQ), confirmando ou não esta transação.

Após este envio, o Gerenciador Padrão responderá um INTPOS.STS (C:\TEF_DIAL\RESP), confirmando este procedimento.

Sequência de execução do TEF

Page 3: TEF Bematech

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 2/10 - Comunicando com o Gerenciador PadrãoPublicado em: 17/10/2005

Vimos no artigo passado, a lógica de funcionamento do TEF. Agora vamos "colocar a mão na massa" e começar a desenvolver as nossas rotinas!

Nesta edição, iremos realizar a primeira comunicação com o Gerenciador Padrão e tratar todos os retornos e mensagens possíveis. Estaremos visualizando esta rotina em dois exemplos básicos. Um desenvolvido em Delphi e outro em Visual Basic .

A idéia é verificarmos se o Gerenciador Padrão está ativo, antes de iniciarmos uma transação TEF.

- Exemplo em Visual Basic

' Declaração da função Sleep (API kernel32) Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

' ' Esta função verifica se o Gerenciador Padrão está Ativo. ' Function VerificaGerenciadorPadrao()     Dim cArquivo As String     Dim cConteudoArquivo As String     Dim cIdentificacao As String     Dim iTentativas As Integer     Open App.Path & "\INTPOS.001" For Binary As #1     cIdentificacao = Time()     cConteudoArquivo = ""     cConteudoArquivo = "000-000 = ATV" + Chr(13) + Chr(10) + _                       "001-000 = " + Format(cIdentificacao, "hhmmss") + _                                   Chr(13) + Chr(10) + _                       "999-999 = 0"     Put #1, , cConteudoArquivo     Close #1     FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"     Kill App.Path & "\INTPOS.001"     iTentativas = 1     For iTentativas = 1 To 7        cArquivoATIVO = Dir("C:\TEF_DIAL\RESP\ATIVO.001")        cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")        If cArquivoATIVO <> "" Or cArquivoSTS <> "" Then           MsgBox "O Gerencial Padrão se encontra ATIVO !", vbInformation + _                   vbOKOnly, "Atenção"           iTentativas = 8        End If        Sleep (1000)        If iTentativas = 7 Then           MsgBox "O Gerencial Padrão se encontra INATIVO !", vbInformation + _                   vbOKOnly, "Atenção"           iTentativas = 8        End If     Next

Page 4: TEF Bematech

End FunctionBematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 3/10 - Realizando uma venda com transação TEFPublicado em: 17/10/2005

No artigo passado, iniciamos a nossa primeira comunicação com o Gerenciador Padrão, através de uma função onde era verificado se o mesmo estava ativo, antes de uma transação TEF. Nesta edição, iremos fazer a nossa primeira venda de cupom fiscal, com pagamento em cartão e realizar a transação TEF. No código abaixo, estaremos utilizando as funções de impressão do cupom fiscal, tratando o retorno da impressora e realizando a solicitação da transação TEF, com impressão do comprovante. As funções utilizadas, neste código, são:

- Bematech_FI_AbreCupom- Bematech_FI_VendeItem- Bematech_FI_IniciaFechamentoCupom- Bematech_FI_EfetuaFormaPagamento- Bematech_FI_TerminaFechamentoCupom

Estas funções serão usadas para a impressão do cupom fiscal.

- Bematech_FI_AbreComprovanteNaoFiscalVinculado- Bematech_FI_UsaComprovanteNaoFiscalVinculado- Bematech_FI_FechaComprovanteNaoFiscalVinculado

Estas funções serão usadas para a impressão do comprovante da transação TEF.

- Bematech_FI_IniciaModoTEF- Bematech_FI_FinalizaModoTEF

Estas funções serão usadas para o bloqueio e desbloqueio do teclado e mouse.

Também serão usadas funções extras, definidas como:

- VerificaRetornoFuncaoImpressora- RealizaTransacao- ImprimeTransacao

Neste código, estaremos realizando a impressão do cupom fiscal completo com uma transação TEF, mas não estaremos ainda, verificando o tratamento de queda de energia e confirmando a transação.

Estaremos visualizando este código em dois exemplos básicos. Um desenvolvido em Delphi e outro em Visual Basic.

Page 5: TEF Bematech

- Exemplo em Visual Basic ' Declaração da função Sleep (API kernel32) Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub cmdVendaTEF_Click()     Dim cIdentificacao As String, cNumeroCupom As String, cValorPago As String     Dim cFormaPGTO As String     ' Abre Cupom Fiscal, Vende o Item e Fecha Cupom Fiscal     iRetorno = Bematech_FI_AbreCupom("")     If (VerificaRetornoFuncaoImpressora(iRetorno)) Then        iRetorno = Bematech_FI_VendeItem("1234567890123", _           "Teste de Venda de Item...", "II", "I", "1", 2, "1,00", "%", "00,00")        If (VerificaRetornoFuncaoImpressora(iRetorno)) Then           iRetorno = Bematech_FI_IniciaFechamentoCupom("A", "%", "00,00")           If (VerificaRetornoFuncaoImpressora(iRetorno)) Then              cFormaPGTO = "Cartao Credito"              cValorPago = "100"              cNumeroCupom = Space(6)              iRetorno = Bematech_FI_NumeroCupom(cNumeroCupom)              VerificaRetornoFuncaoImpressora (iRetorno)              cIdentificacao = Time()              iTEF = RealizaTransacao(cIdentificacao, cNumeroCupom, cValorPago)              If (iTEF = 1) Then                 iRetorno = Bematech_FI_EfetuaFormaPagamento(cFormaPGTO, cValorPago)                 If (VerificaRetornoFuncaoImpressora(iRetorno)) Then                    cMSGPromocional = "Obrigado, volte sempre !!!"                    iRetorno = Bematech_FI_TerminaFechamentoCupom(cMSGPromocional)                    VerificaRetornoFuncaoImpressora (iRetorno)                    iTemp = ImprimeTransacao(cFormaPGTO, cValorPago, cNumeroCupom, _                       cIdentificacao)                 End If              End If              If (iTEF = -1) Then                 MsgBox "Gerencial Padrão não está ativo !", vbOKOnly + _                    vbInformation, "Atenção"              End If              ' Se a transação não for aprovada, deve-se permitir a escolha de outra              ' forma de pagamento. Neste caso, está sendo utilizado "Dinheiro"              ' como exemplo              If (iTEF = -2) Or (iTEF = 0) Then                 cFormaPGTO = "Dinheiro"                 iRetorno = Bematech_FI_EfetuaFormaPagamento(cFormaPGTO, cValorPago)                 If (VerificaRetornoFuncaoImpressora(iRetorno)) Then                    cMSGPromocional = "Obrigado, volte sempre !!!"                    iRetorno = Bematech_FI_TerminaFechamentoCupom(cMSGPromocional)                    VerificaRetornoFuncaoImpressora (iRetorno)                 End If              End If           End If        End If     End If End Sub

' Função: RealizaTransacao

Page 6: TEF Bematech

' Objetivo: Realiza a transação TEF ' Parâmetros: TDateTime para identificar o número da transação '    string para o Número do Cupom Fiscal (COO) '    string para a Valor da Forma de Pagamento ' Retorno: True para OK ou False para não OK Function RealizaTransacao(cIdentificacao As String, cNumeroCupom As String, _     cValorPago As String) As Integer     Dim cConteudoArquivo As String, cLinhaArquivo As String, cLinha As String     Dim iTentativas As Integer, iVezes As Integer     Dim bTransacao As Boolean     cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.STS"     End If     cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.001"     End If     Open App.Path & "\INTPOS.001" For Binary As #1     ' Conteúdo do arquivo INTPOS.001 para solicitar a transação TEF     cConteudoArquivo = ""     cConteudoArquivo = "000-000 = CRT" + Chr(13) + Chr(10) + _        "001-000 = " + Format(cIdentificacao, "hhmmss") + Chr(13) + Chr(10) + _        "002-000 = " + cNumeroCupom + Chr(13) + Chr(10) + _        "003-000 = " + cValorPago + Chr(13) + Chr(10) + _        "999-999 = 0"     Put #1, , cConteudoArquivo     Close #1     FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"     Kill App.Path & "\INTPOS.001"     cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")     If cArquivoTemp <> "" Then        Kill App.Path & "\IMPRIME.TXT"     End If     RealizaTransacao = 1     For iTentativas = 1 To 7        ' Verifica se o Gerenciador Padrão recebeu o INTPOS.001 da solicitação        cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")        If (cArquivoSTS <> "") Then           cLinhaArquivo = ""           cLinha = ""           Do While True              ' Verifica o arquivo INTPOS.001 de resposta              cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")              If (cArquivoINTPOS <> "") Then                 Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1                 Do While Not EOF(1)                    Line Input #1, cLinhaArquivo                    ' Verifica se o campo de identificação é o mesmo do solicitado                    If (Mid(cLinhaArquivo, 1, 3) = "001") And _                       (Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10) <> _                       Format(cIdentificacao, "hhmmss")) Then                       RealizaTransacao = 0                       Exit Do                    End If

Page 7: TEF Bematech

                   ' Verifica se a Transação foi Aprovada                    If (Mid(cLinhaArquivo, 1, 3) = "009") Then                       If (Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)) = "0"                       Then                           bTransacao = True                       End If                       If (Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)) <> "0"                       Then                           bTransacao = False                       End If                    End If                    ' Verifica se existem linhas para serem impressas                    If (Mid(cLinhaArquivo, 1, 3) = "028") Then                       If (Int(Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)) _                       <> 0) And (bTransacao = True) Then                          RealizaTransacao = 1 ' OK                          For iVezes = 1 To Int(Mid(cLinhaArquivo, 11, _                             Len(cLinhaArquivo) - 10))                             Line Input #1, cLinhaArquivo                             ' Verifica se o campo é 029 e armazena as linhas que                             ' serão impressas                             If Mid(cLinhaArquivo, 1, 3) = "029" Then                                cLinha = cLinha + Mid(cLinhaArquivo, 12, _                                Len(cLinhaArquivo) - 12) + Chr(13) + Chr(10)                             End If                          Next                       End If                    End If                    ' Verifica se o campo é o 030 para mostrar a mensagem para o                    ' operador                    If (Mid(cLinhaArquivo, 1, 3) = "030") And (cLinha <> "") Then                       ' Está sendo usado um form para a exibição desta mensagem                       frmMensagem.lblMensagem.Caption = Mid(cLinhaArquivo, 11, _                       Len(cLinhaArquivo) - 10)                       frmMensagem.Show                       frmMensagem.Refresh                       Sleep (5000)                       Unload frmMensagem                       frmPrincipal.Refresh                    End If                    If (Mid(cLinhaArquivo, 1, 3) = "030") And (cLinha = "") Then                       cArquivoINTPOS = Dir("C:\TEF_DIAL\REQ\INTPOS.001")                       If (cArquivoINTPOS <> "") Then                          Kill "C:\TEF_DIAL\REQ\INTPOS.001"                       End If                       MsgBox Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10), _                          vbOKOnly + vbInformation, "Atenção"                       RealizaTransacao = 0                    End If                 Loop                 Exit Do              End If           Loop           iTentativas = 8        End If

Page 8: TEF Bematech

       Sleep (1000)     Next     ' Cria o arquivo temporário IMPRIME.TXT com a imagem do comprovante     If (cLinha <> "") Then        Close #1        Open App.Path & "\IMPRIME.TXT" For Binary As #1        Put #1, , cLinha        Close #1     End If     Sleep (1000)     If (iTentativas = 7) Then        Close #1        RealisaTransacao = -1     End If     If (RealisaTransacao = 0) Or (RealisaTransacao = -2) Then        Close #1     End If End Function

' Função: ImprimeTransacao ' Objetivo: Realiza a impressão da Transação TEF ' Parâmetros: string para a Forma de Pagamento '    string para a Valor da Forma de Pagamento '    string para o Número do Cupom Fiscal (COO) '    TDateTime para identificar o número da transação ' Retorno: True para OK ou False para não OK Function ImprimeTransacao(cFormaPGTO As String, cValorPago As String, _     cCOO As String, cIdentificacao As String) As Integer     Dim cLinhaArquivo As String     Dim cLinha As String     Dim cSaltaLinha As String     Dim cConteudo As String     Dim iVezes As Integer     ' Bloqueia o teclado e o mouse para a impressão do TEF     iRetorno = Bematech_FI_IniciaModoTEF()     cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")     If cArquivoTemp <> "" Then        iRetorno = Bematech_FI_AbreComprovanteNaoFiscalVinculado(cFormaPGTO, _           cValorPago, cCOO)        VerificaRetornoFuncaoImpressora (iRetorno)     End If     Open App.Path & "\IMPRIME.TXT" For Input As #1     cConteudo = ""     cLinha = ""     Do While Not EOF(1)        Line Input #1, cLinha        cConteudo = cConteudo + cLinha + Chr(13) + Chr(10)        iRetorno = Bematech_FI_UsaComprovanteNaoFiscalVinculado(cLinha + Chr(13))        VerificaRetornoFuncaoImpressora (iRetorno)        If EOF(1) Then           cSaltaLinha = Chr(13) + Chr(10) + Chr(13) + Chr(10) + Chr(13) + _              Chr(10) + Chr(13) + Chr(10) + Chr(13) + Chr(10)           iRetorno = Bematech_FI_UsaComprovanteNaoFiscalVinculado(cSaltaLinha)           VerificaRetornoFuncaoImpressora (iRetorno)           ' Está sendo usado um form para a exibição desta mensagem

Page 9: TEF Bematech

          frmMensagem.lblMensagem.Caption = "Por favor, destaque a 1ª Via"           frmMensagem.Show           frmMensagem.Refresh           Sleep (5000)           Unload frmMensagem           frmPrincipal.Refresh           iRetorno = Bematech_FI_UsaComprovanteNaoFiscalVinculado(cConteudo)           VerificaRetornoFuncaoImpressora (iRetorno)        End If     Loop     ' Desbloqeia o teclado e o mouse     iRetorno = Bematech_FI_FinalizaModoTEF()     Close #1     Kill App.Path & "\IMPRIME.TXT"        iRetorno = Bematech_FI_FechaComprovanteNaoFiscalVinculado()     VerificaRetornoFuncaoImpressora (iRetorno) End Function

' Função: VerificaRetornoFuncaoImpressora ' Objetivo: Verificar o retorno da impressora e da função utilizada ' Retorno: True para OK ou False para não OK Function VerificaRetornoFuncaoImpressora(iRetorno As Integer) As Boolean     Dim cMSGErro As String     Dim iACK, ST1, ST2 As Integer     cMSGErro = ""     VerificaRetornoFuncaoImpressora = False     Select Case iRetorno        Case Is = 0           cMSGErro = "Erro de Comunicação !"        Case Is = -1           cMSGErro = "Erro de execução na Função !"        Case Is = -2           cMSGErro = "Parâmetro inválido na Função !"        Case Is = -3           cMSGErro = "Alíquota não Programada !"        Case Is = -4           cMSGErro = "Arquivo BEMAFI32.INI não Encontrado !"        Case Is = -5           cMSGErro = "Erro ao abrir a Porta de Comunicação !"        Case Is = -6           cMSGErro = "Impressora Desligada ou Cabo de Comunicação Desconectado !"        Case Is = -7           cMSGErro = "Código do Banco não encontrado no arquivo BEMAFI32.INI !"        Case Is = -8           cMSGErro = "Erro ao criar ou gravar arquivo STATUS.TXT ou RETORNO.TXT !"

       Case Is = -27           cMSGErro = "Status diferente de 6, 0, 0 !"        Case Is = -30           cMSGErro = "Função incompatível com a impressora fiscal YANCO !"     End Select     If cMSGErro <> "" Then        MsgBox cMSGErro, vbOKOnly + vbInformation, "Atenção"        VerificaRetornoFuncaoImpressora = False     End If

Page 10: TEF Bematech

    cMSGErro = ""     If iRetorno = 1 Then        x = Bematech_FI_RetornoImpressora(iACK, iST1, iST2)        If (iACK = 21) Then           MsgBox "A Impressora retornou NAK !" & Chr(13) & _           "Erro de Protocolo de Comunicação !", vbOKOnly + vbCritical, "Atenção"           VerificaRetornoFuncaoImpressora = False        Else           If (iST1 <> 0) Or (iST2 <> 0) Then              ' Analisa ST1              If (iST1 >= 128) Then                 iST1 = iST1 - 128                    cMSGErro = cMSGErro + "Fim de Papel" + Chr(13)              ElseIf (iST1 >= 64) Then                 iST1 = iST1 - 64                 cMSGErro = cMSGErro + "Pouco Papel" + Chr(13)              ElseIf (iST1 >= 32) Then                 iST1 = iST1 - 32                 cMSGErro = cMSGErro + "Erro no Relógio" + Chr(13)              ElseIf (iST1 >= 16) Then                 iST1 = iST1 - 16                 cMSGErro = cMSGErro + "Impressora em Erro" + Chr(13)              ElseIf (iST1 >= 8) Then                 iST1 = iST1 - 8                 cMSGErro = cMSGErro + "Primeiro Dado do Comando não foi ESC" + _                    Chr(13)              ElseIf iST1 >= 4 Then                 iST1 = iST1 - 4                 cMSGErro = cMSGErro + "Comando Inexistente" + Chr(13)              ElseIf iST1 >= 2 Then                 iST1 = iST1 - 2                 cMSGErro = cMSGErro + "Cupom Fiscal Aberto" + Chr(13)              ElseIf iST1 >= 1 Then                 iST1 = iST1 - 1                 cMSGErro = cMSGErro + "Número de Parâmetros Inválidos" + Chr(13)              End If              ' Analisa ST2              If iST2 >= 128 Then                 iST2 = iST2 - 128                 cMSGErro = cMSGErro + "Tipo de Parâmetro de Comando Inválido" + _                    Chr(13)              ElseIf iST2 >= 64 Then                 iST2 = iST2 - 64                 cMSGErro = cMSGErro + "Memória Fiscal Lotada" + Chr(13)              ElseIf iST2 >= 32 Then                 iST2 = iST2 - 32                 cMSGErro = cMSGErro + "Erro na CMOS" + Chr(13)              ElseIf iST2 >= 16 Then                 iST2 = iST2 - 16                 cMSGErro = cMSGErro + "Alíquota não Programada" + Chr(13)              ElseIf iST2 >= 8 Then                 iST2 = iST2 - 8                 cMSGErro = cMSGErro + "Capacidade de Alíquota Programáveis " + _                    "Lotada" + Chr(13)              ElseIf iST2 >= 4 Then

Page 11: TEF Bematech

                iST2 = iST2 - 4                 cMSGErro = cMSGErro + "Cancelamento não permitido" + Chr(13)              ElseIf iST2 >= 2 Then                 iST2 = iST2 - 2                 cMSGErro = cMSGErro + "CGC/IE do Proprietário não Programados" + _                    Chr(13)              ElseIf iST2 >= 1 Then                 iST2 = iST2 - 1                 cMSGErro = cMSGErro + "Comando não executado" + Chr(13)              ElseIf (cMSGErro <> "") Then                 MsgBox cMSGErro, vbOKOnly + vbCritical, "Atenção"                 VerificaRetornoFuncaoImpressora = False              End If           Else              VerificaRetornoFuncaoImpressora = True           End If        End If     End If End Function

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 4/10 - Confirmando uma transação TEFPublicado em: 18/10/2005

No passo anterior, realizamos uma venda de cupom fiscal com pagamento em cartão e fizemos nossa primeira transação TEF com impressão do comprovante. Agora, precisamos validar esta transação!

Vamos criar duas funções para isso:

- uma para confirmar a transação TEF (ConfirmaTransacao) e; - outra para não confirmar a transação TEF (NaoConfirmaTransacao).

Ou seja, precisamos controlar estes dois processos, pois estaremos enfrentando situações onde a impressora passará por erros de comunicação (desligamentos) ou quedas de energia (veremos isso nas próximas edições).

Estaremos visualizando este código em dois exemplos básicos. Um desenvolvido em Delphi e outro em Visual Basic.

- Exemplo em Visual Basic

' Função: ConfirmaTransacao ' Objetivo: Confirmar a Transação TEF ' Parâmetros: não há ' Retorno: True para OK ou False para não OK Function ConfirmaTransacao() As Boolean     Dim cLinhaArquivo As String     Dim cConteudo As String     cLinhaArquivo = ""     cConteudo = ""     Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1

Page 12: TEF Bematech

    Do While Not EOF(1)        Line Input #1, cLinhaArquivo        If (Mid(cLinhaArquivo, 1, 3) = "001") Or _           (Mid(cLinhaArquivo, 1, 3) = "002") Or _           (Mid(cLinhaArquivo, 1, 3) = "010") Or _           (Mid(cLinhaArquivo, 1, 3) = "012") Or _           (Mid(cLinhaArquivo, 1, 3) = "027") Then              cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "999") Then           cConteudo = cConteudo + cLinhaArquivo        End If     Loop     Close #1     cConteudo = "000-000 = CNF" + Chr(13) + Chr(10) + cConteudo     Open App.Path & "\INTPOS.001" For Binary As #1     Put #1, , cConteudo     Close #1     FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"

    Kill App.Path & "\INTPOS.001"     cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.STS"     End If     cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.001"     End If End Function

' Função: NaoConfirmaTransacao ' Objetivo: Confirmar a Transação TEF ' Parâmetros: não há ' Retorno: True para OK ou False para não OK Function NaoConfirmaTransacao() As Boolean     Dim cLinhaArquivo As String, cConteudo As String     Dim cValor As String, cNomeRede As String, cNSU As String     cLinhaArquivo = ""     cConteudo = ""     Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1     Do While Not EOF(1)        Line Input #1, cLinhaArquivo        If (Mid(cLinhaArquivo, 1, 3) = "001") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "003") Then           cValor = Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "010") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)           cNomeRede = Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "012") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)

Page 13: TEF Bematech

          cNSU = Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "027") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "999") Then           cConteudo = cConteudo + cLinhaArquivo        End If     Loop     Close #1     cConteudo = "000-000 = NCN" + Chr(13) + Chr(10) + cConteudo     Open App.Path & "\INTPOS.001" For Binary As #1     Put #1, , cConteudo     Close #1     FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"

    Kill App.Path & "\INTPOS.001"     cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.STS"     End If     cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.001"     End If     MsgBox "Cancelada a Transação" + Chr(13) + Chr(13) + "Rede: " + _        cNomeRede + Chr(13) + "Doc Nº: " + cNSU + Chr(13) + "Valor: " + _        Format(cValor / 100, "#,##0.00"), vbInformation + vbOKOnly, "Atenção" End Function

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 5/10 - Cancelando uma transação TEF

Publicado em: 19/10/2005

No artigo passado, vimos as rotinas de confirmação (CNF) e não confirmação (NCN) da transação TEF, importantes em toda operação.

Agora, iremos incluir em nosso desenvolvimento, a rotina de cancelamento da transação TEF. Rotina utilizada, geralmente, quando há necessidade de cancelar uma transação já emitida ou após sua confirmação.

Existem duas maneiras de solicitar este cancelamento:

- pelas rotinas administrativas ou;- gerando o arquivo INTPOS.001 com os dados da transação que se deseja cancelar.

Iremos realizar o cancelamento pelo arquivo INTPOS.001 e veremos o cancelamento pelo modo administrativo em outra edição do Flash Tip.

Page 14: TEF Bematech

No código, criaremos a função "CancelaTrancacaoTEF" e as informações da transação serão passadas, através de seus parâmetros.

Não esqueça que a resposta deste cancelamento deverá ser impressa, através do Relatório Gerencial e sua confirmação efetuada.

Estaremos visualizando este código em dois exemplos básicos. Um desenvolvido em Delphi e outro em Visual Basic.

- Exemplo em Visual Basic

.

.

. cNSU = "122807" cValor = "100" ' 1,00 cNomeRede = "AMEX" cNumeroDOC = "547016" cData = "06062005" ' DDMMAAAA cHora = "122807" ' HHMMSS

lRet = CancelaTransacaoTEF(cNSU, cValor, cNomeRede, cNumeroDOC, cData, cHora) ImprimeGerencial . . .

' Função: CancelaTransacaoTEF ' Objetivo: Cancelar uma transação já confirmada ' Parâmetros: String com o número de identificação (NSU) '             String com o valor da transação '             String com o valor da transação '             String com o nome e bandeira (REDE) '             String com o número do documento '             String com a data da transação no formato DDMMAAAA '             String com a hora da transação no formato HHSMMSS ' Retorno: True para OK ou False para não OK Function CancelaTransacaoTEF(cNSU As String, cValor As String, _     cNomeRede As String, cNumeroDOC As String, cData As String, _     cHora As String) As Boolean     Dim cConteudo As String     cConteudo = ""     cConteudo = "000-000 = CNC" + Chr(13) + Chr(10) + _                "001-000 = " + cNSU + Chr(13) + Chr(10) + _                "003-000 = " + cValor + Chr(13) + Chr(10) + _                "010-000 = " + cNomeRede + Chr(13) + Chr(10) + _                "012-000 = " + cNumeroDOC + Chr(13) + Chr(10) + _                "022-000 = " + cData + Chr(13) + Chr(10) + _                "023-000 = " + cHora + Chr(13) + Chr(10) + _                 "999-999 = 0"    Open App.Path & "\INTPOS.001" For Binary As #1    Put #1, , cConteudo

Page 15: TEF Bematech

   Close #1    FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"    Kill App.Path & "\INTPOS.001" End Function

' Função: ImprimeGerencial ' Objetivo: Imprimir através do Relatório Gerencial a transação efetuada. ' Retorno: 1 para OK ou diferente de 1 para não OK Function ImprimeGerencial() As Integer     Dim cConteudo As String, cLinha As String, cSaltaLinha As String, _         cLinhaArquivo As String Dim iTentativas As Integer, _         iVezes As Integer, iImprimeGerencial As Integer     Dim bTransacao As Boolean    cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")    If cArquivoTemp <> "" Then        Kill App.Path & "\IMPRIME.TXT"    End If    iImprimeGerencial = 1    For iTentativas = 1 To 7        cLinhaArquivo = ""        cLinha = ""        Do While True           ' Verifica se o Gerenciador Padrão recebeu o INTPOS.001 da           ' solicitação           cArquivoTemp = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")           If cArquivoTemp <> "" Then              cArquivoTemp = Dir("C:\TEF_DIAL\RESP\INTPOS.001")              If cArquivoTemp <> "" Then                 Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1                 Do While Not EOF(1)                    Line Input #1, cLinhaArquivo                    ' Verifica se a Transação foi Aprovada                    If (Mid(cLinhaArquivo, 1, 3) = "009") Then                       If (Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) _                       - 10)) = "0" Then                          bTransacao = True                       End If                       If (Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)) _                       <> "0" Then                          bTransacao = False                       End If                    End If                    ' Verifica se existem linhas para serem impressas                    If (Mid(cLinhaArquivo, 1, 3) = "028") Then                       If (Int(Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)) _                       <> 0) And (bTransacao = True) Then                          iImprimeGerencial = 1 ' OK                          For iVezes = 1 To Int(Mid(cLinhaArquivo, 11, _                          Len(cLinhaArquivo) - 10))                             Line Input #1, cLinhaArquivo

Page 16: TEF Bematech

                            ' Verifica se o campo é 029 e armazena as linhas                             ' que serão impressas                             If Mid(cLinhaArquivo, 1, 3) = "029" Then                                cLinha = cLinha + Mid(cLinhaArquivo, 12, _                               Len(cLinhaArquivo) - 12) + Chr(13) + Chr(10)                             End If                          Next                       End If                    End If                    ' Verifica se o campo é o 030 para mostrar a mensagem para                    ' o operador                    If (Mid(cLinhaArquivo, 1, 3) = "030") And (cLinha <> "") Then                       ' Está sendo usado um form para a exibição desta mensagem                       frmMensagem.lblMensagem.Caption = Mid(cLinhaArquivo, 11, _                       Len(cLinhaArquivo) - 10)                       frmMensagem.Show                       frmMensagem.Refresh                       Sleep (5000)                       Unload frmMensagem                       frmPrincipal.Refresh                       iImprimeGerencial = 1                    End If                    If (Mid(cLinhaArquivo, 1, 3) = "030") And (cLinha = "") Then                       cArquivoTemp = Dir("C:\TEF_DIAL\REQ\INTPOS.001")                       If cArquivoTemp <> "" Then                          Kill App.Path & "C:\TEF_DIAL\REQ\INTPOS.001"                       End If                       MsgBox Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10), _                          vbInformation + vbOKOnly, "Atenção" iImprimeGerencial = 0                    End If                 Loop                 Exit Do              End If           End If        Loop        iTentativas = 8        Sleep (1000)     Next     ' Cria o arquivo temporário IMPRIME.TXT com a imagem do comprovante     If (cLinha <> "") Then        Close #1        Open App.Path & "\IMPRIME.TXT" For Binary As #1        Put #1, , cLinha        Close #1     End If     Sleep (1000)     If (iTentativas = 7) Then        Close #1        iImprimeGerencial = -1

Page 17: TEF Bematech

    End If     If (iImprimeGerencial = 0) Or (iImprimeGerencial = -2) Then        Close #1        cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")        If (cArquivoSTS <> "") Then           Kill "C:\TEF_DIAL\RESP\INTPOS.STS"        End If        cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")        If (cArquivoSTS <> "") Then           Kill "C:\TEF_DIAL\RESP\INTPOS.001"        End If     End If     ' Bloqueia o teclado e o mouse para a impressão do TEF     iRetorno = Bematech_FI_IniciaModoTEF()     cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")     If cArquivoTemp <> "" Then        Open App.Path & "\IMPRIME.TXT" For Input As #1        cConteudo = ""        cLinha = ""        Do While Not EOF(1)           Line Input #1, cLinha           cConteudo = cConteudo + cLinha + Chr(13) + Chr(10)           iRetorno = Bematech_FI_RelatorioGerencial(cLinha + Chr(13))           VerificaRetornoFuncaoImpressora (iRetorno)           If EOF(1) Then              cSaltaLinha = Chr(13) + Chr(10) + Chr(13) + Chr(10) + _                 Chr(13) + Chr(10) + Chr(13) + Chr(10) + Chr(13) + Chr(10)              iRetorno = Bematech_FI_RelatorioGerencial(cSaltaLinha)              VerificaRetornoFuncaoImpressora (iRetorno)              ' Está sendo usado um form para a exibição desta mensagem              frmMensagem.lblMensagem.Caption = "Por favor, destaque a 1ª Via"              frmMensagem.Show              frmMensagem.Refresh              Sleep (5000)              Unload frmMensagem              frmPrincipal.Refresh              iRetorno = Bematech_FI_RelatorioGerencial(cConteudo)              VerificaRetornoFuncaoImpressora (iRetorno)           End If        Loop        Close #1        cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")        If cArquivoTemp <> "" Then           Kill App.Path & "\IMPRIME.TXT"        End If        ' Desbloqeia o teclado e o mouse        iRetorno = Bematech_FI_FinalizaModoTEF()        iRetorno = Bematech_FI_FechaRelatorioGerencial()        VerificaRetornoFuncaoImpressora (iRetorno)     End If

Page 18: TEF Bematech

End Function

    FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"     Kill App.Path & "\INTPOS.001"     cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.STS"     End If     cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.001"     End If     MsgBox "Cancelada a Transação" + Chr(13) + Chr(13) + "Rede: " + _        cNomeRede + Chr(13) + "Doc Nº: " + cNSU + Chr(13) + "Valor: " + _        Format(cValor / 100, "#,##0.00"), vbInformation + vbOKOnly, "Atenção" End Function

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 6/10 - Realizando uma Reimpressão da transação TEFPublicado em: 19/10/2005

Nesta parte, estaremos realizando a reimpressão de uma transação TEF já efetuada. Para isso, estaremos usando as funções Administrativas da rede (American Express, Redecard ou Visanet).

Iremos criar uma função chamada Administrativo para carregar o módulo ADM da rede. Além desta, usaremos as funções de impressão do Relatório Gerencial (para a impressão da resposta) e de Confirmação, vistas nas edições anteriores.

Não esqueça que na tela ADM da rede, você deve selecionar a opção Reimpressão.

Estaremos visualizando este código em dois exemplos básicos. Um desenvolvido em Delphi e outro em Visual Basic.

- Exemplo em Visual Basic

Administrativo If (ImprimeGerencial = 1) Then   ConfirmaTransacao End If . . .

' Função: Administrativo ' Objetivo: Acessar o Módulo Adminstrativo da Rede ' Retorno: True para OK ou False para não OK

Page 19: TEF Bematech

Function Administrativo() As Boolean   Dim cConteudoArquivo As String   Dim cIdentificacao As String

  cIdentificacao = Time()

  Open App.Path & "\INTPOS.001" For Binary As #1

  ' Conteúdo do arquivo INTPOS.001 para solicitar a transação TEF   cConteudoArquivo = ""   cConteudoArquivo = "000-000 = ADM" + Chr(13) + Chr(10) + _         "001-000 = " + Format(cIdentificacao, "hhmmss") + Chr(13) + Chr(10) + _

        "999-999 = 0"

  ' Escreve no arquivo INTPOS.001   Put #1, , cConteudoArquivo

  ' Fecha o arquivo INTPOS.001   Close #1

  ' Copia o arquivo para o diretório do Gerenciador Padrão   FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"

  ' Exclui o arquivo INTPOS.001 local   Kill App.Path & "\INTPOS.001" End Function

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 7/10 - Tratando a situação de falta de comunicação com o ECFPublicado em: 25/10/2005

Nesta parte, vamos desenvolver as rotinas de tratamento de erro de comunicação com a impressora, onde estaremos utilizando parte das rotinas anteriores (funções ImprimeTEF e ImprimeGerencial), apenas destacando as implementações do tratamento e, em anexo, seguirão os códigos completos destas duas funções, em Delphi e Visual Basic.

- Exemplo em Visual Basic

Private Sub cmdVendaTEF_Click()    Dim cIdentificacao As String, cNumeroCupom As String, cValorPago As String    Dim cFormaPGTO As String    ' Abre Cupom Fiscal, Vende o Item e Fecha Cupom Fiscal    iRetorno = Bematech_FI_AbreCupom("")    If (VerificaRetornoFuncaoImpressora(iRetorno)) Then        iRetorno = Bematech_FI_VendeItem("1234567890123", _          "Teste de Venda de Item...", _

Page 20: TEF Bematech

         "II", "I", "1", 2, "1,00", "%", "00,00")        If (VerificaRetornoFuncaoImpressora(iRetorno)) Then           iRetorno = Bematech_FI_IniciaFechamentoCupom("A", "%", "00,00")           If (VerificaRetornoFuncaoImpressora(iRetorno)) Then              cFormaPGTO = "Cartao Credito"              cValorPago = "100"              cNumeroCupom = Space(6)              iRetorno = Bematech_FI_NumeroCupom(cNumeroCupom)              VerificaRetornoFuncaoImpressora (iRetorno)              cIdentificacao = Time()              iTEF = RealizaTransacao(cIdentificacao, cNumeroCupom, cValorPago)              If (iTEF = 1) Then                 iRetorno = Bematech_FI_EfetuaFormaPagamento(cFormaPGTO, _                   cValorPago)                If (VerificaRetornoFuncaoImpressora(iRetorno)) Then                    cMSGPromocional = "Obrigado, volte sempre !!!"                    iRetorno = Bematech_FI_TerminaFechamentoCupom(cMSGPromocional)

                   VerificaRetornoFuncaoImpressora (iRetorno)                    If (ImprimeTransacao(cFormaPGTO, cValorPago, cNumeroCupom, _                       cIdentificacao)) Then                      ConfirmaTransacao                    Else                      NaoConfirmaTransacao                    End If                 End If              End If              If (iTEF = -1) Then                MsgBox "Gerencial Padrão não está ativo !", vbOKOnly + _                  vbInformation, "Atenção"              End If              ' Se a transação não for aprovada, deve-se permitir a escolha de             ' outra forma de pagamento. Neste caso, está sendo utilizado             ' "Dinheiro" como exemplo              If (iTEF = -2) Or (iTEF = 0) Then                 cFormaPGTO = "Dinheiro"                iRetorno = Bematech_FI_EfetuaFormaPagamento(cFormaPGTO, _                   cValorPago)                If (VerificaRetornoFuncaoImpressora(iRetorno)) Then                    cMSGPromocional = "Obrigado, volte sempre !!!" + Chr(13)                    iRetorno = Bematech_FI_TerminaFechamentoCupom(cMSGPromocional)

                   VerificaRetornoFuncaoImpressora (iRetorno)                 End If              End If           End If        End If     End If End Sub

Page 21: TEF Bematech

' Função: ImprimeTransacao ' Objetivo: Realiza a impressão da Transação TEF ' Parâmetros: string para a Forma de Pagamento '             string para a Valor da Forma de Pagamento '             string para o Número do Cupom Fiscal (COO) '             TDateTime para identificar o número da transação ' Retorno: True para OK ou False para não OK Function ImprimeTransacao(cFormaPGTO As String, cValorPago As String, _    cCOO As String, cIdentificacao As String) As Integer    Dim cLinhaArquivo As String    Dim cLinha As String    Dim cSaltaLinha As String    Dim cConteudo As String    Dim iVezes As Integer    Dim iImprimeTransacao As Integer    iImprimeTransacao = 1

   ' Bloqueia o teclado e o mouse para a impressão do TEF    iRetorno = Bematech_FI_IniciaModoTEF()    cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")    If cArquivoTemp <> "" Then       iRetorno = Bematech_FI_AbreComprovanteNaoFiscalVinculado(cFormaPGTO, _

         cValorPago, cCOO)       VerificaRetornoFuncaoImpressora (iRetorno)    End If    Open App.Path & "\IMPRIME.TXT" For Input As #1    cConteudo = ""    cLinha = ""    Do While Not EOF(1)       Line Input #1, cLinha       cConteudo = cConteudo + cLinha + Chr(13) + Chr(10)       iRetorno = Bematech_FI_UsaComprovanteNaoFiscalVinculado(cLinha + Chr(13))

      ' Aqui é feito o tratamento de erro de comunicação com a impressora       ' (desligamento da impressora durante a impressão do comprovante).

      If Not (VerificaRetornoFuncaoImpressora(iRetorno)) Then          iRetorno = Bematech_FI_FinalizaModoTEF()          If MsgBox("A impressora não responde." & Chr(13) & _             "Deseja imprimir novamente ?", vbQuestion + vbYesNo, _             "Atenção") = vbYes Then             Close #1             iRetorno = Bematech_FI_FechaComprovanteNaoFiscalVinculado()             If (ImprimeGerencial) Then                ImprimeTransacao = iImprimeTransacao                Exit Function             Else                iImprimeTransacao = 0

Page 22: TEF Bematech

               ImprimeTransacao = iImprimeTransacao                Exit Function             End If          Else             Close #1             iRetorno = Bematech_FI_FechaComprovanteNaoFiscalVinculado()             iImprimeTransacao = 0             ImprimeTransacao = iImprimeTransacao             Exit Function          End If       Else          If EOF(1) Then             .             .             .

' Função: ImprimeGerencial ' Objetivo: Imprimir através do Relatório Gerencial a transação efetuada. ' Retorno: 1 para OK ou diferente de 1 para não OK Function ImprimeGerencial() As Integer     Dim cConteudo As String, cLinha As String, cSaltaLinha As String, _         cLinhaArquivo As String     Dim iTentativas As Integer, iVezes As Integer, _         iImprimeGerencial As Integer     Dim bTransacao As Boolean     cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")     If cArquivoTemp <> "" Then        Kill App.Path & "\IMPRIME.TXT"     End If     iImprimeGerencial = 1     For iTentativas = 1 To 7         .         .         .     ' Bloqueia o teclado e o mouse para a impressão do TEF     iRetorno = Bematech_FI_IniciaModoTEF()    cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")    If cArquivoTemp <> "" Then        Open App.Path & "\IMPRIME.TXT" For Input As #1        cConteudo = ""        cLinha = ""        Do While Not EOF(1)          Line Input #1, cLinha          cConteudo = cConteudo + cLinha + Chr(13) + Chr(10)          iRetorno = Bematech_FI_RelatorioGerencial(cLinha + Chr(13))

         ' Aqui é feito o tratamento de erro de comunicação com a impressora          ' (desligamento da impressora durante a impressão do comprovante).

         If Not (VerificaRetornoFuncaoImpressora(iRetorno)) Then

Page 23: TEF Bematech

             iRetorno = Bematech_FI_FinalizaModoTEF()              If MsgBox("A impressora não responde." & Chr(13) & _                "Deseja imprimir novamente ?", vbQuestion + vbYesNo, _                "Atenção") = vbYes Then                Close #1                iRetorno = Bematech_FI_FechaRelatorioGerencial()                ImprimeGerencial                ImprimeGerencial = iImprimeGerencial                Exit Function              Else                Close #1                iRetorno = Bematech_FI_FechaRelatorioGerencial()                iImprimeGerencial = 0                ImprimeGerencial = iImprimeGerencial                Exit Function              End If           End If

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 8/10 - Tratando a situação de queda de energiaPublicado em: 28/10/2005

Conforme mencionamos na parte anterior, nesta parte estaremos tratando a situação de queda de energia, quando ocorre durante a impressão da transação TEF e o que devemos fazer.

Quando nos deparamos com esta situação, o importante é verificarmos se existe uma transação pendente, mas como verificar isso se a aplicação foi reinicializada? Simples! Vamos usar uma lógica externa para tratar este tipo de situação, criando o arquivo TEF.TXT, toda a vez que iniciarmos a impressão da transação TEF e elimina-lo quando esta transação for concluída, assim ao entrarmos na aplicação poderemos verificar a existência deste arquivo e não confirmar a transação pendente.

Serão utilizados os códigos já desenvolvidos, incluindo esta nova implementação e, em anexo, seguirão os códigos completos em Delphi e Visual Basic.

- Exemplo em Visual Basic

' Form Load Private Sub Form_Load()    Dim cArquivoTEF As String    Dim iRetorno As Integer

   ' Verifica se existe o arquivo TEF.TXT, indicando que há uma    ' transação pendente.

   cArquivoTEF = Dir(App.Path & "\TEF.TXT")    If cArquivoTEF <> "" Then      iRetorno = Bematech_FI_FechaComprovanteNaoFiscalVinculado()      NaoConfirmaTransacao

Page 24: TEF Bematech

     cArquivoTEF = ""      cArquivoTEF = Dir(App.Path & "\TEF.TXT")      If cArquivoTEF <> "" Then          Kill App.Path & "\TEF.TXT"      End If    End If End Sub

' Função: ImprimeTransacao ' Objetivo: Realiza a impressão da Transação TEF ' Parâmetros: string para a Forma de Pagamento '             string para a Valor da Forma de Pagamento '             string para o Número do Cupom Fiscal (COO) '             TDateTime para identificar o número da transação ' Retorno: True para OK ou False para não OK Function ImprimeTransacao(cFormaPGTO As String, cValorPago As String, _    cCOO As String, cIdentificacao As String) As Integer    Dim cLinhaArquivo As String    Dim cLinha As String    Dim cSaltaLinha As String    Dim cConteudo As String    Dim iVezes As Integer    Dim iImprimeTransacao As Integer

   ' Neste ponto é criado o arquivo TEF.TXT, indicando que há uma    ' operação de TEF sendo realizada. Caso ocorra uma queda de energia,    ' no momento da impressão do TEF, e a aplicação for inicializada,    ' ao identificar a existência deste arquivo, a transação do TEF    ' deverá ser concelada.

   Open App.Path & "\TEF.TXT" For Binary As #1    Close #1

   iImprimeTransacao = 1

   ' Bloqueia o teclado e o mouse para a impressão do TEF    iRetorno = Bematech_FI_IniciaModoTEF()    cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")    If cArquivoTemp <> "" Then      iRetorno = Bematech_FI_AbreComprovanteNaoFiscalVinculado(cFormaPGTO, _

       cValorPago, cCOO)      VerificaRetornoFuncaoImpressora (iRetorno)    End If     .     .     .

' Função: ConfirmaTransacao ' Objetivo: Confirmar a Transação TEF

Page 25: TEF Bematech

' Parâmetros: não há ' Retorno: True para OK ou False para não OK Function ConfirmaTransacao() As Boolean    Dim cLinhaArquivo As String    Dim cConteudo As String    Dim cArquivoTEF As String    cLinhaArquivo = ""    cConteudo = ""    Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1    Do While Not EOF(1)        Line Input #1, cLinhaArquivo        If (Mid(cLinhaArquivo, 1, 3) = "001") Or _           (Mid(cLinhaArquivo, 1, 3) = "002") Or _           (Mid(cLinhaArquivo, 1, 3) = "010") Or _           (Mid(cLinhaArquivo, 1, 3) = "012") Or _           (Mid(cLinhaArquivo, 1, 3) = "027") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "999") Then           cConteudo = cConteudo + cLinhaArquivo        End If     Loop     Close #1     cConteudo = "000-000 = CNF" + Chr(13) + Chr(10) + cConteudo     Open App.Path & "\INTPOS.001" For Binary As #1 Put #1, , cConteudo     Close #1     FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"     Kill App.Path & "\INTPOS.001"     cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.STS"     End If     cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.001"     End If

   ' Se o arquivo TEF.TXT, que identifica que houve uma transação impressa     ' existir, o mesmo será exluído.

    cArquivoTEF = ""     cArquivoTEF = Dir(App.Path & "\TEF.TXT")     If cArquivoTEF <> "" Then        Kill App.Path & "\TEF.TXT"     End If End Function

' Função: NaoConfirmaTransacao ' Objetivo: Confirmar a Transação TEF ' Parâmetros: não há

Page 26: TEF Bematech

' Retorno: True para OK ou False para não OK Function NaoConfirmaTransacao() As Boolean    Dim cLinhaArquivo As String, cConteudo As String    Dim cValor As String, cNomeRede As String, cNSU As String    cLinhaArquivo = ""    cConteudo = ""    Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1    Do While Not EOF(1)        Line Input #1, cLinhaArquivo        If (Mid(cLinhaArquivo, 1, 3) = "001") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "003") Then           cValor = Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "010") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)           cNomeRede = Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "012") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)           cNSU = Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "027") Then           cConteudo = cConteudo + cLinhaArquivo + Chr(13) + Chr(10)        End If        If (Mid(cLinhaArquivo, 1, 3) = "999") Then           cConteudo = cConteudo + cLinhaArquivo        End If     Loop     Close #1     cConteudo = "000-000 = NCN" + Chr(13) + Chr(10) + cConteudo     Open App.Path & "\INTPOS.001" For Binary As #1     Put #1, , cConteudo     Close #1     FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"     Kill App.Path & "\INTPOS.001"     cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.STS"     End If     cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")     If (cArquivoSTS <> "") Then        Kill "C:\TEF_DIAL\RESP\INTPOS.001"     End If

   ' Se o arquivo TEF.TXT, que identifica que houve uma transação impressa     ' existir, o mesmo será exluído.

    cArquivoTEF = ""

Page 27: TEF Bematech

    cArquivoTEF = Dir(App.Path & "\TEF.TXT")     If cArquivoTEF <> "" Then        Kill App.Path & "\TEF.TXT"     End If

    MsgBox "Cancelada a Transação" + Chr(13) + Chr(13) + "Rede: " + _        cNomeRede + Chr(13) + "Doc Nº: " + cNSU + Chr(13) + "Valor: " + _        Format(cValor / 100, "#,##0.00"), vbInformation + vbOKOnly, "Atenção" End Function

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 9/10 - Realizando operações administrativasPublicado em: 11/11/2005

Nesta parte, estaremos realizando algumas operações administrativas que são necessárias no desenvolvimento do TEF. É através do módulo administrativo da bandeira (AMEX, Redecard ou Visanet) que são realizadas operações, como:

- reimpressão da transação TEF.- cancelamentos.- impressão de relatórios.- fechamento de lotes.- inicialização de terminal.- configurações.

Iremos desenvolver a rotina de chamada do módulo administrativo e a impressão do conteúdo da operação, através do relatório gerencial (em anexo), caso necessário. Também é necessário confirmar a operação, quando houver texto a ser impresso.

A função de confirmação (ConfirmaTransacao) foi visto na edição 8 de seu FlashTip.- Exemplo em Visual Basic

cIdentificacao = Time()FuncaoAdministrativaTEF (cIdentificacao)If (ImprimeGerencial) Then   ConfirmaTransacaoEnd If...

' Função: FuncaoAdministrativaTEF ' Objetivo: Chamar o módulo administrativo da bandeira ' Parâmetro: String com o identificador ' Retorno: 1 para OK '          diferente de 1 para não OK Function FuncaoAdministrativaTEF(cIdentificacao As String) As Integer    Dim cConteudoArquivo As String

   Open App.Path & "\INTPOS.001" For Binary As #1

   ' Conteúdo do arquivo INTPOS.001 para solicitar a transação TEF    cConteudoArquivo = ""    cConteudoArquivo = "000-000 = ADM" + Chr(13) + Chr(10) + _       "001-000 = " + Format(cIdentificacao, "hhmmss") + Chr(13) + Chr(10) + _

      "999-999 = 0"

   ' Escreve no arquivo INTPOS.001    Put #1, , cConteudoArquivo

   ' Fecha o arquivo INTPOS.001    Close #1

Page 28: TEF Bematech

   ' Copia o arquivo para o diretório do Gerenciador Padrão    FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"

   ' Exclui o arquivo INTPOS.001 local    Kill App.Path & "\INTPOS.001" End FunctionNão perca nossa última parte! Estaremos realizando transações com múltiplos cartões.

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 10/10 - Realizando uma venda com mais de uma transação TEFPublicado em: 14/11/2005

Chegamos ao final de nosso pequeno treinamento de TEF! Conseguimos visualizar as principais rotinas e métodos, utilizadas durante o desenvolvimento das operações com o TEF.

Nesta última parte, estaremos conhecendo como uma transação com mais de um cartão é realizada.

Iremos passar por alguns procedimentos importantes e estaremos visualizando um fluxo básico de uma transação.

Então, vamos lá! E, uma boa leitura!

1) Procedimentos de uma operação TEF com múltiplos cartões

1.1) A aplicação imprimirá o cupom fiscal normalmente, até a sua totalização;

1.2) Enviará uma solicitação de transação TEF com os dados respectivos. Você deverá salvar uma cópia de cada arquivo de resposta "Intpos.001", pois você precisará dos dados para cancelar a transação, se necessário (quando houver uma queda de energia ou falta de comunicação com a impressora);

Observação: Caso exista uma nova transação TEF, a primeira deverá ser confirmada (CNF).

1.3) Abrirá o arquivo de resposta "Intpos.001" para verificar se o campo "001-000" é igual ao enviado na solicitação, caso contrário, deverá excluir esse arquivo e aguardar o próximo;

1.4) Analisará o campo "009-000". Se a transação for aprovada deverá efetuar a forma de pagamento. Se a transação não for aprovada, deverá exibir a mensagem do campo "030-000" ao operador e aguardar o seu "OK";

1.5) Antes de enviar a solicitação para a segunda transação, a aplicação deverá confirmar (CNF) a transação anterior, sem imprimi-la. O cupom fiscal deverá permanecer aberto (totalizado) após esta confirmação, aguardando o próximo pagamento;

1.6) Enviará a solicitação da segunda transação TEF com os dados respectivos. Você deverá salvar uma cópia de cada arquivo de resposta "Intpos.001", pois você precisará dos dados para cancelar a transação, se necessário (quando houver uma queda de energia ou falta de comunicação com a impressora);

1.7) Repetir o passo 1.4;

Page 29: TEF Bematech

1.8) Repetir o 1.5;

Observação: Repetir os passos de 1.5 a 1.8 para cada nova transação.

1.9) Quando a aplicação chegar à última transação TEF, esta não deverá ser confirmada;

1.10) A aplicação encerrará o cupom fiscal com as formas de pagamento, respectivas a cada transação, e iniciará as impressões dos comprovantes do TEF (2 vias para cada);

1.11) Após a impressão da última transação TEF, esta deverá então ser confirmada (CNF), finalizando todo processo;

Observação: Tanto o teclado quanto o mouse deverão permanecer bloqueados durante as impressões.

1.12) Os arquivos temporários deverão ser excluídos.

Dica: As formas de pagamento usadas para realizar transação com TEF, deverão ser as últimas no fechamento do cupom fiscal. Por exemplo, se o cupom fiscal for pago com 3 formas de pagamento diferentes "Dinheiro", "Cheque" e "Cartão", a forma "Cartão" deverá ser a última.

2) Procedimentos com falta de comunicação com o ECF

2.1) Se durante a impressão dos comprovantes do TEF, houver uma falta de comunicação com o ECF, a aplicação deverá detectar esta falta e exibir a seguinte mensagem ao operador: "A impressora não responde. Deseja imprimir novamente?"

2.2) Se o operador optar por "Sim", a aplicação deverá fechar o comprovante, abrir o relatório gerencial e imprimir os comprovantes de todas as transações;

2.3) Se o operador optar por "Não", a aplicação deverá enviar um NCN (Não Confirmação) referente a última transação realizada e um CNC (Cancelamento) referente as demais transações, pois estas haviam sido confirmadas anteriormente.

2.4) O CNC deverá ser enviado para cada transação que foi confirmada respeitando a seguinte lógica:

2.4.1) A aplicação enviará um CNC para a primeira transação confirmada e imprimirá o texto do "Intpos.001" de resposta (referente a este cancelamento), em um relatório gerencial.

2.4.2) A aplicação enviará um CNF (Confirmação) confirmando este cancelamento e enviará o novo CNC para a outra transação confirmada, conforme citado acima. Este processo se aplicará para todas as transações que existirem.

Observação: A aplicação deverá exibir uma mensagem ao operador com as seguintes informações: "Nome da Rede" (bandeira), "NSU" e "Valor da Transação", para cada transação cancelada, incluindo a não confirmada.

2.5) Se durante a impressão dos comprovantes de cancelamento houver novamente uma falta de comunicação com o ECF, o procedimento será o mesmo do ítem 2.1.

2.6) Se o operador optar por "Sim", a aplicação deverá fechar o relatório gerencial e abrir o novo, imprimindo todo o texto novamente.

2.7) Se o operador optar por "Não", a aplicação deverá enviar um NCN (Não Confirmação) e novamente o CNC (Cancelamento) referente à transação, imprimindo o texto do INTPOS.001 de resposta em um novo relatório gerencial.

Page 30: TEF Bematech

3) Procedimentos com queda de energia

3.1) Se durante a impressão dos comprovantes do TEF, houver uma queda de energia, a aplicação deverá detectar esta queda, enviar um NCN (Não Confirmação) para a última transação e um CNC (Cancelamento) para cada transação que havia sido confirmada anteriormente.

3.2) Se durante a impressão dos comprovantes do cancelamento houver uma queda de energia, a aplicação deverá detectar esta queda, fechar o relatório gerencial pendente, enviar o NCN (Não Confirma) e novamente o CNC (Cancelamento) referente à transação, imprimindo o texto do "Intpos.001" de resposta em um novo relatório gerencial.

3.3) A aplicação deverá enviar um CNF (Confirmação) após cada impressão do comprovante de cancelamento.

4) Fluxo básico de uma transação

Page 31: TEF Bematech
Page 32: TEF Bematech