src/EventSubscriber/EmpresaActionNotifierSubscriber.php line 93

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Event\InscripcionRealizadaPorEmpresaEvent;
  4. use App\Event\InteresMostradoPorEmpresaEvent;
  5. use App\Interfaces\ActividadFormativaRepositoryInterface;
  6. use App\Services\EmailService;
  7. use Psr\Log\LoggerInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Contracts\Translation\TranslatorInterface;
  11. class EmpresaActionNotifierSubscriber implements EventSubscriberInterface
  12. {
  13. public function __construct(
  14. private readonly EmailService $emailService,
  15. private readonly ActividadFormativaRepositoryInterface $actividadRepository,
  16. private readonly LoggerInterface $logger,
  17. private readonly TranslatorInterface $translator,
  18. private readonly RequestStack $requestStack
  19. ) {}
  20. public static function getSubscribedEvents(): array
  21. {
  22. return [
  23. InscripcionRealizadaPorEmpresaEvent::class => 'onInscripcionRealizada',
  24. InteresMostradoPorEmpresaEvent::class => 'onInteresMostrado',
  25. ];
  26. }
  27. public function onInscripcionRealizada(InscripcionRealizadaPorEmpresaEvent $event): void
  28. {
  29. $participante = $event->participante;
  30. $grupo = $event->grupo;
  31. $solicitud = $grupo->getSolicitudAccionFormativa();
  32. $curso = $solicitud->getCurso();
  33. $emailDestino = $participante->getCorreo();
  34. $nombreCurso = $curso->getNombrePorLocale();
  35. $fechaInicio = $grupo->getFechaInicio() ? $grupo->getFechaInicio()->format('d/m/Y') : 'próximamente';
  36. if (empty($emailDestino)) {
  37. $this->logger->warning('El participante ' . $participante->getId() . ' no tiene un email para notificar la inscripción.');
  38. } else {
  39. $translationParams = [
  40. '%nombreParticipante%' => $participante->getNombreCompleto(),
  41. '%nombreCurso%' => $nombreCurso,
  42. '%fechaInicio%' => $fechaInicio,
  43. ];
  44. // Traducir el asunto y el cuerpo del correo desde los ficheros XLIFF
  45. $subject = $this->translator->trans('email.empresa_inscripcion.subject', ['%nombreCurso%' => $nombreCurso], 'courses');
  46. $htmlBody = $this->translator->trans('email.empresa_inscripcion.body', $translationParams, 'courses');
  47. $this->emailService->enviarCorreoHTML(
  48. to: $emailDestino,
  49. subject: $subject,
  50. htmlContent: $htmlBody
  51. );
  52. $this->logger->info('Email de inscripción para ' . $emailDestino . ' encolado para envío.');
  53. }
  54. $entidadColab = $solicitud?->getExpediente()?->getExpedientePerteneAEntidad()?->getEntidadColaboradora();
  55. if ($entidadColab === null) {
  56. $this->logger->warning('BUG-845: el grupo ' . $grupo->getId() . ' no tiene entidad colaboradora asociada al expediente; no se envía aviso.');
  57. return;
  58. }
  59. $correoEntidad = $entidadColab->getCorreo();
  60. if (empty($correoEntidad)) {
  61. $this->logger->warning('BUG-845: la entidad colaboradora ' . $entidadColab->getId() . ' no tiene correo; no se envía aviso.');
  62. return;
  63. }
  64. $nombreEmpresa = $participante->getEmpresa()?->getRazonSocial() ?? '—';
  65. $entidadParams = [
  66. '%nombreCurso%' => $nombreCurso,
  67. '%nombreParticipante%' => $participante->getNombreCompleto(),
  68. '%nombreEmpresa%' => $nombreEmpresa,
  69. '%fechaInicio%' => $fechaInicio,
  70. ];
  71. $entidadSubject = $this->translator->trans('email.entidad_solicitud_curso.subject', ['%nombreCurso%' => $nombreCurso], 'courses');
  72. $entidadBody = $this->translator->trans('email.entidad_solicitud_curso.body', $entidadParams, 'courses');
  73. $this->emailService->enviarCorreoHTML(
  74. to: $correoEntidad,
  75. subject: $entidadSubject,
  76. htmlContent: $entidadBody
  77. );
  78. $this->logger->info('Email aviso entidad colaboradora encolado para envío a ' . $correoEntidad . '.');
  79. }
  80. public function onInteresMostrado(InteresMostradoPorEmpresaEvent $event): void
  81. {
  82. $usuario = $event->usuarioHermes;
  83. $emailDestino = $usuario->getEmail();
  84. if (empty($emailDestino)) {
  85. $this->logger->warning('El usuario ' . $usuario->getId() . ' no tiene un email para notificar el interés.');
  86. return;
  87. }
  88. $actividad = $this->actividadRepository->findActividadByIdGenerico($event->actividadId);
  89. if (!$actividad) return;
  90. // INC-738: $actividad puede no contener la clave 'curso' (p.ej. tipo 'grupo').
  91. // Acceso defensivo para evitar Warning "Undefined array key 'curso'".
  92. $cursoEntity = $actividad['curso'] ?? null;
  93. $nombreCursoArr = $cursoEntity?->getNombre() ?? [];
  94. $locale = $this->requestStack->getCurrentRequest()?->getLocale() ?? 'ca';
  95. $nombreCurso = $nombreCursoArr[$locale] ?? ($nombreCursoArr['ca'] ?? '');
  96. $translationParams = [
  97. '%nombreUsuario%' => $usuario->getNombreCompleto(),
  98. '%nombreCurso%' => $nombreCurso,
  99. ];
  100. // Traducir el asunto y el cuerpo del correo desde los ficheros XLIFF
  101. $subject = $this->translator->trans('email.empresa_interes.subject', ['%nombreCurso%' => $nombreCurso], 'courses');
  102. $htmlBody = $this->translator->trans('email.empresa_interes.body', $translationParams, 'courses');
  103. $this->emailService->enviarCorreoHTML(
  104. to: $emailDestino,
  105. subject: $subject,
  106. htmlContent: $htmlBody
  107. );
  108. $this->logger->info('Email de interés para ' . $emailDestino . ' encolado para envío.');
  109. }
  110. }