Ir para conteúdo
  • Cadastre-se

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

Contributor

Contributor (5/14)

  • Collaborator Rare
  • Reacting Well Rare
  • Conversation Starter
  • First Post
  • Week One Done

Recent Badges

4

Reputação

3

Community Answers

  1. 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');
  2. 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!
  3. 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');
  4. 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.
  5. 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
  6. 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;
  7. Boa tarde! Ainda não sei certinho o motivo, mas, em uma máquina nova, com a mesma versão do SO funcionou. Vou tentar descobrir se é algum pacote ou o que seria e deixo aqui.
  8. Bom dia. Obrigado @datilas, tentei bastante coisas aqui, e ainda nada. Você compilou para x86_64? Passou alguma definição em "Custom Options"?
  9. 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.
  10. 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.
  11. 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?
  12. 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!
  13. 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.
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...