Business - Automação Comercial

Cancelando a transação TEF

Após implementarmos as nossas rotinas de cupom fiscal e transações TEF, chegou a hora de conhecermos como realizar um cancelamento da transação.

por Andre Schikovski



Após implementarmos as nossas rotinas de cupom fiscal e transações TEF, chegou a hora de conhecermos como realizar um cancelamento da transação. Esta operação também é uma das exigidas no roteiro de implementação do TEF fornecido pelas empresas homologadoras, por isso vamos conhecê-la.

Então, em nosso formulário vamos adicionar um botão com o texto "CANCELAR TRANSAÇÃO TEF" e o name "btncancelartransacoestef", conforme ilustrado abaixo:

Conforme a edição 34 do Flash Tip, na nossa rotina de impressão dos comprovantes TEF criamos um objeto público chamado "minhacolecao" e nele armazenamos toda a coleção de transações efetuadas. Isso se fez necessário, pois ao final da impressão e confirmação das transações usamos o método "ClearTransacoes" que faz a limpeza das transações realizadas, preparando a classe TEF para as novas transações.

Recordando a rotina...

- em C#

public partial class frmtef : Form
{
// CRIAÇÃO DA VARIÁVEL MINHACOLECAO PARA RECEBER OS CONTADORES DE
// TRANSAÇÕES EXECUTADAS.

Transacoes minhacolecao;
(...)

- em VB.NET

Public Class frmtef
" CRIAÇÃO DA VARIÁVEL MINHACOLECAO PARA RECEBER OS CONTADORES DE
" TRANSAÇÕES EXECUTADAS.

Public minhacolecao As Transacoes
(...)

Então, antes do início da impressão dos comprovantes do TEF, esse objeto é populado com as transações realizadas, conforme podemos ver nas imagens abaixo, retiradas na execução do cancelamento.

- em C#

- em VB.NET

O objeto "minhacolecao" possui 2 comprovantes gravados, indicando que nossa transação TEF é de múltiplos cartões.

Agora que sabemos como o objeto "minhacolecao" é declarado e utilizado, vamos analisar nosso código do cancelamento:

- em C#

private void btncancelartransacaotef_Click(object sender, EventArgs e)
{
for (int conta = 0; conta < minhacolecao.Count; conta++)
{
while (true)
{
try
{
SolicitacaoCancelamento cancelamentotef = BematechFiscal.TEF.CriarSolicitacaoCancelamento(minhacolecao[conta]);
Transacao minhatransacaocancelamento = BematechFiscal.TEF.CancelarTransacao(cancelamentotef);
if (minhatransacaocancelamento.Status == "0")
{
try
{
BematechFiscal.TEF.TravarTeclado(true);
BematechFiscal.TEF.Imprimir(BematechFiscal.TEF.Transacoes[0], true);
}
catch
{
BematechFiscal.TEF.TravarTeclado(false);
if (MessageBox.Show("Impressora não 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
{
break;
}
}
}
else
{
MessageBox.Show(minhatransacaocancelamento.TextoOperador);
}
BematechFiscal.TEF.TravarTeclado(false);
break;
}
catch (TEFException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
catch (FiscalException MensagemErro)
{
MessageBox.Show("MensagemErro: " + MensagemErro.Message);
}
}
SolicitacaoConfirmacao cancelamentoconfirmacao = BematechFiscal.TEF.CriarSolicitacaoConfirmacao();
BematechFiscal.TEF.ConfirmarTransacao(cancelamentoconfirmacao);
}
BematechFiscal.TEF.TravarTeclado(false);
BematechFiscal.TEF.ClearTransacoes();
}

- em VB.NET

Private Sub btncancelartransacoestef_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncancelartransacoestef.Click
Dim conta As Integer
Try
For conta = 1 To minhacolecao.Count()
Try
Dim cancelamentotef As SolicitacaoCancelamento = BematechFiscal.TEF.CriarSolicitacaoCancelamento(minhacolecao(conta - 1))
Dim minhatransacaocancelamento As Transacao = BematechFiscal.TEF.CancelarTransacao(cancelamentotef)
If (minhatransacaocancelamento.Status = "0") Then
Try
BematechFiscal.TEF.TravarTeclado(True)
BematechFiscal.TEF.Imprimir(BematechFiscal.TEF.Transacoes(0), True)
Catch
BematechFiscal.TEF.TravarTeclado(False)
If MessageBox.Show("Impressora não responde. Tentar imprimir novamente?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Yes Then
BematechFiscal.TEF.Imprimir(BematechFiscal.TEF.Transacoes(0), True)
BematechFiscal.TEF.TravarTeclado(True)
Else
End
End If
End Try
Else
MessageBox.Show(minhatransacaocancelamento.TextoOperador)
End
End If
BematechFiscal.TEF.TravarTeclado(False)
Catch MensagemErro As FiscalException
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
Dim cancelamentoconfirmacao As SolicitacaoConfirmacao = BematechFiscal.TEF.CriarSolicitacaoConfirmacao()
BematechFiscal.TEF.ConfirmarTransacao(cancelamentoconfirmacao)
BematechFiscal.TEF.TravarTeclado(False)
Next
BematechFiscal.TEF.ClearTransacoes()
Catch MensagemErro As FiscalException
MsgBox("MensagemErro: " + MensagemErro.Message)
End Try
End Sub

Esta rotina de cancelamento irá acionar o módulo administrativo da bandeira (nos testes usamos a bandeira American Express). Na janela da bandeira que será exibida, informamos a senha e após confirmá-la o arquivo INTPOS.001 é criado com o texto do cancelamento. Nossa rotina irá fazer a impressão dos comprovantes de cancelamento e também a confirmação dos mesmos.

Em nosso código temos um contador (conta), usado para percorrer as transações. Neste caso específico, enquanto o valor do contador não se igualar ao "Count" do objeto "minhacolecao", significa que ainda existem comprovantes pendentes para o cancelamento.

O próximo passo é a criação de dois objetos: o primeiro do tipo SolicitacaoCancelamento (objeto cancelamentotef), e o segundo do tipo Transacao (objeto minhatransacaocancelamento) que será responsável pelo envio da transação ao GP (Gerenciado Padrão).

Em seguida, montamos a rotina de impressão dos comprovantes de cancelamento. Podemos verificar a semelhança entre esta impressão com as do comprovante vinculado após a venda, onde é necessário inicialmente travar o teclado para a impressão. Note também que dentro da estrutura "try/catch", estamos tratando a reimpressão dos comprovantes, caso ocorra algum erro (ex: queda de energia).

No caso de uma transação de múltiplos cartões, após a impressão do primeiro comprovante de cancelamento, precisamos confirmar essa transação através da classe SolicitacaoConfirmacao com o objeto criado "cancelamentoconfirmacao".

Após a impressão do primeiro comprovante, o laço "While True" ainda terá um comprovante pendente, e um novo processo de impressão irá ocorrer.

Ao final da impressão de todos os comprovantes de cancelamento, destravamos o teclado e executamos o método "ClearTransacoes" que vai limpar todas as transações de cancelamento realizadas.

Andre Schikovski

Andre Schikovski