miasistencia.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?php
  2. ini_set('display_errors', 1);
  3. ini_set('display_startup_errors', 1);
  4. error_reporting(E_ALL);
  5. require_once("../include/constantes.php");
  6. require_once("../include/bd_pdo.php");
  7. require_once("../classes/ValidaSesion.php");
  8. require_once("../classes/MainMenu.php");
  9. require_once("../include/util.php");
  10. $menu = 2;
  11. $submenu = 22;
  12. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  13. $objSesion = new ValidaSesion($pdo, $submenu, APSA);
  14. if(!$objSesion->tieneAcceso()){
  15. $objSesion->terminaSesion();
  16. }
  17. $objSesion->validaPeriodoUsuario();//si no tiene periodo manda a main
  18. ?>
  19. <!DOCTYPE html>
  20. <html lang="es" prefix="og: http://ogp.me/ns#">
  21. <head>
  22. <title>APSA - Facultad de Ingeniería</title>
  23. <meta charset="utf-8">
  24. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  25. <link rel="icon" type="image/png" href="../img/favicon.png" />
  26. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  27. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  28. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  29. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  30. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  31. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  32. <script src="../js/util.js"></script>
  33. </head>
  34. <body>
  35. <div>
  36. <?php
  37. //--- Objeto que pinta menu
  38. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Mis asistencias");//usr, menu, pdo, sist
  39. $menuObj->printMenu();
  40. //Periodo
  41. $stmt = $pdo->prepare('Select * from fs_periodo(:id, NULL, NULL, NULL)');
  42. $stmt->bindParam(":id", $_SESSION["periodo_id"]);
  43. if(!$stmt->execute()){
  44. $errorDesc = "Ocurrió un error al cargar el periodo";
  45. }else{
  46. $periodo_rs = $stmt->fetch();
  47. }
  48. $stmt->closeCursor();
  49. //Periodo
  50. $stmt = $pdo->prepare('Select "Usuario_claveULSA" from "Usuario_view" WHERE "Usuario_id" = :id ');
  51. $stmt->bindParam(":id", $_SESSION["usuario_id"]);
  52. if(!$stmt->execute()){
  53. print_r($stmt->errorInfo());
  54. $errorDesc = "Ocurrió un error al cargar los datos de usuario".$_SESSION["usuario_id"];
  55. }else{
  56. $usr_rs = $stmt->fetch();
  57. }
  58. $stmt->closeCursor();
  59. //Obtiene fechas
  60. if(isset($_POST["fecha_inicial"])){
  61. $filter_fini = trim(filter_input(INPUT_POST, "fecha_inicial", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  62. }
  63. if(isset($_POST["fecha_final"])){
  64. $filter_ffin = trim(filter_input(INPUT_POST, "fecha_final", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  65. }
  66. if(isset($filter_fini)) $fecha_ini = fechaGuion($filter_fini); else $fecha_ini = $periodo_rs["Periodo_fecha_inicial"];
  67. //if(isset($filter_ffin)) $fecha_fin = fechaGuion($filter_ffin); else $fecha_fin = $periodo_rs["Periodo_fecha_final"];
  68. $hoy_fecha = date("Y-m-d");
  69. //if($fecha_fin > $hoy_fecha ) $fecha_fin = $hoy_fecha;
  70. if(isset($filter_ffin)){
  71. $fecha_fin = fechaGuion($filter_ffin);
  72. }else{
  73. if($periodo_rs["Periodo_fecha_final"] < $hoy_fecha){
  74. $fecha_fin = $periodo_rs["Periodo_fecha_final"];
  75. }else{
  76. $fecha_fin = $hoy_fecha;
  77. }
  78. }
  79. if($_SESSION["profesor"]){
  80. $stmt = $pdo->prepare('Select * from fs_miasistenciaprofesor(:per, :usr, :fini, :ffin)');//sólo activos
  81. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  82. $stmt->bindParam(":fini", $fecha_ini);
  83. $stmt->bindParam(":ffin", $fecha_fin);
  84. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  85. if(!$stmt->execute()){
  86. $errorDesc = "Ocurrió un error al cargar el total de asistencias de profesor";
  87. print_r($stmt->errorInfo());
  88. }else{
  89. $asistenciasProf_rs = $stmt->fetch();
  90. }
  91. $stmt->closeCursor();
  92. $stmt = $pdo->prepare("Select * from fs_asistenciaprofesores(:per, :fini, :ffin, '00:00:00', '23:00:00', NULL, :clave, NULL, 0, ".MAX_ROWS.")");//sólo activos
  93. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  94. $stmt->bindParam(":fini", $fecha_ini);
  95. $stmt->bindParam(":ffin", $fecha_fin);
  96. $stmt->bindParam(":clave", $usr_rs['Usuario_claveULSA']);
  97. if(!$stmt->execute()){
  98. $errorDesc = "Ocurrió un error al cargar las asistencias del profesor";
  99. print_r($stmt->errorInfo());
  100. }else{
  101. $profesores_rs = $stmt->fetchAll();
  102. }
  103. $stmt->closeCursor();
  104. }
  105. if($_SESSION["administrativo"]){
  106. $stmt = $pdo->prepare('Select
  107. COUNT("Fecha")::integer AS "Total_dias",
  108. COUNT("Asistencia_checador_inicial")::integer "Asistencias", SUM(CASE WHEN "Asistencia_isRetardo" THEN 1 ELSE 0 END)::integer AS "Retardos",
  109. SUM(CASE WHEN "Asistencia_isJustificada" then 1 else 0 end)::integer AS "Justificados", SUM(CASE WHEN "Asistencia_isReposicion" THEN 1 ELSE 0 END)::integer AS "Reposiciones"
  110. FROM fs_asistenciaadministrativo(:fini, :ffin, :id)');//sólo activos
  111. $stmt->bindParam(":id", $_SESSION["usuario_id"]);
  112. $stmt->bindParam(":fini", $fecha_ini);
  113. $stmt->bindParam(":ffin", $fecha_fin);
  114. /*if(!$stmt->execute()){
  115. $errorDesc = "Ocurrió un error al cargar las asistencias de docente";
  116. print_r($stmt->errorInfo());
  117. }else{
  118. $asistenciasAdmin_rs = $stmt->fetch();
  119. }*/
  120. if($stmt->execute()){
  121. $asistenciasAdmin_rs = $stmt->fetch();
  122. }
  123. $stmt->closeCursor();
  124. }
  125. //echo 'Select * from fs_miasistenciaprofesor('.$_SESSION["periodo_id"].', '.$_SESSION["usuario_id"].' , '.$fecha_ini.', '.$fecha_fin.')';//sólo activos
  126. ?>
  127. <main class="container-fluid content marco">
  128. <?php include_once("../include/errorMessage.php"); ?>
  129. <?php include("../include/periodoCambio.php");?>
  130. <?php
  131. if(isset($periodo_rs)){
  132. ?>
  133. <!-- Filtro -->
  134. <div class="row justify-content-md-center">
  135. <div class="col-12">
  136. <form action="" method="post">
  137. <div class="form-box form-box-info">
  138. <div class="form-group row">
  139. <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial *</label>
  140. <div class="col-8 col-sm-4">
  141. <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php echo fechaSlash($fecha_ini);?>">
  142. </div>
  143. </div>
  144. <div class="form-group row">
  145. <label for="fecha_final" class="col-4 col-form-label">Fecha final *</label>
  146. <div class="col-8 col-sm-4">
  147. <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php echo fechaSlash($fecha_fin); ?>">
  148. </div>
  149. </div>
  150. </div>
  151. <div class="form-group row">
  152. <div class="col-12 text-center">
  153. <button type="submit" class="btn btn-outline-primary"><?php echo $ICO["buscar"]; ?> Filtrar</button>
  154. <button type="button" class="btn btn-outline-danger btn-reset"><?php echo $ICO["borrar"]?> Limpiar</button>
  155. </div>
  156. </div>
  157. </form>
  158. </div>
  159. </div>
  160. <?php if($_SESSION["profesor"]){ ?>
  161. <ul class="nav nav-tabs" id="myTab" role="tablist">
  162. <li class="nav-item">
  163. <a class="nav-link active" id="tab2-tab" data-toggle="tab" href="#tab2" role="tab" aria-controls="lista" aria-selected="false">Total</a>
  164. </li>
  165. <li class="nav-item">
  166. <a class="nav-link" id="tab1-tab" data-toggle="tab" href="#tab1" role="tab" aria-controls="calendario" aria-selected="true">Asistencia diaria</a>
  167. </li>
  168. </ul>
  169. <?php } ?>
  170. <div class="tab-content" id="horariosTabContent">
  171. <div class="tab-pane fade pt-4 show active" id="tab2" role="tabpanel" aria-labelledby="tab2-tab">
  172. <div class="row">
  173. <?php if(isset($asistenciasProf_rs)){?>
  174. <div class="col-md-6 col-12 px-4 table-responsive">
  175. <h3>Asistencias Profesor</h3>
  176. <?php
  177. if($periodo_rs["Periodo_fecha_inicial"] > $hoy_fecha){//no empieza el periodo
  178. ?>
  179. <p><span class="ing-lg alerta"><?php echo $ICO["alerta"];?></span> No puedes consultar asistencias de este periodo ya que aún no comienza.</p>
  180. <?php
  181. }else{//ya empezó el periodo
  182. ?>
  183. <table class="table table-sm table-white">
  184. <thead class="thead-dark">
  185. <tr class="row" >
  186. <th class="col-2">Clases total</th>
  187. <th class="col-6">Asistencia</th>
  188. <th class="col-4">Retardos</th>
  189. </tr>
  190. </thead>
  191. <?php if($asistenciasProf_rs["Clases_total"] != ""){ ?>
  192. <tbody>
  193. <tr class="row">
  194. <td class="col-2 text-center">
  195. <?php echo $asistenciasProf_rs["Clases_total"];?>
  196. </td>
  197. <td class="col-6">
  198. <div class="progress" style="height: 24px;">
  199. <?php if( ($asistenciasProf_rs["Asistencias"]+$asistenciasProf_rs["Reposiciones"]) > 0){?>
  200. <div class="progress-bar bg-success" role="progressbar" title="Asistencias <?php echo $asistenciasProf_rs["Asistencias"]?>" style="width: <?php echo $asistenciasProf_rs["Asistencias"]*100/$asistenciasProf_rs["Clases_total"]; ?>%" aria-valuenow="<?php echo $asistenciasProf_rs["Asistencias"]*100/$asistenciasProf_rs["Clases_total"]; ?>" aria-valuemin="0" aria-valuemax="100"><?php echo round($asistenciasProf_rs["Asistencias"]*100/$asistenciasProf_rs["Clases_total"])."%"; ?></div>
  201. <div class="progress-bar bg-primary" role="progressbar" title="Reposiciones <?php echo $asistenciasProf_rs["Reposiciones"]?>" style="width: <?php echo $asistenciasProf_rs["Reposiciones"]*100/$asistenciasProf_rs["Clases_total"]; ?>%" aria-valuenow="<?php echo $asistenciasProf_rs["Reposiciones"]*100/$asistenciasProf_rs["Clases_total"]; ?>" aria-valuemin="0" aria-valuemax="100"><?php echo round($asistenciasProf_rs["Reposiciones"]*100/$asistenciasProf_rs["Clases_total"])."%";?></div>
  202. <div class="progress-bar bg-info text-primary" role="progressbar" title="Faltas <?php echo $asistenciasProf_rs["Faltas"]?>" style="width: <?php echo $asistenciasProf_rs["Faltas"]*100/$asistenciasProf_rs["Clases_total"]; ?>%" aria-valuenow="<?php echo $asistenciasProf_rs["Faltas"]*100/$asistenciasProf_rs["Clases_total"]; ?>" aria-valuemin="0" aria-valuemax="100"><?php echo round($asistenciasProf_rs["Faltas"]*100/$asistenciasProf_rs["Clases_total"])."%";?></div>
  203. <?php } else {?>
  204. <div class="progress-bar bg-info text-primary" role="progressbar" title="Faltas <?php echo $asistenciasProf_rs["Clases_total"]?>" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">Sin asistencias</div>
  205. <?php } ?>
  206. </div>
  207. </td>
  208. <td class="col-4">
  209. <div class="progress" style="height: 24px;">
  210. <?php
  211. if($asistenciasProf_rs["Retardos"] > 0 && ($asistenciasProf_rs["Asistencias"]+$asistenciasProf_rs["Reposiciones"]) > 0){
  212. $porcentaje_retardo = round($asistenciasProf_rs["Retardos"]*100/($asistenciasProf_rs["Asistencias"]+$asistenciasProf_rs["Reposiciones"]));
  213. ?>
  214. <div class="progress-bar bg-warning" role="progressbar" title="Retardos <?php echo $asistenciasProf_rs["Retardos"]?>" style="width: <?php echo $porcentaje_retardo; ?>%" aria-valuenow="<?php echo $porcentaje_retardo; ?>" aria-valuemin="0" aria-valuemax="100"><?php echo $porcentaje_retardo."%"; ?></div>
  215. <div class="progress-bar bg-info text-primary" role="progressbar" title="En tiempo <?php echo ($asistenciasProf_rs["Asistencias"]+$asistenciasProf_rs["Reposiciones"])-$asistenciasProf_rs["Retardos"]?>" style="width: <?php echo 100-$porcentaje_retardo; ?>%" aria-valuenow="<?php echo 100-$porcentaje_retardo; ?>" aria-valuemin="0" aria-valuemax="100"></div>
  216. <?php } else{
  217. if(($asistenciasProf_rs["Asistencias"]+$asistenciasProf_rs["Reposiciones"]) > 0){ ?>
  218. <div class="progress-bar bg-info text-primary" role="progressbar" title="En tiempo <?php echo ($asistenciasProf_rs["Asistencias"]+$asistenciasProf_rs["Reposiciones"])-$asistenciasProf_rs["Retardos"]?>" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">Siempre en tiempo</div>
  219. <?php } else { ?>
  220. <!--<div class="progress-bar bg-info" role="progressbar" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>-->
  221. <?php
  222. }
  223. } ?>
  224. </div>
  225. </td>
  226. </tr>
  227. </tbody>
  228. <?php } //.if ?>
  229. </table>
  230. <?php }//fin if inicio periodo ?>
  231. </div>
  232. <?php }//fin prof
  233. if(isset($asistenciasAdmin_rs)){
  234. if($asistenciasAdmin_rs["Total_dias"] > 0){
  235. $asist = round($asistenciasAdmin_rs["Asistencias"]*100/$asistenciasAdmin_rs["Total_dias"]);
  236. //$asist = sprintf('%0.2f', $asist);
  237. }else
  238. $asist = 0;
  239. ?>
  240. <div class="col-md-6 col-12 px-4 table-responsive">
  241. <h3>Asistencias Administrativo</h3>
  242. <table class="table table-sm table-white">
  243. <thead class="thead-dark">
  244. <tr class="row">
  245. <th class="col-2">Total</th>
  246. <th class="col-10">Asistencia</th>
  247. </tr>
  248. </thead>
  249. <tbody>
  250. <tr class="row">
  251. <td class="col-2 text-center">
  252. <?php echo $asistenciasAdmin_rs["Total_dias"];?>
  253. </td>
  254. <td class="col-10">
  255. <div class="progress" style="height: 24px;">
  256. <?php if($asistenciasAdmin_rs["Asistencias"] > 0){ ?>
  257. <div class="progress-bar bg-secondary" role="progressbar" title="Asistencias <?php echo $asistenciasAdmin_rs["Asistencias"];?>" style="width: <?php echo $asist;?>%" aria-valuenow="<?php echo $asist;?>" aria-valuemin="0" aria-valuemax="100" ><?php echo $asist."%";?></div>
  258. <div class="progress-bar bg-info" role="progressbar" title="Faltas <?php echo $asistenciasAdmin_rs["Total_dias"]-$asistenciasAdmin_rs["Asistencias"]; ?>" style="width: <?php echo 100-$asist; ?>%" aria-valuenow="<?php echo 100-$asist; ?>" aria-valuemin="0" aria-valuemax="100"><?php echo (100-$asist)."%";?></div>
  259. <?php } else{ ?>
  260. <div class="progress-bar bg-info" role="progressbar" title="Faltas <?php echo $asistenciasAdmin_rs["Total_dias"]?>" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">Sin asistencias</div>
  261. <?php }?>
  262. </div>
  263. </td>
  264. </tr>
  265. </tbody>
  266. </table>
  267. </div>
  268. <?php }//fin admin ?>
  269. </div> <!-- row-->
  270. </div><!-- tab -->
  271. <?php if($_SESSION["profesor"]){ ?>
  272. <div class="tab-pane fade pt-4" id="tab1" role="tabpanel" aria-labelledby="tab1-tab">
  273. <div class="row">
  274. <div class="col-12 table-responsive">
  275. <p>Se muestran los primeros <strong><?php echo MAX_ROWS;?></strong> resultados. Utiliza los filtros para encontrar la asistencia que buscas.</p>
  276. <table class="table table-sm table-striped table-white">
  277. <thead class="thead-dark">
  278. <tr >
  279. <th>Grupo</th>
  280. <th>Materia</th>
  281. <th>Fecha</th>
  282. <th>Hora de clase</th>
  283. <th>Checador</th>
  284. <th>Estatus</th>
  285. </tr>
  286. </thead>
  287. <tbody>
  288. <?php
  289. foreach($profesores_rs as $profesor){
  290. ?>
  291. <tr data-id="<?php echo $profesor["Usuario_id"]; ?>">
  292. <td class="text-center"><?php echo $profesor["Grupo_desc"]." ".$profesor["Carrera_prefijo"]; ?></td>
  293. <td><?php echo $profesor["Materia_desc"];?>
  294. </td>
  295. <td class="text-center text-nowrap"><?php echo fechaSlash($profesor["Fecha"]);?></td>
  296. <td class="text-center"><?php echo date('H:i', strtotime($profesor["Horario_hora"]));?></td>
  297. <td class="text-center"><?php
  298. if(isset($profesor["Asistencia_checador_inicial"]) && $profesor["Asistencia_checador_inicial"] != "")
  299. echo date('H:i', strtotime($profesor["Asistencia_checador_inicial"]));
  300. ?>
  301. </td>
  302. <?php
  303. $colorStatus = '';
  304. $status = '';
  305. if(isset($profesor["Asistencia_isRetardo"]) && $profesor["Asistencia_isRetardo"] !== ""){
  306. if($profesor["Asistencia_isRetardo"]){
  307. $status = "Retardo";
  308. $colorStatus = 'text-warning';
  309. }else{
  310. if($profesor["Asistencia_isJustificada"]){
  311. $status = "Justificada";
  312. $colorStatus = 'text-primary';
  313. }else{
  314. $status = "Asistencia";
  315. $colorStatus = 'text-success';
  316. }
  317. }
  318. }else{
  319. $status = "Sin registro";
  320. $colorStatus = 'text-danger';
  321. }
  322. if($profesor["Asistencia_isReposicion"]) $status.="<br><small>Reposición<small>";
  323. ?>
  324. <td class="text-center <?php echo $colorStatus;?>">
  325. <?php echo $status;?>
  326. </td>
  327. </tr>
  328. <?php
  329. }//foreach prof
  330. ?>
  331. </tbody>
  332. </table>
  333. </div>
  334. </div>
  335. </div><!-- FIN TAB 1-->
  336. <?php }//fin profesor ?>
  337. </div>
  338. <?php }//fin hay periodo?>
  339. </main>
  340. <!--- FOOTER--->
  341. <?php require_once("../include/footer.php"); ?>
  342. </div>
  343. <script src="../js/jquery.min.js"></script>
  344. <script src="../js/jquery-ui.js"></script>
  345. <script src="../js/datepicker-es.js"></script>
  346. <script src="../js/bootstrap/popper.min.js"></script>
  347. <script src="../js/bootstrap/bootstrap.min.js"></script>
  348. <script src="../js/sidebarmenu.js"></script>
  349. <script src="../js/datalist.js"></script>
  350. <script>
  351. var _periodo_fecha_inicial = "<?php echo fechaSlash($periodo_rs["Periodo_fecha_inicial"]); ?>";
  352. var _periodo_fecha_final = "<?php if($periodo_rs["Periodo_fecha_final"] > $hoy_fecha ) echo fechaSlash($hoy_fecha); else echo fechaSlash($periodo_rs["Periodo_fecha_final"]); ?>";
  353. var datepickerOptions = { dateFormat: "dd/mm/yy", /*minDate:_periodo_fecha_inicial,*/ maxDate:_periodo_fecha_final };
  354. $(document).on( "click", ".btn-reset", function(event){
  355. var forma = $(this).parents("form");
  356. forma.find("input[type=text]").val("");
  357. forma.find("select").prop("selectedIndex",0);
  358. $("#fecha_inicial").val(_periodo_fecha_inicial);
  359. $("#fecha_final").val(_periodo_fecha_final);
  360. forma.submit();
  361. });
  362. $(document).ready(function(){
  363. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  364. $(document).on('click', '#dlPeriodo ul li' ,function(){
  365. $("#formaPeriodo").submit();
  366. });
  367. $(".date-picker" ).datepicker(datepickerOptions);
  368. $(".date-picker" ).datepicker( $.datepicker.regional[ "es" ] );
  369. $(".date-picker").blur(function(){
  370. var fechaObj = fechaObjeto($(this).val());
  371. if( fechaObj !== false ){
  372. if(Date.parse(fechaObj) < Date.parse(fechaObjeto(_periodo_fecha_inicial))){
  373. $(this).val(_periodo_fecha_inicial);
  374. }else if(Date.parse(fechaObj) > Date.parse(fechaObjeto(_periodo_fecha_final))){
  375. $(this).val(_periodo_fecha_final);
  376. }
  377. }
  378. });
  379. });
  380. </script>
  381. </body>
  382. </html>