src/Service/CursoService.php line 514

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\Alumno;
  4. use App\Entity\Curso;
  5. use App\Entity\TareaCurso;
  6. use App\Entity\TareaCursoPlantilla;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Mpdf\Mpdf;
  9. use Mpdf\MpdfException;
  10. use Mpdf\Output\Destination;
  11. use Symfony\Component\Filesystem\Filesystem;
  12. use Twig\Environment;
  13. use Twig\Error\LoaderError;
  14. use Twig\Error\RuntimeError;
  15. use Twig\Error\SyntaxError;
  16. class CursoService
  17. {
  18. public function __construct(
  19. private readonly EntityManagerInterface $em,
  20. private readonly Environment $environment
  21. )
  22. {
  23. }
  24. // Esta función se usa para leer las tareas plantilla que hay creadas en la config. global y añadirselas a un curso
  25. // al crearlo.
  26. public function anadirTareasPlantilla(Curso $curso): void
  27. {
  28. $tareasPlantilla = $this->em->getRepository(TareaCursoPlantilla::class)->findBy([
  29. 'visible' => true,
  30. 'borrado' => false
  31. ]);
  32. foreach ($tareasPlantilla as $tareaPlantilla) {
  33. $tarea = new TareaCurso();
  34. $tarea
  35. ->setNombre($tareaPlantilla->getNombre())
  36. ->setDescripcion($tareaPlantilla->getDescripcion());
  37. $this->em->persist($tarea);
  38. $curso->addTarea($tarea);
  39. }
  40. }
  41. // Esta función se llama cada vez que se actualiza un curso y es para realizar unos ajustes en unos campos que son
  42. // autocalculados.
  43. public function ajustarCamposAutocalculados(Curso $curso): void
  44. {
  45. // Para actualizar las fechas de seguimiento de los alumnos según la "fecha de firma acta selección".
  46. if ($curso->getFechaFirmaActaSeleccion()) {
  47. $fechaSeguimientoAlumnoMes = (clone $curso->getFechaFirmaActaSeleccion())->modify('+1 months');
  48. $fechaSeguimientoAlumnoSeisMeses = (clone $curso->getFechaFirmaActaSeleccion())->modify('+6 months');
  49. $alumnos = $this->em->getRepository(Curso::class)->obtenerAlumnos($curso);
  50. /** @var Alumno $a */
  51. foreach ($alumnos as $a) {
  52. // Si el estado es "Persona formada", se le actualizan las fechas de seguimiento.
  53. if ($a->getEstado()->getId() === 4) {
  54. $a
  55. ->setFechaLlamadaMes($fechaSeguimientoAlumnoMes)
  56. ->setFechaLlamadaSeisMeses($fechaSeguimientoAlumnoSeisMeses);
  57. }
  58. }
  59. }
  60. // Para actualizar los campos de duración en horas y en días del curso.
  61. $horasFormacionEspecificaEnSeg = $curso->getHorasFormacionEspecifica() ?? 0;
  62. $horasFormacionPracticaProfesionalEnSeg = $curso->getHorasPracticaProfesional() ?? 0;
  63. $horasFormacionTransversalEnSeg = $curso->getHorasFormacionTransversal() ?? 0;
  64. $horasFormacionComplementariaEnSeg = $curso->getHorasFormacionComplementaria() ?? 0;
  65. $horasTutoriaEspecificaEnSeg = $curso->getHorasTutoriaEspecifica() ?? 0;
  66. $horasTutoriaPracticaEnSeg = $curso->getHorasTutoriaPractica() ?? 0;
  67. $totalHorasEnSegundos =
  68. $horasFormacionEspecificaEnSeg +
  69. $horasFormacionPracticaProfesionalEnSeg +
  70. $horasFormacionTransversalEnSeg +
  71. $horasFormacionComplementariaEnSeg +
  72. $horasTutoriaEspecificaEnSeg +
  73. $horasTutoriaPracticaEnSeg;
  74. $curso
  75. ->setHorasDuracion($totalHorasEnSegundos)
  76. ->setDiasDuracion($totalHorasEnSegundos);
  77. // Para actualizar el campo de ayudaMaxima (Beca).
  78. // El 5 es porque son 5 horas por día.
  79. $curso->setAyudaMaxima((int)($curso->getDiasDuracion()/60/60/5) * $curso->getCosteDiaAsistencia());
  80. }
  81. // Esta función se utiliza en la vista detalle del curso, en la pestaña de tareas.
  82. public function datosBarraProgresoTareas(Curso $curso): array
  83. {
  84. $result = [
  85. 'totalTareas' => $curso->getTareas()->count(),
  86. 'totalTareasCompletadas' => 0,
  87. 'porcentajeCompletadas' => 0
  88. ];
  89. if ($result['totalTareas'] > 0) {
  90. foreach ($curso->getTareas() as $tarea) {
  91. if ($tarea->isCompletada()) {
  92. $result['totalTareasCompletadas'] += 1;
  93. }
  94. }
  95. $result['porcentajeCompletadas'] = number_format((($result['totalTareasCompletadas'] * 100) / $result['totalTareas']), 2);
  96. }
  97. return $result;
  98. }
  99. // Función que se usa en la función "estadisticaTestEvaluacion".
  100. private function getEstructuraPreguntasBase(): array
  101. {
  102. // 🔹 Plantillas reutilizables
  103. $respuestasMedios = [
  104. 'Prensa' => 0,
  105. 'Carteles informativos' => 0,
  106. 'Página web' => 0,
  107. 'Redes sociales' => 0,
  108. 'Ayuntamiento' => 0,
  109. 'Servicios Sociales Comunitarios' => 0,
  110. 'Asociaciones' => 0,
  111. 'Otros' => 0
  112. ];
  113. $respuestasSiNo = [
  114. 'Sí' => 0,
  115. 'No' => 0
  116. ];
  117. $respuestasCuatroNiveles = [
  118. 'Mucho' => 0,
  119. 'Suficiente' => 0,
  120. 'Poco' => 0,
  121. 'Nada' => 0
  122. ];
  123. $respuestasEscala10 = array_fill_keys(range(1, 10), 0);
  124. $respuestasUtilidad = [
  125. 'Muy útil y aplicable a mi vida laboral o personal' => 0,
  126. 'Útil, aunque me hubiera gustado profundizar más' => 0,
  127. 'Algo básico o repetitivo, esperaba más contenido nuevo' => 0,
  128. 'Poco útil, no se relacionaba con mis intereses o necesidades' => 0
  129. ];
  130. // 🔹 Ahora definimos todas las preguntas usando las plantillas
  131. return [
  132. 'medioInformante' => [
  133. 'tituloPregunta' => '¿A través de qué medio recibiste la información sobre Proempleo8 y sus cursos de formación?',
  134. 'respuestas' => $respuestasMedios,
  135. 'totalRespuestas' => 0
  136. ],
  137. 'medioMasEfectivo' => [
  138. 'tituloPregunta' => '¿Qué medio consideras que fue el más efectivo para informarte sobre los cursos?',
  139. 'respuestas' => $respuestasMedios,
  140. 'totalRespuestas' => 0
  141. ],
  142. 'considerasDifusionAdecuada' => [
  143. 'tituloPregunta' => '¿Consideras que la difusión del curso ha sido adecuada?',
  144. 'respuestas' => [
  145. 'Sí, fue muy adecuada y me permitió acceder fácilmente a la información' => 0,
  146. 'Regular, aunque podría mejorar en algunos aspectos' => 0,
  147. 'No, considero que la difusión fue insuficiente o poco efectiva' => 0,
  148. 'No estoy seguro/a' => 0,
  149. ],
  150. 'totalRespuestas' => 0
  151. ],
  152. 'accesoUtilizacionWeb' => [
  153. 'tituloPregunta' => 'El acceso y utilización de la página web Proempleo8 me resultó',
  154. 'respuestas' => [
  155. 'Muy fácil y claro, no tuve ningún problema' => 0,
  156. 'Normal, aunque con algunos detalles mejorables' => 0,
  157. 'Algo complicado, me costó adaptarme' => 0,
  158. ],
  159. 'totalRespuestas' => 0
  160. ],
  161. 'cargaErrores' => [
  162. 'tituloPregunta' => '¿La página web Proempleo8 cargaba rápidamente y sin errores?',
  163. 'respuestas' => [
  164. 'Sí, siempre' => 0,
  165. 'A veces tardaba un poco' => 0,
  166. 'Con frecuencia era lenta o daba errores' => 0,
  167. ],
  168. 'totalRespuestas' => 0
  169. ],
  170. 'recomendacionMejoras' => [
  171. 'tituloPregunta' => '¿Recomendarías mejorar algún aspecto técnico o de usabilidad de la página web Proempleo8?',
  172. 'respuestas' => [
  173. 'No, todo funcionó correctamente' => 0,
  174. 'Sí' => 0
  175. ],
  176. 'totalRespuestas' => 0
  177. ],
  178. 'experienciaAcceso' => [
  179. 'tituloPregunta' => '¿Cómo fue tu experiencia al rellenar el cuestionario inicial para acceder al curso del Proyecto Proempleo8?',
  180. 'respuestas' => [
  181. 'Muy buena, fue claro y fácil de completar' => 0,
  182. 'Regular, me costó entender algunas preguntas' => 0,
  183. 'Mala, tuve dificultades para completarlo y necesité ayuda' => 0
  184. ],
  185. 'totalRespuestas' => 0
  186. ],
  187. 'dificultadEnvioSolicitudSede' => [
  188. 'tituloPregunta' => '¿Tuviste alguna dificultad para enviar la solicitud por sede electrónica o cualquiera de las demás opciones?',
  189. 'respuestas' => [
  190. 'No, el proceso fue fácil y sin inconvenientes' => 0,
  191. 'Sí, tuve dificultades' => 0
  192. ],
  193. 'totalRespuestas' => 0
  194. ],
  195. 'opinionFormacionEspecifica' => [
  196. 'tituloPregunta' => 'La formación específica me pareció',
  197. 'respuestas' => $respuestasUtilidad,
  198. 'totalRespuestas' => 0
  199. ],
  200. 'opinionFormacionTransversal' => [
  201. 'tituloPregunta' => 'Los módulos transversales me parecieron',
  202. 'respuestas' => $respuestasUtilidad,
  203. 'totalRespuestas' => 0
  204. ],
  205. 'opinionFormacionComplementaria' => [
  206. 'tituloPregunta' => 'La formación complementaria me pareció',
  207. 'respuestas' => $respuestasUtilidad,
  208. 'totalRespuestas' => 0
  209. ],
  210. 'valoracionTeoricoCurso' => [
  211. 'tituloPregunta' => 'En general, ¿cómo valorarías el contenido teórico del curso en una escala del 1 al 10?',
  212. 'respuestas' => $respuestasEscala10,
  213. 'totalRespuestas' => 0
  214. ],
  215. 'cumplidoExpectativasInicioPracticas' => [
  216. 'tituloPregunta' => 'Se han cumplido las expectativas marcadas al inicio de las prácticas',
  217. 'respuestas' => $respuestasCuatroNiveles,
  218. 'totalRespuestas' => 0
  219. ],
  220. 'horasDedicadasPartePractica' => [
  221. 'tituloPregunta' => 'Las horas dedicadas a la parte práctica del curso me han parecido',
  222. 'respuestas' => $respuestasCuatroNiveles,
  223. 'totalRespuestas' => 0
  224. ],
  225. 'formacionTeoricaAyudaPracticas' => [
  226. 'tituloPregunta' => 'La formación teórica me ha ayudado para la realización de las prácticas',
  227. 'respuestas' => $respuestasCuatroNiveles,
  228. 'totalRespuestas' => 0
  229. ],
  230. 'incidenciasResueltasTutor' => [
  231. 'tituloPregunta' => 'Las incidencias surgidas han sido resueltas por el tutor con eficacia',
  232. 'respuestas' => [
  233. 'Sí, todas' => 0,
  234. 'Algunas' => 0,
  235. 'No, pocas' => 0
  236. ],
  237. 'totalRespuestas' => 0
  238. ],
  239. 'tareasAdecuadasFinalidadCurso' => [
  240. 'tituloPregunta' => 'Las tareas realizadas han sido las adecuadas a la finalidad del curso',
  241. 'respuestas' => $respuestasCuatroNiveles,
  242. 'totalRespuestas' => 0
  243. ],
  244. 'empresaFacilitaIntegracion' => [
  245. 'tituloPregunta' => 'La empresa se ha implicado facilitándome ayuda para que me integrara mejor',
  246. 'respuestas' => $respuestasCuatroNiveles,
  247. 'totalRespuestas' => 0
  248. ],
  249. 'autorealizadoConTareas' => [
  250. 'tituloPregunta' => 'Me he sentido útil en el desarrollo de las tareas realizadas',
  251. 'respuestas' => $respuestasCuatroNiveles,
  252. 'totalRespuestas' => 0
  253. ],
  254. 'aprendizajeSuficienteParaTrabajar' => [
  255. 'tituloPregunta' => 'Considero que el aprendizaje ha sido suficiente para incorporarme a trabajar',
  256. 'respuestas' => $respuestasCuatroNiveles,
  257. 'totalRespuestas' => 0
  258. ],
  259. 'valoracionPracticasCurso' => [
  260. 'tituloPregunta' => 'En general, ¿cómo valorarías las prácticas del curso en una escala del 1 al 10?',
  261. 'respuestas' => $respuestasEscala10,
  262. 'totalRespuestas' => 0
  263. ],
  264. 'contarConEmpresaFuturosCursos' => [
  265. 'tituloPregunta' => '¿Contarías con esta empresa para realizar las prácticas en futuros cursos?',
  266. 'respuestas' => $respuestasSiNo,
  267. 'totalRespuestas' => 0
  268. ],
  269. 'tutoraProporcionoOrientacionRealizacionCurso' => [
  270. 'tituloPregunta' => '¿La tutora te proporcionó orientación clara sobre la realización del curso?',
  271. 'respuestas' => $respuestasCuatroNiveles,
  272. 'totalRespuestas' => 0
  273. ],
  274. 'tutoraDisponibleDudasCurso' => [
  275. 'tituloPregunta' => '¿La tutora estuvo disponible para resolver las dudas de forma clara y efectiva durante el curso?',
  276. 'respuestas' => $respuestasCuatroNiveles,
  277. 'totalRespuestas' => 0
  278. ],
  279. 'profesorAcompaniaEnTeoria' => [
  280. 'tituloPregunta' => '¿Te sentiste acompañado/a por el tutor durante el desarrollo de la teoría?',
  281. 'respuestas' => $respuestasCuatroNiveles,
  282. 'totalRespuestas' => 0
  283. ],
  284. 'tutorMuestraInteresEvolucionAlumno' => [
  285. 'tituloPregunta' => '¿El tutor mostró interés por tu evolución y aprendizaje?',
  286. 'respuestas' => $respuestasCuatroNiveles,
  287. 'totalRespuestas' => 0
  288. ],
  289. 'escuchadoEnTutorias' => [
  290. 'tituloPregunta' => '¿Te sentiste escuchado/a y comprendido/a durante las tutorías?',
  291. 'respuestas' => $respuestasCuatroNiveles,
  292. 'totalRespuestas' => 0
  293. ],
  294. 'tutoriasUtilesAprendizaje' => [
  295. 'tituloPregunta' => '¿Consideras que las tutorías han sido útiles para tu proceso de aprendizaje?',
  296. 'respuestas' => $respuestasCuatroNiveles,
  297. 'totalRespuestas' => 0
  298. ],
  299. 'valoracionTutoriasCurso' => [
  300. 'tituloPregunta' => 'En general, ¿cómo valorarías las tutorías hasta la fecha en una escala del 1 al 10?',
  301. 'respuestas' => $respuestasEscala10,
  302. 'totalRespuestas' => 0
  303. ],
  304. 'profesorExplicaBien' => [
  305. 'tituloPregunta' => '¿El profesor/a explicó los contenidos de manera clara y comprensible?',
  306. 'respuestas' => $respuestasCuatroNiveles,
  307. 'totalRespuestas' => 0
  308. ],
  309. 'profesorFomentaParticipacionGrupoSesionesTeoricas' => [
  310. 'tituloPregunta' => '¿Fomentó la participación del grupo durante las sesiones teóricas?',
  311. 'respuestas' => $respuestasCuatroNiveles,
  312. 'totalRespuestas' => 0
  313. ],
  314. 'profesorResuelveDudasBien' => [
  315. 'tituloPregunta' => '¿Resolvió tus dudas con claridad y paciencia?',
  316. 'respuestas' => $respuestasCuatroNiveles,
  317. 'totalRespuestas' => 0
  318. ],
  319. 'profesorServicialEnNecesidad' => [
  320. 'tituloPregunta' => '¿Se mostró accesible y dispuesto/a a ayudarte cuando lo necesitabas?',
  321. 'respuestas' => $respuestasCuatroNiveles,
  322. 'totalRespuestas' => 0
  323. ],
  324. 'profesorAportaRecursosNecesarios' => [
  325. 'tituloPregunta' => '¿Utilizó recursos didácticos útiles y aportó los materiales necesarios (presentaciones, ejemplos, casos prácticos, etc.)?',
  326. 'respuestas' => $respuestasCuatroNiveles,
  327. 'totalRespuestas' => 0
  328. ],
  329. 'valoracionProfesorCurso' => [
  330. 'tituloPregunta' => 'En general, ¿cómo valorarías el profesor/a del curso en una escala del 1 al 10?',
  331. 'respuestas' => $respuestasEscala10,
  332. 'totalRespuestas' => 0
  333. ],
  334. 'tutorOrientaBienPracticas' => [
  335. 'tituloPregunta' => '¿El profesor/a de prácticas te ofreció una buena orientación inicial sobre tu rol y tareas en la empresa?',
  336. 'respuestas' => $respuestasCuatroNiveles,
  337. 'totalRespuestas' => 0
  338. ],
  339. 'tutorRealizoSeguimientoBienPracticas' => [
  340. 'tituloPregunta' => '¿Realizó un seguimiento adecuado de tu evolución durante las prácticas?',
  341. 'respuestas' => $respuestasCuatroNiveles,
  342. 'totalRespuestas' => 0
  343. ],
  344. 'tutorAcompaniaBienPractica' => [
  345. 'tituloPregunta' => '¿Te sentiste acompañado/a por el profesor/a durante la etapa práctica?',
  346. 'respuestas' => $respuestasCuatroNiveles,
  347. 'totalRespuestas' => 0
  348. ],
  349. 'tutorResolutivoEnPracticas' => [
  350. 'tituloPregunta' => '¿Facilitó la resolución de posibles dudas o incidencias surgidas durante las prácticas?',
  351. 'respuestas' => $respuestasCuatroNiveles,
  352. 'totalRespuestas' => 0
  353. ],
  354. 'tutorProporcionaMaterialEnPracticas' => [
  355. 'tituloPregunta' => '¿Te proporcionó los materiales necesarios para el desarrollo de las prácticas?',
  356. 'respuestas' => $respuestasCuatroNiveles,
  357. 'totalRespuestas' => 0
  358. ],
  359. 'valoracionTutorPracticas' => [
  360. 'tituloPregunta' => 'En general, ¿cómo valorarías el tutor/a de prácticas en una escala del 1 al 10?',
  361. 'respuestas' => $respuestasEscala10,
  362. 'totalRespuestas' => 0
  363. ],
  364. 'opinionDuracionCursoEnGeneral' => [
  365. 'tituloPregunta' => '¿Qué te ha parecido la duración del curso formativo en general?',
  366. 'respuestas' => [
  367. 'Muy adecuada, se ajustó bien a los contenidos y ritmo' => 0,
  368. 'Adecuada, aunque podría haber sido un poco más extensa' => 0,
  369. 'Demasiado larga para el contenido impartido' => 0,
  370. 'Demasiado corta, no dio tiempo a profundizar lo suficiente' => 0
  371. ],
  372. 'totalRespuestas' => 0
  373. ],
  374. 'valoracionGeneralFormacion' => [
  375. 'tituloPregunta' => 'En general, ¿cómo valorarías la formación en su conjunto en una escala del 1 al 10?',
  376. 'respuestas' => $respuestasEscala10,
  377. 'totalRespuestas' => 0
  378. ],
  379. 'proyectosInmediatos' => [
  380. 'tituloPregunta' => 'A partir de tu participación en el curso, ¿cuáles son tus proyectos más inmediatos en relación con la formación?',
  381. 'respuestas' => [
  382. 'Buscar trabajo relacionado con mi nueva formación' => 0,
  383. 'Retomar y completar mis estudios' => 0,
  384. 'Realizar nuevos cursos de formación, profundizando en el sector del curso realizado' => 0,
  385. 'Realizar nuevos cursos de formación, en temática diferente al curso realizado' => 0,
  386. 'Otro' => 0
  387. ],
  388. 'totalRespuestas' => 0
  389. ],
  390. ];
  391. }
  392. // Esta función se utiliza en la vista detalle del curso, en la de test de evaluación.
  393. public function estadisticaTestEvaluacion(Curso $curso): array
  394. {
  395. $alumnos = $this->em->getRepository(Alumno::class)
  396. ->createQueryBuilder('a')
  397. ->join('a.solicitud', 's')
  398. ->join('s.curso', 'c')
  399. ->andWhere('c = :curso')
  400. ->setParameter('curso', $curso)
  401. ->getQuery()
  402. ->getResult();
  403. $result = $this->getEstructuraPreguntasBase();
  404. // Mapa de claves a recorrer
  405. $claves = array_keys($result);
  406. /** @var Alumno $a */
  407. foreach ($alumnos as $a) {
  408. $test = $a->getTestEvaluacion();
  409. if (!$test) {
  410. continue;
  411. }
  412. $respuestasTest = $test->getRespuestas();
  413. foreach ($claves as $clave) {
  414. if (!isset($respuestasTest[$clave])) {
  415. continue;
  416. }
  417. $this->acumularRespuestas($result, $respuestasTest[$clave], $clave);
  418. }
  419. }
  420. // Calcular porcentajes
  421. foreach ($claves as $clave) {
  422. $total = $result[$clave]['totalRespuestas'] ?: 1;
  423. foreach ($result[$clave]['respuestas'] as &$valor) {
  424. $valor = number_format(($valor / $total) * 100, 2);
  425. }
  426. }
  427. return $result;
  428. }
  429. // Función que se usa en la función "estadisticaTestEvaluacion".
  430. private function acumularRespuestas(array &$result, array|string $respuesta, string $clave): void
  431. {
  432. // Asegurar que siempre trabajamos con un array
  433. $respuestas = is_array($respuesta) ? $respuesta : [$respuesta];
  434. foreach ($respuestas as $r) {
  435. if (!isset($result[$clave]['respuestas'][$r])) {
  436. continue; // ignorar respuestas inesperadas
  437. }
  438. $result[$clave]['respuestas'][$r]++;
  439. $result[$clave]['totalRespuestas']++;
  440. }
  441. }
  442. // Esta función permite obtener los campos de importes estimados y reales del financiero de un curso.
  443. public function obtenerImportesEstimadosRealesFinanciero(Curso $curso): array
  444. {
  445. $plazas = $curso->getAforoTitulares() ?? 0;
  446. $precioHoraFormador = $curso->getCosteHoraFormacion() ?? 0;
  447. $totalHorasEnSegCurso = $curso->getHorasDuracion() ?? 0; // $curso->getHorasDuracion()/60/60
  448. $totalHorasCursoFormador = $totalHorasEnSegCurso/60/60;
  449. $totalDiasCursoAlumno = round($totalHorasEnSegCurso/60/60/5); // Redondeamos hacia arriba o abajo según dijeron.
  450. $costeDiaAsistenciaAlumno = $curso->getCosteDiaAsistencia() ?? 0;
  451. $personasFormadas = $this->em->getRepository(Alumno::class)->obtenerPersonasFormadas($curso);
  452. $numAlumnosPersonaFormada = count($personasFormadas);
  453. $totalDiasAlumnos = 0;
  454. /** @var Alumno $persona */
  455. foreach ($personasFormadas as $persona) {
  456. $totalDiasAsisteAlumno = $totalDiasCursoAlumno;
  457. foreach($persona->getAsistencias() as $asistencia) {
  458. if ($asistencia->getTipo()->getId() === 2) {
  459. $totalDiasAsisteAlumno -= $asistencia->getHorasEnSegundos() / 60 / 60 / 5;
  460. }
  461. }
  462. $totalDiasAsisteAlumno = max(0, $totalDiasAsisteAlumno); // Si es negativa, se pone a 0.
  463. $totalDiasAlumnos += $totalDiasAsisteAlumno;
  464. }
  465. return [
  466. 'importeEstimadoFormadores' => $precioHoraFormador * $plazas * $totalHorasCursoFormador,
  467. 'importeEstimadoAlumnos' => $plazas * $costeDiaAsistenciaAlumno * $totalDiasCursoAlumno,
  468. 'importeRealFormadores' => $precioHoraFormador * $numAlumnosPersonaFormada * $totalHorasCursoFormador,
  469. 'importeRealAlumnos' => $costeDiaAsistenciaAlumno * $totalDiasAlumnos
  470. ];
  471. }
  472. /**
  473. * @throws MpdfException
  474. * @throws SyntaxError
  475. * @throws RuntimeError
  476. * @throws LoaderError
  477. */
  478. public function generarPdfInfoCurso(Curso $curso, string $dest = Destination::FILE): void
  479. {
  480. // Cargar plantilla
  481. $fs = new Filesystem();
  482. $nombreFichero = md5(uniqid()).'.docx';
  483. $carpetaFichero = "tmp";
  484. $nombreCompleto = "$carpetaFichero/$nombreFichero";
  485. $datosPlantilla = [
  486. 'nombreCurso' => $curso->getNombre(),
  487. 'localidad' => $curso->getLocalidad()->getNombre(),
  488. 'ayudaMaxima' => $curso->getAyudaMaxima() ? "{$curso->getAyudaMaxima()}€" : 'No indicado',
  489. 'nivelAcceso' => $curso->getNivelFormativo()->getDescripcionNivelPlantilla(),
  490. 'descripcionCurso' => $curso->getDescripcionCurso(),
  491. 'horasFormacionEspecifica' => $curso->getHorasFormacionEspecifica()/60/60,
  492. 'horasFormacionTransversal' => $curso->getHorasFormacionTransversal()/60/60,
  493. 'horasFormacionComplementaria' => $curso->getHorasFormacionComplementaria()/60/60,
  494. 'horasTutoriaEspecifica' => $curso->getHorasTutoriaEspecifica()/60/60,
  495. 'horasTutoriaPractica' => $curso->getHorasTutoriaPractica()/60/60,
  496. 'horasPracticaProfesional' => $curso->getHorasPracticaProfesional()/60/60,
  497. ];
  498. $cuerpo = $this->environment->render('plantillas-pdf/pdf-a4-info-curso.html.twig', $datosPlantilla);
  499. $cabecera = "
  500. <div>
  501. <img style='width: 30mm' src='assets/img/logo-cabecera-pdfs.png' alt=''>
  502. </div>
  503. ";
  504. $pie = "
  505. <div style='font-size: 7px; text-align: center;'>
  506. <img src='assets/img/logo-pie-pdfs.png' alt=''>
  507. </div>
  508. <div style='font-size: 12px; border: 0; text-align: right'>
  509. {PAGENO}/{nb}
  510. </div>
  511. ";
  512. $mpdf = new mPDF(['setAutoBottomMargin' => 'stretch']);
  513. // $mpdf->showImageErrors = true;
  514. $mpdf->SetHTMLHeader($cabecera);
  515. $mpdf->SetHTMLFooter($pie);
  516. $mpdf->AddPage('P','','','','',20,20,35,100,10,5);
  517. $mpdf->WriteHTML($cuerpo);
  518. if (!$fs->exists($carpetaFichero)) {
  519. $fs->mkdir($carpetaFichero);
  520. }
  521. if ($dest === Destination::FILE) {
  522. $mpdf->Output($nombreCompleto, Destination::FILE);
  523. } else {
  524. $mpdf->Output();
  525. }
  526. }
  527. }