pdf_insignias_split.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. // max
  3. ini_set('default_socket_timeout', 6000);
  4. ini_set('max_execution_time', 6000);
  5. // memory limit
  6. ini_set('memory_limit', '-1');
  7. // alpha greek characters
  8. // $alpha = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϊϋ';
  9. // PHP print errors
  10. ini_set('display_errors', 1);
  11. ini_set('display_startup_errors', 1);
  12. error_reporting(E_ALL);
  13. extract($_POST);
  14. // get data from FormData
  15. $alumnos = $_POST['alumnos'];
  16. $fecha_carta = $_POST['fecha_carta'];
  17. $firmado = $_POST['firmado'];
  18. $tamano = $_POST['tamano'];
  19. setlocale(LC_TIME, 'es_MX.UTF-8'); {
  20. require_once("../../include/nocache.php");
  21. require_once("../../include/bd_pdo.php");
  22. require_once("../../include/util.php");
  23. require_once("../../include/constantes.php");
  24. require_once("../../classes/ValidaSesion.php");
  25. include_once('../../include/xTemplate/xtemplate.class.php'); // including mpdf.php
  26. include_once('../../include/mpdf/autoload.php'); // including mpdf.php
  27. require_once("../include/Fechas.php");
  28. require_once('../include/util.php');
  29. require_once('../include/encripcion.php');
  30. }
  31. $pag = "../reporte_insignias.php";
  32. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  33. $objSesion = new ValidaSesion($pdo, 115, GEMA);
  34. if (!$objSesion->tieneAcceso()) {
  35. header("Location: " . $pag . "?error=1");
  36. exit();
  37. }
  38. unset($objValida);
  39. if (!isset($alumnos, $fecha_carta, $firmado, $tamano)) {
  40. header("Location: " . $pag . "?error=0");
  41. exit();
  42. } else {
  43. // echo $fecha_carta;
  44. // exit;
  45. }
  46. # Function to query the database and return the result
  47. function query(string $sql, array $bind_params = [], bool $print = false)
  48. {
  49. global $pdo, $pag;
  50. if ($print) {
  51. echo $sql;
  52. print_r($bind_params);
  53. exit;
  54. }
  55. $stmt = $pdo->prepare($sql);
  56. foreach ($bind_params as $param => $value)
  57. $stmt->bindParam($param, $value);
  58. if (!$stmt->execute()) {
  59. $pdo->rollBack();
  60. header("Location:" . $pag . "?error=2");
  61. //print_r($stmt->errorInfo());
  62. exit();
  63. }
  64. $result_set = $stmt->fetchAll();
  65. $stmt->closeCursor();
  66. $stmt = null;
  67. return $result_set;
  68. }
  69. $defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
  70. /********* FONTS **********/
  71. $fontDirs = $defaultConfig['fontDir'];
  72. $defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
  73. $fontData = $defaultFontConfig['fontdata'] + ['indivisatext' => [
  74. 'R' => '../../fonts/indivisaFont/ttf/IndivisaTextSans-Regular.ttf',
  75. 'I' => '../../fonts/indivisaFont/ttf/IndivisaTextSans-RegularItalic.ttf',
  76. 'B' => '../../fonts/indivisaFont/ttf/IndivisaTextSans-Bold.ttf',
  77. 'BI' => '../../fonts/indivisaFont/ttf/IndivisaTextSans-BoldItalic.ttf',
  78. ]] + ['indivisadisplay' => [
  79. 'R' => '../../fonts/indivisaFont/ttf/IndivisaDisplaySans-Regular.ttf',
  80. 'I' => '../../fonts/indivisaFont/ttf/IndivisaDisplaySans-RegularItalic.ttf',
  81. 'B' => '../../fonts/indivisaFont/ttf/IndivisaDisplaySans-Heavy.ttf',
  82. 'BI' => '../../fonts/indivisaFont/ttf/IndivisaDisplaySans-HeavyItalic.ttf',
  83. ]] + ['fontawesome' => [
  84. 'R' => '../../fonts/fa/fa-regular-400.ttf',
  85. 'B' => '../../fonts/fa/fa-solid-900.ttf',
  86. ]];
  87. /********* CONFIGURACIÓN INICIAL **********/
  88. $config = [
  89. 'mode' => 'utf-8', 'format' => 'Letter',
  90. 'margin_header' => 12, 'margin_top' => 25, 'margin_left' => 15, 'margin_right' => 15, 'margin_footer' => 4,
  91. 'fontDir' => array_merge($fontDirs, [__DIR__]), 'fontdata' => $fontData, 'default_font' => 'indivisatext'
  92. ];
  93. /********* TEMPLATE **********/
  94. $carta = new XTemplate('../tpl/carta.tpl.html');
  95. $carta->parse('header');
  96. $carta->parse('footer');
  97. /********* PDF **********/
  98. # FIRMAS DE LOS DIRECTORES
  99. $carta->assign("FECHA", fechaConstancia($fecha_carta));
  100. $folder_temporal = "zip/pdf_" . str_replace("/", "-", $fecha_carta);
  101. if (file_exists($folder_temporal))
  102. removeFolder($folder_temporal);
  103. mkdir($folder_temporal, 0777, true);
  104. // delete all zip file in the folder zip
  105. try {
  106. $files = glob('./zip/*.zip');
  107. foreach ($files as $file) {
  108. if (is_file($file)) {
  109. unlink($file);
  110. }
  111. }
  112. } catch (Exception $e) {
  113. echo 'Caught exception: ', $e->getMessage(), "\n";
  114. }
  115. $zip = new ZipArchive;
  116. $zip_name = "zip/cartas_insignias.zip";
  117. if ($zip->open($zip_name, ZipArchive::CREATE) !== TRUE) {
  118. exit("No se pudo crear el archivo zip");
  119. }
  120. //$firmas_id = [8, 27];
  121. $firmas_id = [1, 12];
  122. # Get firmas from fs_constanciafirma function
  123. $firmas = query('SELECT * FROM fs_constanciafirma(NULL, true) as c INNER JOIN "Puesto" p ON c."Usuario_id"=p."Usuario_id" WHERE p."Puesto_id" IN (' . implode(',', $firmas_id) . ")");
  124. if (!$firmas) {
  125. ?>
  126. <p>
  127. <strong>ERROR:</strong> No se encontraron firmas de los directores.
  128. </p>
  129. <?php
  130. exit;
  131. }
  132. // INSIGNIAS -> DESCRIPCIÓN
  133. for ($i = 0; $i < 2; $i++) {
  134. $carta->assign("NOMBRE$i", $firmas[$i]["ConstanciaFirma_grado"] . ' ' . $firmas[$i]["ConstanciaFirma_nombre"]);
  135. $carta->assign("CARGO$i", $firmas[$i]["ConstanciaFirma_puesto"]);
  136. }
  137. $marca = 'INSIGNIAS ' . fechaGuion($fecha_carta) . ' | '; //No acepta caracteres especiales
  138. generaMarcaDeAgua($marca, "zip/");
  139. $carta->assign('MARCA', 'zip/marca.png');
  140. for ($i = 1; $i <= 2; $i++)
  141. $carta->assign("FIRMA$i", $firmado ? $firmas[$i - 1]["ConstanciaFirma_imagen"] : "fondo.png");
  142. $carta->parse('main.firmas');
  143. $totalAlumnos = count($alumnos) - 1;
  144. $alumnosConInsignias = 0;
  145. foreach ($alumnos as $alumno_key => $alumno_id) {
  146. $mpdf = new \Mpdf\Mpdf($config);
  147. $mpdf->SHYlang = 'es';
  148. $mpdf->SetHTMLHeader($carta->text('header'));
  149. $mpdf->SetHTMLFooter($carta->text('footer'));
  150. $mpdf->SetTitle("Insignias | $fecha_carta");
  151. $mpdf->SetAuthor('Facultad de Ingeniería. © Universidad La Salle A.C. 2022 Todos los derechos Reservados.');
  152. /********* HOJA DE ESTILOS **********/
  153. $mpdf->WriteHTML('<link rel="stylesheet" href="../css/' . $estilo . '">');
  154. $insignias_rs = query('SELECT * FROM fs_insigniareportealumno(:id_alumno)', [':id_alumno' => $alumno_id]);
  155. if (empty($insignias_rs)) continue;
  156. else
  157. // add insignia
  158. $alumnosConInsignias++;
  159. $alumno_carta = new XTemplate('../tpl/carta.tpl.html');
  160. // new zip file
  161. $usuario_rs = query('SELECT * FROM fs_alumno(:id_alumno, NULL)', [':id_alumno' => $alumno_id]);
  162. $usuario = $usuario_rs[0];
  163. // TÍTULO
  164. $alumno = $usuario['Usuario_nombre'] . ' ' . $usuario['Usuario_apellidos'];
  165. $mpdf->WriteHTML($alumno_carta->text("resumen"));
  166. $alumno_carta->assign('ALUMNO', $alumno);
  167. $carrera = mb_strtoupper($usuario['Carrera_desc'], 'UTF-8');
  168. $alumno_carta->assign('CARRERA', $carrera);
  169. $alumno_carta->parse("main.titulo");
  170. $mpdf->WriteHTML($alumno_carta->text("main.titulo"));
  171. foreach ($insignias_rs as $key => $insignia) {
  172. # if the insignia tipo is new
  173. if ($key == 0 || $insignia["InsigniaTipo_desc"] != $insignias_rs[$key - 1]["InsigniaTipo_desc"]) {
  174. $alumno_carta->assign('INSIGNIA_TIPO', $insignia["InsigniaTipo_desc"]);
  175. $alumno_carta->assign('INSIGNIA_COLOR', $insignia["InsigniaTipo_color"]);
  176. $alumno_carta->parse('main.insignias.tipo');
  177. $mpdf->writeHTML($alumno_carta->text("main.insignia.tipo"));
  178. }
  179. $alumno_carta->assign('INSIGNIA_TITULO', $insignia["Insignia_titulo"]);
  180. $alumno_carta->assign('ESPACIO', $tamano);
  181. $alumno_carta->assign('INSIGNIA_DESCRIPCION', $insignia["Insignia_desc"]);
  182. # If fecha inicial is the same as fecha final
  183. // if insignia is general entonces query fecha
  184. if (!$insignia["InsigniaTipo_general"]) {
  185. $fecha_inicial = date_create($insignia["InsigniaPersonal_fecha_inicial"]);
  186. $fecha_final = date_create($insignia["InsigniaPersonal_fecha_final"]);
  187. # If fecha inicial is the same as fecha final
  188. if ($fecha_inicial == $fecha_final || $insignia["InsigniaPersonal_fecha_inicial"] == null) {
  189. $alumno_carta->assign('INSIGNIA_FECHA', Fechas::romanizaFecha($fecha_final));
  190. } else {
  191. $alumno_carta->assign('INSIGNIA_FECHA', Fechas::estandarizaDia($fecha_inicial, $fecha_final, 'ultimos'));
  192. }
  193. } else {
  194. $reglas_rs = query('SELECT * FROM fs_insigniageneralreglas(:id_insignia)', [':id_insignia' => $insignia["Insignia_id"]])[0];
  195. $fecha_inicial = date_create($reglas_rs["CalendarioEvento_fecha"]);
  196. switch ($reglas_rs["CalendarioReglas_intervalo"]) {
  197. case 1: {
  198. $fecha_final = date_create($reglas_rs["CalendarioReglas_fecha_final"]);
  199. // add one day to fecha_inicial
  200. $tipo = (new DateTime($fecha_inicial->format('Y-m-d')))->modify('+1 day') == $fecha_final ? 'ultimos' : 'rango';
  201. $alumno_carta->assign('INSIGNIA_FECHA', Fechas::estandarizaDia($fecha_inicial, $fecha_final, $tipo));
  202. break; // diario
  203. }
  204. case 2:
  205. $alumno_carta->assign('INSIGNIA_FECHA', "Pendiente semanal");
  206. break; // semanal
  207. case 3:
  208. $alumno_carta->assign('INSIGNIA_FECHA', "Pendiente mensual");
  209. break; // mensual
  210. default:
  211. $alumno_carta->assign('INSIGNIA_FECHA', Fechas::romanizaFecha($fecha_inicial));
  212. break; // una vez
  213. }
  214. }
  215. $alumno_carta->assign('FOLIO', encripta($alumno_id . ',' . $insignia['Insignia_id']));
  216. $llevaLínea = isset($insignias_rs[$key + 1]) && $insignias_rs[$key + 1]["InsigniaTipo_desc"] == $insignia["InsigniaTipo_desc"];
  217. $alumno_carta->assign('INSIGNIA_LINEA', $llevaLínea ? 'linea' : '');
  218. $alumno_carta->parse('main.insignias.descripcion');
  219. $alumno_carta->parse('main.insignias.descripcion.calendar');
  220. $alumno_carta->parse('main.insignias');
  221. }
  222. # Prevent the blank page at the end of the document
  223. $mpdf->WriteHTML($alumno_carta->text('main.insignias'));
  224. if ($mpdf->y > 180.0) $mpdf->AddPage();
  225. $mpdf->WriteHTML($carta->text('main.firmas'));
  226. $mpdf->SetProtection(array('print', 'print-highres'), '', md5(time()));
  227. $mpdf->Output("$folder_temporal/cartas_" . $usuario["Usuario_claveULSA"] . ".pdf", 'F');
  228. // destroy mpdf object
  229. unset($mpdf);
  230. $zip->addFile("$folder_temporal/cartas_{$usuario["Usuario_claveULSA"]}.pdf", "insignias_{$usuario["Usuario_claveULSA"]}.pdf");
  231. }
  232. #removeFolder($folder_temporal);
  233. header("Content-Type: application/zip");
  234. header("Content-Disposition: attachment; filename=".basename($zip_name));
  235. header("Pragma: no-cache");
  236. header("Expires: 0");
  237. ob_end_clean();
  238. flush();
  239. readfile($zip_name);
  240. # unlink($zip_name);
  241. function removeFolder($folderName)
  242. {
  243. if (is_dir($folderName))
  244. $folderHandle = opendir($folderName);
  245. if (!$folderHandle)
  246. return false;
  247. while ($file = readdir($folderHandle)) {
  248. if ($file != "." && $file != "..") {
  249. if (!is_dir($folderName . "/" . $file))
  250. unlink($folderName . "/" . $file);
  251. else
  252. removeFolder($folderName . '/' . $file);
  253. }
  254. }
  255. closedir($folderHandle);
  256. rmdir($folderName);
  257. return true;
  258. }