Files
2026-01-06 15:35:59 -05:00

70 lines
2.4 KiB
PHP

<?php
namespace App\Observers;
use App\Models\Producto;
use App\Models\User;
use App\Notifications\StockMinimoNotificacion;
use App\Mail\AlertaStockMail;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
class ProductoObserver
{
public function saved(Producto $producto): void
{
// Solo verificar si no es un producto recién creado
if ($producto->wasRecentlyCreated) {
return;
}
$stockActual = $producto->getStockEfectivo();
$alertaStockMinimo = collect();
$alertaStockMaximo = collect();
// Verificar stock mínimo
if ($stockActual <= $producto->stock_minimo && $producto->stock_minimo > 0) {
$alertaStockMinimo->push($producto);
Log::info("Stock mínimo alcanzado para producto: {$producto->nombre} (Stock: {$stockActual})");
}
// Verificar stock máximo
if ($producto->stock_maximo && $stockActual > $producto->stock_maximo) {
$alertaStockMaximo->push($producto);
Log::info("Stock máximo excedido para producto: {$producto->nombre} (Stock: {$stockActual})");
}
// Enviar alertas si hay productos que requieren atención
if ($alertaStockMinimo->isNotEmpty() || $alertaStockMaximo->isNotEmpty()) {
$this->enviarAlertasStock($alertaStockMinimo, $alertaStockMaximo);
}
}
private function enviarAlertasStock($productosStockMinimo, $productosStockMaximo)
{
// Obtener todos los usuarios con el rol 'Administrador'
$administradores = User::role('Administrador')->get();
if ($administradores->isEmpty()) {
Log::warning('No se encontraron usuarios con el rol Administrador para enviar alertas de stock.');
return;
}
foreach ($administradores as $admin) {
try {
// Enviar usando el nuevo sistema de alertas
Mail::to($admin->email)->send(new AlertaStockMail(
$productosStockMinimo,
$productosStockMaximo,
$admin->email
));
Log::info("Alerta de stock enviada a: {$admin->email}");
} catch (\Exception $e) {
Log::error("Error al enviar alerta de stock a {$admin->email}: " . $e->getMessage());
}
}
}
}