materiasalumnos_moodle.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/util.php");
  4. require_once("../include/bd_pdo.php");
  5. require_once("../classes/ValidaSesion.php");
  6. require_once("../classes/MainMenu.php");
  7. $menu = 10;
  8. $submenu = 102;
  9. //--- Objeto para validar usuario. El id de alumno lo lee desde sesión
  10. $objSesion = new ValidaSesion($pdo, $submenu, GEMA);
  11. if(!$objSesion->tieneAcceso() || !$objSesion->puedeEditar()){
  12. header("Location: main.php?error=3");
  13. exit();
  14. }
  15. function existeFecha($arr, $id){
  16. foreach($arr as $fecha){
  17. if($fecha["TipoFechaImportante_id"] == $id)
  18. return true;
  19. }
  20. return false;
  21. }
  22. ?>
  23. <!DOCTYPE html>
  24. <html lang="es" prefix="og: http://ogp.me/ns#">
  25. <head>
  26. <title>GEMA - Facultad de Ingeniería</title>
  27. <meta charset="utf-8">
  28. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  29. <link rel="icon" type="image/png" href="../img/favicon.png" />
  30. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  31. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  32. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  33. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  34. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  35. <link rel="stylesheet" href="../css/month-picker.css" type="text/css">
  36. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  37. <link rel="stylesheet" href="../css/custominputfile.css" type="text/css">
  38. <script src="../js/util.js"></script>
  39. </head>
  40. <body>
  41. <div>
  42. <?php
  43. //--- Objeto que pinta menu
  44. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, GEMA, "Asignación de materias desde Moodle");//usr, menu, pdo, sist
  45. $menuObj->printMenu();
  46. $stmt = $pdo->prepare('Select * from fs_fechasmateriasalumno(:periodo, NULL,'.GEMA.')');//devuelve qué tipos de fechas están activas en el periodo hoy
  47. $stmt->bindPAram(":periodo", $_SESSION["periodo_id"]);
  48. if(!$stmt->execute()){
  49. $errorDesc = "Ocurrió un error al obtener las fechas del periodo";
  50. }else{
  51. $fechas_rs = $stmt->fetchAll();
  52. }
  53. $stmt->closeCursor();
  54. //--Manejo de errores y mensajes de exito
  55. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  56. switch ($_GET["error"]){
  57. case 0: $errorDesc = "No se recibieron los datos de los alumnos."; break;
  58. case 1: $errorDesc = "No tienes permisos para acceder a esa sección."; break;
  59. case 2: $errorDesc = "El archivo supera los 10MB y no se puede cargar."; break;
  60. case 3: $errorDesc = "No es una extensión válida. Solo se permiten archivos XLS o XLSX."; break;
  61. case 4: $errorDesc = "No tienes permisos para acceder a esa sección."; break;
  62. }
  63. }
  64. ?>
  65. <main class="container-fluid content marco">
  66. <?php include_once("../include/errorMessage.php");?>
  67. <?php include("../include/periodoCambio.php");?>
  68. <?php if ($_SESSION["sgi_administrador"]){ ?>
  69. <p class="text-right"><a href="materiasalumnos.php" class="btn btn-outline-secondary"><span class="ing-mas"></span> Asignación por clave</a></p>
  70. <?php } ?>
  71. <!-- Filtro -->
  72. <div class="row">
  73. <div class="col-12">
  74. <form action="asignamateria.php" method="post" onsubmit="return validaForm()" enctype="multipart/form-data" id="formaArchivos">
  75. <div class="form-box">
  76. <div class="form-box">
  77. <div class="form-group row">
  78. <label for="archivo" class="col-12 col-sm-6 col-form-label">Selecciona el archivo con la información de los alumnos que serán importados</label>
  79. <div class="col-12 col-sm-6 mb-3" id="divDocumento">
  80. <input type="file" name="archivo" id="archivo" required="required" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
  81. <div class="invalid-feedback">Selecciona un archivo.</div>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="form-group row mb-4">
  87. <div class="col-12 text-center">
  88. <button type="button" class="btn btn-outline-primary" id="btn-submit"><?php echo $ICO["aceptar"]; ?> Asignar materias</button>
  89. </div>
  90. </div>
  91. </form>
  92. </div>
  93. </div>
  94. <!-- end Filtro -->
  95. <div class="row collapse" id="agregados">
  96. <div class="col-12">
  97. <div class="alert alert-success">
  98. <span class="ing-aceptar ing-fw float-left" style="font-size:2em"></span>
  99. <p class="pt-1" style="margin-left:60px">Se agregaron correctamente <b><span class="total">0</span></b> registros</p>
  100. </div>
  101. </div>
  102. </div>
  103. <div class="row" id="omitidos" style="display: none;">
  104. <div class="col-12">
  105. <div class="row">
  106. <div class="col-12">
  107. <div class="alert alert-warning">
  108. <span class="ing-importante ing-fw float-left" style="font-size:2em"></span>
  109. <p class="pt-1" style="margin-left:60px">Los siguientes <b><span class="total">0</span></b> registros tuvieron errores al ser guardados:</p>
  110. </div>
  111. </div>
  112. </div>
  113. <table class="table table-sm table-striped table-white">
  114. <thead class="thead-dark">
  115. <tr>
  116. <th>Clave</th>
  117. <th style="width:60%">Mensaje</th>
  118. </tr>
  119. </thead>
  120. <tbody>
  121. </tbody>
  122. </table>
  123. </div>
  124. </div>
  125. </main>
  126. <!--- FOOTER--->
  127. <?php require_once("../include/footer.php"); ?>
  128. </div>
  129. <script src="../js/jquery.min.js"></script>
  130. <script src="../js/jquery-ui.js"></script>
  131. <script src="../js/datepicker-es.js"></script>
  132. <script src="../js/bootstrap/popper.min.js"></script>
  133. <script src="../js/bootstrap/bootstrap.min.js"></script>
  134. <script src="../js/fechas.js"></script>
  135. <script src="../js/sidebarmenu.js"></script>
  136. <script src="../js/custominputfile.min-es.js"></script>
  137. <script src="../js/datalist.js"></script>
  138. <script src="../js/month-picker.js"></script>
  139. <script>
  140. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  141. $(document).on('click', '#dlPeriodo ul li' ,function(){
  142. $("#formaPeriodo").submit();
  143. });
  144. /*$(document).on( "click", ".btn-reset", function(event){
  145. var forma =$(this).parents("form");
  146. forma.find("input[type=text]").val("");
  147. });*/
  148. </script>
  149. <script>
  150. function validaForm(){
  151. var error = false;
  152. invalidDatalist("#filter_plan", false);
  153. $(".is-invalid").removeClass("is-invalid");
  154. if( $("#alumnos").children().length <= 0){
  155. $("#alumnos").addClass("is-invalid");
  156. error = true;
  157. }
  158. if( $("#filter_plan").val() == "" ){
  159. invalidDatalist("#filter_plan", true);
  160. error = true;
  161. }
  162. $("#alumnos option").prop('selected', true);
  163. return !error;
  164. }
  165. function creaRenglon(omitido){
  166. return '<tr> \
  167. <td class="clave text-center">'+omitido["clave"]+'</td>\
  168. <td class="desc">'+omitido["desc"]+'</td>\
  169. </tr>';
  170. }
  171. $(document).ready(function(){
  172. $("#btn-submit").click(function(){
  173. $("#btn-submit").attr("disabled", true);
  174. var datos = $.customFile.serialize('#formaArchivos');
  175. $.ajax({
  176. url: './action/materiasalumnos_importar.php',
  177. type: 'POST',
  178. contentType: false,
  179. cache: false,
  180. processData:false,
  181. data: datos,
  182. dataType: 'json',
  183. timeout: 1000*60*10,
  184. success: function(result) {
  185. console.log(result);
  186. if(result["error"]!= "" && result["error"] !== undefined){
  187. $("#errorBox").collapse('show');
  188. $("#errorBox_text").html(result["error"]);
  189. $('#messageBox')[0].scrollIntoView({ block: "end" });
  190. }else{
  191. if(parseInt(result["insertados"]) >0){
  192. $("#agregados").collapse('show');
  193. $("#agregados .total").text(result["insertados"]);
  194. }else{
  195. $("#agregados").collapse('hide');
  196. }
  197. if(parseInt(result["omitidosArr"].length) >0){
  198. $("#omitidos").show();
  199. $("#omitidos .total").text(result["omitidosArr"].length);
  200. $("#omitidos tbody").html( "");
  201. for(var i = 0 ; i<result["omitidosArr"].length; i++){
  202. console.log(result["omitidosArr"][i]);
  203. $("#omitidos").find("tbody").append( creaRenglon(result["omitidosArr"][i]) );
  204. }
  205. }else{
  206. $("#omitidos").hide();
  207. }
  208. }
  209. $("#btn-submit").attr("disabled", false);
  210. },
  211. error: function(jqXHR, textStatus, errorThrown ){
  212. $("#btn-submit").attr("disabled", false);
  213. $("#errorBox").collapse('show');
  214. $("#errorBox_text").html("Error al cargar el archivo. "+errorThrown);
  215. $('#messageBox')[0].scrollIntoView({ block: "end" });
  216. }
  217. });
  218. });
  219. $('#archivo').customFile({
  220. type : 'all',
  221. //allowed : ['xls', 'xlsx'],
  222. allowed : ['csv'],
  223. maxFiles : 1,
  224. maxKBperFile: 1024*10,
  225. multiple: false,
  226. addContainerAfter : $('#divDocumento'),
  227. messages : {
  228. errorType : 'No son permitidos ese tipo de archivos',
  229. errorFileKB: 'El archivo excede los 10MB'
  230. },
  231. popup: {
  232. active: false,
  233. autoclose : false
  234. },
  235. callbacks : {
  236. onComplete : function(app){
  237. if(app.itemFileList.length > 0)
  238. $('#divDocumento').hide();
  239. },
  240. beforeRead : function(file){
  241. if ($('#alertaDocumento').length > 0)
  242. $('#alertaDocumento').remove();
  243. },
  244. beforeRemove : function(item){
  245. $("#divDocumento").show();
  246. $("#omitidos").hide();
  247. $("#agregados").collapse('hide');
  248. $("#btn-submit").attr("disabled", false);
  249. },
  250. onError : function(file,msg){
  251. var lista = '';
  252. for (var cont = 0; cont < msg.length; cont++){
  253. lista += '<li>' + msg[cont] + '</li>';
  254. }
  255. $('#divDocumento').after('<div id="alertaDocumento" class="alert alert-danger alert-dismissible fade show">\
  256. <button type="button" class="close" data-dismiss="alert"><span class="ing-cancelar small"></span></button>\
  257. <div class="d-flex flex-column">\
  258. <div class="indivisa-text-bold">¡Error!</div>\
  259. <ul class="mb-0">' + lista + '</ul>\
  260. <div>El archivo que intentaste cargar es:<span class="indivisa-text-bold ml-1">' + file.name + '</span></div>\
  261. </div>\
  262. </div>');
  263. $('#divMainDocumento').show();
  264. },
  265. onSuccess : function(item, callback){
  266. $('#divMainDocumento').hide();
  267. var options = $('#divDocumento').siblings('div.cif-file-container.cif-container-all-type').children('div.cif-file-row').children('div.cif-parent').children('div');
  268. $(options[1]).click(function() { $('#divMainDocumento').hide(); });
  269. }
  270. }
  271. });
  272. });
  273. </script>
  274. </body>
  275. </html>