mlgoncalves
Membros-
Total de ítens
78 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que mlgoncalves postou
-
Obrigado. Conferido ok.
-
Olá Victor, na alteração ficou faltando uma correção. Segue a UNIT corrigida Marcelo ACBrBoletoRet_Bancoob.pas
-
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
-
Boleto Sicoob via WebService - GerarJuros JSON
mlgoncalves replied to mlgoncalves's tópico in ACBrBoleto
Olá pessoal, Segue a Unit modificada. Atenciosamente, ACBrBoletoW_Bancoob.pas -
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
-
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
-
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.
-
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
-
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
-
Sergio_api, a unit que postei acima está redondinha. É pegar e usar. Vamos aguardar a revisão para disponibilizarem no repositório. Marcelo.
- 55 replies
-
- 1
-
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
- 55 replies
-
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
- 55 replies
-
Me ajuda numa coisa: onde informo o HOST 'https://auth.sicoob.com.br' que é necessário para a obtenção do token?
- 55 replies
-
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.
- 55 replies
-
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
-
Não consegue ler código de barras do boleto
mlgoncalves replied to mlgoncalves's tópico in ACBrBoleto
Olá ToninhoNunes, Vou verificar agora e retorno aqui. -
Não consegue ler código de barras do boleto
mlgoncalves replied to mlgoncalves's tópico in ACBrBoleto
Bom dia, Antonio Gomes! Obrigado pela atenção. Vou fazer os testes de leitura dos códigos de barra e retorno depois. Atc, Marcelo. -
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.
-
ACBrPagFor - Método GravarTxt() Bando do Brasil
um tópico no fórum postou mlgoncalves Dúvidas Gerais sobre o ACBr
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 -
ACBRPagFor - Método LerTxt()
mlgoncalves replied to mlgoncalves's tópico in Dúvidas Gerais sobre o ACBr
Boa tarde! Segue em anexo unit ACBrPagForLerTxt.pas revisada. Por favor verifiquem e se jugarem pertinentes as alterações favor publicar. Atenciosamente, MarceloACBrPagForLerTxt.rar -
ACBRPagFor - Método LerTxt()
mlgoncalves replied to mlgoncalves's tópico in Dúvidas Gerais sobre o ACBr
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 -
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
-
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
-
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