reporte_asistenciasadmin.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/bd_pdo.php");
  4. require_once("../classes/ValidaSesion.php");
  5. require_once("../classes/MainMenu.php");
  6. require_once("../include/util.php");
  7. $menu = 7;
  8. $submenu = 73;
  9. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  10. $objSesion = new ValidaSesion($pdo, $submenu, APSA);
  11. if(!$objSesion->tieneAcceso()){
  12. $objSesion->terminaSesion();
  13. }
  14. $objSesion->validaPeriodoUsuario();//si no tiene periodo manda a main
  15. ?>
  16. <!DOCTYPE html>
  17. <html lang="es" prefix="og: http://ogp.me/ns#">
  18. <head>
  19. <title>APSA - Facultad de Ingeniería</title>
  20. <meta charset="utf-8">
  21. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  22. <link rel="icon" type="image/png" href="../img/favicon.png" />
  23. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  24. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  25. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  26. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  27. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  28. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  29. <script src="../js/util.js"></script>
  30. </head>
  31. <body>
  32. <div>
  33. <?php
  34. //--- Objeto que pinta menu
  35. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Asistencias de administrativos");//usr, menu, pdo, sist
  36. $menuObj->printMenu();
  37. //Obtiene profesores
  38. $query = "";
  39. if(isset($_POST["fecha_inicial"])){
  40. $filter_fini = trim(filter_input(INPUT_POST, "fecha_inicial", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  41. }
  42. if(isset($_POST["fecha_final"])){
  43. $filter_ffin = trim(filter_input(INPUT_POST, "fecha_final", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  44. }
  45. if(isset($_POST["desc"])){
  46. $query .= ":desc,";
  47. $filter_desc = trim(filter_input(INPUT_POST, "desc", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  48. }else{
  49. $query .= "NULL,";
  50. }
  51. if(isset($filter_fini)) $fecha_ini = $filter_fini; else $fecha_ini = date('Y-m-d', strtotime('-7 days'));
  52. if(isset($filter_ffin)) $fecha_fin = $filter_ffin; else $fecha_fin = date("Y-m-d");
  53. $stmt = $pdo->prepare('Select * from fs_usuariochecador(:fini, '.$query.' 0, '.MAX_ROWS.')');//sólo activos
  54. $stmt->bindParam(":fini", $fecha_ini);
  55. //$stmt->bindParam(":ffin", $fecha_fin);
  56. if(isset($filter_desc)) $stmt->bindParam(":desc", $filter_desc);
  57. if(!$stmt->execute()){
  58. $errorDesc = "Ocurrió un error al cargar los profesores";
  59. print_r($stmt->errorInfo());
  60. }else{
  61. $admin_rs = $stmt->fetchAll();
  62. }
  63. $stmt->closeCursor();
  64. ?>
  65. <main class="container-fluid content marco">
  66. <?php include_once("../include/errorMessage.php"); ?>
  67. <?php
  68. if(isset($admin_rs) ){
  69. ?>
  70. <!-- Filtro -->
  71. <div class="row">
  72. <div class="col-12">
  73. <form action="" method="post">
  74. <div class="form-box form-box-info">
  75. <div class="form-group row">
  76. <label for="fecha_inicial" class="col-4 col-form-label text-right">Fecha inicial *</label>
  77. <div class="col-8 col-sm-4">
  78. <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);?>">
  79. </div>
  80. </div>
  81. <div class="form-group row">
  82. <label for="fecha_final" class="col-4 col-form-label text-right">Fecha final *</label>
  83. <div class="col-8 col-sm-4">
  84. <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); ?>">
  85. </div>
  86. </div>
  87. <div class="form-group row">
  88. <label for="filter_desc" class="col-4 col-form-label text-right">Nombre administrativo</label>
  89. <div class="col-8 col-sm-4">
  90. <input id="filter_desc" name="desc" type="text" class="form-control" <?php if(isset($filter_desc) ){echo 'value="'.$filter_desc.'"';}?>>
  91. </div>
  92. </div>
  93. </div>
  94. <div class="form-group row">
  95. <div class="col-12 text-center">
  96. <button type="submit" class="btn btn-outline-primary"><?php echo $ICO["buscar"]; ?> Filtrar</button>
  97. <button type="button" class="btn btn-outline-danger btn-reset"><?php echo $ICO["borrar"]?> Limpiar</button>
  98. </div>
  99. </div>
  100. </form>
  101. </div>
  102. </div>
  103. <div class="row">
  104. <div class="col-12 table-responsive">
  105. <p>Se muestran los primeros <strong><?php echo MAX_ROWS;?></strong> resultados. Utiliza los filtros para encontrar el usuario que buscas.</p>
  106. <p><?php echo $ICO["alerta"]?> Para las asistencias se considera el horario administrativo autorizado actualmente.</p>
  107. <table class="table table-sm table-striped table-white">
  108. <thead class="thead-dark">
  109. <tr class="row">
  110. <th class="col-6">Administrativo</th>
  111. <th class="col-2">Total</th>
  112. <th class="col-3">Asistencia</th>
  113. <th class="col-1">Detalle</th>
  114. </tr>
  115. </thead>
  116. <tbody>
  117. <?php
  118. foreach($admin_rs as $admin){
  119. ?>
  120. <tr data-id="<?php echo $admin["Usuario_id"]; ?>" class="row">
  121. <td class="col-6"><?php echo $admin["Usuario_apellidos"]." ".$admin["Usuario_nombre"]; ?></td>
  122. <?php
  123. $stmt = $pdo->prepare('Select
  124. COUNT("Fecha")::integer AS "Total_dias",
  125. COUNT("Asistencia_checador_inicial")::integer "Asistencias", SUM(CASE WHEN "Asistencia_isRetardo" THEN 1 ELSE 0 END)::integer AS "Retardos",
  126. 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"
  127. FROM fs_asistenciaadministrativo(:fini, :ffin, :id)');//sólo activos
  128. $stmt->bindParam(":id", $admin["Usuario_id"]);
  129. $stmt->bindParam(":fini", $fecha_ini);
  130. $stmt->bindParam(":ffin", $fecha_fin);
  131. if(!$stmt->execute()){
  132. echo "<td colspan='3'>Ocurrió un error al cargar las asistencias</td>";
  133. print_r($stmt->errorInfo());
  134. }else{
  135. $fechas_rs = $stmt->fetch();
  136. if($fechas_rs["Total_dias"] > 0){
  137. $asist = round($fechas_rs["Asistencias"]*100/$fechas_rs["Total_dias"]);
  138. //$asist = sprintf('%0.2f', $asist);
  139. }else
  140. $asist = 0;
  141. ?>
  142. <td class="text-center col-2">
  143. <?php echo $fechas_rs["Total_dias"];?>
  144. </td>
  145. <td class="col-3">
  146. <div class="progress" style="height: 24px;">
  147. <?php if($fechas_rs["Asistencias"] > 0){ ?>
  148. <div class="progress-bar bg-secondary" role="progressbar" title="Asistencias <?php echo $fechas_rs["Asistencias"];?>" style="width: <?php echo $asist;?>%" aria-valuenow="<?php echo $asist;?>" aria-valuemin="0" aria-valuemax="100" ><?php echo $asist."%";?></div>
  149. <div class="progress-bar bg-info" role="progressbar" title="Faltas <?php echo $fechas_rs["Total_dias"]-$fechas_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>
  150. <?php } else{ ?>
  151. <div class="progress-bar bg-info" role="progressbar" title="Faltas <?php echo $fechas_rs["Total_dias"]?>" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">Sin asistencias</div>
  152. <?php }?>
  153. </div>
  154. </td>
  155. <td class="text-center col-1"><span class="pointer btn-detalle"><?php echo $ICO["ver"]?></span></td>
  156. <?php
  157. }//sin error
  158. $stmt->closeCursor();
  159. //Subquery Select * from fs_asistenciaadministrativo(:fini, :ffin, :id) <- Agrupar resultados
  160. /*if($admin["Total_dias"] > 0)
  161. $asist = $admin["Asistencias"]*100/$admin["Total_dias"];
  162. else
  163. $asist = 0;*/
  164. //$ret = $admin["Retardos"]*100/$admin["Total_dias"];
  165. //$just = $admin["Justificados"]*100/$admin["Total_dias"];
  166. //$admin["Reposiciones"]
  167. ?>
  168. </tr>
  169. <?php
  170. }//foreach prof
  171. ?>
  172. </tbody>
  173. </table>
  174. </div>
  175. </div>
  176. <?php } ?>
  177. </main>
  178. <!--- FOOTER--->
  179. <?php require_once("../include/footer.php"); ?>
  180. <!-- Modal -->
  181. <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  182. <div class="modal-dialog modal-dialog-centered" role="document">
  183. <div class="modal-content">
  184. <div class="modal-body">
  185. <table class="table table-sm table-striped table-white">
  186. <thead class="thead-dark">
  187. <tr>
  188. <th>Fecha</th><th>Registro</th><th>Estado</th>
  189. </tr>
  190. </thead>
  191. <tbody id="asistencia_lista">
  192. <tr>
  193. <td class="fecha text-center"></td>
  194. <td class="registro text-center"></td>
  195. <td class="estado text-center"></td>
  196. </tr>
  197. </tbody>
  198. </table>
  199. </div>
  200. <div class="modal-footer">
  201. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cerrar</button>
  202. </div>
  203. </div>
  204. </div>
  205. </div>
  206. </div>
  207. <script src="../js/jquery.min.js"></script>
  208. <script src="../js/jquery-ui.js"></script>
  209. <script src="../js/datepicker-es.js"></script>
  210. <script src="../js/bootstrap/popper.min.js"></script>
  211. <script src="../js/bootstrap/bootstrap.min.js"></script>
  212. <script src="../js/sidebarmenu.js"></script>
  213. <script>
  214. var _periodo_fecha_inicial = "<?php echo fechaSlash($fecha_ini); ?>";
  215. var _periodo_fecha_final = "<?php echo fechaSlash($fecha_fin); ?>";
  216. var datepickerOptions = { dateFormat: "dd/mm/yy" };
  217. $(document).on( "click", ".btn-reset", function(event){
  218. var forma = $(this).parents("form");
  219. forma.find("input[type=text]").val("");
  220. forma.find("select").prop("selectedIndex",0);
  221. $("#fecha_inicial").val(_periodo_fecha_inicial);
  222. $("#fecha_final").val(_periodo_fecha_final);
  223. forma.submit();
  224. });
  225. $(document).ready(function(){
  226. $(".date-picker" ).datepicker(datepickerOptions);
  227. $(".date-picker" ).datepicker( $.datepicker.regional[ "es" ] );
  228. $('.btn-detalle').click(function(){
  229. var id = $(this).parents("tr").data("id");
  230. $.ajax({
  231. url: './action/asistenciasadmin_select.php',
  232. type: 'POST',
  233. dataType: 'json',
  234. data: { id: id , fechaini: _periodo_fecha_inicial, fechafin:_periodo_fecha_final},
  235. success: function(result) {
  236. if(result["error"]!= "" && result["error"] !== undefined){
  237. $("#errorBox").collapse('show');
  238. $("#errorBox_text").html(result["error"]);
  239. $('#messageBox')[0].scrollIntoView({ block: "end" });
  240. }else{
  241. $("#asistencia_lista").find(".fecha").html("");
  242. $("#asistencia_lista").find(".registro").html("");
  243. $("#asistencia_lista").find(".estado").html("");
  244. var rows = $("#asistencia_lista > tr").length;//cuenta accesos actuales
  245. if(rows > result["asistenciaArr"].length){//sobran
  246. //borrar renglones extra (rows - result.length) pero dejar al menos 1
  247. while(rows > result["asistenciaArr"].length && rows > 1){
  248. $("#asistencia_lista tr:last-child").remove();
  249. rows--;
  250. }
  251. }else{//faltan
  252. // clone the rest of the rows
  253. for(var i=0; i<(result["asistenciaArr"].length - rows); i++){
  254. $("#asistencia_lista tr:first-child").clone(true).appendTo("#asistencia_lista");
  255. }
  256. }
  257. if(result["asistenciaArr"].length != 0){//hay accesos?
  258. $("#asistencia_lista").children().each(function(index) {
  259. if(index < result["asistenciaArr"].length){//llenar info
  260. $(this).find(".fecha").html(result["asistenciaArr"][index]["fecha"]);
  261. $(this).find(".registro").html(result["asistenciaArr"][index]["registro"]);
  262. $(this).find(".estado").html(result["asistenciaArr"][index]["estado"]);
  263. }
  264. });
  265. }
  266. $('#modal').modal("show");
  267. }
  268. },
  269. error: function(jqXHR, textStatus, errorThrown ){
  270. $('#messageBox')[0].scrollIntoView({ block: "end" });
  271. $("#errorBox").collapse('show');
  272. $("#errorBox_text").html(errorThrown);
  273. }
  274. });//ajax
  275. });
  276. });
  277. </script>
  278. </body>
  279. </html>