Problema com PHP

01/08/2014

0

PHP

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.

// 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);
Guilherme

Guilherme

Responder

Posts

04/08/2014

Rafael Carrenho

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

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


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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar