Desculpa qq colocação absurda que tenha falado sobre CNF, pois não sabia que podia abrir um cupom não fiscal (rsrsrs )
Fiz o seguinte teste: Utilizando o TAcbrECF e o TAcbrTefD
ACBrTEF.MultiplosCartoes := False;
ACBrTEF.AutoEfetuarPagamento := False;
ACBrTEF.AutoFinalizarCupom := False;
ACBrECF.AbreNaoFiscal;
ACBrECF.RegistraItemNaoFiscal('03', 5, ''); // 03 indice cnf (recebimento da minha ecf) -- 5 é o valor
ACBrECF.SubtotalizaNaoFiscal;
// chama o pagamento via cartao do tef na moeda 04 no valor de 5 reais
if ACBrTEF.CRT( 5, '04', dmECF.ACBrECF.NumCOO ) then
begin
ACBrECF.EfetuaPagamentoNaoFiscal('04', 5); // efetua o pagamento nao fiscal com moeda 04 no valor de 5 reais
ACBrECF.FechaNaoFiscal; // fecha o cupom nao fiscal
ACBrTEF.ImprimirTransacoesPendentes; // imprimi as transacoes tef no vinculado
end
else
dmECF.ACBrECF.CancelaNaoFiscal; // cancela o cnf caso nao consiga fazer a transacao tef!!
agora tive que fazer uma modificação na parte do componente TAcbrTefD pois ele não conta com essa questão de recebimento não fiscal, fiz uma modificação simples (pode ser que precise fazer uma modicacao mais profunda para funcionar esses parametros MultiplosCartoes,AutoEfetuarPagamento,AutoFinalizarCupom, pois testei sem eles!!)
Unit:
ACBrTEFD
function TACBrTEFD.EstadoECF : AnsiChar;
Var
Retorno : String ;
begin
Retorno := ' ' ;
try
OnInfoEcf( ineEstadoECF, Retorno ) ;
except
On E : Exception do
raise EACBrTEFDECF.Create(E.Message);
end;
Result := upcase( padL(Retorno,1)[1] );
if not (Result in ['L','V','P','C','G','R','O','N']) then
raise EACBrTEFDECF.Create(
ACBrStr( 'Retorno de "OnInfoEcf( ineEstadoECF, Retorno )" deve ser:'+sLineBreak+
'"L" = Livre'+sLineBreak+
'"V" = Venda de Itens'+sLineBreak+
'"P" - Pagamento (ou SubTotal efetuado)'+sLineBreak+
'"C" ou "R" - CDC ou Cupom Vinculado'+sLineBreak+
'"G" ou "R" - Relatório Gerencial'+sLineBreak+
'"N" - Comprovante não fiscal'+sLineBreak+
'"O" - Outro' ) );
end;
Unit:
ACBrTEFDClass
Procedure TACBrTEFDClass.VerificarTransacaoPagamento(Valor : Double );
var
SaldoAPagar : Double ;
begin
Valor := RoundTo( Valor, -2);
if (Valor <= 0) then
raise Exception.Create( ACBrStr( 'Valor inválido' ) );
{ Lendo o SubTotal do ECF }
with TACBrTEFD(Owner) do
begin
if not (EstadoECF in ['V','P','N']) then
raise Exception.Create( ACBrStr('ECF deve estar em Venda ou Pagamento'));
SaldoAPagar := SubTotalECF ;
RespostasPendentes.SaldoAPagar := SaldoAPagar ;
if (Valor > RespostasPendentes.SaldoRestante ) then
raise Exception.Create( ACBrStr( 'Operação TEF deve ser igual ao '+
'Saldo a Pagar' ) );
if (not MultiplosCartoes) and (Valor < SaldoAPagar) then
raise Exception.Create(
ACBrStr( 'Multiplos Cartões não habilitado.' + sLineBreak +
'Valor da Operação TEF deve ser igual ao Saldo a Pagar' ) );
if MultiplosCartoes and (NumeroMaximoCartoes > 0) and // Tem multiplos Cartoes ?
(Valor <> RespostasPendentes.SaldoRestante) and // Valor é diferente do Saldo Restante a Pagar ?
((NumeroMaximoCartoes - RespostasPendentes.Count) <= 1) then // Está no último cartão ?
raise Exception.Create( ACBrStr( 'Multiplos Cartões Limitado a '+
IntToStr(NumeroMaximoCartoes)+' operações.'+sLineBreak+
'Esta Operação TEF deve ser igual ao Saldo a Pagar' ) );
end;
VerificaAtivo; { VisaNET exige um ATV antes de cada transação }
end;
E na minha apliacação
no evento: ACBrTEFInfoECF(Operacao: TACBrTEFDInfoECF; var RetornoECF: String);
do componente:
case Operacao of
ineEstadoECF:
begin
case dmECF.ACBrECF.Estado of
estLivre : RetornoECF := 'L';
estVenda : RetornoECF := 'V';
estPagamento : RetornoECF := 'P';
estRelatorio : RetornoECF := 'R';
estNaoFiscal : RetornoECF := 'N';
else
RetornoECF := 'O';
end;
end;
Será que alguem tem alguma sugestão ? será que essa modificações estão ok mesmo ?
Eu fiz o teste aqui e funcinou (como no exemplo acima)...
Espero ter ajudado alguem que passou pela mesma situação....