Gerando Boletos Bancários com o VB e Crystal Reports I


O que é preciso para gerar Boletos Bancários ? Bela pergunta , não é mesmo . Que tal começar pelo começo : O que é um boleto bancário ? 

Provavelmente você já deve conhecer um boleto bancário . Quem não teve um boleto em mãos para pagar ?  Se você é um desses poucos felizardos que nunca viram um boleto bancário , permita-me apresentá-lo , na figura abaixo temos um protótipo de um boleto bancário:

Autenticação mecânica

Banco do Brasil

001

39992.76581 29000.000009 00303.000020 1 18000
Local de Pagamento: Pagável em qualquer agência bancária até o vencimento
Vencimento
28/05/2001
Cedente/Sacador
JCMSOFT CONSULTORIA LTDA
Agência/Código Cedente
00057-4/01127765-2
Data do documento
28/04/2001
No. do documento
00000031
Espécie doc.
RC
Aceite
N
Data Processamento

28/04/2001

Nosso Número
0010000303455
Uso do Banco
 
Carteira
CNR
Espécie Moeda
R$ 
Quantidade
 
(x) Valor
 
(=) Valor do Documento
180,00
Instruções (Texto de responsabilidade do cedente)
Após vencimento , multa de 10%

Mora dia  R$ 0,43

Protestar após o 5o dia útil após o vencimento

(-) Descontos/Abatimento
(-) Outras Deduções
(+) Mora/Multa
(+) Outros Acréscimos
(=) Valor Cobrado
Sacado:
Arnaldo Liso
Rua dos Andradas 401
São Paulo - SP
Ficha de Compensação

Autenticação Mecânica

Embora haja pequenas diferenças de banco para banco o layout acima pode ser considerado como um padrão para o boleto bancário. O boleto bancário que adotaremos como referência é o usado pelo  Banco do Brasil , .(Se você vai gerar para outro banco deve solicitar ao banco a documentação do boleto). Vamos as principais partes de um boleto bancário:

01. Especificações do Boleto Bancário

a) número de vias ou partes - 2 (duas), sendo: ( Obs: A ficha de caixa foi abolida)

I - Ficha de Compensação;
II - Recibo do Sacado.

b) disposições das vias ou partes:

I - se sob a forma de vias carbonadas ou auto-copiativas, a primeira via deve ser a Ficha de Compensação;
II - nos demais casos, a Ficha de Compensação deve ficar na parte inferior do papel;

Descrevendo as partes do Boleto Bancário :

Banco do Brasil

001-9

39992.76581 29000.000009 00303.000020 1 18000

- Temos aqui o nome ou o logotipo do banco e o número de identificação do banco na câmera de compensação interbancária ( cada banco possui um número que o identifica:  001- Banco do Brasil  341 - Banco Itaú  , 237-Bradesco , etc...)   

- O 'pequeno número' que você vê do lado direito é a famosa linha digitável ; ela é utilizada para identificar o boleto e deve ser digitada quando o código de barras não pode ser lido ou quando você vai fazer o pagamento do boleto na internet.A Linha digitável tem o seguinte layout:

BBBMC.CCCCd CCCCC.CCCCCd CCCCC.CCCCCd D VVVVVVVVVVVVVV

onde:

B - número do banco
M - Moeda (sempre 9 - real)
V - valor
C - campo livre - depende do banco
D - Digito verificador do código de barras
d - digito verificados da linha digitáveis

Assim para o Banco do Brasil a composição da linha digitável deve seguir o seguinte composição:

Linha digitável: Composição dos campos:

a) PRIMEIRO CAMPO - composto pelo código do Banco (posições 1 a 3 do código de barras), código da moeda (posição 4 do código de barras), as cinco primeiras posições do campo livre (posições 20 a 24 do código de barras) e dígito verificador deste campo;
Obs: editar com ponto, conforme exemplo - 00192.34566

b) SEGUNDO CAMPO - composto pelas posições 6 (sexta) à 15 (décima quinta) do campo livre (posições 25 a 34 do código de barras) e dígito verificador deste campo;
Obs: editar com ponto, conforme exemplo - 52800.783459

c) TERCEIRO CAMPO - composto pelas posições 16 (décima sexta) à 25 (vigésima quinta) do campo livre (posições 35 a 44 do código de barras) e dígito verificador deste campo;
Obs: editar com ponto, conforme exemplo - 97856.895335

d) QUARTO CAMPO - Dígito Verificador geral do Código de Barras (posição 5 do código de barras);
Obs: observar o método de cálculo de DV módulo 11 específico para Código de Barras, previsto do item 12;

e) QUINTO CAMPO - composto pelo fator de vencimento (posições 6 a 9 do código de barras) e pelo valor nominal do documento (posições 10 a 19 do código de barras), com a indicação de zeros entre eles até compor as 14 posições do campo e sem edição (sem ponto ou vírgula). Quando se tratar de bloqueto sem discriminação de valor no código de barras a representação deve ser com zeros;

f) editar os três primeiros campos com um ponto;

g) entre cada campo deverá haver espaço equivalente a 01 caracter;

h) a disposição dos dados na linha digitável não se apresenta na mesma ordem encontrada no código de barras;

i) os dígitos verificadores referentes aos PRIMEIRO, SEGUNDO e TERCEIRO campo não são representados no código de barras.

 

Local de Pagamento: Pagável em qualquer agência bancária até o vencimento
Vencimento
28/05/2001
Cedente/Sacador
JCMSOFT CONSULTORIA LTDA
Agência/Código Cedente
00057-4/01127765-2

A  seguir temos o local de Pagamento , geralmente até o vencimento, o boleto pode ser pago em qualquer banco. (Alguns bancos não deixam isto bem claro ....)

- Temos também a data de vencimento (quando o boleto vence) , o nome do Cedente (A empresa para quem estamos pagando o boleto)  o número da Agência Bancária (0057-4) e o código atribuído ao Cedente pelo banco.

Data do documento
28/04/2001
No. do documento
00000031
Espécie doc.
RC
Aceite
N
Data Processamento

28/04/2001

Nosso Número
0010000303455
Uso do Banco
 
Carteira
18
Espécie Moeda
R$ 
Quantidade
 
(x) Valor
 
(=) Valor do Documento
180,00

- Temos aqui a data do documento (data de geração) o número do documento , a espécie de documento ( podemos ter: DM-Duplicata Mercantil   DS-Duplicata de Serviços    RC-Recibo  NP-Nota Promissória , etc..)

- O Campo Aceite , indicando se o comprador  'aceitou'  o título , o indicativo da carteira ( cada banco usa de modo diferente este campo: No BB temos carteira 11-cobrança simples 17-cobrança direta com registro 18-cobrança sem registro ) a espécie da moeda ( geralmente R$ ) a quantidade e o Valor do documento.

- O Nosso Número é o número que identifica o título perante o banco , geralmente possui 17 posições e é composto pelo número do convênio ( seis posições )

Instruções (Texto de responsabilidade do cedente)
Após vencimento , multa de 10%

Mora dia  R$ 0,43

Protestar após o 5o dia útil após o vencimento

(-) Descontos/Abatimento
(-) Outras Deduções
(+) Mora/Multa
(+) Outros Acréscimos
(=) Valor Cobrado

- Depois temos uma área reservada para que o cedente coloque instruções relativas ao boleto. Geralmente informações sobre multa , desconto ,  protesto , etc...

- Os valores para Descontos/Abatimentos e Outras Deduções ; Mora/Multa e Outros Acréscimos e o finalmente o Valor a ser cobrado do sacado.

Sacado:
Arnaldo Liso
Rua dos Andradas 401
São Paulo - SP
Ficha de Compensação

- Agora temos o endereço do sacado e a identificação da via , no caso , Ficha de Compensação.


Autenticação Mecânica

- Por último temos o código de barras e o espaço reservado para autenticação mecânica.

03. Código de Barras

a) o Código de Barras utilizado é do tipo I-25 - (2 de 5) intercalado;

b) (2 de 5) intercalado significa que 5 (cinco) barras definem 01 (um) caracter, sendo que duas delas são barras largas;

c) intercalado significa que os espaços entre as barras também têm significado, de maneira análoga às barras;

d) deve ser observada a distância de 12 mm desde a margem inferior da Ficha de Compensação até o centro do Código de Barras;

