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?