Brasil | 0800 644 BEMA
 Procura
Clique para efetuar a procura
HomeProdutosServiçosSoluçõesSoftware PartnersAssistência TécnicaSuporteComo Comprar?
Software Partners
Torne-se um Software Partner
Partners em destaque
Pontuação Virtual
Catálogo de Partners
Flash News
FlashTIP
BemaCAST
Fórum Bematech
 
Suporte ao Desenvolvedor
Universidade Bematech
FAQ
Produtos
Fale Conosco
 
 
FlashTIP • 3 ª Edição • 19 de maio de 2005 pagina anterior

Transferência Eletrônica de Fundos (T.E.F.) - Discado

Passo 3/10 - Realizando uma venda com transação TEF

No Flash Tip 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.

- Exemplo em Delphi

procedure TfrmPrincipal.cmdVendaCupomTEFClick(Sender: TObject);
var cCodigoProduto, cDescricaoProduto, cAliquota, cTipoQtde, cQtde,
    cTipoDesconto, cValorItem, cValorDesconto, cAcrescimoDesconto,    cTipoAcrescimoDesconto, cValorAcrescimoDesconto, cFormaPGTO,
    cMSGPromocional, cValorPago, cNumeroCupom, cSaltaLinha: string;
    iTEF: integer;
    cIdentificacao: TDateTime;
begin
    // Abre Cupom Fiscal, Vende o Item e Fecha Cupom Fiscal.
    iRetorno := Bematech_FI_AbreCupom( pchar( '' ) );
    if ( VerificaRetornoFuncaoImpressora( iRetorno ) ) then
       begin
          cCodigoProduto := '1234567890123';
          cDescricaoProduto := 'Teste de Venda de Item...'; cAliquota := 'II';
          cTipoQtde := 'I'; cQtde := '1'; cValorItem := '1,00';
          cTipoDesconto := '%'; cValorDesconto := '00,00';
          iRetorno := Bematech_FI_VendeItem( pchar( cCodigoProduto ),
             pchar( cDescricaoProduto ), pchar( cAliquota ), pchar( cTipoQtde ),
             pchar( cQtde ), 2, pchar( cValorItem ), pchar( cTipoDesconto ),
             pchar( cValorDesconto ) );
if ( VerificaRetornoFuncaoImpressora( iRetorno ) ) then
             begin
                cAcrescimoDesconto := 'A'; cTipoAcrescimoDesconto := '%';
                cValorAcrescimoDesconto := '00,00';
                iRetorno := Bematech_FI_IniciaFechamentoCupom( pchar(
                   cAcrescimoDesconto ), pchar( cTipoAcrescimoDesconto ),
                   pchar( cValorAcrescimoDesconto ) );
                if ( VerificaRetornoFuncaoImpressora( iRetorno ) ) then
                   begin cFormaPGTO := 'Cartao Credito'; cValorPago := '1,00';
                      SetLength( cNumeroCupom, 6 );
                      iRetorno := Bematech_FI_NumeroCupom( cNumeroCupom );
                      VerificaRetornoFuncaoImpressora( iRetorno );
                      cIdentificacao := Time;
                      iTEF := RealizaTransacao( cIdentificacao, cNumeroCupom,
                         FormatFloat( cValorPago, 0 ) );
                         if ( iTEF = 1 ) then
                            begin
                               iRetorno := Bematech_FI_EfetuaFormaPagamento(
                                  pchar( cFormaPGTO ), pchar( cValorPago ) );
                               if (VerificaRetornoFuncaoImpressora(iRetorno)) then
                                  begin
                                     cMSGPromocional := 'Obrigado, volte
                                                          sempre !!!';
                                     iRetorno :=
                                        Bematech_FI_TerminaFechamentoCupom(
                                        pchar( cMSGPromocional ) );
                                     VerificaRetornoFuncaoImpressora( iRetorno );
                                     ImprimeTransacao( cFormaPGTO, cValorPago,
                                        cNumeroCupom, cIdentificacao );
                                  end;
                            end;
                         if ( iTEF = -1 ) then
                            Application.MessageBox( 'Gerencial Padrão não está
                                                     ativo !',
                               'Atenção', MB_IconError + MB_OK );
                         // 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
                            begin
                               cFormaPGTO := 'Dinheiro';
                               iRetorno := Bematech_FI_EfetuaFormaPagamento(pchar(
                                  cFormaPGTO ), pchar( cValorPago ) );
                               if (VerificaRetornoFuncaoImpressora(iRetorno)) then
                                  begin
                                     cMSGPromocional := 'Obrigado, volte
                                                         sempre !!!';
                                     iRetorno :=
                                        Bematech_FI_TerminaFechamentoCupom(
                                        pchar( cMSGPromocional ) );
                                     VerificaRetornoFuncaoImpressora( iRetorno );
                                  end;
                            end;
                   end;
             end;
       end;
