Gerar código de barras boleto - Boletophp
Boa tarde,
Estou usando o BoletoPHP para gerar nossos boletos, o erro q estamos enfrentando é que ao gerar o código de barras está vindo alguns campos a mais, o correto seria a primeira numeração, porem o que esta sendo lido pelo código de barras é a segunda.
1º - 03392753000000055009559793500000000021780101
2º - 033947530000000550095597935000000000000002178101
A função q estou utilizando é a seguinte:
<?php
// +----------------------------------------------------------------------+
// | BoletoPhp - Versão Beta |
// +----------------------------------------------------------------------+
// | Este arquivo está disponível sob a Licença GPL disponível pela Web |
// | em http://pt.wikipedia.org/wiki/GNU_General_Public_License |
// | Você deve ter recebido uma cópia da GNU Public License junto com |
// | esse pacote; se não, escreva para: |
// | |
// | Free Software Foundation, Inc. |
// | 59 Temple Place - Suite 330 |
// | Boston, MA 02111-1307, USA. |
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// | Originado do Projeto BBBoletoFree que tiveram colaborações de Daniel |
// | William Schultz e Leandro Maniezo que por sua vez foi derivado do |
// | PHPBoleto de João Prado Maia e Pablo Martins F. Costa |
// | |
// | Se você quer colaborar, nos ajude a desenvolver p/ os demais bancos :-)|
// | Acesse o site do Projeto BoletoPhp: www.boletophp.com.br |
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------------+
// | Equipe Coordenação Projeto BoletoPhp: <boletophp@boletophp.com.br> |
// | Desenvolvimento Boleto Santander-Banespa : Fabio R. Lenharo |
// +----------------------------------------------------------------------------+
date_default_timezone_set('America/Los_Angeles');
$codigobanco = "033"; //Antigamente era 353
$codigo_banco_com_dv = geraCodigoBanco($codigobanco);
$nummoeda = "9";$fixo = "9"; // Numero fixo para a posição 05-05
$ios = "0"; // IOS - somente para Seguradoras (Se 7% informar 7, limitado 9%)
// Demais clientes usar 0 (zero)
$fator_vencimento = fator_vencimento($dadosboleto["data_vencimento"]);
//valor tem 10 digitos, sem virgula
$valor = formata_numero($dadosboleto["valor_boleto"],10,0,"valor");
//Modalidade Carteira
$carteira = $dadosboleto["carteira"];
//codigocedente deve possuir 7 caracteres
$codigocliente = formata_numero($dadosboleto["codigo_cliente"],7,0);
//nosso número (sem dv) é 11 digitos
$nnum = formata_numero($dadosboleto["nosso_numero"],7,0);
//dv do nosso número
$dv_nosso_numero = modulo_11($nnum,9,0);
// nosso número (com dvs) são 13 digitos
$nossonumero = "00000".$nnum.$dv_nosso_numero;
$vencimento = $dadosboleto["data_vencimento"];
$vencjuliano = dataJuliano($vencimento);
// 43 numeros para o calculo do digito verificador do codigo de barras
$barra = "$codigobanco$nummoeda$fator_vencimento$valor$fixo$codigocliente$nossonumero$carteira";
//$barra = "$codigobanco$nummoeda$fixo$codigocliente$nossonumero$ios$carteira";
$dv = digitoVerificador_barra($barra);// Numero para o codigo de barras com 44 digitos
$linha = substr($barra,0,4) . $dv . substr($barra,4);
$dadosboleto["codigo_barras"] = $linha;
$dadosboleto["linha_digitavel"] = monta_linha_digitavel($linha);
$dadosboleto["nosso_numero"] = $nossonumero;
$dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;
function dataJuliano($data){
$dia = (int)substr($data,1,2);
$mes = (int)substr($data,3,2);
$ano = (int)substr($data,6,4);
$dataf = strtotime("$ano/$mes/$dia");
$datai = strtotime(($ano-1).'/12/31');
$dias = (int)(($dataf - $datai)/(60*60*24));
return str_pad($dias,3,'0',STR_PAD_LEFT).substr($data,9,4);
}
function digitoVerificador_nossonumero($numero) {
$resto2 = modulo_11($numero, 9, 1);
$digito = 11 - $resto2;
if ($digito == 10 || $digito == 11) {
$dv = 0;
} else {
$dv = $digito;
}
return $dv;
}
function digitoVerificador_barra($numero) {
$resto2 = modulo_11($numero, 9, 1);
if ($resto2 == 0 || $resto2 == 1 || $resto2 == 10) {
$dv = 1;
} else {
$dv = 11 - $resto2;
}
return $dv;
}
// FUNÇÕES
// Algumas foram retiradas do Projeto PhpBoleto e modificadas para atender as particularidades de cada banco
function formata_numero($numero,$loop,$insert,$tipo = "geral") {
if ($tipo == "geral") {
$numero = str_replace(",","",$numero);
while(strlen($numero)<$loop){
$numero = $insert . $numero;
}
}
if ($tipo == "valor") {
/*
retira as virgulas
formata o numero
preenche com zeros
*/
$numero = str_replace(",","",$numero);
while(strlen($numero)<$loop){
$numero = $insert . $numero;
}
}
if ($tipo == "convenio") {
while(strlen($numero)<$loop){
$numero = $numero . $insert;
}
}
return $numero;
}
function fbarcode($valor){
$fino = 1 ;
$largo = 3 ;
$altura = 50 ;
$barcodes[0] = "00110" ;
$barcodes[1] = "10001" ;
$barcodes[2] = "01001" ;
$barcodes[3] = "11000" ;
$barcodes[4] = "00101" ;
$barcodes[5] = "10100" ;
$barcodes[6] = "01100" ;
$barcodes[7] = "00011" ;
$barcodes[8] = "10010" ;
$barcodes[9] = "01010" ;
for($f1=9;$f1>=0;$f1--){
for($f2=9;$f2>=0;$f2--){
$f = ($f1 * 10) + $f2 ;
$texto = "" ;
for($i=1;$i<6;$i++){
$texto .= substr($barcodes[$f1],($i-1),1) . substr($barcodes[$f2],($i-1),1);
}
$barcodes[$f] = $texto;
}
}
//Desenho da barra
//Guarda inicial
?><img src=/boletophp/imagens/p.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=/boletophp/imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=/boletophp/imagens/p.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=/boletophp/imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
<?php
$texto = $valor ;if((strlen($texto) % 2) <> 0){
$texto = "0" . $texto;
}
// Draw dos dados
while (strlen($texto) > 0) {
$i = round(esquerda($texto,2));
$texto = direita($texto,strlen($texto)-2);
$f = $barcodes[$i];
for($i=1;$i<11;$i+=2){
if (substr($f,($i-1),1) == "0") {
$f1 = $fino ;
}else{
$f1 = $largo ;
}
?>
src=/boletophp/imagens/p.png width=<?php echo $f1?> height=<?php echo $altura?> border=0><img
<?php
if (substr($f,$i,1) == "0") {
$f2 = $fino ;
}else{
$f2 = $largo ;
}
?>
src=/boletophp/imagens/b.png width=<?php echo $f2?> height=<?php echo $altura?> border=0><img
<?php
}
}
// Draw guarda final
?>
src=/boletophp/imagens/p.png width=<?php echo $largo?> height=<?php echo $altura?> border=0><img
src=/boletophp/imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=/boletophp/imagens/p.png width=<?php echo 1?> height=<?php echo $altura?> border=0>
<?php} //Fim da função
function esquerda($entra,$comp){
return substr($entra,0,$comp);
}
function direita($entra,$comp){
return substr($entra,strlen($entra)-$comp,$comp);
}
function fator_vencimento($data) {
$data = explode("/",$data);
$ano = $data[2];
$mes = $data[1];
$dia = $data[0];
return(abs((_dateToDays("1997","10","07")) - (_dateToDays($ano, $mes, $dia))));
}
function _dateToDays($year,$month,$day) {
$century = substr($year, 0, 2);
$year = substr($year, 2, 2);
if ($month > 2) {
$month -= 3;
} else {
$month += 9;
if ($year) {
$year--;
} else {
$year = 99;
$century --;
}
}
return ( floor(( 146097 * $century) / 4 ) +
floor(( 1461 * $year) / 4 ) +
floor(( 153 * $month + 2) / 5 ) +
$day + 1721119);
}
function modulo_10($num) {
$numtotal10 = 0;
$fator = 2;
// Separacao dos numeros
for ($i = strlen($num); $i > 0; $i--) {
// pega cada numero isoladamente
$numeros[$i] = substr($num,$i-1,1);
// Efetua multiplicacao do numero pelo (falor 10)
// 2002-07-07 01:33:34 Macete para adequar ao Mod10 do Itaú
$temp = $numeros[$i] * $fator;
$temp0=0;
foreach (preg_split('//',$temp,-1,PREG_SPLIT_NO_EMPTY) as $k=>$v){ $temp0+=$v; }
$parcial10[$i] = $temp0; //$numeros[$i] * $fator;
// monta sequencia para soma dos digitos no (modulo 10)
$numtotal10 += $parcial10[$i];
if ($fator == 2) {
$fator = 1;
} else {
$fator = 2; // intercala fator de multiplicacao (modulo 10)
}
}
// várias linhas removidas, vide função original
// Calculo do modulo 10
$resto = $numtotal10 % 10;
$digito = 10 - $resto;
if ($resto == 0) {
$digito = 0;
}
return $digito;
}
function modulo_11($num, $base=9, $r=0) {
/**
* Autor:
* Pablo Costa <pablo@users.sourceforge.net>
*
* Função:
* Calculo do Modulo 11 para geracao do digito verificador
* de boletos bancarios conforme documentos obtidos
* da Febraban - www.febraban.org.br
*
* Entrada:
* $num: string numérica para a qual se deseja calcularo digito verificador;
* $base: valor maximo de multiplicacao [2-$base]
* $r: quando especificado um devolve somente o resto
*
* Saída:
* Retorna o Digito verificador.
*
* Observações:
* - Script desenvolvido sem nenhum reaproveitamento de código pré existente.
* - Assume-se que a verificação do formato das variáveis de entrada é feita antes da execução deste script.
*/
$soma = 0;
$fator = 2;
/* Separacao dos numeros */
for ($i = strlen($num); $i > 0; $i--) {
// pega cada numero isoladamente
$numeros[$i] = substr($num,$i-1,1);
// Efetua multiplicacao do numero pelo falor
$parcial[$i] = $numeros[$i] * $fator;
// Soma dos digitos
$soma += $parcial[$i];
if ($fator == $base) {
// restaura fator de multiplicacao para 2
$fator = 1;
}
$fator++;
}
/* Calculo do modulo 11 */
if ($r == 0) {
$soma *= 10;
$digito = $soma % 11;
if ($digito == 10) {
$digito = 0;
}
return $digito;
} elseif ($r == 1){
$resto = $soma % 11;
return $resto;
}
}
function modulo_11_invertido($num) // Calculo de Modulo 11 "Invertido" (com pesos de 9 a 2 e não de 2 a 9)
{
$ftini = 2;
$fator = $ftfim = 9;
$soma = 0;
for ($i = strlen($num); $i > 0; $i--)
{
$soma += substr($num,$i-1,1) * $fator;
if(--$fator < $ftini)
$fator = $ftfim;
}
$digito = $soma % 11;
if($digito > 9)
$digito = 0;
return $digito;
}
function monta_linha_digitavel($codigo)
{
// Posição Conteúdo
// 1 a 3 Número do banco
// 4 Código da Moeda - 9 para Real ou 8 - outras moedas
// 5 Fixo "9'
// 6 a 9 PSK - codigo cliente (4 primeiros digitos)
// 10 a 12 Restante do PSK (3 digitos)
// 13 a 19 7 primeiros digitos do Nosso Numero
// 20 a 25 Restante do Nosso numero (8 digitos) - total 13 (incluindo digito verificador)
// 26 a 26 IOS
// 27 a 29 Tipo Modalidade Carteira
// 30 a 30 Dígito verificador do código de barras
// 31 a 34 Fator de vencimento (qtdade de dias desde 07/10/1997 até a data de vencimento)
// 35 a 44 Valor do título
// 1. Primeiro Grupo - composto pelo código do banco, código da moéda, Valor Fixo "9"
// e 4 primeiros digitos do PSK (codigo do cliente) e DV (modulo10) deste campo
$campo1 = substr($codigo,0,3) . substr($codigo,3,1) . substr($codigo,19,1) . substr($codigo,20,4);
$campo1 = $campo1 . modulo_10($campo1);
$campo1 = substr($campo1, 0, 5).'.'.substr($campo1, 5);
// 2. Segundo Grupo - composto pelas 3 últimas posiçoes do PSK e 7 primeiros dígitos do Nosso Número
// e DV (modulo10) deste campo
$campo2 = substr($codigo,24,10);
$campo2 = $campo2 . modulo_10($campo2);
$campo2 = substr($campo2, 0, 5).'.'.substr($campo2, 5);
// 3. Terceiro Grupo - Composto por : Restante do Nosso Numero (6 digitos), IOS, Modalidade da Carteira
// e DV (modulo10) deste campo
$campo3 = substr($codigo,34,10);
$campo3 = $campo3 . modulo_10($campo3);
$campo3 = substr($campo3, 0, 5).'.'.substr($campo3, 5);
// 4. Campo - digito verificador do codigo de barras
$campo4 = substr($codigo, 4, 1);
// 5. Campo composto pelo fator vencimento e valor nominal do documento, sem
// indicacao de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
// tratar de valor zerado, a representacao deve ser 0000000000 (dez zeros).
$campo5 = substr($codigo, 5, 4) . substr($codigo, 9, 10);
return "$campo1 $campo2 $campo3 $campo4 $campo5";
}
function geraCodigoBanco($numero) {
$parte1 = substr($numero, 0, 3);
$parte2 = modulo_11($parte1);
return $parte1 . "-" . $parte2;
}
?>Discussão (1)
Carregando comentários...