Business - Automação Comercial
Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 3/10 - Realizando uma venda com transação TEF
Nesta parte do artigo, iremos fazer a nossa primeira venda de cupom fiscal, com pagamento em cartão e realizar a transação TEF.
por André Luiz R. MunhozNo artigo passado, iniciamos a nossa primeira comunicação com o
Gerenciador Padrão, através de uma função onde era verificado se o mesmo estava
ativo, antes de uma transação TEF.
Nesta edição, iremos fazer a nossa
primeira venda de cupom fiscal, com pagamento em cartão e realizar a transação
TEF.
No código abaixo, estaremos utilizando as funções de impressão do cupom
fiscal, tratando o retorno da impressora e realizando a solicitação da transação
TEF, com impressão do comprovante. As funções utilizadas, neste código,
são:
- Bematech_FI_AbreCupom
- Bematech_FI_VendeItem
-
Bematech_FI_IniciaFechamentoCupom
- Bematech_FI_EfetuaFormaPagamento
-
Bematech_FI_TerminaFechamentoCupom
- 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); |
- 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 |
- DarumaFramework.SO no LinuxAutomação Comercial
- Palavra de status da impressora na DarumaFrameworkAutomação Comercial
- TEF – Comprovante de Crédito ou DébitoAutomação Comercial
- Comunicar com equipamentos Daruma em linguagens 16bits e DOSAutomação Comercial
- Verificando Redução Z nas Impressoras DarumaAutomação Comercial