Ir para conteúdo
  • Cadastre-se

dev botao

Composição Nosso Numero Banco do Brasil


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

Recommended Posts

Olá Pessoal !

Estou implementando o ACBrBoleto, e já utilizo o emissor de boleto do próprio banco do brasil e deu uma divergência no nosso número. Peguei a seguinte informação no banco:

COMPOSIÇÃO DO NOSSO-NÚMERO

- Composição padrão para as carteiras 16, 17 e 18.

a) Convênio de seis posições, numeração até 999.999: CCCCCCNNNNN-X

B) Convênio de seis posições e carteira 18 (cobrança sem registro), poderá ter dezessete

posições livres: NNNNNNNNNNNNNNNNN

c) Convênio de sete posições, numeração superior a 1.000.000 (um milhão):

CCCCCCCNNNNNNNNNN

OBS.1:

"C" - número do convênio;

"N" - número dado pelo cliente;

"X" - digito verificador /MODULO 11/.

OBS.2:

Não existe DV - Dígito Verificador - na composição do nosso-número com 17 posições.

No meu caso o convenio é 6 digitos e no emissor do banco sai conforme especificado no item a.

Quando eu imprimo no acbrboleto sai da forma especificado no item b.

A dúvida é pode ser adotado qualquer uma das duas formas ?

Grato

Jaime.

Link para o comentário
Compartilhar em outros sites

  • Administradores

Boa tarde.

Como está configurada a propriedade TamMaximoNossoNumero?

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

Link para o comentário
Compartilhar em outros sites

Juliana até eu tentei alterar da seguinte forma:

ACBrBoleto1.Banco.TamanhoMaximoNossoNum := 5;

