Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Boa tarde,

No ano passado (07/2011) eu disponibilizei a unit da CEF (SICOB) para que a mesma fosse incluída no componente para a emissão de boletos desse tipo de carteira da CEF.

Tempos atrás, verifiquei que haviam feito algumas modificações nessa unit e a mesma começou a apresentar problemas quanto a impressão de boletos quando se utiliza Nosso Número com 11 dígitos (inclusive é o meu caso).

Nesses casos, a linha digitável fica TOTALMENTE incorreta.

Outra coisa, relatei noutro post anterior a respeito de se utilizar constantes para o preenchimento do campo nosso número.

Isso não pode ocorrer, pois esse referido campo deve ser enviado ao componente da forma que o banco informa a maneira que o mesmo deve ser preenchido, e não como " achamos" que deve ser.

Dito isso, eu anexo a referida unit para que vocês possam analisar.

Eu fiz alterações para que a mesma trate o referido campo com mais de 11 dígitos ou menos.

Com mais de 11 dígitos, eu deixei da forma em que se encontra, efetuei a mudança tratando apenas quando o nosso número for menor que 11, pois era nesses casos que ocorriam os problemas de impressão do boleto.

Qualquer dúvida, estou a disposição.

Atenciosamente.

Jéter Rabelo Ferreira

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

Jéter Rabelo Ferreira
Campestre/MG

  • Administradores
Postado

Boa tarde Jéter.

Ao analisar os manual contidos no svn para a Cobrança Rápida e Cobrança Sem Registro, encontrei a seguinte orientação sobre o nosso número:

IX - CAMPO LIVRE (posições 20 a 44)

Para as posições do Campo Livre, informar:

- Se carteira Sem Registro: Nosso número com 10 posições

Ex.: 82NNNNNNNN

Onde: 82 - Identificador da carteira Sem Registro

NNNNNNNN - Nosso número do Cliente

...

...

...

- Se Carteira Rápida: Nosso Número com 10 posições

Ex.: 9NNNNNNNNN

Onde: 9 - Identificador da carteira Rápida

NNNNNNNNN - Nosso número do Cliente

...

...

...

Já no manual para cobrança sem registro de 16 posições:

Apenas Clientes Cedentes com Código do Cedente na operação 870 podem operar com a Cobrança Sem Registro com 16 posições de Nosso Número.

..

..

..

X - CÁLCULO DO DV DO NOSSO NÚMERO DA COBRANÇA SEM REGISTRO - 16 POSIÇÕES

- Campo com 15 posições sempre iniciando com 8.

- Utiliza 1 dígito verificador calculado através do módulo 11, com peso 2 a 9.

8NNNNNNNNNNNNNN - D1

Pelo que interpretei dos manuais temos 3 tipos de nosso número:

Cobrança Rápida: Valor fixo '9' + 9 dígitos livres para o cliente usar + Digito

Cobrança Sem Registro de 16 posições: Valor fixo '82' + 14 dígitos livres para o cliente + digito(apenas se o código de Operacao for 870)

Cobrança Sem Registro 11 posições: Valor fixo '8' + 9 dígitos para o cliente usar + Digito

Considerado estes manuais acredito que o código correto seria:

if Carteira = 'SR' then

begin

if (Copy(Convenio,1,3) = 870) and (TamanhoMaximoNossoNum > 10) then

ANossoNumero:= '82'+ padr(Copy(ANossoNumero,Length(ANossoNumero)-13,14),14)

else

ANossoNumero:= '8'+ padr(Copy(ANossoNumero,Length(ANossoNumero)-7,8),9);

end

else

ANossoNumero:= '9' + padR(Copy(ANossoNumero,Length(ANossoNumero)-8,9),9);

Se você possuir algum outro manual diferentes dos disponíveis no svn, por favor anexe aqui.

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

Boa tarde Juliana.

Nesses casos, ao se acrescentar dígitos ao nosso número, quando o boleto for liquidado e for feita a leitura do arquivo retorno, o campo nosso número ficará diferentes ao informado na hora da geração do boleto, gerando problemas de localização dos boletos pelo referido campo.

