<?php namespace App\Http\Controllers; use App\Repositories\PayrollSetting\PayrollSettingInterface; use App\Services\BootstrapTableService; use App\Services\ResponseService; use App\Services\CachingService; use Auth; use DB; use Illuminate\Http\Request; use Throwable; class PayrollSettingController extends Controller { // private PayrollSettingInterface $payrollSetting; private CachingService $cache; public function __construct(PayrollSettingInterface $payrollSetting, CachingService $cache) { $this->payrollSetting = $payrollSetting; $this->cache = $cache; } /** * Display a listing of the resource. */ public function index() { ResponseService::noFeatureThenRedirect('Expense Management'); ResponseService::noPermissionThenRedirect('payroll-settings-list'); return view('payroll.payroll-settings'); } /** * Show the form for creating a new resource. */ public function create() { // } /** * Store a newly created resource in storage. */ public function store(Request $request) { ResponseService::noFeatureThenSendJson('Expense Management'); ResponseService::noPermissionThenSendJson('payroll-settings-create'); $request->validate([ 'name' => 'required', 'amount' => 'nullable|required_without_all:percentage', 'percentage' => 'nullable|required_without_all:amount' ]); try { DB::beginTransaction(); $existingData = $this->payrollSetting->builder() ->where('name', $request->name) ->where('type', $request->type) ->first(); if ($existingData) { ResponseService::errorResponse('This name and type already exists'); } $sessionYear = $this->cache->getSessionYear(); $data = [ 'user_id' => Auth::user()->id, 'name' => $request->name, 'amount' => $request->amount ?? null, 'percentage' => !isset($request->amount) ? $request->percentage : null, 'type' => $request->type, 'session_year_id' => $sessionYear->id, 'school_id' => Auth::user()->school_id ]; $payrollSetting = $this->payrollSetting->create($data); DB::commit(); ResponseService::successResponse('Data Stored Successfully'); } catch (Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Allowance Controller -> Store Method"); ResponseService::errorResponse(); } } /** * Display the specified resource. */ public function show(Request $request) { ResponseService::noFeatureThenRedirect('Expense Management'); ResponseService::noPermissionThenRedirect('payroll-settings-list'); $offset = request('offset', 0); $limit = request('limit', 10); $sort = request('sort', 'id'); $order = request('order', 'DESC'); $search = $_GET['search']; $showDeleted = $request->show_deleted; $sql = $this->payrollSetting->builder() ->where('type', $request->type) ->where(function ($query) use ($search) { $query->when($search, function ($q) use ($search) { $q->where('id', 'LIKE', "%$search%")->orwhere('name', 'LIKE', "%$search%")->Owner(); }); })->when(!empty($showDeleted), function ($q) { $q->onlyTrashed()->Owner(); }); $sessionYear = $this->cache->getSessionYear(); $sql->where(function ($q) use ($sessionYear) { $q->where('session_year_id', $sessionYear->id)->orWhere('name', 'Transportation Deduction'); }); $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 = $offset + 1; foreach ($res as $row) { //Show Edit and Soft Delete Buttons if ($showDeleted) { $operate = BootstrapTableService::restoreButton(route('payroll-setting.restore', $row->id)); $operate .= BootstrapTableService::trashButton(route('payroll-setting.trash', $row->id)); } else { if ($row->name != 'Transportation Deduction') { $operate = BootstrapTableService::editButton(route('payroll-setting.update', $row->id)); $operate .= BootstrapTableService::deleteButton(route('payroll-setting.destroy', $row->id)); } else { $operate = ''; } } $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. */ public function edit(string $id) { // } /** * Update the specified resource in storage. */ public function update(Request $request, string $id) { ResponseService::noFeatureThenSendJson('Expense Management'); ResponseService::noPermissionThenSendJson('payroll-settings-edit'); $request->validate([ 'name' => 'required', 'amount' => 'nullable|required_without_all:percentage', 'percentage' => 'nullable|required_without_all:amount' ]); try { DB::beginTransaction(); $payrollSetting = $this->payrollSetting->findById($id); if ($payrollSetting->name == 'Transportation Deduction') { ResponseService::errorResponse('You cannot update this record'); } $data = [ 'user_id' => Auth::user()->id, 'name' => $request->name, 'amount' => $request->amount ?? null, 'percentage' => $request->percentage ?? null, 'type' => $request->type ]; $this->payrollSetting->update($id, $data); DB::commit(); ResponseService::successResponse('Data Updated Successfully'); } catch (Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Allowance Controller -> Update Method"); ResponseService::errorResponse(); } } /** * Remove the specified resource from storage. */ public function destroy(string $id) { ResponseService::noFeatureThenRedirect('Expense Management'); ResponseService::noPermissionThenSendJson('payroll-settings-delete'); try { $payrollSetting = $this->payrollSetting->findById($id); if ($payrollSetting->name == 'Transportation Deduction') { ResponseService::errorResponse('You cannot delete this record'); } $this->payrollSetting->deleteById($id); ResponseService::successResponse('Data Deleted Successfully'); } catch (Throwable $e) { ResponseService::logErrorResponse($e); ResponseService::errorResponse(); } } public function restore(int $id) { ResponseService::noFeatureThenRedirect('Expense Management'); ResponseService::noPermissionThenSendJson('payroll-settings-delete'); try { $this->payrollSetting->findOnlyTrashedById($id)->restore(); ResponseService::successResponse("Data Restored Successfully"); } catch (Throwable $e) { ResponseService::logErrorResponse($e); ResponseService::errorResponse(); } } public function trash($id) { ResponseService::noFeatureThenRedirect('Expense Management'); ResponseService::noPermissionThenSendJson('payroll-settings-delete'); try { $payrollSetting = $this->payrollSetting->findById($id); if ($payrollSetting->name == 'Transportation Deduction') { ResponseService::errorResponse('You cannot delete this record'); } $this->payrollSetting->findOnlyTrashedById($id)->forceDelete(); ResponseService::successResponse("Data Deleted Permanently"); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Online Exam Controller -> Trash Method", 'cannot_delete_because_data_is_associated_with_other_data'); ResponseService::errorResponse(); } } }