end;

//////////////////////////////////////////////////////////
// Função: RealizaTransacao
// 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: TDateTime; cNumeroCupom : string;
    cValorPago: string ): integer;
var cConteudoArquivo, cLinhaArquivo, cLinha: string;
    cArquivo: TextFile; lFlag : longbool; iTentativas, iVezes: integer;
    cMensagem : TForm; bTransacao: boolean;
begin
    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' );
    AssignFile( cArquivo, 'INTPOS.001');
    // Conteúdo do arquivo INTPOS.001 para solicitar a transação TEF.
    cConteudoArquivo := '';
    cConteudoArquivo := '000-000 = CRT' + #13 + #10 + '001-000 = ' +
       FormatDateTime( 'hhmmss', cIdentificacao ) + #13 + #10 + '002-000 = ' +
       cNumeroCupom + #13 + #10 + '003-000 = ' + cValorPago + #13 + #10 +
       '999-999 = 0';
    ReWrite( cArquivo );
    WriteLn( cArquivo, cConteudoArquivo );
    CloseFile( cArquivo );
CopyFile( pchar( 'INTPOS.001' ), pchar( 'C:\TEF_DIAL\REQ\INTPOS.001' ),
       lFlag );
    DeleteFile( 'INTPOS.001' );
    if FileExists( 'IMPRIME.TXT') then
       DeleteFile( 'IMPRIME.TXT' );
    result := 1;
    for iTentativas := 1 to 7 do
       begin
       // Verifica se o Gerenciador Padrão recebeu o INTPOS.001 da solicitação.
       if ( FileExists( 'C:\TEF_DIAL\RESP\INTPOS.STS' ) ) then
          begin cLinhaArquivo := '';
cLinha := '';
             while True do
                begin
                // Verifica o arquivo INTPOS.001 de resposta.
                if FileExists( 'C:\TEF_DIAL\RESP\INTPOS.001' ) then
                   begin
                      AssignFile( cArquivo, 'C:\TEF_DIAL\RESP\INTPOS.001' );
                      Reset( cArquivo );
while not EOF( cArquivo ) do
                         begin
                            ReadLn( cArquivo, cLinhaArquivo );
                            // Verifica se o campo de identificação é o mesmo
                            // do solicitado.
                            if ( copy( cLinhaArquivo, 1, 3 ) = '001' ) and
                               ( copy( cLinhaArquivo, 11, Length(cLinhaArquivo)
                                  - 10 ) <> FormatDateTime( 'hhmmss',
                                  cIdentificacao ) ) then
                               begin
                                  result := 0;
                                  exit;
                               end;
                            // Verifica se a Transação foi Aprovada.
                            if ( copy( cLinhaArquivo, 1, 3 ) = '009' ) then
                               begin
                                  if ( copy( cLinhaArquivo, 11,
                                     Length( cLinhaArquivo ) - 10 ) ) = '0' then
                                     bTransacao := True;
                                  if ( copy( cLinhaArquivo, 11,
                                     Length( cLinhaArquivo ) - 10 ) ) <> '0' then
