Jump to content

Delphi chamada_delphi.png acbr.png

C6 chamada_c6.png botao.png

Boletos Banco Brasil x Numero Convenio


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

Recommended Posts

  • Membros Pro

Boa noite,

Estou com uma dúvida em relação à alimentação dos dados para geração do boleto. Mais especificamente o campo ACBrBoleto1.Cedente.Convenio de boletos do Banco do Brasil, carteira 18.

Na function TACBrBancoBrasil.FormataNossoNumero(const ACBrTitulo :TACBrTitulo): String o Acbr utiliza o convenio para formatar o campo nosso número. Conforme for o tamanho (length) do código de convênio será o result dessa função, certo?

Muito bem, a dúvida é: na alimentação do componente, esse campo deve ser alimentado com ou sem o DV? Ex. um código de convênio assim: 149649-5, deve ser informado 149649 ou 1496495?

Obrigado! 

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Administradores

Bom dia.

O banco te passou desta forma mesmo ? Acredito que se trate do convenio de 7 posições mesmo (incluíndo o DV), neste caso vc informaria todos os dígitos na propriedade convenio.

Att.

 

Consultora SAC ACBr

Juliana Tamizou
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link to comment
Share on other sites

  • Membros Pro

Bom dia,

Sim, foi esse número que o banco passou, com 7 dígitos.

Era dessa forma mesmo que eu estava testando, ou seja, colocando os 7 dígitos do código do convênio.
Porém, o valor campo "Nosso Número" no boleto e também na linha digitável está saindo errado. Aí não sei se tem alguma coisa errada no componente ou sou eu que estou fazendo algo errado.

Vejamos: os dados do boleto são:
- Número (nosso número): 5;
- Carteira: 18;
- Convênio: 149649-5 (7 posições).

Quando alimento o nossonumero no componente, ele formata esse valor para 000 000 000 000 000 05 (os espaços são só para facilitar a leitura) através da procedure "TACBrTitulo.SetNossoNumero ( const AValue: String )", ou seja, já formatado com 17 dígitos.
Aí, quando processar a "function TACBrBancoBrasil.FormataNossoNumero(const ACBrTitulo :TACBrTitulo): String" o if verdaeiro será o:
if (Length(AConvenio) = 7) then
 ANossoNumero := PadLeft(AConvenio, 7, '0') + PadLeft(ANossoNumero, 10, '0');
Com isso, o ANossoNumero retornará 149 649 500 000 000 00, ou seja, traz os 7 dígitos do convênio + os 10 dígitos iniciais do nossonumero, desprezando os 000 000 5 (7 dígitos finais).

O que estou fazendo de errado?

O mais interessante é que não mudei nada nas rotinas de geração boletos do meu sistema. E verificando na base de dados de meu cliente, há até poucos dias estava gerando corretamente, ou seja, 149 649 500 000 000 05. Tudo indica que foi feita alguma modificação no ACbr e essa modificação está incorreta.

Obrigado!

 

Edited by valdirdill

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Membros Pro

