143 lines
5.1 KiB
PHP
143 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace App\Observers;
|
|
|
|
use App\Models\Evento;
|
|
use App\Models\EquipoSeguimiento;
|
|
use App\Models\Jugador;
|
|
use App\Services\NotificacionService;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class EventoObserver
|
|
{
|
|
private NotificacionService $notifService;
|
|
|
|
public function __construct(NotificacionService $notifService)
|
|
{
|
|
$this->notifService = $notifService;
|
|
}
|
|
|
|
/**
|
|
* Al CREAR un partido: notificar a todos los seguidores de ambos equipos.
|
|
*/
|
|
public function created(Evento $evento): void
|
|
{
|
|
if (!$evento->id_equipo_local || !$evento->id_equipo_visitante) return;
|
|
|
|
$evento->load(['equipoLocal.club', 'equipoVisitante.club']);
|
|
|
|
$nombreLocal = $evento->equipoLocal->club->nombre ?? '?';
|
|
$nombreVisitante= $evento->equipoVisitante->club->nombre ?? '?';
|
|
$fechaStr = $evento->fecha_evento ? $evento->fecha_evento->format('d/m/Y') : '—';
|
|
$horaStr = $evento->hora_inicio ? \Carbon\Carbon::parse($evento->hora_inicio)->format('H:i') : '';
|
|
$sedeStr = $evento->sede ? " en {$evento->sede}" : '';
|
|
|
|
$titulo = "🏀 Nuevo Partido Programado";
|
|
$mensaje = "{$nombreLocal} vs {$nombreVisitante} — {$fechaStr}" . ($horaStr ? " a las {$horaStr}" : '') . $sedeStr . '.';
|
|
$url = '/eventos/' . $evento->id_evento;
|
|
|
|
$this->notificarSeguidoresDeEquipos(
|
|
[$evento->id_equipo_local, $evento->id_equipo_visitante],
|
|
'partido',
|
|
$titulo,
|
|
$mensaje,
|
|
$url
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Al ACTUALIZAR un partido: si cambia el marcador, notificar resultado.
|
|
*/
|
|
public function updated(Evento $evento): void
|
|
{
|
|
$dirty = $evento->getDirty();
|
|
|
|
// Solo disparar si se actualizó el marcador
|
|
if (!array_key_exists('marcador_local', $dirty) && !array_key_exists('marcador_visitante', $dirty)) {
|
|
return;
|
|
}
|
|
|
|
if ($evento->marcador_local === null || $evento->marcador_visitante === null) return;
|
|
|
|
// Validación Horaria (Buenos Aires)
|
|
$tz = 'America/Argentina/Buenos_Aires';
|
|
$ahora = \Carbon\Carbon::now($tz);
|
|
|
|
// El usuario solicita que se emita cuando fin > real
|
|
$fecha = $evento->fecha_evento instanceof \Carbon\Carbon ? $evento->fecha_evento->format('Y-m-d') : substr($evento->fecha_evento, 0, 10);
|
|
$horaFin = $evento->hora_fin instanceof \Carbon\Carbon ? $evento->hora_fin->format('H:i:s') : $evento->hora_fin;
|
|
$fin = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', "{$fecha} {$horaFin}", $tz);
|
|
|
|
if (!($fin->gt($ahora))) {
|
|
return;
|
|
}
|
|
|
|
$evento->load(['equipoLocal.club', 'equipoVisitante.club']);
|
|
|
|
$nombreLocal = $evento->equipoLocal->club->nombre ?? '?';
|
|
$nombreVisitante = $evento->equipoVisitante->club->nombre ?? '?';
|
|
$mloc = $evento->marcador_local;
|
|
$mvis = $evento->marcador_visitante;
|
|
|
|
if ($mloc > $mvis) {
|
|
$resultado = "🏆 Ganó {$nombreLocal}";
|
|
} elseif ($mvis > $mloc) {
|
|
$resultado = "🏆 Ganó {$nombreVisitante}";
|
|
} else {
|
|
$resultado = "🤝 Empate";
|
|
}
|
|
|
|
$titulo = "Resultado: {$nombreLocal} {$mloc} - {$mvis} {$nombreVisitante}";
|
|
$mensaje = "{$resultado}. Partido finalizado.";
|
|
$url = '/eventos/' . $evento->id_evento;
|
|
|
|
$this->notificarSeguidoresDeEquipos(
|
|
[$evento->id_equipo_local, $evento->id_equipo_visitante],
|
|
'resultado',
|
|
$titulo,
|
|
$mensaje,
|
|
$url
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Obtiene todos los seguidores de una lista de equipos y envía notificaciones.
|
|
* También incluye a los jugadores de esos equipos automáticamente.
|
|
*/
|
|
private function notificarSeguidoresDeEquipos(array $idEquipos, string $tipo, string $titulo, string $mensaje, ?string $url): void
|
|
{
|
|
$idEquipos = array_filter($idEquipos);
|
|
if (empty($idEquipos)) return;
|
|
|
|
$destinatarios = [];
|
|
$yaAgregados = [];
|
|
|
|
// Seguidores registrados en equipo_seguimiento
|
|
$seguimientos = EquipoSeguimiento::whereIn('id_equipo', $idEquipos)->get();
|
|
foreach ($seguimientos as $s) {
|
|
$key = $s->tipo_usuario . ':' . $s->id_usuario;
|
|
if (!isset($yaAgregados[$key])) {
|
|
$destinatarios[] = ['tipo' => $s->tipo_usuario, 'id' => $s->id_usuario];
|
|
$yaAgregados[$key] = true;
|
|
}
|
|
}
|
|
|
|
// Jugadores que pertenecen a estos equipos (siguen automáticamente)
|
|
$jugadores = \DB::table('jugador_equipo')
|
|
->whereIn('id_equipo', $idEquipos)
|
|
->pluck('id_jugador');
|
|
|
|
foreach ($jugadores as $idJ) {
|
|
$key = 'jugador:' . $idJ;
|
|
if (!isset($yaAgregados[$key])) {
|
|
$destinatarios[] = ['tipo' => 'jugador', 'id' => $idJ];
|
|
$yaAgregados[$key] = true;
|
|
}
|
|
}
|
|
|
|
if (!empty($destinatarios)) {
|
|
$this->notifService->enviarMasivo($destinatarios, $tipo, $titulo, $mensaje, $url);
|
|
}
|
|
}
|
|
}
|