calificaciones_alumnos.php 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  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_once("../classes/MainMenu.php");
  9. include_once('../include/xTemplate/xtemplate.class.php');
  10. $menu = 10;
  11. $submenu = 104;
  12. $pag = "calificaciones_alumnos.php";
  13. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  14. $objSesion = new ValidaSesion($pdo, $submenu, GEMA);
  15. if(!$objSesion->tieneAcceso() || !$objSesion->puedeEditar()){
  16. header("Location: main.php?error=3");
  17. exit();
  18. }
  19. unset($objValida);
  20. $error = false;
  21. //Obtiene datos
  22. $stmt = $pdo->prepare('Select * from fs_tipocalificacion(NULL)');
  23. if(!$stmt->execute()){
  24. //header("Location: ".$pag."?error=2");
  25. $errorDesc = "Error al cargar los tipos de calificación del alumno";
  26. $error = true;
  27. //print_r($stmt->errorInfo());
  28. //exit();
  29. }
  30. $tipo_calif = $stmt->fetchAll();
  31. $stmt->closeCursor();
  32. ?>
  33. <!DOCTYPE html>
  34. <html lang="es" prefix="og: http://ogp.me/ns#">
  35. <head>
  36. <title>GEMA - Facultad de Ingeniería</title>
  37. <meta charset="utf-8">
  38. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  39. <link rel="icon" type="image/png" href="../img/favicon.png" />
  40. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  41. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  42. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  43. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  44. <link rel="stylesheet" href="./css/alumnocardex.css" type="text/css">
  45. <style>
  46. .btn-float{z-index: 100; position: fixed; right: 280px; bottom: 5%;}
  47. @media (max-width: 1200px) {
  48. .btn-float{right: 45%; bottom:0}
  49. }
  50. @media (min-width: 1201px) and (max-width: 1550px) {
  51. .btn-float{right: 80px;}
  52. }
  53. </style>
  54. </head>
  55. <body>
  56. <div>
  57. <?php
  58. //--- Objeto que pinta menu
  59. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, GEMA, "Kardex de calificaciones" );//usr, menu, pdo, sist
  60. $menuObj->printMenu();
  61. if(isset($_POST["clave"]) && !$error){
  62. $filter_clave = filter_input(INPUT_POST, "clave", FILTER_SANITIZE_NUMBER_INT);
  63. $stmt = $pdo->prepare('Select * from fs_alumnobusca(NULL, :clave, NULL, NULL, NULL, NULL, 0, 1)');
  64. $stmt->bindParam(":clave", $filter_clave);
  65. if(!$stmt->execute()){
  66. //header("Location: ".$pag."?error=2");
  67. $errorDesc = "Ocurrió un error al buscar al alumno";
  68. //print_r($stmt->errorInfo());
  69. //exit();
  70. $error = true;
  71. }else{
  72. $alumno_rs = $stmt->fetch();
  73. $stmt->closeCursor();
  74. if($alumno_rs["Usuario_claveULSA"] == ""){
  75. $error = true;
  76. }else{
  77. $stmt = $pdo->prepare('Select * from fs_periodo(NULL, NULL, :nivel, NULL)');
  78. $stmt->bindParam(":nivel", $alumno_rs["Nivel_id"]);
  79. if(!$stmt->execute()){
  80. $errorDesc = "Ocurrió un error al cargar los datos de los periodos.";
  81. $error = true;
  82. }else
  83. $periodo_rs = $stmt->fetchAll();
  84. }
  85. }
  86. }
  87. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  88. switch ($_GET["error"]){
  89. case 0: $errorDesc = "Ocurrió un error al cargar el Kardex."; break;
  90. case 1: $errorDesc = "Ocurrió un error al actualizar el periodo activo."; break;
  91. case 2: $errorDesc = "El periodo no puede ser seleccionado."; break;
  92. case 3: $errorDesc = "No tienes permisos de ingresar a esa sección."; break;
  93. }
  94. }
  95. ?>
  96. <main class="container-fluid content marco">
  97. <?php include_once("../include/errorMessage.php"); ?>
  98. <div class="row">
  99. <div class="col-12">
  100. <form action="<?php echo $pag;?>" method="post">
  101. <div class="form-box form-box-info">
  102. <div class="form-group row">
  103. <label for="filter_clave" class="col-4 col-form-label">Clave ULSA *</label>
  104. <div class="col-8 col-sm-4">
  105. <input type="text" class="form-control" required="required" maxlength="6" id="filter_clave" name="clave" value="<?php if(isset($filter_clave)){ echo $filter_clave;}?>">
  106. </div>
  107. </div>
  108. </div>
  109. <div class="form-group row">
  110. <div class="col-12 text-center">
  111. <button type="submit" class="btn btn-outline-primary"><?php echo $ICO["buscar"]; ?> Buscar</button>
  112. </div>
  113. </div>
  114. </form>
  115. </div>
  116. </div>
  117. <?php if(isset($filter_clave) && $alumno_rs["Usuario_claveULSA"] == ""){?>
  118. <h4 class="text-center text-danger mt-5">No hay alumnos registrados con la clave <?php echo $filter_clave;?></h4>
  119. <?php } ?>
  120. <?php
  121. if(isset($filter_clave) && !$error){
  122. ?>
  123. <div class="row my-4">
  124. <div class="col-12 text-center">
  125. <h3><b><?php echo "[".$alumno_rs["Usuario_claveULSA"]."] ". $alumno_rs["Usuario_apellidos"]." ".$alumno_rs["Usuario_nombre"];?></b></h3>
  126. <h5 class="text-danger mb-3"><b>CURP:</b> <?php echo $alumno_rs["Usuario_curp"];?></h5>
  127. </div>
  128. <div class="col-12 pt-3">
  129. <h4><b><?php echo $alumno_rs["Carrera_desc"]." ".$alumno_rs["PlanEstudio_desc"];?></b></h4>
  130. <p class="mb-0"><b>Fecha de ingreso:</b> <?php echo ucfirst(fechaMonthPicker($alumno_rs["Alumno_fecha_ingreso"]));?></p>
  131. <p class="mb-4"><b>Generación:</b> <?php echo ucfirst(fechaMonthPicker($alumno_rs["Alumno_generacion"]));?></p>
  132. </div>
  133. </div>
  134. <?php
  135. $stmt = $pdo->prepare('Select * from fs_alumnomaterias_cardex(:clave, :plan)');
  136. $stmt->bindParam(":clave", $alumno_rs["Usuario_claveULSA"]);
  137. $stmt->bindParam(":plan", $alumno_rs["PlanEstudio_id"]);
  138. if(!$stmt->execute()){
  139. header("Location: ".$pag."?error=1");
  140. //$errorDesc = "Ocurrió un error al cargar las materias.";
  141. //print_r($stmt->errorInfo());
  142. exit();
  143. //echo $errorDesc;
  144. }
  145. $materias_rs = $stmt->fetchAll();
  146. $stmt->closeCursor();
  147. //formato al RS de materias
  148. $materiasArr = Array();
  149. $m = 0;
  150. $mat_last = -1;
  151. foreach($materias_rs as $mat){
  152. if($mat_last != $mat["Materia_id"]){
  153. if($mat_last != -1){
  154. $materiasArr[$m]["califArr"]=$califArr;
  155. $m++;
  156. }
  157. $mat_last = $mat["Materia_id"];
  158. $califArr = array();
  159. }
  160. $materiasArr[$m] = array("id" => $mat["Materia_id"], "desc" => $mat["Materia_desc"], "clave"=>$mat["Materia_clave"],
  161. "sem"=> $mat["Materia_semestre"], "califArr"=>array(), "reprobada" => true, "comun"=>($mat["Area_hasAlerta"])?0:1);
  162. if($mat["Calificacion_calif"] > 0 || $mat["Calificacion_calif"] === 0 ){//no es null
  163. $califArr[] = array("calif"=>$mat["Calificacion_calif"], "fecha"=>$mat["Calificacion_fecha"], "calif_tipo"=>$mat["TipoCalificacion_id"], "calif_tipo_desc"=>$mat["TipoCalificacion_desc"],
  164. "calif_tipo_corta"=>$mat["TipoCalificacion_desc_corta"], "calif_orden"=>$mat["TipoCalificacion_orden"],
  165. "revalidada"=>$mat["TipoCalificacion_esEquivalencia"], "reprobada"=>(intval($mat["Calificacion_calif"]) <=5)?true:false,
  166. "periodo_id"=>$mat["Periodo_id"], "periodo"=>$mat["Periodo_desc"], "periodo_fecha"=>str_replace("-","", $mat["Periodo_fecha_inicial"]),
  167. "intersemestral"=>($mat["Periodo_intersemestral"])?1:0, "grupo"=>$mat["TipoCalificacion_id"] ==2 ? $mat["Grupo_id"]: "", "borrable"=>(fechaGuion($mat["Calificacion_fecha"])==date("Y-m-d"))?true:false);
  168. }
  169. }
  170. if($mat_last != -1){
  171. $materiasArr[$m]["califArr"]=$califArr;
  172. }
  173. //revisa si la materia ya se aprobó
  174. for($i=0; $i<count($materiasArr); $i++){
  175. for($j=0; $j< count($materiasArr[$i]["califArr"]); $j++){
  176. $materiasArr[$i]["reprobada"] = $materiasArr[$i]["reprobada"] && $materiasArr[$i]["califArr"][$j]["reprobada"];
  177. }
  178. }
  179. //-----
  180. $xtpl = new XTemplate('./tpl/alumnocardex.tpl.html');
  181. $xtpl->assign("LINK", "./export/xls_alumnocardex.php?clave=".$filter_clave);
  182. $xtpl->parse("main.topweb");
  183. $xtpl->assign("CLAVE", $filter_clave);
  184. $maxCol = 5;
  185. $sem = -1;
  186. if($alumno_rs["Nivel_id"] == 1)
  187. $xtpl->assign("SEMESTRE", "Semestre");
  188. else
  189. $xtpl->assign("SEMESTRE", "Cuatrimestre");
  190. $xtpl->assign("COL_SIZE", "12");
  191. foreach($materiasArr as $mat){
  192. if($sem != intval($mat["sem"])){
  193. if($sem != -1){
  194. $xtpl->parse("main.col.semestre");
  195. }
  196. $sem = intval($mat["sem"]);
  197. $xtpl->assign("COLS", $maxCol+2);
  198. $xtpl->assign("NUM", $sem);
  199. }
  200. $xtpl->assign("MATERIA", $mat["desc"]);
  201. $xtpl->assign("MAT_ID", $mat["id"]);
  202. $xtpl->assign("DATA", "id");
  203. $xtpl->assign("VALUE", $mat["id"]);
  204. $xtpl->parse("main.col.semestre.table_row.data");
  205. $xtpl->assign("DATA", "sem");
  206. $xtpl->assign("VALUE", $mat["sem"]);
  207. $xtpl->parse("main.col.semestre.table_row.data");
  208. $xtpl->assign("DATA", "comun");
  209. $xtpl->assign("VALUE", $mat["comun"]);
  210. $xtpl->parse("main.col.semestre.table_row.data");
  211. $xtpl->assign("DATA", "plan");
  212. $xtpl->assign("VALUE", $alumno_rs["PlanEstudio_id"]);
  213. $xtpl->parse("main.col.semestre.table_row.data");
  214. for($c=0; $c < $maxCol; $c++){
  215. if($c < count($mat["califArr"])){
  216. if($mat["califArr"][$c]["calif"] >0)
  217. $xtpl->assign("CALIF", $mat["califArr"][$c]["calif"]);
  218. else{
  219. if($mat["califArr"][$c]["calif_tipo"] == 2)//ordinario
  220. $xtpl->assign("CALIF", "SD");
  221. else
  222. $xtpl->assign("CALIF", "NP");
  223. }
  224. switch($mat["califArr"][$c]["calif_tipo"]){
  225. case 1:
  226. $xtpl->assign("COLOR", "calif-equivalencia");
  227. $xtpl->assign("TIPO", "Equivalencia");
  228. break;
  229. case 2:
  230. if($mat["califArr"][$c]["intersemestral"]==1){
  231. $xtpl->assign("COLOR", "calif-intersemestral");
  232. $xtpl->assign("TIPO", "Intersemestral");
  233. }else{
  234. $xtpl->assign("COLOR", "");
  235. $xtpl->assign("TIPO", "Ordinario");
  236. }
  237. break;
  238. default:
  239. $xtpl->assign("COLOR", "calif-extraordinario");
  240. $xtpl->assign("TIPO", "Extraordinario");
  241. break;
  242. }
  243. $xtpl->assign("DATA", "fecha");
  244. $xtpl->assign("VALUE", $mat["califArr"][$c]["periodo_fecha"]);
  245. $xtpl->parse("main.col.semestre.table_row.intento.data");
  246. $xtpl->assign("DATA", "orden");
  247. $xtpl->assign("VALUE", $mat["califArr"][$c]["calif_orden"]);
  248. $xtpl->parse("main.col.semestre.table_row.intento.data");
  249. $xtpl->assign("DATA", "calif");
  250. $xtpl->assign("VALUE", $mat["califArr"][$c]["calif"]);
  251. $xtpl->parse("main.col.semestre.table_row.intento.data");
  252. $xtpl->assign("DATA", "grupo");
  253. $xtpl->assign("VALUE", $mat["califArr"][$c]["grupo"]);
  254. $xtpl->parse("main.col.semestre.table_row.intento.data");
  255. $xtpl->assign("DATA", "periodo");
  256. $xtpl->assign("VALUE", $mat["califArr"][$c]["periodo_id"]);
  257. $xtpl->parse("main.col.semestre.table_row.intento.data");
  258. $xtpl->assign("DATA", "periodo_text");
  259. $xtpl->assign("VALUE", $mat["califArr"][$c]["periodo"]);
  260. $xtpl->parse("main.col.semestre.table_row.intento.data");
  261. $xtpl->assign("DATA", "tipo");
  262. $xtpl->assign("VALUE", $mat["califArr"][$c]["calif_tipo"]);
  263. $xtpl->parse("main.col.semestre.table_row.intento.data");
  264. $xtpl->assign("DATA", "tipo_text");
  265. $xtpl->assign("VALUE", $mat["califArr"][$c]["calif_tipo_desc"]);
  266. $xtpl->parse("main.col.semestre.table_row.intento.data");
  267. $xtpl->assign("DATA", "intersemestral");
  268. $xtpl->assign("VALUE", $mat["califArr"][$c]["intersemestral"]);
  269. $xtpl->parse("main.col.semestre.table_row.intento.data");
  270. $xtpl->assign("PERIODO", $mat["califArr"][$c]["periodo"]);
  271. $xtpl->parse("main.col.semestre.table_row.intento.tooltip");
  272. if($mat["califArr"][$c]["calif"] != ""){
  273. $xtpl->assign("ICO", $ICO["editar"]);
  274. $xtpl->parse("main.col.semestre.table_row.intento.editar");
  275. }
  276. if($mat["califArr"][$c]["borrable"] || $_SESSION["sgi_administrador"]){
  277. $xtpl->assign("ICO", $ICO["borrar2"]);
  278. $xtpl->parse("main.col.semestre.table_row.intento.borrar");
  279. }
  280. }else{//no hay mas intentos
  281. $xtpl->assign("CALIF", "&nbsp;");
  282. $xtpl->assign("COLOR", "");
  283. $xtpl->parse("main.col.semestre.table_row.intento.empty");
  284. }
  285. $xtpl->parse("main.col.semestre.table_row.intento");
  286. }
  287. //Agrega botón para nueva calificación
  288. if($objSesion->puedeEditar()){
  289. //if($mat["reprobada"]){
  290. $xtpl->parse("main.col.semestre.table_row.nuevo");
  291. /*}else{
  292. $xtpl->assign("CALIF", "&nbsp;");
  293. $xtpl->assign("COLOR", "");
  294. $xtpl->parse("main.col.semestre.table_row.intento");
  295. }*/
  296. }
  297. $xtpl->parse("main.col.semestre.table_row");
  298. }
  299. $xtpl->parse("main.col.semestre");
  300. $xtpl->parse("main.col");
  301. $xtpl->parse("main");
  302. $xtpl->out("main");
  303. ?>
  304. <p class="text-center btn-float">
  305. <button class="btn btn-outline-secondary btn-up"><?php echo $ICO_LG["arriba"];?></button></p>
  306. <?php
  307. }//fin hay clave
  308. ?>
  309. </main>
  310. <?php if(isset($filter_clave) && !$error){ ?>
  311. <!-- Modal calificacion -->
  312. <div class="modal fade" id="modalCalif" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  313. <div class="modal-dialog modal-dialog-centered" role="document">
  314. <div class="modal-content">
  315. <div class="modal-header">
  316. <h4 class="col-12 modal-title text-center" id="modalLabel">Agregar calificación
  317. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  318. <span aria-hidden="true">&times;</span>
  319. </button>
  320. </h4>
  321. </div>
  322. <div class="modal-body">
  323. <form action="" method="post" id="formaModal" onsubmit="submitForm()">
  324. <input type="hidden" name="mat" id="mat_new">
  325. <input type="hidden" name="plan" id="plan_new">
  326. <input type="hidden" name="comun" id="comun_new">
  327. <input type="hidden" id="sem_new">
  328. <h5 id="mat_texto" class="font-weight-bold mb-4 text-center"></h5>
  329. <div class="form-box">
  330. <div class="form-group row">
  331. <label for="periodo_new" class="col-6 col-form-label">Periodo *</label>
  332. <div class="col-6">
  333. <div class="datalist datalist-select mb-1 w-100" id="datalist_periodo">
  334. <div class="datalist-input"><?php echo $periodo_rs[0]["Periodo_desc"];?></div>
  335. <span class="ing-buscar icono"></span>
  336. <ul style="display:none">
  337. <?php foreach($periodo_rs as $periodo) {?>
  338. <li data-id="<?php echo $periodo["Periodo_id"];?>" data-intersemestral="<?php echo $periodo["Periodo_intersemestral"]; ?>" data-fecha="<?php echo str_replace("-","", $periodo["Periodo_fecha_inicial"]); ?>" <?php if(isset($_SESSION["periodo_id"]) && $_SESSION["periodo_id"] == $periodo["Periodo_id"]){echo "class='selected'";}?> ><?php echo $periodo["Periodo_desc"];?></li>
  339. <?php }?>
  340. </ul>
  341. <input type="hidden" id="periodo_new" name="periodo" value="<?php echo $periodo_rs[0]["Periodo_id"];?>">
  342. </div>
  343. </div>
  344. </div>
  345. <div class="form-group row">
  346. <label for="tipo" class="col-6 col-form-label">Tipo de calificación *</label>
  347. <div class="col-6">
  348. <div class="datalist datalist-select mb-1 w-100" id="datalist_tipo">
  349. <div class="datalist-input" data-hidden="tipo"></div>
  350. <span class="ing-buscar icono"></span>
  351. <ul style="display:none">
  352. <?php foreach($tipo_calif as $tipo) {?>
  353. <li data-id="<?php echo $tipo["TipoCalificacion_id"];?>" data-orden="<?php echo $tipo["TipoCalificacion_orden"];?>"><?php echo $tipo["TipoCalificacion_desc"];?></li>
  354. <?php }?>
  355. </ul>
  356. <input type="hidden" id="tipo" name="tipo" value="">
  357. </div>
  358. </div>
  359. </div>
  360. <div class="form-group row">
  361. <label for="calif_new" class="col-6 col-form-label">Calificación *</label>
  362. <div class="col-6">
  363. <select class="form-control" id="calif_new">
  364. <?php
  365. for($i=10; $i>=5; $i--){?>
  366. <option value="<?php echo $i;?>"><?php echo $i;?></option>
  367. <?php
  368. }
  369. ?>
  370. <option value="0" class="np">SD</option>
  371. </select>
  372. </div>
  373. </div>
  374. <div class="form-group row">
  375. <label for="grupo_new" class="col-6 col-form-label">Grupo</label>
  376. <div class="col-6">
  377. <select class="form-control" id="grupo_new">
  378. <option value="0">Sin grupo</option>
  379. </select>
  380. </div>
  381. </div>
  382. </div>
  383. <div class="form-group row">
  384. <div class="col-12 text-center">
  385. <button type="button" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><?php echo $ICO["aceptar"];?> Guardar</button>
  386. <button type="reset" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"];?> Cancelar</button>
  387. </div>
  388. </div>
  389. </form>
  390. </div>
  391. </div>
  392. </div>
  393. </div>
  394. <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  395. <div class="modal-dialog modal-dialog-centered" role="document">
  396. <div class="modal-content">
  397. <div class="modal-body">
  398. <div class="row">
  399. <div class="col">
  400. <p class="font-weight-bold">¿Estás seguro de que quieres borrar la calificación?</p>
  401. <p id="borrar_datos" class="text-center"><span class="font-weight-bold mat_nombre"></span> - <span class="mat_calif"></span> <span class="mat_tipo"></span></p>
  402. </div>
  403. </div>
  404. </div>
  405. <div class="modal-footer">
  406. <input type="hidden" id="mat_borrar" name="mat" value="">
  407. <input type="hidden" id="per_borrar" name="per" value="">
  408. <input type="hidden" id="tipo_borrar" name="tipo" value="">
  409. <button type="button" class="btn btn-outline-primary btn-confirm"><?php echo $ICO["aceptar"];?> Borrar</button>
  410. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
  411. </div>
  412. </div>
  413. </div>
  414. </div>
  415. <?php }//hay clave ?>
  416. </div>
  417. <script src="../js/jquery.min.js"></script>
  418. <script src="../js/bootstrap/popper.min.js"></script>
  419. <script src="../js/bootstrap/bootstrap.min.js"></script>
  420. <script src="../js/sidebarmenu.js"></script>
  421. <script src="../js/datalist.js"></script>
  422. <?php if(isset($filter_clave) && !$error){ ?>
  423. <script>
  424. var grupo_last = 0;
  425. $(function () {
  426. $('[data-toggle="tooltip"]').tooltip()
  427. })
  428. function loadModal(rowObj){
  429. var btn_row = rowObj.parent().parent();
  430. var mat = btn_row.data("id");
  431. var sem = btn_row.data("sem");
  432. var plan = btn_row.data("plan");
  433. var comun = btn_row.data("comun");
  434. $("#mat_new").val(mat);
  435. $("#plan_new").val(plan);
  436. $("#comun_new").val(comun);
  437. $("#sem_new").val(sem);
  438. var texto = btn_row.find(".materia-nombre").text();
  439. $("#mat_texto").html( texto );
  440. $("#grupo_new").removeClass("is-invalid");
  441. if(comun == 1){
  442. $("#grupo_new").parents(".row").addClass("d-none");
  443. $("#grupo_new").val(0);
  444. }else{
  445. if($("#tipo").val() == 2 ){
  446. $("#grupo_new").parents(".row").removeClass("d-none");
  447. }else{
  448. $("#grupo_new").parents(".row").addClass("d-none");
  449. $("#grupo_new").val(0);
  450. }
  451. }
  452. if($("#tipo").val() <=2 ){
  453. $("#modalCalif .np").text("SD");
  454. }else{
  455. $("#modalCalif .np").text("NP");
  456. }
  457. if( loadGrupos(sem, plan, $("#periodo_new").val()) ){
  458. $("#modalCalif").modal("show");
  459. }
  460. }
  461. $(document).on( "click", ".btn-edit", function(event){
  462. var cell_data = $(this).parents(".materia-calif");
  463. setDatalist("#periodo_new", cell_data.data("periodo"));
  464. setDatalist("#tipo", cell_data.data("tipo"));
  465. loadModal($(this));
  466. $("#calif_new").val(cell_data.data("calif"));
  467. var grupo = cell_data.data("grupo");
  468. if(grupo ==""){
  469. grupo = 0;
  470. }
  471. $("#grupo_new").val(grupo);
  472. disableDatalist("#periodo_new", true);
  473. disableDatalist("#tipo", true);
  474. $("#submitBtn").data("tipo", 2);
  475. cell_data.addClass("active");
  476. });
  477. $(document).on( "click", ".btn-borrar", function(event){
  478. var cell_data = $(this).parents(".materia-calif");
  479. cell_data.addClass("active");
  480. $("#mat_borrar").val(cell_data.parent().data("id"));
  481. $("#per_borrar").val(cell_data.data("periodo"));
  482. $("#tipo_borrar").val(cell_data.data("tipo"))
  483. $("#borrar_datos").find(".mat_nombre").text(cell_data.parent().find(".materia-nombre").text());
  484. $("#borrar_datos").find(".mat_calif").text(cell_data.data("calif"));
  485. $("#borrar_datos").find(".mat_tipo").text(cell_data.data("tipo_text"));
  486. $("#modal_confirm").modal("show");
  487. });
  488. $(document).on( "click", ".btn-calif", function(event){
  489. loadModal($(this));
  490. disableDatalist("#periodo_new", false);
  491. disableDatalist("#tipo", false);
  492. $("#submitBtn").data("tipo", 1);
  493. });
  494. $(document).ready(function(){
  495. setDatalist("#tipo", 2);
  496. $('#modalCalif').on('shown.bs.modal', function (e) {
  497. $('#calif_new').focus();
  498. });
  499. //Detecta enter
  500. $('#calif_new').keydown(function(event) {
  501. if (event.keyCode == 13) {
  502. $("#submitBtn").trigger('click');
  503. }
  504. });
  505. $('body').keydown(function(event) {
  506. if (event.keyCode == 107) {// +
  507. $(".btn-calif").first().trigger('click');
  508. }
  509. });
  510. $('.btn-up').click(function(){//sube la pantalla
  511. $('#messageBox')[0].scrollIntoView({ block: "end" });
  512. });
  513. $('.btn-confirm').click(function(){//confirma borrado
  514. cell_data = $(".materia-row").find(".active");
  515. $.ajax({
  516. url: './action/calificacioncardex_delete.php',
  517. type: 'POST',
  518. dataType: 'json',
  519. data: { "usr": <?php echo $filter_clave;?>, "mat":$("#mat_borrar").val(), "per":$("#per_borrar").val(), "tipo": $("#tipo_borrar").val()},
  520. success: function(result) {
  521. if(result["error"]!= "" && result["error"] !== undefined){
  522. $("#errorBox").collapse('show');
  523. $("#errorBox_text").html(result["error"]);
  524. $('#messageBox')[0].scrollIntoView({ block: "end" });
  525. }else{
  526. cell_data.removeAttr('data-fecha').removeAttr('data-orden').removeAttr('data-calif').removeAttr('data-grupo').removeAttr('data-periodo').removeAttr('data-periodo_text');
  527. cell_data.removeAttr('data-tipo').removeAttr('data-tipo_text').removeAttr('data-intersemestral');
  528. cell_data.removeClass("active").addClass("empty");
  529. cell_data.html('<span class="calif">&nbsp;</span>');
  530. $("#modal_confirm").modal("hide");
  531. }
  532. },
  533. error: function(jqXHR, textStatus, errorThrown ){
  534. $("#errorBox").collapse('show');
  535. $("#errorBox_text").html(errorThrown);
  536. $('#messageBox')[0].scrollIntoView({ block: "end" });
  537. }
  538. });
  539. });
  540. $('#datalist_tipo ul li').click(function(){//cambia datalist
  541. if($("#tipo").val() <=2 ){
  542. $("#modalCalif .np").text("SD");
  543. }else{
  544. $("#modalCalif .np").text("NP");
  545. }
  546. if($("#comun_new").val() != 1){//no es común
  547. if($("#tipo").val() == 2 ){
  548. $("#grupo_new").parents(".row").removeClass("d-none");
  549. }else{
  550. $("#grupo_new").parents(".row").addClass("d-none");
  551. $("#grupo_new").val(0);
  552. }
  553. }
  554. });
  555. $('#datalist_periodo ul li').click(function(){//cambia datalist
  556. loadGrupos($("#sem_new").val(), $("#plan_new").val(), $("#periodo_new").val())
  557. });
  558. $('#submitBtn').click(function(){//cambia datalist
  559. $("#grupo_new").removeClass("is-invalid");
  560. //Valida que exista grupo
  561. /*if( $("#comun_new").val()==0 && ($("#grupo_new").val()===null || $("#grupo_new").val()=="")){
  562. $("#grupo_new").addClass("is-invalid");
  563. return ;
  564. }*/
  565. if($("#grupo_new").val() > 0){
  566. grupo_last = $("#grupo_new").val();
  567. }
  568. var rowId = "#mat_"+$('#mat_new').val();
  569. //datos nuevos
  570. var calif_new = {
  571. "mat": parseInt($('#mat_new').val()),
  572. "calif": parseInt($('#calif_new').val()),
  573. "fecha": parseInt(getDatalistData("#periodo_new", "fecha")),
  574. "orden": parseInt(getDatalistData("#tipo", "orden")),
  575. "grupo": parseInt($('#grupo_new').val()),
  576. "periodo":parseInt($('#periodo_new').val()),
  577. "periodo_text":getDatalistText('#periodo_new', $("#periodo_new").val()),
  578. "tipo":parseInt($("#tipo").val()),
  579. "tipo_text":getDatalistText('#tipo', $("#tipo").val()),
  580. "intersemestral":parseInt(getDatalistData("#periodo_new", "intersemestral")),
  581. "new":true
  582. };
  583. if($("#submitBtn").data("tipo") == 1){//altas
  584. var califMateriaArr = [];
  585. $.ajax({
  586. url: './action/calificacioncardex_insert.php',
  587. type: 'POST',
  588. dataType: 'json',
  589. data: { "usr": <?php echo $alumno_rs["Usuario_claveULSA"];?>, "mat":calif_new.mat, "tipo": calif_new.tipo, "calif":calif_new.calif, "per":calif_new.periodo},
  590. success: function(result) {
  591. if(result["error"]!= "" && result["error"] !== undefined){
  592. $("#errorBox").collapse('show');
  593. $("#errorBox_text").html(result["error"]);
  594. $('#messageBox')[0].scrollIntoView({ block: "end" });
  595. }else{
  596. //Lee calificaciones del renglón actual y las guarda en el arreglo
  597. $(rowId+" .materia-calif:not(.empty)").each(function(index) {
  598. var calif_row = {
  599. "calif": parseInt($(this).data("calif")),
  600. "fecha": parseInt($(this).data("fecha")),
  601. "orden": parseInt($(this).data("orden")),
  602. "grupo": parseInt($(this).data("grupo")),
  603. "periodo":parseInt($(this).data("periodo")),
  604. "periodo_text":$(this).data("periodo_text"),
  605. "tipo": parseInt($(this).data("tipo")),
  606. "tipo_text": $(this).data("tipo_text"),
  607. "intersemestral": parseInt($(this).data("intersemestral")),
  608. "new":false
  609. };
  610. califMateriaArr.push(calif_row);
  611. });
  612. califMateriaArr.push(calif_new);
  613. //Ordenar arreglo de calificaciones
  614. for(var i=0; i< califMateriaArr.length-1; i++){
  615. for(var j=i+1; j< califMateriaArr.length; j++){
  616. if(califMateriaArr[i].fecha > califMateriaArr[j].fecha ||
  617. (califMateriaArr[i].fecha == califMateriaArr[j].fecha && califMateriaArr[i].orden > califMateriaArr[j].orden)
  618. ){
  619. var aux = califMateriaArr[i];
  620. califMateriaArr[i] = califMateriaArr[j];
  621. califMateriaArr[j] = aux;
  622. }
  623. }
  624. }
  625. //Sobreescibir valores de celdas
  626. $(rowId+" .materia-calif").each(function(index) {
  627. if(index < califMateriaArr.length){
  628. $(this).removeClass("empty");
  629. $(this).data("calif", califMateriaArr[index].calif);
  630. $(this).data("fecha", califMateriaArr[index].fecha);
  631. $(this).data("orden", califMateriaArr[index].orden);
  632. $(this).data("grupo", califMateriaArr[index].grupo);
  633. $(this).data("periodo", califMateriaArr[index].periodo);
  634. $(this).data("periodo_text", califMateriaArr[index].periodo_text);
  635. $(this).data("tipo", califMateriaArr[index].tipo);
  636. $(this).data("tipo_text", califMateriaArr[index].tipo_text);
  637. var calif = califMateriaArr[index].calif;
  638. if(calif == 0){
  639. if(califMateriaArr[index].tipo == 1 || califMateriaArr[index].tipo == 2){
  640. calif = "SD";
  641. }else{
  642. calif = "NP";
  643. }
  644. }
  645. if(califMateriaArr[index].new){
  646. $(this).css("font-weight", "bold");
  647. }else{
  648. $(this).css("font-weight", "");
  649. }
  650. $(this).removeClass("calif-equivalencia").removeClass("calif-intersemestral").removeClass("calif-extraordinario");
  651. switch(califMateriaArr[index].tipo){
  652. case 1: $(this).addClass("calif-equivalencia"); break;
  653. case 2:
  654. if(califMateriaArr[index].intersemestral==1)
  655. $(this).addClass("calif-intersemestral");
  656. break;
  657. default: $(this).addClass("calif-extraordinario"); break;
  658. }
  659. html = '<span class="calif" style="cursor:help;" data-toggle="tooltip" data-placement="top" data-html="true" title="" \
  660. data-original-title="<b>'+califMateriaArr[index].tipo_text+'</b><br>'+califMateriaArr[index].periodo_text+'">'+calif+'</span>';
  661. html+= ' <span class="btn-edit pointer"><span class="ing-editar ing-fw"></span></span>';
  662. html+= ' <span class="btn-borrar pointer text-danger"><span class="ing-basura ing-fw"></span></span>';
  663. $(this).html(html);
  664. $(this).find('[data-toggle="tooltip"]').tooltip();
  665. }
  666. });
  667. /*
  668. if(calif_new.calif >5){
  669. $(rowId).find(".btn-calif").remove();
  670. $(rowId).find("text-center").html("<span>&nbsp;</span>");
  671. }*/
  672. //$("#modalCalif").modal("hide");
  673. }
  674. },
  675. error: function(jqXHR, textStatus, errorThrown ){
  676. $("#errorBox").collapse('show');
  677. $("#errorBox_text").html(errorThrown);
  678. }
  679. });
  680. //ajax*/
  681. }else{//edición
  682. calif_new.new = false
  683. $.ajax({
  684. url: './action/calificacioncardex_update.php',
  685. type: 'POST',
  686. dataType: 'json',
  687. data: { "usr": <?php echo $filter_clave;?>, "mat":calif_new.mat, "tipo": calif_new.tipo, "calif":calif_new.calif, "per":calif_new.periodo},
  688. success: function(result) {
  689. if(result["error"]!= "" && result["error"] !== undefined){
  690. $("#errorBox").collapse('show');
  691. $("#errorBox_text").html(result["error"]);
  692. $('#messageBox')[0].scrollIntoView({ block: "end" });
  693. }else{
  694. //Sobreescibir valores de celda
  695. $(rowId).data("calif", calif_new.calif);
  696. $(rowId).data("grupo", calif_new.grupo);
  697. var calif = calif_new.calif;
  698. if(calif == 0){
  699. if(calif_new.tipo == 1 || calif_new.tipo == 2){
  700. calif = "SD";
  701. }else{
  702. calif = "NP";
  703. }
  704. }
  705. if(calif_new.new){
  706. $(this).css("font-weight", "bold");
  707. }else{
  708. $(this).css("font-weight", "");
  709. }
  710. $(rowId).find(".active .calif").html(calif_new.calif);
  711. /*
  712. if(calif_new.calif > 5){
  713. $(rowId).find(".btn-calif").remove();
  714. $(rowId).find("text-center").html("<span>&nbsp;</span>");
  715. }*/
  716. }
  717. },
  718. error: function(jqXHR, textStatus, errorThrown ){
  719. $("#errorBox").collapse('show');
  720. $("#errorBox_text").html(errorThrown);
  721. }
  722. });
  723. }
  724. $("#modalCalif").modal("hide");
  725. });
  726. });//document ready
  727. $('#modalCalif').on('hidden.bs.modal', function() {
  728. $(".materia-row").find(".active").removeClass("active");
  729. })
  730. $('#modal_confirm').on('hidden.bs.modal', function() {
  731. $(".materia-row").find(".active").removeClass("active");
  732. })
  733. function getDatalistData(selector, data){
  734. var elementRoot = $(selector).parents('.datalist');
  735. return elementRoot.find('ul li.selected').data(data)
  736. }
  737. function loadGrupos(sem, plan, periodo){
  738. var ok = false;
  739. $.ajax({
  740. url: './action/gruposasignar_busca.php',
  741. type: 'POST',
  742. dataType: 'json',
  743. async: false,
  744. data: { "sem": sem, "plan":plan, "periodo": periodo},
  745. success: function(result) {
  746. if(result["error"]!= "" && result["error"] !== undefined){
  747. $("#errorBox").collapse('show');
  748. $("#errorBox_text").html(result["error"]);
  749. $('#messageBox')[0].scrollIntoView({ block: "end" });
  750. ok = false;
  751. }else{
  752. //cargar datos de grupos
  753. var rows = $("#grupo_new > option").length;//cuenta actuales
  754. if(rows > result["grupo"].length){//sobran
  755. //borrar renglones extra (rows - result.length) pero dejar al menos 1
  756. while(rows > result["grupo"].length+1 && rows > 1){
  757. $("#grupo_new option:last-child").remove();
  758. rows--;
  759. }
  760. }else{//faltan
  761. // clone the rest of the rows
  762. for(var i=0; i<=(result["grupo"].length - rows); i++){
  763. var html = '<option value="" class="option"></option>';
  764. $(html).appendTo("#grupo_new");
  765. }
  766. }
  767. if(result["grupo"].length != 0){//hay grupos
  768. $("#grupo_new .option").each(function(index) {
  769. //if(index <= result["grupo"].length){//llenar info
  770. $(this).text(result["grupo"][index]["desc"]);
  771. $(this).val(result["grupo"][index]["id"]);
  772. if(grupo_last == result["grupo"][index]["id"]){
  773. $(this).attr("selected", true);
  774. }
  775. //}
  776. });
  777. }
  778. ok = true;
  779. }
  780. },
  781. error: function(jqXHR, textStatus, errorThrown ){
  782. $("#errorBox").collapse('show');
  783. $("#errorBox_text").html(errorThrown);
  784. ok = false;
  785. }
  786. });//ajax
  787. return ok;
  788. }
  789. </script>
  790. <?php } ?>
  791. </body>
  792. </html>