%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/
Upload File :
Create Path :
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);
    }
}

Zerion Mini Shell 1.0