<?
/*
Arquivo para gerar o boleto bancario do Banco do Brasil
Desenvolvido por Carlos Benecioto <carlos@sohar.com.br>
Data criação: 22/10/2002
Data modificação: 22/10/2002
Todos os direitos reservados
*/


#################
#### Dados necessários para a geração do código de barras
#################
/*
$valor ==> Valor da Operação
$carteira ==> Numero da Carteira
$data_vencimento ==> Data de vencimento do boleto
$agencia ==> Agencia (sem digito verificador)
$codigo_cendente ==> Código do cedente (sem digito verificador)
*/

function gera_codigo_barras($valor, $carteira, $data_vencimento, $agencia, $codigo_cedente, $fator_vencimento, $nosso_numero) {
global $numero_codigo_barras;
global $linha_digitavel;
$inicio_numero = '0019';
$fat_vencimento = fator_vencimento($data_vencimento);
$valor_boleto = calculo_valor_boleto($valor);
$nosso_numero_novo = calculo_nosso_numero($nosso_numero);
if (strlen($agencia) != 4) {
	echo 'ERRO: O numero da agencia deve ser composto de 4 numeros apenas, sem o digito verificador';
	exit;
}
if (strlen($carteira) != 2) {
	echo 'ERRO: O numero da carteira deve ser composto apenas por 2 numeros';
	exit;
}
$codigo_cedente_novo = calculo_codigo_cedente($codigo_cedente);
$numero_temporario = $inicio_numero . $fat_vencimento . $valor_boleto . $nosso_numero_novo . $agencia . $codigo_cedente_novo . $carteira;
$digito_verificador = calcula_digito_verificador_codigo_barras($numero_temporario);
$numero_codigo_barras = cria_numero_codigo_barras ($digito_verificador,$numero_temporario);
$linha_digitavel = cria_linha_digitavel($numero_codigo_barras,$digito_verificador);
}


function date_diff($date1, $date2) {
	$s = strtotime($date2)-strtotime($date1);
	$d = intval($s/86400); 
	$s -= $d*86400;
	$h = intval($s/3600);
	$s -= $h*3600;
	$m = intval($s/60); 
	$s -= $m*60;
	echo "d".$d."h".$h."m".$m."s".$s;
return array("d"=>$d,"h"=>$h,"m"=>$m,"s"=>$s);
}



// Calculo do fator de vencimento (inicio)
function fator_vencimento ($data_calculo) {
	$temp = split("/",$data_calculo);
	$data_formatada = $temp[2] . '/' . $temp[1] . '/' . $temp[0];
	$s = strtotime('1997/10/07')-strtotime($data_formatada);
	$d = intval($s/86400); 
	$s -= $d*86400;
	$h = intval($s/3600);
	$s -= $h*3600;
	$m = intval($s/60); 
	$s -= $m*60;
	return abs($d);
}
// Calculo do fator de vencimento (Fim)

// Formatacao do valor do boleto (Inicio)
function calculo_valor_boleto($valor) {
	$temp = split(",",$valor);
	$valor_1 = '';
	$i = 0;
	while ($temp[$i] != '') {
		$valor_1 .= $temp[$i];
		$i++;
	}
	if (strlen($valor_1) > 10) {
		echo 'Valor do boleto muito grande.';
		exit;
	}
	$complemento = '';
	for ($i = strlen($valor_1); $i < 10; $i++) {
		$complemento .= '0';
	}
	return $complemento . $valor_1;
}
// Formatacao do valor do boleto (final)

function calculo_nosso_numero($nosso_numero) {
	if (strlen($nosso_numero) == 11) {
		return $nosso_numero;
	}
	else {
		$complemento = '';
		for ($i = strlen($nosso_numero); $i < 11; $i++) {
			$complemento .= '0';
		}
		return $complemento . $nosso_numero;
	}
}

function calculo_codigo_cedente($codigo_cedente) {
	if (strlen($codigo_cedente) == 8) {
		return $codigo_cedente;
	}
	else {
		$complemento = '';
		for ($i = strlen($codigo_cedente); $i < 8; $i++) {
			$complemento .= '0';
		}
		return $complemento . $codigo_cedente;
	}
}