e) comprimento total igual a 103 (cento e três) mm e altura total igual a 13 (treze) mm;

f) deixar espaço livre (zona de silêncio) de 5mm entre a margem esquerda do papel até o início do Código de Barras;

g) o código de barras é composto por dois campos: campo obrigatório e campo livre;

h) o conteúdo do campo obrigatório é determinado pelo Banco Central do Brasil e comum a todos os bancos;

i) o conteúdo do (Campo Livre) é específico para o Banco do Brasil;

O Layout do Código de Barras:

A partir de 01.09.2000, o leiaute do código de barras passa a ser:
N. POSIÇÕES PICTURE USAGE CONTEÚDO
01 001 a 003 9/003/ Display 001
02 004 a 004 9/001/ Display 9 (Real)
   a)      03 005 a 005 9/001/ Display DV (*)
   b)      04 006 a 009 9/004/ Display Fator de Vencimento
05 010 a 019 9/008/v99 Display Valor
06 020 a 044 9/025/ Display CAMPO LIVRE
Obs: a) o dígito verificador da 5a (quinta) posição é calculado através de módulo 11 específico 
  b) o fator de vencimento é calculado através de metodologia descrita no manual

Cálculo do fator de vencimento:

 Metodologia de cálculo para o fator de vencimento

Podem ser adotadas duas fórmulas para o cálculo:

a) data base de 07.10.1997, calculando o número de dias entre essa data e a do vencimento (data de vencimento menos data base é igual a fator):

VENCIMENTO - 04-07-2000
DATA BASE - 07-10-1997
FATOR DE VENCIMENTO 1001

b) tabela de correlação data X fator, iniciando pelo fator 1000, que corresponde à data de vencimento 03.07.2000, e assim sucessivamente:

FATOR VENCIMENTO
1000 03/07/2000
1002 05/07/2000
1667 01/05/2002
4758 17/10/2010
9999 21/02/2025

Exemplo:

99997.77213 // 30530.150082 // 18975.000003 // 3 // 10010000035000
 1o campo    //   2o campo      //    3o campo    // dv // Fator venc/valor

Obs: quando a primeira posição do campo //valor// (fator de vencimento mais valor) for zero, significará que esse título não conterá o fator de vencimento no código de barras/linha digitável, tratando-se portanto as 14 (catorze) posições como valor.

Calculo do Dígito Verificador do Código de Barras (quinta posição)

- Pega-se as 43 posições (44 menos a quinta).
- Multiplica-se cada posição, a partir da última para a primeira, por 2,3,4,5,6,7,8 e 9 sucessivamente.
- Soma-se os resultados.
- Multiplica-se por 10.
- Divide-se por 11. Se o resto for 10 ou 0, o digito é 1. Se não, o resto é o digito.

OBSos dígitos verificadores dos campos agência, código do cedente e nosso-número, calculados com base no módulo 11 , são impressos nos bloquetos e não devem estar representados no código de barras e linha digitável.

Montando o código de barras e a linha Digitável

Vamos agora mostrar como montar o código de barras e a linha digitável. Para começar teremos que usar  funções para calcular o digito verificador ( DV ) da agência , do código do cedente , do nosso-número   e da linha digitável.

Função para calcular o DV da agência , código do cedente e do nosso-número. 

MÓDULO 11 PARA CÁLCULO DE DÍGITO VERIFICADOR DE AGÊNCIA, CÓDIGO DE CEDENTE E NOSSO-NÚMERO

a) O módulo 11 é utilizado para montagem dos campos nosso número, código do cedente e prefixo da agência, que serão impressos no fichamento de cobrança;

b) Cada algarismo que compõe o nosso número é multiplicado pelo respectivo multiplicador (peso). Os multiplicadores (pesos) variam de 9 a 2, da direita para a esquerda;

c) O primeiro dígito da direita para a esquerda deverá ser multiplicado por 9, o segundo por 8 e assim sucessivamente;

d) Os resultados das multiplicações são somados: 00 + 72 + 35.... + 8 + 0 (igual) 179. O total da soma é divido por onze, conforme segue: 179/11 resto igual a 3.

          - se o resto for menor que 10 (dez) o DV será igual ao resto;
          - se o resto for igual a 10 (dez) o DV será igual a X;
          - se o resto for igual a 0 (zero) o DV será igual a 0;
          - no exemplo acima o dígito verificador será igual a 3.

