File "LeaveMasterController.php"

Full Path: /home/trinadezambia/public_html/admin_panel/app/Http/Controllers/LeaveMasterController.php
File size: 7.16 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Controllers;

use App\Repositories\LeaveMaster\LeaveMasterInterface;
use App\Repositories\SessionYear\SessionYearInterface;
use App\Services\BootstrapTableService;
use App\Services\CachingService;
use App\Services\ResponseService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;

class LeaveMasterController extends Controller
{

    private LeaveMasterInterface $leaveMaster;
    private SessionYearInterface $sessionYear;
    private CachingService $cache;

    public function __construct(LeaveMasterInterface $leaveMaster, SessionYearInterface $sessionYear, CachingService $cache)
    {
        $this->leaveMaster = $leaveMaster;
        $this->sessionYear = $sessionYear;
        $this->cache = $cache;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        ResponseService::noPermissionThenRedirect('school-setting-manage');
        $sessionYear = $this->sessionYear->builder()->pluck('name', 'id');
        return view('leave.leave_master', compact('sessionYear'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
        ResponseService::noPermissionThenRedirect('school-setting-manage');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
        ResponseService::noPermissionThenRedirect('school-setting-manage');
        $request->validate([
            'leaves' => 'required|numeric',
            'holiday_days' => 'required',
        ]);

        try {
            DB::beginTransaction();
            $sessionYearId = $this->cache->getSessionYear()->id;
            $existingData = $this->leaveMaster->builder()->where('session_year_id', $sessionYearId)->first();
            if ($existingData) {
                ResponseService::errorResponse('Data for the current session year already exists.');
            }
            $day = implode(',', $request->holiday_days);
            $data = [
                'leaves' => $request->leaves,
                'holiday' => $day,
                'session_year_id' => $sessionYearId,
            ];

            $this->leaveMaster->create($data);
            DB::commit();

            $this->cache->removeSchoolCache(config('constants.CACHE.SCHOOL.LEAVE_MASTER'));
            ResponseService::successResponse('Data Stored Successfully');
        } catch (\Throwable $e) {
            ResponseService::logErrorResponse($e, "LeaveMaster Controller -> Store Method");
            ResponseService::errorResponse();
        }
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id, Request $request)
    {
        //
        ResponseService::noPermissionThenRedirect('school-setting-manage');
        $offset = request('offset', 0);
        $limit = request('limit', 10);
        $sort = request('sort', 'id');
        $order = request('order', 'DESC');
        $search = request('search');
        $sessionYearId = $this->cache->getSessionYear()->id;

        $sql = $this->leaveMaster->builder()->with('session_year')
            ->where('session_year_id', $sessionYearId)
            ->where(function ($q) use ($search) {
                $q->when($search, function ($query) use ($search) {
                    $query->where('leaves', 'LIKE', "%$search%")
                        ->orWhere('holiday', 'LIKE', "%$search%");
                });
            });


        $total = $sql->count();
        if ($offset >= $total && $total > 0) {
            $lastPage = floor(($total - 1) / $limit) * $limit; // calculate last page offset
            $offset = $lastPage;
        }
        $sql->orderBy($sort, $order)->skip($offset)->take($limit);
        $res = $sql->get();

        $bulkData = array();
        $bulkData['total'] = $total;
        $rows = array();
        $no = 1;
        foreach ($res as $row) {
            $operate = BootstrapTableService::editButton(route('leave-master.update', $row->id));
            $operate .= BootstrapTableService::deleteButton(route('leave-master.destroy', $row->id));
            $tempRow = $row->toArray();
            $tempRow['no'] = $no++;
            $tempRow['operate'] = $operate;
            $rows[] = $tempRow;
        }
        $bulkData['rows'] = $rows;
        return response()->json($bulkData);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
        ResponseService::noPermissionThenRedirect('school-setting-manage');
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
        ResponseService::noPermissionThenRedirect('school-setting-manage');
        $request->validate([
            'leaves' => 'required|numeric',
            'holiday_days' => 'required',
        ]);

        try {
            DB::beginTransaction();
            $sessionYearId = $this->cache->getSessionYear()->id;
            $existingData = $this->leaveMaster->builder()->where('session_year_id', $sessionYearId)->where('id', '!=', $id)->first();
            if ($existingData) {
                ResponseService::errorResponse('Data for the current session year already exists.');
            }
            $day = implode(',', $request->holiday_days);
            $data = [
                'leaves' => $request->leaves,
                'holiday' => $day,
                'session_year_id' => $sessionYearId,
            ];

            $this->leaveMaster->update($id, $data);
            DB::commit();
            $this->cache->removeSchoolCache(config('constants.CACHE.SCHOOL.LEAVE_MASTER'));
            ResponseService::successResponse('Data Updated Successfully');
        } catch (\Throwable $e) {
            ResponseService::logErrorResponse($e, "LeaveMaster Controller -> Store Method");
            ResponseService::errorResponse();
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
        ResponseService::noPermissionThenRedirect('school-setting-manage');
        try {
            $leaveMaster = $this->leaveMaster->findById($id);
            if (count($leaveMaster->leave)) {
                ResponseService::errorResponse('cannot_delete_because_data_is_associated_with_other_data');
            } else {
                $this->leaveMaster->deleteById($id);
            }
            ResponseService::successResponse('Data Deleted Successfully');
        } catch (Throwable $e) {
            ResponseService::logErrorResponse($e, "LeaveMaster Controller -> Delete Method");
            ResponseService::errorResponse();
        }
    }
}