function calcula_digito_verificador_codigo_barras($numero_temporario) {
	$total = 0;
	$multiplica = 2;
	for ($i = (strlen($numero_temporario) - 1); $i >= 0; $i--) {
		$total = $total + ($numero_temporario[$i] * $multiplica);
		if ($multiplica == 9) {
			$multiplica = 1;
		}
		$multiplica++;
	}
	$resto = $total % 11;
	$total_resto = 11 - $resto;
	if ($total_resto == 11 || $total_resto == 10)
		return '1';
	else
		return 11 - $resto;
}

function cria_numero_codigo_barras ($digito_verificador,$numero_temporario) {
	$novo_numero = '';
	for ($i = 0; $i <= 44; $i ++) {
		if ($i == 4) {
			$numero_novo .= $digito_verificador;
		}
		$numero_novo .= $numero_temporario[$i];
	}
	return $numero_novo;
}

function cria_linha_digitavel($numero_codigo_barras,$digito_verificador) {
	$campo1 = substr($numero_codigo_barras,0,3) . '9' . substr($numero_codigo_barras,19,5);
	$d_verificador1 = calcula_digito_verificador_linha($campo1);
	$campo1 .= $d_verificador1;
	$campo1_final = '';
	for ($i = 0; $i < strlen($campo1); $i++) {
		if ($i == 5) {
			$campo1_final .= '.';
		}
		$campo1_final.= $campo1[$i];
	}
	$campo2 = substr($numero_codigo_barras,24,10);
	$d_verificador2 = calcula_digito_verificador_linha($campo2);
	$campo2 .= $d_verificador2;
	$campo2_final = '';
	for ($i = 0; $i < strlen($campo2); $i++) {
		if ($i == 5) {
			$campo2_final .= '.';
		}
		$campo2_final.= $campo2[$i];
	}
	$campo3 = substr($numero_codigo_barras,34,10);
	$d_verificador3 = calcula_digito_verificador_linha($campo3);
	$campo3 .= $d_verificador3;
	$campo3_final = '';
	for ($i = 0; $i < strlen($campo3); $i++) {
		if ($i == 5) {
			$campo3_final .= '.';
		}
		$campo3_final.= $campo3[$i];
	}
	$campo4_final = $digito_verificador;
	$campo5_final = substr($numero_codigo_barras,5,4) . substr($numero_codigo_barras,9,10);
	$linha_digitavel = $campo1_final . ' ' . $campo2_final . ' ' . $campo3_final . ' ' . $campo4_final . ' ' . $campo5_final;
	return $linha_digitavel;
}

function calcula_digito_verificador_linha($campo1) {
	$multiplica = 2;
	$valor = 0;
	for ($i = strlen($campo1) - 1; $i >= 0; $i--) {
		$temp_1 = ($campo1[$i] * $multiplica);
		$entrou = 0;
		$temp_2 = $temp_1;
		settype($temp_2, "string");
		while ($temp_1 > 9) {
			$entrou = 1;
			$temp_total = 0;
			for ($j = 0; $j < strlen($temp_2); $j++) {
				$temp_total = $temp_total + $temp_2[$j];
			}
			$temp_1 = $temp_total;
			$temp_2 = $temp_1;
			settype($temp_2, "string");
		}
		if ($entrou == 0) {
			$valor = $valor + $temp_1;
		}
		else {
			$valor = $valor + $temp_1;
		}
		if ($multiplica == 2) {
			$multiplica = 1;
		}
		else {
			$multiplica = 2;
		}
	}
	$temp = ($valor % 10);
	if ($temp == 0) {
		return 0;
	}
	else {
		return 10 - $temp;
	}
}

function modulo_11($numero) {
	$multiplica = 9;
	$valor = 0;
	for ($i = strlen($numero) - 1; $i >= 0; $i--) {
		$temp_1 = ($numero[$i] * $multiplica);
		$valor = $valor + $temp_1;
		if ($multiplica == 2) {
			$multiplica = 10;
		}
		$multiplica--;
	}
	$temp = ($valor % 11);
	if ($temp == 10) {
		return "$numero-X";
	}
	else {
		return "$numero-$temp";
	}
}
?>