Vous êtes sur la page 1sur 32

Bematech: Transferncia Eletrnica de Fundos (T.E.F.

) - Discado - Passo 1/10 - Conhecendo a Lgica de Funcionamento


Publicado em: 17/10/2005

Antes de iniciarmos a lgica de funcionamento do TEF, vamos verificar quais so os pr-requisitos que precisamos conhecer para a sua implementao: - Aplicativo de Automao Comercial responsvel pela impresso do Cupom Fiscal e do Comprovante da transao TEF. - Gerenciador Padro o mdulo responsvel pelo direcionamento da transao para os respectivos Mdulos TEF (American Express, Redecard e Visanet) e efetua o tratamento das atividades, permitindo que o Aplicativo de Automao Comercial interaja com as Administradoras de Carto de Crdito e de Dbito, de forma simples e eficiente. - Mdulo TEF o componente que interage com o usurio para coleta de dados da transao a ser executada. Cada rede possui um Mdulo TEF prprio.

Comunicao entre o Aplicativo de Automao Comercial e o Gerenciador Padro Lgica de Funcionamento A comunicao entre o seu Aplicativo e o Gerenciador Padro realizada atravs de arquivos no formato "texto" com mensagens prprias. Os diretrios utilizados para a troca destes arquivos, so: C:\TEF_DIAL\REQ e C:\TEF_DIAL\RESP (ambos default do Gerenciador Padro).

O seu Aplicativo criar o arquivo INTPOS.001 solicitando a realizao da transao TEF e enviar para o diretrio C:\TEF_DIAL\REQ. Este diretrio usado pelo seu Aplicao para envio de dados ao Gerenciador Padro.

Os dados de resposta do Gerenciador Padro, aps o processamento da transao pelo Mdulo TEF (American Express, Redecard ou Visanet), sero enviados para o diretrio C:\TEF_DIAL\RESP. Este diretrio usado pelo seu Aplicativo para receber as respostas do Gerenciador Padro. O seu Aplicativo, aps ter enviado o INTPOS.001 para o Gerenciador Padro (C:\TEF_DIAL\REQ), dever aguardar por 7 segundos o recebimento do arquivo INTPOS.STS enviado pelo Gerenciador Padro (C:\TEF_DIAL\RESP). Esse processo significa que o Gerenciador Padro recebeu o INTPOS.001 com a solicitao da transao TEF, enviado pelo seu Aplicativo. Caso o Gerenciador Padro no 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!". Aps o envio do INTPOS.STS, o Gerenciador Padro ir exibir a tela com os Mdulos TEF disponveis para a escolha. O seu Aplicativo dever aguardar o arquivo INTPOS.001 com o resultado da transao. Este arquivo ser gerado no diretrio C:\TEF_DIAL\RESP. Aps seu Aplicativo realizar a impresso do comprovante TEF, dever ser enviado um arquivo INTPOS.001, ao Gerenciador Padro (C:\TEF_DIAL\REQ), confirmando ou no esta transao. Aps este envio, o Gerenciador Padro responder um INTPOS.STS (C:\TEF_DIAL\RESP), confirmando este procedimento. Sequncia de execuo do TEF

Bematech: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 2/10 - Comunicando com o Gerenciador Padro
Publicado em: 17/10/2005

Vimos no artigo passado, a lgica de funcionamento do TEF. Agora vamos "colocar a mo na massa" e comear a desenvolver as nossas rotinas! Nesta edio, iremos realizar a primeira comunicao com o Gerenciador Padro e tratar todos os retornos e mensagens possveis. Estaremos visualizando esta rotina em dois exemplos bsicos. Um desenvolvido em Delphi e outro em Visual Basic . A idia verificarmos se o Gerenciador Padro est ativo, antes de iniciarmos uma transao TEF.

- Exemplo em Visual Basic

' Declarao da funo Sleep (API kernel32) Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ' ' Esta funo verifica se o Gerenciador Padro 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 Padro se encontra ATIVO !", vbInformation + _ vbOKOnly, "Ateno" iTentativas = 8 End If Sleep (1000) If iTentativas = 7 Then MsgBox "O Gerencial Padro se encontra INATIVO !", vbInformation + _ vbOKOnly, "Ateno" iTentativas = 8

End If Next End Function Bematech: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 3/10 - Realizando uma venda com transao TEF
Publicado em: 17/10/2005

No artigo passado, iniciamos a nossa primeira comunicao com o Gerenciador Padro, atravs de uma funo onde era verificado se o mesmo estava ativo, antes de uma transao TEF. Nesta edio, iremos fazer a nossa primeira venda de cupom fiscal, com pagamento em carto e realizar a transao TEF. No cdigo abaixo, estaremos utilizando as funes de impresso do cupom fiscal, tratando o retorno da impressora e realizando a solicitao da transao TEF, com impresso do comprovante. As funes utilizadas, neste cdigo, so: Bematech_FI_AbreCupom Bematech_FI_VendeItem Bematech_FI_IniciaFechamentoCupom Bematech_FI_EfetuaFormaPagamento Bematech_FI_TerminaFechamentoCupom

Estas funes sero usadas para a impresso do cupom fiscal. - Bematech_FI_AbreComprovanteNaoFiscalVinculado - Bematech_FI_UsaComprovanteNaoFiscalVinculado - Bematech_FI_FechaComprovanteNaoFiscalVinculado Estas funes sero usadas para a impresso do comprovante da transao TEF. - Bematech_FI_IniciaModoTEF - Bematech_FI_FinalizaModoTEF Estas funes sero usadas para o bloqueio e desbloqueio do teclado e mouse. Tambm sero usadas funes extras, definidas como: - VerificaRetornoFuncaoImpressora - RealizaTransacao - ImprimeTransacao Neste cdigo, estaremos realizando a impresso do cupom fiscal completo com uma transao TEF, mas no estaremos ainda, verificando o tratamento de queda de energia e confirmando a transao. Estaremos visualizando este cdigo em dois exemplos bsicos. Um desenvolvido em Delphi e outro em Visual Basic.

- Exemplo em Visual Basic ' Declarao da funo 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 Padro no est ativo !", vbOKOnly + _ vbInformation, "Ateno" End If ' Se a transao no 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 ' Funo: RealizaTransacao ' Objetivo: Realiza a transao TEF ' Parmetros: TDateTime para identificar o nmero da transao ' string para o Nmero do Cupom Fiscal (COO) ' string para a Valor da Forma de Pagamento ' Retorno: True para OK ou False para no 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 ' Contedo do arquivo INTPOS.001 para solicitar a transao 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 Padro recebeu o INTPOS.001 da solicitao 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 identificao 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 ' Verifica se a Transao 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 ' sero 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 exibio 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, "Ateno" RealizaTransacao = 0 End If Loop Exit Do

End If Loop iTentativas = 8 End If Sleep (1000) Next ' Cria o arquivo temporrio 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 ' Funo: ImprimeTransacao ' Objetivo: Realiza a impresso da Transao TEF ' Parmetros: string para a Forma de Pagamento ' string para a Valor da Forma de Pagamento ' string para o Nmero do Cupom Fiscal (COO) ' TDateTime para identificar o nmero da transao ' Retorno: True para OK ou False para no 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 impresso 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 exibio desta mensagem 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 ' Funo: VerificaRetornoFuncaoImpressora ' Objetivo: Verificar o retorno da impressora e da funo utilizada ' Retorno: True para OK ou False para no 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 Comunicao !" Case Is = -1 cMSGErro = "Erro de execuo na Funo !" Case Is = -2 cMSGErro = "Parmetro invlido na Funo !" Case Is = -3 cMSGErro = "Alquota no Programada !" Case Is = -4 cMSGErro = "Arquivo BEMAFI32.INI no Encontrado !" Case Is = -5 cMSGErro = "Erro ao abrir a Porta de Comunicao !" Case Is = -6 cMSGErro = "Impressora Desligada ou Cabo de Comunicao Desconectado !" Case Is = -7 cMSGErro = "Cdigo do Banco no 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 = "Funo incompatvel com a impressora fiscal YANCO !" End Select

