Bematech Software Partners

 
  • jan 02 2006

    Transferência Eletrônica de Fundos (T.E.F.) – Discado – Passo 8/10

    Tratando a situação de queda de energia

    Conforme mencionamos na passo anterior, nesta edição estaremos tratando a situação de queda de energia, quando ocorre durante a impressão da transação TEF e o quê 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 em Delphi e Visual Basic.

    - Exemplo em Delphi

    // Form Create
    procedure TfrmPrincipal.FormCreate(Sender: TObject);
    var iRetorno: integer;
    begin
       // Verifica se existe o arquivo TEF.TXT, indicando que há uma
       // transação pendente.
       if FileExists( ‘TEF.TXT’ ) then
          begin
            iRetorno := Bematech_FI_FechaComprovanteNaoFiscalVinculado;
            NaoConfirmaTransacao;
            if FileExists( ‘TEF.TXT’ ) then
              DeleteFile( ‘TEF.TXT’ );
          end;
    end;

    ////////////////////////////////////////////////////////////////////////////////
    // 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: string; cValorPago: string;
       cCOO: string; cIdentificacao: TDateTime ): boolean;
    var cLinhaArquivo, cLinha, cSaltaLinha, cConteudo: string;
        cMensagem: TForm;
        cArquivo : TextFile;
        iVezes : integer;
    begin

       // 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.
       AssignFile( cArquivo, ‘TEF.TXT’);
       ReWrite( cArquivo );
       CloseFile( cArquivo );

       // Bloqueia o teclado e o mouse para a impressão do TEF
       iRetorno := Bematech_FI_IniciaModoTEF();
       
       result := true;
        if FileExists( ‘IMPRIME.TXT’) then
           begin
             iRetorno := Bematech_FI_AbreComprovanteNaoFiscalVinculado( pchar(
                cFormaPGTO ), pchar( cValorPago ), pchar( cCOO ) );
             .
             .
             .

    ////////////////////////////////////////////////////////////////////////////////
    // 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: boolean;
    var cLinhaArquivo, cConteudo: string;
        cArquivo: TextFile;
        lFlag : longbool;
    begin
        cLinhaArquivo := ”;
        cConteudo := ”;
        AssignFile( cArquivo, ‘C:\TEF_DIAL\RESP\INTPOS.001′ );
        Reset( cArquivo );
        while not EOF( cArquivo ) do
           begin
              ReadLn( cArquivo, cLinhaArquivo );
              if ( copy( cLinhaArquivo, 1, 3 ) = ’001′ ) or
                 ( copy( cLinhaArquivo, 1, 3 ) = ’002′ ) or
                 ( copy( cLinhaArquivo, 1, 3 ) = ’010′ ) or
                 ( copy( cLinhaArquivo, 1, 3 ) = ’012′ ) or
                 ( copy( cLinhaArquivo, 1, 3 ) = ’027′ ) then
                 cConteudo := cConteudo + cLinhaArquivo + #13 + #10;
              if ( copy( cLinhaArquivo, 1, 3 ) = ’999′ ) then
                 cConteudo := cConteudo + cLinhaArquivo;
           end;
        CloseFile( cArquivo );
        cConteudo := ’000-000 = CNF’ + #13 + #10 + cConteudo;
        AssignFile( cArquivo, ‘INTPOS.001′ );
        ReWrite( cArquivo );
        WriteLn( cArquivo, cConteudo );
        CloseFile( cArquivo );
        CopyFile( pchar( ‘INTPOS.001′ ), pchar( ‘C:\TEF_DIAL\REQ\INTPOS.001′ ),
           lFlag );
        DeleteFile( ‘INTPOS.001′ );
        if ( FileExists( ‘C:\TEF_DIAL\RESP\INTPOS.STS’ ) ) then
           DeleteFile( ‘C:\TEF_DIAL\RESP\INTPOS.STS’ );
        if ( FileExists( ‘C:\TEF_DIAL\RESP\INTPOS.001′ ) ) then
           DeleteFile( ‘C:\TEF_DIAL\RESP\INTPOS.001′ );

        // Se o arquivo TEF.TXT, que identifica que houve uma transação impressa
        // existir, o mesmo será exluído.
        if ( FileExists( ‘TEF.TXT’ ) ) then
           DeleteFile( ‘TEF.TXT’ );
    end;

    ////////////////////////////////////////////////////////////////////////////////
    // Função: NaoConfirmaTransacao
    // Objetivo: Não Confirmar a Transação TEF
    // Parâmetros: não há
    // Retorno: True para OK ou False para não OK
    /
    ///////////////////////////////////////////////////////////////////////////////
    function NaoConfirmaTransacao: boolean;
    var cLinhaArquivo, cConteudo: string;
        cArquivo: TextFile;
        lFlag : longbool;
        cValor, cNomeRede, cNSU: string;
    begin
        cLinhaArquivo := ”;
        cConteudo := ”;
        AssignFile( cArquivo, ‘C:\TEF_DIAL\RESP\INTPOS.001′ );
        Reset( cArquivo );
        while not EOF( cArquivo ) do
           begin
              ReadLn( cArquivo, cLinhaArquivo );
              if ( copy( cLinhaArquivo, 1, 3 ) = ’001′ ) then
                 cConteudo := cConteudo + cLinhaArquivo + #13 + #10;
              if ( copy( cLinhaArquivo, 1, 3 ) = ’003′ ) then
                 cValor := copy( cLinhaArquivo, 11, Length( cLinhaArquivo ) – 10 );
              if ( copy( cLinhaArquivo, 1, 3 ) = ’010′ ) then
                 begin
                    cConteudo := cConteudo + cLinhaArquivo + #13 + #10;
                    cNomeRede := copy( cLinhaArquivo, 11, Length( cLinhaArquivo )
                       – 10 );
                 end;
              if ( copy( cLinhaArquivo, 1, 3 ) = ’012′ ) then
                 begin
                    cConteudo := cConteudo + cLinhaArquivo + #13 + #10;
                    cNSU := copy( cLinhaArquivo, 11, Length( cLinhaArquivo ) – 10 );
                 end;
              if ( copy( cLinhaArquivo, 1, 3 ) = ’027′ ) then
                 cConteudo := cConteudo + cLinhaArquivo + #13 + #10;
              if ( copy( cLinhaArquivo, 1, 3 ) = ’999′ ) then
                 cConteudo := cConteudo + cLinhaArquivo;
           end;
        CloseFile( cArquivo );
        cConteudo := ’000-000 = NCN’ + #13 + #10 + cConteudo;
        AssignFile( cArquivo, ‘INTPOS.001′ );
        ReWrite( cArquivo );
        WriteLn( cArquivo, cConteudo );
        CloseFile( cArquivo );
        CopyFile( pchar( ‘INTPOS.001′ ), pchar( ‘C:\TEF_DIAL\REQ\INTPOS.001′ ),
           lFlag );
        DeleteFile( ‘INTPOS.001′ );
        if ( FileExists( ‘C:\TEF_DIAL\RESP\INTPOS.STS’ ) ) then
           DeleteFile( ‘C:\TEF_DIAL\RESP\INTPOS.STS’ );
        if ( FileExists( ‘C:\TEF_DIAL\RESP\INTPOS.001′ ) ) then
           DeleteFile( ‘C:\TEF_DIAL\RESP\INTPOS.001′ );

        // Se o arquivo TEF.TXT, que identifica que houve uma transação impressa
        // existir, o mesmo será exluído.
        if ( FileExists( ‘TEF.TXT’ ) ) then
           DeleteFile( ‘TEF.TXT’ );

        Application.MessageBox( pchar( ‘Cancelada a Transação’ + #13 + #13 +
           ‘Rede: ‘ + cNomeRede + #13 + ‘Doc Nº: ‘ + cNSU + #13 + ‘Valor: ‘ +
           FormatFloat( ‘#,##0.00′, StrToFloat( cValor ) / 100 ) ), ‘Atenção’,
           MB_IconInformation + MB_OK );
    end;

    - 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
         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
     &
    nbsp;   iRetorno = Bematech_FI_AbreComprovanteNaoFiscalVinculado(cFormaPGTO, _
           cValorPago, cCOO)
         VerificaRetornoFuncaoImpressora (iRetorno)
       End If
       .
       .
       .

    ‘ 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
       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á
    ‘ 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 = ""
       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

    <
    /font>Boas implementações!

    Related posts:

    1. Edição 40 – Criando a primeira aplicação com o Eclipse Caro parceiro, Na edição 35 de nosso Flash Tip para...
    2. Transferência Eletrônica de Fundos (T.E.F.) – Discado – Passo 4/10 Confirmando uma transação TEF No passo anterior, realizamos uma venda...
    3. Edição 45 – Acessando periféricos Caro parceiro, Na edição 44 de nosso Flash Tip, criamos...
    4. Edição 52 – Agilizando a busca no retorno de status nas impressoras fiscais Bematech Prezado parceiro, Primeiramente, gostaríamos de desejar a você um excelente...
    5. Edição 72 – Cupom Mania e Portaria CAT-52 Caro Partner e Desenvolvedor,  Nesta edição de nosso Flash Tip,...

     

Nenhum Comentário

Deixe um comentário