Para que possamos ter a compatibildiade com o manual da CEF e evitar a mudança do campo nosso número, não seria melhor colocar-mos um exception, que verificaria se o campo nosso número obedece a regra da caixa?

Caso queira, eu posso implementar essas exception's.

No aguardo.

Atenciosamente.

Jéter Rabelo Ferreira

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

Jéter Rabelo Ferreira
Campestre/MG

Postado

Boa tarde Juliana.

Eu efetuei a alteração com exception na unit. Dessa forma, creio eu que contempla as três situações.

Eu possuo conta na CEF e envio boletos na carteira "SR" "NNNNNNNNNN-D". Com essa alteração os boletos gerados estão corretos.

Segue anexa a unit.

Aguardo retorno.

Atenciosamente.

Jéter Rabelo Ferreira

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

Jéter Rabelo Ferreira
Campestre/MG

  • Administradores
Postado

Boa tarde.

Analisei os manuais de retorno da Caixa Sicoob disponiveis no svn..

CNAB400

8.2 Nota Explicativa 2: Formatação do Nosso Número

8.2.1 Para a carteira 11 - Cobrança Simples (Vide Nota 3): Número gerado e atribuído pelo sistema de cobrança da CAIXA para controle interno, e será composto da seguinte forma: NNNNNNNNNND, onde

NNNNNNNNNN = Número Sequencial

D = Dígito Verificador (calculado pelo Mod. 11)

Obs: para clientes que possuem sistema próprio, preencher o campo com zeros.

8.2.2 Para a carteira 12 - Cobrança Rápida: Número informado pelo cliente, composto da seguinte forma: 9NNNNNNNNND, onde

9 = Fixo

NNNNNNNNN = Número Sequencial

D = Dígito Verificador (calculado pelo Mod. 11)

Nosso Número com 16 posições

Uso da Empresa Identificação do Título na Empresa / Nosso Número Sem Registro com 16 posições 38 62 25 Alfanum.

CNAB 240

2.4.12 Cálculo do Nosso Número

- Para a Carteira 11 (SIMPLES): O Nosso Número é gerado pelo sistema da CAIXA para

controle interno, e será composto da seguinte forma: NNNNNNNNNND, onde

NNNNNNNNNN = Número Seqüencial

D = Dígito Verificador (módulo 11)

Obs.: Para clientes que possuem sistema próprio, preencher o campo com zeros.

- Para a Carteira 12 (Rápida): Nosso Número informado pelo cliente à partir do que foi impresso nos bloquetos, é composto da seguinte forma:

9NNNNNNNNND, onde

9 = Fixo

NNNNNNNNN = Número seqüencial

D = Dígito Verificador (módulo 11)

Para Nosso Número com 16 dígitos é da mesma forma do CNAB400.

Quanto ao Nosso Número retornar diferente do que foi passado, se você desejar gravar no BD o valor completo, basta usar a função MontarCampoNossoNumero()

Não entendi muito bem oque você quis dizer com exceções...

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

  • Administradores
Postado

Bom dia Jeter.

Da forma que você implementou a responsabilidade por conhecer o padrão de cada banco fica por conta do sistemas e não do componente, por isso eu havia sugerido o uso da função MontarCampoNossoNumero() para capturar o número formatado...outra coisa que pensei é que poderia ser criada uma nova propriedade no Boleto com o Nosso Número sem Formatação...

O seguinte código é desnecessário, pois a função SetNossoNumero válida e a quantidade de dígitos informada no nosso número é superior a quantidade máxima..

if not Length(NossoNumero) in [10, 15] then

raise Exception.Create('Tamanho do Nosso número inválido!');

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

Bom dia Juliana.

Quanto ao fato de fazermos um componente que contempla todas as possibildiades de carteiras em todos os bancos e o mesmo tratar disso, acho quase que impossível pela quantidade de ajuda que temos hoje.

Eu trabalhei mais de 15 anos em banco, e pode acreditar, essa coisa de emissão de boleto é uma pornografia.

Cada banco implementa da forma que quer, coloca os campos onde quer e etc.

