<?php
namespace App\EventSubscriber;
use App\Event\InscripcionRealizadaPorEmpresaEvent;
use App\Event\InteresMostradoPorEmpresaEvent;
use App\Interfaces\ActividadFormativaRepositoryInterface;
use App\Services\EmailService;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
class EmpresaActionNotifierSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly EmailService $emailService,
private readonly ActividadFormativaRepositoryInterface $actividadRepository,
private readonly LoggerInterface $logger,
private readonly TranslatorInterface $translator,
private readonly RequestStack $requestStack
) {}
public static function getSubscribedEvents(): array
{
return [
InscripcionRealizadaPorEmpresaEvent::class => 'onInscripcionRealizada',
InteresMostradoPorEmpresaEvent::class => 'onInteresMostrado',
];
}
public function onInscripcionRealizada(InscripcionRealizadaPorEmpresaEvent $event): void
{
$participante = $event->participante;
$grupo = $event->grupo;
$solicitud = $grupo->getSolicitudAccionFormativa();
$curso = $solicitud->getCurso();
$emailDestino = $participante->getCorreo();
$nombreCurso = $curso->getNombrePorLocale();
$fechaInicio = $grupo->getFechaInicio() ? $grupo->getFechaInicio()->format('d/m/Y') : 'próximamente';
if (empty($emailDestino)) {
$this->logger->warning('El participante ' . $participante->getId() . ' no tiene un email para notificar la inscripción.');
} else {
$translationParams = [
'%nombreParticipante%' => $participante->getNombreCompleto(),
'%nombreCurso%' => $nombreCurso,
'%fechaInicio%' => $fechaInicio,
];
// Traducir el asunto y el cuerpo del correo desde los ficheros XLIFF
$subject = $this->translator->trans('email.empresa_inscripcion.subject', ['%nombreCurso%' => $nombreCurso], 'courses');
$htmlBody = $this->translator->trans('email.empresa_inscripcion.body', $translationParams, 'courses');
$this->emailService->enviarCorreoHTML(
to: $emailDestino,
subject: $subject,
htmlContent: $htmlBody
);
$this->logger->info('Email de inscripción para ' . $emailDestino . ' encolado para envío.');
}
$entidadColab = $solicitud?->getExpediente()?->getExpedientePerteneAEntidad()?->getEntidadColaboradora();
if ($entidadColab === null) {
$this->logger->warning('BUG-845: el grupo ' . $grupo->getId() . ' no tiene entidad colaboradora asociada al expediente; no se envía aviso.');
return;
}
$correoEntidad = $entidadColab->getCorreo();
if (empty($correoEntidad)) {
$this->logger->warning('BUG-845: la entidad colaboradora ' . $entidadColab->getId() . ' no tiene correo; no se envía aviso.');
return;
}
$nombreEmpresa = $participante->getEmpresa()?->getRazonSocial() ?? '—';
$entidadParams = [
'%nombreCurso%' => $nombreCurso,
'%nombreParticipante%' => $participante->getNombreCompleto(),
'%nombreEmpresa%' => $nombreEmpresa,
'%fechaInicio%' => $fechaInicio,
];
$entidadSubject = $this->translator->trans('email.entidad_solicitud_curso.subject', ['%nombreCurso%' => $nombreCurso], 'courses');
$entidadBody = $this->translator->trans('email.entidad_solicitud_curso.body', $entidadParams, 'courses');
$this->emailService->enviarCorreoHTML(
to: $correoEntidad,
subject: $entidadSubject,
htmlContent: $entidadBody
);
$this->logger->info('Email aviso entidad colaboradora encolado para envío a ' . $correoEntidad . '.');
}
public function onInteresMostrado(InteresMostradoPorEmpresaEvent $event): void
{
$usuario = $event->usuarioHermes;
$emailDestino = $usuario->getEmail();
if (empty($emailDestino)) {
$this->logger->warning('El usuario ' . $usuario->getId() . ' no tiene un email para notificar el interés.');
return;
}
$actividad = $this->actividadRepository->findActividadByIdGenerico($event->actividadId);
if (!$actividad) return;
// INC-738: $actividad puede no contener la clave 'curso' (p.ej. tipo 'grupo').
// Acceso defensivo para evitar Warning "Undefined array key 'curso'".
$cursoEntity = $actividad['curso'] ?? null;
$nombreCursoArr = $cursoEntity?->getNombre() ?? [];
$locale = $this->requestStack->getCurrentRequest()?->getLocale() ?? 'ca';
$nombreCurso = $nombreCursoArr[$locale] ?? ($nombreCursoArr['ca'] ?? '');
$translationParams = [
'%nombreUsuario%' => $usuario->getNombreCompleto(),
'%nombreCurso%' => $nombreCurso,
];
// Traducir el asunto y el cuerpo del correo desde los ficheros XLIFF
$subject = $this->translator->trans('email.empresa_interes.subject', ['%nombreCurso%' => $nombreCurso], 'courses');
$htmlBody = $this->translator->trans('email.empresa_interes.body', $translationParams, 'courses');
$this->emailService->enviarCorreoHTML(
to: $emailDestino,
subject: $subject,
htmlContent: $htmlBody
);
$this->logger->info('Email de interés para ' . $emailDestino . ' encolado para envío.');
}
}