+8

Boleto bancário ( Fácil e Simples ) - Parte 1

criado por Maykson A C Silva em 24/02/2005 10:40pm
Falta o Digito Controlador e o Campo4, dos dois vamos ver primeiro o Campo4 e seu famoso Fator de Vencimento, o Digito Controlador veremos depois, pois o mesmo será fornecido pelo Código de Barras.

// Campo4
// Variáveis usadas no Campo4:
// $DataVenc = '09/06/2005'
// $ValorDoc = '53.26'

A data de vencimento é regulamentada pela diferença em dias entre a data de vencimento e a data 07/10/1997. Bom seguindo o mesmo principio que me levou a escrever este tutorial, o fato de todos os scripts que encontrei pouco explicavam e muito confundiam, para descobrir o Fator de Vencimento então, o phpboleto utiliza de um script gringo muito louco.

Não contente foi ler sobrea função Datas no Livro PHP e MySQL de Luke Welling e Laura Thomson, para ter uma referência. Resultado a função mktime, tão simples, muito usada para outras coisas parecidas e também iguais.

A função mktime tem a seguinte protótipo:

mktime(hora,minuto,segundo,mês,dia,ano);

Minha hora é zero, meu minuto é zero, meu segundo é zero, algo como meia-noite.
Mês, dia e ano tenho na minha Data de Vencimento e minha Data regulamentada ou inicial 07/10/1997.

O que eu devo fazer é separar os números das barras e colocá-lo na ordem usada pelo mktime. Para isto uso a função explode dividindo em 3 partes a data.

$DataVenc = explode('/',$DataVenc);
$DiaVenc = $DataVenc[0];
$MesVenc = $DataVenc[1];
$AnoVenc = $DataVenc[2];

$DataInic = explode('/',’07/10/1997’);
$DiaInic = $DataInic[0];
$MesInic = $DataInic[1];
$AnoInic = $DataInic[2];

Vamos ao mktime.

$DataInic = mktime(0,0,0,$MesInic,$DiaInic,$AnoInic);
$DataVenc = mktime(0,0,0,$MesVenc,$DiaVenc,$AnoVenc);

Eu não criei uma função para isto, mais você poderia criar
O Fator de vencimento é a diferença entre as datas então:

$FatorVenc = $DataVenc - $DataInic;

Mais o que acontece o mktime retorna um valor em segundo e nos precisamos que esta diferença seja em dias, ok?

Então precisamos saber quantos segundo tem em um 1 dia e dividi-lo pelo $FatorVenc

$Segundos = 24*60*60; // 24 horas * 60 minutos * 60 segundos

$FatorVenc = ceil($FatorVenc/$Segundos);

Uso a função ceil para haver um arredondamento para cima, vamos supor que o resultado fosse 20,5 com o ceil o resultado seria 21, entendeu.

Bom já temos o $FatorVenc agora só falta adicionar os zero ao valor, mais antes devemos limpar as edições (ponto e virgula) que estão no valor.
Para isto uso a função str_replace, trocando as edições por nada.

$ValorDoc = str_replace('.','',$ValorDoc);
$ValorDoc = str_replace(',','',$ValorDoc);

Sem edição, adiciono os zeros necessários para completarem 10 digitos, pois temos 4 digitos do $FatorVenc e precisamos de 14.

$Zeros = 10 - strlen($Valor);

$ValorDoc = Zeros($Zeros,$ValorDoc);

Tudo pronto finalizamos o Campo4 diferente dos outros Campos ele não precisa encontrar um Dv, nem Soma, apenas:

$Campo4 = $FatorVenc.$ValorDoc;

E teremos algo assim: 28020000005326

Olhando novamente a nossa Linha Digitável teremos:

00198.88882 82222.266668 00077.777183 X 28020000005326

Onde X é o Digito Controlador.

Na próxima parte vou mostrar como encontrar o Digito Controlador e os números que geram o Código de Barras

Comentários:

Mostrando 1 - 10 de 21 comentários
Fernando disse:
Tenho aqui feito em VB, se alguem quiser traduzir para PHP, sinta-se a vontade.



