public function doFindNextSlot(Request $request, $override_start_date = 0, $override_duration = 0, $override_appointment_type = 0, $override_redirect = 0) { if ($override_start_date) { $start_date = Carbon::createFromFormat('d/m/Y', $override_start_date); } else { $start_date = Carbon::createFromFormat('d/m/Y', $request->input('start_date')); } if ($override_duration) { $duration = $override_duration; } else { $duration = $request->input('minutes'); } if ($override_appointment_type) { $appointment_type = $override_appointment_type; } else { $appointment_type = $request->input('appointment_type'); } $dentist_id = $request->input('dentist'); $found_slot = false; for ($i = 8; $i < 19; $i++) { if ($i < 10) { $times[] = "0" . $i . ":00"; $times[] = "0" . $i . ":05"; $times[] = "0" . $i . ":10"; $times[] = "0" . $i . ":15"; $times[] = "0" . $i . ":20"; $times[] = "0" . $i . ":25"; $times[] = "0" . $i . ":30"; $times[] = "0" . $i . ":35"; $times[] = "0" . $i . ":40"; $times[] = "0" . $i . ":45"; $times[] = "0" . $i . ":50"; $times[] = "0" . $i . ":55"; } else { $times[] = $i . ":00"; $times[] = $i . ":05"; $times[] = $i . ":10"; $times[] = $i . ":15"; $times[] = $i . ":20"; $times[] = $i . ":25"; $times[] = $i . ":30"; $times[] = $i . ":35"; $times[] = $i . ":40"; $times[] = $i . ":45"; $times[] = $i . ":50"; $times[] = $i . ":55"; } if ($i == 18) { $times[] = "19:00"; } } $today = $start_date->copy(); \DB::enableQueryLog(); $slot_start = 'beep'; $slots_found = 0; $slots = array(); $leave_clear = 0; while ($slots_found < 12) { $today_with_timeslot = $today->copy(); foreach ($times as $time) { if ($leave_clear == 0) { $time_exploded = explode(":", $time); $today_with_timeslot->hour = $time_exploded[0]; $today_with_timeslot->minute = $time_exploded[1]; $today_with_timeslot->second = 0; $end_of_slot = $today_with_timeslot->copy()->addMinutes($duration); $end_of_slot->second = 59; if (Appointment::where('dentist_id', $dentist_id)->where(function ($query) use($today_with_timeslot, $end_of_slot) { $query->whereBetween('start_date', array($today_with_timeslot->format('Y-m-d H:i:s'), $end_of_slot->format('Y-m-d H:i:s')))->orWhereBetween('end_date', array($today_with_timeslot->format('Y-m-d H:i:s'), $end_of_slot->format('Y-m-d H:i:s'))); })->count() == 0 && ($end_of_slot->hour < 19 || $end_of_slot->hour == 19 && $end_of_slot->minute == 19)) { $slot_is_good = true; $interval_start = $today_with_timeslot->copy(); $interval_end = $end_of_slot->copy(); $duration = $interval_start->diffInMinutes($interval_end); while ($interval_start->format('H:i') != $interval_end->format('H:i')) { if (CalendarRestriction::where('day', $today_with_timeslot->format('l'))->where('appointment_type_id', '!=', 0)->where('time', $interval_start->format('H:i'))->where('appointment_type_id', '!=', $appointment_type)->count() > 0) { $slot_is_good = false; break; } $interval_start = $interval_start->copy()->addMinutes(5); } if ($slot_is_good) { $slots[$slots_found]['start'] = $today_with_timeslot->copy()->format('H:i'); $slots[$slots_found]['end'] = $end_of_slot->copy()->format('H:i'); $slots[$slots_found]['date'] = $today->copy()->format('d-m-Y'); $slots[$slots_found]['dentist_id'] = $dentist_id; $slots_found++; $leave_clear = $duration / 5 - 1; if ($slots_found == 12) { break; break; } } } } else { $leave_clear--; } } $today = $today->copy()->addDay(); } $request->session()->put('find_slot_trigger_open', true); $request->session()->put('slots', $slots); // $request->session()->put('selected_calendar_day', $slot_date->format('Y-m-d H:i:s')); // $request->session()->put('selected_calendar_layout', 'week'); // $request->session()->put('single_filtered_dentist', $dentist_id); // $request->session()->put('prefilled_start_time', $slot_start->format('H:i')); // $request->session()->put('prefilled_end_time', $slot_end->format('H:i')); // $request->session()->put('prefilled_date', $slot_end->format('d/m/Y')); if (!$override_redirect) { return redirect('dashboard'); } }
public function showDashboard(Request $request) { if (!$request->session()->has('selected_calendar_day')) { $request->session()->put('selected_calendar_day', Carbon::today()->format('Y-m-d H:i:s')); } if ($request->session()->has('selected_calendar_layout')) { $calendar_view = $request->session()->get('selected_calendar_layout'); } else { $calendar_view = "day"; } if ($request->session()->has('find_slot_trigger_open')) { $request->session()->forget('find_slot_trigger_open'); $find_slot_trigger = true; } else { $find_slot_trigger = false; } if ($request->session()->has('slots')) { $slots = $request->session()->get('slots'); $request->session()->forget('slots'); } else { $slots = array(); } $dentists = $this->getDentists($request); $data = array(); $restrictions = CalendarRestriction::where('appointment_type_id', '!=', 0)->get(); $data["restrictions_json"] = $restrictions->toJSON(); if ($calendar_view == 'day') { $filtered_dentists = array(); if ($request->session()->has('filtered_dentists')) { foreach ($request->session()->get('filtered_dentists') as $d) { foreach ($dentists as $fd) { if ($d->id == $fd->id) { $filtered_dentists[] = $fd; } } } } else { $filtered_dentists = $dentists; } $calendar_range['start'] = Carbon::createFromFormat('Y-m-d H:i:s', $request->session()->get('selected_calendar_day')); $calendar_range['end'] = $calendar_range['start']->copy()->addDay(); for ($i = 8; $i < 19; $i++) { if ($i < 10) { $times[] = "0" . $i . ":00"; $times[] = "0" . $i . ":05"; $times[] = "0" . $i . ":10"; $times[] = "0" . $i . ":15"; $times[] = "0" . $i . ":20"; $times[] = "0" . $i . ":25"; $times[] = "0" . $i . ":30"; $times[] = "0" . $i . ":35"; $times[] = "0" . $i . ":40"; $times[] = "0" . $i . ":45"; $times[] = "0" . $i . ":50"; $times[] = "0" . $i . ":55"; } else { $times[] = $i . ":00"; $times[] = $i . ":05"; $times[] = $i . ":10"; $times[] = $i . ":15"; $times[] = $i . ":20"; $times[] = $i . ":25"; $times[] = $i . ":30"; $times[] = $i . ":35"; $times[] = $i . ":40"; $times[] = $i . ":45"; $times[] = $i . ":50"; $times[] = $i . ":55"; } if ($i == 18) { $times[] = "19:00"; } } $appointments = array(); $appointment_ids = array(); foreach ($filtered_dentists as $dentist) { $current_day = $calendar_range['start']->copy(); $end_date = $calendar_range['end']->copy(); //Start from start of date range, add 1 day, get appointments for day, add day until end of range while ($current_day->ne($end_date)) { $next_day = $current_day->copy()->addDay(); $appointment_list = DB::table('appointments')->select('id')->where('dentist_id', $dentist->id)->where('start_date', '>', $current_day->format('Y-m-d H:i:s'))->where('end_date', '<', $next_day->format('Y-m-d H:i:s'))->get(); foreach ($appointment_list as $appointment_id) { $appointment_ids[] = $appointment_id->id; $appointment = Appointment::findOrFail($appointment_id->id); $appointments[$dentist->id][$current_day->format('Y-m-d')][] = $appointment; } $current_day = $current_day->addDay(); } } $day_name = $calendar_range['start']->format('l'); $restrictions = CalendarRestriction::where('day', $day_name)->where('appointment_type_id', '!=', 0)->get(); $data['appointment_ids'] = $appointment_ids; $data["restrictions"] = $restrictions; $data["times"] = $times; $data["date_start"] = $calendar_range['start']; $data["filtered_dentists"] = $filtered_dentists; } elseif ($calendar_view == 'week') { for ($i = 8; $i < 19; $i++) { if ($i < 10) { $times[] = "0" . $i . ":00"; $times[] = "0" . $i . ":05"; $times[] = "0" . $i . ":10"; $times[] = "0" . $i . ":15"; $times[] = "0" . $i . ":20"; $times[] = "0" . $i . ":25"; $times[] = "0" . $i . ":30"; $times[] = "0" . $i . ":35"; $times[] = "0" . $i . ":40"; $times[] = "0" . $i . ":45"; $times[] = "0" . $i . ":50"; $times[] = "0" . $i . ":55"; } else { $times[] = $i . ":00"; $times[] = $i . ":05"; $times[] = $i . ":10"; $times[] = $i . ":15"; $times[] = $i . ":20"; $times[] = $i . ":25"; $times[] = $i . ":30"; $times[] = $i . ":35"; $times[] = $i . ":40"; $times[] = $i . ":45"; $times[] = $i . ":50"; $times[] = $i . ":55"; } if ($i == 18) { $times[] = "19:00"; } } $data["times"] = $times; $calendar_range['start'] = Carbon::createFromFormat('Y-m-d H:i:s', $request->session()->get('selected_calendar_day'))->startOfWeek(); $calendar_range['end'] = $calendar_range['start']->copy()->endOfWeek(); $tmp_start = $calendar_range['start']->copy(); $tmp_end = $calendar_range['end']->copy(); $days = array(); $i = 0; while ($i < 7) { $days[$tmp_start->format('d')] = $tmp_start->format('l'); $tmp_start->addDay(); $i++; } $data['days'] = $days; $data["date_start"] = $calendar_range['start']; $data["date_end"] = $calendar_range['end']; if ($request->session()->has('single_filtered_dentist')) { $dentist = User::findOrFail($request->session()->get('single_filtered_dentist')); } else { $dentist = $dentists->first(); } $current_day = $calendar_range['start']->copy(); $end_date = $calendar_range['end']->copy(); $restrictions = CalendarRestriction::where('appointment_type_id', '!=', 0)->get(); $data["restrictions"] = $restrictions; $appointments = array(); while ($current_day->day != $end_date->day) { $next_day = $current_day->copy()->addDay(); $appointment_list = DB::table('appointments')->select('id')->where('dentist_id', $dentist->id)->where('start_date', '>', $current_day->format('Y-m-d H:i:s'))->where('end_date', '<', $next_day->format('Y-m-d H:i:s'))->get(); foreach ($appointment_list as $appointment_id) { $appointment = Appointment::findOrFail($appointment_id->id); $appointments[$current_day->format('d')][] = $appointment; } $current_day = $current_day->addDay(); $data["dentist"] = $dentist; } if ($request->session()->has('prefilled_start_time')) { $data['trigger_appointment_box_on_load'] = true; $data['prefilled_start_time'] = $request->session()->get('prefilled_start_time'); $request->session()->forget('prefilled_start_time'); } if ($request->session()->has('prefilled_end_time')) { $data['prefilled_end_time'] = $request->session()->get('prefilled_end_time'); $request->session()->forget('prefilled_end_time'); } if ($request->session()->has('prefilled_date')) { $data['prefilled_date'] = $request->session()->get('prefilled_date'); $request->session()->forget('prefilled_date'); } } elseif ($calendar_view == 'month') { $calendar_range['start'] = Carbon::createFromFormat('Y-m-d H:i:s', $request->session()->get('selected_calendar_day'))->startOfMonth(); $calendar_range['end'] = $calendar_range['start']->copy()->endOfMonth(); $data["date_start"] = $calendar_range['start']; $data["date_end"] = $calendar_range['end']; if ($request->session()->has('single_filtered_dentist')) { $dentist = User::findOrFail($request->session()->get('single_filtered_dentist')); } else { $dentist = $dentists->first(); } $current_day = $calendar_range['start']->copy(); $end_date = $calendar_range['end']->copy(); $appointments = array(); while ($current_day->day != $end_date->day) { $next_day = $current_day->copy()->addDay(); $appointment_list = DB::table('appointments')->select('id')->where('dentist_id', $dentist->id)->where('start_date', '>', $current_day->format('Y-m-d H:i:s'))->where('end_date', '<', $next_day->format('Y-m-d H:i:s'))->get(); foreach ($appointment_list as $appointment_id) { $appointment = Appointment::findOrFail($appointment_id->id); $appointments[$current_day->format('d')][] = $appointment; } $current_day = $current_day->addDay(); $data["dentist"] = $dentist; $data["first_day_of_month"] = $calendar_range['start']->format('l'); } } $data["find_slot_trigger"] = $find_slot_trigger; $data["slots"] = $slots; $data["dentists"] = $dentists; $data["calendar_view"] = $calendar_view; $data["appointments"] = $appointments; $data['today'] = Carbon::now(); return view('backend.page.dashboard')->with($data); }