Skip to content

Instantly share code, notes, and snippets.

@phojie
Last active June 3, 2024 01:41
Show Gist options
  • Save phojie/45955608b61e35430778ed5955dddced to your computer and use it in GitHub Desktop.
Save phojie/45955608b61e35430778ed5955dddced to your computer and use it in GitHub Desktop.
jondbrook
<?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',
]);
}
}
<?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',
]);
}
}
<?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)
{
}
}
<?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';
}
}
<?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