'=================================
Function CalculaDigitoVerifCodBarras(ByVal linhaCalculavel As String)
Dim multiplicador As New Multiplicador ' decartavel
Dim I As Integer = 1
Dim total As Integer = 0
Dim atual As Integer
While I <= 43
atual = CInt(linhaCalculavel.Substring(I - 1, 1))
atual = atual * multiplicador()
total = total + atual
I = I + 1
End While
Dim sobra, digito As Integer
sobra = Math.Ceiling(total Mod 11)
digito = 11 - sobra
Select Case digito
Case Is = 0
digito = 1
Case Is = 10
digito = 1
Case Is = 11
digito = 1
End Select
Return digito
End Function
'====================================
Function multiplicador() As Integer
If multi = 2 Then
multi = 9
Return 9
Else
multi = multi - 1
Return multi
End If
End Function
'====================================


Depois eu tento traduzir para PHP. Abraço
16/10/2006 10:40am (~17 anos atrás)

Fernando disse:
Para os que estão com problema no DV de cada campo.
Esta parte está incorreta.

if($X > 9){ $X = $X-9; } <-- esta parte aqui está incorreta

Não se deve diminuir 9 caso o numero for maior que 9, e sim, somar os digitos.
por exemplo, se for 14, soma-se 1+4 =5

Espero ter ajudado.

Um abraço.
16/10/2006 10:36am (~17 anos atrás)

Consegui adaptar para a CEF mudando apenas a geração do campo <nosso número> no resto ficou ótimo.
27/05/2006 6:45pm (~18 anos atrás)

Olá pessoal preciso urgente, alguém já conseguiu fazer funcionar ...

Grato ...
18/05/2006 6:00am (~18 anos atrás)

Olá Maykson e o resto do pessoal,

Estou a procura do script para convênios de 7 dígitos. Procurei em diversos lugares, em vão. Se alguém tiver, gostaria que por favor me fornecesse.

Agradeço
02/05/2006 5:03am (~18 anos atrás)

Gostaria de usar o phpBoleto, mas não consigo fazer funcionar com a Caixa Economica, a linha digitável e o código de barras são recusados, alguém poderia me enviar já o script pronto para a CEF.

pacheco@apeknet.com.br
(e-mail com espaço ilimitado para receber arquivos e é também o MSN)
18/04/2006 7:41pm (~18 anos atrás)

Cesar disse:
Alguem tem esse script:
Convenio de 7 Digitos com Nosso Numero 10 DIGITOS
que nem o:
http://www.geraboleto.com/geraboleto/demo/bb-teste.php
Sera que alguem pode me ajudar com pelo menos o manual de como o boleto com 7 digitos deve ser?
São so algumas mudanças no script!!!
Abraços
Cesar
msn: cdw@brturbo.com
20/03/2006 11:07am (~18 anos atrás)

ainda nao consegui o principal!... fazer funcionar! ele gera tudo ok! mas quando vou fazer o pagamento do boleto, ele diz no sistema que o codigo do numero não é valido!

comparei o boleto deste sistema com o do proprio sistema do banco do brasil e verifiquei q ele ta gerando no campo 2 (4 e 7 digitos) quanto no boleto so tem q ter 4 e 6 no campo 2! alguem pode me ajudar?

contato@paulochinelate.com.br
10/02/2006 10:04am (~18 anos atrás)

Robson disse:
Olá pessoal.

Achei excelente este artigo e com certeza me será muito útil.
Gostaria de dar uma pequena colaboração mostrando a função que fiz para obter o fator de vencimento usando os cálculos já presentes no script:

function FatorVenc($DataVenc)
{
$DataVenc = explode('/',$DataVenc);
$DiaVenc = $DataVenc[0];
$MesVenc = $DataVenc[1];
$AnoVenc = $DataVenc[2];

$DataInic = explode('/','07/10/1997');
$DiaInic = $DataInic[0];
$MesInic = $DataInic[1];
$AnoInic = $DataInic[2];

$DataInic = mktime(0,0,0,$MesInic,$DiaInic,$AnoInic);
$DataVenc = mktime(0,0,0,$MesVenc,$DiaVenc,$AnoVenc);

$FatorVenc = $DataVenc - $DataInic; //Fator de vencto. em seg.
$FatorVenc = ceil($FatorVenc/86400); //Fator de vencto. em dias

return $FatorVenc;
}

Para chamar a função:
$FatorVenc = FatorVenc($DataVenc);

Abraços.
31/10/2005 7:38am (~18 anos atrás)

Ela pega o $Partes do começo pro fim...

tva com o emsmo problema da raquel borto...

21/07/2005 4:21pm (~19 anos atrás)

Novo Comentário:

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