get('month_id'); if ($monthId) { $month = $user->months()->findOrFail($monthId); $expenses = $month->expenses() ->orderBy('date', 'desc') ->paginate(30); } else { $month = null; $expenses = $user->expenses() ->orderBy('date', 'desc') ->paginate(30); } $months = $user->months() ->orderBy('year', 'desc') ->orderByRaw("FIELD(name, 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre') DESC") ->get(); return view('expenses.index', compact('expenses', 'month', 'months')); } /** * Mostrar formulario para crear gasto */ public function create(Request $request) { $user = Auth::user(); $monthId = $request->get('month_id'); if ($monthId) { $month = $user->months()->findOrFail($monthId); } else { $month = $user->getCurrentMonth(); if (!$month) { $month = $user->months()->latest()->first(); } } if (!$month) { return redirect()->route('months.index')->with('info', 'Necesitas un mes de trabajo primero.'); } return view('expenses.create', compact('month')); } /** * Guardar nuevo gasto */ public function store(Request $request) { $user = Auth::user(); $validated = $request->validate([ 'month_id' => ['required', 'exists:months,id'], 'description' => ['required', 'string', 'max:255'], 'amount' => ['required', 'numeric', 'min:0.01'], 'date' => ['required', 'date'], 'expense_type' => ['required', 'in:q1,q2,mensual'], ]); // Verificar que el mes pertenece al usuario $month = $user->months()->findOrFail($validated['month_id']); $month->expenses()->create([ 'user_id' => $user->id, 'description' => $validated['description'], 'amount' => $validated['amount'], 'date' => $validated['date'], 'expense_type' => $validated['expense_type'], ]); return redirect()->route('expenses.index', ['month_id' => $month->id]) ->with('success', 'Gasto registrado correctamente.'); } /** * Mostrar formulario de edición */ public function edit(Expense $expense) { $user = Auth::user(); if ($expense->user_id !== $user->id) { abort(403); } return view('expenses.edit', compact('expense')); } /** * Actualizar gasto */ public function update(Request $request, Expense $expense) { $user = Auth::user(); if ($expense->user_id !== $user->id) { abort(403); } $validated = $request->validate([ 'description' => ['required', 'string', 'max:255'], 'amount' => ['required', 'numeric', 'min:0.01'], 'date' => ['required', 'date'], 'expense_type' => ['required', 'in:q1,q2,mensual'], ]); $expense->update($validated); return redirect()->route('expenses.index', ['month_id' => $expense->month_id]) ->with('success', 'Gasto actualizado correctamente.'); } /** * Eliminar gasto */ public function destroy(Expense $expense) { $user = Auth::user(); if ($expense->user_id !== $user->id) { abort(403); } $monthId = $expense->month_id; $expense->delete(); return redirect()->route('expenses.index', ['month_id' => $monthId]) ->with('success', 'Gasto eliminado correctamente.'); } }