financeService = $financeService; } public function index(Request $request) { $filters = $request->only(['search', 'category', 'date_start', 'date_end', 'sort_field', 'sort_direction', 'per_page']); $fees = $this->financeService->getUtilityFees($filters)->withQueryString(); $availableCategories = $this->financeService->getUniqueCategories(); return Inertia::render('UtilityFee/Index', [ 'fees' => $fees, 'availableCategories' => $availableCategories, 'filters' => $filters, ]); } public function store(Request $request) { $validated = $request->validate([ 'transaction_date' => 'nullable|date', 'due_date' => 'required|date', 'category' => 'required|string|max:255', 'amount' => 'required|numeric|min:0', 'invoice_number' => 'nullable|string|max:255', 'description' => 'nullable|string', ]); $validated['payment_status'] = $this->determineStatus($validated); $fee = UtilityFee::create($validated); activity() ->performedOn($fee) ->causedBy(auth()->user()) ->event('created') ->log('created'); return redirect()->back(); } public function update(Request $request, UtilityFee $utility_fee) { $validated = $request->validate([ 'transaction_date' => 'nullable|date', 'due_date' => 'required|date', 'category' => 'required|string|max:255', 'amount' => 'required|numeric|min:0', 'invoice_number' => 'nullable|string|max:255', 'description' => 'nullable|string', ]); $validated['payment_status'] = $this->determineStatus($validated); $utility_fee->update($validated); activity() ->performedOn($utility_fee) ->causedBy(auth()->user()) ->event('updated') ->log('updated'); return redirect()->back(); } /** * 判定繳費狀態 */ private function determineStatus(array $data): string { if (!empty($data['transaction_date'])) { return UtilityFee::STATUS_PAID; } if (!empty($data['due_date']) && now()->startOfDay()->gt(\Illuminate\Support\Carbon::parse($data['due_date']))) { return UtilityFee::STATUS_OVERDUE; } return UtilityFee::STATUS_PENDING; } public function destroy(UtilityFee $utility_fee) { activity() ->performedOn($utility_fee) ->causedBy(auth()->user()) ->event('deleted') ->log('deleted'); $utility_fee->delete(); return redirect()->back(); } }