Ir para conteúdo
  • Cadastre-se

dev botao

Problema No Calculo Do Dígito Verificador Do Nosso Número - Sicredi


Ver Solução Respondido por Juliomar Marchetti,
  • Este tópico foi criado há 3196 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá.

 

A algum tempo atras eu consegui homologar no site da Sicredi o arquivo de remessa.

Hoje tentei para um outro cliente, porém deu problema no dígito verificador do campo nosso número.

 

No manual do banco (em anexo, página 7) diz que:

 

Relacionar os códigos da cooperativa de crédito/agência beneficiária (aaaa), posto beneficiário (pp), do beneficiário (ccccc), ano atual (yy), indicador de geração do nosso número (B) e o número seqüencial do beneficiário (nnnnn): aaaappcccccyybnnnnn;

 

Porém na function CalcularDigitoVerificador, o componente estava adicionando também ao lado do código da agência, o dígito verificador da agência. 

 

Comentei a linha onde adicionava o dígito da agência e calculou o digito corretamente, e consegui validar o arquivo no site da sicredi.

 

Em anexo segue a alteração que eu fiz.

 

 

ACBrBancoSicredi.pas

  • 2 semanas depois ...
Postado

Fiz mais algumas alterações, estou aguardando o banco retornar com o OK.

Inclusive o logotipo, a Sicredi não aceito esse que está no componente, tive de alterar.

Quando o banco retornar, eu posto aqui novamente.

  • 2 semanas depois ...
Postado

Olá.

 

Acabei de receber OK da homologação junto ao banco Sicredi. 

Segue em anexo as alterações realizadas para conseguir homologar.

Também tive problemas com o logotipo do banco. Mesmo mandando em PDF o banco não aceitou a versão colorida, nem a versão preto e branco atual do componente. Tive de enviar de acordo com o logotipo que o banco enviou, que também está em anexo.

 

 

 

ACBrBancoSicredi.pas

post-2149-0-92321100-1393510880.jpg

  • 1 mês depois ...
  • Moderadores
Postado

Boa tarde

Não tenho como testar suas alterações

notei que tem valores fixos ao invés de propriedades ou parâmetros pra repassar essas informações!

 

por que na função CalcularDigitoVerificador você modificou removendo? isso também vale para o 240? ou só para 400 por exemplo?

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Olá Juliomar.

 

Eu não lembro de ter colocado algum valor fixo. Onde eu alterei, eu comentei o que tinha anteriormente e fiz a alteração, usando apenas as propriedades disponíveis.

 

Na função CalcularDigitoVerificador eu comentei a linha, visto que no manual não pede o dígito da agência para o cálculo. Eu testei com o banco usando o layout 400. Agora não me atentei se esse cálculo é diferente com o 240, visto que estava errado também na impressão do boleto.

 

Alterei também:

 

* function MontarCodigoBarras - montagem do campo livre 

* function MontarCampoCodigoCedente - Não estava de acordo como o banco solicitou na impressão

* procedure GerarRegistroHeader400 - Usa parte do código do cedente

* procedure GerarRegistroTrailler400 - Usa parte do código do cedente

 

O que eu percebi é que o banco fornece como o código do cedente um código composto de duas partes (UA/POSTO + Código do Cedente EX. 6000275), em algumas partes tem que usar o conteúdo inteiro do código do cedente e em outras descartar os primeiros 2 dígitos.

Postado

Testar eu não consigo, porém vou conferir a documentação do banco. Eu só tenho a documentação da versão 400, vou tentar ver com o banco se eles me disponibilizam da 240.

Postado

Bom dia Juliomar.

 

Estou analisando os 2 layouts (400 e 240) e são iguais nessa parte.

Porém acho que eu fiz uma confusão aqui, devido informações equivocadas que eu recebi. 

Quando estava homologando, estava informando o código do cedente ex. 00123, e o banco reclamou subentendendo que o código do cedente era 60.00123.

Porém, na pressa, quando fui analisar os fontes para ver o que estava acontecendo, percebi que estava sendo informado o dígito da agência bancária no lugar desse 60. O meu cliente informou que o dígito da agencia era 05. Porém, hoje entrei em contato com o banco e eles me informaram que eles não tem dígito na agência, não sei da onde que ele tirou 05 como dígito da agência.