Como você sabe, o padrão CNAB é só o básico do básico.

Por isso, quando um analista/desenvolvedor for desenvolver a rotina de emissão de boletos em seu sistema, deverá conhecer o mínimo para isso, como é hoje para gerar um NF-e/SPED/Sintegra e etc.

Dito isso, acho que podemos retirar a instrução abaixo sem problemas:

if not Length(NossoNumero) in [10, 15] then

 raise Exception.Create('Tamanho do Nosso número inválido!');
Mas, se mantivermos a instrução abaixo, o usuário será avisado caso o Nosso Número não corresponder com o manual.
     case Length(NossoNumero) of

       10:

        begin

          if (Carteira = 'SR') and (Copy(NossoNumero, 1, 1) <> '8') then

            raise Exception.Create('Nosso número deve começar com 8');

          if (Carteira <> 'SR') and (Copy(NossoNumero, 1, 1) <> '9') then

            raise Exception.Create('Nosso número deve começar com 9');

          ANossoNumero := NossoNumero;

        end;

       else

        begin

          if Carteira <> 'SR' then

            raise Exception.Create('Carteira inválida para o tamanho do Nosso número');

          if Copy(NossoNumero, 1, 2) <> '82' then

            raise Exception.Create('Nosso número deve começar com 82');

          ANossoNumero := NossoNumero;

        end;

     end;

Dessa forma, os sistemas que emitem boletos de acordo com o manual, funcionará corretamente.

Aguardo retorno.

Atenciosamente.

Jéter Rabelo Ferreira

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

Jéter Rabelo Ferreira
Campestre/MG

  • 2 semanas depois ...
Postado

Bom dia Wanderley.

 

Tem um outro post  de um usuário que está homologando.

 

Eu não sei se algum usuário homologou. Eu utilizo a CEF-SICOB para emissão de boletos cobrança simples e sem registro e não efetuei a homologação.

 

Estou emitindo dessa forma há mais de 2 anos, lendo arquivo retorno e emissão "manual" dos boletos.

 

Atenciosamente.

Jéter Rabelo Ferreira

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

Jéter Rabelo Ferreira
Campestre/MG

  • 5 meses depois ...
Postado

Bom dia,

 

Depois de lugar alguns dias para gerar a linha digitável do boleto Caixa Econômica - SICOB

compatível ao sistema da caixa, segue a alteração que foi necessária realizar na função

"MontarCodigoBarras".

 

Caso necessitem estou fazendo o upload da unit ACBrCaixaEconomicaSICOB.

ACBrCaixaEconomicaSICOB.pas

 

//funcao para montar o codigo de barras (Caixa Economica Federal - SICOB)//

   FatorVencimento := CalcularFatorVencimento(ACBrTitulo.Vencimento);
 
   ANossoNumero := FormataNossoNumero(ACBrTitulo);
   aCodCedente:= padR(RightStr(ACBrTitulo.ACBrBoleto.Cedente.CodigoCedente,11),11,'0');
 
   {#nota: Necessário fazer ajuste na montagem de do campo livre,
   para cobranças SR (sem registro).
   }
//   {Montando Campo Livre}
//   CampoLivre := ANossoNumero +
//                 Copy(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 2, 4) +
//                 aCodCedente;
//
 
   CampoLivre := Copy(aCodCedente,7,5) +
                 Copy(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 1, 4) +
                 '87' +
                 Copy(ANossoNumero,2,15);
 
 
 
   {Codigo de Barras}
   with ACBrTitulo.ACBrBoleto do
   begin
      CodigoBarras := IntToStrZero(Banco.Numero, 3) +
                      '9' +
                      FatorVencimento +
                      IntToStrZero(Round(ACBrTitulo.ValorDocumento * 100), 10) +
                      CampoLivre;
   end;
 
   DigitoCodBarras := CalcularDigitoCodigoBarras(CodigoBarras);
   Result:= copy( CodigoBarras, 1, 4) + DigitoCodBarras + copy( CodigoBarras, 5, 44);
 

 

ACBrCaixaEconomicaSICOB.pas

  • 1 mês depois ...
Postado (editado)

Me deparei com o mesmo problema.

O cliente já estava emitindo os boletos por outro sistema e ao emitir pelo meu ocorreu as diferenças acima.

Coloquei o mesmo código do GutoSantos e bateu todos os dígitos com o que ele já emitia.

 

Abaixo segue a especificação do código de barras para cobrança sem registro:

 

Especificação do Código de Barras para Bloquetos de Cobrança 
Sem Registro SICOB - Nosso Número 16 posições 
 
Posição Tamanho Picture Conteúdo 
01 – 03 03 9 (3) Identificação do banco (104) 
04 – 04 01 9 Código da moeda (9 - Real) 
05 – 05 01 9 Dígito Verificador Geral do Código de Barras 
06 – 09 04 9 Fator de Vencimento (Anexo II) 
10 – 19 10 9 (8) V99 Valor do Documento 
20 – 24 05 9 (5) Código do Cedente - fornecido pela CAIXA 
25 – 28 04 9 (4) Agência de vinculação do Cedente 
29 – 30 02 9 (2) Constante “87” 
31 – 44 14 9 (14) Nosso Número do Cliente com 14 posições 

 

Editado por Alberto
  • 2 meses depois ...
Postado (editado)

Olá!

 

Tive problema ao gerar a cobrança SR para a Caixa Economica (SICOB) também.

O código gerado para a linha digitável pelo ACBrBoleto não batia com o código gerado pelo COBCAIXA.

Fiz a alteração que o GutoSantos postou, mas mesmo assim ainda tive problemas.

Conferindo, notei que o "Campo Livre" usa o comando "Copy(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 1, 4)".

No meu caso, a agência é "0327" e é formatada pela procedure SetAgencia para 5 posições, por causa da propriedade TamanhoAgencia que no caso da CEF é 5 posições, passando então para o valor "00327".

 

Usando o comando "Copy(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 1, 4)", o valor retornado é "0032", o que ocasiona um erro na montagem da variável "Campo Livre".

 

Fiz a modificação na função "TACBrCaixaEconomicaSICOB.MontarCodigoBarras", deixando a condição "Carteira = 'SR'" para que não atrapalhe a geração dos outros tipos de carteira.

 

Depois disso, a código gerado para a "Linha Digitável" bateu com o programa do COBCaixa.

 

Se alguém quiser utilizar a correção, ou se quiserem incorporar ao SVN, segue a função modificada logo abaixo:

 

function TACBrCaixaEconomicaSICOB.MontarCodigoBarras(const ACBrTitulo: TACBrTitulo): String;

var
 CodigoBarras, FatorVencimento, DigitoCodBarras: String;
 ANossoNumero, CampoLivre, aCodCedente: String;
begin
 FatorVencimento := CalcularFatorVencimento(ACBrTitulo.Vencimento);
 
 ANossoNumero := FormataNossoNumero(ACBrTitulo);
 aCodCedente := padR(RightStr(ACBrTitulo.ACBrBoleto.Cedente.CodigoCedente, 11), 11, '0');
 
 if UpperCase(ACBrTitulo.Carteira) = 'SR' then
  CampoLivre := Copy(aCodCedente, 7, 5) + RightStr(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 4) + '87' + RightStr(ANossoNumero, 14)
 else
  CampoLivre := ANossoNumero + RightStr(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 4) + aCodCedente;
 
 { Codigo de Barras }
 with ACBrTitulo.ACBrBoleto do
  CodigoBarras := IntToStrZero(Banco.Numero, 3) + '9' + FatorVencimento + IntToStrZero(Round(ACBrTitulo.ValorDocumento * 100), 10) + CampoLivre;
 
 DigitoCodBarras := CalcularDigitoCodigoBarras(CodigoBarras);
 Result := Copy(CodigoBarras, 1, 4) + DigitoCodBarras + Copy(CodigoBarras, 5, 44);
end;
 
Lembrando que essa modificação foi testada apenas para Nosso Número com 15 posições.
 
Abraço a todos!
Editado por Luiz Carlos Silvestrini
  • 8 meses depois ...
  • Este tópico foi criado há 3857 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...