bTransacao := False;
                               end;
                            // Verifica se existem linhas para serem impressas.
                            if ( copy( cLinhaArquivo, 1, 3 ) = '028' ) then
                               begin
                                  if ( StrToInt( copy( cLinhaArquivo, 11,
                                     Length( cLinhaArquivo ) - 10 ) ) <> 0 ) and
                                     ( bTransacao = True ) then
                                     begin
                                        result := 1; // OK
                                        for iVezes := 1 to StrToInt( copy(
                                           cLinhaArquivo, 11, Length(
                                           cLinhaArquivo ) - 10 ) ) do
                                           begin
                                              ReadLn( cArquivo, cLinhaArquivo );
                                              // Verifica se o campo é 029 e
                                              // armazena as linhas que serão
                                              // impressas.
                                              if copy( cLinhaArquivo, 1, 3 )
                                                 = '029' then
                                                 cLinha := cLinha +
                                                 copy( cLinhaArquivo, 12,
                                                 Length( cLinhaArquivo ) - 12 ) +
                                                 #13 + #10;
                                           end;
                                     end;
                               end;
                            // Verifica se o campo é o 030 para mostrar a mensagem
                            // para o operador.
                            if ( copy( cLinhaArquivo, 1, 3 ) = '030' ) and
                               ( cLinha <> '' ) then
                               begin cMensagem := TForm.Create( Nil );
                                  with cMensagem do
                                     begin
                                        with TPanel.Create( Nil ) do
                                           begin
                                              Parent := cMensagem;
                                              Align := alClient;
                                              cMensagem.Font.Size := 15;
                                              Caption := copy( cLinhaArquivo, 11,
                                                 Length( cLinhaArquivo ) - 10 );
                                           end;
                                        BorderStyle := bsNone; Height := 129;
                                        Width := 370; Position := poScreenCenter;
                                        Show; Refresh; Sleep( 5000 ); Close;
                                        frmPrincipal.Refresh;
                                     end;
                               end;
                            if ( copy( cLinhaArquivo, 1, 3 ) = '030' ) and
                               ( cLinha = '' ) then
                               begin DeleteFile( 'C:\TEF_DIAL\REQ\INTPOS.001' );
                                  Application.MessageBox( pchar( copy(
                                  cLinhaArquivo, 11, Length( cLinhaArquivo )
                                  - 10 ) ), 'Atenção', MB_IconInformation +
                                  MB_OK );
                                  result := 0;
                               end;
                         end;
                         break;
                      end;
                end;
          // Cria o arquivo temporário IMPRIME.TXT com a imagem do comprovante.
          if ( cLinha <> '' ) then
             begin
                CloseFile( cArquivo );
                AssignFile( cArquivo, 'IMPRIME.TXT' );
                ReWrite( cArquivo );
                WriteLn( cArquivo, cLinha );
                CloseFile( cArquivo );
                Break;
             end;
       end;
       Sleep( 1000 );
       if ( iTentativas = 7 ) then
          begin
             CloseFile( cArquivo ); result := -1;  break;
          end;
       if ( result = 0 ) or ( result = -2 ) then
          begin
             CloseFile( cArquivo ); break;
          end;
       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
    // Bloqueia o teclado e o mouse para a impressão do TEF.
    iRetorno := Bematech_FI_IniciaModoTEF();
    if FileExists( 'IMPRIME.TXT') then
       begin
          iRetorno := Bematech_FI_AbreComprovanteNaoFiscalVinculado( pchar(
             cFormaPGTO ), pchar( cValorPago ), pchar( cCOO ) );
          VerificaRetornoFuncaoImpressora( iRetorno )
       end;
       AssignFile( cArquivo, 'IMPRIME.TXT' );
       begin
          Reset( cArquivo );
          cConteudo := ''; cLinha := '';
          while not EOF( cArquivo ) do
             begin
                ReadLn( cArquivo, cLinha );
                cConteudo := cConteudo + cLinha + #13 + #10;
                iRetorno := Bematech_FI_UsaComprovanteNaoFiscalVinculado( pchar(
                   cLinha ) + #13 );
                VerificaRetornoFuncaoImpressora( iRetorno );
                if EOF( cArquivo ) then
                   begin
                      cSaltaLinha := #13 + #10 + #13 + #10 + #13 + #10 +
                                     #13 + #10 + #13 + #10;
                      iRetorno := Bematech_FI_UsaComprovanteNaoFiscalVinculado(
                         pchar( cSaltaLinha) );
                      VerificaRetornoFuncaoImpressora( iRetorno );
                      cMensagem := TForm.Create( Nil );
                      with cMensagem do
                         begin
                            with TPanel.Create( Nil ) do
                               begin
                                  Parent := cMensagem; Align := alClient;
                                  cMensagem.Font.Size := 15; Caption := 'Por favor,
                                     destaque a 1ª Via';
                               end;
                            BorderStyle := bsNone; Height := 129; Width := 370;
                            Position := poScreenCenter; Show; Refresh;
                            Sleep( 5000 ); Close; frmPrincipal.Refresh;
                         end;
                      iRetorno := Bematech_FI_UsaComprovanteNaoFiscalVinculado(
                         pchar( cConteudo ) );
                      VerificaRetornoFuncaoImpressora( iRetorno );
                   end;
             end;
       end;
    // Desbloqeia o teclado e o mouse.
    iRetorno := Bematech_FI_FinalizaModoTEF();
    CloseFile( cArquivo ); DeleteFile( 'IMPRIME.TXT' );
    iRetorno := Bematech_FI_FechaComprovanteNaoFiscalVinculado();
    VerificaRetornoFuncaoImpressora( iRetorno );
end;

//////////////////////////////////////////////////////////
// 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: integer ): boolean;
var cMSGErro: string;
begin
    cMSGErro := '';
    result := False;
    case iRetorno of
       0: cMSGErro := 'Erro de Comunicação !';
       -1: cMSGErro := 'Erro de execução na Função !';
       -2: cMSGErro := 'Parâmetro inválido na Função !';
       -3: cMSGErro := 'Alíquota não Programada !';
       -4: cMSGErro := 'Arquivo BEMAFI32.INI não Encontrado !';
       -5: cMSGErro := 'Erro ao abrir a Porta de Comunicação !';
       -6: cMSGErro := 'Impressora Desligada ou Cabo de Comunicação Desconectado!';
       -7: cMSGErro := 'Código do Banco não encontrado no arquivo BEMAFI32.INI !';
       -8: cMSGErro := 'Erro ao criar arquivo STATUS.TXT ou RETORNO.TXT!';
       -27: cMSGErro := 'Status diferente de 6, 0, 0 !';
       -30: cMSGErro := 'Função incompatível com a impressora fiscal YANCO !';
    end;
    if ( cMSGErro <> '' ) then
       begin
          Application.MessageBox( pchar( cMSGErro ), 'Atenção', MB_IconError
             + MB_OK );
          result := False;
       end;
    cMSGErro := '';
    if ( iRetorno = 1 ) then
       begin
          Bematech_FI_RetornoImpressora( iACK, iST1, iST2 );
          if ( iACK = 21 ) then
             begin
                Application.MessageBox( 'A Impressora retornou NAK !' + #13 +
                   'Erro de Protocolo de Comunicação !', 'Atenção', MB_IconError +
                   MB_OK );
                result := False;
             end
          else
          if ( iST1 <> 0 ) or ( iST2 <> 0 ) then
             begin
                // Analisa ST1
                if ( iST1 >= 128 ) then
                   begin
                      iST1 := iST1 - 128;
                      cMSGErro := cMSGErro + 'Fim de Papel' + #13;
                   end;
                if ( iST1 >= 64 ) then
                   begin
                      iST1 := iST1 - 64;
                      cMSGErro := cMSGErro + 'Pouco Papel' + #13;
                   end;
                if ( iST1 >= 32 ) then
                   begin
                      iST1 := iST1 - 32;
                      cMSGErro := cMSGErro + 'Erro no Relógio' + #13;
                   end;
                if ( iST1 >= 16 ) then
                   begin iST1 := iST1 - 16;
                      cMSGErro := cMSGErro + 'Impressora em Erro' + #13;
                   end;
                if ( iST1 >= 8 ) then
                   begin
                      iST1 := iST1 - 8;
                      cMSGErro := cMSGErro + 'Primeiro Dado do Comando não foi ESC'
                         + #13;
                   end;
                if iST1 >= 4 then
                   begin
                      iST1 := iST1 - 4;
                      cMSGErro := cMSGErro + 'Comando Inexistente' + #13;
                   end;
                if iST1 >= 2 then
                   begin
                      iST1 := iST1 - 2;
                      cMSGErro := cMSGErro + 'Cupom Fiscal Aberto' + #13;
                   end;
                if iST1 >= 1 then
                   begin
                      iST1 := iST1 - 1;
                      cMSGErro := cMSGErro + 'Número de Parâmetros Inválidos' + #13;
                   end;
                // Analisa ST2
                if iST2 >= 128 then
                   begin
                      iST2 := iST2 - 128;
                      cMSGErro := cMSGErro + 'Tipo de Parâmetro de Comando Inválido'
                      + #13;
                   end;
                if iST2 >= 64 then
                   begin iST2 := iST2 - 64;
                      cMSGErro := cMSGErro + 'Memória Fiscal Lotada' + #13;
                   end;
                if iST2 >= 32 then
                   begin
                      iST2 := iST2 - 32;
                      cMSGErro := cMSGErro + 'Erro na CMOS' + #13;
                   end;
                if iST2 >= 16 then
                   begin
                      iST2 := iST2 - 16;
                      cMSGErro := cMSGErro + 'Alíquota não Programada' + #13;
                   end;
                if iST2 >= 8 then
                   begin iST2 := iST2 - 8;
                      cMSGErro := cMSGErro + 'Capacidade de Alíquota Programáveis
                         Lotada' + #13;
                   end;
                if iST2 >= 4 then
                   begin
                      iST2 := iST2 - 4;
                      cMSGErro := cMSGErro + 'Cancelamento não permitido' + #13;
                   end;
                if iST2 >= 2 then
                   begin iST2 := iST2 - 2;
                      cMSGErro := cMSGErro + 'CGC/IE do Proprietário não
                         Programados' + #13;
                   end;
                if iST2 >= 1 then
                   begin iST2 := iST2 - 1;
                      cMSGErro := cMSGErro + 'Comando não executado' + #13;
                   end;
                if ( cMSGErro <> '' ) then
                   begin
                      Application.MessageBox( pchar( cMSGErro ), 'Atenção',
                         MB_IconError + MB_OK );
                      result := False;
                   end;
             end
          else
             result := True;
       end;
end;

- 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
' 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
                   ' 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
       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
          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
    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
                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

 



 
Enviar para um amigo Enviar para um amigo Imprimir este artigo Listar Flash News pagina anterior


Copyright © Bematech Ind. e Com. de Equipamentos Eletrônicos S/A