%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/AbsenceController.php |
<?php namespace App\Http\Controllers\Api\v1; use App\Http\Controllers\Controller; use App\Http\Resources\AbsenceCollection; use App\Http\Resources\ArrivalExceptionCollection; use App\Models\Absence; use App\Models\ArrivalException; use App\Models\Classroom; use App\Models\Event; use App\Models\EventType; use App\Models\Minor; use App\Models\Notice; use App\Traits\ApiUser; 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 AbsenceController extends Controller { use ApiUser; use EventEmitterTrait; /** * lists all absences by minor/class * @param Request $request * @param Minor $minor * @param Classroom $classroom * @return AbsenceCollection */ public function index(Request $request, Minor $minor, Classroom $classroom) { $user = $this->getLoggedUser(); $user->isTutor($minor); $absences = Absence::where('minor_id', $minor->id) ->where('classroom_id', $classroom->id)->whereDate('date', '>=', Carbon::now()->format('Y-m-d'))->orderBy('date', 'asc')->selectRaw("id,classroom_id,date(date) as parsedDate, date")->with('classroom:id,class_name,institute_id','classroom.institute:id,code,name')->get(); return new AbsenceCollection($absences); } /** * Stores an absence * @param Request $request * @param Minor $minor * @param Classroom $classroom * @return \Illuminate\Contracts\Routing\ResponseFactory|Response */ public function store(Request $request, Minor $minor, Classroom $classroom) { $user = $this->getLoggedUser(); $user->isTutor($minor); $date = $request->input('date', false); $reason = $request->input('reason', 'n/a'); if(!$date){ throw new HttpException(Response::HTTP_BAD_REQUEST, __('required_fields_are_missing')); } //check if absence already exists. If yes, delete, otherwise create new one $check_date = Carbon::parse($date)->format("Y-m-d"); $check_date_as_int = (int)Carbon::parse($date)->format("Ymd"); $existing_absence = Absence::where('minor_id', $minor->id) ->where('classroom_id', $classroom->id) ->whereDate('date', $check_date); if($existing_absence->count() > 0){ DB::transaction(function () use ($date, $minor, $classroom, $existing_absence, $check_date_as_int){ $existing_absence->first()->delete(); $absence_event = Event::where('classroom_id', $classroom->id) ->where('minor_id', $minor->id) ->where('date_as_int', $check_date_as_int) ->whereHas('eventType', function ($query){ $query->where('event_type', 'expected_absence_signaled'); })->first(); $absence_event->delete(); }); return response()->json(["response" => "absence deleted"], Response::HTTP_NO_CONTENT); } else { $absence = new Absence([ "date" => Carbon::parse($date), "reason" => $reason ]); DB::transaction(function () use($absence, $user, $minor, $classroom) { $absence->user()->associate($user); $absence->minor()->associate($minor); $absence->classroom()->associate($classroom); $absence->saveOrFail(); $this->registerEvent("expected_absence_signaled", $minor, $classroom); }); return response(Response::HTTP_CREATED); } } /** * Stores an absence * * @param Request $request * @param Minor $minor * @param Classroom $classroom * * @return \Illuminate\Contracts\Routing\ResponseFactory|Response * @throws \Throwable */ public function schedule(Request $request, Minor $minor, Classroom $classroom) { $user = $this->getLoggedUser(); $user->isTutor($minor); $dateFrom = $request->input('dateFrom', false); $dateTo = $request->input('dateTo', false); $reason = $request->input('reason', 'n/a'); if(!$dateFrom || !$dateTo){ throw new HttpException(Response::HTTP_BAD_REQUEST, __('required_fields_are_missing')); } $minor->attendsClassroom($classroom, true); //check if absence already exists. If yes, delete, otherwise create new one $dateFrom = Carbon::parse($dateFrom)->startOfDay(); $dateTo = Carbon::parse($dateTo)->endOfDay(); for ($i=0; $i<$dateTo->diffInDays($dateFrom)+1; $i++) { $check_date = $dateFrom->copy()->addDay($i)->format("Y-m-d"); $existing_absence = Absence::where('minor_id', $minor->id) ->where('classroom_id', $classroom->id) ->whereDate('date', $check_date); if($existing_absence->count() === 0){ DB::beginTransaction(); try { $absence = new Absence( [ "date" => Carbon::parse($check_date), "reason" => $reason ] ); $absence->user()->associate($user); $absence->minor()->associate($minor); $absence->classroom()->associate($classroom); $absence->saveOrFail(); $this->registerEvent("expected_absence_signaled", $minor, $classroom, $check_date); DB::commit(); } catch (\Exception $exception) { DB::rollBack(); throw new HttpException(Response::HTTP_INTERNAL_SERVER_ERROR, $exception->getMessage()); } } } return response(Response::HTTP_CREATED); } /** * Updates an absence * @param Request $request * @param Absence $absence * @return \Illuminate\Contracts\Routing\ResponseFactory|Response * @internal param Minor $minor * @internal param Classroom $classroom */ public function update(Request $request, Absence $absence) { $user = $this->getLoggedUser(); $minor = $absence->minor; $user->isTutor($minor); if($request->input('date')){ throw new HttpException(Response::HTTP_NOT_MODIFIED, __('absence.date_not_updatable')); } $reason = $request->input('reason', false); if($reason) { $absence->reason = $reason; $absence->forceSave(); return response(Response::HTTP_OK); } return response(Response::HTTP_NOT_MODIFIED); } /** * Deletes an absence * * @param Request $request * @param Absence $absence * * @return \Illuminate\Contracts\Routing\ResponseFactory|Response * @throws \Exception */ public function destroy(Request $request, Absence $absence) { $user = $this->getLoggedUser(); $minor = $absence->minor; $user->isTutor($minor); $date = (int)$absence->date->format('Ymd'); $absence_event = Event::where('classroom_id', $absence->classroom->id) ->where('minor_id', $absence->minor->id) ->where('date_as_int', $date) ->whereHas('eventType', function ($query){ $query->where('event_type', 'expected_absence_signaled'); })->first(); $absence_event->delete(); $absence->delete(); return response(Response::HTTP_NO_CONTENT); } /** * Reset all minor's absences of an intitute * @param Request $request * @return \Illuminate\Contracts\Routing\ResponseFactory|Response */ public function resetAbsences(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); })->get(); $today = date("Y-m-d"); foreach ($minors as $minor) { $absences = Absence::where('minor_id', $minor->id)->where('date', $today)->delete(); $notices = Notice::where('minor_id', $minor->id)->where('start_date', $today)->delete(); } foreach ($institute_ids as $value) { Event::where('institute_id', $value)->whereDate('created_at', Carbon::today())->delete(); } return response(Response::HTTP_NO_CONTENT); } }