Descobri a causa do problema, está na function TACBrBancoBrasil.CalcularTamMaximoNossoNumero(.

O problema ocorre porque nos fontes do trunk2 foi íncluída uma linha (vide abaixo) nessa função, que  faz com que o tamanho do nosso número fique em 17, quando deve ser 10. É carteira 18, convênio 7, nosso número 10. 
Só não entendi porque essa linha foi incluída. É um erro no componente? Como corrigir nos fontes? 

 

Veja abaixo a função e a linha destacada e que está causando esse problema.
function TACBrBancoBrasil.CalcularTamMaximoNossoNumero(
  const Carteira: String; NossoNumero : String = ''): Integer;
var
  wCarteira   : String;
  wTamConvenio: Integer;
begin
   Result := 10;

   if (ACBrBanco.ACBrBoleto.Cedente.Convenio = '') then
      raise Exception.Create(ACBrStr('Banco do Brasil requer que o Convênio do Cedente '+
                                     'seja informado.'));

   if (Carteira = '') then
      raise Exception.Create(ACBrStr('Banco do Brasil requer que a carteira seja '+
                                     'informada antes do Nosso Número.'));

   wCarteira:= Trim(Carteira);
   wTamConvenio:= Length(Trim(ACBrBanco.ACBrBoleto.Cedente.Convenio));

   if (Length(trim(NossoNumero)) > 10) and
      ((wTamConvenio = 6) and ((wCarteira = '16') or (wCarteira = '18')))  then
//      ((wTamConvenio = 7) and (wCarteira = '18'))  then linha comentada
      Result:= 17
   else if (wTamConvenio <= 4) then
      Result := 7
   else if ((wTamConvenio > 4) and (wTamConvenio < 6)) or
           ((wTamConvenio = 6) and ((wCarteira = '12') or (wCarteira = '15') or
            (wCarteira = '17'))) then
      Result := 5
   else if (wTamConvenio = 6) then
      Result := 11
   else if (wTamConvenio = 7) then
      Result := 10;
end;

Edited by valdirdill

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Administradores

Boa noite.

Na verdade não trata-se de um bug, mas sim de uma situação que o banco possui...observe no trecho de código que vc copiou que além do tamanho do convenio ter 7 posições e a carteira ser a 18, é necessário que o nosso número informado possua mais de 10 caracteres para que entre neste if.

Como você está informando este campo?

Att.

Consultora SAC ACBr

Juliana Tamizou
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link to comment
Share on other sites

  • Membros Pro

Não Juliana, a função não está fazendo as duas condições. A função retorna 17 se for uma ou outra condição. Eu acho que é um bug sim. Vou tentar detalhar melhor. Por favor  analise todas as minhas considerações abaixo.

O valor de NossoNumero quando chega nessa função está com "5", que é o valor enviado pelo minha aplicação, ou seja, apenas um único dígito. É essa função CalcularTamMaximoNossoNumero que muda ele para 17 dígitos e causa todo o problema.

Pelo que entendi da tua análise, esse "or" que vem depois de (wCarteira = '18'))) estaria condicionado ao primeiro "and" que vem depois de (Length(trim(NossoNumero)) > 10). Mas não é isso que acontece nessa função. Descrevendo o result dessa linha teremos: 
Condição a: se length(NossoNumero) for maior que 10 e wTamConvenio = 6 e wCarteira = 16 ou carteira = 18, result será 17;
Condição b: se wTamConvenio = 7 e wCarteira = 18, result será 17. Essa condição b sendo atendida, não importa o length(NossoNumero), o resultado será sempre 17.

Veja como era essa função no trunk (e que funcionava certinho): 
if (Length(trim(NossoNumero)) > 10) and (wTamConvenio = 6) and
      ((wCarteira = '16') or (wCarteira = '18')) then
      Result:= 17

Agora compare com a função que foi modificada no trunk2:
  if (Length(trim(NossoNumero)) > 10) and
      ((wTamConvenio = 6) and ((wCarteira = '16') or (wCarteira = '18'))) or
      ((wTamConvenio = 7) and (wCarteira = '18')) then   
      Result:= 17

Obs. ambas essas linhas acima são da função CalcularTamMaximoNossoNumero. Coloquei apenas parte da função para não ficar um texto longo, já que o problema, ao meu ver, está nesse if que foi modificado do trunk para o trunk2.

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Administradores

Boa tarde.

Como citei anteriormente a alteração se fez necessária devido a uma situação especifica do Banco do Brasil utilizada por algumas empresas, porém ao rever o código notei que faltou um "( )" para garantir que problemas como o seu não ocorram.

Após mais alguns testes irei disponibilizar no svn a correção, porém até agora a alteração abaixo já deve atender seu problema.

if (Length(trim(NossoNumero)) > 10) and
      (((wTamConvenio = 6) and ((wCarteira = '16') or (wCarteira = '18'))) or
      ((wTamConvenio = 7) and (wCarteira = '18'))) then       

Att.

  • Like 1
Consultora SAC ACBr

Juliana Tamizou
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link to comment
Share on other sites

  • Administradores

Bom dia.

Correção disponibilizada no svn na sexta-feira.

Att.

  • Like 1
Consultora SAC ACBr

Juliana Tamizou
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.