O código Visual Basic para a função para calcular esses DV - Módulo 11 - pode ser o seguinte:

Function Calculo_DV11(strNumero As String) As String
'declara as variáveis
Dim intContador As Integer

Dim intNumero As Integer

Dim intTotalNumero As Integer

Dim intMultiplicador As Integer

Dim intResto As Integer

' se nao for um valor numerico sai da função
If Not IsNumeric(strNumero) Then
  Calculo_DV11 = ""
  Exit Function
End If

'inicia o multiplicador
intMultiplicador = 9

'
pega cada caracter do numero a partir da direita
For intcontador = Len(strNumero) To 1 Step -1

'e
xtrai o caracter e multiplica prlo multiplicador
intnumero = Val(Mid(strNumero, intcontador, 1)) * intMultiplicador

'soma o resultado para totalização
intTotalNumero = intTotalNumero + intnumero

'se o multiplicador for maior que 2 decrementa-o caso contrario atribuir valor padrao original
intMultiplicador = IIf(intMultiplicador > 2, intMultiplicador - 1, 9)

Next

'calcula o resto da divisao do total por 11
intResto = intTotalNumero Mod 11

'verifica as exceções ( 0 -> DV=0    10 -> DV=X (para o BB) e retorna o DV
Select Case intResto
  Case 0
    Calculo_DV11 = "0"
  Case 10
    Calculo_DV11 = "X"
  Case Else
    Calculo_DV11 = str(intResto)
End Select

End Function

Função para cálculo do dígito verificador da linha digitável.

MÓDULO 10 PARA CÁLCULO DE DÍGITO VERIFICADOR DOS CAMPOS DA LINHA DIGITÁVEL

a) o módulo 10 deverá ser utilizado para calcular o DV dos 03 (três) primeiros campos da linha digitável;

b) os multiplicadores começam com o número 2 (dois), sempre pela direita, alternando-se 1 e 2;

c) multiplicar cada algarismo que compõe o número pelo seu respectivo peso (multiplicador);

d) caso o resultado da multiplicação seja maior que 9 (nove) deverão ser somados os algarismos do produto, até reduzi-lo a um único algarismo;

e) fazer o somatório dos resultados obtidos: no exemplo a soma é igual a 25;

f) subtrair o total apurado no item anterior, da dezena imediatamente superior ao total apurado: 30 - 25 é igual a 5;

g) o resultado obtido será o dígito verificador do número. DV é igual a 5;

h) se o resultado da subtração for igual a 10 (dez), o dígito verificador será igual a 0 (zero).

O código Visual Basic para a função para calcular esses DV - Módulo 10 - pode ser o seguinte:

Function Calculo_DV10(strNumero As String) As String
'declara As variáveis
Dim intContador As Integer

Dim intNumero As Integer

Dim intTotalNumero As Integer

Dim intMultiplicador As Integer

Dim intResto As Integer

' se nao for um valor numerico sai da função
If Not IsNumeric(strNumero) Then
  Calculo_DV10 = ""
  Exit Function
End If

'inicia o multiplicador
intMultiplicador = 2

'pega cada caracter do numero a partir da direita
For intContador = Len(strNumero) To 1 Step -1

'extrai o caracter e multiplica pelo multiplicador
intNumero = Val(Mid(strNumero, intContador, 1)) * intMultiplicador

' se o resultado for maior que nove soma os algarismos do resultado
If intNumero > 9 Then
  intNumero = Val(Left(intNumero, 1)) + Val(Right(intNumero, 1))
End If

'soma o resultado para totalização
intTotalNumero = intTotalNumero + intNumero

'se o multiplicador for igual a 2 atribuir valor 1 se for 1 atribui 2
intMultiplicador = IIf(intMultiplicador = 2, 1, 2)

Next

    Dim DezenaSuperior As Integer
    If intTotalNumero < 10 Then
        DezenaSuperior = 10
    Else
        DezenaSuperior = 10 * (Val(Left(CStr(intTotalNumero), 1)) + 1)
    End If
    intResto = DezenaSuperior - intTotalNumero

