Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado

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

 

 

  • Administradores
Postado

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

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

  • Membros Pro
Postado (editado)

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!

 

Editado por valdirdill

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado (editado)

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;

Editado por valdirdill

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Administradores
Postado

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

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

  • Membros Pro
Postado

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

 

 

  • Administradores
Postado

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.

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

  • Administradores
Postado

Bom dia.

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

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

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