+2

Boleto Bradesco - Parte1

criado por O programador em 24/08/2005 12:45am
Pelo que percebi, há duas coisas fundamentais para gerar um boleto: Obter o número do código de barras e o número da linha digitável.

- Número do código de barras: Número apartir do qual será gerado as barras para o leitor
- Linha Digitável: Número que será utilizado caso seja impossível a leitura do código de barras.

Código de Barras Padrão BDSC

O Número do código de barras é composto por 44 posições (números)

Veja a estrutura abaixo:

Posições
01-03    -> Código do banco sem o digito
04-04    -> Código da Moeda (9-Real)
05-05    -> Dígito verificador do código de barras
06-09    -> Fator de vencimento
10-19    -> Valor Nominal do Título
20-44    -> Campo Livre (Abaixo)

Composição do campo livre Padrão BDSC

Posições
20-23    -> Código da Agencia (sem dígito)
24-05    -> Número da Carteira
26-36    -> Nosso Número (sem dígito)
37-43    -> Conta do Cedente (sem dígito)
44-44    -> Zero (Fixo)

Bem, apartir deste artigo, veremos aos poucos como montar o nosso boleto padrão BDSC, espero contar com a colaboração dos usuários.

Vamos ver agora como obter o FATOR de vencimento:

FATOR DE VENCIMENTO
O fator de vencimento é o número de dias entre a data base que é 07/10/1997 e a data do vencimento do boleto

Para fascilitar utilizei um script que está no link http://www.phpbrasil.com/scripts/script.php/id/18. Usei a versão 1.2.
Mas para fascilitar aí vai ele ja pronto para retornar o fator vencimento.

<?php
function date_diff($from, $to) 
{ 
    /* Usar DD-MM-AA ou DD-MM-AAAA */
    list($from_day, $from_month, $from_year) = explode("-", $from); 
    list($to_day, $to_month, $to_year) = explode("-", $to); 
    $from_date = mktime(0, 0, 0, $from_month, $from_day, $from_year); 
    $to_date = mktime(0, 0, 0, $to_month, $to_day, $to_year);
    
    $days = ($to_date - $from_date) / 86400; 
    return ceil($days);
} 
$FatorVencimento = date_diff('07-10-1997', $DtVencimento);
?>

Agora que já temos o nosso fator vencimento, vamos começar a compor nosso script

Os dados abaixo foram inventados, não sei de onde é a agência, não sei de quem é a conta e não faço idéia de quem são as outras informações:

<?php
//Dados Nescessários
$Agencia = "3338"; //Sem o dígito
$Banco = "237"; //Sem o dígito
$Moeda = "9";
$Carteira = "06";
$NossoNumero = "0038518";//Sem o dígito
$CC = "0016324"; // Sem o digito
$Valor = "150,00";
$DtVencimento = "10/12/2005";

// Substitui o '/' por '-'
$DtVencimento = str_replace('/', '-', $DtVencimento);

// Retorna o fator vencimento
function date_diff($from, $to) 
{ 
    /* Usar DD-MM-AA ou DD-MM-AAAA */
    list($from_day, $from_month, $from_year) = explode("-", $from);
    list($to_day, $to_month, $to_year) = explode("-", $to);

    $from_date = mktime(0, 0, 0, $from_month, $from_day, $from_year);
    $to_date = mktime(0, 0, 0, $to_month, $to_day, $to_year);

    $days = ($to_date - $from_date) / 86400;
    return ceil($days);
} 
$FatorVencimento = date_diff('07-10-1997', $DtVencimento);
?>

Quando compor todo o conjunto nescessário, faltará apenas um campo, que é o campo 5 (dígito verificador do código de barras).

Para obtermos o dígito verificador, precisamos fazer o seguinte:

O conjunto formado sem o campo 5 é de 43 números, então devemos pegar cada número da direita para esquerda e multiplicar por uma sequencia padrão. Esta sequencia começa (direita para esquerda) apartir do nº 2 e vai até nove, e assim por diante até completar 43 casas:

2 3 7 9 2 2 5 5 0 0 0 0 0 1 5 0 0 0 3 3 3 8 0 6 0 0 0 0 0 0 1 6 3 2 4
4 3 2 9 8 7 6 5 4 3 2 9 8 7 6 5 4 3 2 9 8 7 6 5 4 3 2 9 8 7 6 5 4 3 2
 
0 0 1 6 3 2 4 0
9 8 7 6 5 4 3 2

O total da multiplicação de todos os números acima pela sequencia é de 552 dividimos por 11 e o obeteremos o resto da divisão que é=2

Subtraímos 11-Resto
11-2 e termos o dígito verificador que é (9)

Claro...que talvez tudo isso seja complicado, então abaixo vai a função que vai retornar o dígito verificador:

<?php
// Função que calcula o digito verificador Final base 11
function DVG($valor)
{
    $valor = str_replace(".", "", $valor);
    $segb[0] = substr($valor, 0, 1) * 4;
    $segb[1] = substr($valor, 1, 1) * 3;
    $segb[2] = substr($valor, 2, 1) * 2;
    $segb[3] = substr($valor, 3, 1) * 9;
    $segb[4] = substr($valor, 4, 1) * 8;
    $segb[5] = substr($valor, 5, 1) * 7;
    $segb[6] = substr($valor, 6, 1) * 6;
    $segb[7] = substr($valor, 7, 1) * 5;
    $segb[8] = substr($valor, 8, 1) * 4;
    $segb[9] = substr($valor, 9, 1) * 3;
    $segb[10] = substr($valor, 10, 1) * 2;
    $segb[11] = substr($valor, 11, 1) * 9;
    $segb[12] = substr($valor, 12, 1) * 8;
    $segb[13] = substr($valor, 13, 1) * 7;
    $segb[14] = substr($valor, 14, 1) * 6;
    $segb[15] = substr($valor, 15, 1) * 5;
    $segb[16] = substr($valor, 16, 1) * 4;
    $segb[17] = substr($valor, 17, 1) * 3;
    $segb[18] = substr($valor, 18, 1) * 2;
    $segb[19] = substr($valor, 19, 1) * 9;
    $segb[20] = substr($valor, 20, 1) * 8;
    $segb[21] = substr($valor, 21, 1) * 7;
    $segb[22] = substr($valor, 22, 1) * 6;
    $segb[23] = substr($valor, 23, 1) * 5;
    $segb[24] = substr($valor, 24, 1) * 4;
    $segb[25] = substr($valor, 25, 1) * 3;
    $segb[26] = substr($valor, 26, 1) * 2;
    $segb[27] = substr($valor, 27, 1) * 9;
    $segb[28] = substr($valor, 28, 1) * 8;
    $segb[29] = substr($valor, 29, 1) * 7;
    $segb[30] = substr($valor, 30, 1) * 6;
    $segb[31] = substr($valor, 31, 1) * 5;
    $segb[32] = substr($valor, 32, 1) * 4;
    $segb[33] = substr($valor, 33, 1) * 3;
    $segb[34] = substr($valor, 34, 1) * 2;
    $segb[35] = substr($valor, 35, 1) * 9;
    $segb[36] = substr($valor, 36, 1) * 8;
    $segb[37] = substr($valor, 37, 1) * 7;
    $segb[38] = substr($valor, 38, 1) * 6;
    $segb[39] = substr($valor, 39, 1) * 5;
    $segb[40] = substr($valor, 40, 1) * 4;
    $segb[41] = substr($valor, 41, 1) * 3;
    $segb[42] = substr($valor, 42, 1) * 2;
    
    for ($b = 0; $b <= 42; $b++) {
        $SomaDv = $SomaDv + $segb[$b];
    }

    /* Retorna o Digito Verificador */
    $Resto = floor($SomaDv % 11);
    $DiVG = 11 - $Resto;

    return $DiVG;
}
?>

Bem, continuamos no próximo artigo onde vou mostrar como montar o valor do código de barras. T+


Comentários:

Mostrando 1 - 7 de 7 comentários
Edgar Gabaldi disse:
Só pra simplificar o ultimo bloco de código

<?php
// Função que calcula o digito verificador Final base 11
function DVG($valor)
{
$valor = str_replace(".", "", $valor);

$n = 4;

for($i=0;$i<=42;$i++){
$segb[$i] = substr($valor, $i, 1) * $n;
$n--;

if($n==2){ $n=9; }
}

for ($b = 0; $b <= 42; $b++) {
$SomaDv = $SomaDv + $segb[$b];
}

/* Retorna o Digito Verificador */
$Resto = floor($SomaDv % 11);
$DiVG = 11 - $Resto;

return $DiVG;
}
?>

Abraço ;)
02/11/2005 4:42pm (~18 anos atrás)

Renato Banzai disse:
Mesmo assim, o fator de vencimento não é uma data e sim uma diferença de dias entre uma data base e a real data de vencimento que sim seria definida por alguém. Está tudo explicado no artigo...
24/09/2005 8:44pm (~18 anos atrás)

O programador disse:
Olá pessoal... A segunda parte estou desenvolvendo... vou mostrar como criar a linha digitável. Logo logo tá no ar... Falow
09/09/2005 8:09am (~18 anos atrás)

Excelente o Arquivo . Esou comecando a programar em PHP e este tipo de artigo eh uma mao nao roda !
06/09/2005 5:13pm (~18 anos atrás)

Raphael disse:
maneiro o artigo, mas onde está a segunda parte?

um abraço
29/08/2005 1:08pm (~18 anos atrás)

Newton Wagner disse:
sayadnstyle, Não é tão simples assim fazer calculo com datas. Imagine que esteja no dia 30. Se somar 5, o seu vencimento vai pro dia 35. Use o mktime() pra fazer calculos com datas, como a função diff_date() usada pelo Álvaro.

Além do q, pelo q eu entendi, já é passada a data de vencimento do boleto ali, e não a data de criação dele. Então, não é preciso fazer essa conta.
29/08/2005 8:21am (~18 anos atrás)

Esse fator vencimento seria a data do vencimento do boleto?

se for nao seria intereçante da seguinte forma:

-------------------------------
<?
...
$dia = date("d");
$diav = $dia+5;
$DtVencimento = $diav."/".date("m/y");
...
?>
-------------------------------

Explicando:
-------------------------------
$dia = date("d");//pega o dia atual
$diav = $dia+5;//acrescenta 5 ao dia atual
$DtVencimento = $diav."/".date("m/y");
/* Pega o dia do vencimento e acrescenta o mes e o ano atual... sendo a data de vencimento 5 dia depois a data e emicao */
-------------------------------


e so uma sugestao!
mais dessa forma fica mais facil nao acha?
25/08/2005 6:42pm (~18 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)