'verifica as exceções ( 0 -> DV=0 )
Select Case intResto
  Case 0
     Calculo_DV10 = "0"
  Case Else
     Calculo_DV10 = Str(intResto)
End Select

End Function

O Código de Barras

Iremos montar o código de barras para uma carteira 18 (sem registro) com nosso número de 17 posições com fator de vencimento. Esquematizando  teremos:

123.4.5.67890123456789.012345.67890123456789012.34

Banco  m  dv   fator           valor                 no.convenio      nosso número - 17 posições          tipo  

001.9.4.10000000542068.020863.47139120100002678.21

Temos que calcular o DV do código de barras para isto usamos o seguinte algoritmo:

a) o código de barras possui 44 (quarenta e quatro) posições, incluindo o D.V.;

b) para calcular o D.V. considerar 43 posições do Código de Barras, sendo: da posição 1 a 4 e da posição 6 a 44;

c) multiplicar cada algarismo que compõe o número pelo seu respectivo multiplicador (peso), iniciando-se pela 44 posição e saltando a 5 posição;

d) os multiplicadores (pesos) variam de 2 a 9;

e) o primeiro dígito da direita para a esquerda deverá ser multiplicado por 2, o segundo por 3 e assim sucessivamente;

f) os resultados das multiplicações devem ser somados.

g) o total da soma deverá ser dividido por 11

h) o resto da divisão deverá ser subtraído de 11

i) especificamente para o D.V. do Código de Barras, considerar:

I - se o resultado da subtração for:

          - igual a 10....................D.V. igual a 1;
          - igual a 11....................D.V. igual a 1;
          - diferente de 10 e 11..........D.V. será o próprio dígito.

II- o resultado deste cálculo deverá ser incluído na 5a posição do Código de Barras.

ATENÇÃO - Não será admitido o dígito 0 (zero) na quinta posição, pois indicaria que o código de barras não possui dígito verificador;

j) nas posições 43 a 44 do código de barras deverá ser informado, sempre, o tipo de serviço 21.

 A função que iremos usar para montar o código de barras é dada a seguir:

Private Function Monta_CodBarras(Banco As String, Moeda As String, valor As Single, vencimento As Date, Livre As String)

Dim codigo_sequencia As String
Dim database As Date
Dim fator As Integer
Dim intDac As Integer

'database para calculo do fator
database = CDate("7/10/1997")
fator = DateDiff("d", database, Format(vencimento, "dd/mm/yyyy"))
valor = Int(valor * 100)
Livre = Format(Livre, "0000000000000000000000000")

' sequencia sem o DV

codigo_sequencia = Banco & Moeda & fator & Format(valor, "0000000000") & Livre

' calculo do DV
intDac = calcula_DV_CodBarras(codigo_sequencia)

' monta a sequencia para o codigo de barras com o DV
Monta_CodBarras = Left(codigo_sequencia, 4) & intDac & Right(codigo_sequencia, 39)

End Function

A função que calcula o digito verificador do código de barras é dada abaixo:

Private Function calcula_DV_CodBarras(sequencia As String) As Integer

Dim intContador, intNumero, intTotalNumero As Integer
Dim intMultiplicador, intResto, intresultado As Integer
Dim caracter As String

intMultiplicador = 2

For intContador = 1 To 43
   caracter = Mid(Right(sequencia, intContador), 1, 1)
   If intMultiplicador > 9 Then
          intMultiplicador = 2
         intNumero = 0
   End If
   intNumero = caracter * intMultiplicador
   intTotalNumero = intTotalNumero + intNumero
   intMultiplicador = intMultiplicador + 1
Next

intResto = intTotalNumero Mod 11

intresultado = 11 - intResto

If intresultado = 10 Or intresultado = 11 Then
    calcula_DV_CodBarras = 1
Else
    calcula_DV_CodBarras = intresultado
End If

End Function

Fim da primeira Parte !

Na segunda parte mostraremos a função para gerar a linha digitável e como gerar o boleto no Crystal Reports. 

Clique aqui para ler a segunda parte :
Gerando Boletos Bancários com o VB e Crystal Reports II.

Importante: Verifique se não houve alteração das informações consultando o manual de cobrança da Febraban : Manual da FEBRABAN

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti