Problema com PHP
01/08/2014
0
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.
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
Curtir tópico
+ 0
Responder
Posts
04/08/2014
Rafael Carrenho
Guilherme, na linha 65 adicionei o seguinte código:
E para mim deu um resultado bastante coerente, pode testar?
// adicionando horário de almoço $prazoMinutos += 60;
E para mim deu um resultado bastante coerente, pode testar?
Responder
Clique aqui para fazer login e interagir na Comunidade :)