Viewing file: BoletoCtrl.php (15.03 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?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 vc 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> |
// | Desenv Boleto SICREDI: Rafael Azenha Aquini <rafael@tchesoft.com> |
// | Marco Antonio Righi <marcorighi@tchesoft.com> |
// | Homologação e ajuste de algumas rotinas. |
// | Marcelo Belinato <mbelinato@gmail.com> |
// +----------------------------------------------------------------------+
$codigobanco = "748";
$codigo_banco_com_dv = geraCodigoBanco($codigobanco);
$nummoeda = "9";
$fator_vencimento = fator_vencimento($dadosboleto["data_vencimento"]);
//valor tem 10 digitos, sem virgula
$valor = formata_numero($dadosboleto["valor_boleto"], 10, 0, "valor");
//agencia é 4 digitos
$agencia = formata_numero($dadosboleto["agencia"], 4, 0);
//posto da cooperativa de credito é dois digitos
$posto = formata_numero($dadosboleto["posto"], 2, 0);
//conta é 5 digitos
$conta = formata_numero($dadosboleto["conta"], 5, 0);
//dv da conta
$conta_dv = formata_numero($dadosboleto["conta_dv"], 1, 0);
//carteira é 2 caracteres
$carteira = $dadosboleto["carteira"];
//fillers - zeros Obs: filler1 contera 1 quando houver valor expresso no campo valor
$filler1 = 1;
$filler2 = 0;
// Byte de Identificação do cedente 1 - Cooperativa; 2 a 9 - Cedente
$byteidt = $dadosboleto["byte_idt"];
// Codigo referente ao tipo de cobrança: "3" - SICREDI
$tipo_cobranca = 3;
// Codigo referente ao tipo de carteira: "1" - Carteira Simples
$tipo_carteira = 1;
//nosso número (sem dv) é 8 digitos
$nnum = $dadosboleto["inicio_nosso_numero"] . $byteidt . formata_numero($dadosboleto["nosso_numero"], 5, 0);
//calculo do DV do nosso número
$dv_nosso_numero = digitoVerificador_nossonumero("$agencia$posto$conta$nnum");
$nossonumero_dv = "$nnum$dv_nosso_numero";
//formação do campo livre
$campolivre = "$tipo_cobranca$tipo_carteira$nossonumero_dv$agencia$posto$conta$filler1$filler2";
$campolivre_dv = $campolivre . digitoVerificador_campolivre($campolivre);
// 43 numeros para o calculo do digito verificador do codigo de barras
$dv = digitoVerificador_barra("$codigobanco$nummoeda$fator_vencimento$valor$campolivre_dv", 9, 0);
// Numero para o codigo de barras com 44 digitos
$linha = str_replace(" ", "", "$codigobanco$nummoeda$dv$fator_vencimento$valor$campolivre_dv");
// Formata strings para impressao no boleto
$nossonumero = substr($nossonumero_dv, 0, 2) . '/' . substr($nossonumero_dv, 2, 6) . '-' . substr($nossonumero_dv, 8, 1);
$agencia_codigo = $agencia . "." . $posto . "." . $conta;
//echo $linha;
$dadosboleto["codigo_barras"] = $linha;
$dadosboleto["linha_digitavel"] = monta_linha_digitavel($linha);
$dadosboleto["agencia_codigo"] = $agencia_codigo;
$dadosboleto["nosso_numero"] = $nossonumero;
$dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;
include "load_ipanel.php";
if (!class_exists("CobrancaCtrl")) {
include "CobrancaCtrl.php";
}
$cobrancaCtrl = new CobrancaCtrl();
$cobrancaCtrl->saveLinhaDigitavel($_POST['idcobranca'], monta_linha_digitavel($linha));
function digitoVerificador_nossonumero($numero) {
$resto2 = modulo_11($numero, 9, 1);
// esta rotina sofrer algumas alterações para ajustar no layout do SICREDI
$digito = 11 - $resto2;
if ($digito > 9) {
$dv = 0;
} else {
$dv = $digito;
}
return $dv;
}
function digitoVerificador_campolivre($numero) {
$resto2 = modulo_11($numero, 9, 1);
// esta rotina sofreu algumas alterações para ajustar no layout do SICREDI
if ($resto2 <= 1) {
$dv = 0;
} else {
$dv = 11 - $resto2;
}
return $dv;
}
function digitoVerificador_barra($numero) {
$resto2 = modulo_11($numero, 9, 1);
// esta rotina sofrer algumas alterações para ajustar no layout do SICREDI
$digito = 11 - $resto2;
if ($digito <= 1 || $digito >= 10) {
$dv = 1;
} else {
$dv = $digito;
}
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;
}
}
$texto = $valor;
$tst = $texto;
// echo $tst."<br>";
//Desenho da barra
//Guarda inicial
?><img src=img/boleto/p.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
src=img/boleto/b.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
src=img/boleto/p.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
src=img/boleto/b.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
<?php
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=img/boleto/p.gif width=<?= $f1 ?> height=<?= $altura ?> border=0><img
<?php
if (substr($f, $i, 1) == "0") {
$f2 = $fino;
} else {
$f2 = $largo;
}
?>
src=img/boleto/b.gif width=<?= $f2 ?> height=<?= $altura ?> border=0><img
<?php
}
}
// Draw guarda final
?>
src=img/boleto/p.gif width=<?= $largo ?> height=<?= $altura ?> border=0><img
src=img/boleto/b.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
src=img/boleto/p.gif width=<?= 1 ?> height=<?= $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 = split("/", $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)
$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;
return $digito;
} elseif ($r == 1) {
// esta rotina sofrer algumas alterações para ajustar no layout do SICREDI
$r_div = (int) ($soma / 11);
$digito = ($soma - ($r_div * 11));
return $digito;
}
}
function monta_linha_digitavel($codigo) {
// COMPOSICAO DO CODIGO
// Posição | Larg | Conteúdo
// --------+------+---------------
// 1 a 3 | 03 | Identcação do banco
// 4 | 01 | Código da Moeda - 9 para R$
// 5 | 01 | Digito verificador geral do Código de Barras
// 6 a 9 | 04 | Fator de Vencimento
// 10 a 19 | 10 | Valor (8 inteiros e 2 decimais)
// 20 a 44 | 25 | Campo Livre definido por cada banco (25 caracteres)
//COMPOSICAO DA LINHA DIGITAVEL
// 1. Campo - composto pelo código do banco, código da moéda, as cinco primeiras posições
// do campo livre e DV (modulo10) deste campo
$p1 = substr($codigo, 0, 4);
$p2 = substr($codigo, 19, 5);
$p3 = modulo_10("$p1$p2");
$p4 = "$p1$p2$p3";
$p5 = substr($p4, 0, 5);
$p6 = substr($p4, 5);
$campo1 = "$p5.$p6";
// 2. Campo - composto pelas posiçoes 6 a 15 do campo livre
// e livre e DV (modulo10) deste campo
$p1 = substr($codigo, 24, 10);
$p2 = modulo_10($p1);
$p3 = "$p1$p2";
$p4 = substr($p3, 0, 5);
$p5 = substr($p3, 5);
$campo2 = "$p4.$p5";
// 3. Campo composto pelas posicoes 16 a 25 do campo livre
// e livre e DV (modulo10) deste campo
$p1 = substr($codigo, 34, 10);
$p2 = modulo_10($p1);
$p3 = "$p1$p2";
$p4 = substr($p3, 0, 5);
$p5 = substr($p3, 5);
$campo3 = "$p4.$p5";
// 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 000 (tres zeros).
$p1 = substr($codigo, 5, 4);
$p2 = substr($codigo, 9, 10);
$campo5 = "$p1$p2";
return "$campo1 $campo2 $campo3 $campo4 $campo5";
}
function geraCodigoBanco($numero) {
$parte1 = substr($numero, 0, 3);
// $parte2 = modulo_11($parte1);
return $parte1 . "-X";
}
?>
|