Então entendi porque foi usado o campo dígito da agência para informar o código do posto de atendimento. O que quebra nesses casos, são estas nomenclaturas que as cooperativas utilizam, que acabam confundindo.

 

Vou rever e testar aqui novamente.

  • Moderadores
Postado

Ok, sempre que efetuar alterações é sempre bom verificar todas as possibilidades!

eu cheguei a efetuar o merge mas depois retornei e conferi novamente por isso lhe questionei

ficamos no aguardo dos testes e possíveis alterações

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Segue em anexo novo arquivo.

 

Desfiz as alterações que eu fiz relativo ao campo digito da agência bancária e do código cedente com o posto da cooperativa e fiz novamente os testes.

Ficou OK.

 

Porém, mantive as seguintes alterações:

 

Linha 124 (function MontarCodigoBarras), alterei para buscar o código do cedente, pois estava usando o campo número da conta como código do cedente (Ver manual página 86 - CNAB240 http://goo.gl/rYL6bs ou página 51 - CNAB400 http://goo.gl/532Izf ).

Linha 169 (function MontarCampoCodigoCedente), - mesma coisa.

 

Se olhar o manual 10539_M_CED_400.pdf (em anexo), na página 9, diz que "(...) O código do cedente será igual ao número da conta sem o dígito verificador, o seu uso será obrigatório no nome dos arquivos de remessa e retorno.(...)".

Entrei em contato com o 0800 do banco e o atendente me confirmou que o número da conta corrente é diferente do código do cedente. Questionei isso porque estava no manual que era igual e ele me falou que isso não é uma regra, que as vezes pode ser igual ou pode ser diferente.

ACBrBancoSicredi.pas

Postado

Ficou OK. Obrigado e desculpe aí qualquer transtorno.

Essa história de cada banco com suas diferenças acaba confundindo e dificultando nosso trabalho.

  • 1 ano depois...
Postado

Juliomar, só consegui validar o boleto sicredi comentando a linha 98 do ACBrBancoSicredi.pas

// padR(ACBrTitulo.ACBrBoleto.Cedente.AgenciaDigito,2,'0')+

Para gerar corretamente o digito verificador dos boletos.

 

Postado

E para validar o layout 240 precisei alterar na GerarRegistroTransacao240

wNossoNumeroCompleto: String;

 wNossoNumeroCompleto := OnlyNumber(MontarCampoNossoNumero(ACBrTitulo));

 

padL(wNossoNumeroCompleto, 20, '0')                            + // 038 a 057 - Identificação do título no banco 

  • Administradores
Postado

Bom dia.

Oque você estava informando na propriedade AgenciaDigito?

Quanto as alterações, favor anexar a unit alterada para análise.

 

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 !!

  • 2 meses depois ...
Postado (editado)

E para validar o layout 240 precisei alterar na GerarRegistroTransacao240

wNossoNumeroCompleto: String;

 wNossoNumeroCompleto := OnlyNumber(MontarCampoNossoNumero(ACBrTitulo));

 

padL(wNossoNumeroCompleto, 20, '0')                            + // 038 a 057 - Identificação do título no banco 

Olá, estou homologando as remessas do Sicredi, e também precisei fazer esta alteração mencionada pelo bhungaro.

Basicamente é seguir a mesma abordagem que foi feita no CNAB400, onde deve ser chamada a função MontarNossoNumero, que agora felizmente não mais altera o NossoNumero internamente (está infinitamente melhor assim... se é uma função realmente deveria somente retornar um valor calculado, e não alterar propriedades magicamente por baixo... mas ainda tem outros casos similares e perigosos, coisa pra outros esforços)... assim devemos usar o resultado da função como o bhungaro mencionou, implementação similar do CNAB400 que já foi feita como comentei.

Com esta mudança... nos caracteres 038 a 057 basta usar o valor calculado, não mais somando o dig verificador como está, pois está duplicado já que a função MontarCampoNossoNumero já tem ele.

Acabei de passar pelo validador com estas mudanças, e passou (tirando o problema abaixo).

Só achei mais um outro problema ainda de acentuação, pois não é permitido... isto postei no tópico: http://www.projetoacbr.com.br/forum/topic/7184-arquivo-remessa-banco-brasil/#comment-156781

 

Porém sobre o cálculo do DígitoVerificador, não tive problemas... revisei logicamente a função e não achei problemas. No DV da agência vai o Posto/UA que são 2 dígitos... sem problemas identificados.

 

 

Editado por Thiago Linhares
  • Administradores
Postado

Boa tarde.

Favor anexar o código alterado para que possa ser analisado.

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

Olá Juliana,

Como não estou no trunk2 ainda não enviei, por serem poucas linhas. Segue o arquivo do trunk. Todas as alterações são comentadas com MODULA CHANGES para o nosso controle aqui até que tenhamos o merge de volta feito. Fica fácil de vc achar as alterações simplesmente procurando por MODULA no arquivo... todas elas são comentadas.

Vc vai achar mais alterações além das que são pertinentes deste post. Tem correção/proteção contra caracteres acentuados e símbolos também (relacionado a outro post  http://www.projetoacbr.com.br/forum/topic/7184-arquivo-remessa-banco-brasil/#comment-156781) e mais algumas correções mais antigas que não havíamos postado de volta ainda por falta de tempo... se for o caso de incluí-las também melhor ainda.

Testei hoje com o validador online do Sicredi tanto o CNAB400 como o 240 e passou, e estará em processo de homologação com o cliente em breve.

Qq ponto estou a disposição. Obrigado.

ACBrBancoSicredi.pas

Postado

Olá, para ciência, informo que a remessa CNAB400 foi homologada pelo banco com as units que eu enviei acima.

Reforçando, as units são do Trunk porque não podemos ainda migrar para o Trunk2, mas já vi o código do Trunk2 destas units e o merge é bem simples.

Abraço

  • 2 semanas depois ...
Postado

Boa noite,

Postei antes que as remessas haviam sido aprovadas, realmente foram... porém recebi agora que o banco rejeitou o Boleto em si (não a remessa) devido ao NossoNumero incorreto e decorrentes cálculos de DVs.

Eu já corrigi e passou no teste da Planília exel que o Sicredi usa pra validar linha digitável. Entendo que existe um erro conceitual na forma como está implementado no Sicredi o método que gera o Cod de Barras. Enquanto em units como o Banco do Brasil, ao gerar o cod de barra o Nosso Numero é calculado usando a propriedade FNossoNumero como parte do cálculo e não sendo o nosso número já todo, no Sicredi ele está usando a FNossoNumero existente setado em algum lugar do além com a formatação que o banco espera, abordagem que eu não concordo postada aqui por exemplo:

http://www.projetoacbr.com.br/forum/topic/22175-mudança-de-montagem-do-nosso-número-banco-sicredi/?page=2#comment-152525

Eu acredito que o objetivo de usar o componente seja de encapsular as especificidades para que de fora do componente não tenhamos que nos preocupar com detalhezinhos de cada banco. Quanto mais encapsulado, melhor. Além claro, da consistência de abordagem de uso entre os bancos (como do BB que eu citei), que é algo crítico.

Este erro passou a acontecer depois que a propriedade NossoNumero deixou de ser setada magicamente no método onde monta o nosso número (o que reforço que é mil x mais claro e bom, mas gerou esse bug extra além dos outros que foram corrigidos nos posts acima).

Caso possível enviarei o resultado da homologação aqui. Segue a unit alterada... desculpem mas é no trunk ainda pois devido ao nr de correções que temos ainda não conseguimos migrar. Porém a correção é muito simples, é 1 linha no método que gera o cod de barras... está comentado com Modula Changes no local.

CUIDADO: usar esta correção irá dar mais consistência de uso para os vários bancos. Porém acredito (não validei, pois não usaremos a abordagem que consideramos conceitualmente incorreta e complicante) que irá quebrar para quem usa a abordagem como a que está no post que eu comentei acima.

Abraço!

ACBrBancoSicredi.pas

  • Administradores
Postado

Boa noite.

Por favor anexe aqui a planilha do Sicredi.

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

A última versão do arquivo "ACBrBancoSicredi.pas" que o Thiago postou é exatamente a mesma da última versão que está no ACBr atualmente... Não entendi, será que ele postou a versão errada? Ou será que foi adicionado o arquivo dele diretamente no componente e eu perdi essa informação?

Bom, consegui passar no teste do "Analisa_boletos.xls", agora estou aguardando o retorno do banco em relação a isso.

De qualquer forma, eis minhas conclusões até o momento:

Até agora o que foi sugerido pelo "lucasjramy" no outro post é a única forma que funciona hoje em dia, ou seja, o problema ocorre ao gerar o NossoNumero no Título fora dos padrões do banco, portanto ao gerar o Título o código deveria ficar +- assim:

-----------------

var nn: String;

-----------------

NossoNumero := (NossoNumero que você colocaria normalmente)

//da pra fazer um "if" aqui para verificar se o banco é Sicredi caso você não queira usar as linhas seguintes em outros bancos...

nn := ACBrBoleto.Banco.MontarCampoNossoNumero(Titulo);

NossoNumero := Copy(nn,1,2) + Copy(nn,3,7);

Fazendo dessa forma, não é necessário modificar o fonte do componente e aparentemente funciona, confirmarei assim que receber o e-mail do banco.

Agora vamos para a função que está no arquivo "ACBrBancoSicredi.pas" hoje em dia:

function TACBrBancoSicredi.MontarCampoNossoNumero (const ACBrTitulo: TACBrTitulo ) : String;
var
  aNossoNumero: String;
begin
  Result:= FormatDateTime('yy',ACBrTitulo.DataDocumento) + '/' +
           ACBrTitulo.CodigoGeracao + RightStr(ACBrTitulo.NossoNumero,5) + '-' +
           CalcularDigitoVerificador(ACBrTitulo);
end;

Para o valor do NossoNumero do Título ficar correto, teria que ser:

function TACBrBancoSicredi.MontarCampoNossoNumero (const ACBrTitulo: TACBrTitulo ) : String;
var
  aNossoNumero: String;
begin
  Result:= FormatDateTime('yy',ACBrTitulo.DataDocumento) +
           ACBrTitulo.CodigoGeracao + RightStr(ACBrTitulo.NossoNumero,5);
end;

Mas não verifiquei se daria algum problema em relação a outras partes do componente no caso de modificar essa função.

Caso modificado, o código ao gerar o Título ficaria algo do tipo:

NossoNumero := (NossoNumero que você colocaria normalmente)

//da pra fazer um "if" aqui para verificar se o banco é Sicredi caso você não queira usar a linha seguinte em outros bancos...

NossoNumero := ACBrBoleto.Banco.MontarCampoNossoNumero(Titulo);

De qualquer forma HOJE teríamos que usar a função "MontarCampoNossoNumero" para solucionar o problema.

Acredito que, caso o Thiago consiga homologar sem usar esse tipo de abordagem, seria interessante atualizar o componente para essa versão, já que, como ele mesmo disse, não teríamos que fazer gambiarras no código para se adaptar a esse ou aquele banco.

 

 

Postado

A última versão do arquivo "ACBrBancoSicredi.pas" que o Thiago postou é exatamente a mesma da última versão que está no ACBr atualmente... Não entendi, será que ele postou a versão errada? Ou será que foi adicionado o arquivo dele diretamente no componente e eu perdi essa informação?

 

Olá dev3 e Juliana, mil perdões... realmente movi para o fórum o arquivo errado (estava com 2 Explorer abertos e peguei do errado por engano), não tem nele nenhuma modificação nossa. Segue o arquivo correto do Sicredi. Envio junto tb o ACBrBoleto.pas, mas a princípio para o assunto que estamos falando as alterações foram somente no ACBrBoletoSicredi.pas mesmo.

 

Ainda não tive retorno se homologou ou não... mas normalmente quando o retorno demora é que homologou... quando encrenca a coisa volta rápido. Mas não tenho uma confirmação oficial ainda. Uma possibilidade de não homologar conhecida por mim é a pela Logo colorida, que no manual diz que não é pra usar... mas até agora o Sicredi não comentou nada sobre ela, por hora estou deixando rolar.

A planília que eu usei recebi de um funcionário da área de boletos do Sicredi... o meu arquivo é mais novo que o do dev3, mas tb eh bem menor. De qq forma passou na planília que usei. Não testei com esta outra. Segue a planília que usei tb em anexo se quiserem usar.

 

Abraço!

 

ACBrBancoSicredi.pas

ACBrBoleto.pas

Planilia Usada pelo Sicredi para Analise__Analise_boletos_UA61.zip

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