Ir para conteúdo
  • Cadastre-se

dev botao

Retorno Sicoob Cnab240


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

Recommended Posts

Saudações.

Atualizei no svn antes de executar e obtive estes resultados.

O Sicoob está me deixando louco.

Baixo o retorno das cobranças do sicoob CNAB240 e processo com o ACBrBoleto1.LerRetorno;
 Ao processar o retorno ele me dá a seguinte mensagem:

AcbrBoletoBancoSicoob.png.504ea18a50a1255a67f1ff4cee1d5bc8.png

Rastreei o problema até este código na Unit AcbrBancoBancoob. Aproximadamente linha 475. Segue Código abaixo:

    if (rConta + rDigitoConta <> OnlyNumber(Cedente.Conta + Cedente.ContaDigito))
    then
      if (rConta + rDigitoConta <> (Cedente.Conta + Cedente.ContaDigito)) then
        raise Exception.CreateFMT('Conta do arquivo %s inválida, config %s',
          [rConta, OnlyNumber(Cedente.Conta + Cedente.ContaDigito)]);

Infelizmente aí terminam meus conhecimentos de como resolver o problema.

Informo porém que a conta no banco tem o número: 23582-2

No aguardo de sugestões,

 

Claudiomir

 


 

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Claudiomir disse:

AcbrBoletoBancoSicoob.png.504ea18a50a1255a67f1ff4cee1d5bc8.png
Informo porém que a conta no banco tem o número: 23582-2

 

No aguardo de sugestões,

É muito provável que a cooperativa que você está gerando ainda está utilizando o tamanho da conta fpTamanhoConta nesta mesma unit como 12, experimente usar 8 ou 10, afinal, se houvesse um padrão seria bem cômodo mas não é.

_____________

Prates, Agnaldo

Link para o comentário
Compartilhar em outros sites

15 horas atrás, Agnaldo Prates disse:

É muito provável que a cooperativa que você está gerando ainda está utilizando o tamanho da conta fpTamanhoConta nesta mesma unit como 12, experimente usar 8 ou 10, afinal, se houvesse um padrão seria bem cômodo mas não é.

Bom dia

Alterar o fptamanhoConta não resolveu. Testei todas as opções.

fptamanhoConta:=8;

fptamanhoConta:=10;

fptamanhoConta:=12;

É indiferente. Erro continua.

Notei algo, porém. (nem sei se estou no caminho certo, mas enfim...) Veja imagem abaixo:

rconta.png.d1588221deba1e4b2624dcbe17c68074.png

o Campo rConta trabalha com 12 caracteres.

Mas o campo Cedente.Conta trabalha com apenas 5 caracteres. (23582). 

Pergunto: Não seria apenas uma questão de formatação? Tipo incluir zeros a esquerda a partir do fptamanhoconta?

Tentei isso (e pedi perdão várias vezes por mutilar o código de forma tão horrível), e embora nem sempre funcione (1 em cada 3 vezes dá certo).

   a := Cedente.Conta + Cedente.ContaDigito;
    c:= a;
    a := StringOfChar('0', 12 - Length(c))+a;
    b := (rConta + rDigitoConta);
    if (b <> a) then
      if (b <> (a)) then
        raise Exception.CreateFMT('Conta do arquivo %s inválida, config %s',
          [rConta, OnlyNumber(Cedente.Conta + Cedente.ContaDigito)]);
Quando ele funciona, porém dá o seguinte erro:

rconta2.png.18e1180e1adbcbc83dc5e0ac276d72ae.png

Assim, sucessivamente. Erro após erro.

Seria isso ou estou totalmente fora da casinha?

Ainda pensando em como resolver isso e no aguardo de sugestões.

Claudiomir

 

Link para o comentário
Compartilhar em outros sites

Obrigado pelo arquivo.

A primeira coisa a ser feita é configurar corretamente os dados no componente.
O tamanho da conta do arquivo é 8, informar no componente a conta da seguinte forma: 23582, ou seja, sem os zeros à esquerda, fazer as seguintes mudanças na unit ACBrBancoBancoob.pas
Linha : 89 fpTamanhoConta := 8;
Linha : 470 trocar:

de:
      if ( rConta + rDigitoConta <> OnlyNumber(Cedente.Conta + Cedente.ContaDigito)) then
para:

      if ( OnlyNumber(rConta + rDigitoConta) <> OnlyNumber(Cedente.Conta + Cedente.ContaDigito)) then

 

boleto.png

_____________

Prates, Agnaldo

Link para o comentário
Compartilhar em outros sites

39 minutos atrás, Agnaldo Prates disse:

Obrigado pelo arquivo.

A primeira coisa a ser feita é configurar corretamente os dados no componente.
O tamanho da conta do arquivo é 8, informar no componente a conta da seguinte forma: 23582, ou seja, sem os zeros à esquerda, fazer as seguintes mudanças na unit ACBrBancoBancoob.pas
Linha : 89 fpTamanhoConta := 8;
Linha : 470 trocar:

de:
      if ( rConta + rDigitoConta <> OnlyNumber(Cedente.Conta + Cedente.ContaDigito)) then
para:

      if ( OnlyNumber(rConta + rDigitoConta) <> OnlyNumber(Cedente.Conta + Cedente.ContaDigito)) then

 

boleto.png

Saudações Agnaldo.

Segui vossa orientação. Passo a Passo.

Salvei em imagens para melhor tentar te explicar.

Quando eu entro na tela de busca de retorno, eu não sei de que banco virá o arquivo, pois meu cliente trabalha com vários bancos.

Portanto, quando ele seleciona uma conta corrente, eu busco a informação da conta e do banco e direciono a pesquisa. 

Especificamente para o Sicoob, esse é o passo a passo.

Passo 1: Arquivo retcobranca.pas

identificaconta.png.4c3fd8298f7ec7d73cf651ab765a8d73.png

Ou seja, nesse ponto, os dados da conta, banco, digito, enfim... são carregadas. E chequei, elas estão corretamente informadas conforme imagem acima.

Passo 2: Logo abaixo disso eu tenho o seguinte código:

    fprinci.ACBrBoleto1.DirArqRetorno := extractfilepath(narq);
    fprinci.ACBrBoleto1.NomeArqRetorno := extractfilename(narq);
    fprinci.ACBrBoleto1.LayoutRemessa := c240;
    fprinci.ACBrBoleto1.LerRetorno;

Passo 3: Dentro do LerRetorno, ele vai chechar o cnab retorno identificando o c240.

Pergunto? Quando ele entra no Acbrbancobancoob ele lê novamente os dados da conta?

Por que em algum lugar ele está mudando os dados que eu informei quando da definição da conta (Passo 1). Veja imagens abaixo os valores de a e b:

Valor de a:

acbrbancobancoob.png.e958f38542149d41baa1c9741b192855.png

Valor de b:

acbrbancobancoob2.png.4cd912b03d83fadeb1cf6bbcec10a12a.png

 

 

 

 

 

E, infelizmente o erro persiste:

rcontaerro3.png.8b57eaf9e2cb0f10201e3d62addee2a4.png

 

Ainda sem Idéias,

 

Claudiomir

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

23 minutos atrás, Agnaldo Prates disse:

O tamanho da conta deve ser 8 está 0000000023852 deverá ficar assim 00023852.

Saudações Agnaldo,

Creio que é aqui que deva ser mudado. 

Na Rotina acbrbancoBancoob temos essa instrução:

Tentei usar um OnlyNumber mas não funcionou. Ele continua pegando todos aqueles zeros direto do arquivo de retorno. Como eu me livro de tantos zeros? Se é que é assim que deve ser feito, é claro?

rconta5.png.7196a6e66207de40c0c5d4c7a62eb4dd.png

No aguardo de idéias,

Claudiomir

 

Link para o comentário
Compartilhar em outros sites

Cara... To ficando meio perdido aqui. Eu atualizei o svn ontem. Não deveria ter atualizado o AcbrBancoBancoob também??

De qualquer forma, deu... quase certo.

9 minutos atrás, Agnaldo Prates disse:

No meu está assim:
   rConta   := trim(Copy(ARetorno[0],63,TamanhoConta)); Note que é 63 e não 59.

rconta6.png.ae0a06f5ebc7535e955785d03e62967e.png

E o Tamanho da Conta

rconta7.png.5981ec13f4af38de8ca712f428e54b85.png

Quanto ao Erro.

rcontaerro4.png.d308d0b3b66ab46e379682f0a2fc9694.png

Ainda tentado conseguir fazer funcionar.

Mas agora, só segunda. O chefe tá mandando todo mundo embora

Grato Agnaldo.

Bom final de semana.

Claudiomir

 

rconta6.png

rconta4.png

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Claudiomir disse:

E o Tamanho da Conta

Use assim, que quando mudar o tamanho da conta não precisa mudar na unit.

   case TamanhoConta of
      8:  rConta := trim(Copy(ARetorno[0],63,TamanhoConta));
      10: rConta := trim(Copy(ARetorno[0],61,TamanhoConta));
      12: rConta := trim(Copy(ARetorno[0],59,TamanhoConta));
   end;

 

_____________

Prates, Agnaldo

Link para o comentário
Compartilhar em outros sites

Bom dia Agnaldo

Fiz as Alterações conforme você sugeriu. Imagem Abaixo:

rcontaerro5.png.3b49d2dcc68ecb5143b3492071047d42.png

No entanto, o erro persiste:

rcontaerro4.png.d355ccfb402d2f2fa03d9847880c202b.png

Embora ele esteja trazendo corretamente pelo tamanho 8 em TamanhoConta.

Agnaldo, eu acho que tem algo desatualizado aqui, ou atualizado incorretamente. 

Essas alterações do código que vc me enviou, você fez manualmente ou já faziam parte da Unit?

Por que se já faziam parte, tem alguma coisa que tá faltando aqui. 

Coloquei a instrução seguinte para teste:

    if (OnlyNumber(rConta + rDigitoConta) <> OnlyNumber('000'+Cedente.Conta +
      Cedente.ContaDigito)) then
 

Observe que eu "forcei" .... '000'+.... no código para ver se dava erro. Não deu. Não aqui, pelo menos.

O próximo erro era dizendo que o cnpj deve ter 14 dígitos(apenas numeros).

Eu estou ainda tentando entender.

Claudiomir.

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

25 minutos atrás, Agnaldo Prates disse:

Bom dia. Feitas manualmente na minha unit.

 

Saudações Agnaldo

Faltava setar o TipoInscrição para pJuridica. Estava em pOutras.

Funciona!

Minha dúvida é que a hora que eu tiver que atualizar novamente o Acbr ele vai perder estas mudanças todas, ou você repassa as alterações para eles atualizarem a Unit direto no pacote do acbr?

No mais, agradeço por todo vosso esforço, paciência e ajuda a este pobre noob que ainda apanha das coisas óbvias.

Meus Agradecimentos, mais uma vez.

Claudiomir

image.png

Link para o comentário
Compartilhar em outros sites

5 minutos atrás, Claudiomir disse:

Minha dúvida é que a hora que eu tiver que atualizar novamente o Acbr ele vai perder estas mudanças todas, ou você repassa as alterações para eles atualizarem a Unit direto no pacote do acbr?

Não há o que agradecer, naquilo que podemos ajudar será sempre um imenso prazer.

As units, ACBrBoleto e ACBrBancoBancoob eu não atualizo a um bom tempo, claro, quanto há mudanças eu apenas as aplico nestas units manualmente visto que como trata-se de cooperativas, embora deveriam manter um padrão nos seus arquivos, tanto de remessa quanto de retorno, isso não condiz com a realidade de muitas delas, inclusive versão do layout, tamanho de conta em fim, o que aplica para uma as vezes não é o mesmo para outra cooperativa.

Lembre-se de estas units que mantenho para o Bancoob são as mesmas do ACBrBoleto, somente não aplico certas alterações propostas por ser incompatíveis em alguns casos pontuais.

_____________

Prates, Agnaldo

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Agnaldo Prates disse:

Não há o que agradecer, naquilo que podemos ajudar será sempre um imenso prazer.

As units, ACBrBoleto e ACBrBancoBancoob eu não atualizo a um bom tempo, claro, quanto há mudanças eu apenas as aplico nestas units manualmente visto que como trata-se de cooperativas, embora deveriam manter um padrão nos seus arquivos, tanto de remessa quanto de retorno, isso não condiz com a realidade de muitas delas, inclusive versão do layout, tamanho de conta em fim, o que aplica para uma as vezes não é o mesmo para outra cooperativa.

Lembre-se de estas units que mantenho para o Bancoob são as mesmas do ACBrBoleto, somente não aplico certas alterações propostas por ser incompatíveis em alguns casos pontuais.

 

Certo.

Engraçado que nós programadores devemos seguir padrões para essas atividades enquanto os próprios bancos não seguem nem as próprias normas.

No fim, quem está sempre errado somos nós que ralamos para fazer as coisas deles funcionarem.

Grato, mais uma vez Agnaldo.

Claudiomir

 

Link para o comentário
Compartilhar em outros sites

Em ‎11‎/‎11‎/‎2017 at 11:31, Agnaldo Prates disse:

Obrigado pelo arquivo.

A primeira coisa a ser feita é configurar corretamente os dados no componente.
O tamanho da conta do arquivo é 8, informar no componente a conta da seguinte forma: 23582, ou seja, sem os zeros à esquerda, fazer as seguintes mudanças na unit ACBrBancoBancoob.pas
Linha : 89 fpTamanhoConta := 8;
Linha : 470 trocar:

de:
      if ( rConta + rDigitoConta <> OnlyNumber(Cedente.Conta + Cedente.ContaDigito)) then
para:

      if ( OnlyNumber(rConta + rDigitoConta) <> OnlyNumber(Cedente.Conta + Cedente.ContaDigito)) then

 

boleto.png

Agnaldo este Demo do ACBRBoleto não vem no SVN, voce quem desenvolveu correto, estou com duvidas no retorno e vi que voce fez uma tela somente para isso. Na caixa em o retorno da remessa, e teria o retorno do boleto pago, são dois tipos de retorno ??

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Dall'ara disse:

Agnaldo este Demo do ACBRBoleto não vem no SVN, voce quem desenvolveu correto, estou com duvidas no retorno e vi que voce fez uma tela somente para isso. Na caixa em o retorno da remessa, e teria o retorno do boleto pago, são dois tipos de retorno ??

Este demo não está no svn, eu alterei e guardo em uma pasta separada justamente para testar os retornos dos bancos, no entanto, quanto à sua dúvida, no caso da caixa econômica deve haver dois retornos sim, um informando sobre a recepção do arquivo de remessa outro relativo às liquidações. Imagino que seja isso.

_____________

Prates, Agnaldo

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Claudiomir disse:

Saudações 

Conseguiu fazer a leitura do Retorno?

Claudiomir

Não consegui fazer os testes ainda, esta um pouco confuso pra mim o que é retorno, pois temos dois tipos de retorno ao meu ponto de vista, o ACBRBoleto.lerRetorno ele vai importar qual dos retornos o de confirmação dos boletos ou o de liquidação, outra coisa que eu tive duvidas e acabei tento que adaptar meu ACBR foi criar uma linha no arquivo de remessa do tipo Y.

Link para o comentário
Compartilhar em outros sites

13 horas atrás, Dall'ara disse:

Não consegui fazer os testes ainda, esta um pouco confuso pra mim o que é retorno, pois temos dois tipos de retorno ao meu ponto de vista, o ACBRBoleto.lerRetorno ele vai importar qual dos retornos o de confirmação dos boletos ou o de liquidação, outra coisa que eu tive duvidas e acabei tento que adaptar meu ACBR foi criar uma linha no arquivo de remessa do tipo Y.

Saudações Dall'ara

Eu, realmente, mas realmente não entendo o conceito de remessa do tipo Y. 

