user(); if ($user->hasRole('super-admin')) { $productos = Producto::latest()->get(); } else { $productos = Producto::where('company_id', $user->company_id) ->latest() ->get(); } return view('productos.index', compact('productos')); } public function create() { return view('productos.create'); } public function store(Request $request) { $request->validate([ 'nombre' => 'required|string|max:255', 'precio' => 'required|numeric|min:0', 'descripcion' => 'nullable|string', 'codigo_barras' => 'nullable|unique:productos,codigo_barras', 'foto' => 'nullable|image|max:2048', ]); $data = $request->only([ 'nombre', 'precio', 'descripcion', 'codigo_barras', ]); // Asignamos empresa del usuario autenticado $data['company_id'] = auth()->user()->company_id; if ($request->hasFile('foto')) { $data['foto'] = $request->file('foto')->store('productos', 'public'); } // 👉 Guardamos en variable para auditar $producto = Producto::create($data); // ✅ AUDITORÍA DE CREACIÓN audit_log( 'created-gitea', 'productos', $producto, null, $producto->toArray() ); return redirect()->route('productos.index') ->with('success', 'Producto creado correctamente.'); } public function edit(Producto $producto) { $this->authorizeProducto($producto); return view('productos.edit', compact('producto')); } public function update(Request $request, Producto $producto) { $this->authorizeProducto($producto); $request->validate([ 'nombre' => 'required|string|max:255', 'precio' => 'required|numeric|min:0', 'descripcion' => 'nullable|string', 'codigo_barras' => 'nullable|unique:productos,codigo_barras,' . $producto->id, 'foto' => 'nullable|image|max:2048', ]); // 👉 Capturamos estado anterior (para auditoría) $oldData = $producto->toArray(); $data = $request->only([ 'nombre', 'precio', 'descripcion', 'codigo_barras', ]); if ($request->hasFile('foto')) { if ($producto->foto) { Storage::disk('public')->delete($producto->foto); } $data['foto'] = $request->file('foto')->store('productos', 'public'); } // 👉 ESTA LÍNEA ES LA CLAVE: actualiza con el array completo $producto->update($data); // 👉 Capturamos estado nuevo $newData = $producto->fresh()->toArray(); // Auditoría audit_log( 'updated', 'productos', $producto, $oldData, $newData ); return redirect()->route('productos.index') ->with('success', 'Producto actualizado correctamente.'); } public function destroy(Producto $producto) { $this->authorizeProducto($producto); $deletedData = $producto->toArray(); if ($producto->foto) { Storage::disk('public')->delete($producto->foto); } $producto->delete(); // ✅ AUDITORÍA DE ELIMINACIÓN audit_log( 'deleted', 'productos', $producto, $deletedData, null ); return redirect()->route('productos.index') ->with('success', 'Producto eliminado.'); } /** * Seguridad multiempresa (igual lógica que usas en otros módulos) */ private function authorizeProducto(Producto $producto) { $user = auth()->user(); if ( !$user->hasRole('super-admin') && $producto->company_id !== $user->company_id ) { abort(403, 'No autorizado.'); } } }