Business - Automação Comercial

Realizando a primeira transação TEF

Agora que já conhecemos um pouco sobre a classe TEF e seus respectivos métodos/propriedades e já implementamos uma rotina simples de verificação do Gerenciador Padrão, vamos implementar nesta edição, um cupom fiscal completo e executar transações TEF com um ou múltiplos cartões.

por Andre Schikovski



Agora que já conhecemos um pouco sobre a classe TEF e seus respectivos métodos/propriedades (Flash-Tip edição 28) e já implementamos uma rotina simples de verificação do Gerenciador Padrão (Flash-Tip edição 30), vamos implementar nesta edição, um cupom fiscal completo e executar transações TEF com um ou múltiplos cartões.

Nosso primeiro passo será adicionar as referências necessárias do Flash Builder ao projeto para impressão do comprovante fiscal e também para as transações TEF.

- em C#

using Bematech;
using Bematech.Fiscal;
using Bematech.Fiscal.ECF;
using Bematech.Fiscal.ECF.CupomFiscal;
using Bematech.Fiscal.TEF
;

- em VB.NET

Imports Bematech
Imports Bematech.Fiscal
Imports Bematech.Fiscal.ECF
Imports Bematech.Fiscal.ECF.CupomFiscal
Imports Bematech.Fiscal.TEF

Agora que temos as referências adicionadas, vamos inserir em um formulário os seguintes objetos:

Object
Name
Text
GroupBox - Comandos Cupom Fiscal
GroupBox - Comandos TEF
Button btnabrecupom ABRE CUPOM FISCAL
Button btnvendeitem VENDE ITEM
Button btniniciafechamento INICIA FECHAMENTO
Button btnefetuapagamento EFETUAR FORMA PAGAMENTO
Button btnfecharcupom FECHAR CUPOM FISCAL
Button btnimprimetef IMPRIME COMPROVANTE TEF
Label - Forma Pagamento
Label - Valor Pago

Abaixo, um exemplo de como ficará nosso formulário:

Detalhe: Como já temos nosso objeto fiscal criado no projeto, com o nome "BematechFiscal", não precisamos construí-lo novamente, basta usarmos durante todo o desenvolvimento.

Abertura do cupom fiscal

Agora, vamos implementar o código do botão "btnabrecupom" para a abertura do cupom fiscal.

- em C#