Mas posso te dizer o que eu faço, e como faço. Se isso te ajudar, estou a disposição para retirar as dúvidas do que posso, por que sei que sem ajuda, é difícil.

Vou te exemplificar aqui o que uso para o Sicoob, mas é ajustável para qualquer banco(EU ESPERO).

Quando você uso o AcbrBoleto,LerRetorno, ele vai gerar os dados em um arquivo(stringlist, eu acredito) em tempo de memória. 

Você vai definir o que é o Lançamento( Baixa, aviso, tarifa) no momento em que processar esses dados.

Qualquer banco, segundo a FEBRABAN, tem que seguir alguns padrões(Dificilmente o fazem) então temos algo a partir de onde começar.

Como eu fiz. Dentro da tabela onde armazeno as Contas Correntes Bancárias, criei 3 campos. CódigoTransmissão,CodigoBaixa,CódigoTaxas. E a cada um deles eu atribuo valores.

Códigos para Baixa
06,00,A8,H5,H6,H8,X1,X2,X3,X4,X5,X0,X6,X7,X8,X9,XA,XB
Códigos para Taxas/Tarifas
03,04,08,A9,B1,B2,B3,E1,F5,28
Códigos para Rejeição
01,02,03,04,05,07,08,10,15,16,17,21,22,24,29,31,33,34,36,38,39,40,41,45,46,47,60,A1,A2,A4,A5,A6,B4,B5,B6,B7,B8,B9,C6,C7,D2,F7,F8,F9,G1,G5,G8,G9,H1,L3,L4,J8

De onde vem esses valores? FEBRABAN. Se todos os bancos os seguem? Nééééééé´. Mais ou menos. Vamos nos focar naqueles que os seguem.

Como eu faço:

retornocobranca.png.67de1f08123961d9334ac13c1fd60049.png

 

Na hora de processar o LerRetorno eu uso o código abaixo (VOCÊ VAI PRECISAR ADAPTAR PARA OS SEUS DADOS E MANEIRAS DE PROGRAMAR)

while....

  if retorno.RecordCount > 0 then
  begin
    retorno.first;
    while not retorno.Eof do
    begin
      cre.Locate('crechave', retornoCrechave.AsInteger, []);
      if cre.Locate('crechave', retornoCrechave.AsInteger, []) then
      begin
       // vchvbaixa := retornovalorbaixado.AsFloat;

        // 06,00, A8, H5, H6, H8, X1, X2, X3, X4, X5, X0, X6, X7, X8, X9, XA e XB

        // encontrar a ocorrência de baixa

        if pos(retornoocorrenciaoriginal.AsString, ctaCodigobaixa.AsString) > 0
        then
        begin
          bxc.Append;
          bxcbcxchave.AsInteger := fprinci.RetornaNovoGenerator('bxc',
            'bxcchave');
          bxcTipo.AsString := 'Baixa';
          bxcvlrbx.AsFloat := retornovalorbaixado.AsFloat;
          bxcvlrjuro.AsFloat := retornojuros.AsFloat;
          bxcvlrmulta.AsFloat := retornomulta.AsFloat;
          bxc.Post;
        end;

        if pos(retornoocorrenciaoriginal.AsString, ctaCodigotaxas.AsString) > 0
        then
        begin
          if retornovalortarifa.AsFloat > 0 then
          begin

            bxc.Append;
            bxcbcxchave.AsInteger := fprinci.RetornaNovoGenerator('bxc',
              'bxcchave');
            bxcTipo.AsString := 'Tarifa';
            bxcvlrbx.AsFloat := retornovalorbaixado.AsFloat;
            bxcvlrjuro.AsFloat := retornojuros.AsFloat;
            bxcvlrmulta.AsFloat := retornomulta.AsFloat;
            bxc.Post;
          end;
        end;
      end;
    end;
  end;
 

Por que o arquivo de retorno é um só e ele vem com toda a movimentação do dia, independente se é baixa um uma confirmação qualquer. Neste ponto você deve determinar o que é  o movimento e o que você vai fazer com ele.

Sempre a disposição se precisar,

Claudiomir

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2193 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.

The popup will be closed in 10 segundos...