mas ele sempre monta o nosso numero com 10 :(

Olhando a função abaixo o meu caso se encaixa no item que está negritado mas o código não chega até la porque

não consigo altera o tamanho do nosso numero que fica em 10.

e também onde esta grifado não deixa passar porque o meu caso e carteira 18 convenio c/ 6 digitos e

nosso numero com 5 digitos.

function TACBrBancoBrasil.FormataNossoNumero(const ACBrTitulo :TACBrTitulo): String;

var

ANossoNumero, AConvenio : string;

aCarteira: LongInt;

begin

with ACBrTitulo do

begin

AConvenio := ACBrBoleto.Cedente.Convenio;

ANossoNumero := OnlyNumber(NossoNumero);

aCarteira := StrToIntDef(Carteira,0);

if (aCarteira = 16) or (aCarteira = 17) or (aCarteira = 18) then

begin

if (ACBrTitulo.Carteira = '18') and (Length(AConvenio) = 6) then

ANossoNumero := padR(ANossoNumero, 17, '0')

else if Length(AConvenio) <= 4 then

ANossoNumero := padR(AConvenio, 4, '0') + padR(ANossoNumero, 7, '0')

else if (Length(AConvenio) > 4) and (Length(AConvenio) <= 6) then

ANossoNumero := padR(AConvenio, 6, '0') + padR(ANossoNumero, 5, '0') <---- aqui ficaria igual ao emissor do proprio banco

else if Length(AConvenio) = 7 then

ANossoNumero := padR(AConvenio, 7, '0') + padR(ANossoNumero, 10, '0');

end

else

ANossoNumero := padR(AConvenio, 7, '0')+ padR(ANossoNumero, 11, '0');

end;

Result := ANossoNumero;

end;

Grato

Jaime

Link para o comentário
Compartilhar em outros sites

  • Administradores

Bom dia.

Vc retirou estas especificações do manual que está no svn ou do site do banco? Se for do site vc pode anexar aqui por favor?

Quanto ao tamanho do nosso número vc não precisa mecher nos fontes, caso o seu svn esteja atualizado, vc vai reparar que o componente tem a propriedade Tamanho Máximo do Nosso Número, que pode ser alterada.

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

Link para o comentário
Compartilhar em outros sites

Desinstalei o acbrboleto e instalei novamente e acho que não to sabendo como mudar o TamanhoMaximoNossoNum, vou postar o codigo

pra vc ver onde e que estou errando

Titulo := ACBrBoleto1.CriarTituloNaLista;

ACBrBoleto1.Banco.TipoCobranca := cobBancoDoBrasil;

ACBrBoleto1.Cedente.Agencia := Trim( Table1.FieldByName('AGENCIA').AsString );

ACBrBoleto1.Cedente.AgenciaDigito := Trim( Table1.FieldByName('AGDV').AsString );

ACBrBoleto1.Cedente.Conta := Trim( Table1.FieldByName('CONTA').AsString );

ACBrBoleto1.Cedente.ContaDigito := Trim( Table1.FieldByName('CCDV').AsString );

ACBrBoleto1.Cedente.Nome := Trim( Table1.FieldByName('CEDENTE').AsString );

ACBrBoleto1.Cedente.Convenio := Trim( Table1.FieldByName('CONVENIO').AsString );

ACBrBoleto1.Banco.TamanhoMaximoNossoNum := 5;

with Titulo do

begin

Vencimento := Table1.FieldByName('VECTO').AsDateTime;

DataDocumento := Table1.FieldByName('EMISSAO').AsDateTime;

NumeroDocumento := Table1.FieldByName('DCTO').AsString;

EspecieDoc := Table1.FieldByName('DESPECIE').AsString;

if Table1.FieldByName('ACEITE').AsString = 'S' then

Aceite := atSim

else

Aceite := atNao;

DataProcessamento := Now;

NossoNumero := TRIM( Table1.FieldByName('NOSSONR').AsString );

Carteira := Table1.FieldByName('CARTEIRA').AsString;

ValorDocumento := StrToCurr(Table1.FieldByName('VALOR').AsString);

Sacado.NomeSacado := Table1.FieldByName('NOME').AsString;

Sacado.CNPJCPF := Table1.FieldByName('CPFCNPJ').AsString;

Sacado.Logradouro := Table1.FieldByName('END').AsString;

Sacado.Numero := Table1.FieldByName('NUMERO').AsString;

Sacado.Bairro := Table1.FieldByName('BAIRRO').AsString;

Sacado.Cidade := Table1.FieldByName('CIDADE').AsString;

Sacado.UF := Table1.FieldByName('UF').AsString;

Sacado.CEP := Table1.FieldByName('CEP').AsString;

ValorAbatimento := 0;

LocalPagamento := Table1.FieldByName('LOCAL').AsString;

ValorMoraJuros := StrToCurrDef(Table1.FieldByName('MORAJURO').AsString,0);

ValorDesconto := StrToCurrDef(Table1.FieldByName('DESCONTO').AsString,0);

ValorAbatimento := StrToCurrDef(Table1.FieldByName('ABATIMENTO').AsString,0);

DataMoraJuros := StrToDateDef(Table1.FieldByName('DATAMORA').AsString, 0);

DataDesconto := StrToDateDef(Table1.FieldByName('DATADESCO').AsString, 0);

DataAbatimento := StrToDateDef(Table1.FieldByName('DATAABATI').AsString, 0);

DataProtesto := StrToDateDef(Table1.FieldByName('DATAPROTE').AsString, 0);

PercentualMulta := StrToCurrDef(Table1.FieldByName('PERCMULTA').AsString,0);

Instrucao1 := '00';// PADL(Trim(' ',2,'0');

Instrucao2 := '00';//PADL(Trim(' ',2,'0');

OcorrenciaOriginal.Tipo := toRemessaBaixar;

Mensagem.Add(Table1.FieldByName('INSTR1').AsString );

Mensagem.Add(Table1.FieldByName('INSTR2').AsString );

Mensagem.Add(Table1.FieldByName('INSTR3').AsString );

Mensagem.Add(Table1.FieldByName('INSTR4').AsString );

end;

Link para o comentário
Compartilhar em outros sites

  • Administradores

Boa tarde.

Seria isso mesmo.

Quando a carteira é a 18 e o convenio tem 6 digitos existem as duas opções de tamanho de nosso número?...

O valor que vc está setando não esta sendo usado na formatação do nosso número, por isso precisamos ver esta questão que te perguntei.

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

Link para o comentário
Compartilhar em outros sites

É pq no boleto o nosso numero está gerando sem o convênio ai eu fiz uma pequena mudança no código grifado:

function TACBrBancoBrasil.FormataNossoNumero(const ACBrTitulo :TACBrTitulo): String;

var

ANossoNumero, AConvenio : string;

aCarteira: LongInt;

begin

with ACBrTitulo do

begin

AConvenio := ACBrBoleto.Cedente.Convenio;

ANossoNumero := OnlyNumber(NossoNumero);

aCarteira := StrToIntDef(Carteira,0);

if (aCarteira = 16) or (aCarteira = 17) or (aCarteira = 18) then

begin

if (ACBrTitulo.Carteira = '18') and (Length(AConvenio) = 6) and (Length(ANossoNumero) <> 5) then

ANossoNumero := padR(ANossoNumero, 17, '0')

else if Length(AConvenio) <= 4 then

ANossoNumero := padR(AConvenio, 4, '0') + padR(ANossoNumero, 7, '0')

else if (Length(AConvenio) > 4) and (Length(AConvenio) <= 6) then

ANossoNumero := padR(AConvenio, 6, '0') + padR(ANossoNumero, 5, '0')

else if Length(AConvenio) = 7 then

ANossoNumero := padR(AConvenio, 7, '0') + padR(ANossoNumero, 10, '0');

end

else

ANossoNumero := padR(AConvenio, 7, '0')+ padR(ANossoNumero, 11, '0');

end;

Result := ANossoNumero;

end;

Link para o comentário
Compartilhar em outros sites

Boa tarde.

Seria isso mesmo.

Quando a carteira é a 18 e o convenio tem 6 digitos existem as duas opções de tamanho de nosso número?...

Att

Não ! Foi um conclusão minha pq eu comecei a testar o acbrBoleto e coloquei os dados que eu tinha ai ele gerou diferente do que

esta sendo usado pelo programa do banco.

No meu caso aqui o nosso numero sai convenio tem 6 digitos e o nosso numero 5 mais um digito vericador.

Link para o comentário
Compartilhar em outros sites

Olá!, estou tendo problemas com a geração do nosso número também. Estou usando a carteira 18 com 6 dígitos para convênio + 5 dígitos para sequencial. No nosso número, é apresentado só o sequencial precedido de zeros (totalizando 17 dígitos) sem os 6 dígitos do convênio; Pelo que entendi de um boleto gerado pelo sistema (e confirmei na pg. 8 da documentação no SVN), o nosso número no cód. de barras deveria ser:

5 dígitos do serial + 4 dígitos da agência + 8 dígitos da conta + 2 dígitos da carteira.

Tentei alterar o AcbrBancoBrasil sem sucesso.. no método formataNossoNumero() forcei a geração do ANossoNumero com essa regra:

ANossoNumero := padR(AConvenio, 6, '0') + padR(ANossoNumero, 5, '0')
só que por algum motivo, o ANossoNumero vem com o sequencial precedido de zeros (totalizando 10 dígitos). Como a função pega os 5 primeiros (todos zeros), deu erro. Em seguida alterei o fpTamanhoMaximoNossoNum para 5; ai o NossoNumero foi gerado certo (no boleto), entretanto o código de barras ficou errado (não seguindo o modelo 5 + 4 + 8 + 2 descrito acima). No final alterei o método MontarCodigoBarras() forçando a geração do código de barras com as linhas:
         CodigoBarras := IntToStrZero(Banco.Numero, 3) +

                         '9' +

                         FatorVencimento +

                         IntToStrZero(Round(ACBrTitulo.ValorDocumento * 100), 10) +

                         IfThen((Length(AConvenio) = 7), '000000', '') +

                         ANossoNumero +

                         IfThen((Length(AConvenio) < 7), padR(Cedente.Agencia, 4, '0'), '') +

                         IfThen((Length(AConvenio) < 7), padR(Cedente.Conta, 8, '0'), '') +

                         ACBrTitulo.Carteira;

e Quase deu certo.. o Cedente.Conta vem com 10 caracteres, ele corta os últimos valores (a conta em si) ficando com os zeros iniciais..

Não sei exatamente como funciona a geração dos boletos (comecei a estudar sobre isso a pouco tempo..). Minhas alterações nem se contam, pois com certeza quebrariam o funcionamento para outros tamanhos de convênios, etc.. mas espero que esses testes possam ajudar a achar a solução correta.

Se descobrir mais alguma coisa posto por aqui... se alguém tiver alguma luz acerca da solução para este problema, agradeço.

att,

Link para o comentário
Compartilhar em outros sites

Ola neto estamos junto ai ! Também estou iniciando e vamos desvendar esse "misterio".

Estive estudando o manual e cheguei a seguinte conclusão:

caso 1:

CCCCNNNNNNN-X convênios com 4 posição entao o numero do boleto tera tamanho 7

caso 2:

CCCCCCNNNNN-X convênios com 6 posições entao o numero do boleto tera tamanho 5

caso 3:

CCCCCCCNNNNNNNNNN convênios com 7 posições com numeração acima de 1.000.000 entao o numero do boleto tera tamanho 10

Nosso-Número, sem o DV

caso 4:

NNNNNNNNNNNNNNNNN convenio com 6 posições entao o numero do boleto tera tamanho 17 neste caso o nr do conveio não e listado no nosso numero

A utilização do campo “Nosso-Número” com 17 posições livres somente pode ser utilizada por

clientes cadastrados com convênio de cobrança de 6 posições, nas Modalidades de Cobrança

Sem Registro – Carteira 16 e 18.

O “Nosso-Número”, neste caso, não possui dígito verificador.

Então poderiamos ter 4 tamanhos para o campo TamanhoMaximoNossoNum e a partir dele montar a lógica da formação do nosso número gera o codigo de barras, só que esse campo não está sendo modificado, deve ter algum motivo.

Link para o comentário
Compartilhar em outros sites

Neto a Juliana falou que tem como modificar o tamanho maximo do nosso numero mas não estou conseguindo. Você já conseguiu alterar ? Só consegui dentro do código fonte, mas ai vai ficar fixo. Se conseguir isso acho que posso configurar o resto.

Link para o comentário
Compartilhar em outros sites

Fiz algumas alterações mais profundas, seguindo o que o Jaime apresentou:

function TACBrBancoBrasil.FormataNossoNumero(const ACBrTitulo :TACBrTitulo): String;

var

  ANossoNumero, AConvenio : string;

  aCarteira: LongInt;

begin

   with ACBrTitulo do

   begin

      AConvenio := ACBrBoleto.Cedente.Convenio;

      ANossoNumero := OnlyNumber(NossoNumero);

      aCarteira    := StrToIntDef(Carteira,0);


      // CCCCNNNNNNN-X

      if (Length(AConvenio) <= 4) and (fpTamanhoMaximoNossoNum = 7) then

        ANossoNumero := padR(AConvenio, 4, '0') + padR(ANossoNumero, 7, '0')

      // CCCCCCNNNNN-X

      else if (Length(AConvenio) > 4) and (Length(AConvenio) <= 6) and (fpTamanhoMaximoNossoNum = 5) then

        ANossoNumero := padR(AConvenio, 6, '0') + padR(ANossoNumero, 5, '0')

      // CCCCCCCNNNNNNNNNN

      else if (Length(AConvenio) = 7) and (fpTamanhoMaximoNossoNum = 10) then

        ANossoNumero := padR(AConvenio, 7, '0') + padR(ANossoNumero, 10, '0')

      // NNNNNNNNNNNNNNNNN

      else if (Length(AConvenio) > 4) and (Length(AConvenio) <= 6) and (fpTamanhoMaximoNossoNum = 17)

      and ((ACBrTitulo.Carteira = '16') or (ACBrTitulo.Carteira = '18')) then

        ANossoNumero := padR(ANossoNumero, 17, '0');

   end;

   Result := ANossoNumero;

end;
Removi o 1° if que validava as carteiras, pois a única excessão que achei na documentação é quando o nosso número tem 17 posições (anexo 5), e ai o convênio deve ser 6 posições e as carteiras só 16 ou 18. Pros demais não achei nada de diferente.. A mesma coisa pro método MontarCodigoBarras():
function TACBrBancoBrasil.MontarCodigoBarras(const ACBrTitulo : TACBrTitulo): String;

var

  CodigoBarras, FatorVencimento, DigitoCodBarras :String;

  a, ANossoNumero, AConvenio: string;

begin

    AConvenio := ACBrTitulo.ACBrBoleto.Cedente.Convenio;

    ANossoNumero := FormataNossoNumero(ACBrTitulo);


    {Codigo de Barras}

    with ACBrTitulo.ACBrBoleto do

    begin

      FatorVencimento := CalcularFatorVencimento(ACBrTitulo.Vencimento);


      if ((ACBrTitulo.Carteira = '18') or (ACBrTitulo.Carteira = '16')) and

         (Length(AConvenio) = 6) and (fpTamanhoMaximoNossoNum = 17) then

       begin

        CodigoBarras := IntToStrZero(Banco.Numero, 3) +

                        '9' +

                        FatorVencimento +

                        IntToStrZero(Round(ACBrTitulo.ValorDocumento * 100), 10) +

                        AConvenio + ANossoNumero + '21';

       end

      else

       begin

         CodigoBarras := IntToStrZero(Banco.Numero, 3) +

                         '9' +

                         FatorVencimento +

                         IntToStrZero(Round(ACBrTitulo.ValorDocumento * 100), 10) +

                         IfThen((Length(AConvenio) = 7), '000000', '') +

                         ANossoNumero +

                         IfThen((Length(AConvenio) < 7), padR(Cedente.Agencia, 4, '0'), '') +

                         IfThen((Length(AConvenio) < 7), padR(Cedente.Conta, 8, '0'), '') +

                         ACBrTitulo.Carteira;

      end;


      DigitoCodBarras := CalcularDigitoCodigoBarras(CodigoBarras);

    end;



    Result:= copy( CodigoBarras, 1, 4) + DigitoCodBarras + copy( CodigoBarras, 5, 44) ;

end;

Assim acho que cobre todas as opções.. testei aqui e agora estou tentando resolver o problema da conta do cedente, que mesmo estando setada para tamanho 5, é alterada para 10 (com zeros precedendo a conta) e no momento da geração do cód. de barras, ela sai errado.

Um detalhe muito importante: como não conseguimos alterar o valor da propriedade TamanhoMaximoNossoNum, esse valor tem que ser definido dentro da classe ACBrBancoBrasil.pas... não precisa nem dizer que isso é tosco :) mas não sei como acertar essa questão da propriedade..

