middleware('check.permission:expenses.read')->only(['index']); $this->middleware('check.permission:expenses.create')->only(['store']); $this->middleware('check.permission:expenses.update')->only(['update']); $this->middleware('check.permission:expenses.delete')->only(['destroy', 'deleteAll']); } public function index(Request $request) { $expense_categories = ExpenseCategory::where('business_id', auth()->user()->business_id)->whereStatus(1)->latest()->get(); $payment_types = PaymentType::where('business_id', auth()->user()->business_id)->whereStatus(1)->latest()->get(); $branches = Branch::withTrashed()->where('business_id', auth()->user()->business_id)->latest()->get(); $expenseQuery = Expense::with('category:id,categoryName', 'payment_type:id,name', 'branch:id,name', 'transactions') ->where('business_id', auth()->user()->business_id); $expenseQuery->when($request->branch_id, function ($q) use ($request) { $q->where('branch_id', $request->branch_id); }); // Date Filter $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); $this->applyDateFilter($expenseQuery, $duration, 'expenseDate', $request->from_date, $request->to_date); // Search Filter if ($request->filled('search')) { $expenseQuery->where(function ($query) use ($request) { $query->where('expanseFor', 'like', '%' . $request->search . '%') ->orWhere('paymentType', 'like', '%' . $request->search . '%') ->orWhere('referenceNo', 'like', '%' . $request->search . '%') ->orWhere('amount', 'like', '%' . $request->search . '%') ->orWhereHas('category', function ($q) use ($request) { $q->where('categoryName', 'like', '%' . $request->search . '%'); }) ->orWhereHas('payment_type', function ($q) use ($request) { $q->where('name', 'like', '%' . $request->search . '%'); }) ->orWhereHas('branch', function ($q) use ($request) { $q->where('name', 'like', '%' . $request->search . '%'); }); }); } $perPage = $request->input('per_page', 20); $expenses = $expenseQuery->latest()->paginate($perPage)->appends($request->query()); if ($request->ajax()) { return response()->json([ 'data' => view('business::expenses.datas', compact('expenses', 'filter_from_date', 'filter_to_date', 'duration'))->render(), ]); } return view('business::expenses.index', compact('expenses', 'expense_categories', 'payment_types', 'branches', 'filter_from_date', 'filter_to_date', 'duration')); } public function store(Request $request) { $request->validate([ 'amount' => 'required|numeric', 'expenseFor' => 'nullable|string', 'referenceNo' => 'nullable|string', 'expenseDate' => 'nullable|string', 'note' => 'nullable|string', 'expense_category_id' => 'required|exists:expense_categories,id', ]); DB::beginTransaction(); try { $business_id = auth()->user()->business_id; updateBalance($request->amount, 'decrement'); $expense = Expense::create($request->except('status') + [ 'user_id' => auth()->id(), 'business_id' => auth()->user()->business_id, ]); // MultiPaymentProcessed Event event(new MultiPaymentProcessed( $request->payments ?? [], $expense->id, 'expense', $request->amount ?? 0, )); sendNotifyToUser($expense->id, route('business.expenses.index', ['id' => $expense->id]), __('Expense has been created.'), $business_id); DB::commit(); return response()->json([ 'message' => __('Expense saved successfully.'), 'redirect' => route('business.expenses.index') ]); } catch (\Exception $e) { DB::rollback(); return response()->json(['message' => __('Somethings went wrong!')], 404); } } public function update(Request $request, $id) { $request->validate([ 'amount' => 'required|numeric', 'expenseFor' => 'nullable|string', 'referenceNo' => 'nullable|string', 'expenseDate' => 'nullable|string', 'note' => 'nullable|string', 'expense_category_id' => 'required|exists:expense_categories,id', ]); DB::beginTransaction(); try { $business_id = auth()->user()->business_id; $expense = Expense::findOrFail($id); updateBalance($request->amount - $expense->amount, 'decrement'); $expense->update($request->except('status') + [ 'user_id' => auth()->id(), 'business_id' => auth()->user()->business_id, ]); // Multiple Payment Process $oldTransactions = Transaction::where('business_id', $business_id) ->where('reference_id', $expense->id) ->where('platform', 'expense') ->get(); // Revert old transactions foreach ($oldTransactions as $old) { if ($old->transaction_type === 'bank_payment' && $old->payment_type_id) { $paymentType = PaymentType::find($old->payment_type_id); if ($paymentType) { $paymentType->increment('balance', $old->amount); } } } // Delete old transactions Transaction::where('business_id', $business_id) ->where('reference_id', $expense->id) ->where('platform', 'expense') ->delete(); // Process new payments event(new MultiPaymentProcessed( $request->payments ?? [], $expense->id, 'expense', $request->amount ?? 0, )); DB::commit(); sendNotifyToUser($expense->id, route('business.expenses.index', ['id' => $expense->id]), __('Expense has been updated.'), $business_id); return response()->json([ 'message' => __('Expense updated successfully.'), 'redirect' => route('business.expenses.index') ]); } catch (\Exception $e) { DB::rollback(); return response()->json(['message' => __('Somethings went wrong!')], 404); } } public function destroy($id) { DB::beginTransaction(); try { $expense = Expense::findOrFail($id); updateBalance($expense->amount, 'increment'); sendNotifyToUser($expense->id, route('business.expenses.index', ['id' => $expense->id]), __('Expense has been deleted.'), $expense->business_id); $expense->delete(); DB::commit(); return response()->json([ 'message' => __('Expense deleted successfully'), 'redirect' => route('business.expenses.index'), ]); } catch (\Exception $e) { DB::rollback(); return response()->json(['message' => __('Somethings went wrong!')], 404); } } public function deleteAll(Request $request) { DB::beginTransaction(); try { $expenses = Expense::whereIn('id', $request->ids)->get(); $totalAmount = $expenses->sum('amount'); updateBalance($totalAmount, 'increment'); Expense::whereIn('id', $request->ids)->delete(); foreach ($expenses as $expense) { sendNotifyToUser($expense->id, route('business.expenses.index', ['id' => $expense->id]), __('Expense has been deleted.'), $expense->business_id); } DB::commit(); return response()->json([ 'message' => __('Selected items deleted successfully.'), 'redirect' => route('business.expenses.index'), ]); } catch (\Exception $e) { DB::rollback(); return response()->json(['message' => __('Something went wrong!')], 404); } } }