Last active
June 3, 2024 01:41
-
-
Save phojie/45955608b61e35430778ed5955dddced to your computer and use it in GitHub Desktop.
jondbrook
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\Http\Controllers\Admin; | |
| use App\Http\Controllers\Controller; | |
| use App\Http\Requests\CollegeRequest; | |
| use App\Models\College; | |
| use App\Models\TemporaryImage; | |
| use App\Traits\Cloudinary\CloudinaryFolderManager; | |
| use App\Traits\FileUploader; | |
| use App\Traits\QueryTableRequest; | |
| use CloudinaryLabs\CloudinaryLaravel\Facades\Cloudinary; | |
| use Illuminate\Http\Request; | |
| class CollegeController extends Controller | |
| { | |
| use QueryTableRequest; | |
| use FileUploader; | |
| use CloudinaryFolderManager; | |
| /** | |
| * Display a listing of the resource. | |
| * | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function index(Request $request) | |
| { | |
| \Gate::authorize('view-college'); | |
| $colleges = College::where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('abrv', 'ilike', "%{$request->search}%") | |
| ->orWhere('description', 'ilike', "%{$request->search}%") | |
| ->with('departments') | |
| ->with('dean') | |
| ->with('associate_dean') | |
| ->orderBy('created_at', 'ASC') | |
| ->paginate($this->rowRequest($request)); | |
| return $colleges; | |
| } | |
| /** | |
| * Show the form for creating a new resource. | |
| * | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function store(CollegeRequest $request) | |
| { | |
| \Gate::authorize('create-college'); | |
| $collegeProfile = College::create([ | |
| 'name' => $request->name, | |
| 'description' => $request->description, | |
| 'abrv' => $request->abrv, | |
| 'dean_id' => $request->dean, | |
| 'associate_dean_id' => $request->associate_dean, | |
| 'email' => $request->email | |
| ]); | |
| $this->CloudinaryCreateFolder("CKCM-NETWORK-FILES/CollegeImages/$collegeProfile->id"); | |
| if (!empty($request->picture)) { | |
| $urlId = "CKCM-NETWORK-FILES/CollegeImages/$collegeProfile->id/$collegeProfile->updated_at._logo"; | |
| $collegeProfile->logo = $urlId; | |
| Cloudinary::rename($request->picture, $urlId); | |
| $collegeProfile->save(); | |
| //delete in temporary image | |
| // TemporaryImage::where('publicId', $request->picture)->delete(); | |
| } | |
| return $collegeProfile; | |
| } | |
| /** | |
| * Display the specified resource. | |
| * | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function show($id) | |
| { | |
| // | |
| } | |
| /** | |
| * Update the specified resource in storage. | |
| * | |
| * @param \Illuminate\Http\Request $request | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function update(CollegeRequest $request, $id) | |
| { | |
| \Gate::authorize('update-college'); | |
| $collegeProfile = College::findOrFail($id); | |
| $collegeProfile->update([ | |
| 'name' => $request->name, | |
| 'description' => $request->description, | |
| 'abrv' => $request->abrv, | |
| 'updated_by' => auth()->id(), | |
| 'dean_id' => $request->dean, | |
| 'associate_dean_id' => $request->associate_dean, | |
| 'email' => $request->email | |
| ]); | |
| // trigger if not default image and not null value | |
| if ($request->picture !== '/CKCM-NETWORK-FILES/icon' && !empty($request->picture)) { | |
| $now = now(); | |
| $urlId = "CKCM-NETWORK-FILES/CollegeImages/$collegeProfile->id/$now._logo"; | |
| $collegeProfile->logo = $urlId; | |
| // if image is change | |
| if ($collegeProfile->isDirty('logo')) { | |
| Cloudinary::destroy($collegeProfile->getOriginal('logo')); | |
| if (!empty($request->picture)) { | |
| Cloudinary::rename($request->picture, $urlId); | |
| } | |
| } | |
| $collegeProfile->save(); | |
| } | |
| return 'Ohw wanna get in? contact me :)'; | |
| } | |
| /** | |
| * Remove the specified resource from storage. | |
| * | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function destroy($id) | |
| { | |
| \Gate::authorize('delete-college'); | |
| $collegeProfile = College::findOrFail($id); | |
| $urlId = "CKCM-NETWORK-FILES/CollegeImages/$id"; | |
| //delete file existing | |
| Cloudinary::destroy($collegeProfile->logo); | |
| //delete folder | |
| $this->CloudinaryDeleteFolder($urlId); | |
| $collegeProfile->delete(); | |
| return 'Successfully Deleted'; | |
| } | |
| /** | |
| * checkName | |
| * | |
| * @param mixed $request | |
| * @return void | |
| */ | |
| public function checkName(Request $request) | |
| { | |
| abort_if(!\Gate::any(['create-college', 'update-college']), 403); | |
| $request->validate([ | |
| 'name' => 'unique:colleges', | |
| ]); | |
| } | |
| /** | |
| * checkAbrv | |
| * | |
| * @param mixed $request | |
| * @return void | |
| */ | |
| public function checkAbrv(Request $request) | |
| { | |
| abort_if(!\Gate::any(['create-college', 'update-college']), 403); | |
| $request->validate([ | |
| 'abrv' => 'unique:colleges', | |
| ]); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\Http\Controllers\Admin; | |
| use App\Http\Controllers\Controller; | |
| use App\Http\Requests\DepartmentRequest; | |
| use App\Models\Department; | |
| use App\Models\Program; | |
| use App\Traits\QueryTableRequest; | |
| use Illuminate\Http\Request; | |
| class DepartmentController extends Controller | |
| { | |
| use QueryTableRequest; | |
| /** | |
| * Display a listing of the resource. | |
| * | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function index(Request $request) | |
| { | |
| \Gate::authorize('view-department'); | |
| $departments = Department::where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('description', 'ilike', "%{$request->search}%") | |
| ->whereHas('college') | |
| ->whereHas('chairperson') | |
| ->whereHas('programs') | |
| ->with('college') | |
| ->with('chairperson') | |
| ->with('programs') | |
| ->paginate($this->rowRequest($request)); | |
| return $departments; | |
| } | |
| /** | |
| * Store a newly created resource in storage. | |
| * | |
| * @param \Illuminate\Http\Request $request | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function store(DepartmentRequest $request) | |
| { | |
| \Gate::authorize('create-department'); | |
| $programList = collect($request->programsNew)->map(function ($value) { | |
| return $value['id']; | |
| }); | |
| \DB::transaction( | |
| function () use ($request, $programList) { | |
| $departmentData = Department::create([ | |
| 'name' => $request->name, | |
| 'contact_number' => $request->contact_number, | |
| 'college_id' => $request->college, | |
| 'description' => $request->description, | |
| 'chairperson_id' => $request->chairperson, | |
| ]); | |
| // update every program's department_id | |
| foreach ($programList as $value) { | |
| $program = Program::find($value); | |
| $program->department()->associate($departmentData); | |
| $program->save(); | |
| } | |
| return $departmentData; | |
| } | |
| ); | |
| } | |
| /** | |
| * Display the specified resource. | |
| * | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function show($id) | |
| { | |
| // | |
| } | |
| /** | |
| * Update the specified resource in storage. | |
| * | |
| * @param \Illuminate\Http\Request $request | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function update(DepartmentRequest $request, $id) | |
| { | |
| \Gate::authorize('update-department'); | |
| // old collection | |
| $programListOld = collect($request->programsOld)->map(function ($value) { | |
| return $value['id']; | |
| }); | |
| // new Collection | |
| $programListNew = collect($request->programsNew)->map(function ($value) { | |
| return $value['id']; | |
| }); | |
| \DB::transaction( | |
| function () use ($request, $id, $programListNew, $programListOld) { | |
| Department::findOrFail($id) | |
| ->update([ | |
| 'name' => $request->name, | |
| 'contact_number' => $request->contact_number, | |
| 'college_id' => $request->college, | |
| 'description' => $request->description, | |
| 'chairperson_id' => $request->chairperson, | |
| 'updated_by' => auth()->id() | |
| ]); | |
| // delete every program's department_id | |
| foreach ($programListOld as $value) { | |
| $program = Program::find($value); | |
| $program->department()->dissociate(); | |
| $program->save(); | |
| } | |
| // add every program's department_id | |
| foreach ($programListNew as $value) { | |
| $program = Program::find($value); | |
| $program->department()->associate($id); | |
| $program->save(); | |
| } | |
| return 'Ohw wanna get in? contact me :)'; | |
| } | |
| ); | |
| } | |
| /** | |
| * Remove the specified resource from storage. | |
| * | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function destroy($id) | |
| { | |
| \Gate::authorize('delete-department'); | |
| Department::destroy($id); | |
| return 'Successfully Deleted'; | |
| } | |
| /** | |
| * checkName | |
| * | |
| * @param mixed $request | |
| * @return void | |
| */ | |
| public function checkName(Request $request) | |
| { | |
| abort_if(!\Gate::any(['create-department', 'update-department']), 403); | |
| $request->validate([ | |
| 'name' => 'unique:departments', | |
| ]); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\Http\Controllers\Admin; | |
| use App\Http\Controllers\Controller; | |
| use App\Http\Requests\EnrollmentScheduleRequest; | |
| use App\Jobs\GSuite\GClassroom\DeleteRoomJob; | |
| use App\Models\AcademicDay; | |
| use App\Models\EnrollmentSchedule; | |
| use App\Models\Resource; | |
| use App\Models\User; | |
| use App\Services\Curricula\CurriculaMiscService; | |
| use App\Services\EnrollmentSchedules\EnrollmentSchedulesMiscService; | |
| use App\Services\GoogleAdmin\ManageRoomsService; | |
| use App\Traits\Enrollment\EnrollmentActiveStatus; | |
| use App\Traits\QueryTableRequest; | |
| use Illuminate\Http\Request; | |
| use Illuminate\Support\Facades\DB; | |
| use Illuminate\Support\Facades\Gate; | |
| use OpenAI\Laravel\Facades\OpenAI; | |
| class EnrollmentScheduleController extends Controller | |
| { | |
| use QueryTableRequest; | |
| use EnrollmentActiveStatus; | |
| public $availableDays = [ | |
| ['Monday', 'Thursday'], | |
| ['Tuesday', 'Friday'], | |
| ]; | |
| public $lastAvailableDays = [ | |
| ['Wednesday', 'Saturday'], | |
| ]; | |
| public $timeslots = [ | |
| '08:00:00', | |
| '09:00:00', | |
| '10:00:00', | |
| '11:00:00', | |
| '12:00:00', | |
| '13:00:00', | |
| '14:00:00', | |
| '15:00:00', | |
| '16:00:00', | |
| '17:00:00', | |
| '18:00:00', | |
| '19:00:00', | |
| ]; | |
| public $hourDuration = 2; | |
| public $straitHourDuration = 3; | |
| public $teacherId = null; | |
| public function __construct(Request $request) | |
| { | |
| // $this->availableDays = $request->available_days ? collect($request->available_days)->pluck('name')->toArray() : $this->availableDays; | |
| $this->teacherId = $request->teacher_id ?? null; | |
| $this->hourDuration = $request->hour_duration ?? 1.5; | |
| $this->straitHourDuration = $this->hourDuration * 2; | |
| if($this->hourDuration == 1.5) { | |
| $this->timeslots = [ | |
| '07:31 - 09:00', | |
| '09:01 - 10:30', | |
| '10:31 - 12:00', | |
| '13:01 - 14:30', | |
| '14:31 - 16:00', | |
| '16:01 - 17:30', | |
| '17:31 - 19:00', | |
| ]; | |
| } elseif($this->hourDuration == 1) { | |
| $this->timeslots = [ | |
| '07:31 - 08:30', | |
| '08:31 - 09:30', | |
| '09:31 - 10:30', | |
| '10:31 - 11:30', | |
| '11:31 - 12:30', | |
| '13:01 - 14:00', | |
| '14:01 - 15:00', | |
| '15:01 - 16:00', | |
| '16:01 - 17:00', | |
| '17:01 - 18:00', | |
| '18:01 - 19:00', | |
| ]; | |
| } elseif($this->hourDuration == 2) { | |
| $this->timeslots = [ | |
| '07:31 - 09:30', | |
| '09:31 - 11:30', | |
| '13:01 - 15:00', | |
| '15:01 - 17:00', | |
| '17:01 - 19:00', | |
| ]; | |
| } elseif ($this->hourDuration == 3) { | |
| $this->timeslots = [ | |
| '07:31 - 10:30', | |
| '13:01 - 16:00', | |
| '16:01 - 19:00', | |
| ]; | |
| } elseif ($this->hourDuration == 4) { | |
| $this->timeslots = [ | |
| '07:31 - 11:30', | |
| '13:01 - 17:00', | |
| ]; | |
| } elseif ($this->hourDuration == 5) { | |
| $this->timeslots = [ | |
| '07:31 - 12:30', | |
| '13:01 - 18:00', | |
| ]; | |
| } elseif ($this->hourDuration == 6) { | |
| $this->timeslots = [ | |
| '07:31 - 13:30', | |
| '13:01 - 19:00', | |
| ]; | |
| } | |
| } | |
| /** | |
| * Display a listing of the resource. | |
| * | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function index(Request $request) | |
| { | |
| \Gate::authorize('view-enrollment-schedule'); | |
| // ->orWhereIn('created_by.id', [auth()->id()]) | |
| $enrollment_schedule = EnrollmentSchedule::with('academic_days') | |
| ->with(['curricula' => function ($query) { | |
| // ->select(['id', 'program_id', 'course_id']) | |
| $query->select(['id', 'program_id', 'course_id']); | |
| // $query->get()->groupBy(['course.pre_requisites_number']); | |
| }]) // ✔️ | |
| ->with(['teacher' => function ($query) { | |
| $query->select(['id', 'email']); | |
| }]) // ✔️ | |
| ->with('enrollment_batch_schedule') // ✔️ | |
| ->with('resource') | |
| ->with('created_by') | |
| ->with('updated_by') | |
| ->whereIn('enrollment_status_id', [$this->active_enrollment()->id]) | |
| ->latest(); | |
| if (! empty($request->search)) { | |
| $enrollment_schedule->where( | |
| function ($query) use ($request) { | |
| $query->where('class_code', 'ilike', "%{$request->search}%"); | |
| $query->orWhere('time_end', 'ilike', "%{$request->search}%"); | |
| $query->orWhere('time_start', 'ilike', "%{$request->search}%"); | |
| $query->orWhere('id', 'ilike', "%{$request->search}%"); | |
| // resource | |
| $query->orWhereHas('resource', function ($query) use ($request) { | |
| $query->where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('description', 'ilike', "%{$request->search}%"); | |
| }); | |
| //teacher | |
| $query->orWhereHas('teacher', function ($query) use ($request) { | |
| $query->where(function ($query) use ($request) { | |
| $query->where('username', 'ilike', "%{$request->search}%") | |
| ->orWhere('email', 'ilike', "%{$request->search}%") | |
| ->orWhere('s_email', 'ilike', "%{$request->search}%") | |
| ->orWhere('g_id', 'ilike', "%{$request->search}%") | |
| ->orWhere('status', 'ilike', "%{$request->search}%") | |
| ->orWhere('id', 'ilike', "%{$request->search}%"); | |
| $query->orWhereHas('user_profile', function ($query) use ($request) { | |
| $query->where('fullname', 'ilike', "%{$request->search}%") | |
| ->orWhere('firstname', 'ilike', "%{$request->search}%") | |
| ->orWhere('lastname', 'ilike', "%{$request->search}%") | |
| ->orWhere('middlename', 'ilike', "%{$request->search}%"); | |
| }); | |
| }); | |
| }); | |
| //curricula | |
| $query->orWhereHas('curricula', function ($query) use ($request) { | |
| $query->whereHas('course', function ($query_cullumns) use ($request) { | |
| $query_cullumns->where('course_number', 'ilike', "%{$request->search}%") | |
| ->orWhere('descriptive_title', 'ilike', "%{$request->search}%"); | |
| }); | |
| $query->orWhereHas('academic_year', function ($query_cullumns) use ($request) { | |
| $query_cullumns->where('date_start', 'ilike', "%{$request->search}%"); | |
| }); | |
| $query->orWhereHas('academic_term', function ($query_cullumns) use ($request) { | |
| $query_cullumns->where('name', 'ilike', "%{$request->search}%"); | |
| }); | |
| $query->orWhereHas('academic_level', function ($query_cullumns) use ($request) { | |
| $query_cullumns->where('level_number', 'ilike', "%{$request->search}%"); | |
| }); | |
| $query->orWhereHas('program', function ($query_cullumns) use ($request) { | |
| $query_cullumns->where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('major', 'ilike', "%{$request->search}%") | |
| ->orWhere('abrv', 'ilike', "%{$request->search}%") | |
| ->orWhere('description', 'ilike', "%{$request->search}%"); | |
| }); | |
| $query->orWhereHas('created_by', function ($query) use ($request) { | |
| $query->where('username', 'ilike', "%{$request->search}%") | |
| ->orWhere('email', 'ilike', "%{$request->search}%"); | |
| }); | |
| $query->orWhereHas('course_type', function ($query) use ($request) { | |
| $query->where('title', 'ilike', "%{$request->search}%") | |
| ->orWhere('subtitle', 'ilike', "%{$request->search}%"); | |
| }); | |
| }); | |
| //enrollment_batch_schedule | |
| $query->orWhereHas('enrollment_batch_schedule', function ($query) use ($request) { | |
| $query->where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('date_start', 'ilike', "%{$request->search}%") | |
| ->orWhere('date_end', 'ilike', "%{$request->search}%"); | |
| }); | |
| //academic_days | |
| $query->orWhereHas('academic_days', function ($query) use ($request) { | |
| $query->where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('abrv', 'ilike', "%{$request->search}%"); | |
| }); | |
| // created by | |
| $query->orWhereHas('created_by', function ($query) use ($request) { | |
| $query->where('username', 'ilike', "%{$request->search}%") | |
| ->orWhere('email', 'ilike', "%{$request->search}%"); | |
| }); | |
| // created by | |
| $query->orWhereHas('updated_by', function ($query) use ($request) { | |
| $query->where('username', 'ilike', "%{$request->search}%") | |
| ->orWhere('email', 'ilike', "%{$request->search}%"); | |
| }); | |
| } | |
| ); | |
| } | |
| return $enrollment_schedule->paginate($this->rowRequest($request)); | |
| } | |
| /** | |
| * Store a newly created resource in storage. | |
| * | |
| * @param \Illuminate\Http\Request $request | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function store(EnrollmentScheduleRequest $request) | |
| { | |
| \Gate::authorize('create-enrollment-schedule'); | |
| // validate if room is not occupied between the time start and time end, and academic day | |
| $room = EnrollmentSchedule::query() | |
| ->with(['curricula','academic_days']) | |
| ->where('enrollment_status_id', $this->active_enrollment()->id) | |
| ->when($request->resource, function ($query) use ($request) { | |
| return $query->where('resource_id', $request->resource); | |
| }) | |
| ->where('time_start', '<=', $request->time_end) | |
| ->where('time_end', '>=', $request->time_start) | |
| ->whereHas('academic_days', function ($query) use ($request) { | |
| $query->whereIn('academic_days.id', collect($request->academic_day)->pluck('id')); | |
| }); | |
| if($room->count()) { | |
| $listOfAvailableResources = Resource::query() | |
| ->whereNotIn('id', $room->get()->pluck('resource_id')->toArray()) | |
| ->get() | |
| ->pluck('name') | |
| ->toArray(); | |
| // generate suggestion with available timeslots | |
| $this->teacherId = $request->teacher; | |
| $suggestionData = $this->generate_schedule_using_ai($request)->getData(); | |
| return response()->json([ | |
| 'message' => "The room is already occupied for the following time slots. Here is the recommended time slots:", | |
| 'suggestion' => $suggestionData, | |
| 'errors' => $listOfAvailableResources, | |
| ], 422); | |
| } | |
| // validate teacher if not conflict with her/his schedule time | |
| $teacher = EnrollmentSchedule::query() | |
| ->where('enrollment_status_id', $this->active_enrollment()->id) | |
| ->where('teacher_id', $request->teacher) | |
| ->where('time_start', '<=', $request->time_end) | |
| ->where('time_end', '>=', $request->time_start) | |
| ->whereHas('academic_days', function ($query) use ($request) { | |
| $query->whereIn('academic_days.id', collect($request->academic_day)->pluck('id')); | |
| }); | |
| if($teacher->count()) { | |
| $listOfAvailableTimeslots = EnrollmentSchedule::query() | |
| ->where('teacher_id', $request->teacher) | |
| ->where('enrollment_status_id', $this->active_enrollment()->id) | |
| ->get() | |
| ->pluck('time_start', 'time_end') | |
| ->map(function ($item, $key) { | |
| // convert to time format | |
| $item = date('h:i A', strtotime($item)); | |
| $key = date('h:i A', strtotime($key)); | |
| return "$item - $key"; | |
| }) | |
| ->toArray(); | |
| // generate suggestion with available timeslots | |
| $this->teacherId = $request->teacher; | |
| $suggestionData = $this->generate_schedule_using_ai($request)->getData(); | |
| return response()->json([ | |
| 'message' => "The teacher is already occupied for the following time slots. Here is the recommended time slots:", | |
| 'suggestion' => $suggestionData, | |
| 'errors' => $listOfAvailableTimeslots, | |
| ], 422); | |
| } | |
| $course_data = []; | |
| if ($request->enable_google_classroom) { | |
| // teacher profile | |
| $teacher = User::where('id', $request->teacher)->first(); | |
| abort_if(! $teacher->g_id, 422); | |
| $course_code = (new CurriculaMiscService())->get_curricula_course_number_implode($request->curriculum); | |
| $descriptive_title = (new CurriculaMiscService())->get_curricula_descriptive_title_implode($request->curriculum); | |
| $time_joint = (new EnrollmentSchedulesMiscService())->get_time_joint($request->time_start, $request->time_end); | |
| $enrollment_batch_schedule = (new EnrollmentSchedulesMiscService())->get_batch_schedule($request->enrollment_batch_schedule); | |
| $course_data = (new ManageRoomsService())->store_room([ | |
| 'description' => $descriptive_title, //descriptive title | |
| 'section' => "$enrollment_batch_schedule->name | | $time_joint", //descriptive title | |
| 'name' => $course_code, // course code | |
| 'ownerId' => $teacher->g_id, //teacher.g_id | |
| 'courseState' => 'ACTIVE', | |
| ]); | |
| } | |
| \DB::transaction( | |
| function () use ($request, $course_data) { | |
| $enrollment_schedule = EnrollmentSchedule::create( | |
| [ | |
| 'enrollment_batch_schedule_id' => $request->enrollment_batch_schedule, | |
| 'enrollment_status_id' => $this->active_enrollment()->id, | |
| 'time_start' => $request->time_start, | |
| 'time_end' => $request->time_end, | |
| 'teacher_id' => $request->teacher, | |
| 'slot' => $request->slot, | |
| 'isActive' => $request->isActive, | |
| 'g_room_id' => $course_data['id'] ?? null, | |
| 'g_room_link' => $course_data['alternateLink'] ?? null, | |
| 'class_code' => $course_data['enrollmentCode'] ?? null, | |
| 'resource_id' => $request->resource, | |
| 'teacher_folder_id' => $course_data['teacher_folder']['id'] ?? null, | |
| ] | |
| ); | |
| $academic_days = collect($request->academic_day)->pluck('id'); | |
| $curricula = collect($request->curriculum)->pluck('id'); | |
| $enrollment_schedule->academic_days()->attach($academic_days); | |
| $enrollment_schedule->curricula()->attach($curricula); | |
| return $enrollment_schedule; | |
| } | |
| ); | |
| } | |
| public function show($id) | |
| { | |
| Gate::authorize('view-enrollment-schedule'); | |
| return EnrollmentSchedule::with('academic_days') | |
| ->with(['curricula' => function ($query) { | |
| // ->select(['id', 'program_id', 'course_id']) | |
| $query->select(['id', 'program_id', 'course_id']); | |
| // $query->get()->groupBy(['course.pre_requisites_number']); | |
| }]) // ✔️ | |
| ->with(['teacher' => function ($query) { | |
| $query->select(['id', 'email']); | |
| }]) // ✔️ | |
| ->with('enrollment_batch_schedule') // ✔️ | |
| ->with('resource') | |
| ->with('created_by') | |
| ->with('updated_by') | |
| ->findOrFail($id); | |
| } | |
| public function update(EnrollmentScheduleRequest $request, $id) | |
| { | |
| Gate::authorize('update-enrollment-schedule'); | |
| // validate if room is not occupied between the time start and time end, and academic day | |
| $room = EnrollmentSchedule::query() | |
| ->where('enrollment_status_id', $this->active_enrollment()->id) | |
| ->where('id', '!=', $id) | |
| ->when($request->resource, function ($query) use ($request) { | |
| return $query->where('resource_id', $request->resource); | |
| }) | |
| ->with(['curricula','academic_days']) | |
| ->where('time_start', '<=', $request->time_end) | |
| ->where('time_end', '>=', $request->time_start) | |
| ->whereHas('academic_days', function ($query) use ($request) { | |
| $query->whereIn('academic_days.id', collect($request->academic_day)->pluck('id')); | |
| }); | |
| if($room->count()) { | |
| $listOfAvailableResources = Resource::query() | |
| ->whereNotIn('id', $room->get()->pluck('resource_id')->toArray()) | |
| ->get() | |
| ->pluck('name') | |
| ->toArray(); | |
| // generate suggestion with available timeslots | |
| $this->teacherId = $request->teacher; | |
| $suggestionData = $this->generate_schedule_using_ai($request)->getData(); | |
| return response()->json([ | |
| 'message' => "The room is already occupied for the following time slots. Here is the recommended time slots:", | |
| 'suggestion' => $suggestionData, | |
| 'errors' => $listOfAvailableResources, | |
| ], 422); | |
| } | |
| // validate teacher if not conflict with her/his schedule time | |
| $teacher = EnrollmentSchedule::query() | |
| ->where('enrollment_status_id', $this->active_enrollment()->id) | |
| ->where('teacher_id', $request->teacher) | |
| ->where('id', '!=', $id) | |
| ->where('time_start', '<=', $request->time_end) | |
| ->where('time_end', '>=', $request->time_start) | |
| ->whereHas('academic_days', function ($query) use ($request) { | |
| $query->whereIn('academic_days.id', collect($request->academic_day)->pluck('id')); | |
| }); | |
| if($teacher->count()) { | |
| $invalidTimeslots = EnrollmentSchedule::query() | |
| ->where('teacher_id', $request->teacher) | |
| ->where('enrollment_status_id', $this->active_enrollment()->id) | |
| ->get() | |
| ->pluck('time_start', 'time_end') | |
| ->map(function ($item, $key) { | |
| // convert to time format | |
| $item = date('h:i A', strtotime($item)); | |
| $key = date('h:i A', strtotime($key)); | |
| return "$item - $key"; | |
| }) | |
| ->toArray(); | |
| // generate suggestion with available timeslots | |
| $this->teacherId = $request->teacher; | |
| $suggestionData = $this->generate_schedule_using_ai($request)->getData(); | |
| return response()->json([ | |
| 'message' => "The teacher is already occupied for the following time slots. Here is the recommended time slots:", | |
| 'suggestion' => $suggestionData, | |
| 'errors' => $invalidTimeslots, | |
| ], 422); | |
| } | |
| $course_data = []; | |
| $course_code = (new CurriculaMiscService())->get_curricula_course_number_implode($request->curriculum); | |
| $descriptive_title = (new CurriculaMiscService())->get_curricula_descriptive_title_implode($request->curriculum); | |
| $time_joint = (new EnrollmentSchedulesMiscService())->get_time_joint($request->time_start, $request->time_end); | |
| $enrollment_batch_schedule = (new EnrollmentSchedulesMiscService())->get_batch_schedule($request->enrollment_batch_schedule); | |
| $enrollment_schedule = EnrollmentSchedule::findOrFail($id); | |
| // get room id | |
| $g_room_id = $enrollment_schedule->g_room_id; | |
| if ($g_room_id) { | |
| // teacher profile | |
| $teacher = User::where('id', $request->teacher)->first(); | |
| abort_if(empty($teacher->g_id), 422, 'Teacher has no Institutional Email'); | |
| // if !enable_google_classroom or not active | |
| if (! $request->enable_google_classroom || ! $request->isActive) { | |
| DeleteRoomJob::dispatch($g_room_id); | |
| } else { | |
| // if teacher is not changed | |
| if ($teacher->id === $enrollment_schedule->teacher_id) { | |
| $course_data = (new ManageRoomsService())->update_room($g_room_id, [ | |
| 'description' => $descriptive_title, //descriptive title | |
| 'section' => "$enrollment_batch_schedule->name | $time_joint", //descriptive title | |
| 'name' => $course_code, // course code | |
| 'courseState' => 'ACTIVE', | |
| ]); | |
| } | |
| // teacher is changed | |
| else { | |
| // delete the current classroom | |
| DeleteRoomJob::dispatch($g_room_id); | |
| // create new classroom | |
| $course_data = (new ManageRoomsService())->store_room([ | |
| 'description' => $descriptive_title, //descriptive title | |
| 'section' => "$enrollment_batch_schedule->name | | $time_joint", //descriptive title | |
| 'name' => $course_code, // course code | |
| 'ownerId' => $teacher->g_id, //teacher.g_id | |
| 'courseState' => 'ACTIVE', | |
| ]); | |
| // enroll all the students | |
| $list_of_students = collect($enrollment_schedule->tertiary_profiles) | |
| ->reject(function ($item, $key) { | |
| // only if students are active | |
| return $item->user->status == 'enrollee'; | |
| }) | |
| ->map(function ($item) { | |
| return ['userId' => $item->user->g_id]; | |
| }); | |
| $courseDataObject = (object) [ | |
| 'g_room_id' => $course_data['id'], | |
| 'course_code' => $course_data['enrollmentCode'], | |
| ]; | |
| (new ManageRoomsService())->bulk_enroll_students($courseDataObject, $list_of_students); | |
| } | |
| } | |
| } else { | |
| if ($request->enable_google_classroom) { | |
| // teacher profile | |
| $teacher = User::where('id', $request->teacher)->first(); | |
| abort_if(! $teacher->g_id, 422); | |
| $course_data = (new ManageRoomsService())->store_room([ | |
| 'description' => $descriptive_title, //descriptive title | |
| 'section' => "$enrollment_batch_schedule->name | $time_joint", //descriptive title | |
| 'name' => $course_code, // course code | |
| 'ownerId' => $teacher->g_id, //teacher.g_id | |
| 'courseState' => 'ACTIVE', | |
| ]); | |
| $list_of_students = collect($enrollment_schedule->tertiary_profiles) | |
| ->reject(function ($item, $key) { | |
| // only if students are active | |
| return $item->user->status == 'enrollee'; | |
| }) | |
| ->map(function ($item) { | |
| return ['userId' => $item->user->g_id]; | |
| }); | |
| $courseDataObject = (object) [ | |
| 'g_room_id' => $course_data['id'], | |
| 'course_code' => $course_data['enrollmentCode'], | |
| ]; | |
| (new ManageRoomsService())->bulk_enroll_students($courseDataObject, $list_of_students); | |
| } | |
| } | |
| \DB::transaction( | |
| function () use ($request, $id, $course_data) { | |
| EnrollmentSchedule::where('id', $id)->update( | |
| [ | |
| 'enrollment_batch_schedule_id' => $request->enrollment_batch_schedule, | |
| 'enrollment_status_id' => $this->active_enrollment()->id, | |
| 'time_start' => $request->time_start, | |
| 'time_end' => $request->time_end, | |
| 'teacher_id' => $request->teacher, | |
| 'slot' => $request->slot, | |
| 'isActive' => $request->isActive, | |
| 'g_room_id' => $course_data['id'] ?? null, | |
| 'g_room_link' => $course_data['alternateLink'] ?? null, | |
| 'class_code' => $course_data['enrollmentCode'] ?? null, | |
| 'teacher_folder_id' => $course_data['teacherFolder']['id'] ?? null, | |
| 'resource_id' => $request->resource, | |
| 'updated_by' => auth()->id(), | |
| ] | |
| ); | |
| $academic_days = collect($request->academic_day)->pluck('id'); | |
| $curricula = collect($request->curriculum)->pluck('id'); | |
| $enrollment_schedule = EnrollmentSchedule::find($id); | |
| $enrollment_schedule->academic_days()->sync($academic_days); | |
| $enrollment_schedule->curricula()->sync($curricula); | |
| return $enrollment_schedule; | |
| } | |
| ); | |
| } | |
| /** | |
| * Remove the specified resource from storage. | |
| * | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function destroy($id) | |
| { | |
| \Gate::authorize('delete-enrollment-schedule'); | |
| $result = EnrollmentSchedule::find($id); | |
| if ($result->g_room_id) { | |
| (new ManageRoomsService())->delete_room($result->g_room_id); | |
| } | |
| $result->delete(); | |
| return 'Successfully Deleted'; | |
| } | |
| /** | |
| * list_of_students. | |
| * | |
| * @param mixed $enrollmentSchedule | |
| * @return void | |
| */ | |
| public function list_of_students($id) | |
| { | |
| $enrollmentSchedule = EnrollmentSchedule::with('tertiary_profiles')->findOrFail($id); | |
| $list = collect($enrollmentSchedule->tertiary_profiles)->reject(function ($data) { | |
| return $data->user->deleted_at; | |
| }); | |
| return $list; | |
| } | |
| public function official_students_group_by_alphabet(Request $request, $id) | |
| { | |
| $enrollmentSchedule = EnrollmentSchedule::with( | |
| [ | |
| 'tertiary_profiles' => function ($query) use ($request) { | |
| $query->whereIn('status', ['active']); | |
| $query->where(function ($query) use ($request) { | |
| $query->whereHas('user_profile', function ($query) use ($request) { | |
| $query->where('fullname', 'ilike', "%{$request->search}%") | |
| ->orWhere('firstname', 'ilike', "%{$request->search}%") | |
| ->orWhere('lastname', 'ilike', "%{$request->search}%") | |
| ->orWhere('middlename', 'ilike', "%{$request->search}%"); | |
| }); | |
| $query->orWhereHas('user', function ($query) use ($request) { | |
| $query->where('username', 'ilike', "%{$request->search}%") | |
| ->orWhere('email', 'ilike', "%{$request->search}%") | |
| ->orWhere('s_email', 'ilike', "%{$request->search}%") | |
| ->orWhere('g_id', 'ilike', "%{$request->search}%") | |
| ->orWhere('status', 'ilike', "%{$request->search}%") | |
| ->orWhere('id', 'ilike', "%{$request->search}%"); | |
| }); | |
| }); | |
| }, | |
| ] | |
| ) | |
| ->withCount(['tertiary_profiles' => function ($query) { | |
| $query->whereIn('status', ['active']); | |
| }]) | |
| ->findOrFail($id); | |
| $list = collect($enrollmentSchedule->tertiary_profiles)->reject(function ($data) { | |
| return $data->user->deleted_at; | |
| })->sortBy('user_profile.lastname')->values(); | |
| $groups = $list->groupBy(function ($data) { | |
| return strtoupper(substr($data->user_profile->lastname, 0, 1)); | |
| }); | |
| // Gate if teacher id is equal to auth id | |
| // if ($enrollmentSchedule->teacher_id == auth()->id()) { | |
| return response()->json([ | |
| 'students' => $groups->sortKeys()->all(), | |
| 'total' => $enrollmentSchedule->tertiary_profiles_count, | |
| ], 200); | |
| // } else { | |
| // abort(403); | |
| // } | |
| } | |
| public function generate_schedule_using_ai(Request $request) | |
| { | |
| // inputs collect($request->available_days)->pluck('name')->toArray() ?? | |
| $existingSchedules = DB::table('enrollment_schedules') | |
| ->where('enrollment_status_id', $this->active_enrollment()->id) | |
| ->join('academic_day_enrollment_schedule', 'enrollment_schedules.id', '=', 'academic_day_enrollment_schedule.enrollment_schedule_id') | |
| ->join('academic_days', 'academic_day_enrollment_schedule.academic_day_id', '=', 'academic_days.id') | |
| ->select('enrollment_schedules.id', 'time_start', 'time_end', 'resource_id', 'teacher_id', 'academic_days.name') | |
| ->selectRaw('academic_days.name as day') | |
| ->get() | |
| ->groupBy('day') | |
| ->map(function ($item) { | |
| return $item->map(function ($item) { | |
| return [ | |
| 'time_start' => $item->time_start, | |
| 'time_end' => $item->time_end, | |
| 'resource_id' => $item->resource_id, | |
| ]; | |
| }); | |
| }); | |
| $listOfResourcesId = DB::table('resources') | |
| ->select('id') | |
| ->when($request->resource_id, function ($query) use ($request) { | |
| return $query->where('id', $request->resource_id); | |
| }) | |
| ->get(); | |
| $availableRooms = $listOfResourcesId->pluck('id')->toArray(); | |
| // Construct prompt | |
| $prompt = "Act as a class program scheduler in a university. You have the following existing schedules:\n"; | |
| foreach ($existingSchedules as $day => $schedules) { | |
| foreach ($schedules as $schedule) { | |
| $roomInfo = isset($schedule['resource_id']) ? " (Resource {$schedule['resource_id']})" : ""; | |
| $teacherInfo = isset($schedule['teacher_id']) ? " with Teacher ID {$schedule['teacher_id']}" : ""; | |
| $prompt .= "- $day: {$schedule['time_start']} - {$schedule['time_end']} $roomInfo $teacherInfo\n"; | |
| } | |
| } | |
| if ($existingSchedules->isEmpty()) { | |
| $prompt .= "- No existing schedules\n"; | |
| } | |
| $prompt .= "\nGenerate a new schedule without conflicts. The schedule should adhere to the following constraints:\n"; | |
| $prompt .= "- Time slots choices: " . implode(", ", $this->timeslots) . "\n"; | |
| $prompt .= "- Resources choices: " . implode(", ", $availableRooms) . "\n"; | |
| $prompt .= "- Available Days choices:\n"; | |
| foreach ($this->availableDays as $days) { | |
| $prompt .= " - " . implode(", ", $days) . "\n"; | |
| } | |
| $prompt .= "- Last option Days choices (choice here if no days available): \n"; | |
| foreach ($this->lastAvailableDays as $days) { | |
| $prompt .= " - " . implode(", ", $days) . "\n"; | |
| } | |
| if ($this->teacherId) { | |
| $prompt .= "- Assigned Teacher ID: $this->teacherId\n"; | |
| } | |
| $prompt .= "- Hour duration: $this->hourDuration\n"; | |
| $prompt .= "\nGenerate a schedule that meets these criteria:\n"; | |
| $prompt .= "- Day: [Select day from available days]\n"; | |
| $prompt .= "- Time start: [Select start time from available time slots, and should not before 07:30, and should not after 19:00]\n"; | |
| $prompt .= "- Time end: [Select end time from available time slots, and should not after 19:00, and should not before 07:30]\n"; | |
| $prompt .= "- Resource ID: [Select resource ID from available resource]\n"; | |
| $prompt .= "- The schedule should include either two classes per week, each lasting for $this->hourDuration hours, or one class per week lasting for $this->straitHourDuration hours.\n"; | |
| $prompt .= "- Do not return a schedule that conflicts with existing schedules\n"; | |
| $prompt .= "- If a schedule is not possible, return an recommendation to do, and the reason why it is not possible\n"; | |
| $prompt .= "- Don't return a text format\n"; | |
| $prompt .= "- Please output the information in structured JSON format without using markdown code blocks and prefix message\n"; | |
| $prompt .= "\nThe resulting success JSON object, should return always in this format:\n"; | |
| $prompt .= "{ | |
| \"days\": ['Monday', 'Thursday'], | |
| \"time_start\": \"09:01\", | |
| \"time_end\": \"10:30\", | |
| \"resource_id\": 101 | |
| \"message\": \"Schedule generated successfully.\" | |
| }"; | |
| $prompt .= "\n\n"; | |
| $prompt .= "The resulting error JSON object, should return always in this format:\n"; | |
| $prompt .= "{ | |
| \"days\": [], | |
| \"time_start\":, | |
| \"time_end\": , | |
| \"resource_id\": | |
| \"message\": | |
| \"error\": \"There is no available schedule due to conflicts. All resources are occupied, please add more resources.\" | |
| }"; | |
| try { | |
| $result = OpenAI::chat()->create([ | |
| 'model' => config('openai.model'), | |
| 'messages' => [ | |
| [ | |
| 'role' => 'user', | |
| 'content' => $prompt | |
| ] | |
| ] | |
| ]); | |
| } catch (\Exception $e) { | |
| $result = OpenAI::chat()->create([ | |
| 'model' => 'gpt-4-turbo', | |
| 'messages' => [ | |
| [ | |
| 'role' => 'user', | |
| 'content' => $prompt | |
| ] | |
| ] | |
| ]); | |
| } | |
| // if no schedule is generated | |
| // regenerate the schedule | |
| if (empty($result->choices[0]->message->content)) { | |
| $result = OpenAI::chat()->create([ | |
| 'model' => 'gpt-4-turbo', | |
| 'messages' => [ | |
| [ | |
| 'role' => 'user', | |
| 'content' => $prompt | |
| ] | |
| ] | |
| ]); | |
| } | |
| $decoded = json_decode($result->choices[0]->message->content); | |
| if(! $decoded || ! $decoded->days || ! $decoded->time_start || ! $decoded->time_end || ! $decoded->resource_id) { | |
| return response()->json([ | |
| 'error' => 'Failed to generate schedule. Please try again.', | |
| 'result' => $result->choices[0]->message->content, | |
| 'prompt' => $prompt, | |
| ]); | |
| } | |
| $resource = Resource::query()->where('id', $decoded->resource_id)->first(); | |
| $academicDays = collect($decoded->days)->map(function ($day) { | |
| return AcademicDay::where('name', $day)->first(); | |
| }); | |
| return response()->json([ | |
| 'schedule' => [ | |
| 'days' => $academicDays, | |
| 'time_start' => $decoded->time_start, | |
| 'time_end' => $decoded->time_end, | |
| 'resource' => $resource, | |
| 'message' => $decoded->message, | |
| 'error' => $decoded->error ?? null, | |
| 'days_implode' => $academicDays->implode('name', ', '), // implode days | |
| 'time_from_to' => date('h:i A', strtotime($decoded->time_start)) . ' - ' . date('h:i A', strtotime($decoded->time_end)), // convert time to time format | |
| ], | |
| 'result' => $result->choices[0]->message->content, | |
| 'prompt' => $prompt, | |
| // 'resources' => $listOfResourcesId, | |
| // 'schedules' => $existingSchedules, | |
| ]); | |
| } | |
| public function validate_ai_schedule($request) | |
| { | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\Http\Controllers\Admin; | |
| use App\Http\Controllers\Controller; | |
| use App\Http\Requests\ProgramRequest; | |
| use App\Http\Resources\ProgramResource; | |
| use App\Models\Program; | |
| use App\Traits\GlobalModel\GlobalProgramModel; | |
| use App\Traits\QueryTableRequest; | |
| use Illuminate\Http\Request; | |
| class ProgramController extends Controller | |
| { | |
| use QueryTableRequest; | |
| use GlobalProgramModel; | |
| /** | |
| * Display a listing of the resource. | |
| * | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function index(Request $request) | |
| { | |
| \Gate::authorize('view-program'); | |
| $programs = Program::whereNotIn('department_id', ['4c8b7a33-0907-4b94-8418-c673afde601c']) | |
| ->withTrashed() | |
| ->latest(); | |
| if (!empty($request->search)) { | |
| $programs->where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('description', 'ilike', "%{$request->search}%") | |
| ->orWhere('abrv', 'ilike', "%{$request->search}%") | |
| ->orWhere('major', 'ilike', "%{$request->search}%"); | |
| } | |
| return $programs->paginate($this->rowRequest($request)); | |
| } | |
| /** | |
| * Store a newly created resource in storage. | |
| * | |
| * @param \Illuminate\Http\Request $request | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function store(ProgramRequest $request) | |
| { | |
| \Gate::authorize('create-program'); | |
| $programData = Program::create([ | |
| 'name' => $request->name, | |
| 'abrv' => $request->abrv, | |
| 'major' => $request->major, | |
| 'description' => $request->description, | |
| ]); | |
| return $programData; | |
| } | |
| /** | |
| * Display the specified resource. | |
| * | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function show(Program $program) | |
| { | |
| // return $program; | |
| return new ProgramResource($program); | |
| } | |
| /** | |
| * Update the specified resource in storage. | |
| * | |
| * @param \Illuminate\Http\Request $request | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function update(ProgramRequest $request, $id) | |
| { | |
| \Gate::authorize('update-program'); | |
| Program::findOrFail($id) | |
| ->update([ | |
| 'name' => $request->name, | |
| 'description' => $request->description, | |
| 'major' => $request->major, | |
| 'abrv' => $request->abrv, | |
| 'updated_by' => auth()->id() | |
| ]); | |
| return 'Ohw wanna get in? contact me :)'; | |
| } | |
| /** | |
| * Remove the specified resource from storage. | |
| * | |
| * @param int $id | |
| * @return \Illuminate\Http\Response | |
| */ | |
| public function destroy($id) | |
| { | |
| \Gate::authorize('delete-program'); | |
| Program::findOrFail($id)->delete(); | |
| return 'Successfully Deleted'; | |
| } | |
| /** | |
| * checkName | |
| * | |
| * @param mixed $request | |
| * @return void | |
| */ | |
| public function checkName(Request $request) | |
| { | |
| abort_if(!\Gate::any(['create-program', 'update-program']), 403); | |
| $request->validate([ | |
| 'name' => 'unique:programs', | |
| ]); | |
| return $request; | |
| } | |
| /** | |
| * checkAbrv | |
| * | |
| * @param mixed $request | |
| * @return void | |
| */ | |
| public function checkAbrv(Request $request) | |
| { | |
| abort_if(!\Gate::any(['create-program', 'update-program']), 403); | |
| \Gate::any(['create-program', 'update-program']); | |
| $request->validate([ | |
| 'abrv' => 'unique:programs', | |
| ]); | |
| } | |
| /** | |
| * restoreUser | |
| * | |
| * @param mixed $request | |
| * @return void | |
| */ | |
| public function restoreProgram(Request $request) | |
| { | |
| \Gate::authorize('delete-program'); | |
| $user = Program::withTrashed()->findOrFail($request->id); | |
| if ($user->trashed()) { | |
| $user->restore(); | |
| } | |
| return 'Successfully restored'; | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\Http\Controllers\Admin; | |
| use App\Enums\ResourceCategory; | |
| use App\Http\Controllers\Controller; | |
| use App\Models\Resource; | |
| use App\Traits\QueryTableRequest; | |
| use Illuminate\Http\Request; | |
| use Spatie\QueryBuilder\QueryBuilder; | |
| class ResourceController extends Controller | |
| { | |
| use QueryTableRequest; | |
| public function index(Request $request) | |
| { | |
| \Gate::authorize('view-resource'); | |
| $query = Resource::query(); | |
| $resources = QueryBuilder::for($query) | |
| ->defaultSort('-created_at') | |
| ->allowedSorts('name', 'building', 'floor', 'capacity') | |
| ->allowedIncludes(['floor', 'building']); | |
| if ($request->sort) { | |
| $resources | |
| ->join('buildings', 'buildings.id', '=', 'resources.building_id') | |
| ->join('floors', 'floors.id', '=', 'resources.floor_id') | |
| ->select( | |
| 'resources.*', | |
| 'buildings.name as building', | |
| 'floors.name as floor' | |
| ); | |
| } | |
| if (!empty($request->search)) { | |
| // search should be here | |
| $resources->where('name', 'ilike', "%{$request->search}%") | |
| ->orWhere('description', 'ilike', "%{$request->search}%") | |
| ->orWhereHas('floor', function ($query) use ($request) { | |
| $query->where('name', 'ilike', "%{$request->search}%"); | |
| }) | |
| ->orWhereHas('building', function ($query) use ($request) { | |
| $query->where('name', 'ilike', "%{$request->search}%"); | |
| }); | |
| } | |
| return $resources->paginate($this->rowRequest($request)); | |
| } | |
| public function store(Request $request) | |
| { | |
| \Gate::authorize('create-resource'); | |
| $this->validate($request, Resource::Validation_Rules); | |
| Resource::create([ | |
| 'name' => $request->name, | |
| 'description' => $request->description, | |
| 'type' => $request->type, | |
| 'floor_section' => $request->floor_section, | |
| 'category' => 0, | |
| // 'category' => ResourceCategory::getKeys($request->category), | |
| 'building_id' => $request->building_id, | |
| 'floor_id' => $request->floor_id, | |
| 'capacity' => $request->capacity, | |
| 'description' => $request->description | |
| ]); | |
| return response()->json(['message' => 'Resource created successfully'], 201); | |
| } | |
| public function show($id) | |
| { | |
| // | |
| } | |
| public function update(Request $request, $id) | |
| { | |
| \Gate::authorize('update-resource'); | |
| $this->validate($request, Resource::Validation_Rules); | |
| $resource = Resource::findOrFail($id); | |
| $resource->update([ | |
| 'name' => $request->name, | |
| 'description' => $request->description, | |
| 'type' => $request->type, | |
| 'floor_section' => $request->floor_section, | |
| 'category' => 0, | |
| // 'category' => ResourceCategory::getKeys($request->category), | |
| 'building_id' => $request->building_id, | |
| 'floor_id' => $request->floor_id, | |
| 'capacity' => $request->capacity, | |
| 'description' => $request->description | |
| ]); | |
| return response()->json(['message' => 'Resource updated successfully'], 200); | |
| } | |
| public function destroy($id) | |
| { | |
| \Gate::authorize('delete-resource'); | |
| Resource::destroy($id); | |
| return response()->json(['success' => true, 'message' => 'Building deleted successfully']); | |
| } | |
| public function multiple_destroy(Request $request) | |
| { | |
| \Gate::authorize('delete-resource'); | |
| $destroyed = \DB::transaction(function () use ($request) { | |
| $id_list = collect($request)->pluck('id'); | |
| return Resource::destroy($id_list); | |
| }); | |
| return $destroyed; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment