Jump to content

mlgoncalves

Membros
  • Posts

    35
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

mlgoncalves's Achievements

Contributor

Contributor (5/14)

  • Dedicated Rare
  • First Post
  • Collaborator Rare
  • Conversation Starter
  • Week One Done

Recent Badges

5

Reputation

3

Community Answers

  1. Prezados, boa tarde! Segue a unit ACBrPagForGravarTxt.pas que contém as configurações para geração do arquivo no padrão do Banco do Brasil. Favor verificar e se julgarem pertinentes as mudanças, incluir no projeto. ACBrPagForGravarTxt.rar Atenciosamente, Marcelo
  2. Boa tarde! Segue em anexo unit ACBrPagForLerTxt.pas revisada. Por favor verifiquem e se jugarem pertinentes as alterações favor publicar. Atenciosamente, MarceloACBrPagForLerTxt.rar
  3. Obrigado pelo retorno. Ainda estamos desenvolvendo o componente para gerar arquivo do Banco do Brasil. Assim que finalizar os testes iremos subir os novos fontes. Atenciosamente, Marcelo
  4. Prezados colegas, não encontrei um grupo específico do ACBRPagFor e por isso abri este tópico aqui mesmo. Estava fazendo uns testes de leitura de arquivos de retorno e percebi que o método LerTxt estava incompleto. Então decidi fazer algumas modificações listadas na unit em anexo que parece estar funcionando corretamente. O banco que estou trabalhando o retorno é o Banco do Brasil. Ainda não revisei a geração do arquivo remessa. Quem quiser colaborar fique à vontade. Atc,Frm_ACBrPagFor_Exemplo.rar Marcelo Gonçalves Lógica da leitura dos registros no arquivo. Existem registros de segmentos diferentes (A, J, O, etc) que possuem segmentos opcionais em comum (o segmento A pode ter segmentos opcionais B e Z; o segmento J pode ter segmentos opcionais B, C, D, E, F, Z; e assim por diante. Então para fazer uma leitura correta de um TXT estou lendo a linha do segmento principal e dentro da mesma rotina continuo incrementando o índice das linhas para avançar para as próximas linhas de segmento opcional, se houver. É isso. Não sou especialista em Delphi. Fiquem à vontade para aprimorar a escrita do código. Oportunamente estou anexando o exemplo que lê os arquivos. ACBrPagForLerTxt.rar ACBrPagForConversao.rar
  5. Fernando, obrigado pelo retorno. Analisei a unit, que por sinal está bem sinalizada com as suas intervenções, mas ainda a leitura do arquivo TXT retornado do banco está incompleta. Não consigo ler o segmento opcional Z do segmento O. Você pode tentar fazer a leitura do arquivo e verificar se o segmento opcional Z foi lido? Vou enviar o arquivo em anexo. segmento o.rar
  6. Olá Fernando, estou com o mesmo problema. No meu caso o banco em questão é o Banco do Brasil. Tenho vários retornos de diversos segmentos, mas não estou conseguindo ler completamente o retorno (digo dos segmentos opcionais). Você já evoluiu nesse assunto?
  7. Olá Fernando, desculpe mas somente agora vi sua citação. Podemos então falar sobre a API do BB para boletos e outros? Já finalizei a API do SICOOB. Marcelo
  8. Olá gtvosouza, tudo bem? Estou iniciando a implementação da API do Banco do Brasil para geração de boletos. Tenho experiência no ACBRBoleto, mas não é por esse caminho que desejo seguir, mas sim pela API do banco. Você poderia compartilhar o que você já tem implementado para eu analisar? Também estou abrindo acesso técnico no SICOOB para implementação da API. Caso tenha interesse posso compartilhar o projeto. Obrigado, Marcelo.
  9. Olá, Segue em anexo a unit alterada. Atc, Marcelo. ACBrBoletoW_Caixa.pas
  10. Olá José Jr, obrigado pelo retorno. Segue mais uma sugestão para ser analisada na geração do XML webservice boleto caixa. Existe a TAG POS_VENCIMENTO onde deve-se informar o que deverá ser feito após o vencimento: protestar ou devolver o título. Na programação existente está sendo utilizado o campo 'DiasDeProtesto' para preencher a tag 'NUMERO_DIAS'. Acho que não deveria utilizar este campo para situação em que não haja protesto, pois gera inconsistência de informação na hora de imprimir o boleto. No webservice vai informação de baixa e no boleto aparece informação de protesto mesmo não havendo protesto. Segue abaixo o código original e a minha sugestão, que entendo ser mais acertada. //Versão original procedure TBoletoW_Caixa.GerarPos_Vencimento; begin if Assigned(Titulos) then with Titulos do begin Gerador.wGrupo('POS_VENCIMENTO'); if (integer(CodigoNegativacao) in [1,2]) then Gerador.wCampo(tcStr, '#14', 'ACAO ', 01, 20, 1, 'PROTESTAR', DSC_CODIGO_NEGATIVACAO) else Gerador.wCampo(tcStr, '#14', 'ACAO ', 01, 20, 1, 'DEVOLVER', DSC_CODIGO_NEGATIVACAO); Gerador.wCampo(tcInt, '#15', 'NUMERO_DIAS', 03, 03, 1, DiasDeProtesto, DSC_DIAS_PROTESTO); Gerador.wGrupo('/POS_VENCIMENTO'); end; end; //versão proposta para resolver o problema procedure TBoletoW_Caixa.GerarPos_Vencimento; var ADiasBaixaDevolucao: integer; begin if Assigned(Titulos) then with Titulos do begin Gerador.wGrupo('POS_VENCIMENTO'); if (integer(CodigoNegativacao) in [1,2]) then begin Gerador.wCampo(tcStr, '#14', 'ACAO ', 01, 20, 1, 'PROTESTAR', DSC_CODIGO_NEGATIVACAO); Gerador.wCampo(tcInt, '#15', 'NUMERO_DIAS', 03, 03, 1, DiasDeProtesto, DSC_DIAS_PROTESTO); end else begin if DataBaixa > Vencimento then ADiasBaixaDevolucao := Trunc(DataBaixa) - Trunc(Vencimento) else aDiasBaixaDevolucao := 0; Gerador.wCampo(tcStr, '#14', 'ACAO ', 01, 20, 1, 'DEVOLVER', DSC_CODIGO_NEGATIVACAO); Gerador.wCampo(tcInt, '#15', 'NUMERO_DIAS', 03, 03, 1, ADiasBaixaDevolucao, DSC_DIAS_PROTESTO); end; Gerador.wGrupo('/POS_VENCIMENTO'); end; end; Atenciosamente, Marcelo.
  11. Boa tarde! Estou colocando em produção o boleto via webservice da Caixa e encontrei algumas situações que descrevo abaixo com algumas propostas de alteração ou adaptação no código do acbr. 1) campo/tag xml 'IDENTIFICACAO_EMPRESA': entendo que neste campo deverá ser preenchido com o valor usado pela empresa(software) para identificar unicamente o boleto. Este campo é equivalente ao campo 'Seu Numero' no arquivo remessa. Acho que este campo está sendo confundido com o campo NumeroDocumento. Diante disso proponho as seguintes alterações: a) Linha 413 do arquivo ACBrBoletoW_Caixa.pas: Trocar o campo NumeroDocumento para SeuNumero Criar a constante DSC_SEU_NUMERO (isso eu não fiz no arquivo anexado) b) Linha 167 do arquivo ACBrBoletoRet_Caixa.pas Trocar o campo NumeroDocumento para SeuNumero 2) o campo ESPECIEDOC é preenchido originalmente por letras (vide a geração do arquivo remessa que converte letras para números) que identificam o seu conteúdo: DM=Duplicata mercantil/ OU=outros/ etc. Ocorre que a unit do webservice está informando diretamente o campo que gera erro. Proposta: na unit ACBrBoletoW_Caixa.pas na procedure TBoletoW_Caixa.GerarTitulo utilizar a conversão exatamente como é feito no arquivo remessa. Trecho do código: //mantendo padronização de preenchimento do campo EspecieDoc entre //as funcionalides de REMESSA e REGISTRO ON-LINE. //o campo EspecieDoc é preenchido com letras e nas respectivas funções de //REMESSA ou de REGISTRO ele é convertido para código if AnsiSameText(EspecieDoc, 'CH') then AEspecieDoc := '01' else if AnsiSameText(EspecieDoc, 'DM') then AEspecieDoc := '02' ... else AEspecieDoc := '99'; Gerador.wGrupo('TITULO'); Gerador.wCampo(tcStr, '#02', 'NOSSO_NUMERO ', 17, 17, 1, '14' + ACBrUtil.PadLeft(NossoNumero, 15, '0'), DSC_NOSSO_NUMERO); Gerador.wCampo(tcStr, '#03', 'NUMERO_DOCUMENTO', 11, 11, 1, NumeroDocumento, DSC_NUMERO_DOCUMENTO); Gerador.wCampo(tcDat, '#04', 'DATA_VENCIMENTO ', 10, 10, 1, Vencimento, DSC_DATA_VENCIMENTO); Gerador.wCampo(tcDe2, '#05', 'VALOR ', 01, 15, 1, ValorDocumento, DSC_VALOR_DOCUMENTO); Gerador.wCampo(tcStr, '#06', 'TIPO_ESPECIE ', 02, 02, 1, AEspecieDoc, DSC_TIPO_ESPECIE); 3) 'string de autenticacao': o campo NossoNumero faz parta da string de autenticação do boleto e deve iniciar obrigatoriamente com o número 14. Minha sugestão é que esse número inicial 14 seja adicionado opcionalmente caso o nosso número esteja incompleto. Trecho do código da unit ACBrBoletoW_Caixa.pas, function TBoletoW_Caixa.GerarAutenticacao var sAutenticacao, sNossoNumero: string; begin if length(NossoNumero) = 17 then sNossoNumero := NossoNumero else //adicionar o prefixo 14 no nosso número sNossoNumero := '14' + ACBrUtil.PadLeft(NossoNumero, 15, '0'); 4) geração do HASH da autenticação: sou usuário do Delphi XE6 e nesta versão o cálculo do HASH existente na função TBoletoW_Caixa.GerarAutenticacao não funciona. Recorri ao fórum do ACBR onde encontrei uma função que resolveria o problema mas ocorre que a função faz uso da units System.NetEncoding.pas e System.Hash.pas, ausentes no Delphi XE6. Para resolver o problema copiei estas units de um Delphi mais novo, ajustei as linhas que citavam algunas constantes e pronto. Ficou resolvido, conforme conta na função TBoletoW_Caixa.GerarAutenticacao. Tive de incluir as citadas units na 'uses' ficando assim: uses Classes, SysUtils, ACBrBoletoWS, pcnConversao, pcnGerador, ACBrBoletoConversao, NetEncoding, Hash; É isso. Desculpe se me enganei em algum conceito mas minha intenção é de ajudar. Não sou muito experiente em Delphi para fazer um código mais elaborado. Abaixo anexei os arquivos que modifiquei e que trouxe do Delphi 10.1. Atc, Marcelo. ACBrBoletoW_Caixa.pas ACBrBoletoRet_Caixa.pas System.NetEncoding.pas System.Hash.pas
  12. Olá Jhonlenon, tudo bem? Verifique os campos relativos ao juros de mora. No finalzinho da mensagem de exceção aparece a mensagem abaixo. SERVICO_ENTRADA/DADOS/INCLUI_BOLETO/TITULO/JUROS_MORA/DATA Outra dica é utilizar o boleto de exemplo do ACBR. Me ajudou na implementação. Atc, Marcelo
  13. Olá Jhonlenon, vou enviar os arquivos por aqui, talvez possa ajudar outros. E desde já agradeço pela colaboração nos aperfeiçoamentos.retbradesco (em produção no site).phpManual_Registro_de_Boleto_Bancario_Online_Jun17.pdfManual_Bradesco_Online.rarEnviarBoletoBradesco (em produção no delphi).pas
  14. Olá Jhonlenon, eu tenho uma rotina de transmissão de boleto via webservice, porém como o Bradesco exige assinatura digital no boleto e eu não consegui assinar através do delphi, criei uma rotina intermediária em PHP para fazer assinatura, transmissão e retorno. Funciona assim: Delphi gera arquivo JSON e envia para site (rotina PHP que pega o JSON, assina, transmite e pega retorno, e devolve retorno para o delphi). Se tiver interesse em conhecer e até mesmo aprimorar a rotina posso disponibilizar.
  15. Olá marlonapcred, eu precisei desenvolver o CNAB para o BB e utilizei o ACBrCNAB do Branches. Já está em produção. Agora, fui atualizar o branches novamente e percebi que vieram atualizações do CNAB do Banco Itaú. O ideal seria ajuntar o BB ao componente para ter apenasACBrCNAB_BB.rar um. Vou anexar o componente que customizei para o BB e veja se ajuda.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.