If cMSGErro <> "" Then MsgBox cMSGErro, vbOKOnly + vbInformation, "Ateno" VerificaRetornoFuncaoImpressora = False End If 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 Comunicao !", vbOKOnly + vbCritical, "Ateno" 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 Relgio" + 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 no 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 + "Nmero de Parmetros Invlidos" + Chr(13) End If ' Analisa ST2 If iST2 >= 128 Then iST2 = iST2 - 128 cMSGErro = cMSGErro + "Tipo de Parmetro de Comando Invlido" + _ Chr(13) ElseIf iST2 >= 64 Then iST2 = iST2 - 64 cMSGErro = cMSGErro + "Memria 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 + "Alquota no Programada" + Chr(13) ElseIf iST2 >= 8 Then

iST2 = iST2 - 8 cMSGErro = cMSGErro + "Capacidade de Alquota Programveis " + _ "Lotada" + Chr(13) ElseIf iST2 >= 4 Then iST2 = iST2 - 4 cMSGErro = cMSGErro + "Cancelamento no permitido" + Chr(13) ElseIf iST2 >= 2 Then iST2 = iST2 - 2 cMSGErro = cMSGErro + "CGC/IE do Proprietrio no Programados" + _ Chr(13) ElseIf iST2 >= 1 Then iST2 = iST2 - 1 cMSGErro = cMSGErro + "Comando no executado" + Chr(13) ElseIf (cMSGErro <> "") Then MsgBox cMSGErro, vbOKOnly + vbCritical, "Ateno" VerificaRetornoFuncaoImpressora = False End If Else VerificaRetornoFuncaoImpressora = True End If End If End If End Function

Bematech: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 4/10 - Confirmando uma transao TEF
Publicado em: 18/10/2005

No passo anterior, realizamos uma venda de cupom fiscal com pagamento em carto e fizemos nossa primeira transao TEF com impresso do comprovante. Agora, precisamos validar esta transao! Vamos criar duas funes para isso: - uma para confirmar a transao TEF (ConfirmaTransacao) e; - outra para no confirmar a transao TEF (NaoConfirmaTransacao). Ou seja, precisamos controlar estes dois processos, pois estaremos enfrentando situaes onde a impressora passar por erros de comunicao (desligamentos) ou quedas de energia (veremos isso nas prximas edies). Estaremos visualizando este cdigo em dois exemplos bsicos. Um desenvolvido em Delphi e outro em Visual Basic. - Exemplo em Visual Basic ' Funo: ConfirmaTransacao ' Objetivo: Confirmar a Transao TEF ' Parmetros: no h ' Retorno: True para OK ou False para no 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 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 ' Funo: NaoConfirmaTransacao ' Objetivo: Confirmar a Transao TEF ' Parmetros: no h ' Retorno: True para OK ou False para no 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 MsgBox "Cancelada a Transao" + Chr(13) + Chr(13) + "Rede: " + _ cNomeRede + Chr(13) + "Doc N: " + cNSU + Chr(13) + "Valor: " + _ Format(cValor / 100, "#,##0.00"), vbInformation + vbOKOnly, "Ateno" End Function

Bematech: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 5/10 - Cancel uma transao TEF
Publicado em: 19/10/2005

No artigo passado, vimos as rotinas de confirmao (CNF) e no confirmao (NCN) da transao TEF, importantes em toda operao. Agora, iremos incluir em nosso desenvolvimento, a rotina de cancelamento da transao TEF. Rotina utilizada, geralmente, quando h necessidade de cancelar uma transao j emitida ou aps sua confirmao. Existem duas maneiras de solicitar este cancelamento:

- pelas rotinas administrativas ou; - gerando o arquivo INTPOS.001 com os dados da transao que se deseja cancelar. Iremos realizar o cancelamento pelo arquivo INTPOS.001 e veremos o cancelamento pelo modo administrativo em outra edio do Flash Tip. No cdigo, criaremos a funo "CancelaTrancacaoTEF" e as informaes da transao sero passadas, atravs de seus parmetros. No esquea que a resposta deste cancelamento dever ser impressa, atravs do Relatrio Gerencial e sua confirmao efetuada. Estaremos visualizando este cdigo em dois exemplos bsicos. 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 . . . ' Funo: CancelaTransacaoTEF ' Objetivo: Cancelar uma transao j confirmada ' Parmetros: String com o nmero de identificao (NSU) ' String com o valor da transao ' String com o valor da transao ' String com o nome e bandeira (REDE) ' String com o nmero do documento ' String com a data da transao no formato DDMMAAAA ' String com a hora da transao no formato HHSMMSS ' Retorno: True para OK ou False para no 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 Close #1 FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001" Kill App.Path & "\INTPOS.001" End Function ' Funo: ImprimeGerencial ' Objetivo: Imprimir atravs do Relatrio Gerencial a transao efetuada. ' Retorno: 1 para OK ou diferente de 1 para no 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 Padro recebeu o INTPOS.001 da ' solicitao 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 Transao 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 ' Verifica se o campo 029 e armazena as linhas ' que sero 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 exibio 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, "Ateno" iImprimeGerencial = 0 End If Loop Exit Do End If End If Loop iTentativas = 8 Sleep (1000) Next ' Cria o arquivo temporrio 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 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 impresso 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 exibio 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 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 Transao" + Chr(13) + Chr(13) + "Rede: " + _ cNomeRede + Chr(13) + "Doc N: " + cNSU + Chr(13) + "Valor: " + _ Format(cValor / 100, "#,##0.00"), vbInformation + vbOKOnly, "Ateno" End Function

Bematech: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 6/10 - Realizando uma Reimpresso da transao TEF
Publicado em: 19/10/2005

Nesta parte, estaremos realizando a reimpresso de uma transao TEF j efetuada. Para isso, estaremos usando as funes Administrativas da rede (American Express, Redecard ou Visanet). Iremos criar uma funo chamada Administrativo para carregar o mdulo ADM da rede. Alm desta, usaremos as funes de impresso do Relatrio Gerencial (para a impresso da resposta) e de Confirmao, vistas nas edies anteriores. No esquea que na tela ADM da rede, voc deve selecionar a opo Reimpresso. Estaremos visualizando este cdigo em dois exemplos bsicos. Um desenvolvido em Delphi e outro em Visual Basic.

- Exemplo em Visual Basic

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

' Funo: Administrativo ' Objetivo: Acessar o Mdulo Adminstrativo da Rede ' Retorno: True para OK ou False para no OK Function Administrativo() As Boolean Dim cConteudoArquivo As String Dim cIdentificacao As String cIdentificacao = Time() Open App.Path & "\INTPOS.001" For Binary As #1 ' Contedo do arquivo INTPOS.001 para solicitar a transao 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 diretrio do Gerenciador Padro 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: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 7/10 - Tratando a situao de falta de comunicao com o ECF
Publicado em: 25/10/2005