private void btnabrecupom_Click(object sender, EventArgs e)
{
try
{
// ABERTURA DO CUPOM FISCAL COM A IDENTIFICAÇÃO DO CLIENTE (CPF,NOME,ENDEREÇO),
// DENTRO DE UMA ESTRUTURA TRY/CATCH ONDE OS ERROS SERÃO TRATADOS PELA
// EXCEPTION FISCAL.
BematechFiscal.Cupom.Abrir("00000000000", "Suporte Desenvolvedor", "");
}
catch (FiscalException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
}

- em VB.NET

Private Sub btnabrecupom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnabrecupom.Click

" ABERTURA DO CUPOM FISCAL COM A IDENTIFICAÇÃO DO CLIENTE (CPF,NOME,ENDEREÇO),
" DENTRO DE UMA ESTRUTURA TRY/CATCH ONDE OS ERROS SERÃO TRATADOS PELA
" EXCEPTION FISCAL.
Try
BematechFiscal.Cupom.Abrir("00000000000", "Suporte Desenvolvedor Bematech", "")
Catch MensagemErro As FiscalException
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End Sub

Note que no exemplo optamos por utilizar um dos overloads do Cupom que possui 3 parâmetros, sendo eles CPF/CNPJ do cliente, nome e endereço. Se usássemos uma impressora fiscal que não permitisse a entrada destes parâmetros, o próprio Flash Bulder se encarregaria de compatibilizar, usando apenas o parâmetro aceitável.

Venda de itens

Abrimos o botão "btnvendeitem" e implementamos o código da venda do item. Vamos criar um objeto do tipo "ItemExtendido" e popular este objeto com os parâmetros correspondentes. Lembrando que este tipo de objeto permite várias entradas de parâmetros, igual a função Bematech_FI_VendeItemDepartamento que temos em nossa BemaFI32.dll, como por exemplo, o código e descrição do item com até 49 e até 200 caracteres respectivamente, além da entrada de unidade de medida.

- em C#

private void btnvendeitem_Click(object sender, EventArgs e)
{
try
{
// CRIAÇÃO DO OBJETO ITEMEXTENDIDO, POPULANDO O MESMO COM AS INFORMAÇÕES REFERENTES
// AO ITEM A SER IMPRESSO.
ItemExtendido itemvendidoex = new ItemExtendido();
itemvendidoex.Codigo = "000000000000000";
itemvendidoex.Descricao = "Produto de teste";
itemvendidoex.Aliquota = "II";
itemvendidoex.Quantidade = 1;
itemvendidoex.ValorUnitario = 1.00M;

BematechFiscal.Cupom.Vender(itemvendidoex);
}
catch (FiscalException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
}

- em VB.NET

Private Sub btnvendeitem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnvendeitem.Click
Try
" CRIAÇÃO DO OBJETO ITEMEXTENDIDO, POPULANDO O MESMO COM AS INFORMAÇÕES REFERENTES
" AO ITEM A SER IMPRESSO.
Dim itemvendidoex As Item = New ItemExtendido
itemvendidoex.Codigo = "00000000000000000000"
itemvendidoex.Descricao = "Produto de teste Bematech"
itemvendidoex.Aliquota = "II"
itemvendidoex.Quantidade = 1
itemvendidoex.ValorUnitario = 1.0

BematechFiscal.Cupom.Vender(itemvendidoex)
Catch MensagemErro As Exception
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End Sub

Inicia fechamento do cupom fiscal

Agora que temos as rotinas de abertura do cupom fiscal e a venda de item prontas, é hora de começar a finalizar o cupom fiscal, através do botão "btniniciafechamento".

- em C#

private void btniniciafechamento_Click(object sender, EventArgs e)
{
try
{
// INÍCIO DO FECHAMENTO DO CUPOM FISCAL (SEM VALORES DE ACRÉSCIMO OU DESCONTO).
BematechFiscal.Cupom.IniciarFechamento(TipoAcrescimoDesconto.Valor, 0.00M, 0.00M);
}
catch (FiscalException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
}

- em VB.NET

Private Sub btninciafechamento_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btninciafechamento.Click
Try
" INÍCIO DO FECHAMENTO DO CUPOM FISCAL (SEM PARÂMETROS DE ACRÉSCIMO OU DESCONTO)
BematechFiscal.Cupom.IniciarFechamento(TipoAcrescimoDesconto.Valor, 0, 0)
Catch MensagemErro As Exception
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End Sub

Note que neste código, os parâmetros de acréscimo e desconto foram passados com valores zerados.

Efetuar Forma de pagamento

Com o fechamento do cupom fiscal iniciado, vamos lançar as formas de pagamento no botão "btnefetuapagamento".

- em C#

private void btnefetuapagamento_Click(object sender, EventArgs e)
{
try
{
// MÉTODO PARA EXECUÇÃO DA FORMA DE PAGAMENTO QUANDO NÃO UTILIZARMOS
// A OPERAÇÃO DE "Cartao".
if (txtdescforma.Text != "Cartao")
{
BematechFiscal.Cupom.EfetuarPagamento(txtdescforma.Text, Convert.ToDecimal(txtvalorforma.Text));
}
else
{
// MÉTODO PARA CRIAÇÃO DA CHAMADA AO MÓDULO DA BANDEIRA,
// PARA EXECUÇÃO DA TRANSAÇÃO TEF.
SolicitacaoCartao minhasolicitacaocartao;
minhasolicitacaocartao = BematechFiscal.TEF.CriarSolicitacaoCartao(txtdescforma.Text, Convert.ToDecimal(txtvalorforma.Text));
// MÉTODO PARA ENVIO DA SOLICITAÇÃO (CRIAÇÃO DO OBJETO ENVIAR SOLICITAÇÃO)
// E ENVIO AO GP.
Transacao minhatransacao = BematechFiscal.TEF.EnviarSolicitacao(minhasolicitacaocartao);
if (minhatransacao.Status != "0")
{
MessageBox.Show(minhatransacao.TextoOperador);
return;
}
else
{
MessageBox.Show(minhatransacao.TextoOperador);
}
// EXECUÇÃO DA FORMA DE PAGAMENTO NA IMPRESSORA FISCAL.
BematechFiscal.Cupom.EfetuarPagamento(txtdescforma.Text, Convert.ToDecimal(txtvalorforma.Text));
while (true)
{
try
{
// CRIAÇÃO DO OBJETO MINHASOLICITACAOCONFIRMACAO PARA INICIAR A
// CONFIRMAÇÃO DAS TRANSAÇÕES TEF EFETUADAS.
SolicitacaoConfirmacao minhasolicitacaoconfirmacao = BematechFiscal.TEF.CriarSolicitacaoConfirmacao();
BematechFiscal.TEF.ConfirmarTransacao(minhasolicitacaoconfirmacao);
break;
}
catch (TEFException ErroTEF)
{
MessageBox.Show(ErroTEF.Message);
}
}
}
}
catch (FiscalException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
catch (GerenciadorInativoException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
}

- em VB.NET

Private Sub btnefetuapagamento_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnefetuapagamento.Click
Try
" MÉTODO PARA EXECUÇÃO DA FORMA DE PAGAMENTO QUANDO NÃO UTILIZARMOS
" A OPÇÃO DE "Cartao".
If (txtdescforma.Text <> "Cartao") Then
BematechFiscal.Cupom.EfetuarPagamento(txtdescforma.Text, Convert.ToDecimal(txtvalorforma.Text))
Else
" MÉTODO PARA CRIAÇÃO DA CHAMADA AO MÓDULO DA BANDEIRA,
" PARA EXECUÇÃO DA TRANSAÇÃO TEF
Dim minhasolicitacaocartao As SolicitacaoCartao = BematechFiscal.TEF.CriarSolicitacaoCartao(txtdescforma.Text, Convert.ToDecimal(txtvalorforma.Text))
" MÉTODO PARA ENVIO DA SOLICITAÇÃO (CRIAÇÃO DO OBJETO ENVIAR SOLICITAÇÃO)
" E ENVIO AO GP
Dim minhatransacao As Transacao = BematechFiscal.TEF.EnviarSolicitacao(minhasolicitacaocartao)
If (minhatransacao.Status <> "0") Then
MessageBox.Show(minhatransacao.TextoOperador)
Return
Else
MessageBox.Show(minhatransacao.TextoOperador)
End If
" EXECUÇÃO DA FORMA DE PAGAMENTO NA IMPRESSORA FISCAL
BematechFiscal.Cupom.EfetuarPagamento(txtdescforma.Text, Convert.ToDecimal(txtvalorforma.Text))
While (True)
Try
" CRIAÇÃO DO OBJETO MINHASOLICITACAOCONFIRMACAO PARA INICIAR A CONFIRMACÃO
" DAS TRANSAÇÕES TEF EFETUADAS
Dim minhasolicitacaoconfirmacao As SolicitacaoConfirmacao = BematechFiscal.TEF.CriarSolicitacaoConfirmacao()
BematechFiscal.TEF.ConfirmarTransacao(minhasolicitacaoconfirmacao)
Exit While
Catch MensagemErro As TEFException
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End While
End If
Catch MensagemErro As FiscalException
MsgBox("MensagemErro: " + MensagemErro.Message)
Catch MensagemErro As GerenciadorInativoException
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End Sub

Note que a rotina foi desenvolvimenta para suportar um processo de venda com múltiplas formas de pagamento e também múltiplas transações TEF.

Detalhe: No exemplo, vamos fazer a impressão da forma de pagamento usando somente a descrição "Cartao", então o primeiro trecho da nossa rotina vai efetuar o pagamento usando qualquer forma de pagamento que não seja vinculada ao TEF. No segundo trecho da rotina, vamos executar uma solicitação de chamada ao módulo da bandeira, através do objeto "minhasolicitacaocartao", e também o envio da solicitação usando o objeto "minhatransacao". As imagens abaixo mostram a execução da forma de pagamento e também a tela do GP ativo.

Vale lembrar que toda a estrutura de execução das formas de pagamento e transações com o GP, estão dentro de um tratamento "Try/Catch", onde qualquer erro será tratado pelas exceptions: FiscalException e GerenciadorInativoException.

Depois de concluirmos nossa transação TEF, o Flash Builder irá tratar o retorno da bandeira (arquivo INTPOS.001). Note em nosso código que no momento do envio da transação analisamos seu status, e caso ocorra algum problema, exibimos para o operador a mensagem relacionada ao campo 30 do INTPOS.001, tudo isso automaticamente pelo Flash Builder.

Ainda dentro da rotina de execução das formas de pagamento, estamos confirmando as transações TEF efetuadas. Para isso, dentro de um laço de repetição (While (true)) criamos um objeto do tipo minhasolicitacaoconfirmacao, que tem a função de verificar e confirmar todas as transações TEF executadas.

Vamos finalizar o cupom fiscal através do botão "btnfecharcupom", antes da impressão do TEF.

- em C#

private void btnfecharcupom_Click(object sender, EventArgs e)
// TERMINAR FECHAMENTO DO CUPOM FISCAL.
{
try
{
BematechFiscal.Cupom.TerminarFechamento("Obrigado Volte Sempre!");
}
catch (FiscalException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
}

- em VB.NET

Private Sub btnfecharcupom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnfecharcupom.Click
"TERMINAR FECHAMENTO DO CUPOM FISCAL.
Try
BematechFiscal.Cupom.TerminarFechamento("Obrigado Volte Sempre!")
Catch MensagemErro As Exception
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End Sub

Definimos no método "TerminarFechamento" a impressão de uma mensagem promocional como parâmetro único. Esta mensagem pode conter até 08 linhas de 40 colunas.

Com o nosso cupom fiscal já finalizado e nossas transações efetuadas e confirmadas, chegou a hora de imprimir os comprovantes vinculados do TEF.

Vale salientar que aqui estamos populando uma variável chamada "minhacolecao" do tipo "Transacoes" com as transações efetuadas anteriormente, pois iremos usar essa variável mais adiante no processo de cancelamento do TEF para o próximo Flash Tip, explicando melhor a necessidade de armazenar nossa coleção de transações em uma variável pública, lembrando que essa variável é declarada na sessão "Public Class" do projeto, na mesma área onde criamos o objeto "BematechFiscal".

Chegou a hora de imprimir o comprovante vinculado (Comprovante de Crédito e Débito), dentro do botão "btnimprimetef".

- em C#

private void btnimprimetef_Click(object sender, EventArgs e)
{
try
{
// VARIÁVEL PARA ARMAZENAR AS TRANSAÇÕES EXECUTADAS
// (SERÃO USADA NO CANCELAMENTO DE TRANSAÇÕES TEF)
minhacolecao = BematechFiscal.TEF.Transacoes;

// ACIONAR TRAVAMENTO DO TECLADO E MOUSE.
BematechFiscal.TEF.TravarTeclado(true);

// CONTADOR PARA A IMPRESSÃO DA COLEÇÃO DE TRANSAÇÕES CRIADAS
// (MÚLTIPLOS CARTÕES, POR EXEMPLO).
for (int conta = 0; conta < BematechFiscal.TEF.Transacoes.Count; conta++)
{
try
{
BematechFiscal.TEF.Imprimir(BematechFiscal.TEF.Transacoes[conta], false);
}
catch
{
BematechFiscal.TEF.TravarTeclado(false);
if (MessageBox.Show("Impressora nãoo responde. Tentar imprimir Novamente?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
BematechFiscal.TEF.Imprimir(BematechFiscal.TEF.Transacoes[conta], true);
BematechFiscal.TEF.TravarTeclado(false);
}
else
{
// QUANDO A REIMPRESSÃO NÃO É ACEITA PELO OPERADOR (NÃO CONFIRMAÇÃO).
SolicitacaoNaoConfirmacao naoconfirmacao = BematechFiscal.TEF.CriarSolicitacaoNaoConfirmacao();
BematechFiscal.TEF.NaoConfirmarTransacao(naoconfirmacao);
break;
}
}
}
BematechFiscal.TEF.ClearTransacoes();
BematechFiscal.TEF.TravarTeclado(false);
}
catch (TEFException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
catch (FiscalException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
}

- em VB.NET

Private Sub btnimprimetef_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnimprimetef.Click
Dim conta As Integer
Try

" VARIÁVEL PARA ARMAZENAR AS TRANSAÇÕES EXECUTADAS
"(SERÁ USADA NO CANCELAMENTO DE TRANSAÇÕES TEF)
minhacolecao = BematechFiscal.TEF.Transacoes

" ACIONAR O TRAVAMENTO DO TECLADO E DO MOUSE
BematechFiscal.TEF.TravarTeclado(True)
" CONTADOR PARA IMPRESSÃO DA COLEÇÃO DE TRANSAÇÕES CRIADAS (EX: VENDAS COM
" MULTIPLOS CARTÕES)
For conta = 1 To BematechFiscal.TEF.Transacoes.Count()
Try
BematechFiscal.TEF.Imprimir(BematechFiscal.TEF.Transacoes(conta - 1), False)
Catch
BematechFiscal.TEF.TravarTeclado(False)
If (MessageBox.Show("Impressora não responde! Imprimir Novamente?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Yes) Then
BematechFiscal.TEF.Imprimir(BematechFiscal.TEF.Transacoes(conta), True)
BematechFiscal.TEF.TravarTeclado(True)
Else
" QUANDO A REIMPRESSÃO NÃO É ACEITA PELO OPERADOR (NÃO CONFIRMAÇÃO).
Dim naoconfirmacao As SolicitacaoNaoConfirmacao = BematechFiscal.TEF.CriarSolicitacaoNaoConfirmacao()
BematechFiscal.TEF.NaoConfirmarTransacao(naoconfirmacao)
Exit For
End If
BematechFiscal.TEF.TravarTeclado(False)
End Try
Next
BematechFiscal.TEF.ClearTransacoes()
BematechFiscal.TEF.TravarTeclado(False)
Catch MensagemErro As FiscalException
MsgBox("MensagemErro: " + MensagemErro.Message)
Catch MensagemErro As GerenciadorInativoException
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End Sub

Nesta rotina, implementamos inicialmente uma exigência das homologadoras que é o travamento do teclado e do mouse durante a impressão do comprovante TEF.

Criamos um contador (conta) que incrementa todas as transações TEF pendentes de impressão (comprovantes vinculados ou gerenciais no caso de reimpressão). Após o término da impressão dos comprovantes vinculados, podemos ver que o teclado e o mouse são destravados (BematechFiscal.Tef.TravarTeclado(false)), se a impressão ocorrer com sucesso a rotina é finalizada, porém se houve algum problema de queda de energia, ou qualquer outro que trave a impressão dos comprovantes vinculados, é possível reimprimi-los mudamos o valor de um parâmetro do método Imprimir, conforme detalhado abaixo:

(...)
BematechFiscal.TEF.Imprimir(impfiscal.TEF.Transacoes[conta], false);
(...)

Onde "false" indica que a impressão do TEF será em um comprovante não fiscal vinculado (Comprovante de Crédito e Débito) e "true" será em um relatório gerencial.

Nos nossos exemplos, criamos uma condição para esta situação onde qualquer erro de impressão que ocorrer no comprovante não fiscal vinculado, irá emitir uma mensagem na tela do usuário solicitando a reimpressão dos comprovantes que será executada dentro dos relatórios gerenciais.

Como a confirmação das transações já foi efetuada no botão "btnefetuapagamento" nenhum comprovante TEF fica pendente de impressão. Então, podemos executar o método "ClearTransacoes" para limpar todas as transações e evitar que ocorram falhas de impressão, finalizando a operação do TEF.

Importante: Lembre que em nosso exemplo, estamos apenas conhecendo a classe TEF e seus métodos separadamente, portanto não estamos aplicando a regra do roteiro de implementação do TEF fornecido pelas empresas homologadoras.

Andre Schikovski

Andre Schikovski