Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 3293 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Prezados,

Estou desenvolvendo uma rotina de baixa do arquivo retorno para o banco SICOOB.

O boleto e o arquivo remessa já foram homologados pelo banco e meu cliente já está utilizando. Agora que ele recebeu um arquivo de retorno onde irei programar esta rotina.

Observei que o nosso numero para o SICOOB é 7. Ele calcula o digito e no final fica com 8.

Meu sistema grava o nosso numero completo no banco de dados, ou seja, os 8 dígitos.

A composição do código de barras, está sendo composta por 8 dígitos.

    {Montando Campo Livre}

    CampoLivre    := PadLeft(trim(ACBrTitulo.ACBrBoleto.Cedente.Modalidade), 2, '0') +

                     PadLeft(trim(ACBrTitulo.ACBrBoleto.Cedente.CodigoCedente), 7, '0') +

                     PadLeft(Copy(ANossoNumero,1,8), 8, '0') +  //7 Sequenciais + 1 do digito

                     IntToStrZero(Max(1,ACBrTitulo.Parcela),3);

Se analisarmos os layouts tanto do arquivo remessa, quanto do arquivo retorno, observaremos que o nosso numero começa na posição 63 e termina na posição 74 com o digito.

Na geração do arquivo remessa, está sendo levado os 8 dígitos.

    PadLeft( NossoNumero + DigitoNossoNumero, 12, '0')         +  // Nosso Número + //nosso numero com digito

Já no arquivo retorno, ele não está considerando o digito, ou seja, apenas os 7 dígitos.

    NossoNumero  := copy( Copy(Linha,63,11),Length( Copy(Linha,63,11) )-TamanhoMaximoNossoNum+1  ,TamanhoMaximoNossoNum);

Desse jeito, meu sistema não consegue localizar o nosso numero no banco de dados e não consegue realizar a baixa.

Para resolver isso, poderíamos usar o copy de 12, para contemplar o digito

    NossoNumero  := copy( Copy(Linha,63,12),Length( Copy(Linha,63,12) )-TamanhoMaximoNossoNum+1  ,TamanhoMaximoNossoNum);

Ou criar uma propriedade para o digito “DigitoNossoNumero”para que eu possa concatenar no momento de localizar. Na remessa existe essa propriedade, já no retorno não.

Se tiver essa propriedade, usaríamos assim:

    DigitoNossoNumero:= copy( Copy(Linha,74,1);

Só que para incluir o “DigitoNossoNumero” teria que alterar o “ACBrBoleto” já a alteração do copy não precisaria, seria apenas no “ACBrBancoBancoob”

O que acham? Alguém tem alguma sugestão?

Rotina “LerRetorno400” da unit “ACBrBancoBancoob”

Boleto - SICOOB Ag3008-2 Conta00078942-9.pdf

Layout-Remessa.JPG

Layout-Retorno.JPG

REMESSA05A09-1 - TESTE.TXT

RETORNO05A09-1 - TESTE.ret

Postado (editado)

Bom dia!

Como não tive sugestões quanto a solução para o problema apresentado, resolvi por uma solução mais simples. Resolvi usar a sugestão 1, ajustar o copy do nosso numero. Assim, não precisaremos alterar o ACBrBoleto.

Código atual:

NossoNumero := copy( Copy(Linha,63,11),Length( Copy(Linha,63,11) )-TamanhoMaximoNossoNum+1  ,TamanhoMaximoNossoNum);

Como deveria ficar:

NossoNumero := copy( Copy(Linha,63,12),Length( Copy(Linha,63,12) )-TamanhoMaximoNossoNum+1  ,TamanhoMaximoNossoNum);

 

Segue a unit modificada para atualização no SVN.

Grato.

ACBrBancoBancoob.pas

Editado por denerbuzato
  • Administradores
Postado

Boa noite.

Somente hoje foi possível analisar seu código, porém acredito que essa mudança pode trazer problemas para outros usuários deste banco que não utilizam o DV do Nosso Número em seus sistemas.

Você poderia utilizar as funções do próprio componente para calcular o DV do mesmo, ou então, a criação de propriedade especifica para receber o DV.

Att.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Postado

Bom dia Juliana,

Obrigado pelo retorno. Realmente sabia que poderia afetar outros usuários, tanto que no início do post dei duas opções para desenvolvimento. Só que a criação do dígito no "ACBrBoleto" atenderia apenas o SICOOB, e pensei que seria mais fácil retirar o dígito do nosso numero (já que ele viria com 8) para quem usa com ele com 7, do que não ter ele para o caso de quem precisa. É melhor ter do que não ter. Pois tendo pode ser tratado para retirar, agora não tendo não tem como fazer nada.

Observe que quem usa assim, está usando errado, pois não está de acordo com o manual. Como no boleto e remessa estão contemplando o dígito, logo o retorno também deveria contemplar.

A sua sugestão para calcular o digito me chamou atenção, porém não consegui usar ela. Poderia me dar um exemplo de como usar? Já que pelo visto o retorno continuará em desacordo com o manual.

Obs.: Fiz a atualização do componente hoje pela manhã "revisão 10489" e fiz novamente o ajuste do copy como estou usando.

Grato.

ACBrBancoBancoob.pas

  • Administradores
Postado

Boa tarde.

Em relação ao uso da função para calcular o DV mesmo no retorno, bastaria vc fazer looping na lista de títulos e a cada titulo chamar a função CalcularDigitoVerificador() passando o titulo atual.

Att.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Postado

Boa tarde,

Tentei fazer exatamente isso, porém, não consigo chamar a função. Segue um pedaço do meu código para ver se consegue me dizer como usar

  if Open.Execute then
  begin
    //Configurar banco
    ConfiguraComponenteAcBr;
    //
    ACBrBoleto1.NomeArqRetorno := ExtractFileName(Open.FileName);
    ACBrBoleto1.DirArqRetorno  := ExtractFilePath(Open.FileName);
    ACBrBoleto1.LerRetorno;
    for i := 0 to ACBrBoleto1.ListadeBoletos.Count-1 do
    begin
      if ACBrBoleto1.ListadeBoletos.Objects.ValorRecebido > 0 then
      begin
        // Grava a baixa da conta - recebimentos
        try


            ... aqui tem um sql para localizar qual conta baixar com o filtro, que é o ponto que estou com problema...

            qryCRBLanc.Parameters.ParamByName('NossoNumero').Value  := StrToInt(ACBrBoleto1.ListadeBoletos.Objects.NossoNumero);

            ... caso ele encontre o registro ele processa as baixas mais abaixo.

Obs.: Esse digito que você me ajudará a calcular vou usar concatenando com o nosso numero para localizar o lançamento.

Grato

  • Administradores
Postado

Boa tarde.

Utilize da seguinte maneira ACBrBoleto1.Banco.CalcularDigitoVerificador().

Att.

  • Curtir 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Postado

Boa tarde,

Funcionou com a sugestão oferecida, apesar de não concordar em ter que recalcular o digito uma vez que ele já faz parte do nosso numero e o manual contempla ele, mas irei utilizar desta maneira para evitar ficar com o componente desatualizado.

Obrigado pela atenção.

  • Este tópico foi criado há 3293 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.