xls_asistenciasprofesor_all.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. setlocale(LC_TIME, 'es_MX.UTF-8');
  3. require_once("../../include/nocache.php");
  4. require_once("../../include/constantes.php");
  5. require_once("../../include/bd_pdo.php");
  6. require_once("../../include/util.php");
  7. require_once("../../classes/ValidaSesion.php");
  8. require "../../include/phpSpreadsheet/autoload.php";
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  10. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  11. use PhpOffice\PhpSpreadsheet\Style\Border;
  12. use PhpOffice\PhpSpreadsheet\Style\Fill;
  13. use PhpOffice\PhpSpreadsheet\Style\Style;
  14. use PhpOffice\PhpSpreadsheet\Shared\Date;
  15. $pag = "../reporte_asistenciasprofesor.php";
  16. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  17. $objSesion = new ValidaSesion($pdo, array(72, 81), APSA);
  18. if(!$objSesion->tieneAcceso()){
  19. header("Location: ".$pag."?error=3");
  20. exit();
  21. }
  22. unset($objValida);
  23. if(!isset($_POST["fecha_inicial"]) || !isset($_POST["fecha_final"]) || !isset($_POST["area"]) || !isset($_POST["desc"]) /*|| !isset($_POST["periodo"])*/){
  24. //header("Location: ".$pag."?error=0");
  25. echo "<h1>Error, no se recibieron los datos</h1>";
  26. exit();
  27. }
  28. //$filter_periodo = filter_input(INPUT_POST, "periodo", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  29. $filter_periodo = $_SESSION["periodo_id"];
  30. //Periodo
  31. $stmt = $pdo->prepare('Select * from fs_periodo(:id, NULL, NULL, NULL)');
  32. $stmt->bindParam(":id", $filter_periodo);
  33. if(!$stmt->execute()){
  34. $errorDesc = "Ocurrió un error al cargar el periodo";
  35. }else{
  36. $periodo_rs = $stmt->fetch();
  37. }
  38. $stmt->closeCursor();
  39. //Obtiene profesores
  40. if(isset($_POST["fecha_inicial"]) && $_POST["fecha_inicial"]!=""){
  41. $filter_fini = trim(filter_input(INPUT_POST, "fecha_inicial", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  42. }
  43. if(isset($_POST["fecha_final"]) && $_POST["fecha_final"]!=""){
  44. $filter_ffin = trim(filter_input(INPUT_POST, "fecha_final", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  45. }
  46. if(isset($_POST["hora_inicial"]) && $_POST["hora_inicial"]!=""){
  47. $filter_hini = trim(filter_input(INPUT_POST, "hora_inicial", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  48. }else{
  49. $filter_hini = '00:00';
  50. }
  51. if(isset($_POST["hora_final"]) && $_POST["hora_final"]!=""){
  52. $filter_hfin = trim(filter_input(INPUT_POST, "hora_final", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  53. }else{
  54. $filter_hfin = '23:59';
  55. }
  56. $query = "";
  57. if(isset($_POST["desc"]) && $_POST["desc"] != ""){
  58. $query .= ":desc,";
  59. $filter_desc = trim(filter_input(INPUT_POST, "desc", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  60. }else{
  61. $query .= "NULL,";
  62. }
  63. if(isset($_POST["clave"]) && $_POST["clave"] != ""){
  64. $query .= ":clave,";
  65. $filter_clave = filter_input(INPUT_POST, "clave", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  66. }else{
  67. $query .= "NULL,";
  68. }
  69. if(isset($_POST["area"]) && is_numeric($_POST["area"]) && trim($_POST["area"]) != ""){
  70. $query .= ":area,";
  71. $filter_area = filter_input(INPUT_POST, "area", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  72. }else{
  73. $query .= "NULL,";
  74. }
  75. $hoy_fecha = date("Y-m-d");
  76. if(isset($filter_fini)) $fecha_ini = fechaGuion($filter_fini); else $fecha_ini = $periodo_rs["Periodo_fecha_inicial"];
  77. if(isset($filter_ffin)){
  78. $fecha_fin = fechaGuion($filter_ffin);
  79. }else{
  80. if($periodo_rs["Periodo_fecha_final"] < $hoy_fecha){
  81. $fecha_fin = $periodo_rs["Periodo_fecha_final"];
  82. }else{
  83. $fecha_fin = $hoy_fecha;
  84. }
  85. }
  86. $stmt = $pdo->prepare('Select * from fs_asistenciaprofesores_all(:per, :fini, :ffin, :hini, :hfin, '.$query.' 0, NULL)');//sólo activos
  87. $stmt->bindParam(":per", $filter_periodo);
  88. $stmt->bindParam(":fini", $fecha_ini);
  89. $stmt->bindParam(":ffin", $fecha_fin);
  90. $stmt->bindParam(":hini", $filter_hini);
  91. $stmt->bindParam(":hfin", $filter_hfin);
  92. if(isset($filter_desc)) $stmt->bindParam(":desc", $filter_desc);
  93. if(isset($filter_clave)) $stmt->bindParam(":clave", $filter_clave);
  94. if(isset($filter_area)) $stmt->bindParam(":area", $filter_area);
  95. if(!$stmt->execute()){
  96. $errorDesc = "Ocurrió un error al cargar los profesores";
  97. print_r($stmt->errorInfo());
  98. }else{
  99. $profesores_rs = $stmt->fetchAll();
  100. }
  101. $stmt->closeCursor();
  102. //--------
  103. //
  104. // Create new Spreadsheet object
  105. $spreadsheet = new Spreadsheet();
  106. // Set document properties
  107. $spreadsheet->getProperties()->setCreator('Ingeniería La Salle')
  108. ->setLastModifiedBy('Ingeniería La Salle')
  109. ->setTitle('Asistencias profesores')
  110. ->setDescription('Reporte de asistencia de profesores.');
  111. // Rename worksheet
  112. $spreadsheet->getActiveSheet()->setTitle('Asistencias');
  113. $headerStyle = new Style();
  114. $headerStyle->applyFromArray(
  115. [
  116. 'fill' => [
  117. 'fillType' => Fill::FILL_SOLID,
  118. 'color' => ['argb' => 'FF001d68'],
  119. ],
  120. 'borders' => [
  121. 'bottom' => ['borderStyle' => Border::BORDER_THIN],
  122. 'right' => ['borderStyle' => Border::BORDER_MEDIUM],
  123. ],
  124. 'font' => [
  125. 'bold' => true,
  126. 'color' => ['argb' => 'FFFFFFFF'],
  127. ]
  128. ]
  129. );
  130. $colorRojo = 'ffce0e2d';
  131. // Add some data
  132. $spreadsheet->setActiveSheetIndex(0)
  133. ->setCellValue('A1', 'Profesor')
  134. ->setCellValue('B1', 'Clases total')
  135. ->setCellValue('C1', 'Asistencias')
  136. ->setCellValue('D1', 'Reposiciones')
  137. ->setCellValue('E1', 'Faltas')
  138. ->setCellValue('F1', 'Retardos')
  139. ->setCellValue('G1', '% Asistencia')
  140. ->setCellValue('H1', '% Retardos');
  141. $spreadsheet->getActiveSheet()->duplicateStyle($headerStyle, 'A1:H1');
  142. $highestRow = count($profesores_rs)+1;
  143. //Centrar números
  144. $spreadsheet->getActiveSheet()->getStyle('B2:F'.$highestRow)->getAlignment()->setHorizontal('center');
  145. $spreadsheet->getActiveSheet()->getStyle('E2:E'.$highestRow)->getFont()->getColor()->setARGB($colorRojo);
  146. $spreadsheet->getActiveSheet()->getStyle('G2:H'.($highestRow))
  147. ->getNumberFormat()
  148. ->setFormatCode(
  149. \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_PERCENTAGE_00
  150. );
  151. $row = 2;
  152. foreach($profesores_rs as $profesor){
  153. $col = 1;
  154. $faltas = $profesor["Faltas"];
  155. $porcentaje_asistencia = 0;
  156. $porcentaje_retardo = 0;
  157. if( ($profesor["Asistencias"] == "" && $profesor["Reposiciones"] == "") || ($profesor["Asistencias"] + $profesor["Reposiciones"]) == 0){
  158. $faltas = $profesor["Clases_total"];
  159. }else if($profesor["Clases_total"] > 0){
  160. $porcentaje_asistencia = (($profesor["Asistencias"] + $profesor["Reposiciones"])/$profesor["Clases_total"]);
  161. $porcentaje_retardo = ($profesor["Retardos"]/($profesor["Asistencias"] + $profesor["Reposiciones"]));
  162. }
  163. $spreadsheet->setActiveSheetIndex(0)
  164. ->setCellValueByColumnAndRow($col++, $row, $profesor["Usuario_apellidos"]." ".$profesor["Usuario_nombre"])
  165. ->setCellValueByColumnAndRow($col++, $row, $profesor["Clases_total"])
  166. ->setCellValueByColumnAndRow($col++, $row, $profesor["Asistencias"])
  167. ->setCellValueByColumnAndRow($col++, $row, $profesor["Reposiciones"])
  168. ->setCellValueByColumnAndRow($col++, $row, $faltas)
  169. ->setCellValueByColumnAndRow($col++, $row, $profesor["Retardos"])
  170. ->setCellValueByColumnAndRow($col++, $row, $porcentaje_asistencia)
  171. ->setCellValueByColumnAndRow($col++, $row, $porcentaje_retardo);
  172. if($porcentaje_asistencia == 0){
  173. $spreadsheet->getActiveSheet()->getStyle('G'.$row)
  174. ->getFont()->getColor()->setARGB($colorRojo);
  175. }
  176. $row++;
  177. }
  178. //$spreadsheet->getActiveSheet()->getStyle('A1:H1')->getFont()->setBold(true);
  179. $spreadsheet->getActiveSheet()->setAutoFilter($spreadsheet->getActiveSheet()->calculateWorksheetDimension());
  180. //Auto ajustar anchos
  181. $spreadsheet->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
  182. $spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
  183. $spreadsheet->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
  184. $spreadsheet->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);
  185. $spreadsheet->getActiveSheet()->getColumnDimension('E')->setAutoSize(true);
  186. $spreadsheet->getActiveSheet()->getColumnDimension('F')->setAutoSize(true);
  187. $spreadsheet->getActiveSheet()->getColumnDimension('G')->setAutoSize(true);
  188. $spreadsheet->getActiveSheet()->getColumnDimension('H')->setAutoSize(true);
  189. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  190. $spreadsheet->setActiveSheetIndex(0);
  191. // Redirect output to a client’s web browser (Xlsx)
  192. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  193. header('Content-Disposition: attachment;filename="asistenciasTotal_'.date("y-m-d").'.xlsx"');
  194. header('Cache-Control: max-age=0');
  195. // If you're serving to IE 9, then the following may be needed
  196. header('Cache-Control: max-age=1');
  197. // If you're serving to IE over SSL, then the following may be needed
  198. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  199. header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
  200. header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  201. header('Pragma: public'); // HTTP/1.0
  202. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  203. $writer->save('php://output');
  204. exit;