Ir para conteúdo
  • Cadastre-se

Delcio

Membros
  • Total de ítens

    67
  • Registro em

  • Última visita

  • Days Won

    3

Tudo que Delcio postou

  1. Olá pessoal, fiz algumas alterações nos registros D3 e D4 para atender a ER 2.00 do PAF-NFCe. Confesso que achei as alterações meio estranhas, removeram VL_DESCTO, VL_ACRES, e VL_TOTAL, Fiquei na dúvida de como preencher no caso de haver desconto ou acréscimo, se coloco o valor unitário levando em conta o desconto e acréscimo ou o valor normal... Seguem as diferenças e a Unit alterada em anexo para avaliação. ACBrPAF_D_Class.pas
  2. Olá Italo, sim, já faço isso, mas algumas coisas fogem de nosso controle, por exemplo quedas na conexão durante o envio da inutilização, neste caso ao tentar inutilizar novamente trato o retorno, que vem com os dados da inutilização original e armazeno no banco. São casos raros, mas acontecem.
  3. Olá pessoal. Pequeno ajuste para permitir a leitura do protocolo e outras informações da inutilização em caso de Rejeição 682 "Já existe pedido de inutilização com a mesma faixa de inutilização"; Segue em anexo: pcteRetInutCTe.pas
  4. Nem o DNS da SVRS está resolvendo:
  5. Percebi isso, boa parte está sendo direcionada para System.Net, mas acho ela muito "dependente" das APIs do SO, e muito fechada também, por exemplo a implementação para o windows está em System.Net.HttpClient.Win e fica toda na seção implementation da Unit, muito engessada na minha opinião. Não consigo usar o certificado carregado no ACBr com ela, e não consigo herdar para sobrescrever algo, até consigo registrar outra classe com TURLSchemes.RegisterURLClientScheme para usar com o windows por exemplo, mas tem que implementar toda ela. Minha ideia inicial com Indy seria fazer uma implementação independente e talvez colocar na pasta terceiros, para ficar independente das IDEs. mas acho que não vai dar com Indy, vamos ver com o Synalist, que já tem no ACBr inclusive.
  6. Fiz mais uns testes por aqui criando uma classe http 100% Indy, tive alguma evolução, mas acho que vou ter que partir pra outra biblioteca. O Indy usa OpenSSl para a conexão segura, consegui fazer o Indy funcionar com o certificado carregado no ACBr usando OpenSSl, funcionou tanto com Certificado A3 quanto com A1 carregado em memória, mas fui barrado por outro problema: Parece que o Indy ainda não suporta as versões mais novas da OpenSSL, daí só funcionou com TLS 1.1, que não nos atende. Vou tentar outro caminho: Alterar a TDFeHttpOpenSSL para suportar certificado A3, se der certo acho que teríamos quase todas as vantagens:
  7. Olá. Consegui fazer funcionar com o Context do TDFeSSL, porém teria que ver se o inicio da assinatura da classe TWinHTTPClient não mudou nas versões mais novas, tenho só o D10.3.1 aqui. Está em anexo, se quiser dar uma olhada. Talvez fosse melhor implementar uma classe HTTP do zero, baseada em Indy ou outra biblioteca mais independente da RTL, já que a TDFeHttpIndy atualmente nem usa Indy mais. Assim que conseguir um tempo vou dar uma pesquisada sobre algo nesse sentido. Em um cenário ideal ela teria que: Compilar em x68 e x64; Não depender da API do S.O, isso permitiria: Compilar para Linux; Não depender de configurações do S.O.; Não depender de atualizações do S.O; Ser compatível com FPC; Permitir certificado de cliente sem instalação; Permitir certificados A3 e A1; Suportar SSL, TLS, mais algum? Evitar dependência de bibliotecas externas(DLLs); Esqueci de algo? ACBrDFeHttpIndy.pas
  8. Pois é, não me atentei a esse detalhe, nos meus clientes estão todos instalados, vou verificar se tem como resolver isso.
  9. Olá pessoal. De uns tempos pra cá venho tendo alguns chamados relativos a problemas de comunicação com o TLS1.2 usando a httpWinHttp, grande maioria devido as atualizações do windows(ou a falta delas), estive buscando então alternativas para evitar esse transtorno: A httpWinINet depende de configurações do IE, que de vez em quando são alteradas por outros aplicativos e acabam causando o mesmo problema. A httpOpenSSL além de causar dependências das Dlls acho que só vai de A1 e infelizmente tem uns que insistem no A3. Um opção seria usar a HttpIndy, que não depende de configurações do IE e aparentemente não é afetada pelos updates do windows, porém nos Delphi mais novos não estava funcionando direito devido a mudanças na RTL. Apresentava o erro "Erro ao ajustar INTERNET_OPTION_CLIENT_CERT_CONTEXT". Dei uma mexida nela e consegui fazer funcionar, nos testes com a NFe transmitiu normalmente no Rio 10.3.1, inclusive estou testando em alguns clientes onde a httpWinHttp estava apresentando problemas, porém não tenho outras versões do Delphi instaladas aqui pra testar. Vou deixar em anexo se alguém quiser testar/melhorar e enviar para repositório. ACBrDFeHttpIndy.pas
  10. Verdade, acabei não testando o código de exemplo antes de postar e esqueci de umas coisas; O correto é esse: type TTest = class private FVar: Pointer; public constructor Create(var CheckInstanceVar); virtual; destructor Destroy; override; end; constructor TTest.Create(var CheckInstanceVar); begin inherited Create; FVar := @CheckInstanceVar; end; destructor TTest.Destroy; begin if TTest(FVar^) = Self then Pointer(FVar^) := nil; inherited; end; ... var A, B: TTest; begin A := TTest.Create(B); B:= A; A.Free; A := TTest.Create(B); // Agora A é outro objeto ShowMessage( // BoolToStr(A = B, True) // ); end; Basicamente armazeno um ponteiro para a variável no objeto para que possa setar a variável para nil ao destruir o objeto; Lembrando que esse código é somente um exemplo, usei esse artifício em uma implementação bastante complexa, onde A pode ser destruído e criado indiscriminadamente e depois preciso saber se A continua sendo a mesma instância do início;
  11. Entendi sim, as duas variáveis estão apontando para o mesmo endereço, e é justamente isso que causa a confusão, no final do código as duas variáveis estão armazenando o mesmo objeto. Exatamente isso que impede eu comparar se "A" é igual a instância que eu tinha anteriormente e referenciei em "B". O que eu precisava era uma forma de saber se meu "A" é a mesma instância de antes. Não me atentei a esse detalhe de endereçamento, e isso causou o problema; Resumindo: Uma variável armazena uma referência a um endereço, e não o objeto em si.
  12. Usei esse código apenas como exemplo, no meu caso nem reaproveito a variável, mas o erro acontece de forma semelhante ao exposto, pois o endereço da memoria do objeto que foi armazenado para posterior comparação é ocupado pelo novo objeto, e quando comparo usando "=" retorna True, mesmo sendo uma nova instância, pois aponta para o mesmo endereço da instancia anterior. No meu caso a destruição/criação do objeto depende de fatores que não posso controlar, como a interação do usuário. Resolvi armazenando uma referência para comparação no próprio objeto;
  13. Os objetos são "iguais", mas não deveriam ser o "mesmo", pois são instancias diferentes. Isso causa confusão e foi motivo de um bug em nosso sistema. Também pensei em FreeAndNil, mas tem que ser em B, o problema é que não tenho acesso a B onde libero A. Veja: var A, B: TObject; begin A := TObject.Create; B := A; FreeAndNil(A); A := TObject.Create; // Agora A é outro objeto ShowMessage( BoolToStr(A = B, True) ); //True end; Preciso armazenar um determinado objeto e depois, em outro local da aplicação preciso verificar se ele continua sendo o mesmo, não se é igual, mas se é a mesma instancia anterior. Já contornei o problema original, mas não achei a solução ideal, deveria haver algo como TObject.SameInstance, já que o operador "=" só verifica se o ponteiro das duas variáveis é o mesmo, e sim ele é o mesmo, mas os objetos não, já que o primeiro foi destruído e e criado novamente. Mas eu intendi, o operador é de igual, e não de "mesmo": Dois carros iguais não significa que são o mesmo carro. Mas achei interessante deixar este problema exposto para que outros não caiam nesta "arapuca". Resolvi mais ou menos assim: type TTest = class private FVar: Pointer; public constructor Create(var CheckInstanceVar); virtual; destructor Destroy; override; end; constructor TTest.Create(var CheckInstanceVar); begin inherited Create; FVar := @CheckInstanceVar; end; destructor TTest.Destroy; begin inherited; if FVar = Self then FVar := nil; end; ... var A, B, C: TTest; begin A := TTest.Create(B); A.Free; A := TTest.Create(C); // Agora A é outro objeto ShowMessage( // BoolToStr(A = B, True) // ); end;
  14. Não testei no FPC, mas no delphi tem também e realmente é a mesma coisa que "="; TObject tem GetHashCode, mas também retorna o mesmo valor;
  15. Olá estou quebrando a cabeça. Preciso armazenar um objeto e depois comparar se é ele mesmo. parece simples, mas tem umas pegadinhas, veja abaixo: var A, B: TObject; begin A := TObject.Create; B := A; A.Free; A := TObject.Create; // Agora A é outro objeto ShowMessage( BoolToStr(A = B, True) ); //Exibe "True" end; Como assim? Eu sei... O operador "=" apenas compara se os endereços na memória são iguais, e como variáveis são ponteiros pra endereços de memória, deve ser porque o mesmo endereço onde A estava armazenado é "aproveitado" para armazenar o novo objeto. Mais uns testes: var A, B, C: TObject; begin A := TObject.Create; B := A; A.Free; C := TObject.Create; //C é outro objeto ShowMessage( BoolToStr(A = C, True) ); //Exibe "True" ShowMessage( BoolToStr(Pointer(A) = Pointer(C), True) ); //Exibe "True" ShowMessage( BoolToStr(A.Equals(C), True) ); //Exibe "True" end; Mas e agora? Usei variáveis diferentes(A e C), continua sendo o mesmo endereço. O objeto C é criado no mesmo endereço onde estava armazenado A. Os objetos são iguais, mas não são a mesma instância. Preciso saber se é a mesma instância. Tem alguma maneira sem ter que dar um B:=nil, visto que onde destruo A não tenho acesso a B, e se possível sem ter que alterar a classe original, adicionando uma referencia ou algo do tipo.
  16. Olá pessoal. Uma sugestão que melhoraria o AcbrBoleto em ambientes Web, quando gero a remessa, preciso gerar em um arquivo temporário pra depois enviar(download) para o browser. Adicionei um método GerarRemessaStream, que gera a remessa diretamente em um TStream, eliminando a necessidade de gerar/excluir arquivos nesses casos. Grato. ACBrBoleto.pas
  17. Pelo que percebi é isso mesmo. estou com bastante trabalho nesses dias, assim que tiver um tempinho vou ver se consigo testar melhor e levantar mais informações. Não chega a ser um problema grave, só incomoda um pouquinho as vezes.
  18. Testei em dois pcs diferentes, ambos em resolução de 2560x1080, no Firefox o consumo é menor, mas também ocorre. Quanto a GPU dedicada não tenho, talvez possa ser, mas acho que tenha mais a ver com a execução de alguns timers dentro dos scripts, pois se interrompo eles pelo debug do browser o processamento cai. Mas não impede a navegação. No PC local ocorre o mesmo sintoma mas nem é perceptível, apenas acessando pelo Terminal que as vezes fica lento, quando a Thread da página está no mesmo núcleo que o Terminal Services.
  19. Sem título.mp4 Bom Dia Pessoal. Percebi um pequeno detalhe ao acessar tópicos do fórum ACBR, principalmente em monitores com resolução mais alta: Consumo alto de processamento, nem chega a ser tão alto assim e talvez passe despercebido a quase todos da comunidade, mas como trabalho por RDP, o acesso fica muito lento quando o browser e o terminal services dividem o mesmo núcleo do processador. Pelo que percebi ocorre devido a timers executando repetidamente tarefas em alguns scripts. Um abraço a todos.
  20. Olá. O Município de Planalto Alegre mudou de provedor, de Betha para IPM. Se alguém puder fazer a alteração no SVN agradeço. [4213153] Nome=Planalto Alegre UF=SC Provedor=IPM
  21. Olá Pessoal. Percebi que que as propriedades ValorPago e ValorRecebido não estão implementadas da mesma forma para todos os bancos na leitura do retorno. No momento estou trabalhando com Sicredi, Bancoob e BB, e estão assim: Bancoob: ValorPago = Valor que o cliente pagou; ValorRecebido = Valor creditado na conta; Sicredi: ValorPago não está sendo lido; ValorRecebido = Valor que o cliente pagou; BancoDoBrasil: ValorPago não está sendo lido; ValorRecebido= Valor que o cliente pagou; No meu entendimento o mais correto seria o Bancoob; Seguem em anexo as Units do Bancoob e BancoDoBrasil com as alterações sugeridas e os devidos manuais. ACBrBancoSicredi-15550.pas Sicredi manual-cnab-240_2017.1.pdf CbrVer04BB.pdf ACBrBancoBrasil-15550.pas
  22. Verdade, meu ambiente de desenvolvimento é bem personalizado, como por exemplo versão do FastReport que não é a padrão, não tenho versões antigas e nem Lazarus instalados para testar. Vou ter que montar uma VM para essa finalidade, gostaria de colaborar mais com o projeto, mas no momento a coisa tá bastante corrida por aqui. Espero poder mexer nisso em breve. Vou deixar aí caso alguém consiga se aventurar na empreitada.
  23. Precisava implementar Notas Promissórias em meu sistema e resolvi criar um componente para tal, segue mais ou menos o padrão do ACBrBoleto, caso seja útil e alguém queira incorporar ao projeto. Feito: Criadas as Classes; Criado o Relatório em Fast Report; Criado um Demo Básico(em implementação); Falta: Testar e melhorar; Compatibilizar com Lazarus; Criar relatórios em outras plataformas; Para testar: extrair o anexo dentro de trunk2, adicionar as pastas ao Library do Delphi e instalar os .pkg; trunk2.zip Exemplo de uso: var NovaPromissoria: TACBrPromissItem; I : Integer; begin ACBrPromissoria1.ListadePromiss.Clear; with ACBrPromissoria1 do begin // Favorecido with Favorecido do begin Nome := 'Fulano Que Vai Receber'; CPFCNPJ := '41811877000140'; end; // Praça de Pagamento with PracaPagamento do begin Logradouro := 'Rua Do Pagamento'; NumeroRes := '171'; Complemento := ''; Bairro := 'Centro'; Cidade := 'Planalto Alegre'; UF := 'SC' end; // adiciona promissoria with CriarPromissNaLista do begin Numero := '01/2018'; DataEmissao := Now; DataVencimento := IncMonth(Now, 1); Valor := 100.35; // devedor with Devedor do begin Nome := 'Fulano Que Deve'; CNPJCPF := '79766710066'; Logradouro := 'Rua do Devedor'; Numero := '111'; Complemento := ''; Bairro := 'Centro'; Cidade := 'Planalto Alegre'; UF := 'SC'; end; // Avalista with Avalista do begin Nome := 'Fulano Avalista'; CNPJCPF := '79766710066'; Logradouro := 'Rua do Avalista'; Numero := '222'; Complemento := ''; Bairro := 'Centro'; Cidade := 'Planalto Alegre'; UF := 'SC'; end; end; end; for I := 2 to 5 do begin // outra maneira de adicionar promissorias NovaPromissoria := ACBrPromissoria1.CriarPromissNaLista; NovaPromissoria.Numero := IntToStr(I) + '/2018'; NovaPromissoria.DataEmissao := Now; NovaPromissoria.DataVencimento := IncMonth(Now, I); NovaPromissoria.Valor := 100.35; // devedor NovaPromissoria.Devedor.Nome := 'Fulano Que Deve'; NovaPromissoria.Devedor.CNPJCPF := '79766710066'; NovaPromissoria.Devedor.Logradouro := 'Rua do Devedor'; NovaPromissoria.Devedor.Numero := '111'; NovaPromissoria.Devedor.Complemento := ''; NovaPromissoria.Devedor.Bairro := 'Centro'; NovaPromissoria.Devedor.Cidade := 'Planalto Alegre'; NovaPromissoria.Devedor.UF := 'SC'; // Avalista NovaPromissoria.Avalista.Nome := 'Fulano Avalista'; NovaPromissoria.Avalista.CNPJCPF := '79766710066'; NovaPromissoria.Avalista.Logradouro := 'Rua do Avalista'; NovaPromissoria.Avalista.Numero := '222'; NovaPromissoria.Avalista.Complemento := ''; NovaPromissoria.Avalista.Bairro := 'Centro'; NovaPromissoria.Avalista.Cidade := 'Planalto Alegre'; NovaPromissoria.Avalista.UF := 'SC'; end; Resulta em:
  24. Essa unit está incompleta, pois não tive tempo de terminá-la, porém o pessoal do ACBR reescreveu e concluiu ela, recomendo que atualize os fontes e use a seguinte configuração: XMLSignLib = xsLibXml2; Fiz muitos testes e não consegui simular a exclusão do certificado com essa configuração, inclusive estou usando assim algum tempo sem mais problemas. Mais informações em:
  25. Olá amigos. Ao homologar os boletos junto ao BB foi me retornado o seguintes problemas: > Header de Arquivo < Lote 0000 > -------------------------------------------------------------------- Posições 164 a 166: Campo Não tratado. Preencher preferencialmente com brancos ou zeros, seu arquivo informou: [030] > Header de Lote < Lote 0001 > -------------------------------------------------------------------- Posições 014 a 016: Campo Não tratado. Preencher preferencialmente com brancos ou zeros, seu arquivo informou: [020] Verifiquei que nos fontes esses valores estavam fixos, alterei para permitir usar os valores setados no componente Linha 339 >> PadLeft(IntToStr(fpLayoutVersaoArquivo), 3, '0') linha 358 >> PadLeft(IntToStr(fpLayoutVersaoLote), 3, '0') e deixei no constructor os valores anteriores para manter a compatibilidade com quem já usava com os valores fixos. Linha 123 >> fpLayoutVersaoArquivo:= 30; fpLayoutVersaoLote:= 20; Segue em anexo a unit caso alguém queira verificar e subir. ACBrBancoBrasil.pas
×
×
  • 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.