This commit is contained in:
2023-09-22 17:58:31 +00:00
parent 37c67baa21
commit 0ef9e2a1f4
19 changed files with 1172 additions and 176 deletions

View File

@@ -2,6 +2,8 @@
#input $_GET['id_espacio_sgu'] #input $_GET['id_espacio_sgu']
#output rutas: [ ...ruta, salones: [{...salon}] ] #output rutas: [ ...ruta, salones: [{...salon}] ]
header('Content-Type: application/json charset=utf-8'); header('Content-Type: application/json charset=utf-8');
ini_set('memory_limit', '256M');
ini_set('post_max_size', '256M');
ini_set('display_errors', 1); ini_set('display_errors', 1);
ini_set('display_startup_errors', 1); ini_set('display_startup_errors', 1);
error_reporting(E_ALL); error_reporting(E_ALL);

View File

@@ -12,13 +12,15 @@ $user = unserialize($_SESSION['user']);
$ruta = "../"; $ruta = "../";
require_once "../include/bd_pdo.php"; require_once "../include/bd_pdo.php";
$facultad_id = $user->facultad['facultad_id'];
$carreras = $db->query(
"SELECT * FROM carrera
WHERE
(facultad_id = :facultad_id OR :facultad_id IS NULL)
ORDER BY carrera_nombre DESC",
array('facultad_id' => $facultad_id)
);
$nivel = $db->where("id", $_POST['periodo'])->getOne("fs_periodo", "nivel_id"); // $user->print_to_log("Crea carrera", old: $_POST);
$carreras = $db
->where("nivel", $nivel)
->where("facultad", $_POST['facultad'])
->get("fs_carrera", null, "id, carrera");
$user->print_to_log("Crea carrera", old: $_POST);
die(json_encode($carreras)); die(json_encode($carreras));

293
action/avisos.php Normal file
View File

@@ -0,0 +1,293 @@
<?
require_once "{$_SERVER['DOCUMENT_ROOT']}/class/c_login.php";
header('Content-Type: application/json');
if (!Login::is_logged()) {
header('HTTP/1.1 401 Unauthorized');
echo json_encode(array('error' => 'No se ha iniciado sesión'));
exit();
}
$user = Login::get_user();
try {
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
$facultad_id = $user->facultad['facultad_id'];
$avisos = $db->query(
"SELECT * FROM aviso
WHERE
(CURRENT_DATE BETWEEN aviso_fecha_inicial AND aviso_fecha_final) AND
(facultad_id = :facultad_id OR :facultad_id IS NULL) AND
aviso_estado
ORDER BY aviso_id DESC",
array('facultad_id' => $facultad_id)
);
/*
if (empty($avisos)) {
header('HTTP/1.1 404 Not Found');
echo json_encode(array('error' => 'No hay avisos disponibles'));
exit();
}
*/
$avisos = array_map(fn($aviso) => array(
...$aviso,
'carreras' => $db->query(
"SELECT carrera_id, carrera_nombre FROM aviso_carrera
JOIN carrera USING (carrera_id)
WHERE aviso_id = :aviso_id",
array('aviso_id' => $aviso['aviso_id'])
),
'profesores' => $db->query(
"SELECT profesor_id, profesor_clave, profesor_nombre FROM aviso_profesor
JOIN profesor USING (profesor_id)
WHERE aviso_id = :aviso_id",
array('aviso_id' => $aviso['aviso_id'])
),
), $avisos);
echo json_encode($avisos);
break;
case 'POST':
$raw_input = file_get_contents('php://input');
if (empty($raw_input)) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(array('error' => 'No se recibieron parámetros'));
exit();
}
$input_data = json_decode($raw_input);
if (json_last_error() !== JSON_ERROR_NONE) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(array('error' => 'Invalid JSON format'));
exit();
}
$schema = <<<JSON
{
"\$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["aviso_fecha_inicial", "aviso_fecha_final", "aviso_titulo", "aviso_texto"],
"properties": {
"aviso_fecha_inicial": {
"type": "string",
"format": "date"
},
"aviso_fecha_final": {
"type": "string",
"format": "date"
},
"aviso_texto": {
"type": "string"
},
"aviso_titulo": {
"type": "string"
},
"carreras": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"minItems": 0,
"uniqueItems": true
},
"profesores": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"minItems": 0,
"uniqueItems": true
}
},
"anyOf": [
{"required": ["carreras"]},
{"required": ["profesores"]}
]
}
JSON;
// VALIDATE JSON SCHEMA
$validate = new JsonSchema\Validator();
$validate->validate($input_data, json_decode($schema));
if (!$validate->isValid()) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(
array(
'error' => 'El formato de la solicitud es incorrecto',
'success' => false,
'errors' => $validate->getErrors()
)
);
exit();
}
$aviso_id = $db->insert(
'aviso',
array(
'aviso_fecha_inicial' => $input_data->aviso_fecha_inicial,
'aviso_fecha_final' => $input_data->aviso_fecha_final,
'aviso_texto' => $input_data->aviso_texto,
'facultad_id' => $user->facultad['facultad_id'],
),
'aviso_id'
);
if (isset($input_data->carreras)) {
array_walk($input_data->carreras, fn($carrera_id) => $db->insert('aviso_carrera', array('aviso_id' => $aviso_id, 'carrera_id' => $carrera_id)));
}
if (isset($input_data->profesores)) {
array_walk($input_data->profesores, fn($profesor_id) => $db->insert('aviso_profesor', array('aviso_id' => $aviso_id, 'profesor_id' => $profesor_id)));
}
echo json_encode(
array(
'aviso_id' => $aviso_id,
'msg' => 'Aviso creado exitosamente',
'success' => true
)
);
break;
case 'PUT':
$raw_input = file_get_contents('php://input');
if (empty($raw_input)) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(array('error' => 'No se recibieron parámetros'));
exit();
}
$input_data = json_decode($raw_input);
if (json_last_error() !== JSON_ERROR_NONE) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(array('error' => 'Invalid JSON format'));
exit();
}
$schema = <<<JSON
{
"\$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["aviso_id", "aviso_fecha_final"],
"properties": {
"aviso_id": {
"type": "integer",
"minimum": 1
},
"aviso_fecha_final": {
"type": "string",
"format": "date"
}
}
}
JSON;
// VALIDATE JSON SCHEMA
$validate = new JsonSchema\Validator();
$validate->validate($input_data, json_decode($schema));
if (!$validate->isValid()) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(
array(
'error' => 'El formato de la solicitud es incorrecto',
'errors' => $validate->getErrors(),
'success' => false,
)
);
exit();
}
$db->where('aviso_id', $input_data->aviso_id)
->update(
'aviso',
array(
'aviso_fecha_final' => $input_data->aviso_fecha_final,
),
);
if (isset($input_data->carreras)) {
$db->where('aviso_id', $input_data->aviso_id)->delete('aviso_carrera');
array_walk($input_data->carreras, fn($carrera_id) => $db->insert('aviso_carrera', array('aviso_id' => $input_data->aviso_id, 'carrera_id' => $carrera_id)));
}
if (isset($input_data->profesores)) {
$db->where('aviso_id', $input_data->aviso_id)->delete('aviso_profesor');
array_walk($input_data->profesores, fn($profesor_id) => $db->insert('aviso_profesor', array('aviso_id' => $input_data->aviso_id, 'profesor_id' => $profesor_id)));
}
echo json_encode(
array(
'msg' => 'Aviso actualizado exitosamente',
'success' => true
)
);
break;
case 'DELETE':
$raw_input = file_get_contents('php://input');
if (empty($raw_input)) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(array('error' => 'No se recibieron parámetros'));
exit();
}
$input_data = json_decode($raw_input);
if (json_last_error() !== JSON_ERROR_NONE) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(array('error' => 'Invalid JSON format'));
exit();
}
$schema = <<<JSON
{
"\$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["aviso_id"],
"properties": {
"aviso_id": {
"type": "integer",
"minimum": 1
}
}
}
JSON;
// VALIDATE JSON SCHEMA
$validate = new JsonSchema\Validator();
$validate->validate($input_data, json_decode($schema));
if (!$validate->isValid()) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(
array(
'error' => 'El formato de la solicitud es incorrecto',
'errors' => $validate->getErrors(),
'success' => false,
)
);
exit();
}
$result = $db->where('aviso_id', $input_data->aviso_id)->update('aviso', array('aviso_estado' => false));
echo json_encode(
array(
'msg' => 'Aviso eliminado exitosamente',
'success' => true,
'result' => $result
)
);
break;
}
} catch (PDOException $e) {
echo json_encode(
array(
'error' => $e->getMessage(),
'query' => $db->getLastQuery(),
'exception' => $e->getTraceAsString()
)
);
}

View File