Nesta parte, vamos desenvolver as rotinas de tratamento de erro de comunicao com a impressora, onde estaremos utilizando parte das rotinas anteriores (funes ImprimeTEF e ImprimeGerencial), apenas destacando as implementaes do tratamento e, em anexo, seguiro os cdigos completos destas duas funes, 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...", _ "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 Padro no est ativo !", vbOKOnly + _ vbInformation, "Ateno" End If ' Se a transao no 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 ' Funo: ImprimeTransacao ' Objetivo: Realiza a impresso da Transao TEF ' Parmetros: string para a Forma de Pagamento ' string para a Valor da Forma de Pagamento ' string para o Nmero do Cupom Fiscal (COO) ' TDateTime para identificar o nmero da transao ' Retorno: True para OK ou False para no 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 impresso 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 comunicao com a impressora ' (desligamento da impressora durante a impresso do comprovante). If Not (VerificaRetornoFuncaoImpressora(iRetorno)) Then iRetorno = Bematech_FI_FinalizaModoTEF() If MsgBox("A impressora no responde." & Chr(13) & _ "Deseja imprimir novamente ?", vbQuestion + vbYesNo, _ "Ateno") = vbYes Then Close #1 iRetorno = Bematech_FI_FechaComprovanteNaoFiscalVinculado() If (ImprimeGerencial) Then

ImprimeTransacao = iImprimeTransacao Exit Function Else iImprimeTransacao = 0 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 . . . ' Funo: ImprimeGerencial ' Objetivo: Imprimir atravs do Relatrio Gerencial a transao efetuada. ' Retorno: 1 para OK ou diferente de 1 para no 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 impresso 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 comunicao com a impressora ' (desligamento da impressora durante a impresso do comprovante). If Not (VerificaRetornoFuncaoImpressora(iRetorno)) Then iRetorno = Bematech_FI_FinalizaModoTEF() If MsgBox("A impressora no responde." & Chr(13) & _ "Deseja imprimir novamente ?", vbQuestion + vbYesNo, _ "Ateno") = 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: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 8/10 - Tratando a situao de queda de energia
Publicado em: 28/10/2005

Conforme mencionamos na parte anterior, nesta parte estaremos tratando a situao de queda de energia, quando ocorre durante a impresso da transao TEF e o que devemos fazer. Quando nos deparamos com esta situao, o importante verificarmos se existe uma transao pendente, mas como verificar isso se a aplicao foi reinicializada? Simples! Vamos usar uma lgica externa para tratar este tipo de situao, criando o arquivo TEF.TXT, toda a vez que iniciarmos a impresso da transao TEF e elimina-lo quando esta transao for concluda, assim ao entrarmos na aplicao poderemos verificar a existncia deste arquivo e no confirmar a transao pendente. Sero utilizados os cdigos j desenvolvidos, incluindo esta nova implementao e, em anexo, seguiro os cdigos 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 ' transao pendente.

cArquivoTEF = Dir(App.Path & "\TEF.TXT") If cArquivoTEF <> "" Then iRetorno = Bematech_FI_FechaComprovanteNaoFiscalVinculado() NaoConfirmaTransacao cArquivoTEF = "" cArquivoTEF = Dir(App.Path & "\TEF.TXT") If cArquivoTEF <> "" Then Kill App.Path & "\TEF.TXT" End If End If End Sub ' Funo: ImprimeTransacao ' Objetivo: Realiza a impresso da Transao TEF ' Parmetros: string para a Forma de Pagamento ' string para a Valor da Forma de Pagamento ' string para o Nmero do Cupom Fiscal (COO) ' TDateTime para identificar o nmero da transao ' Retorno: True para OK ou False para no 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 ' operao de TEF sendo realizada. Caso ocorra uma queda de energia, ' no momento da impresso do TEF, e a aplicao for inicializada, ' ao identificar a existncia deste arquivo, a transao 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 impresso 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 . .

. ' Funo: ConfirmaTransacao ' Objetivo: Confirmar a Transao TEF ' Parmetros: no h ' Retorno: True para OK ou False para no 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 transao impressa ' existir, o mesmo ser exludo. cArquivoTEF = "" cArquivoTEF = Dir(App.Path & "\TEF.TXT") If cArquivoTEF <> "" Then Kill App.Path & "\TEF.TXT" End If End Function

