166 lines
4.1 KiB
PHP
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',
|
|
'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.');
|
|
}
|
|
}
|
|
}
|