Ir para conteúdo
  • Cadastre-se

mlgoncalves

Membros
  • Total de ítens

    78
  • Registro em

  • Última visita

Tudo que mlgoncalves postou

  1. Olá Victor, na alteração ficou faltando uma correção. Segue a UNIT corrigida Marcelo ACBrBoletoRet_Bancoob.pas
  2. Olá Victor, Como saber se um boleto foi ou não registrado no banco Sicoob? Resposta: quando o codigo do objeto status estiver preenchido com 200; ou ACBrBoleto.Enviar retornar false. Como disse no post de abertura desse tópico, o Sicoob retorna sempre o código 207 (quando a comunicação é feita com sucesso) para boleto registrado ou não registrado, que retorna TRUE na função ACBrBoleto.Enviar Então não pode consultar esse valor retornado como indicador de registro de boleto. Entendo que a outra forma seria consultar a lista ListaRejeicao que, se contiver linha preenchida indicará o motivo da rejeição. Se não tiver linha preenchida indicará que o boleto foi registrado com sucesso. Nesse sentido estou anexando a Unit com a proposta de modificação. Agora, caso vocês interpretem uma lógica diferente, onde o programador deverá consultar obrigatoriamente a ListaRejeicao para saber se o boleto foi ou não registrado no banco, mesmo assim será necessário corrigir a programação que alimenta a lista pois não está funcionando corretamente. Estou anexando também um exemplo de retorno. No aguardo. retorno_boleto_registrado.json ACBrBoletoRet_Bancoob.pas
  3. Olá pessoal, Segue a Unit modificada. Atenciosamente, ACBrBoletoW_Bancoob.pas
  4. Olá Pessoal, Desculpe mas passei informação errada sobre o campo SeuNumero no banco Sicoob. Somente descobri quando peguei hoje o arquivo Retorno. O campo SeuNumero no Sicoob contém o número do documento a que o boleto se refere (ex. NF.393939, etc) que também é impresso no boleto. É um campo alfanumérico e é retornado nas posições 59 a 73 do segmento T do CNAB240. >> Entendo que o campo SeuNumero do Sicoob corresponde ao campo NumeroDocumento do ACBrBoleto. O campo identificacaoBoletoEmpresa no Sicoob é para ser utilizado pelo ERP anotando o ID do boleto, por exemplo e não é impresso no boleto. Também é um campo alfanumérico e é retornado nas posições 106 a 130 do segmento T do CNAB240. >> Entendo que o campo identificacaoBoletoEmpresa do Sicoob corresponde ao campo SeuNumero do ACBrBoleto. Segue abaixo a Unit modificada. Atenciosamente, ACBrBoletoW_Bancoob.pas
  5. Olá pessoal, O grupo GerarJuros do JSON está com erro no preenchimento do campo 'tipoJurosMora'. TACBrCodigoJuros = (cjValorDia, cjTaxaMensal, cjIsento, cjValorMensal, cjTaxaDiaria); Integer(aTitulo.CodigoMoraJuros) retorna cjValorDia = 0 -------->>>>> no JSON deve ser informado 1 vjTaxaMensal = 1 --------->>>>>>> no JSON deve ser informado 2 Transcrição do código que está no SVN com erro e a proposta de correção: case (StrToIntDef(aTitulo.CodigoMora, 0)) of 0: // Isento begin AJson.Add('tipoJurosMora').Value.AsInteger := 0; AJson.Add('valorJurosMora').Value.asNumber := 0; end; 1: // Dia begin // AJson.Add('taxa').Value.asNumber := aTitulo.ValorMoraJuros; AJson.Add('tipoJurosMora').Value.AsInteger := Integer(aTitulo.CodigoMoraJuros); <<<<<<----- Corrigir esta linha anotando o número 1 (um). A função retorna 0 (zero); AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; 2: // Mês begin AJson.Add('tipoJurosMora').Value.AsInteger := Integer(aTitulo.CodigoMoraJuros); <<<<<<<<------- Corrigir esta linha anotando o número 2 (dois). A função retorna 1 (um); AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; end; Atenciosamente, Marcelo Gonçalves
  6. Olá Victor, acabei de atualizar os fontes pelo SVN e entendo que a modificação feita não atende o requisito. Modificação feita: case HttpResultCode of 207: begin aJsonViolacoes := aJson.Values['resultado'].AsArray; for x := 0 to aJsonViolacoes.Count -1 do begin aJsonViolacao := aJsonViolacoes[x].AsObject; aJsonViolacoes := aJsonViolacao['status'].AsArray; ARejeicao := ARetornoWS.CriarRejeicaoLista; ARejeicao.Codigo := aJsonViolacao.Values['codigo'].AsString; ARejeicao.mensagem := aJsonViolacao.Values['mensagem'].AsString; end; end; 400,406,500 : begin aJsonViolacoes := aJson.Values['mensagens'].AsArray; for x := 0 to aJsonViolacoes.Count -1 do begin aJsonViolacao := aJsonViolacoes[x].AsObject; ARejeicao := ARetornoWS.CriarRejeicaoLista; ARejeicao.Codigo := AJsonViolacao.Values['codigo'].AsString; ARejeicao.mensagem := AJsonViolacao.Values['mensagem'].AsString; end; end; end; Onde está o problema no meu ponto de vista: HTTPResultCode=207 indica tanto sucesso de registro de boleto quanto erro. Não acho correto preencher a lista de violações de regras sendo que quando o boleto é registrado não houve violação de nenhuma regra. Insisto que quando aJsonViolacao.Values['codigo'].AsString estiver retormadp com 200, nada a fazer, boleto registrado com sucesso. Quando retornado com 400 aí sim tem problema a ser corrigido.
  7. Olá pessoal, Entendo que existe erro no preenchimento o campo SEUNUMERO no JSON gerado pela unid ACBrBoletoW_Bancoob.pas. Está preenchendo neste campo o valor de NossoNumero e entendo que deveria ser SeuNumero. Cópia das linhas o arquivo original: Json.Add('nossoNumero').Value.AsString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); Json.Add('seuNumero').Value.asString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); //ATitulo.SeuNumero; Json.Add('identificacaoBoletoEmpresa').Value.AsString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); Copia das linhas propostas para correção: Json.Add('nossoNumero').Value.AsString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); Json.Add('seuNumero').Value.asString := ATitulo.SeuNumero; Json.Add('identificacaoBoletoEmpresa').Value.AsString := ATitulo.SeuNumero; Entendo que o componente deva ser coerente no preenchimento dos campos. Se houver alguma necessidade de particularizar o conteúdo dos campos isso deve ser tratado na aplicação. ACBrTituloNaAplicacao.SeuNumero := 'ID DO BOLETO NO BANCO DE DADOS DA APLICACAO'; ou se preferir 'NOSSO NÚMERO DO BOLETO' ACBrTituloNaAplicacao.NossoNumero := 'NOSSO NÚMERO DO BOLETO'; IdentificacaoBoletoEmpresa Não existe na classe TACBrTitulo, então o componente pode arbitrar o que deve ser preenchido: ou o nosso número (acho isso menos lógico) ou o seu número (acho essa escolha a mais lógica) Atenciosamente, Marcelo Gonçalves
  8. Olá pessoal, O HttpResultCode=207 é código retornado com sucesso do banco Sicoob tanto para indicar registro de boleto quando para indicar erros de preenchimento. Então é necessário tratar corretamente o JSON retornado para o preenchimento da lista dos erros retornados, se houver. Arquivos anexados: ACBrBoletoRet_Bancoob.pas -> alterado com o ajuste JSON com erro de retorno.json -> arquivo original retornado pelo Sicoob no código HttpResultCode=207 porém informando rejeição por erro de preenchimento do boleto JSON de boleto registrado.json -> arquivo original retornado pelo Sicoob no código HttpResultCode=207 de boleto registrado Atenciosamente, Marcelo Gonçalves ACBrBoletoRet_Bancoob.pas JSON com erro de retorno.json JSON de boleto registrado.json
  9. Sergio_api, a unit que postei acima está redondinha. É pegar e usar. Vamos aguardar a revisão para disponibilizarem no repositório. Marcelo.
  10. Olá pessoal! Estou dedicado em tentar finalizar a cobrança Sicoob através de API e me deparei com as seguintes situações que entendo devam ser atualizadas no repositório (segue em anexo unit devidamente modificada): Arquivo: ACBrBoletoW_Bancoob.pas 1) Formato da data, linhas 269/270 SVN: result := FormatDateBr( aValue, 'YYYY-MM-DD') + 'T' + FormatDateTime('hh:nn:ss', AValue) + PegaTimeZone; //'2023-05-26T03:00:00.000Z' - versão acbr - fora do formato esperado SOLUÇÃO PROPOSTA (não é desenvolvimento meu, mas de versões anteriores que está funcionando corretamente): result := FormatDateBr( aValue, 'YYYY-MM-DD') + 'T' + FormatDateTime('hh:nn:ss', AValue) + PegaTimeZone; //'2023-05-26T00:00:00-03:00' - correto, dentro do padrão definido pelo SICOOB function TBoletoW_Bancoob.PegaTimeZone: string; var TimeZone: TTimeZoneInformation; begin GetTimeZoneInformation(TimeZone); Result := FormatFloat('00', TimeZone.Bias div -60) + ':00'; end; 2) Rotina de geração do juros de mora procedure TBoletoW_Bancoob.GerarJuros(AJson: TJsonObject); begin if Assigned(aTitulo) then begin if Assigned(AJson) then begin if (aTitulo.ValorMoraJuros > 0) then begin if ATitulo.CodigoMora = '' then begin case aTitulo.CodigoMoraJuros of cjValorDia : aTitulo.CodigoMora := '1'; cjTaxaMensal : aTitulo.CodigoMora := '2'; cjIsento : aTitulo.CodigoMora := '0'; end; end; case (StrToIntDef(aTitulo.CodigoMora, 0)) of 0: // Isento begin AJson.Add('tipoJurosMora').Value.AsInteger := 0; AJson.Add('valorJurosMora').Value.asNumber := 0; end; 1: // Dia begin // AJson.Add('taxa').Value.asNumber := aTitulo.ValorMoraJuros; AJson.Add('tipoJurosMora').Value.AsInteger := 1; <<<<<<------ Isso está correto. A função do repositório Integer(aTitulo.CodigoMoraJuros) retorna o valor 0 (zero) AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; 2: // Mês begin AJson.Add('tipoJurosMora').Value.AsInteger := 2; <<<<<<------ Isso está correto. A função do repositório Integer(aTitulo.CodigoMoraJuros) retorna o valor 1 (um) AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; end; end; end; end; end; Atenciosamente, ACBrBoletoW_Bancoob.pas
  11. Olá Pedro, Utilizei os fontes que você disponibilizou e ainda não consegui gerar o token de autorização, necessário para utilização da API. No Postman eu consigo gerar o token, mas para isso tive de configurar o certificado digital informando os arquivos .CRT e .KEY. Tentei fazer exatamente o mesmo nos exemplos do ACBR, mas parece que está faltando alguma coisa pois não gera o token de jeito nenhum. Você tem alguma dica pra passar? Desde já agradeço. Marcelo Gonçalves
  12. Me ajuda numa coisa: onde informo o HOST 'https://auth.sicoob.com.br' que é necessário para a obtenção do token?
  13. Olá Marcelo Santos, você está conseguindo fazer o registro on-line através deste código? Estou fazendo testes e não estou tendo sucesso em obter o token de autorização.
  14. Prezados, bom dia! Favor incluir a espécie de título 'Boleto de Proposta', sigla 'BDP', código '32' para layout CNAB400, conforme demonstrado na imagem abaixo e conforme consta no arquivo de documentação do Banco do Bradesco que existe no repositório '..\Branches\tools\Bancos\237-Bradesco\CNAB400_Cobranca_2021_VER001_01_04_2021.pdf' Em anexo está o arquivo com a alteração. Atenciosamente, Marcelo Gonçalves ACBrBoleto.pas
  15. Olá ToninhoNunes, Vou verificar agora e retorno aqui.
  16. Bom dia, Antonio Gomes! Obrigado pela atenção. Vou fazer os testes de leitura dos códigos de barra e retorno depois. Atc, Marcelo.
  17. Prezados bom dia! Não estamos conseguindo ler o código de barras do boleto. Utilizamos FastReport e testamos a leitura com todos os layouts disponíveis e conseguimos sucesso apenas com o layout BoletoCarne, os demais não estão lendo. Testamos a leitura tanto na tela quanto no modelo impresso. Outro teste que fizemos foi de imprimir segunda via diretamente do site do banco (no caso utilizamos o Santanter para teste). Testamos a leitura do código de barras do boleto impresso do banco e ok, lido com sucesso. Mas do boleto impresso pelo ACBR não conseguimos ler. Seria alguma configuração no componente a ser feita? Não localizamos nada que pudesse interferir nisso. Se puderem ajudar, agradeçemos. Marcelo.
  18. 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
  19. Boa tarde! Segue em anexo unit ACBrPagForLerTxt.pas revisada. Por favor verifiquem e se jugarem pertinentes as alterações favor publicar. Atenciosamente, MarceloACBrPagForLerTxt.rar
  20. 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
  21. 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
  22. 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
  23. 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?
  24. 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
×
×
  • 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.