-
Total de ítens
67 -
Registro em
-
Última visita
-
Days Won
3
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que Delcio postou
-
Ajustes nos registros D3 e D4 para PAF-NFCe Layout 2.00
um tópico no fórum postou Delcio ACBrSintegra/ACBrPAF
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 -
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.
-
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
-
Nem o DNS da SVRS está resolvendo:
-
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.
-
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:
-
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
-
Pois é, não me atentei a esse detalhe, nos meus clientes estão todos instalados, vou verificar se tem como resolver isso.
-
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
-
Objetos: Saber se é a mesma instância - Chupa essa manga
Delcio replied to Delcio's tópico in Object Pascal - Delphi & Lazarus
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; -
Objetos: Saber se é a mesma instância - Chupa essa manga
Delcio replied to Delcio's tópico in Object Pascal - Delphi & Lazarus
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. -
Objetos: Saber se é a mesma instância - Chupa essa manga
Delcio replied to Delcio's tópico in Object Pascal - Delphi & Lazarus
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; -
Objetos: Saber se é a mesma instância - Chupa essa manga
Delcio replied to Delcio's tópico in Object Pascal - Delphi & Lazarus
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; -
Objetos: Saber se é a mesma instância - Chupa essa manga
Delcio replied to Delcio's tópico in Object Pascal - Delphi & Lazarus
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; -
Objetos: Saber se é a mesma instância - Chupa essa manga
um tópico no fórum postou Delcio Object Pascal - Delphi & Lazarus
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. -
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
-
Consumo alto de CPU ao acessar o forum
Delcio replied to Delcio's tópico in Dúvidas não relacionadas ao ACBr
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. -
Consumo alto de CPU ao acessar o forum
Delcio replied to Delcio's tópico in Dúvidas não relacionadas ao ACBr
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. -
Consumo alto de CPU ao acessar o forum
um tópico no fórum postou Delcio Dúvidas não relacionadas ao ACBr
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. -
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
-
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
-
Sugestão de componente TACBrPromissorias
Delcio replied to Delcio's tópico in Dúvidas Gerais sobre o ACBr
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. -
Sugestão de componente TACBrPromissorias
um tópico no fórum postou Delcio Dúvidas Gerais sobre o ACBr
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: -
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:
-
Pequena Correção na Versão do Arquivo e Lote do Banco do Brasil
um tópico no fórum postou Delcio ACBrBoleto
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