check() && auth()->user()->role !== 'admin') { abort(403, 'Solo los administradores pueden realizar esta acción.'); } } public function index(Request $request) { $query = $request->input('search'); $category = $request->input('category'); $expenses = Expense::with('supplier') ->when($query, function ($q) use ($query) { return $q->where('description', 'like', "%{$query}%") ->orWhereHas('supplier', function($sq) use ($query) { $sq->where('name', 'like', "%{$query}%"); }); }) ->when($category, function ($q) use ($category) { return $q->where('expense_category', $category); }) ->orderBy('expense_date', 'desc') ->orderBy('id', 'desc') ->paginate(10) ->withQueryString(); return view('expenses.index', compact('expenses')); } public function create() { $this->checkAdmin(); $suppliers = Supplier::orderBy('name')->get(); return view('expenses.create', compact('suppliers')); } public function store(Request $request) { $this->checkAdmin(); $validated = $request->validate([ 'supplier_id' => 'nullable|exists:suppliers,id', 'description' => 'required|string|max:255', 'expense_category' => 'required|in:Mercadería,Servicios,Impuestos,Logística,Otros', 'type' => 'required|in:Compra,Pedido,Factura', 'status' => 'required|in:Pendiente,Pagado,Cancelado', 'total_amount' => 'required|numeric|min:0', 'document_number' => 'nullable|string|max:255', 'expense_date' => 'nullable|date', ]); if(empty($validated['expense_date'])) { $validated['expense_date'] = now()->toDateString(); } Expense::create($validated); return redirect()->route('expenses.index')->with('success', 'Gasto registrado correctamente.'); } public function show(Expense $expense) { return view('expenses.show', compact('expense')); } public function edit(Expense $expense) { $this->checkAdmin(); $suppliers = Supplier::orderBy('name')->get(); return view('expenses.edit', compact('expense', 'suppliers')); } public function update(Request $request, Expense $expense) { $this->checkAdmin(); $validated = $request->validate([ 'supplier_id' => 'nullable|exists:suppliers,id', 'description' => 'required|string|max:255', 'expense_category' => 'required|in:Mercadería,Servicios,Impuestos,Logística,Otros', 'type' => 'required|in:Compra,Pedido,Factura', 'status' => 'required|in:Pendiente,Pagado,Cancelado', 'total_amount' => 'required|numeric|min:0', 'document_number' => 'nullable|string|max:255', 'expense_date' => 'nullable|date', ]); $expense->update($validated); return redirect()->route('expenses.index')->with('success', 'Gasto actualizado correctamente.'); } public function destroy(Expense $expense) { $this->checkAdmin(); $expense->delete(); return redirect()->route('expenses.index')->with('success', 'Gasto eliminado correctamente.'); } }