File "ExpenseController.php"
Full Path: /home/trinadezambia/public_html/admin_panel/app/Http/Controllers/ExpenseController.php
File size: 11.14 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace App\Http\Controllers;
use App\Repositories\Expense\ExpenseInterface;
use App\Repositories\ExpenseCategory\ExpenseCategoryInterface;
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 Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
use Throwable;
use Carbon\Carbon;
class ExpenseController extends Controller
{
private ExpenseInterface $expense;
private ExpenseCategoryInterface $expenseCategory;
private SessionYearInterface $sessionYear;
private CachingService $cache;
public function __construct(ExpenseInterface $expense, ExpenseCategoryInterface $expenseCategory, SessionYearInterface $sessionYear, CachingService $cache)
{
$this->expense = $expense;
$this->expenseCategory = $expenseCategory;
$this->sessionYear = $sessionYear;
$this->cache = $cache;
}
public function index()
{
ResponseService::noFeatureThenRedirect('Expense Management');
ResponseService::noAnyPermissionThenRedirect(['expense-create', 'expense-list']);
$expenseCategory = $this->expenseCategory->builder()->pluck('name', 'id')->toArray();
$sessionYearFullData = $this->cache->getSessionYear();
$months = sessionYearWiseMonthYear();
return view('expense.index', compact('expenseCategory', 'months', 'sessionYearFullData'));
}
public function create()
{
ResponseService::noFeatureThenRedirect('Expense Management');
ResponseService::noPermissionThenRedirect('expense-create');
}
public function store(Request $request)
{
ResponseService::noFeatureThenSendJson('Expense Management');
ResponseService::noPermissionThenSendJson('expense-create');
$sessionYearId = $this->cache->getSessionYear()->id;
$request->validate([
'ref_no' => [
'nullable',
Rule::unique('expenses', 'ref_no')
->where(function ($query) use ($sessionYearId) {
return $query->where('session_year_id', $sessionYearId)->whereNull('vehicle_id')->whereNull('staff_id');
})
],
'amount' => 'required|numeric|min:0'
], [
'ref_no.unique' => 'Reference number already exists for the selected session year.'
]);
try {
DB::beginTransaction();
$schoolSettings = $this->cache->getSchoolSettings();
$data = [
'category_id' => $request->category_id,
'title' => $request->title,
'ref_no' => $request->ref_no,
'amount' => $request->amount,
'date' => $request->date
? Carbon::createFromFormat($schoolSettings['date_format'], $request->date)->format('Y-m-d')
: null,
'description' => $request->description,
'session_year_id' => $sessionYearId,
];
$expense = $this->expense->create($data);
DB::commit();
ResponseService::successResponse('Data Stored Successfully');
} catch (Throwable $e) {
DB::rollBack();
ResponseService::logErrorResponse($e, "Expense Controller -> Store Method");
ResponseService::errorResponse();
}
}
public function show($id)
{
ResponseService::noFeatureThenRedirect('Expense Management');
ResponseService::noPermissionThenRedirect('expense-list');
$offset = request('offset', 0);
$limit = request('limit', 10);
$sort = request('sort', 'date');
$order = request('order', 'DESC');
$search = request('search');
$category_id = request('category_id');
$session_year_id = $this->cache->getSessionYear()->id;
$month = request('month');
// $sql = $this->expense->builder()->with('category')->select('*', DB::raw('SUM(amount) as total_salary'))->groupBy('month', 'date')->where(function ($query) use ($search) {
// $query->when($search, function ($query) use ($search) {
// $query->where(function ($query) use ($search) {
// $query->where('title', 'LIKE', "%$search%")->orWhere('ref_no', 'LIKE', "%$search%")->orWhere('amount', 'LIKE', "%$search%")->orWhere('date', 'LIKE', "%$search%")->orWhere('description', 'LIKE', "%$search%")->orWhereHas('category', function ($q) use ($search) {
// $q->Where('name', 'LIKE', "%$search%");
// });
// });
// });
// });
$sql = $this->expense->builder()->with('category')->whereNull('vehicle_id')->where(function ($query) use ($search) {
$query->when($search, function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where('title', 'LIKE', "%$search%")->orWhere('ref_no', 'LIKE', "%$search%")->orWhere('amount', 'LIKE', "%$search%")->orWhere('date', 'LIKE', "%$search%")->orWhere('description', 'LIKE', "%$search%")->orWhereHas('category', function ($q) use ($search) {
$q->Where('name', 'LIKE', "%$search%");
});
});
});
});
if ($category_id) {
if ($category_id != 'salary') {
$sql->where('category_id', $category_id)->whereNull('staff_id');
} else {
$sql->whereNotNull('staff_id');
}
}
if ($session_year_id) {
$sql->where('session_year_id', $session_year_id);
}
if ($month) {
$month_year = explode('_', $month);
$sql->whereMonth('date', $month_year[0])->whereYear('date', $month_year[1]);
}
$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) {
$operate = '';
if (!$row->month) {
$operate .= BootstrapTableService::editButton(route('expense.update', $row->id));
$operate .= BootstrapTableService::deleteButton(route('expense.destroy', $row->id));
}
$tempRow = $row->toArray();
$tempRow['no'] = $no++;
$tempRow['amount'] = $row->amount;
if ($row->staff_id) {
$tempRow['category.name'] = 'Salary';
}
$tempRow['operate'] = $operate;
$rows[] = $tempRow;
}
$bulkData['rows'] = $rows;
return response()->json($bulkData);
}
public function update(Request $request, $id)
{
ResponseService::noFeatureThenRedirect('Expense Management');
ResponseService::noPermissionThenSendJson('expense-edit');
$sessionYearId = $this->cache->getSessionYear()->id;
$request->validate([
'ref_no' => [
'nullable',
Rule::unique('expenses', 'ref_no')
->ignore($id) // Ignore current expense ID
->where(function ($query) use ($sessionYearId) {
return $query->where('session_year_id', $sessionYearId)
->whereNull('vehicle_id')
->whereNull('staff_id');
}),
],
'amount' => 'required|numeric|min:0'
], [
'ref_no.unique' => 'Reference number already exists for the selected session year.'
]);
try {
DB::beginTransaction();
$schoolSettings = $this->cache->getSchoolSettings();
$data = [
'category_id' => $request->category_id,
'title' => $request->title,
'ref_no' => $request->ref_no,
'amount' => $request->amount,
'date' => $request->date
? Carbon::createFromFormat($schoolSettings['date_format'], $request->date)->format('Y-m-d')
: null,
'description' => $request->description,
'session_year_id' => $sessionYearId,
];
$this->expense->update($id, $data);
DB::commit();
ResponseService::successResponse('Data Updated Successfully');
} catch (Throwable $e) {
DB::rollBack();
ResponseService::logErrorResponse($e, "Expense Controller -> Update Method");
ResponseService::errorResponse();
}
}
public function destroy($id)
{
ResponseService::noFeatureThenRedirect('Expense Management');
ResponseService::noPermissionThenSendJson('expense-delete');
try {
DB::beginTransaction();
$this->expense->deleteById($id);
DB::commit();
ResponseService::successResponse('Data Deleted Successfully');
} catch (Throwable $e) {
DB::rollBack();
ResponseService::logErrorResponse($e, "Expense Controller -> Destroy Method");
ResponseService::errorResponse();
}
}
public function filter_graph($session_year_id)
{
ResponseService::noFeatureThenRedirect('Expense Management');
ResponseService::noAnyPermissionThenSendJson(['expense-create', 'expense-list']);
try {
$expense_months = [];
$expense_amount = [];
if ($session_year_id == 'undefined' || $session_year_id == '') {
$session_year_id = $this->cache->getSessionYear()->id;
}
$expense = $this->expense->builder()->select(DB::raw("CONCAT(MONTH(date), '_', YEAR(date)) as month_year"), DB::raw('SUM(amount) as total_amount'))->where('session_year_id', $session_year_id)
->groupBy(DB::raw("CONCAT(MONTH(date), '_', YEAR(date))"));
$expense = $expense->get()->pluck('total_amount', 'month_year')->toArray();
$sessionYear = $this->sessionYear->builder()->findOrFail($session_year_id);
$months = sessionYearWiseMonthYear($sessionYear);
foreach ($months as $key => $month) {
if (isset($expense[$key])) {
// $expense_months[] = substr($months[$key], 0, 3);
$expense_months[] = $months[$key];
$expense_amount[] = $expense[$key];
}
}
$data = [
'expense_months' => $expense_months,
'expense_amount' => $expense_amount
];
ResponseService::successResponse('Data Fetched Successfully', $data);
} catch (Throwable $e) {
DB::rollBack();
ResponseService::logErrorResponse($e, "Expense Controller -> Filter Method");
ResponseService::errorResponse();
}
}
}