inventario/app/Http/Controllers/ProductoController.php
jesusfb a31af58b8f
All checks were successful
Deploy Laravel Directo / deploy (push) Successful in 5s
first commit
2026-04-24 17:34:00 -07:00

166 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Producto;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class ProductoController extends Controller
{
public function index()
{
$user = auth()->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.');
}
}
}