Array
(
)

Problema com PHP

PHP
Guilherme
   - 01 ago 2014

Olá,
Estou desenvolvendo uma aplicação para controle de atividades e preciso que uma parte da aplicação calcule a data de entrega da atividade com base na data de inicio + x horas úteis. Eu achei um script que me ajudou em quase tudo que preciso, porém ele não considera horário de almoço. Tentei de tudo para ajustar o código para ele considerar o horário de almoço porém não consegui. Podem me ajudar? Segue o código.
#Código

// objeto de data/hora
// para indicar uma data/hora de inicio, passe ela no construtor, exemplo:
// $date = new DateTime('2013-07-08 09:00:00');
$date = new DateTime();
 
// prazo, em horas. se precisar especificar em minutos, 
// coloque valores quebrados, como 15.5
$prazo = 100; 
 
// inicio do expediente 9 = horas * 60 para transformar em minutos
$inicioExpediente = 9 * 60;
// fim do expediente
$fimExpediente = 19 * 60;
 
// feriados
$feriados = array('09/07/2013');
 
// dias encontrados para trampo
$diasUteis = array();
 
// ----------- agora começa a brincadeira
// convertemos o prazo para minutos
$prazoMinutos = $prazo * 60;
 
// enquanto for maior que zero
while( $prazoMinutos > 0 ){
	// transformamos a hora atual em minutos
	$hora = ($date->format('H') * 60) + $date->format('i');
 
	// se for menor que a hora do inicio do expediente
	if($hora < $inicioExpediente){
 		// colocamos igual a hora do expediente
 		$date->setTime(0, $inicioExpediente, 0);
		continue;
	}
 
	// data calculada
	$data = $date->format('d/m/Y');
 
	// se 
	// - for um feriado OU
	// - passar da hora do expediente OU
	// - for um dia de fim de semana (sabado|domingo)
	// vamos para o dia seguinte, no inicio do expediente
	if(in_array($data,$feriados) || $hora >= $fimExpediente || $date->format('w') == 0 || $date->format('w') == 6){
		$date->modify('+1 day');
		$date->setTime(0, $inicioExpediente, 0);
		continue;
	}
 
	// se chegou aqui, é um dia util.
	// vamos ver se já está na nossa lista de dias
	// se não estiver, colocamos
	if(!in_array($data, $diasUteis)){
		$diasUteis[] = $data;
	}
 
	// minutos que temos que acrescentar para chegar no
	// fim do expediente de hoje
	$minutos = $fimExpediente - $hora;
 
	// tiramos do prazo
	$prazoMinutos -= $minutos;
 
	// se estourou
	if($prazoMinutos < 0){
 		// tiramos o que estourou
 		$minutos += $prazoMinutos;
 	}
 	// adicionamos os minutos do calculo na data
 	$date->modify('+' . $minutos . ' minute');
}
 
$prazoFinal = $date->format('d/m/Y H:i:s');
 
echo $prazoFinal,PHP_EOL;
print_r($diasUteis);

Milléo
   - 04 ago 2014

Guilherme, na linha 65 adicionei o seguinte código:

#Código

// adicionando horário de almoço
    $prazoMinutos += 60;


E para mim deu um resultado bastante coerente, pode testar?