Link para o comentário
Compartilhar em outros sites

Neto a Juliana falou que tem como modificar o tamanho maximo do nosso numero mas não estou conseguindo. Você já conseguiu alterar ? Só consegui dentro do código fonte, mas ai vai ficar fixo. Se conseguir isso acho que posso configurar o resto.

Opa, mesma dificuldade por aqui :) vou tentar isso agora..

Link para o comentário
Compartilhar em outros sites

Tenho uma leitora de código de barras de boleto e fiz os testes:

- com convenio 6 e 7 digitos a linha digitavel e codigo de barras ficou perfeito bateu com o emissor do banco !

a única divergência entre o acbr e o emissor do banco foi no convenio 7 digitos na impressao do campo Nosso Numero que o do banco saiu com digito sendo que na documentacao (Anexo 4) não fala nada de DV !!! Ai fiquei sem entender:

No acbr

16947990000028124

No do banco :

16947990000028124-3

Link para o comentário
Compartilhar em outros sites

Neto,

Descobri porque não ta alterando o TamMaximoNossoNumero. Dentro do fonte ACBrBoleto tava sem setar o valor ai alterei com a linha sublinhada, agora ficou ok.

procedure TACBrBanco.SetTamMaximoNossoNumero(const Avalue: Integer);

begin

{Apenas para aparecer no ObjectInspector do D7}

BancoClass.fpTamanhoMaximoNossoNum := AValue;

end;

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...

Pessoal, preciso de uma dica: tenho que fazer alguma alteração no componente para poder usar Carteira 11 em convênio 7 posições ? É que tá dando código de barras inválido ... porém quando eu emito boleto Carteira 18 também em convênio 7 posições tudo funciona normalmente ... podem me ajudar ?

Link para o comentário
Compartilhar em outros sites

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