calificaciones_grupo.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/bd_pdo.php");
  4. require_once("../include/util.php");
  5. require_once("../classes/ValidaSesion.php");
  6. require_once("../classes/MainMenu.php");
  7. $menu = 8;
  8. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  9. $objSesion = new ValidaSesion($pdo, array(24,85), APSA);
  10. if(!$objSesion->tieneAcceso()){
  11. echo $_SESSION["usuario_id"]. " Sin permiso"; exit();
  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/custominputfile.css" type="text/css">
  28. <script src="../js/util.js"></script>
  29. </head>
  30. <body>
  31. <div>
  32. <?php
  33. //--- Objeto que pinta menu
  34. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Captura de calificaciones finales");//usr, menu, pdo, sist
  35. $menuObj->printMenu();
  36. $filter_prof = $_SESSION["usuario_id"];
  37. if(!empty($_POST["prof"])){
  38. $filter_prof = filter_input(INPUT_POST, "prof", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  39. }
  40. if(!empty($_POST["materia"])){
  41. $tmp = $_POST["materia"];
  42. $tmpArr = explode("|", $tmp);
  43. $filter_materia = intval($tmpArr[0]);
  44. $filter_grupo = intval($tmpArr[1]);
  45. unset($tmp);
  46. unset($tmpArr);
  47. }
  48. //Materias
  49. $stmt = $pdo->prepare('Select * from fs_materiasprofesor(:per, :usr)');
  50. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  51. $stmt->bindParam(":usr", $filter_prof);
  52. if(!$stmt->execute()){
  53. $errorDesc = "Ocurrió un error al leer los datos de la materia";
  54. }else{
  55. $materias_rs = $stmt->fetchAll();
  56. }
  57. $stmt->closeCursor();
  58. //Fecha límite
  59. $stmt = $pdo->prepare('Select * from fs_periodo(:per, NULL, NULL, NULL)');
  60. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  61. if(!$stmt->execute()){
  62. $errorDesc = "Ocurrió un error al leer los datos de la materia";
  63. }else{
  64. $fecha_rs = $stmt->fetch();
  65. $fecha_limite = date('Y-m-d', strtotime($fecha_rs["Periodo_fecha_final"]. ' + 9 days'));
  66. $fecha_min = date('Y-m-d', strtotime($fecha_rs["Periodo_fecha_inicial"]. ' - 7 days'));
  67. unset($fecha_rs);
  68. }
  69. $stmt->closeCursor();
  70. //--Manejo de errores y mensajes de exito
  71. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  72. switch ($_GET["error"]){
  73. case 0: $errorDesc = "No se recibieron los datos correctamente."; break;
  74. case 1: $errorDesc = "No es una extensión válida. Solo se aceptan archivos .PDF. Sube los archivos de nuevo."; break;
  75. case 2: $errorDesc = "Ocurrió un error al insertar los archivos."; break;
  76. case 3: $errorDesc = "Ocurrió un error al subir los archivos"; break;
  77. }
  78. }
  79. if(isset($_GET["ok"]) && is_numeric($_GET["ok"])){
  80. switch ($_GET["ok"]){
  81. case 0: $successDesc = "Los archivos se cargaron correctamente."; break;
  82. }
  83. }
  84. ?>
  85. <main class="container-fluid content marco">
  86. <?php include_once("../include/errorMessage.php"); ?>
  87. <?php include("../include/periodoCambio.php");?>
  88. <!-- Filtro -->
  89. <div class="row">
  90. <div class="col-12">
  91. <form action="calificaciones_grupo.php" method="post" onsubmit="return valida()">
  92. <div class="form-box">
  93. <?php
  94. if($_SESSION["sgi_administrador"] || $_SESSION["jefe_carrera"]){
  95. if($_SESSION["sgi_administrador"]){
  96. $stmt = $pdo->prepare('Select * from fs_profesoresareahoras(:per, NULL, NULL, 1, 0, NULL)');
  97. }else{
  98. $stmt = $pdo->prepare('Select * from fs_profesoresareahoras_jefe(:per, :usr, NULL, 1, 0, NULL)');
  99. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  100. }
  101. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  102. if(!$stmt->execute()){
  103. $errorDesc = "Ocurrió un error al cargar los profesores";
  104. }else{
  105. $profesor_rs = $stmt->fetchAll();
  106. }
  107. $stmt->closeCursor();
  108. ?>
  109. <div class="form-group row">
  110. <label for="filter_prof" class="col-4 col-form-label">Profesor</label>
  111. <div class="col-6 ">
  112. <div id="dlProfesor" class="datalist datalist-select mb-1 w-100">
  113. <div class="datalist-input">Selecciona un profesor</div>
  114. <span class="ing-buscar icono"></span>
  115. <ul style="display:none">
  116. <?php foreach($profesor_rs as $prof) {
  117. $nombre = $prof["Usuario_apellidos"]." ".$prof["Usuario_nombre"];
  118. ?>
  119. <li data-id="<?php echo $prof["Usuario_id"];?>" <?php if($filter_prof == $prof["Usuario_id"]){ echo 'class="selected"'; }?> ><?php echo $nombre;?></li>
  120. <?php }?>
  121. </ul>
  122. <input type="hidden" id="filter_prof" name="prof" value="">
  123. </div>
  124. </div>
  125. </div>
  126. <?php }?>
  127. <div class="form-group row">
  128. <label for="filter_grupo" class="col-4 col-form-label">Materia</label>
  129. <div class="col-6 ">
  130. <div id="dlMateria" class="datalist datalist-select mb-1 w-100">
  131. <div class="datalist-input">Selecciona una materia</div>
  132. <span class="ing-buscar icono"></span>
  133. <ul style="display:none">
  134. <?php if(isset($materias_rs)){ ?>
  135. <?php foreach($materias_rs as $materia) {
  136. $nombre = $materia["Grupo_desc"]." ".$materia["Carrera_prefijo"]." - ".$materia["Materia_desc"];
  137. ?>
  138. <li data-id="<?php echo $materia["Materia_id"]."|".$materia["Grupo_id"];?>" <?php if($filter_materia == $materia["Materia_id"] && $filter_grupo == $materia["Grupo_id"]){ echo 'class="selected"'; }?>>
  139. <?php echo $nombre;?></li>
  140. <?php }?>
  141. <?php } ?>
  142. </ul>
  143. <input type="hidden" id="filter_materia" name="materia" value="">
  144. </div>
  145. </div>
  146. </div>
  147. </div>
  148. <div class="form-group row">
  149. <div class="col-12 text-center">
  150. <button type="submit" class="btn btn-outline-primary"><?php echo $ICO["aceptar"]; ?> Buscar archivos</button>
  151. </div>
  152. </div>
  153. </form>
  154. </div>
  155. </div>
  156. <?php if(isset($filter_materia) && isset($filter_grupo)){
  157. $hoy = strtotime(date('Y-m-d'));
  158. if($_SESSION["sgi_administrador"] || (!$_SESSION["sgi_administrador"] && $hoy <= strtotime($fecha_limite) && $hoy>= strtotime($fecha_min)) ){//Dentro del tiempo
  159. ?>
  160. <h5 class="text-right">Límite de captura: <?php echo fechaSlash($fecha_limite);?> </h5>
  161. <?php if($objSesion->puedeEditar() && !$_SESSION["sgi_administrador"] && $filter_prof == $_SESSION["usuario_id"] || $_SESSION["sgi_administrador"] ) { ?>
  162. <div class="row">
  163. <div class="col-12 text-right">
  164. <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal" data-tipo="1"><?php echo $ICO["mas"];?> Agregar archivo de calificaciones</button>
  165. </div>
  166. </div>
  167. <?php }
  168. }else{ ?>
  169. <p class="text-center text-danger">Fuera del periodo de captura</p>
  170. <?php
  171. }
  172. ?>
  173. <?php
  174. //Archivos
  175. $stmt = $pdo->prepare('Select * from fs_archivocalificacionmaterias(:mat, :gpo, :per)');
  176. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  177. $stmt->bindParam(":gpo", $filter_grupo);
  178. $stmt->bindParam(":mat", $filter_materia);
  179. if(!$stmt->execute()){
  180. $errorDesc = "Ocurrió un error al leer los datos del archivo";
  181. }else{
  182. $archivo_rs = $stmt->fetchAll();
  183. }
  184. $stmt->closeCursor();
  185. ?>
  186. <div id="archivos_block">
  187. <div class="row justify-content-center my-5">
  188. <div class="col-12 col-sm-8 table-responsive">
  189. <table class="table table-sm table-striped table-white">
  190. <thead class="thead-dark">
  191. <tr >
  192. <th>Nombre</th>
  193. <th>Fecha</th>
  194. <th>Acciones</th>
  195. </tr>
  196. </thead>
  197. <tbody>
  198. <?php foreach($archivo_rs as $arc){ ?>
  199. <tr id="id<?php echo $arc["CalificacionArchivo_id"];?>" data-id="<?php echo $arc["CalificacionArchivo_id"];?>" data-file="<?php echo $arc["CalificacionArchivo_archivo"];?>">
  200. <td ><?php echo $arc["CalificacionArchivo_nombre"];?></td>
  201. <td class="text-center"><?php echo date("d/m/Y h:i:s", strtotime($arc["CalificacionArchivo_fecha"])); ?></td>
  202. <td class="text-center icono-acciones">
  203. <a href="./files/calificaciones/<?php echo $_SESSION["periodo_id"]; ?>/<?php echo $arc["CalificacionArchivo_archivo"];?>" target="_blank" title="Ver archivo"><?php echo $ICO["ver"];?></a>
  204. <?php if($_SESSION["sgi_administrador"] || (!$_SESSION["sgi_administrador"] && $hoy <= strtotime($fecha_limite) && $_SESSION["usuario_id"] == $arc["Usuario_id"] ) ){//Dentro del tiempo ?>
  205. <?php if($objSesion->puedeEditar() && !$_SESSION["sgi_administrador"] && $filter_prof == $_SESSION["usuario_id"] || $_SESSION["sgi_administrador"]){ ?>
  206. <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><?php echo $ICO["borrar2"];?></a>
  207. <?php } ?>
  208. <?php } ?>
  209. </td>
  210. </tr>
  211. <?php } ?>
  212. </tbody>
  213. </table>
  214. </div>
  215. </div>
  216. </div>
  217. <?php }?>
  218. </main>
  219. <!--- FOOTER--->
  220. <?php require_once("../include/footer.php"); ?>
  221. <!-- Modal -->
  222. <?php if($objSesion->puedeEditar() && !$_SESSION["sgi_administrador"] && $filter_prof == $_SESSION["usuario_id"] || $_SESSION["sgi_administrador"]){ ?>
  223. <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  224. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  225. <div class="modal-content">
  226. <div class="modal-header">
  227. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Archivo de calificaciones</span>
  228. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  229. <span aria-hidden="true">&times;</span>
  230. </button></h4>
  231. </div>
  232. <div class="modal-body">
  233. <form method="post" action="./action/calificaciones_grupo_insert.php" enctype="multipart/form-data" id="formFile" onsubmit="return validaArchivos()">
  234. <input type="hidden" name="prof" value="<?php echo $filter_prof;?>">
  235. <input type="hidden" name="materia" value="<?php echo $filter_materia;?>">
  236. <input type="hidden" name="grupo" value="<?php echo $filter_grupo;?>">
  237. <!--<input type="file" name="file">-->
  238. <p>Sube los archivos .pdf con las calificaciones finales. Escribe un nombre para que puedas identificar los archivos en caso de que necesites reemplazarlos.</p>
  239. <div class="form-box" id="archivos-list">
  240. <!--
  241. <div class="form-group row archivo-block mb-3 d-none">
  242. <input type="text" maxlength="50" class="form-control nombre" placeholder="Nombre">
  243. <div class="col-12 col-sm-6">
  244. <input type="file" accept="application/pdf">
  245. <div class="invalid-feedback"><?php echo $ICO["alerta"];?> Selecciona un archivo.</div>
  246. </div>
  247. <div class="col-12 col-sm-2">
  248. <button type="button" class="btn btn-outline-danger btn-quita d-none"><?php echo $ICO["borrar"];?></button>
  249. </div>
  250. </div>-->
  251. <div class="form-group row archivo-block mb-3">
  252. <div class="col-12 col-sm-4 barra-right">
  253. <input type="text" maxlength="50" class="form-control nombre" name="nombre[]" placeholder="Nombre" required="required">
  254. </div>
  255. <div class="col-12 col-sm-6 pt-1">
  256. <input type="file" class="archivo" name="archivo[]" required="required" accept="application/pdf">
  257. <div class="invalid-feedback"><?php echo $ICO["alerta"];?> Selecciona un archivo.</div>
  258. </div>
  259. <div class="col-12 col-sm-2">
  260. <button type="button" class="btn btn-outline-danger btn-quita d-none"><?php echo $ICO["borrar"];?></button>
  261. </div>
  262. </div>
  263. </div>
  264. <p class="text-center"><button class="btn btn-outline-secondary" id="btn-agrega"><?php echo $ICO["mas"];?> Agregar más archivos</button></p>
  265. <p class="text-center mt-5"><button type="submit" class="btn btn-outline-primary"><?php echo $ICO["cargar"];?> Enviar archivos</button></p>
  266. </form>
  267. </div>
  268. </div>
  269. </div>
  270. </div>
  271. <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  272. <div class="modal-dialog modal-dialog-centered" role="document">
  273. <div class="modal-content">
  274. <div class="modal-body">
  275. <div class="row">
  276. <div class="col">
  277. <p class="font-weight-bold">¿Estás seguro de que quieres borrar el archivo de calificaciones?</p>
  278. <p>Esta acción no se puede deshacer.</p>
  279. </div>
  280. </div>
  281. </div>
  282. <div class="modal-footer">
  283. <input type="hidden" id="id_borrar" value="">
  284. <input type="hidden" id="file_borrar" value="">
  285. <button type="button" class="btn btn-outline-primary btn-borrar"><?php echo $ICO["aceptar"];?> Borrar</button>
  286. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
  287. </div>
  288. </div>
  289. </div>
  290. </div>
  291. <?php } ?>
  292. </div>
  293. <script src="../js/jquery.min.js"></script>
  294. <script src="../js/bootstrap/popper.min.js"></script>
  295. <script src="../js/bootstrap/bootstrap.min.js"></script>
  296. <script src="../js/sidebarmenu.js"></script>
  297. <script src="../js/datalist.js"></script>
  298. <script src="../js/custominputfile.min-es.js"></script>
  299. <script>
  300. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  301. $(document).on('click', '#dlPeriodo ul li' ,function(){
  302. $("#formaPeriodo").submit();
  303. });
  304. </script>
  305. <script>
  306. setDatalist("#filter_prof", <?php echo $filter_prof; ?>);
  307. $('#dlProfesor ul li').click(function(){
  308. var id = $(this).data('id');
  309. $("#archivos_block").remove();
  310. $.ajax({
  311. url: './action/materiasprofesor_select.php',
  312. type: 'POST',
  313. dataType: 'json',
  314. data: { "id": id },
  315. success: function(result) {
  316. if(result["error"]!= "" && result["error"] !== undefined){
  317. $("#errorBox").collapse('show');
  318. $("#errorBox_text").html(result["error"]);
  319. $('#messageBox')[0].scrollIntoView({ block: "end" });
  320. }else{
  321. html = "";
  322. for(i=0; i<result["materias"].length; i++){
  323. nombre = result["materias"][i]["Grupo_desc"]+" "+result["materias"][i]["Carrera_prefijo"]+" - "+result["materias"][i]["Materia_desc"]
  324. html += '<li data-id="'+result["materias"][i]["Materia_id"]+'|'+result["materias"][i]["Grupo_id"]+'">'+nombre+'</li>';
  325. }
  326. $("#dlMateria ul").html(html);
  327. setDatalistFirst("#filter_materia");
  328. }
  329. },
  330. error: function(jqXHR, textStatus, errorThrown ){
  331. modal.modal('hide');
  332. $("#errorBox").collapse('show');
  333. $("#errorBox_text").html(errorThrown);
  334. $('#messageBox')[0].scrollIntoView({ block: "end" });
  335. }
  336. });//ajax
  337. });
  338. function valida(){
  339. invalidDatalist("#filter_materia", false);
  340. if($("#filter_materia").val() == '' || $("#filter_materia").val() == 0 ){
  341. invalidDatalist("#filter_materia", true);
  342. return false;
  343. }
  344. return true;
  345. }
  346. function validaArchivos(){
  347. var error = false;
  348. $.each($('#archivos-list .archivo'), function(){
  349. if($(this).val() == ''){
  350. error = true;
  351. $(this).addClass("is-invalid");
  352. }
  353. });
  354. return !error;
  355. }
  356. $(document).on( "click", "#btn-agrega", function(event){
  357. var size = $("#archivos-list >.archivo-block").length;
  358. var cloned = $("#archivos-list >.archivo-block:first-child").clone(true).appendTo("#archivos-list");
  359. //cloned.removeClass("d-none");
  360. //cloned.find("input").attr("name", "archivo[]").attr("required", true).addClass("archivo");
  361. cloned.find("input").val("");
  362. if(size >= 1){
  363. $("#archivos-list .btn-quita").removeClass("d-none");
  364. }
  365. //$("#archivos_num").val(size);
  366. });
  367. $(".btn-quita").click(function(){//quita contacto
  368. $(this).parents(".archivo-block").remove();
  369. var size = $("#archivos-list >.archivo-block").length;
  370. if(size <= 2){
  371. $("#archivos-list .btn-quita").addClass("d-none");
  372. }
  373. //$("#archivos_num").val(size-1);
  374. });
  375. $(document).ready(function(){
  376. $('#modal_confirm').on('show.bs.modal', function (event) {
  377. var button = $(event.relatedTarget); // Button that triggered the modal
  378. var id = button.parents("tr").data("id");
  379. var file = button.parents("tr").data("file");
  380. $("#id_borrar").val(id);
  381. $("#file_borrar").val(file);
  382. });
  383. $(".btn-borrar").click(function(){
  384. var id = $("#id_borrar").val();
  385. var file = $("#file_borrar").val();
  386. $.ajax({
  387. url: './action/calificaciones_grupo_delete.php',
  388. type: 'POST',
  389. dataType: 'json',
  390. data: { "id": id, "file":file},
  391. success: function(result) {
  392. if(result["error"]!= "" && result["error"] !== undefined){
  393. $("#errorBox").collapse('show');
  394. $("#errorBox_text").html(result["error"]);
  395. }else{
  396. $("#successBox").collapse('show');
  397. $("#successBox_text").html(result["ok"]);
  398. $("#id"+id).remove();
  399. }
  400. $('#messageBox')[0].scrollIntoView({ block: "end" });
  401. },
  402. error: function(jqXHR, textStatus, errorThrown ){
  403. $("#errorBox").collapse('show');
  404. $("#errorBox_text").html(errorThrown);
  405. $('#messageBox')[0].scrollIntoView({ block: "end" });
  406. }
  407. });//ajax
  408. $('#modal_confirm').modal("hide");
  409. });
  410. /* $('#archivo').customFile({
  411. allowed: ['xls', 'xlsx'],
  412. maxFiles: 1,
  413. maxKBperFile: 20*1024,
  414. popup : {
  415. active : true, // false if you don’t like popup messages
  416. autoclose : true, // or false
  417. delay : 4000 // delay for close (in miliseconds), of course, if autoclose is set true
  418. }
  419. });*/
  420. });
  421. </script>
  422. </body>
  423. </html>