' Funo: NaoConfirmaTransacao ' Objetivo: Confirmar a Transao TEF ' Parmetros: no h ' Retorno: True para OK ou False para no 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 transao impressa ' existir, o mesmo ser exludo. cArquivoTEF = "" cArquivoTEF = Dir(App.Path & "\TEF.TXT") If cArquivoTEF <> "" Then Kill App.Path & "\TEF.TXT" End If MsgBox "Cancelada a Transao" + Chr(13) + Chr(13) + "Rede: " + _ cNomeRede + Chr(13) + "Doc N: " + cNSU + Chr(13) + "Valor: " + _ Format(cValor / 100, "#,##0.00"), vbInformation + vbOKOnly, "Ateno" End Function
Bematech: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 9/10 - Realizando operaes administrativas
Publicado em: 11/11/2005

Nesta parte, estaremos realizando algumas operaes administrativas que so necessrias no desenvolvimento do TEF. atravs do mdulo administrativo da bandeira (AMEX, Redecard ou Visanet) que so realizadas operaes, como: reimpresso da transao TEF. cancelamentos. impresso de relatrios. fechamento de lotes. inicializao de terminal. configuraes.

Iremos desenvolver a rotina de chamada do mdulo administrativo e a impresso do contedo da operao, atravs do relatrio gerencial (em anexo), caso necessrio. Tambm necessrio confirmar a operao, quando houver texto a ser impresso. A funo de confirmao (ConfirmaTransacao) foi visto na edio 8 de seu FlashTip. - Exemplo em Visual Basic
cIdentificacao = Time() FuncaoAdministrativaTEF (cIdentificacao) If (ImprimeGerencial) Then ConfirmaTransacao End If . . . ' Funo: FuncaoAdministrativaTEF ' Objetivo: Chamar o mdulo administrativo da bandeira ' Parmetro: String com o identificador ' Retorno: 1 para OK ' diferente de 1 para no OK Function FuncaoAdministrativaTEF(cIdentificacao As String) As Integer Dim cConteudoArquivo As String Open App.Path & "\INTPOS.001" For Binary As #1 ' Contedo do arquivo INTPOS.001 para solicitar a transao 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 diretrio do Gerenciador Padro FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001" ' Exclui o arquivo INTPOS.001 local Kill App.Path & "\INTPOS.001" End Function

No perca nossa ltima parte! Estaremos realizando transaes com mltiplos cartes.

Bematech: Transferncia Eletrnica de Fundos (T.E.F.) - Discado - Passo 10/10 - Realizando uma venda com mais de uma transao TEF
Publicado em: 14/11/2005

Chegamos ao final de nosso pequeno treinamento de TEF! Conseguimos visualizar as principais rotinas e mtodos, utilizadas durante o desenvolvimento das operaes com o TEF. Nesta ltima parte, estaremos conhecendo como uma transao com mais de um carto realizada. Iremos passar por alguns procedimentos importantes e estaremos visualizando um fluxo bsico de uma transao. Ento, vamos l! E, uma boa leitura!

1) Procedimentos de uma operao TEF com mltiplos cartes 1.1) A aplicao imprimir o cupom fiscal normalmente, at a sua totalizao; 1.2) Enviar uma solicitao de transao TEF com os dados respectivos. Voc dever salvar uma cpia de cada arquivo de resposta "Intpos.001", pois voc precisar dos dados para cancelar a transao, se necessrio (quando houver uma queda de energia ou falta de comunicao com a impressora); Observao: Caso exista uma nova transao 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 solicitao, caso contrrio, dever excluir esse arquivo e aguardar o prximo; 1.4) Analisar o campo "009-000". Se a transao for aprovada dever efetuar a forma de pagamento. Se a transao no for aprovada, dever exibir a mensagem do campo "030-000" ao operador e aguardar o seu "OK"; 1.5) Antes de enviar a solicitao para a segunda transao, a aplicao dever confirmar (CNF) a transao anterior, sem imprimi-la. O cupom fiscal dever permanecer aberto (totalizado) aps esta confirmao, aguardando o prximo pagamento;

