check() && auth()->user()->role !== 'admin') { abort(403, 'Solo los administradores pueden realizar esta acción.'); } } /** * grilla de proveedores con buscador */ public function index(Request $request) { $query = $request->input('search'); $suppliers = Supplier::query() ->when($query, function ($q) use ($query) { return $q->where('name', 'like', "%{$query}%"); }) ->orderBy('name', 'asc') ->paginate(10) ->withQueryString(); return view('suppliers.index', compact('suppliers')); } /** * para crear un proveedor */ public function create() { $this->checkAdmin(); return view('suppliers.create'); } public function store(Request $request) { $this->checkAdmin(); $validated = $request->validate([ 'name' => 'required|string|max:255', 'phone' => 'nullable|string|max:50', 'email' => 'nullable|email|max:255|unique:suppliers,email', 'address' => 'nullable|string|max:255', ]); Supplier::create($validated); return redirect()->route('suppliers.index') ->with('success', 'Proveedor creado correctamente.'); } /** * muestra un proveedor */ public function show(Supplier $supplier) { return view('suppliers.show', compact('supplier')); } public function edit(Supplier $supplier) { $this->checkAdmin(); return view('suppliers.edit', compact('supplier')); } public function update(Request $request, Supplier $supplier) { $this->checkAdmin(); $validated = $request->validate([ 'name' => 'required|string|max:255', 'phone' => 'nullable|string|max:50', 'email' => 'nullable|email|max:255|unique:suppliers,email,' . $supplier->id, 'address' => 'nullable|string|max:255', ]); $supplier->update($validated); return redirect()->route('suppliers.index') ->with('success', 'Proveedor actualizado correctamente.'); } /** * elimina (solo si no tiene productos asociados) */ public function destroy(Supplier $supplier) { $this->checkAdmin(); try { $supplier->delete(); return redirect()->route('suppliers.index') ->with('success', 'Proveedor eliminado correctamente.'); } catch (\Illuminate\Database\QueryException $e) { // Si el proveedor tiene productos asociados, va a tirar un error de llave foránea. return back()->with('error', 'No se puede eliminar el proveedor porque tiene productos registrados en el inventario.'); } } /** * trae todos los productos de un proveedor */ public function order(Supplier $supplier) { $products = $supplier->products()->orderBy('name')->get(); return view('suppliers.order', compact('supplier', 'products')); } /** * guarda el pedido como un gasto */ public function storeOrder(Request $request, Supplier $supplier) { $validated = $request->validate([ 'products' => 'required|array', 'products.*.name' => 'required|string', 'products.*.qty' => 'required|integer|min:1', ]); $description = 'Pedido a proveedor. Productos: '; $items = []; foreach ($validated['products'] as $prod) { $items[] = $prod['qty'] . 'x ' . $prod['name']; } $description .= implode(', ', $items); $expense = \App\Models\Expense::create([ 'supplier_id' => $supplier->id, 'description' => \Illuminate\Support\Str::limit($description, 250), 'expense_category' => 'Mercadería', 'type' => 'Pedido', 'status' => 'Pendiente', 'total_amount' => 0, 'expense_date' => now()->toDateString(), ]); return response()->json(['success' => true, 'expense_id' => $expense->id]); } }