-
Total de ítens
10 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Posts postados por Felipe Sachetti
-
-
cliente relatou que ao chamar ObterDadoPinPad(), obtinha o retorno TEMPO DE ESPERA INVALIDO
apos alguns testes e contato com suporte sitef, identificamos que o parametro 2970 na chama abaixo tem que ser informado em segundos.
o padrao da funcao esta em 30000 e esta sendo dividido por 100 dando 300 segundos e retornando o erro..
nao consegui identificar alteracoes no arquivo, entao, pode ser que tenham mudado algo internamente na sitef..
com valores mais baixos esta funcionando...
acredito que uma melhoria seria diminuir o padrao 30000 ou aumentar o fator 100 para 1000 por exemplo..function TACBrTEFAPIClassCliSiTef.ObterDadoPinPad(
TipoDado: TACBrTEFAPIDadoPinPad; TimeOut: integer; MinLen: SmallInt;
MaxLen: SmallInt): String;
Var
DadoPortador: String;
Ok: Boolean;
begin
DadoPortador := DadoPinPadToOperacao(TipoDado);
if (DadoPortador = '') then
begin
fpACBrTEFAPI.DoException(Format(ACBrStr(sACBrTEFAPICapturaNaoSuportada),
[GetEnumName(TypeInfo(TACBrTEFAPIDadoPinPad), integer(TipoDado) ), ClassName] ));
end;if (MinLen = 0) and (MaxLen = 0) then
CalcularTamanhosCampoDadoPinPad(TipoDado, MinLen, MaxLen);fRespostasPorTipo.ValueInfo[2967] := DadoPortador;
fRespostasPorTipo.ValueInfo[2968] := IntToStr(MinLen);
fRespostasPorTipo.ValueInfo[2969] := IntToStr(MaxLen);
fRespostasPorTipo.ValueInfo[2970] := IntToStr(trunc(TimeOut/100));Ok := ExecutarTransacaoSiTef(CSITEF_OP_DadosPinPadAberto, 0);
if Ok then
Result := fpACBrTEFAPI.UltimaRespostaTEF.LeInformacao(2971,0).AsString;
end; -
entrei em contato com o sitef, pediram pra testar com SE000002 na identificacao do terminal.... parou de aparecer as pendencias.. porem fiquei com um pouco de receio com essas informacoes antigas, que nao apareciam como pendentes na versao anterior que utilizava do acbr e comecaram aparecer agora... elas era de 10/2023...
e tbm a ideia de puxar os dados de pendencias mesmo com o servidor estando desativado, teria como saber de onde vem essas informacoes, pois, logs do acbr foram todos excluidos, e arquivos temp do clisitef tbm.. -
realizei a atualizacao do componente e agora fica aparecendo 6 transacoes pendentes, uma atras da outra, mesmo o servidor local de demo do sitef estar fechado..
e mesmo executando a apos a mensagem o finalizartransacao... continua toda vez que tenta inicializar
7/03/25 17:05:21:526 - VerificarTransacoesPendentes
07/03/25 17:05:34:306 - ProcessarTransacaoPendente( Transa o Pendente.
Rede:
NSU: )
07/03/25 17:05:34:306 - QuandoDetectarTransacaoPendente
07/03/25 17:05:34:319 - ResolverOperacaoPendente( tefstsSucessoManual )
07/03/25 17:07:28:745 - *** FinalizaTransacaoSiTefInterativo. Confirma: SIM, Documento: P_759, Data: 20231016, Hora: 172210, ParametrosAdicionais:
07/03/25 17:08:23:327 - ProcessarTransacaoPendente( Transa o Pendente.
Rede:
NSU: )
uma parte do arquivo de log -
acabei q pra poder passar na homologacao fiz um "arranjo tecnico", como é testado somente o ultimo documento emitido, ao iniciar o processo de pagamento, salvo em registro o nr do documento e ao inicializar a aplicacao consulto se o ultimo documento esta pendente, por falta de tempo nao consegui dar sequencia no ajusto do componente, alterei algumas partes de funcoes e procedures, vou postar aqui as minhas anotacoes se ajudar, inicio do ano acredito estar mais disponivel e posso ajudar tbm nos ajustes e testes..
unit ACBrTEFAPICliSiTef;
tirar de dentro e colocar fora do repeat
TituloMenu := '' ;
quando vinha titulo no comando 4 nao mostrava no comando 21, pois TituloMenu := '' ;
eliminava o titulo=============================================================
nit ACBrTEFAPICliSiTef;
funcao ContinuarRequisicaoSiTef;tratamento do comando 30, incluido ajuste para aceitar o VOLTAR no formulario perguntar campo
30: // Deve ser lido um campo cujo tamanho está entre TamMinimo e TamMaximo
begin
DefinicaoCampo.TipoCampo := TipoCampo;
DefinicaoCampo.TituloPergunta := ACBrStr(Mensagem);
DefinicaoCampo.TipoDeEntrada := tedTodos;
DefinicaoCampo.TamanhoMaximo := TamanhoMaximo;
DefinicaoCampo.TamanhoMinimo := TamanhoMinimo;
DefinicaoCampo.MascaraDeCaptura := EmptyStr;Validado := True;
TefAPI.QuandoPerguntarCampo(DefinicaoCampo, Resposta, Validado, Interromper);//ajuste para aceitar voltar nos formulario de solicitar informacao
if((Interromper = False)and(Validado)and(Resposta = 'RetornarMenuAnterior'))then
begin
Resposta := '';
Voltar := True;
end else
RespCliSiTef.GravaInformacao(TipoCampo, Resposta);
end;============================================================================
na procedure quando perguntar campo passa valores quando for voltar
procedure TTef.QuandoPerguntarCampo(DefinicaoCampo: TACBrTEFAPIDefinicaoCampo; var Resposta: string; var Validado, Cancelado: Boolean);
//se nao for ok ou voltar trata como cancelado
if((MR <> mrOK)and(MR <> mrRetry))then
begin
Cancelado := True;
Validado := False; // Não fizemos as validações de "DefinicaoCampo.ValidacaoDado", vamos deixar o ACBrTEFAPI validar
Resposta := FormObtemCampo.Resposta;
end else
begin
if(MR = mrRetry)then
begin
Cancelado := False;
Validado := True;
Resposta := 'RetornarMenuAnterior';
end else
begin
Cancelado := False;
Validado := False;
Resposta := FormObtemCampo.Resposta;
end;
end;=============================================================================================
unit ACBrTEFAPICliSiTef;
TACBrTEFAPIClassCliSiTef.FinalizarTransacao(
// CliSiTEF não usa Rede, NSU e Finalizacao
DocumentoVinculado := '';
Confirma := (AStatus in [tefstsSucessoAutomatico, tefstsSucessoManual]);
i := fpACBrTEFAPI.RespostasTEF.AcharTransacao(Rede, NSU, CodigoFinalizacao);
if (i >= 0) then
DocumentoVinculado := fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado;//caso nao localize e tenha vindo rede sem nsu é pq foi chamado avulso com o DOCUMENTOVINCULADO no Rede
if((Rede <> '')and(DocumentoVinculado = '')and(NSU = ''))then
DocumentoVinculado := Rede;FinalizarTransacaoSiTef(Confirma, DocumentoVinculado);
=========================================================
desculpa a forma como compartilhei sem formatacao, é que mantenho as alteracoes por escrito caso atualize o componente e tenha qajustar os detalhes manualmente
qqr coisa estou a disposicao para ajudar e testes
em relacao a tratar o ultimo documento pendente, ao abrir a aplicacao faco essa validacao
var ultimo := BackupDocumentoSitef_Ler; //leio registro com ultimo documento q foi inicializado o pagamento
var estapendente := (TACBrTEFAPIClassCliSiTef(ObjetoTef.Acbr.TEF).TEFCliSiTefAPI.ObtemQuantidadeTransacoesPendentes(Now, AnsiString(ultimo)) > 0);if(estapendente)then
begin
TACBrTEFAPIClassCliSiTef(ObjetoTef.Acbr.TEF).FinalizarTransacao(ultimo,
'',
'',
tefstsSucessoManual); -
ao realizar a homologação com Sitef, esbarramos num teste.
rotina do teste
- realizar venda
- credito
- inserir cartao
- digitar senha
- quando aprovar e receber mensagem de retirar cartao (matar o processo simulando desligamento)
ao iniciar novamente o componente nao valida as operacoes pendentes..chegamos no detalhe q o arquivo que é analisado para validar as pendencias "Acbr_xxx" é salvo na chamada apos executar o FinalizarChamadaAPI
porem esse somente é chamado no finally da fpTEFAPIClass.EfetuarPagamento(
e essa so é concluida apos remover o cartao.
percebemos tambem que existe uma funcao da sitef q retorna a quantidade de pendentes porem ainda nao implementada
nao conseguimos contornar esse "detalhe", alguem ja passou por isso? conseguiu homologar? passou nesse teste?
alguem com a implementacao de rotina de retornar e tratar pendentes da sitef??
-
estamos fazendo mais alguns ajustes realcionados ao sitef, assim que terminarmos colocamos aqui a colaboracao
-
-
unit ACBrTEFAPICliSiTef;
ideia de ajuste:
tirar o TituloMenu := '': de dentro do repeat pois quando vinha titulo no comando 4 nao mostrava no comando 21, pois TituloMenu := '' ;
eliminava a informacao da variavel
-
Em 07/05/2018 at 13:01, Josimar Dias disse:
Até consegui imprimir o qr-code alterando diretamente na unit "ACBrEscPosEpson", porém não consegui lê-lo.
Result := ESC + 'Z' + // Codigo QRCode
AnsiChr(0) + // m means specified version.(1~40,0:Auto size)
'L' + // n specifies the EC level.(L:7%,M:15%,Q:25%,H:30%)
AnsiChr(2) + // k specified component type.(1~8)
AnsiChr(Low(Length(ACodigo)+2)) + // dL:The first byte is the low order number.
AnsiChr(High(Length(ACodigo)+2)) + // dH:The second byte is the upper number.
ACodigo;estou com o mesmo problema, sem conseguir ler os codigos impressos...
ja revirei o manual da impressora e nao consegui fazer com que imprimisse e lesse uma URL de NFCE...
conseguiu resolver esse problema...?
Erro "Tempo de espera inválido" ao obter dados pinpad
em Dúvidas sobre TEF
Postado
Acredito ser uma otima opçao essa ideia, ja trata o padrao que é 30000.
daria pra testar os entre 100 e 999 dividir por 100 pra garantir que alguma funcao ja nao esteja chamando com algum ajuste relacionado a divisao por 100 que existia
exemplo, estarem passando 900 pra dividir por 100 e dar 9 segundos
abaixo disso seria em segundos e 100 segundo aceita de boa a funcao
if(TimeOut > 1000)then
TimeOut := trunc(TimeOut/1000)
else
if(TimeOut > 100)then
TimeOut := trunc(TimeOut/100);