1.6) Enviar a solicitao da segunda transao TEF com os dados respectivos. Voc dever salvar uma cpia de cada arquivo de resposta "Intpos.001", pois voc precisar dos dados para cancelar a transao, se necessrio (quando houver uma queda de energia ou falta de comunicao com a impressora); 1.7) Repetir o passo 1.4; 1.8) Repetir o 1.5; Observao: Repetir os passos de 1.5 a 1.8 para cada nova transao. 1.9) Quando a aplicao chegar ltima transao TEF, esta no dever ser confirmada; 1.10) A aplicao encerrar o cupom fiscal com as formas de pagamento, respectivas a cada transao, e iniciar as impresses dos comprovantes do TEF (2 vias para cada); 1.11) Aps a impresso da ltima transao TEF, esta dever ento ser confirmada (CNF), finalizando todo processo; Observao: Tanto o teclado quanto o mouse devero permanecer bloqueados durante as impresses. 1.12) Os arquivos temporrios devero ser excludos. Dica: As formas de pagamento usadas para realizar transao com TEF, devero 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 "Carto", a forma "Carto" dever ser a ltima. 2) Procedimentos com falta de comunicao com o ECF 2.1) Se durante a impresso dos comprovantes do TEF, houver uma falta de comunicao com o ECF, a aplicao dever detectar esta falta e exibir a seguinte mensagem ao operador: "A impressora no responde. Deseja imprimir novamente?" 2.2) Se o operador optar por "Sim", a aplicao dever fechar o comprovante, abrir o relatrio gerencial e imprimir os comprovantes de todas as transaes; 2.3) Se o operador optar por "No", a aplicao dever enviar um NCN (No Confirmao) referente a ltima transao realizada e um CNC (Cancelamento) referente as demais transaes, pois estas haviam sido confirmadas anteriormente. 2.4) O CNC dever ser enviado para cada transao que foi confirmada respeitando a seguinte lgica: 2.4.1) A aplicao enviar um CNC para a primeira transao confirmada e imprimir o texto do "Intpos.001" de resposta (referente a este cancelamento), em um relatrio gerencial. 2.4.2) A aplicao enviar um CNF (Confirmao) confirmando este cancelamento e enviar o novo CNC para a outra transao confirmada, conforme citado acima. Este processo se aplicar para todas as transaes que existirem. Observao: A aplicao dever exibir uma mensagem ao operador com as seguintes informaes: "Nome da Rede" (bandeira), "NSU" e "Valor da Transao", para cada transao cancelada, incluindo a no confirmada. 2.5) Se durante a impresso dos comprovantes de cancelamento houver novamente uma falta

de comunicao com o ECF, o procedimento ser o mesmo do tem 2.1. 2.6) Se o operador optar por "Sim", a aplicao dever fechar o relatrio gerencial e abrir o novo, imprimindo todo o texto novamente. 2.7) Se o operador optar por "No", a aplicao dever enviar um NCN (No Confirmao) e novamente o CNC (Cancelamento) referente transao, imprimindo o texto do INTPOS.001 de resposta em um novo relatrio gerencial. 3) Procedimentos com queda de energia 3.1) Se durante a impresso dos comprovantes do TEF, houver uma queda de energia, a aplicao dever detectar esta queda, enviar um NCN (No Confirmao) para a ltima transao e um CNC (Cancelamento) para cada transao que havia sido confirmada anteriormente. 3.2) Se durante a impresso dos comprovantes do cancelamento houver uma queda de energia, a aplicao dever detectar esta queda, fechar o relatrio gerencial pendente, enviar o NCN (No Confirma) e novamente o CNC (Cancelamento) referente transao, imprimindo o texto do "Intpos.001" de resposta em um novo relatrio gerencial. 3.3) A aplicao dever enviar um CNF (Confirmao) aps cada impresso do comprovante de cancelamento. 4) Fluxo bsico de uma transao