servicos); $data = $request->data; $start_time = $request->start_time; $empresa_id = $request->empresa_id; $funcionario_id = $request->funcionario_id; $diaSemanaNumerico = date('w', strtotime($data)); $diaStr = DiaSemana::getDia($diaSemanaNumerico); $totalServico = 0; $tempoServico = 0; foreach($servicos as $s){ $item = Servico::findOrFail($s); $tempoServico += (float)$item->tempo_servico; $totalServico += (float)$item->valor; } $funcionarios = Funcionario::where('funcionarios.empresa_id', $empresa_id) ->select('funcionarios.*') ->join('dia_semanas', 'dia_semanas.funcionario_id', '=', 'funcionarios.id') ->where(function($q) use ($diaStr) { return $q->orWhere('dia', 'LIKE', '%'.$diaStr.'%'); }) ->when(!empty($funcionario_id), function ($query) use ($funcionario_id) { return $query->where('funcionarios.id', $funcionario_id); }) ->get(); $horarios = []; $minutosEspaco = 5; foreach($funcionarios as $f){ $funcionamento = Funcionamento ::where('funcionario_id', $f->id) ->where('dia_id', $diaStr) ->first(); // funcionamento do dia $inicio = $funcionamento->inicio; if($start_time){ $inicio = $start_time; } $fim = $funcionamento->fim; if($data == date('Y-m-d')){ $inicio = strtotime("$data $inicio"); $agora = strtotime("$data " . date('H:i')); $horaAgora = date('H:i'); if($agora > $inicio){ // $inicio = date('H:i', strtotime(date('Y-m-d H:i') . "+ $minutosEspaco minutes")); $inicio = $this->proximoMinuto($minutosEspaco); // return $inicio; } } $dif = strtotime("$data $fim") - strtotime("$data $inicio"); $minutosDif = $dif/(60); if($minutosDif > 0 && $tempoServico > 0){ $contador = $minutosDif/$tempoServico; $interrupcoes = Interrupcoes::where('funcionario_id', $f->id) ->where('status', 1) ->where('dia_id', $diaStr)->get(); $inicio = strtotime("$data $inicio"); for($i=0; $i<$contador; $i++){ $fim = strtotime("+".$tempoServico." minutes", $inicio); $temp = [ 'funcionario_id' => $f->id, 'funcionario_nome' => $f->nome, 'inicio' => date('H:i', $inicio), 'fim' => date('H:i', $fim), 'data' => $data, 'total' => $totalServico, 'tempoServico' => $tempoServico ]; $add = true; $interrupcao = Interrupcoes::where('funcionario_id', $f->id) ->where('dia_id', $diaStr) ->whereTime('inicio', '<=', date('H:i', $inicio)) ->whereTime('fim', '>=', date('H:i', $inicio)) ->first(); if($interrupcao != null){ $add = false; }else{ $agendamento = Agendamento::where('funcionario_id', $f->id) ->whereDate('data', $data) ->whereTime('inicio', '<=', date('H:i', $inicio)) ->whereTime('termino', '>=', date('H:i', $inicio)) ->first(); if($agendamento != null){ $add = false; } } if($add == true){ array_push($horarios, $temp); } $inicio = $fim; } } } return view('agendamento.partials.agenda_row', compact('horarios')); } private function proximoMinuto($minutosEspaco){ $inicio = date('H:i', strtotime(date('Y-m-d H:i') . "+ $minutosEspaco minutes")); $minuto = date('i', strtotime($inicio)); $hora = date('H', strtotime($inicio)); $divisao = (int)($minuto/15); if($divisao == 0){ $inicio = date('H').':15'; }else if($divisao == 1){ $inicio = date('H').':30'; } else if($divisao == 2){ $inicio = date('H').':45'; }else{ $inicio = date('H', strtotime(date('Y-m-d H:i') . "+ 1 hour")).':00'; } return $inicio; } }