@@ -13,10 +13,9 @@ if (!isset($_SESSION['user']))
$user = unserialize($_SESSION['user']); $user = unserialize($_SESSION['user']);
//$user->access(); //$user->access();
$duracion_id = filter_input(INPUT_POST, "duracion", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio $duracion_id = filter_input(INPUT_POST, "duracion", FILTER_SANITIZE_NUMBER_INT);//Id reposicion
$bloque = filter_input(INPUT_POST, "bloque", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio $bloque = filter_input(INPUT_POST, "bloque", FILTER_SANITIZE_NUMBER_INT);//
$ciclo = filter_input(INPUT_POST, "ciclo", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio $ciclo = filter_input(INPUT_POST, "ciclo", FILTER_SANITIZE_NUMBER_INT);//
$fecha_falta = trim(htmlspecialchars($_POST["fecha_falta"], ENT_QUOTES, "UTF-8"));//limpia texto
$fecha_falta = trim(htmlspecialchars($_POST["fecha_falta"], ENT_QUOTES, "UTF-8"));//limpia texto $fecha_falta = trim(htmlspecialchars($_POST["fecha_falta"], ENT_QUOTES, "UTF-8"));//limpia texto
$fecha = trim(htmlspecialchars($_POST["fecha_inicial"], ENT_QUOTES, "UTF-8"));//limpia texto $fecha = trim(htmlspecialchars($_POST["fecha_inicial"], ENT_QUOTES, "UTF-8"));//limpia texto
$fecha_cambio = trim(htmlspecialchars($_POST["fecha_cambio"], ENT_QUOTES, "UTF-8"));//limpia texto $fecha_cambio = trim(htmlspecialchars($_POST["fecha_cambio"], ENT_QUOTES, "UTF-8"));//limpia texto

View File

@@ -7,7 +7,12 @@ $ruta = "../";
require_once "../class/c_login.php"; require_once "../class/c_login.php";
// check if the session is started // check if the session is started
$user = Login::get_user(); if (!isset($_SESSION['user']))
die('No se ha iniciado sesión');
$user = unserialize($_SESSION['user']);
//--- Objeto para validar usuario. El id de usuario lo lee desde sesión //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
/*if(!$objSesion->tieneAcceso()){ /*if(!$objSesion->tieneAcceso()){
$return["error"] = "Error! No tienes permisos para realizar esta acción."; $return["error"] = "Error! No tienes permisos para realizar esta acción.";
@@ -25,6 +30,7 @@ $user = Login::get_user();
}catch(Exception $e){ }catch(Exception $e){
$return["error"] = "Ocurrió un error al leer los datos de la reposición."; $return["error"] = "Ocurrió un error al leer los datos de la reposición.";
echo json_encode($return); echo json_encode($return);
exit();
} }
@@ -36,15 +42,16 @@ $user = Login::get_user();
$hora_nueva_fin = explode(":",$rs["hora_nueva_fin"]); $hora_nueva_fin = explode(":",$rs["hora_nueva_fin"]);
$return["hora_fin"] = $hora_nueva_fin[0]; $return["hora_fin"] = $hora_nueva_fin[0];
$return["min_fin"] = $hora_nueva_fin[1]; $return["min_fin"] = $hora_nueva_fin[1];
$return["duracion"] = $rs["duracion_total"]; $return["duracion"] = $rs["duracion_interval"];
// $return["carrera"] = $rs["PlanEstudio_desc"]; // $return["carrera"] = $rs["PlanEstudio_desc"];
$return["horario"] = $rs["horario_id"]; $return["horario"] = $rs["horario_id"];
$return["materia"] = $rs["materia_id"]; $return["materia"] = $rs["materia_id"];
$return["materia_desc"] = $rs["materia_nombre"]; $return["materia_desc"] = $rs["materia_nombre"];
$return["salon"] = $rs["salon_id"]; $return["salon"] = $rs["salon_id"];
$return["salon_desc"] = $rs["Salon_desc"]=="" ? "-Pendiente-": $rs["Salon_desc"]; $return["salon_desc"] = $rs["salon"]=="" ? "-Pendiente-": $rs["salon"];
$return["grupo"] = $rs["horario_grupo"]; $return["ciclo"] = $rs["ciclo"];
$return["bloque"] = $rs["bloque"];
$return["profesor"] = $rs["profesor_id"]; $return["profesor"] = $rs["profesor_id"];
$return["profesor_nombre"] = $rs["profesor_nombre"]; $return["profesor_nombre"] = $rs["profesor_nombre"];
$return["comentario"] = $rs["descripcion"]; $return["comentario"] = $rs["descripcion"];
@@ -54,6 +61,8 @@ $user = Login::get_user();
$return["aula_desc"] = $rs["tipoaula_nombre"]; $return["aula_desc"] = $rs["tipoaula_nombre"];
$return["aula_supervisor"] = $rs["tipoaula_supervisor"]; $return["aula_supervisor"] = $rs["tipoaula_supervisor"];
$return["dia"] = date('w', strtotime($rs["fecha_clase"])); $return["dia"] = date('w', strtotime($rs["fecha_clase"]));
$return["motivo_cancelacion"] = $rs["motivo_cancelacion"];
$return["estado"] = $rs["estado_reposicion_id"];
} }
echo json_encode($return); echo json_encode($return);
?> ?>

View File

@@ -8,46 +8,58 @@ $ruta = "../";
require_once "../class/c_login.php"; require_once "../class/c_login.php";
// check if the session is started // check if the session is started
$user = Login::get_user(); if (!isset($_SESSION['user']))
die('No se ha iniciado sesión');
$user = unserialize($_SESSION['user']);
/*if(!isset($_POST["id"]) || !isset($_POST["fecha_falta"]) || !isset($_POST["fecha_inicial"]) || !isset($_POST["hora_ini"]) || !isset($_POST["min_ini"]) || !isset($_POST["materia"]) || !isset($_POST["grupo"])){ /*if(!isset($_POST["id"]) || !isset($_POST["fecha_falta"]) || !isset($_POST["fecha_inicial"]) || !isset($_POST["hora_ini"]) || !isset($_POST["min_ini"]) || !isset($_POST["materia"]) || !isset($_POST["grupo"])){
header("Location: ".$pag."?error=0"); header("Location: ".$pag."?error=0");
exit(); exit();
}*/ }*/
$id = filter_input(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT);//limpia texto $id = filter_input(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT);//limpia texto
$fecha_falta = trim(filter_input(INPUT_POST, "fecha_falta", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto $duracion_id = filter_input(INPUT_POST, "duracion", FILTER_SANITIZE_NUMBER_INT);//Id reposicion
$fecha = trim(filter_input(INPUT_POST, "fecha_inicial", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto $bloque = filter_input(INPUT_POST, "bloque", FILTER_SANITIZE_NUMBER_INT);//
$fecha_cambio = trim(filter_input(INPUT_POST, "fecha_cambio", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto $ciclo = filter_input(INPUT_POST, "ciclo", FILTER_SANITIZE_NUMBER_INT);//
$fecha_falta = trim(htmlspecialchars($_POST["fecha_falta"], ENT_QUOTES, "UTF-8"));//limpia texto
$fecha = trim(htmlspecialchars($_POST["fecha_inicial"], ENT_QUOTES, "UTF-8"));//limpia texto
$fecha_cambio = trim(htmlspecialchars($_POST["fecha_cambio"], ENT_QUOTES, "UTF-8"));//limpia texto
$hora_ini = filter_input(INPUT_POST, "hora_ini", FILTER_SANITIZE_NUMBER_INT);//limpia texto $hora_ini = filter_input(INPUT_POST, "hora_ini", FILTER_SANITIZE_NUMBER_INT);//limpia texto
$min_ini = filter_input(INPUT_POST, "min_ini", FILTER_SANITIZE_NUMBER_INT);//limpia texto $min_ini = filter_input(INPUT_POST, "min_ini", FILTER_SANITIZE_NUMBER_INT);//limpia texto
$hor = filter_input(INPUT_POST, "horario", FILTER_SANITIZE_NUMBER_INT);//limpia texto $hor = filter_input(INPUT_POST, "horario", FILTER_SANITIZE_NUMBER_INT);//limpia texto
$prof = $_SESSION["usuario_id"];
//if(isset($_POST["salon"]) && $_POST["salon"] != "")
//$salon = trim(filter_input(INPUT_POST, "salon", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
$comentario = trim(filter_input(INPUT_POST, "comentario", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
$alumnos = filter_input(INPUT_POST, "alumnos", FILTER_SANITIZE_NUMBER_INT);//limpia texto $alumnos = filter_input(INPUT_POST, "alumnos", FILTER_SANITIZE_NUMBER_INT);//limpia texto
$tipo = filter_input(INPUT_POST, "tipo", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio $tipo = filter_input(INPUT_POST, "tipo", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio
$aula = filter_input(INPUT_POST, "aula", FILTER_SANITIZE_NUMBER_INT);//1 regular , 2 sala computo, 3 otro facultad $aula = filter_input(INPUT_POST, "aula", FILTER_SANITIZE_NUMBER_INT);//1 regular , 2 sala computo, 3 otro facultad
$comentario = trim(filter_input(INPUT_POST, "comentario", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
$horario_rs = $db->querySingle('SELECT * from fs_horario_basic where id = :hor', if(empty($_POST["prof"]))
$prof = $user["id"];
else
$prof = filter_input(INPUT_POST, "prof", FILTER_SANITIZE_NUMBER_INT);//limpia texto
//if(isset($_POST["salon"]) && $_POST["salon"] != "")
//$salon = trim(filter_input(INPUT_POST, "salon", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
$comentario = trim(htmlspecialchars($_POST["comentario"], ENT_QUOTES, "UTF-8"));//limpia texto
$duracion_rs = $db->querySingle("select * from duracion where duracion_id = :id", [":id"=>$duracion_id]);
$duracion_tiempo = $duracion_rs["duracion_interval"];
$horario_rs = $db->querySingle('SELECT * from horario_view where horario_id = :hor',
[':hor' => $hor] [':hor' => $hor]
); );
$materia = $horario_rs["materia_id"]; $materia = $horario_rs["materia_id"];
$gpo = $horario_rs["grupo"]; $dia = $horario_rs["horario_dia"];
$duracion = $horario_rs["duracion_total"];
$dia = $horario_rs["dia"];
$hora = $hora_ini.":".$min_ini.":00"; $hora = $hora_ini.":".$min_ini.":00";
$fecha_new = DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d')." ".$hora; $fecha_new = DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d')." ".$hora;
$fecha_fin_new = date("Y-m-d H:i:00", strtotime($fecha_new.' + '.$duracion.' minute')); $fecha_fin_new = date("Y-m-d", strtotime($fecha_new))." ".$duracion_tiempo;
$dia_new = date('w', strtotime($fecha_new)); $dia_new = date('w', strtotime($fecha_new));
echo $fecha_new."<br>"; //echo $fecha_new."<br>";
echo $fecha_fin_new."<br>"; //echo $fecha_fin_new."<br>";
if($tipo == 1){//Reposición if($tipo == 1){//Reposición
$fecha_falta = DateTime::createFromFormat('d/m/Y', $fecha_falta)->format('Y-m-d'); $fecha_falta = DateTime::createFromFormat('d/m/Y', $fecha_falta)->format('Y-m-d');
$dia_falta = date('w', strtotime($fecha_falta)); $dia_falta = date('w', strtotime($fecha_falta));
@@ -76,40 +88,36 @@ if($tipo == 1){//Reposición
//Valida que profesor no este en 2 reposiciones al mismo tiempo //Valida que profesor no este en 2 reposiciones al mismo tiempo
*/ */
$traslape = $db->querySingle('SELECT * from traslape_profesor_reposicion(:prof, :fecha, :hora, :dur)', $traslape = $db->querySingle('SELECT * from traslape_profesor_reposicion(:prof, :fecha, :hora, :dur)',
[':prof' => $prof, ':fecha'=>$fecha_falta, ':hora'=>$hora, ':dur'=>$duracion] [':prof' => $prof, ':fecha'=>DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d'), ':hora'=>$hora, ':dur'=>$duracion_tiempo]
)["traslape_profesor_reposicion"]; )["traslape_profesor_reposicion"];
if($traslape){ if($traslape){
header("Location:".$pag."?error=9"); //header("Location:".$pag."?error=9");
echo "traslape";
exit(); exit();
} }
try{
$db->query('SELECT * from fu_reposicion(:id, :f_falta, :f_nueva, :hora_nueva, NULL, 1, :desc, :alumnos, true, :aula)',
[':id'=> $id, ':f_falta' => $fecha_falta, ':f_nueva' => $fecha_new, ':hora_nueva' => $hora,
':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula
]
);
}catch(Exception $e){
header("Location: ".$pag."?error=2");
exit();
}
/* /*
$log = new LogActividad(); $log = new LogActividad();
$desc_log = "Actualiza reposición ID[".$id."] Fechas[".$fecha_ini."][".$fecha_fin."] Periodo[".$_SESSION["periodo_id"]."] Materia[".$materia."] Profesor[".$prof."] Salon[".$salon."] Horario[".$hor."]"; $desc_log = "Actualiza reposición ID[".$id."] Fechas[".$fecha_ini."][".$fecha_fin."] Periodo[".$_SESSION["periodo_id"]."] Materia[".$materia."] Profesor[".$prof."] Salon[".$salon."] Horario[".$hor."]";
$log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);*/ $log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);*/
}else{ }
try{
$db->query('SELECT * from fu_reposicion(:id, :f_falta, :f_nueva, :hora_nueva, NULL, 1, :desc, :alumnos, true, :aula)',
[':id'=> $id, ':f_falta' => $fecha_falta, ':f_nueva' => $fecha_new, ':hora_nueva' => $hora,
':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula
]
);
}catch(Exception $e){
header("Location: ".$pag."?error=2");
exit();
}
try{
$db->query('SELECT * from fu_reposicion_solicitud(:id, :f_falta, :f_nueva, :hora_nueva, NULL, 1, :desc, :alumnos, :aula, :duracion_id, NULL)',
[':id'=> $id, ':f_falta' => $fecha_falta, ':f_nueva' => $fecha_new, ':hora_nueva' => $hora,
':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion_id' => $duracion_id
]
);
}catch(Exception $e){
//header("Location: ".$pag."?error=2");
print_r($e->getMessage());
echo "SELECT * from fu_reposicion_solicitud(:id, :f_falta, :f_nueva, :hora_nueva, NULL, 1, :desc, :alumnos, :aula, :duracion_id, NULL)'";
print_r(
[':id'=> $id, ':f_falta' => $fecha_falta, ':f_nueva' => $fecha_new, ':hora_nueva' => $hora,
':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion_id' => $duracion_id
]);
exit();
} }
header("Location: ".$pag); header("Location: ".$pag);
exit(); exit();

View File

@@ -313,8 +313,7 @@
<span class="mr-2" :class="`text-${registro.estado_color}`"> <span class="mr-2" :class="`text-${registro.estado_color}`">
<i :class="`${registro.estado_icon} ing-2x`"></i> <i :class="`${registro.estado_icon} ing-2x`"></i>
</span> </span>
<strong v-if="registro.usuario_nombre">{{ registro.usuario_nombre <strong v-if="registro.usuario_nombre">{{ registro.usuario_nombre }}</strong>
}}</strong>
</div> </div>
<div class="col-12" v-if="registro.registro_fecha_supervisor"> <div class="col-12" v-if="registro.registro_fecha_supervisor">
Hora Hora

View File

@@ -8,6 +8,7 @@
<?php <?php
include 'import/html_css_files.php'; include 'import/html_css_files.php';
?> ?>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/trix@2.0.0/dist/trix.css">
<style> <style>
[v-cloak] { [v-cloak] {
display: none; display: none;
@@ -31,20 +32,303 @@
?> ?>
<main class="container-fluid px-4 mt-4" id="app" v-cloak @vue:mounted="mounted" style="min-height: 70vh;"> <main class="container-fluid px-4 mt-4" id="app" v-cloak @vue:mounted="mounted" style="min-height: 70vh;">
<div class="table-responsive"> <!-- btn open modal -->
<? include_once 'import/periodo.php' ?>
<div class="row mb-4">
<div class="col-4">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#avisos-modal">
<div class="ing-mas"></div>
Nuevo aviso
</button>
</div>
</div>
<div class="table-responsive row" v-if="avisos.length">
<table class="table table-hover table-striped table-bordered table-sm"> <table class="table table-hover table-striped table-bordered table-sm">
<thead class="thead-dark"> <thead class="thead-dark">
<tr> <tr>
<th class="text-center">Fecha</th> <th class="text-center" style="width: 20%;">Fecha</th>
<th class="text-center">Aviso</th> <th class="text-center" style="width: 70%;">Aviso</th>
<th class="text-center">Estado</th> <th class="text-center" style="width: 10%;">Eliminar</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-for="aviso in avisos" :key="aviso.aviso_id" @click="aviso_shown = aviso">
<td class="text-center" data-toggle="modal" data-target="#aviso-extender">{{
aviso.aviso_fecha_inicial }} - {{ aviso.aviso_fecha_final }}</td>
<td class="text-center" data-toggle="modal" data-target="#aviso-mostrar">{{ aviso.aviso_titulo
}}</td>
<td class="text-center" data-toggle="modal" data-target="#aviso-suspender-modal"
@click="aviso_suspendido = aviso.aviso_id">
<span class="badge badge-pill badge-danger">
<div class="ing-borrar"></div>
</span>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div v-else class="alert alert-info" role="alert">
No hay avisos registrados
</div>
<div class="modal" tabindex="-1" role="dialog" accesskey="a" id="avisos-modal">
<div class="modal-dialog modal-xl" role="document">
<div class="modal-content">
<div class="modal-header text-white">
<h5 class="modal-title">Crear nuevo aviso</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true" class="text-white">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="container">
<div class="form-box">
<div class="form-group row">
<label for="fechaInicio" class="col-4 col-form-label">Fecha de inicio</label>
<div class="col-6">
<input type="text" class="form-control date-picker" id="fechaInicio"
name="fecha" v-model="new_aviso.fechaInicio" readonly
placeholder="aaaa-mm-dd">
</div>
</div>
<div class="form-group row">
<label for="fechaFin" class="col-4 col-form-label">Fecha fin</label>
<div class="col-6">
<input type="text" class="form-control date-picker" id="fechaFin" name="fecha"
v-model="new_aviso.fechaFin" readonly placeholder="aaaa-mm-dd">
</div>
</div>
<div class="form-group row">
<div class="col-6">
<label for="dlCarreras" class="col-4 col-form-label">Carreras</label>
<hr>
<div class="col-12 my-2" v-if="relevant_carreras.length">
<div id="dlCarreras" class="datalist datalist-select mb-1 w-100">
<div class="datalist-input">
Selecciona una carrera
</div>
<span class="icono ing-buscar"></span>
<ul style="display:none">
<!--
<li class="datalist-option" data-id="0"
@click="new_aviso.carreras = carreras">
Todas las carreras
</li>
-->
<li class="datalist-option" v-for="carrera in relevant_carreras"
:key="carrera.carrera_id" :data-id="carrera.carrera_id"
@click="new_aviso.carreras.push(carrera)"
style=" white-space: nowrap;">
(<small> {{carrera.clave_carrera}} </small>) {{
carrera.carrera_nombre }}
</li>
</ul>
<input type="hidden" id="carrera_id" name="id">
</div>
</div>
<ul class="list-group overflow-auto col-12" style="max-height: 200px;">
<li class="list-group-item list-group-item-action"
v-for="(carrera, index) in new_aviso.carreras" :key="carrera.carrera_id"
@click="new_aviso.carreras.splice(index, 1)">
<span class="icono ing-borrar text-danger"></span>
(<small> {{carrera.clave_carrera}} </small>) {{ carrera.carrera_nombre
}}
</li>
</ul>
<div class="col-4 my-2">
<button type="button" class="btn btn-danger btn-block"
@click="new_aviso.carreras = []">
<span class="icono ing-borrar"></span>
Limpiar
</button>
</div>
</div>
<div class="col-6">
<label for="profesor" class="col-4 col-form-label">Profesores</label>
<hr>
<div class="col-12" v-if="relevant_profesores.length">
<div class="form-row justify-content-around align-items-center">
<input id="profesor" name="profesor"
class="form-control col-11 mr-1 px-2"
placeholder="Seleccione una profesor" list="dlProfesor"
v-model="profesor" @input="addProfesor">
<button type="button"
class="btn btn-outline-danger btn-sm form-control col ml-auto"
@click="profesor = null">
<i class="ing-borrar"></i>
</button>
</div>
<datalist id="dlProfesor">
<option v-for="profesor in relevant_profesores"
:key="profesor.profesor_id" :value="formatProfesor(profesor)">
</datalist>
</div>
<ul class="list-group overflow-auto my-2 col-12" style="max-height: 200px;">
<li class="list-group-item list-group-item-action"
v-for="(profesor, index) in new_aviso.profesores"
:key="profesor.profesor_id"
@click="new_aviso.profesores.splice(index, 1)">
<span class="icono ing-borrar text-danger"></span>
(<small> {{profesor.profesor_clave}} </small>) {{
profesor.profesor_nombre }}
</li>
</ul>
<div class="col-4 my-2">
<button type="button" class="btn btn-danger btn-block"
@click="new_aviso.profesores = []">
<span class="icono ing-borrar"></span>
Limpiar
</button>
</div>
</div>
</div>
<div class="form-group row">
<label for="aviso" class="col-4 col-form-label">Etiqueta</label>
<div class="col-6">
<input type="text" class="form-control" id="aviso" name="aviso"
v-model="new_aviso.titulo" placeholder="Etiqueta del aviso">
</div>
</div>
<div class="form-group row">
<label for="aviso" class="col-4 col-form-label">Aviso</label>
<!-- always use relative units -->
<div class="col-6">
<input id="x" type="hidden" name="content">
<trix-editor input="x" class="form-control" id="descripcion" name="descripcion"
v-model="new_aviso.descripcion"
placeholder="Aviso que se mostrará en el checador"
style="min-height: 7em; max-height: 10em; overflow-y: auto;"></trix-editor>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-danger" data-dismiss="modal"
@click="new_aviso.reset()">Cancelar</button>
<button type="button" class="btn btn-primary" @click="createAviso()"
:disabled="!new_aviso.isValid" :class="{'disabled': !new_aviso.isValid}">
Guardar cambios
</button>
</div>
</div>
</div>
</div>
<div class="modal" tabindex="-1" role="dialog" accesskey="a" id="aviso-suspender-modal">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header text-white">
<h5 class="modal-title">Eliminar aviso</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true" class="text-white">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="container">
<h1>¿Está seguro que desea eliminar el aviso?</h1>
<em class="text-center">
<p>Esta acción no se puede deshacer</p>
</em>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-danger" data-dismiss="modal">Cancelar</button>
<button type="button" class="btn btn-danger" data-dismiss="modal"
@click="suspenderAviso()">Eliminar</button>
</div>
</div>
</div>
</div>
<div class="modal" tabindex="-1" role="dialog" accesskey="a" id="aviso-mostrar">
<div class="modal-dialog modal-dialog-centered" role="document" v-if="aviso_shown">
<div class="modal-content">
<div class="modal-header text-white">
<h5 class="modal-title">{{ aviso_shown.aviso_titulo }}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true" class="text-white">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="container">
<div class="row mb-2">
<div class="col-12">
<fieldset>
<legend>Fecha</legend>
<p class="text-center">{{ aviso_shown.aviso_fecha_inicial }} - {{
aviso_shown.aviso_fecha_final }}</p>
</fieldset>
<fieldset>
<legend>Aviso</legend>
<p class="text-center text-justify border rounded p-2 border-primary"
v-html="aviso_shown.aviso_texto"></p>
</fieldset>
<fieldset v-if="aviso_shown.profesores.length">
<legend>Profesores</legend>
<ul v-if="aviso_shown.profesores.length" class="list-group">
<li v-for="profesor in aviso_shown.profesores" :key="profesor.profesor_id"
class="list-group-item list-group-item-light">
{{ profesor.profesor_nombre }}
</li>
</ul>
</fieldset>
<fieldset v-if="aviso_shown.carreras.length">
<legend>Carreras</legend>
<ul class="list-group" v-if="aviso_shown.carreras.length">
<li v-for="carrera in aviso_shown.carreras" :key="carrera.carrera_id"
class="list-group-item list-group-item-light">
{{ carrera.carrera_nombre }}
</li>
</ul>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal" tabindex="-1" role="dialog" accesskey="a" id="aviso-extender">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header text-white">
<h5 class="modal-title">Extender aviso</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true" class="text-white">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="container" v-if="aviso_shown">
<fieldset>
<legend>{{ aviso_shown.aviso_titulo}}</legend>
<div class="form-group row">
<label for="uFechaFin" class="col-4 col-form-label">Fecha fin</label>
<div class="col-6">
<input v-effect="initializeDatepickers($el)" type="text"
class="form-control date-picker" id="uFechaFin" name="fecha" readonly
placeholder="aaaa-mm-dd" v-model="aviso_shown.aviso_fecha_final">
</div>
</div>
</fieldset>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-danger" data-dismiss="modal">Cancelar</button>
<button type="button" class="btn btn-primary" data-dismiss="modal"
@click="updateAviso(aviso_shown)">Extender</button>
</div>
</div>
</div>
</div>
</main> </main>
<? include "import/html_footer.php"; ?> <? include "import/html_footer.php"; ?>
@@ -52,10 +336,16 @@
<script src="js/jquery.min.js"></script> <script src="js/jquery.min.js"></script>
<script src="js/jquery-ui.js"></script> <script src="js/jquery-ui.js"></script>
<script src="js/bootstrap/bootstrap.min.js"></script> <script src="js/bootstrap/bootstrap.min.js"></script>
<script src="js/datalist.js"></script>
<script src="js/datepicker-es.js"></script> <script src="js/datepicker-es.js"></script>
<script src="js/avisos.js?<?= rand(0, 2) ?>" type="module"></script> <script src="js/avisos.js?<?= rand(0, 2) ?>" type="module"></script>
<script src="js/scrollables.js"></script> <script src="js/scrollables.js"></script>
<script type="text/javascript" src="https://unpkg.com/trix@2.0.0/dist/trix.umd.min.js"></script>
<script>
document.addEventListener("trix-file-accept", function (event) {
event.preventDefault()
})
</script>
</body> </body>
</html> </html>

View File

@@ -11,9 +11,9 @@ $remainingTime = $endOfDay - $currentTime;
session_set_cookie_params($remainingTime, '/', $_SERVER['HTTP_HOST'], false, true); session_set_cookie_params($remainingTime, '/', $_SERVER['HTTP_HOST'], false, true);
session_start(); session_start();
require_once($ruta ?? '') . "include/bd_pdo.php"; require_once "{$_SERVER['DOCUMENT_ROOT']}/include/bd_pdo.php";
require_once($ruta ?? '') . "class/c_logasistencia.php"; require_once "{$_SERVER['DOCUMENT_ROOT']}/class/c_logasistencia.php";
require_once($ruta ?? '') . "vendor/autoload.php"; require_once "{$_SERVER['DOCUMENT_ROOT']}/vendor/autoload.php";
/* /*
$user->acceso // Devuelve el tipo de acceso del usuario. Si es administrador, retorna "w". De lo contrario, verifica el tipo de acceso a una página específica y retorna ese valor. $user->acceso // Devuelve el tipo de acceso del usuario. Si es administrador, retorna "w". De lo contrario, verifica el tipo de acceso a una página específica y retorna ese valor.
@@ -102,7 +102,7 @@ class Login
{ {
global $db; global $db;
if (!Login::validaUsuario($user, $pass)) if (!self::validaUsuario($user, $pass))
return ['error' => true, 'msg' => 'Error al autenticar usuario']; return ['error' => true, 'msg' => 'Error al autenticar usuario'];
if ($db->has("FS_VALIDACLAVEULSA('$user')")) { if ($db->has("FS_VALIDACLAVEULSA('$user')")) {
@@ -126,16 +126,16 @@ class Login
session_destroy(); session_destroy();
} }
public static function get_user(): Login public static function get_user(): ?Login
{ {
if (Login::is_logged()) { if (self::is_logged()) {
$user = unserialize($_SESSION["user"]); $user = unserialize($_SESSION["user"]);
return $user; return $user;
} }
header("Location: /"); header("Location: /");
exit(); exit();
} }
private static function is_logged(): bool public static function is_logged(): bool
{ {
return isset($_SESSION["user"]); return isset($_SESSION["user"]);
} }

View File

@@ -1,5 +1,5 @@
<?php <?php
require_once ($ruta ?? "./") . "vendor/autoload.php"; require_once "{$_SERVER['DOCUMENT_ROOT']}/vendor/autoload.php";
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load(); $dotenv->load();
use \SeinopSys\PostgresDb; use \SeinopSys\PostgresDb;
@@ -40,7 +40,7 @@ function query(string $sql, array $params = null, bool $single = true)
try { try {
$stmt = $pdo->prepare($sql); $stmt = $pdo->prepare($sql);
$stmt->execute($params); $stmt->execute($params);
$response = $single ? $stmt->fetch(PDO::FETCH_ASSOC) : $stmt->fetchAll(PDO::FETCH_ASSOC); $response = $single ? $stmt->fetch(PDO::FETCH_ASSOC) : $stmt->fetchAll(PDO::FETCH_ASSOC);
return $response; return $response;
} catch (PDOException $e) { } catch (PDOException $e) {

View File

@@ -1,5 +1,148 @@
import { createApp } from 'https://unpkg.com/petite-vue?module'; import { createApp, reactive } from 'https://unpkg.com/petite-vue?module';
const new_aviso = reactive({
titulo: '',
descripcion: '',
fechaInicio: '',
fechaFin: '',
profesores: [],
carreras: [],
reset() {
this.titulo = '';
this.descripcion = '';
this.fechaInicio = '';
this.fechaFin = '';
this.profesores = [];
this.carreras = [];
},
get isValid() {
return this.titulo !== '' && this.descripcion !== '' && this.fechaInicio !== '' && this.fechaFin !== '' && (this.profesores.length > 0 || this.carreras.length > 0) && this.facultad_id !== null;
},
});
// define datepicker method
const app = createApp({ const app = createApp({
mounted() { new_aviso,
profesores: [],
carreras: [],
avisos: [],
profesor: null,
formatProfesor(profesor) {
return `(${profesor.profesor_clave}) ${profesor.profesor_nombre}`;
},
addProfesor() {
const profesorObj = this.profesores.find((profesor) => this.profesor === this.formatProfesor(profesor));
if (profesorObj) {
this.new_aviso.profesores.push(profesorObj);
this.profesor = null;
}
},
aviso_shown: null,
// int?
aviso_suspendido: null,
suspenderAviso() {
if (this.aviso_suspendido) {
const aviso = this.avisos.find((aviso) => aviso.aviso_id === this.aviso_suspendido);
if (aviso) {
this.deleteAviso(aviso);
}
}
},
get relevant_profesores() {
// not in array new_aviso.profesores
const relevant = this.profesores.filter((profesor) => !this.new_aviso.profesores.map((profesor) => profesor.profesor_id).includes(profesor.profesor_id));
// console.log('profesores:', this.profesores.map((profesor: Profesor) => profesor.profesor_nombre), 'relevant:', relevant.map((profesor: Profesor) => profesor.profesor_nombre), 'new_aviso:', this.new_aviso.profesores.map((profesor: Profesor) => profesor.profesor_nombre))
return relevant;
},
get relevant_carreras() {
// not in array new_aviso.carreras
return this.carreras.filter((carrera) => !this.new_aviso.carreras.includes(carrera));
},
createAviso() {
const data = {
aviso_titulo: this.new_aviso.titulo,
aviso_texto: this.new_aviso.descripcion,
aviso_fecha_inicial: this.new_aviso.fechaInicio,
aviso_fecha_final: this.new_aviso.fechaFin,
profesores: this.new_aviso.profesores.map((profesor) => profesor.profesor_id),
carreras: this.new_aviso.carreras.map((carrera) => carrera.carrera_id),
};
fetch('/action/avisos.php', {
method: 'POST',
body: JSON.stringify(data)
}).then(res => res.json()).then(res => {
if (res.success) {
// hydrate with carreras and profesores
this.avisos.push({
...data,
carreras: this.carreras.filter((carrera) => data.carreras.includes(carrera.carrera_id)),
profesores: this.profesores.filter((profesor) => data.profesores.includes(profesor.profesor_id)),
aviso_estado: true,
aviso_id: res.aviso_id,
});
this.new_aviso.reset();
}
else {
alert(res.error);
console.log(res.errors);
}
});
},
deleteAviso(aviso) {
fetch(`/action/avisos.php`, {
method: 'DELETE',
body: JSON.stringify({ aviso_id: aviso.aviso_id })
}).then(res => res.json()).then(res => {
if (res.success) {
this.avisos = this.avisos.filter((aviso) => aviso.aviso_id !== this.aviso_suspendido);
this.aviso_suspendido = null;
}
else {
alert(res.error);
console.log(res.errors);
}
});
},
updateAviso() {
fetch(`/action/avisos.php`, {
method: 'PUT',
body: JSON.stringify({
aviso_id: this.aviso_shown.aviso_id,
aviso_fecha_final: this.aviso_shown.aviso_fecha_final,
})
}).then(res => res.json()).then(res => {
if (res.success) {
}
else {
alert(res.error);
console.log(res.errors);
}
});
},
async initializeDatepickers($el) {
const periodo = await fetch('action/periodo_datos.php');
const periodo_data = await periodo.json();
$('.date-picker').datepicker({
dateFormat: 'yy-mm-dd',
maxDate: periodo_data.periodo_fecha_fin,
minDate: 0,
});
$($el).on('change', () => {
this.aviso_shown.aviso_fecha_final = $($el).val();
});
},
async mounted() {
this.avisos = await fetch("/action/avisos.php").then(res => res.json());
this.profesores = await fetch('/action/action_profesor.php').then(res => res.json());
this.carreras = await fetch('/action/action_carreras.php').then(res => res.json());
await this.initializeDatepickers();
const fechaInicio = $('#fechaInicio.date-picker');
const fechaFin = $('#fechaFin.date-picker');
fechaInicio.on("change", function () {
new_aviso.fechaInicio = fechaInicio.val();
fechaFin.datepicker("option", "minDate", fechaInicio.val());
});
fechaFin.on("change", function () {
new_aviso.fechaFin = fechaFin.val();
fechaInicio.datepicker("option", "maxDate", fechaFin.val());
});
} }
}).mount('#app'); }).mount('#app');

View File

@@ -38,6 +38,7 @@ const setDatalist = (selector, value = -1) => {
$(selector).val(value); $(selector).val(value);
$('.datalist li').removeClass("selected"); $('.datalist li').removeClass("selected");
$(this).addClass("selected"); $(this).addClass("selected");
$(this).click();
}); });
} }
const makeRequiredDatalist = (selector, required = true) => $(selector).closest('.datalist').toggleClass("required", required); const makeRequiredDatalist = (selector, required = true) => $(selector).closest('.datalist').toggleClass("required", required);
@@ -60,6 +61,7 @@ function setDatalistFirst(selector) {
} }
} }
function disableDatalist(selector, disabled = true) { function disableDatalist(selector, disabled = true) {
var elementRoot = $(selector).parents('.datalist'); var elementRoot = $(selector).parents('.datalist');
if (disabled) { if (disabled) {
@@ -78,6 +80,7 @@ function invalidDatalist(selector, invalid = true) {
elementRoot.removeClass("datalist-invalid"); elementRoot.removeClass("datalist-invalid");
} }
//¿Se usa?
function buscaDatalist(selector, valor) { function buscaDatalist(selector, valor) {
selector.find('ul li').each(function () { selector.find('ul li').each(function () {
var elem = $(this); var elem = $(this);

46
package-lock.json generated
View File

@@ -1,18 +1,18 @@
{ {
"name": "admin_checador (pruebas)", "name": "paad",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"dependencies": { "dependencies": {
"@popperjs/core": "^2.11.7", "@popperjs/core": "^2.11.7",
"@types/jqueryui": "^1.12.18",
"axios": "^1.4.0", "axios": "^1.4.0",
"es6-promise": "^4.2.8", "es6-promise": "^4.2.8",
"moment": "^2.29.4", "moment": "^2.29.4",
"petite-vue": "^0.4.1" "petite-vue": "^0.4.1"
}, },
"devDependencies": { "devDependencies": {
"@types/bootstrap": "^5.2.6",
"@types/file-saver": "^2.0.5", "@types/file-saver": "^2.0.5",
"@types/jquery": "^3.5.14", "@types/jquery": "^3.5.14",
"@types/node": "^20.2.1" "@types/node": "^20.2.1"
@@ -27,15 +27,6 @@
"url": "https://opencollective.com/popperjs" "url": "https://opencollective.com/popperjs"
} }
}, },
"node_modules/@types/bootstrap": {
"version": "5.2.6",
"resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.6.tgz",
"integrity": "sha512-BlAc3YATdasbHoxMoBWODrSF6qwQO/E9X8wVxCCSa6rWjnaZfpkr2N6pUMCY6jj2+wf0muUtLySbvU9etX6YqA==",
"dev": true,
"dependencies": {
"@popperjs/core": "^2.9.2"
}
},
"node_modules/@types/file-saver": { "node_modules/@types/file-saver": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz",
@@ -46,11 +37,18 @@
"version": "3.5.14", "version": "3.5.14",
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz",
"integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==",
"dev": true,
"dependencies": { "dependencies": {
"@types/sizzle": "*" "@types/sizzle": "*"
} }
}, },
"node_modules/@types/jqueryui": {
"version": "1.12.18",
"resolved": "https://registry.npmjs.org/@types/jqueryui/-/jqueryui-1.12.18.tgz",
"integrity": "sha512-crlmH8kFzIiU+4aBFgvYUjykSaOTP5RDw7NqkFkcSNWFAF/SMPrr7sY1uNXDEhite/2pEwUoZlufQoy87A22LA==",
"dependencies": {
"@types/jquery": "*"
}
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.2.1", "version": "20.2.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.1.tgz",
@@ -60,8 +58,7 @@
"node_modules/@types/sizzle": { "node_modules/@types/sizzle": {
"version": "2.3.3", "version": "2.3.3",
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
"integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ=="
"dev": true
}, },
"node_modules/asynckit": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
@@ -178,15 +175,6 @@
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz",
"integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==" "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw=="
}, },
"@types/bootstrap": {
"version": "5.2.6",
"resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.6.tgz",
"integrity": "sha512-BlAc3YATdasbHoxMoBWODrSF6qwQO/E9X8wVxCCSa6rWjnaZfpkr2N6pUMCY6jj2+wf0muUtLySbvU9etX6YqA==",
"dev": true,
"requires": {
"@popperjs/core": "^2.9.2"
}
},
"@types/file-saver": { "@types/file-saver": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz",
@@ -197,11 +185,18 @@
"version": "3.5.14", "version": "3.5.14",
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz",
"integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==",
"dev": true,
"requires": { "requires": {
"@types/sizzle": "*" "@types/sizzle": "*"
} }
}, },
"@types/jqueryui": {
"version": "1.12.18",
"resolved": "https://registry.npmjs.org/@types/jqueryui/-/jqueryui-1.12.18.tgz",
"integrity": "sha512-crlmH8kFzIiU+4aBFgvYUjykSaOTP5RDw7NqkFkcSNWFAF/SMPrr7sY1uNXDEhite/2pEwUoZlufQoy87A22LA==",
"requires": {
"@types/jquery": "*"
}
},
"@types/node": { "@types/node": {
"version": "20.2.1", "version": "20.2.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.1.tgz",
@@ -211,8 +206,7 @@
"@types/sizzle": { "@types/sizzle": {
"version": "2.3.3", "version": "2.3.3",
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
"integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ=="
"dev": true
}, },
"asynckit": { "asynckit": {
"version": "0.4.0", "version": "0.4.0",

View File

@@ -1,12 +1,12 @@
{ {
"devDependencies": { "devDependencies": {
"@types/bootstrap": "^5.2.6",
"@types/file-saver": "^2.0.5", "@types/file-saver": "^2.0.5",
"@types/jquery": "^3.5.14", "@types/jquery": "^3.5.14",
"@types/node": "^20.2.1" "@types/node": "^20.2.1"
}, },
"dependencies": { "dependencies": {
"@popperjs/core": "^2.11.7", "@popperjs/core": "^2.11.7",
"@types/jqueryui": "^1.12.18",
"axios": "^1.4.0", "axios": "^1.4.0",
"es6-promise": "^4.2.8", "es6-promise": "^4.2.8",
"moment": "^2.29.4", "moment": "^2.29.4",

View File

@@ -1,47 +1,62 @@
<?php <?php
require_once 'class/c_login.php'; require_once 'class/c_login.php';
if (!isset($_SESSION['user'])){
die(header('Location: index.php'));
}
//$user = unserialize($_SESSION['user']);
$user = Login::get_user(); $user = Login::get_user();
$user->access(); $user->access();
//if (!$user->admin && in_array($user->acceso, ['n'])) echo $user;
//die(header('Location: main.php?error=1')); /*print_r($user);
print_r($user->user["id"]);
echo "****|";
print_r($user->acceso);//null sin permisos, w o r
echo "|****|";
print_r($user->profesor);
echo "|****|";
print_r($user->facultad["facultad_id"]);
exit();*/
//profesor, admin, rol, facultad
if ($user->acceso === null && !$user->admin){
die(header('Location: index.php'));
exit();
}
$user->print_to_log('Reposiciones'); $supervisor = false;
$coordinador = false;
if($user->rol["rol_id"]==7){
$supervisor = true;
}
if($user->rol["rol_id"]==9){
$coordinador = true;
}
//$user->print_to_log('Reposiciones');
//$write = $user->admin || in_array($user->acceso, ['w']); //$write = $user->admin || in_array($user->acceso, ['w']);
$write = true; // $write = true; //
function duracionMinutos($fechahora_i, $fechahora_f){ function duracionMinutos($fechahora_i, $fechahora_f){
return round((strtotime($fechahora_f) - strtotime($fechahora_i)) / 60,2); return round((strtotime($fechahora_f) - strtotime($fechahora_i)) / 60,2);
} }
if($user->periodo_id!= ""){
if(!empty($user->periodo)){ $en_fecha = $db->querySingle("SELECT ESTA_EN_PERIODO(NOW()::DATE, :periodo_id)", [':periodo_id' => $user->periodo_id])['esta_en_periodo'];
$en_fecha = $db->querySingle("SELECT ESTA_EN_PERIODO(NOW()::DATE, :periodo_id)", [':periodo_id' => $user->periodo])['esta_en_periodo'];
$profesores_rs = array(); $profesores_rs = array();
$tab_inicial = 1; $tab_inicial = 1;
if($user->jefe_carrera){ if(!$supervisor){
$carrera_rs = $db->query('SELECT * FROM fs_usuario_carrera(:usr, NULL)', [':usr'=>$user->user["id"]]); $fac_id = $user->facultad["facultad_id"];
foreach($carrera_rs as $carr){ $carrera_rs = $db->query('SELECT * FROM fs_profesor_facultad(:fac, :periodo)', [':fac'=>$fac_id, ':periodo' => $user->periodo_id]);
$rs = $db->query('SELECT * FROM fs_profesor_carrera(:carr, :periodo)', [':carr' => $carr['carrera_id'], ':periodo' => $user->periodo]);
$profesores_rs = array_merge($profesores_rs, $rs);
}
}else if($write){// $user->supervisor || $user->admin
$profesores_rs = $db->query('SELECT * FROM fs_profesor_carrera(NULL, :periodo)', [':periodo' => $user->periodo]);
$tab_inicial = 2;
}else{ }else{
die(header('Location: index.php')); $carrera_rs = $db->query('SELECT * FROM fs_profesor_facultad(NULL, :periodo)', [ ':periodo' => $user->periodo_id]);
} }
$salones_rs = $db->query('SELECT * FROM salon_view WHERE tiene_salones IS true'); $salones_rs = $db->query('SELECT * FROM salon_view WHERE tiene_salones IS true');
//Periodo //Periodo
$periodo_rs = $db->querySingle('SELECT periodo_fecha_inicio, periodo_fecha_fin FROM periodo WHERE periodo_id = :periodo_id', [':periodo_id' => $user->periodo]); $periodo_rs = $db->querySingle('SELECT periodo_fecha_inicio, periodo_fecha_fin FROM periodo WHERE periodo_id = :periodo_id', [':periodo_id' => $user->periodo_id]);
$periodo_fin = $periodo_rs["periodo_fecha_fin"]; $periodo_fin = $periodo_rs["periodo_fecha_fin"];
if(strtotime($periodo_rs["periodo_fecha_inicio"])>strtotime(date("Y-m-d")) ) if(strtotime($periodo_rs["periodo_fecha_inicio"])>strtotime(date("Y-m-d")) )
$fecha_man = date("d/m/Y", strtotime($periodo_rs["periodo_fecha_inicio"])); $fecha_man = date("d/m/Y", strtotime($periodo_rs["periodo_fecha_inicio"]));
@@ -73,13 +88,13 @@ if(!empty($user->periodo)){
$repEdo_rs = $db->query('SELECT * FROM fs_estado_reposicion' ); $repEdo_rs = $db->query('SELECT * FROM fs_estado_reposicion' );
$repoParams = array(); $repoParams = array();
$query = "";//carrera, prof $query = "NULL,";//carrera, prof
if($user->jefe_carrera){ /*if($user->jefe_carrera){
$query .= ":jefe, "; $query .= ":jefe, ";
$repoParams[":jefe"] = $user->user["id"]; $repoParams[":jefe"] = $user->user["id"];
}else{ }else{
$query .= "NULL, "; $query .= "NULL, ";
} }*/
if((isset($_POST["prof"]) && is_numeric($_POST["prof"])) ){ if((isset($_POST["prof"]) && is_numeric($_POST["prof"])) ){
$query .= ":prof,"; $query .= ":prof,";
$repoParams[":prof"] = filter_input(INPUT_POST, "prof", FILTER_SANITIZE_NUMBER_INT);//limpia texto $repoParams[":prof"] = filter_input(INPUT_POST, "prof", FILTER_SANITIZE_NUMBER_INT);//limpia texto
@@ -87,8 +102,15 @@ if(!empty($user->periodo)){
$query .= "NULL,"; $query .= "NULL,";
} }
$query .= ":f_ini, :f_fin, :edo, "; $query .= ":f_ini, :f_fin, :edo, ";
$repoParams[":f_ini"] = $fecha_ini;
$repoParams[":f_fin"] = $fecha_fin;
$date = DateTime::createFromFormat('d/m/Y', $fecha_ini);
$fecha_ini_db = $date->format('Y-m-d');
$date = DateTime::createFromFormat('d/m/Y', $fecha_fin);
$fecha_fin_db = $date->format('Y-m-d');
$repoParams[":f_ini"] = $fecha_ini_db;
$repoParams[":f_fin"] = $fecha_fin_db;
$repoParams[":edo"] = 1;//se sobreescribe $repoParams[":edo"] = 1;//se sobreescribe
} }
?> ?>
@@ -101,24 +123,26 @@ if(!empty($user->periodo)){
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="content-type" content="text/plain; charset=UTF-8" /> <meta http-equiv="content-type" content="text/plain; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<?php include_once "import/html_css_files.php"; ?> <?php
<link rel="stylesheet" href="css/jquery-ui.css"> include 'import/html_css_files.php';
<link rel="stylesheet" href="css/richtext.css" type="text/css"> ?>
<link rel="stylesheet" href="css/clockpicker.css">
<link rel="stylesheet" href="css/calendar.css">
<link rel="stylesheet" href="css/fa_all.css" type="text/css">
<script src="js/scrollables.js" defer></script> <script src="js/scrollables.js" defer></script>
<script> <script>
const write = <?= $write ? 'true' : 'false' ?>; const write = <?= $write ? 'true' : 'false' ?>;
</script> </script>
<script src="js/moment.js" defer></script>
<style> <style>
.wizard { height: 20px; width: 80%; background: #D0D0D0; } .wizard { height: 20px; width: 80%; background: #D0D0D0; }
.wizard.full { background: #D0D0D0; } .wizard.full { background: #D0D0D0; }
.wizard.active > div:first-child { background: #00A6CE; } .wizard.active > div:first-child { background: #00A6CE; }
.wizard.active > div:last-child { width: 0px; height: 0px; border-style: solid; border-width: 10px 0 10px 6px; border-color: transparent transparent transparent #00a6ce; transform: rotate(0deg); } .wizard.active > div:last-child { width: 0px; height: 0px; border-style: solid; border-width: 10px 0 10px 6px; border-color: transparent transparent transparent #00a6ce; transform: rotate(0deg); }
</style> </style>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap/popper.min.js"></script>
<script src="js/bootstrap/bootstrap.min.js"></script>
<script src="js/jquery-ui.js"></script>
<script src="js/datepicker-es.js"></script>
<script src="js/messages.js"></script>
</head> </head>
@@ -136,7 +160,7 @@ if(!empty($user->periodo)){
<section id="message"></section> <section id="message"></section>
<?php require('import/periodo.php') ?> <?php require('import/periodo.php') ?>
<?php if(!empty($user->periodo)){ ?> <?php if($user->periodo_id!= ""){ ?>
<form id="asistencia" method="post" onsubmit="return validaFechas()"> <form id="asistencia" method="post" onsubmit="return validaFechas()">
<div class="form-box"> <div class="form-box">
<input type="hidden" name="facultad" value="5"> <input type="hidden" name="facultad" value="5">
@@ -191,10 +215,10 @@ if(!empty($user->periodo)){
<a class="nav-link" id="tab1-tab" data-toggle="tab" href="#tab1" role="tab" aria-controls="calendario" aria-selected="true">Nuevas reposiciones</a> <a class="nav-link" id="tab1-tab" data-toggle="tab" href="#tab1" role="tab" aria-controls="calendario" aria-selected="true">Nuevas reposiciones</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" id="tab2-tab" data-toggle="tab" href="#tab2" role="tab" aria-controls="lista" aria-selected="false">Aprobadas por jefe</a> <a class="nav-link" id="tab2-tab" data-toggle="tab" href="#tab2" role="tab" aria-controls="lista" aria-selected="false">Aprobadas por Facultad</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" id="tab3-tab" data-toggle="tab" href="#tab3" role="tab" aria-controls="lista" aria-selected="false">Autorizadas</a> <a class="nav-link" id="tab3-tab" data-toggle="tab" href="#tab3" role="tab" aria-controls="lista" aria-selected="false">Autorizadas por Vicerrectoría</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" id="tab4-tab" data-toggle="tab" href="#tab4" role="tab" aria-controls="lista" aria-selected="false">Rechazadas</a> <a class="nav-link" id="tab4-tab" data-toggle="tab" href="#tab4" role="tab" aria-controls="lista" aria-selected="false">Rechazadas</a>
@@ -208,6 +232,7 @@ if(!empty($user->periodo)){
<?php <?php
$repoParams[":edo"]=$redo["estado_reposicion_id"]; $repoParams[":edo"]=$redo["estado_reposicion_id"];
$reposiciones_rs = $db->query('SELECT * FROM fs_reposicion(NULL, '.$query.'0, NULL) ', $repoParams ); $reposiciones_rs = $db->query('SELECT * FROM fs_reposicion(NULL, '.$query.'0, NULL) ', $repoParams );
?> ?>
<h4 class="mb-4" <?php echo "style='color:".$redo["estado_color"]."'>".$redo["estado_nombre"]; ?> </h4> <h4 class="mb-4" <?php echo "style='color:".$redo["estado_color"]."'>".$redo["estado_nombre"]; ?> </h4>
@@ -229,7 +254,7 @@ if(!empty($user->periodo)){
if(isset($reposiciones_rs)){ if(isset($reposiciones_rs)){
foreach($reposiciones_rs as $reposicion){ foreach($reposiciones_rs as $reposicion){
?> ?>
<tr data-id="<?php echo $reposicion["reposicion_id"]; ?>" data-edo="<?php echo $reposicion["estado_reposicion_id"];?>" id="id<?php echo $reposicion["reposicion_id"]; ?>"> <tr data-id="<?php echo $reposicion["reposicion_solicitud_id"]; ?>" data-edo="<?php echo $reposicion["estado_reposicion_id"];?>" id="id<?php echo $reposicion["reposicion_solicitud_id"]; ?>">
<td class="align-middle"> <td class="align-middle">
<?php if($reposicion["estado_reposicion_id"]<3){ ?> <?php if($reposicion["estado_reposicion_id"]<3){ ?>
<div class="wizard <?php if(intval($reposicion["estado_reposicion_id"])==2) echo "active";?> d-flex mx-auto"> <div class="wizard <?php if(intval($reposicion["estado_reposicion_id"])==2) echo "active";?> d-flex mx-auto">
@@ -298,11 +323,12 @@ if(!empty($user->periodo)){
<?php <?php
if($reposicion["estado_reposicion_id"]<4){ if($reposicion["estado_reposicion_id"]<4){
if( if(
(($user->jefe_carrera || $user->admin) && $reposicion["estado_reposicion_id"] <= 2) (($user->jefe_carrera || $user->admin || $coordinador) && $reposicion["estado_reposicion_id"] == 1)/* nueva */
|| ((!$user->jefe_carrera || $user->admin) && $reposicion["estado_reposicion_id"] >= 2 )){ || (($user->admin || $coordinador || $supervisor) && $reposicion["estado_reposicion_id"] == 2)/* aprobado facultad */
){
?> ?>
<a href="#" data-toggle="modal" data-target="#modal_confirm" title="Cancelar"><span class="text-danger"><?php echo $ICO["cancelar"];?></span></a> <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Cancelar"><span class="text-danger"><?php echo $ICO["cancelar"];?></span></a>
<?php } <?php }
} //estado } //estado
?> ?>
</td> </td>
@@ -351,6 +377,18 @@ if(!empty($user->periodo)){
<p class="rep-mat"></p> <p class="rep-mat"></p>
</div> </div>
</div> </div>
<div class="row">
<div class="col-6 col-sm-4 barra-right text-right">
<p class="font-weight-bold">Ciclo y bloque</p>
</div>
<div class="col-3">
<p><strong>Ciclo:</strong><span class="rep-ciclo ml-3"></span></p>
</div>
<div class="col-3">
<p><strong>Bloque:</strong><span class="rep-bloque ml-3"></span></p>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-6 col-sm-4 barra-right text-right"> <div class="col-6 col-sm-4 barra-right text-right">
<p class="font-weight-bold">Tipo</p> <p class="font-weight-bold">Tipo</p>
@@ -438,6 +476,14 @@ if(!empty($user->periodo)){
</div> </div>
</div> </div>
<div class="row mt-4" id="cancelada-block">
<div class="col-6 col-sm-4 barra-right text-right">
<p class="font-weight-bold text-danger">Motivo de cancelación</p>
</div>
<div class="col-6 bg-light">
<p class="rep-motivo"></p>
</div>
</div>
<div class="form-group row mt-3"> <div class="form-group row mt-3">
<div class="col-12 text-center"> <div class="col-12 text-center">
@@ -495,12 +541,7 @@ if(!empty($user->periodo)){
?> ?>
</main> </main>
</body> </body>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap/popper.min.js"></script>
<script src="js/bootstrap/bootstrap.min.js"></script>
<script src="js/jquery-ui.js"></script>
<script src="js/datepicker-es.js"></script>
<script src="js/messages.js"></script>
<?php <?php
//--Manejo de errores y mensajes de exito //--Manejo de errores y mensajes de exito
if(isset($_GET["error"]) && is_numeric($_GET["error"])){ if(isset($_GET["error"]) && is_numeric($_GET["error"])){
@@ -537,11 +578,6 @@ if(!empty($user->periodo)){
var _periodo_fecha_final = "<?php echo date("d/m/Y", strtotime($periodo_rs["periodo_fecha_fin"])); ?>"; var _periodo_fecha_final = "<?php echo date("d/m/Y", strtotime($periodo_rs["periodo_fecha_fin"])); ?>";
var datepickerOptions = { dateFormat: "dd/mm/yy", minDate:_periodo_fecha_inicial, maxDate:_periodo_fecha_final }; var datepickerOptions = { dateFormat: "dd/mm/yy", minDate:_periodo_fecha_inicial, maxDate:_periodo_fecha_final };
$(document).ready(function(){
$(".date-picker-filtro" ).datepicker(datepickerOptions);
$(".date-picker-filtro" ).datepicker( $.datepicker.regional[ "es" ] );
$('#tab<?php echo $tab_inicial;?>-tab').tab('show');
});
function valida(){ function valida(){
<?php <?php
@@ -556,6 +592,9 @@ if(!empty($user->periodo)){
} }
$(document).ready(function(){ $(document).ready(function(){
$(".date-picker-filtro" ).datepicker(datepickerOptions);
$(".date-picker-filtro" ).datepicker( $.datepicker.regional[ "es" ] );
$('#tab<?php echo $tab_inicial;?>-tab').tab('show');
$('#modal_confirm').on('show.bs.modal', function (event) { $('#modal_confirm').on('show.bs.modal', function (event) {
var button = $(event.relatedTarget); // Button that triggered the modal var button = $(event.relatedTarget); // Button that triggered the modal
@@ -566,10 +605,11 @@ if(!empty($user->periodo)){
$('#modal_aprobar').on('show.bs.modal', function (event) { $('#modal_aprobar').on('show.bs.modal', function (event) {
var button = $(event.relatedTarget); // Button that triggered the modal var button = $(event.relatedTarget); // Button that triggered the modal
//console.log(button.data("tipo")); console.log("Abre:"+button.data("tipo"));
var id = button.parents("tr").data("id"); var id = button.parents("tr").data("id");
var edo = button.data('tipo'); var edo = button.data('tipo');
//1 ver, 2 aprobar, 3 autorizar
$("#edo").val(edo); $("#edo").val(edo);
$("#id").val(id); $("#id").val(id);
@@ -587,7 +627,9 @@ if(!empty($user->periodo)){
}else{ }else{
$("#modal_aprobar .rep-prof").text(result["profesor_nombre"]); $("#modal_aprobar .rep-prof").text(result["profesor_nombre"]);
$("#modal_aprobar .rep-mat").text(result["materia_desc"]+" ["+result["grupo"]+"]" ); $("#modal_aprobar .rep-mat").text(result["materia_desc"]);
$("#modal_aprobar .rep-ciclo").text(result["ciclo"]);
$("#modal_aprobar .rep-bloque").text(result["bloque"]);
if(result["tipo"]) if(result["tipo"])
$("#modal_aprobar .rep-tipo").text("Reposición"); $("#modal_aprobar .rep-tipo").text("Reposición");
else else
@@ -605,14 +647,21 @@ if(!empty($user->periodo)){
$("#modal_aprobar .rep-comentarios").text(result["comentario"]); $("#modal_aprobar .rep-comentarios").text(result["comentario"]);
$('#modal_aprobar .rep-alumnos').text(result["alumnos"]); $('#modal_aprobar .rep-alumnos').text(result["alumnos"]);
if(button.data("tipo") == 1){//ver if(result["estado"] == 4){//cancelada
$('#modal_aprobar .rep-motivo').text(result["motivo_cancelacion"]);
$("#cancelada-block").show();
}else{
$("#cancelada-block").hide();
}
if(edo == 1){// 1 ver
$("#modalLabel").text("Detalle de reposición"); $("#modalLabel").text("Detalle de reposición");
$(".aprobar-block").hide(); $(".aprobar-block").hide();
$("#salon-ver").show(); $("#salon-ver").show();
$("#salon-editar").hide(); $("#salon-editar").hide();
}else{ }else{
if(parseInt($("#modal_aprobar .rep-aula").data("aula")) == 1){//ver if(parseInt($("#modal_aprobar .rep-aula").data("aula")) == 1){//tipo aula 1 (salon normal) - ver
$("#modalLabel").text("Detalle de reposición"); $("#modalLabel").text("Detalle de reposición");
$(".aprobar-block").hide(); $(".aprobar-block").hide();
$("#salon-ver").show(); $("#salon-ver").show();
@@ -620,7 +669,7 @@ if(!empty($user->periodo)){
}else{ }else{
$("#modalLabel").text("Aprobar reposición"); $("#modalLabel").text("Aprobar reposición");
$(".aprobar-block").show(); $(".aprobar-block").show();
if(button.data("tipo") == 3){//aprobar (con salón) if(edo == 3){//aprobar (con salón)
$("#salon-ver").hide(); $("#salon-ver").hide();
$("#salon-editar").show(); $("#salon-editar").show();
@@ -629,13 +678,13 @@ if(!empty($user->periodo)){
} }
if(result["aula_supervisor"]){//Solo supervisor if(result["aula_supervisor"]){//Solo supervisor
<?php if($user->supervisor){ ?> <?php if($supervisor){ ?>
$("#salon-editar").attr("disabled", false); $("#salon-editar").attr("disabled", false);
<?php }else{?> <?php }else{?>
$("#salon-editar").attr("disabled", true); $("#salon-editar").attr("disabled", true);
<?php } ?> <?php } ?>
}else{// Facultad }else{// Facultad
<?php if(!$user->supervisor){ ?> <?php if(!$supervisor){ ?>
$("#salon-editar").attr("disabled", false); $("#salon-editar").attr("disabled", false);
<?php }else{?> <?php }else{?>
$("#salon-editar").attr("disabled", true); $("#salon-editar").attr("disabled", true);

View File

@@ -19,10 +19,10 @@ echo "|****|";
print_r($user->facultad["facultad_id"]); print_r($user->facultad["facultad_id"]);
exit();*/ exit();*/
//profesor, admin, rol, facultad //profesor, admin, rol, facultad
/*if ($user->acceso === null || !$user->admin){ if ($user->acceso === null && !$user->admin){
die(header('Location: index.php')); //die(header('Location: index.php'));
exit(); exit();
}*/ }
//if (!$user->admin && in_array($user->acceso, ['n'])) //if (!$user->admin && in_array($user->acceso, ['n']))
@@ -161,7 +161,7 @@ $fecha_fin_db = $date->format('Y-m-d');
<?php <?php
$reposiciones_rs = $db->query('SELECT * FROM fs_reposiciones_solicitud(:f_ini, :f_fin, :usr ,NULL, NULL)', [':f_ini' => $fecha_ini_db, ':f_fin' => $fecha_fin_db, ':usr' => $user->user["id"]]); $reposiciones_rs = $db->query('SELECT * FROM fs_reposiciones_solicitud(:f_ini, :f_fin, :usr ,NULL, NULL)', [':f_ini' => $fecha_ini_db, ':f_fin' => $fecha_fin_db, ':usr' => $user->user["id"]]);
echo "SELECT * FROM fs_reposiciones_solicitud('$fecha_ini_db', '$fecha_fin_db', ".$user->user["id"]." ,NULL, NULL)".date("Y-m-d",strtotime($fecha_fin));
?> ?>
<div class="row"> <div class="row">
@@ -755,6 +755,7 @@ $fecha_fin_db = $date->format('Y-m-d');
type: 'POST', type: 'POST',
dataType: 'json', dataType: 'json',
data: { id: pid, }, data: { id: pid, },
async: false,
success: function(result) { success: function(result) {
if(result["error"]!= "" && result["error"] !== undefined){ if(result["error"]!= "" && result["error"] !== undefined){
triggerMessage(result["error"], "Error"); triggerMessage(result["error"], "Error");
@@ -813,6 +814,7 @@ $fecha_fin_db = $date->format('Y-m-d');
$(this).prop('selected', true); $(this).prop('selected', true);
} }
}); });
console.log("fin materia click");
} }
}, },
@@ -871,8 +873,6 @@ $fecha_fin_db = $date->format('Y-m-d');
//$(this).find(".form-control:first-child").focus(); //$(this).find(".form-control:first-child").focus();
$("#errorBox").collapse('hide'); $("#errorBox").collapse('hide');
$("#errorBox_text").html(""); $("#errorBox_text").html("");
if(tipo == 1){//alta if(tipo == 1){//alta
@@ -903,6 +903,7 @@ $fecha_fin_db = $date->format('Y-m-d');
//$("#materia").attr("readonly", true); //$("#materia").attr("readonly", true);
disableDatalist("#horario"); disableDatalist("#horario");
disableDatalist("#tipo"); disableDatalist("#tipo");
disableDatalist("#prof");
/*if($("#prof").length>0) /*if($("#prof").length>0)
disableDatalist("#prof"); disableDatalist("#prof");
$("#prof").attr("readonly", true);*/ $("#prof").attr("readonly", true);*/
@@ -919,14 +920,16 @@ $fecha_fin_db = $date->format('Y-m-d');
$("#modal").modal('hide'); $("#modal").modal('hide');
}else{ }else{
//setDatalist("#prof", result["profesor"]); //setDatalist("#prof", result["profesor"]);
$('#salon').val(result["salon"]); setDatalist("#prof", result["profesor"])
//$('#salon').val(result["salon"]);
$("#fecha_falta").val(result["fecha_clase"]); $("#fecha_falta").val(result["fecha_clase"]);
$('#hora_ini').val(result["hora_ini"]); $('#hora_ini').val(result["hora_ini"]);
$('#min_ini').val(result["min_ini"]); $('#min_ini').val(result["min_ini"]);
$('#comentario').val(result["comentario"]); $('#comentario').val(result["comentario"]);
$('#alumnos').val(result["alumnos"]); $('#alumnos').val(result["alumnos"]);
setDatalist("#horario", result["horario"]); $('#ciclo').val(result["ciclo"]);
setDatalist("#profesor", result["profesor"]); $('#bloque').val(result["bloque"]);
if(result["tipo"]){ if(result["tipo"]){
setDatalist("#tipo", 1); setDatalist("#tipo", 1);
cambiaTipo(1); cambiaTipo(1);
@@ -939,6 +942,8 @@ $fecha_fin_db = $date->format('Y-m-d');
_dia_valido = parseInt(result["dia"]); _dia_valido = parseInt(result["dia"]);
$(".date-picker" ).datepicker(datepickerOptions); $(".date-picker" ).datepicker(datepickerOptions);
$("#dlTipo ul li:selected").click(); $("#dlTipo ul li:selected").click();
console.log("llega a cambio horario"+result["horario"]);
setTimeout(setDatalist("#horario", result["horario"]), 20);// No se actualiza TODO
setDatalist("#aula", result["aula"]); setDatalist("#aula", result["aula"]);
modal.modal('show'); modal.modal('show');
} }
@@ -950,7 +955,6 @@ $fecha_fin_db = $date->format('Y-m-d');
} }
});//ajax });//ajax
} }
});//show });//show
}); });

View File

@@ -1,6 +1,207 @@
import { createApp, reactive } from 'https://unpkg.com/petite-vue?module' import { createApp, reactive } from 'https://unpkg.com/petite-vue?module'
type Profesor = {
profesor_clave: string;
profesor_correo: null | string;
profesor_grado: null | string;
profesor_id: number;
profesor_nombre: string;
}
type Carrera = {
carrera_activa: boolean;
carrera_comun: boolean;
carrera_id: number;
carrera_nombre: string;
clave_carrera: string;
facultad_id: number | null;
nivel_id: number;
}
type Periodo = {
created_at: Date;
estado_id: number;
fecha_final: Date;
id_periodo_sgu: number;
nivel_id: number;
periodo_clave: string;
periodo_fecha_fin: Date;
periodo_fecha_inicio: Date;
periodo_id: number;
periodo_nombre: string;
}
type Aviso = {
aviso_estado: boolean;
aviso_titulo: string;
aviso_fecha_final: Date;
aviso_fecha_inicial: Date;
aviso_id: number;
aviso_texto: string;
carreras: Carrera[];
facultad_id: null;
profesores: Profesor[];
}
const new_aviso = reactive({
titulo: '',
descripcion: '',
fechaInicio: '',
fechaFin: '',
profesores: [] as Array<Profesor>,
carreras: [] as Array<Carrera>,
reset() {
this.titulo = ''
this.descripcion = ''
this.fechaInicio = ''
this.fechaFin = ''
this.profesores = []
this.carreras = []
},
get isValid() {
return this.titulo !== '' && this.descripcion !== '' && this.fechaInicio !== '' && this.fechaFin !== '' && (this.profesores.length > 0 || this.carreras.length > 0) && this.facultad_id !== null
},
})
// define datepicker method
const app = createApp({ const app = createApp({
mounted() { new_aviso,
profesores: [] as Array<Profesor>,
carreras: [] as Array<Carrera>,
avisos: [] as Array<Aviso>,
profesor: null as String | null,
formatProfesor(profesor: Profesor) {
return `(${profesor.profesor_clave}) ${profesor.profesor_nombre}`
},
addProfesor() {
const profesorObj = this.profesores.find((profesor: Profesor) => this.profesor === this.formatProfesor(profesor))
if (profesorObj) {
this.new_aviso.profesores.push(profesorObj)
this.profesor = null
}
},
aviso_shown: null as Aviso | null,
// int?
aviso_suspendido: null as number | null,
suspenderAviso() {
if (this.aviso_suspendido) {
const aviso = this.avisos.find((aviso: Aviso) => aviso.aviso_id === this.aviso_suspendido)
if (aviso) {
this.deleteAviso(aviso)
}
}
},
get relevant_profesores() {
// not in array new_aviso.profesores
const relevant = this.profesores.filter((profesor: Profesor) => !this.new_aviso.profesores.map((profesor: Profesor) => profesor.profesor_id).includes(profesor.profesor_id))
// console.log('profesores:', this.profesores.map((profesor: Profesor) => profesor.profesor_nombre), 'relevant:', relevant.map((profesor: Profesor) => profesor.profesor_nombre), 'new_aviso:', this.new_aviso.profesores.map((profesor: Profesor) => profesor.profesor_nombre))
return relevant
},
get relevant_carreras() {
// not in array new_aviso.carreras
return this.carreras.filter((carrera: Carrera) => !this.new_aviso.carreras.includes(carrera))
},
createAviso() {
const data = {
aviso_titulo: this.new_aviso.titulo,
aviso_texto: this.new_aviso.descripcion,
aviso_fecha_inicial: this.new_aviso.fechaInicio,
aviso_fecha_final: this.new_aviso.fechaFin,
profesores: this.new_aviso.profesores.map((profesor: Profesor) => profesor.profesor_id),
carreras: this.new_aviso.carreras.map((carrera: Carrera) => carrera.carrera_id),
}
fetch('/action/avisos.php', {
method: 'POST',
body: JSON.stringify(data)
}).then(res => res.json()).then(res => {
if (res.success) {
// hydrate with carreras and profesores
this.avisos.push({
...data,
carreras: this.carreras.filter((carrera: Carrera) => data.carreras.includes(carrera.carrera_id)),
profesores: this.profesores.filter((profesor: Profesor) => data.profesores.includes(profesor.profesor_id)),
aviso_estado: true,
aviso_id: res.aviso_id,
})
this.new_aviso.reset()
}
else {
alert(res.error)
console.log(res.errors)
}
})
},
deleteAviso(aviso: Aviso) {
fetch(`/action/avisos.php`, {
method: 'DELETE',
body: JSON.stringify({ aviso_id: aviso.aviso_id })
}).then(res => res.json()).then(res => {
if (res.success) {
this.avisos = this.avisos.filter((aviso: Aviso) => aviso.aviso_id !== this.aviso_suspendido)
this.aviso_suspendido = null
}
else {
alert(res.error)
console.log(res.errors)
}
})
},
updateAviso() {
fetch(`/action/avisos.php`, {
method: 'PUT',
body: JSON.stringify({
aviso_id: this.aviso_shown.aviso_id,
aviso_fecha_final: this.aviso_shown.aviso_fecha_final,
})
}).then(res => res.json()).then(res => {
if (res.success) {
}
else {
alert(res.error)
console.log(res.errors)
}
})
},
async initializeDatepickers($el: HTMLElement) {
const periodo = await fetch('action/periodo_datos.php');
const periodo_data = await periodo.json() as Periodo;
$('.date-picker').datepicker({
dateFormat: 'yy-mm-dd',
maxDate: periodo_data.periodo_fecha_fin,
minDate: 0,
});
$($el).on('change', () => {
this.aviso_shown.aviso_fecha_final = $($el).val() as string;
});
},
async mounted() {
this.avisos = await fetch("/action/avisos.php").then(res => res.json()) as Array<Aviso>
this.profesores = await fetch('/action/action_profesor.php').then(res => res.json()) as Array<Profesor>
this.carreras = await fetch('/action/action_carreras.php').then(res => res.json()) as Array<Carrera>
await this.initializeDatepickers()
const fechaInicio = $('#fechaInicio.date-picker')
const fechaFin = $('#fechaFin.date-picker')
fechaInicio.on("change", function () {
new_aviso.fechaInicio = fechaInicio.val() as string
fechaFin.datepicker("option", "minDate", fechaInicio.val());
});
fechaFin.on("change", function () {
new_aviso.fechaFin = fechaFin.val() as string
fechaInicio.datepicker("option", "maxDate", fechaFin.val());
});
} }
}).mount('#app') }).mount('#app')

View File

@@ -8,7 +8,7 @@
"rootDir": "ts", "rootDir": "ts",
"target": "ES2022", "target": "ES2022",
"moduleResolution": "node", "moduleResolution": "node",
"module": "ESNext" "module": "ESNext",
// ts/auditoría.ts:1:37 - error TS2307: Cannot find module 'https://unpkg.com/petite-vue?module' or its corresponding type declarations. // ts/auditoría.ts:1:37 - error TS2307: Cannot find module 'https://unpkg.com/petite-vue?module' or its corresponding type declarations.
} }
} }