%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/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);

    }
}

Zerion Mini Shell 1.0