eliandro.may
Membros-
Total de ítens
34 -
Registro em
-
Última visita
Últimos Visitantes
O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.
eliandro.may's Achievements
-
A partir do dia 01/01/2026 o provedor IPM passou a rejeitar notas quando não informado o código de desdobramento nacional o item de serviço. Após adicionar este adicionar o código do desdobramento nacional, a impressão da Danfe não é feita corretamente, só imprime parte do código do item de serviço e não imprime a descrição. Para corrigir isso, eu alterei a unit IPM.LerXml.pas a linha 160 para ler 6 dígitos ao invés de 4 de ItemServico[i].ItemListaServico := PadLeft(aValor, 4, '0'); para ItemServico[i].ItemListaServico := PadLeft(aValor, 6, '0');
-
Bom dia. Certo, vou fazer isto. Na verdade, acessei lá o git deles, no endereço https://github.com/geby/synapse/blob/master/synaser.pas, e já estava alterado. Muito obrigado!
-
Leitura completa da Trilha2 no ACBrAbecsPinPad
eliandro.may replied to eliandro.may's tópico in ACBrSerial
Bom dia. Na verdade como não tem Tags para estes valores retornados, eu usei o ACBrAbecsPinPad.Response.GetResponseData() e tratei a string de retorno. Mais ou menos assim repeat ACBrAbecsPinPad.DSP('Passe o cartao',''); ACBrAbecsPinPad.CKE( True, True, False, False, False); Resposta:=ACBrAbecsPinPad.Response.GetResponseData(); ACKE_EVENT:=Copy(Resposta,1,1); case StrToIntDef(ACKE_EVENT,-1) of 0: begin ACKE_KEYCODE:=Copy(Resposta,2,2); if (ACKE_KEYCODE='13') then begin Loga(iINFO,'Leitura do cartao cancelada no pinpad.'); MensagemPinPad('CANCELADO'); end; end; 1: begin ACKE_TRK1LEN:=Copy(Resposta,2,2); ACKE_TRK1:=Copy(Resposta,4,StrToIntDef(ACKE_TRK1LEN,0)); Loga(iINFO,'CKE_TRK1: '+ACKE_TRK1); ACKE_TRK2LEN:=Copy(Resposta,StrToIntDef(ACKE_TRK1LEN,0)+4,2); ACKE_TRK2:=Copy(Resposta,6+StrToIntDef(ACKE_TRK1LEN,0),StrToIntDef(ACKE_TRK2LEN,0)); Loga(iINFO,'CKE_TRK2: '+ACKE_TRK2); ACKE_TRK3LEN:=Copy(Resposta,StrToIntDef(ACKE_TRK1LEN,0)+StrToIntDef(ACKE_TRK2LEN,0)+6,2); ACKE_TRK3:=Copy(Resposta,8+StrToIntDef(ACKE_TRK1LEN,0)+StrToIntDef(ACKE_TRK2LEN,0),StrToIntDef(ACKE_TRK3LEN,0)); Loga(iINFO,'CKE_TRK3: '+ACKE_TRK3); expirationDate:=FormatDateTime('yymmdd',UltimoDiaDoMes(Encodedate(StrToInt(Copy(Cartao.Trilha2,Pos('=',Cartao.Trilha2)+1,2)),StrToInt(Copy(Cartao.Trilha2,Pos('=',Cartao.Trilha2)+3,2)),1))); Loga(iINFO,'expirationDate='+expirationDate); Result:=True; end; 2: begin ACKE_ICCSTAT:=Copy(Resposta,1); Loga(iINFO,'CKE_ICCSTAT: '+ACKE_ICCSTAT); end; 3: begin AKE_CTLSSTAT:=Copy(Resposta,1); Loga(iINFO,'CKE_CTLSSTAT: '+AKE_CTLSSTAT); end; end; until ( (ACKE_KEYCODE='13') and (ACKE_EVENT='0')) or (ACKE_EVENT = '1'); -
Leitura completa da Trilha2 no ACBrAbecsPinPad
eliandro.may replied to eliandro.may's tópico in ACBrSerial
Opa, sim, deveria, eu acabei mexendo na última hora e esqueci de colocar ela de volta fora. Daniel Pensei em colocar o tratamento no retorno, para facilitar o uso do componente, mas, como este retorno não tem aquela definição de campos, acabei não fazendo. Mas, seria interessante retornar o tipo da resposta, e os campos já separados, como trilha1, trilha 2, quando magnético, um campo boolean quando a resposta é de remoção de cartão, ou um campo com a tecla quando for tecla. -
Bom dia. Tive problema com um autorizador, pois ele exigia a trilha2 completa, com os 37 bytes. Olhando o fonte do ACBrAbecsPinPad, verifiquei que ele usava o comando CEX para fazer a leitura do cartão, e neste comando, o Pinpad retorna as trilhas incompletas. Para poder ler a trilha completa, é necessário usar o comando CKE, mas como ele não está implementado nACBrAbecsPinPad.pasa ACBrAbecsPinPad.pas, e fiz isso. Segue fonte do ACBrAbecsPinPad.pas com a função CKE. Obrigado
-
Solução. Verifiquei aqui que o problema ocorria no lock feito no Linux no componente de terceiro chamado synser.pas. Para corrigir o erro, mudei a linha 825 FLinuxLock := False; para FLinuxLock := True; do constructor TBlockSerial.Create; Ficando assim constructor TBlockSerial.Create; begin inherited create; FRaiseExcept := false; FHandle := INVALID_HANDLE_VALUE; FDevice := ''; FComNr:= PortIsClosed; {HGJ} FInstanceActive:= false; {HGJ} Fbuffer := ''; FRTSToggle := False; FMaxLineLength := 0; FTestDSR := False; FTestCTS := False; FDeadlockTimeout := 30000; FLinuxLock := True; FMaxSendBandwidth := 0; FNextSend := 0; FMaxRecvBandwidth := 0; FNextRecv := 0; FConvertLineEnd := False; SetSynaError(sOK); FRecvBuffer := 4096; FLastCR := False; FLastLF := False; FAtTimeout := 1000; FInterPacketTimeout := True; end;
-
Bom dia. Obrigado @datilas, tentei bastante coisas aqui, e ainda nada. Você compilou para x86_64? Passou alguma definição em "Custom Options"?
-
Opa, maravilha, pelo menos eu sei que funciona. Estava seguindo os fontes aqui, e ele acaba indo chamar as funções de serial na synaser.pas, e nela ele tenta se referenciar ao device /dev/ttyS + o número da porta. Como meus fontes estão atualizados, deve ser algum DEFINA que eu tenho errado. Vou olhar mais.
-
Obrigado pela resposta. Você conseguiu utilizar o ACBrAbecsPinPad no Linux então? Eu tenho ele conectado, ele cria o device "/dev/ttyACM0", inclusive alterei as regras do Linux para criar o device com permissão 666. Em outras aplicações consigo comunicar certinho com o Pinpad. Só no meu teste com o ACBrAbecsPinPad que não vai. Testei com a aplicação de exemplo que vem junto com o ACBR, e também deu este erro. O único detalhe é que estou usando o Lazarus com compilador cross para gerar os binários no Windows e rodar no linux, todo o restante está funcionando, somente o ACBrAbecsPinPad que me retorna este erro.
-
Boa tarde. Estou tentando testar o ACBrAbecsPinPad no Linux, mas, sempre que tento abrir a porta serial, retorna o erro "Communication error 9990: Unknown Error (9990)" Alguém já usou este componente no Linux?
-
Boa tarde Juliomar. Consegui resolver a questão. Como eu já utilizo o Xvfb, que é um X virtual framebuffer, para poder rodar algumas coisas que precisam de display, o que eu fiz foi criar um service para criar um display automaticamente no inicio da máquina. E no meu vhost do apache, que aponta para o minha api, eu coloquei um SetEnv DISPLAY para o display que criei. Com isso, posso rodar cgi que fazem uso da uses Interfaces. Eu só vou separar esses cgi's em programas a parte, pois eles são muito maiores, e mais pesados, sendo dispensáveis na maioria das api's. Obrigado!
-
Bom dia Juliomar. Obrigado pela resposta, mas deamon eu não gosto, tenho minhas api direto no apache por https, muito simples, prático e rápido, e docker, seria mais uma camada de software desnecessária, gosto das coisas o quanto mais simples melhor. Vou estudar uma forma de colocar assim no cgi. Além do que, só o fato de eu colocar a uses Interfaces, faz o aplicativo triplicar de tamanho, é um dos motivos de eu querer fazer sem ela. Se eu achar uma forma, posto aqui. Se alguém já conseguiu uma solução, eu agradeço se compartilhar.
