%PDF- %PDF-
Direktori : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/ |
Current File : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/MinorController.php |
<?php namespace App\Http\Controllers\Api\v1; use App\Http\Controllers\Controller; use App\Http\Resources\CalendarCollection; use App\Http\Resources\ClassroomMinorsCollection; use App\Http\Resources\MinorClassroomCollection; use App\Http\Resources\MinorCollectionResource; use App\Http\Resources\MinorResource; use App\Http\Resources\PresentMinorsCollection; use App\Http\Resources\QRLogsCollection; use App\Http\Resources\RollCall; use App\Http\Resources\RollCallCollection; use App\Models\Classroom; use App\Models\Event; use App\Models\Minor; use App\Traits\ApiUser; use App\Traits\CalendarTrait; use App\Traits\EventEmitterTrait; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\DB; use Symfony\Component\HttpKernel\Exception\HttpException; class MinorController extends Controller { use ApiUser, EventEmitterTrait, CalendarTrait; /** * @param Request $request * @param Minor $minor * @return \Illuminate\Http\JsonResponse */ public function show(Request $request, Minor $minor) { $user = $this->getLoggedUser(); if ($user->role() === "tutor") $user->isTutor($minor); if ($user->role() === "teacher") $user->isTeacher($minor); $classroom = null; $requestClassroomId = $request->classroom_id ? : $request->header('classroom_id'); if ($requestClassroomId) { $classroom = Classroom::find($requestClassroomId); } return response()->json((new MinorResource($minor))->setClassroom($classroom), Response::HTTP_OK); } /** * @param Request $request * @param Minor $minor * @return \Illuminate\Http\JsonResponse */ public function update(Request $request, Minor $minor) { $user = $this->getLoggedUser(); $user->isTutor($minor); $fields = $request->all(); if(array_key_exists("birth_date", $fields)){ $date = Carbon::parse($fields["birth_date"]); $fields["birth_date"] = $date; } $classroom = null; $requestClassroomId = $request->classroom_id ? : $request->header('classroom_id'); if ($requestClassroomId) { $classroom = Classroom::find($requestClassroomId); } else { $classroom = $minor->getExpectedClassroom(); } $arrival_time_updated = (array_key_exists('arrival_time', $fields) && $fields["arrival_time"] != date('H:i', strtotime($minor->classrooms()->where('classroom_id', $classroom->id)->first()->pivot->arrival_time))); $minor->fill($fields); if(!$minor->save()){ throw new HttpException(Response::HTTP_NOT_MODIFIED, __('update_failed')); } if($arrival_time_updated){ $minor->classrooms()->updateExistingPivot($classroom->id, [ 'arrival_time' => $fields["arrival_time"] ]); $this->registerEvent('arrival_time_updated', $minor, $classroom); } $minor->refresh(); $classroom = null; $requestClassroomId = $request->classroom_id ? : $request->header('classroom_id'); if ($requestClassroomId) { $classroom = Classroom::find($requestClassroomId); } return response()->json((new MinorResource($minor))->setClassroom($classroom), Response::HTTP_OK); } /** * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function indexByIndividual(Request $request) { $user = $this->getLoggedUser(); if (!$user->active) { $user->update(['active' => true]); } $individual = $user->individual; $minors = Minor::where('active', 1)->whereHas('individuals', function($query) use ($individual){ $query->where('individual_id', $individual->id); })->orderBy('surname')->get(); $classroom = null; $requestClassroomId = $request->classroom_id ? : $request->header('classroom_id'); if ($requestClassroomId) { $classroom = Classroom::find($requestClassroomId); } return response()->json((new MinorCollectionResource($minors, MinorResource::class))->setClassroom($classroom), Response::HTTP_OK); } /** * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function indexByTeacher(Request $request) { $user = $this->getLoggedUser(); $institutes = $user->institutes; if(!$institutes){ throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __("institute not associated")); } $institute_ids = $institutes->map(function ($item, $key){ return $item->id; }); $minors = Minor::whereHas('classrooms', function($query) use ($institute_ids){ $query->where('active', 1)->whereIn('institute_id', $institute_ids); })->orderBy('surname')->get(); $classroom = null; $requestClassroomId = $request->classroom_id ? : $request->header('classroom_id'); if ($requestClassroomId) { $classroom = Classroom::find($requestClassroomId); } return response()->json((new MinorCollectionResource($minors, MinorResource::class))->setClassroom($classroom), Response::HTTP_OK); } public function indexByClassroom(Request $request, Classroom $classroom) { $user = $this->getLoggedUser(); $institutes = $user->institutes; if(!$institutes){ throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __("institute_not_associated")); } $minors = Minor::whereHas('classrooms', function($query) use ($classroom) { $query->where('active', 1)->where('classroom_id', $classroom->id); })->orderBy('surname', 'asc')->get(); return new ClassroomMinorsCollection($minors, $classroom); } /** * @param Request $request * @param Classroom $classroom * @return RollCallCollection */ public function indexRollCallByClassroom(Request $request, Classroom $classroom) { $user = $this->getLoggedUser(); $institutes = $user->institutes; if(!$institutes){ throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __("institute_not_associated")); } $count = $classroom->countMinorsByStatus(); $today = date("Y-m-d"); $today_as_int = (int)date("Ymd"); $minors = Minor::whereHas('classrooms', function($query) use ($classroom) { $query->where('active', 1)->where('classroom_id', $classroom->id); })->whereDoesntHave('absences', function($query) use ($classroom, $today) { $query->whereDate('date', $today); })->whereDoesntHave('events', function($query) use ($classroom, $today_as_int) { $query->where('date_as_int', $today_as_int) ->whereHas('eventType', function ($query){ $query->whereIn('event_type', ['presence_confirmed', 'qr_minor_left', 'minor_left_class']); }); })->orderBy('surname', 'asc')->get(); return (new RollCallCollection($minors, $classroom))->additional(["count" => $count]); } /** * @param Request $request * @param Classroom $classroom * @return PresentMinorsCollection */ public function indexPresentByClassroom(Request $request, Classroom $classroom) { $user = $this->getLoggedUser(); $institutes = $user->institutes; if(!$institutes){ throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __("institute_not_associated")); } $count = $classroom->countMinorsByStatus(); $today = date("Y-m-d"); $minors = Minor::whereHas('classrooms', function($query) use ($classroom) { $query->where('active', 1)->where('classroom_id', $classroom->id); })->orderBy('surname', 'asc')->get(); $minorPresents = $minors->reject(function ($m) use ($classroom) { return $m->status($classroom)['description'] !== 'minor_in_class'; }); return (new PresentMinorsCollection($minorPresents, $classroom))->additional(['count' => $count]); } /** * returns a list of all qr logs for the given date * @param Request $request * @param Minor $minor * @param $year * @param $month * @param $day * @return QRLogsCollection * @throws HttpException */ public function qrDailyLog(Request $request, Minor $minor, $year, $month, $day) { if(!checkdate( $month, $day, $year )) { throw new HttpException(Response::HTTP_BAD_REQUEST, __("date_is_note_valid")); } $date = date("$year$month$day"); $user = $this->getLoggedUser(); $user->isTutor($minor); $logs = Event::where('minor_id', $minor->id) ->where('date_as_int', $date) ->whereHas('eventType', function ($query){ $query->where('event_type', "qr_minor_arrived") ->orWhere('event_type', "qr_minor_left"); })->orderBy('date', 'asc')->get(); if (!$logs->count()){ return response()->json(['data' => __('no_logs_to_show')], Response::HTTP_NO_CONTENT); } return new QRLogsCollection($logs); } /** * @param Request $request * @param Minor $minor * @param $month * @param $year * @return \Illuminate\Http\JsonResponse */ public function monthCalendar(Request $request, Minor $minor, $month, $year) { $user = $this->getLoggedUser(); $start_of_month = Carbon::create($year, $month, 1, 0,0,0); $end_of_month = Carbon::create($year, $month, 1, 0,0,0)->endOfMonth(); $classroom = null; $requestClassroomId = $request->classroom_id ? : $request->header('classroom_id'); if ($requestClassroomId) { $classroom = Classroom::find($requestClassroomId); } $festivities = $this->getFestivities($start_of_month, $end_of_month, $minor, $classroom); $expected_absences = $this->getExpectedAbsences($start_of_month, $end_of_month, $minor, $classroom); $arrival_exceptions = $this->getArrivalExceptions($start_of_month, $end_of_month, $minor, $classroom); $events = $this->getEvents($start_of_month, $end_of_month, $minor, $classroom); $calendar = collect(); $day = $start_of_month->copy(); while($day <= $end_of_month) { $data["festivity"] = $festivities[$day->day]; $data["expected_absence"] = $expected_absences[$day->day]; $data["arrival_exception"] = $arrival_exceptions[$day->day]; $data["events"] = $events[$day->day]; $calendar->put($day->day, $data); $day = $day->addDay(1); } return response()->json(['data' => $calendar], Response::HTTP_OK); } /** * @param Request $request * @param $minor * @param Classroom $classroom * @return MinorClassroomCollection */ public function showMinorClassroom(Request $request, Minor $minor, Classroom $classroom) { $user = $this->getLoggedUser(); $user->isTutor($minor); $minors = Minor::whereHas('classrooms', function($query) use ($classroom) { $query->where('active', 1)->where('classroom_id', $classroom->id); })->orderBy('surname', 'asc')->get(); return new MinorClassroomCollection($minors); } }