Alejandro Rosales 1 年之前
父节点
当前提交
76fe06b0df

+ 1 - 0
action/action_auditoria.php

@@ -68,6 +68,7 @@ try {
                 comentario,
                 registro_fecha_justificacion,
                 profesor.profesor_id, profesor_nombre, profesor_clave, profesor_correo,
+                horario_id,
                 materia, carrera, horarios.facultad_id, facultad, nivel, horario_hora, horario_fin, horario_grupo, horarios.salon,
                 fechas.registro_fecha_ideal,
                 estado_supervisor.estado_supervisor_id as estado_supervisor_id,

+ 33 - 15
action/reposicion_insert.php

@@ -7,7 +7,16 @@ $ruta = "../";
 require_once "../class/c_login.php";
 
 // 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']);
+//$user->access();
+
+$duracion_id = filter_input(INPUT_POST, "duracion", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio
+$bloque = filter_input(INPUT_POST, "bloque", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio
+$ciclo = filter_input(INPUT_POST, "ciclo", FILTER_SANITIZE_NUMBER_INT);//1 Repo , 0 Cambio
+$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_cambio = trim(htmlspecialchars($_POST["fecha_cambio"], ENT_QUOTES, "UTF-8"));//limpia texto
@@ -26,19 +35,21 @@ else
 //$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"];
+
 //-- Obtiene datos de horario regular de clase
-$horario_rs = $db->querySingle('SELECT * from fs_horario_basic where id = :hor',
+$horario_rs = $db->querySingle('SELECT * from horario_view where horario_id = :hor',
         [':hor' => $hor]
     );
     
 $materia = $horario_rs["materia_id"];
-$gpo = $horario_rs["grupo"];
-$duracion = $horario_rs["duracion_total"];
-$dia = $horario_rs["dia"];
+$dia = $horario_rs["horario_dia"];
 
 $hora = $hora_ini.":".$min_ini.":00";
 $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));
 
 if($tipo == 1){//Reposición
@@ -52,8 +63,10 @@ if($tipo == 1){//Reposición
 
 //Valida que tenga clase en la fecha de falta
 if(intval($dia) != intval($dia_falta)){
-    //header("Location:".$pag."?error=11");
-    echo intval($dia)." != ".intval($dia_falta);
+    header("Location:".$pag."?error=11");
+    /*print_r($_POST);
+    echo 'SELECT * from horario_view where horario_id = '.$hor;
+    echo intval($dia)." != ".intval($dia_falta);*/
     exit();
 }
 
@@ -66,24 +79,28 @@ if($tipo == 1){//Reposición
         exit();
     }
     */
-    //Valida que profesor no este en 2 reposiciones al mismo tiempo
+    //Valida que profesor no este en 2 reposiciones al mismo tiempo en la fecha nueva
     
     $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"];
     if($traslape){
+        //print_r($_POST);
+        //echo "SELECT * from traslape_profesor_reposicion($prof,'".DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d')."' , '$hora', $duracion)";
         header("Location:".$pag."?error=9");
         exit();
     }
 
     try{
-        $db->query('SELECT * from fi_reposicion(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 1, :desc, :alumnos, true, :aula, :duracion)',
+        $db->query('SELECT * from fi_reposicion_solicitud(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 1, :desc, :alumnos, true, :aula, :duracion, :usr, :bloque, :ciclo)',
             [':f_falta' => $fecha_falta, ':f_nueva' => $fecha_new, ':hora_nueva' => $hora, ':hor' => $hor,
-            ':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion
+            ':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion_id, ':usr'=>$user->user["id"],
+            ':bloque' => $bloque, ':ciclo' => $ciclo
             ]
         );
     }catch(Exception $e){
-        header("Location: ".$pag."?error=1");
+        echo $e->getMessage();
+        //header("Location: ".$pag."?error=1");
         exit();
     }
     
@@ -96,9 +113,10 @@ if($tipo == 1){//Reposición
 }else{//Cambio salón / hora
     
     try{
-        $db->query('SELECT * from fi_reposicion(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 1, :desc, :alumnos, true, :aula, :duracion)',
+        $db->query('SELECT * from fi_reposicion_solicitud(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 1, :desc, :alumnos, true, :aula, :duracion, :usr, :bloque, :ciclo)',
             [':f_falta' => $fecha_falta, ':f_nueva' => $fecha_cambio, ':hora_nueva' => $hora, ':hor' => $hor,
-            ':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion
+            ':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion_id, ':usr'=>$user->user["id"],
+            ':bloque' => $bloque, ':ciclo' => $ciclo
             ]
         );
     }catch(Exception $e){

+ 2 - 1
action/reposicion_profesor_materias.php

@@ -33,7 +33,8 @@ $user = unserialize($_SESSION['user']);
     foreach($rs as $m){
         $mat_arr[] = array("horario_id"=>$m["horario_id"], "horario_dia"=>$m["horario_dia"],
             "horario_hora"=>substr($m["horario_hora"], 0, 2), "horario_min"=>substr($m["horario_hora"], 3, 2),
-            "materia_nombre"=>$m["materia_nombre"].' - '.$m["horario_dia_nombre"]." ".substr($m["horario_hora"], 0, -3)
+            "materia_nombre"=>$m["materia_nombre"].' - '.$m["horario_dia_nombre"]." ".substr($m["horario_hora"], 0, -3),
+            "grupo"=>$m["horario_grupo"], "duracion" => $m["duracion"]
         );
     }
 

+ 30 - 17
action/rutas_salón_horario.php

@@ -81,29 +81,42 @@ try {
                             'horario_view',
                             columns: $columns
                         ),
-                    'query' => $db->getLastQuery(),
-                'reposiciones' => $db
-                    ->join('periodo', 'periodo.periodo_id = horario_view.periodo_id')
-                    ->join('registro', 'registro.horario_id = horario_view.horario_id')
-                    ->join('reposicion', 'registro.reposicion_id = reposicion.reposicion_id')
-                    ->join('bloque_horario', '(bloque_horario.hora_inicio, bloque_horario.hora_fin) OVERLAPS (reposicion_hora, reposicion_hora + horario_view.duracion)')
-                    ->join('profesor', 'profesor.profesor_id = registro.profesor_id')
-                    ->join('salon_view', 'salon_view.salon_id = reposicion.salon_id', 'LEFT')
-                    ->join('salon as salon_reposicion', 'salon_reposicion.salon_id = horario_view.salon_id', 'LEFT')
-                    ->where("CURRENT_DATE BETWEEN periodo.periodo_fecha_inicio AND periodo.periodo_fecha_fin")
-                    ->where("reposicion_fecha = CURRENT_DATE")
-                    ->where('bloque_horario.id', $_GET['bloque_horario_id'])
-                    ->where('salon_view.id_espacio_padre', $ruta['id_espacio_sgu'])
-                    ->get(
-                        'horario_view',
-                        columns: $columns
+                    // 'query' => $db->getLastQuery(),
+                    'reposiciones' => $db->query(
+                        'SELECT ' . implode(', ', $columns) . <<<SQL
+                            , reposicion_hora + horario_view.duracion as reposicion_fin
+                            FROM horario_view
+                                JOIN periodo USING (periodo_id)
+                                JOIN registro USING (horario_id)
+                                JOIN reposicion USING (reposicion_id)
+                                JOIN bloque_horario ON (bloque_horario.hora_inicio, bloque_horario.hora_fin) OVERLAPS (reposicion_hora, reposicion_hora + horario_view.duracion)
+                                JOIN profesor USING (profesor_id)
+                                JOIN salon_view as salon_reposicion ON (salon_reposicion.salon_id = reposicion.salon_id)
+                            WHERE
+                                CURRENT_DATE BETWEEN periodo.periodo_fecha_inicio
+                                AND periodo.periodo_fecha_fin
+                                AND reposicion_fecha = CURRENT_DATE
+                                AND bloque_horario.id = :bloque_horario_id
+                                AND salon_reposicion.id_espacio_padre = :id_espacio_sgu
+                                ORDER BY reposicion_hora
+                            SQL,
+                        [
+                            'bloque_horario_id' => $_GET['bloque_horario_id'],
+                            'id_espacio_sgu' => $ruta['id_espacio_sgu'],
+                        ]
                     ),
                 ],
                 $ruta,
             ),
             $data
         );
-        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+
+        $data = array_filter(
+            $data,
+            fn($ruta) => count($ruta['horarios']) > 0 || count($ruta['reposiciones']) > 0
+        );
+
+        echo json_encode(array_values($data), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
     } else {
         http_response_code(405);
         echo json_encode(['error' => 'method not allowed']);

+ 34 - 0
api/horario_profesor_log.php

@@ -0,0 +1,34 @@
+<?php
+
+require_once "{$_SERVER['DOCUMENT_ROOT']}/class/database.php";
+
+$rawInput = file_get_contents('php://input');
+$input = json_decode($rawInput, true);
+
+if (!$rawInput || !isset($input['profesor_id'], $input['log_id']) || $_SERVER['REQUEST_METHOD'] !== 'POST') {
+    http_response_code(400);
+    echo json_encode(['error' => 'Request error.']);
+    die();
+}
+
+
+$periodos = array_map(fn($array) => $array['id_periodo_sgu'], $db
+    ->join('periodo', 'periodo.periodo_id = horario_view.periodo_id')
+    ->join('horario_profesor', 'horario_profesor.horario_id = horario_view.horario_id')
+    ->where('profesor_id', $input['profesor_id'])
+    ->groupBy('id_periodo_sgu')
+    ->orderBy('id_periodo_sgu', 'DESC')
+    ->get('horario_view', 5, 'id_periodo_sgu'));
+
+$clave_profesor = $db->where('profesor_id', $input['profesor_id'])->getOne('profesor', 'profesor_clave')['profesor_clave'];
+
+$horarios = [];
+$rest = new Horarios();
+
+foreach ($periodos as $periodo) {
+    $horarios = array_merge($horarios, $rest->get(data: ['idPeriodo' => $periodo, 'claveProfesor' => $clave_profesor, 'fecha' => date('Y-m-d')]));
+}
+
+$db
+    ->where('log_id', $input['log_id'])
+    ->update("log_registro", ['horario_web' => json_encode($horarios)]);

+ 4 - 5
auditoria.php

@@ -282,8 +282,7 @@
                                 <button type="button" class="ml-3 btn btn-sm btn-outline-primary"
                                     @click="store.current.clase_vista = registro" data-toggle="modal"
                                     data-target="#ver-detalle">
-                                    <i class="ing-ojo"></i>
-                                    Ver detalle
+                                    <i class="ing-ojo"></i> detalle
                                 </button>
                             </td>
 
@@ -606,7 +605,7 @@
                                 </div>
                                 <div class="row mt-3">
                                     <div class="col-12">
-                                        <div class="form-check">
+                                        <div class="form-check" v-if="!store.current.justificada.justificacion">
                                             <input class="form-check-input" type="checkbox" value="" id="observaciones"
                                                 v-model="store.current.observaciones">
                                             <label class="form-check-label" for="observaciones">
@@ -616,8 +615,8 @@
                                     </div>
                                 </div>
 
-                                <hr v-if="store.current.observaciones">
-                                <div class="input-group" v-if="store.current.observaciones">
+                                <hr v-if="store.current.observaciones || store.current.justificada.justificacion">
+                                <div class="input-group" v-if="store.current.observaciones || store.current.justificada.justificacion">
                                     <div class="input-group-prepend">
                                         <span class="input-group-text text-white bg-primary">Observaciones</span>
                                     </div>

+ 147 - 0
class/c_abstract_data.php

@@ -0,0 +1,147 @@
+<?
+$ruta = '../';
+require "{$_SERVER['DOCUMENT_ROOT']}/class/c_login.php";
+
+trait DatabaseModel
+{
+
+    public function __construct(protected string $tableName, protected array $columns = [])
+    {
+    }
+
+    public function get(array $params = [], string $what = '*')
+    {
+        global $db;
+
+        $conditions = [];
+        foreach ($params as $key => $value) {
+            $conditions[] = "$key = :$key";
+        }
+
+        $sql = "SELECT $what FROM $this->tableName";
+        if ($conditions) {
+            $sql .= " WHERE " . implode(" AND ", $conditions);
+        }
+
+        $result = $db->query($sql, $params);
+        return $result;
+    }
+
+    protected function insert__(array $params = [], ?string $where = null)
+    {
+        global $db;
+
+        if ($where === null) {
+            $where = $this->tableName;
+        }
+
+        $columns = [];
+        foreach ($params as $key => $value) {
+            $columns[] = "$key = :$key";
+        }
+
+        $sql = "INSERT INTO $where SET " . implode(", ", $columns);
+        $result = $db->query($sql, $params);
+        return $result;
+
+    }
+}
+
+abstract class WebServiceSGU
+{
+    const BASE_URL = "https://portal.ulsa.edu.mx/servicios/AuditoriaAsistencialRest/AuditoriaAsistencialService.svc/auditoriaAsistencial";
+
+    private static array $keys = [
+        'username' => 'SGU_APSA_AUD_ASIST',
+        'password' => 'B4qa594JFPr2ufHrZdHS8A==',
+    ];
+
+    private static ?JsonSchema\Validator $validator = null;
+    private string $baseUrl;
+
+    public function __construct(protected string $endpoint, protected ?string $schema = null)
+    {
+        $this->baseUrl = self::BASE_URL . $endpoint;
+    }
+
+    private static function initCurl(array $options = [])
+    {
+        $ch = curl_init();
+        curl_setopt_array($ch, $options);
+        return $ch;
+    }
+
+    private static function get_token(): string
+    {
+        $curl = self::initCurl([
+            CURLOPT_URL => self::BASE_URL . "/inicioSesion/seleccionar",
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_CUSTOMREQUEST => "POST",
+            CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
+            CURLOPT_POSTFIELDS => json_encode(self::$keys),
+        ]);
+
+        $response = curl_exec($curl);
+        $err = curl_error($curl);
+        curl_close($curl);
+
+        if ($err)
+            throw new Exception("cURL Error: $err");
+
+        return trim($response, '"'); // remove quotes
+    }
+
+    protected function validate_schema($data): bool
+    {
+        if ($this->schema === null)
+            return true;
+
+        self::getValidator()->validate($data, (object) json_decode($this->schema));
+        return self::getValidator()->isValid();
+    }
+
+    public static function getValidator(): JsonSchema\Validator
+    {
+        return self::$validator ??= new JsonSchema\Validator();
+    }
+
+    public function get_errors(): array
+    {
+        return self::getValidator()->getErrors();
+    }
+
+    public function get(array $data = []): array
+    {
+        if (!$this->validate_schema($data)) {
+            throw new Exception('Invalid schema');
+        }
+
+        $ch = self::initCurl([
+            CURLOPT_POST => 1,
+            CURLOPT_POSTFIELDS => json_encode($data),
+            CURLOPT_URL => $this->baseUrl,
+            CURLOPT_HTTPHEADER => [
+                'Content-Type: application/json',
+                'Accept: application/json',
+                'username: ' . self::$keys['username'],
+                'token: ' . self::get_token(),
+            ],
+            CURLOPT_RETURNTRANSFER => 1,
+        ]);
+
+        $response = curl_exec($ch);
+        if (curl_errno($ch)) {
+            throw new Exception('cURL Error: ' . curl_error($ch));
+        }
+
+        curl_close($ch);
+
+        $response = json_decode($response, true);
+
+        if ($response === null) {
+            throw new Exception('Invalid response');
+        }
+
+        return $response;
+    }
+}

+ 119 - 0
class/database.php

@@ -0,0 +1,119 @@
+<?php
+header('Content-Type: application/json charset=utf-8');
+require_once "{$_SERVER['DOCUMENT_ROOT']}/class/c_abstract_data.php";
+
+final class Periodo_v1 extends WebServiceSGU
+{
+    public function __construct()
+    {
+        parent::__construct("/catalogos/periodos/v1/seleccionar");
+    }
+}
+final class Periodo_v2 extends WebServiceSGU
+{
+    public function __construct()
+    {
+        parent::__construct("/catalogos/periodos/v2/seleccionar");
+    }
+}
+final class Periodos extends WebServiceSGU
+{
+    // use DatabaseModel;
+    private readonly Periodo_v1 $periodo_v1;
+    private readonly Periodo_v2 $periodo_v2;
+
+
+    public function __construct()
+    {
+        parent::__construct("/catalogos/periodos/seleccionar");
+        $this->periodo_v1 = new Periodo_v1();
+        $this->periodo_v2 = new Periodo_v2();
+    }
+
+    public function get_v1(): array
+    {
+        return $this->periodo_v1->get();
+    }
+
+    public function get_v2(): array
+    {
+        return $this->periodo_v2->get();
+    }
+
+    public function get_merged(): array
+    {
+        $v2Data = $this->get_v2();
+
+        // Create an associative array with IdPeriodo as the key for faster lookup
+        $v2Lookup = array_column($v2Data, null, 'IdPeriodo');
+
+        return array_map(function ($itemV1) use ($v2Lookup) {
+            if (isset($v2Lookup[$itemV1['IdPeriodo']])) {
+                $itemV2 = $v2Lookup[$itemV1['IdPeriodo']];
+                $mergedItem = array_merge($itemV1, $itemV2);
+                unset($mergedItem['NombreCarrera']); // Remove NombreCarrera as specified
+                return $mergedItem;
+            }
+            return $itemV1; // If no matching IdPeriodo found in v2, return the original v1 item
+        }, $this->get_v1());
+    }
+}
+
+final class Espacios extends WebServiceSGU
+{
+    public function __construct()
+    {
+        parent::__construct("/catalogos/espacios/seleccionar");
+    }
+}
+
+final class Carreras extends WebServiceSGU
+{
+    public function __construct()
+    {
+        parent::__construct("/catalogos/carreras/seleccionar");
+    }
+}
+
+final class Horarios extends WebServiceSGU
+{
+    public function __construct()
+    {
+        parent::__construct(
+            "/seleccionar",
+            <<<JSON
+                {
+                    "\$schema": "http://json-schema.org/draft-07/schema#",
+                    "type": "object",
+                    "required": ["idPeriodo"],
+                    "properties": {
+                        "idPeriodo": {
+                            "type": "integer",
+                            "description": "Identificador del periodo a consultar."
+                        },
+                        "claveFacultad": {
+                            "type": "string",
+                            "description": "Clave de la facultad a consultar.",
+                            "pattern": "^[a-zA-Z0-9]*$"
+                        },
+                        "claveCarrera": {
+                            "type": "string",
+                            "description": "Clave de la carrera a consultar.",
+                            "pattern": "^[a-zA-Z0-9]*$"
+                        },
+                        "claveProfesor": {
+                            "type": "string",
+                            "description": "Clave del empleado a consultar.",
+                            "pattern": "^[a-zA-Z0-9]*$"
+                        },
+                        "fecha": {
+                            "type": "string",
+                            "description": "Fecha de la clase.",
+                            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
+                        }
+                    }
+                }
+            JSON
+        );
+    }
+}

+ 38 - 0
class/schema/periodo_v1.json

@@ -0,0 +1,38 @@
+{
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "type": "array",
+    "items": {
+        "type": "object",
+        "required": [
+            "IdNivel",
+            "IdPeriodo",
+            "NombreNivel",
+            "NombrePeriodo"
+        ],
+        "properties": {
+            "IdNivel": {
+                "type": "integer"
+            },
+            "IdPeriodo": {
+                "type": "integer"
+            },
+            "NombreNivel": {
+                "type": "string",
+                "enum": [
+                    "LICENCIATURA",
+                    "ESPECIALIDAD",
+                    "MAESTRÍA",
+                    "DOCTORADO",
+                    "COORDINACIÓN DE EDUCACIÓN FÍSICA Y DEPORTES",
+                    "COORDINACIÓN DE IMPULSO Y VIDA ESTUDIANTIL",
+                    "COORDINACIÓN DE FORMACIÓN CULTURAL",
+                    "VICERRECTORÍA DE BIENESTAR Y FORMACIÓN",
+                    "CENTRO DE IDIOMAS"
+                ]
+            },
+            "NombrePeriodo": {
+                "type": "string"
+            }
+        }
+    }
+}

+ 126 - 182
composer.lock

@@ -8,16 +8,16 @@
     "packages": [
         {
             "name": "econea/nusoap",
-            "version": "v0.9.15",
+            "version": "v0.9.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/f00b4r/nusoap.git",
-                "reference": "a5fd9cbbb0b83c94a099dadc8936ec7c2e1acfe1"
+                "reference": "9ead68ec7ad8d1e14943658ce1559435247d14bf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/f00b4r/nusoap/zipball/a5fd9cbbb0b83c94a099dadc8936ec7c2e1acfe1",
-                "reference": "a5fd9cbbb0b83c94a099dadc8936ec7c2e1acfe1",
+                "url": "https://api.github.com/repos/f00b4r/nusoap/zipball/9ead68ec7ad8d1e14943658ce1559435247d14bf",
+                "reference": "9ead68ec7ad8d1e14943658ce1559435247d14bf",
                 "shasum": ""
             },
             "require": {
@@ -33,8 +33,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "0.10.x-dev",
-                    "dev-develop": "1.0.x-dev"
+                    "dev-master": "0.10.x-dev"
                 }
             },
             "autoload": {
@@ -44,7 +43,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-2.0-only"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -65,7 +64,7 @@
             ],
             "support": {
                 "issues": "https://github.com/f00b4r/nusoap/issues",
-                "source": "https://github.com/f00b4r/nusoap/tree/v0.9.15"
+                "source": "https://github.com/f00b4r/nusoap/tree/v0.9.16"
             },
             "funding": [
                 {
@@ -73,7 +72,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-03-09T11:29:13+00:00"
+            "time": "2023-07-19T12:40:31+00:00"
         },
         {
             "name": "ezyang/htmlpurifier",
@@ -138,24 +137,24 @@
         },
         {
             "name": "graham-campbell/result-type",
-            "version": "v1.1.0",
+            "version": "v1.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/GrahamCampbell/Result-Type.git",
-                "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8"
+                "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8",
-                "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8",
+                "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
+                "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.2.5 || ^8.0",
-                "phpoption/phpoption": "^1.9"
+                "phpoption/phpoption": "^1.9.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "^8.5.28 || ^9.5.21"
+                "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
             },
             "type": "library",
             "autoload": {
@@ -184,7 +183,7 @@
             ],
             "support": {
                 "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
-                "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0"
+                "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1"
             },
             "funding": [
                 {
@@ -196,7 +195,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-07-30T15:56:11+00:00"
+            "time": "2023-02-25T20:23:15+00:00"
         },
         {
             "name": "justinrainbow/json-schema",
@@ -270,31 +269,35 @@
         },
         {
             "name": "maennchen/zipstream-php",
-            "version": "2.2.1",
+            "version": "3.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/maennchen/ZipStream-PHP.git",
-                "reference": "211e9ba1530ea5260b45d90c9ea252f56ec52729"
+                "reference": "b8174494eda667f7d13876b4a7bfef0f62a7c0d1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/211e9ba1530ea5260b45d90c9ea252f56ec52729",
-                "reference": "211e9ba1530ea5260b45d90c9ea252f56ec52729",
+                "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/b8174494eda667f7d13876b4a7bfef0f62a7c0d1",
+                "reference": "b8174494eda667f7d13876b4a7bfef0f62a7c0d1",
                 "shasum": ""
             },
             "require": {
-                "myclabs/php-enum": "^1.5",
-                "php": "^7.4 || ^8.0",
-                "psr/http-message": "^1.0",
-                "symfony/polyfill-mbstring": "^1.0"
+                "ext-mbstring": "*",
+                "ext-zlib": "*",
+                "php-64bit": "^8.1"
             },
             "require-dev": {
                 "ext-zip": "*",
-                "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0",
+                "friendsofphp/php-cs-fixer": "^3.16",
+                "guzzlehttp/guzzle": "^7.5",
                 "mikey179/vfsstream": "^1.6",
-                "php-coveralls/php-coveralls": "^2.4",
-                "phpunit/phpunit": "^8.5.8 || ^9.4.2",
-                "vimeo/psalm": "^4.1"
+                "php-coveralls/php-coveralls": "^2.5",
+                "phpunit/phpunit": "^10.0",
+                "vimeo/psalm": "^5.0"
+            },
+            "suggest": {
+                "guzzlehttp/psr7": "^2.4",
+                "psr/http-message": "^2.0"
             },
             "type": "library",
             "autoload": {
@@ -331,38 +334,42 @@
             ],
             "support": {
                 "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
-                "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.1"
+                "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.0"
             },
             "funding": [
+                {
+                    "url": "https://github.com/maennchen",
+                    "type": "github"
+                },
                 {
                     "url": "https://opencollective.com/zipstream",
                     "type": "open_collective"
                 }
             ],
-            "time": "2022-05-18T15:52:06+00:00"
+            "time": "2023-06-21T14:59:35+00:00"
         },
         {
             "name": "markbaker/complex",
-            "version": "3.0.1",
+            "version": "3.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/MarkBaker/PHPComplex.git",
-                "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22"
+                "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/ab8bc271e404909db09ff2d5ffa1e538085c0f22",
-                "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22",
+                "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+                "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.2 || ^8.0"
             },
             "require-dev": {
-                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
-                "phpcompatibility/php-compatibility": "^9.0",
-                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3",
-                "squizlabs/php_codesniffer": "^3.4"
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+                "squizlabs/php_codesniffer": "^3.7"
             },
             "type": "library",
             "autoload": {
@@ -388,36 +395,36 @@
             ],
             "support": {
                 "issues": "https://github.com/MarkBaker/PHPComplex/issues",
-                "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.1"
+                "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
             },
-            "time": "2021-06-29T15:32:53+00:00"
+            "time": "2022-12-06T16:21:08+00:00"
         },
         {
             "name": "markbaker/matrix",
-            "version": "3.0.0",
+            "version": "3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/MarkBaker/PHPMatrix.git",
-                "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576"
+                "reference": "728434227fe21be27ff6d86621a1b13107a2562c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/c66aefcafb4f6c269510e9ac46b82619a904c576",
-                "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576",
+                "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
+                "reference": "728434227fe21be27ff6d86621a1b13107a2562c",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.1 || ^8.0"
             },
             "require-dev": {
-                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
-                "phpcompatibility/php-compatibility": "^9.0",
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "phpcompatibility/php-compatibility": "^9.3",
                 "phpdocumentor/phpdocumentor": "2.*",
                 "phploc/phploc": "^4.0",
                 "phpmd/phpmd": "2.*",
-                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
                 "sebastian/phpcpd": "^4.0",
-                "squizlabs/php_codesniffer": "^3.4"
+                "squizlabs/php_codesniffer": "^3.7"
             },
             "type": "library",
             "autoload": {
@@ -444,85 +451,22 @@
             ],
             "support": {
                 "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
-                "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.0"
-            },
-            "time": "2021-07-01T19:01:15+00:00"
-        },
-        {
-            "name": "myclabs/php-enum",
-            "version": "1.8.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/myclabs/php-enum.git",
-                "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483",
-                "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483",
-                "shasum": ""
-            },
-            "require": {
-                "ext-json": "*",
-                "php": "^7.3 || ^8.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^9.5",
-                "squizlabs/php_codesniffer": "1.*",
-                "vimeo/psalm": "^4.6.2"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "MyCLabs\\Enum\\": "src/"
-                },
-                "classmap": [
-                    "stubs/Stringable.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "PHP Enum contributors",
-                    "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
-                }
-            ],
-            "description": "PHP Enum implementation",
-            "homepage": "http://github.com/myclabs/php-enum",
-            "keywords": [
-                "enum"
-            ],
-            "support": {
-                "issues": "https://github.com/myclabs/php-enum/issues",
-                "source": "https://github.com/myclabs/php-enum/tree/1.8.4"
+                "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
             },
-            "funding": [
-                {
-                    "url": "https://github.com/mnapoli",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2022-08-04T09:53:51+00:00"
+            "time": "2022-12-02T22:17:43+00:00"
         },
         {
             "name": "phpoffice/phpspreadsheet",
-            "version": "1.25.2",
+            "version": "1.29.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
-                "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5"
+                "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a317a09e7def49852400a4b3eca4a4b0790ceeb5",
-                "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fde2ccf55eaef7e86021ff1acce26479160a0fa0",
+                "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0",
                 "shasum": ""
             },
             "require": {
@@ -540,26 +484,26 @@
                 "ext-zip": "*",
                 "ext-zlib": "*",
                 "ezyang/htmlpurifier": "^4.15",
-                "maennchen/zipstream-php": "^2.1",
+                "maennchen/zipstream-php": "^2.1 || ^3.0",
                 "markbaker/complex": "^3.0",
                 "markbaker/matrix": "^3.0",
-                "php": "^7.3 || ^8.0",
+                "php": "^7.4 || ^8.0",
                 "psr/http-client": "^1.0",
                 "psr/http-factory": "^1.0",
                 "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
             },
             "require-dev": {
-                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-main",
                 "dompdf/dompdf": "^1.0 || ^2.0",
                 "friendsofphp/php-cs-fixer": "^3.2",
-                "mitoteam/jpgraph": "10.2.4",
-                "mpdf/mpdf": "8.1.1",
+                "mitoteam/jpgraph": "^10.3",
+                "mpdf/mpdf": "^8.1.1",
                 "phpcompatibility/php-compatibility": "^9.3",
                 "phpstan/phpstan": "^1.1",
                 "phpstan/phpstan-phpunit": "^1.0",
-                "phpunit/phpunit": "^8.5 || ^9.0",
+                "phpunit/phpunit": "^8.5 || ^9.0 || ^10.0",
                 "squizlabs/php_codesniffer": "^3.7",
-                "tecnickcom/tcpdf": "6.5"
+                "tecnickcom/tcpdf": "^6.5"
             },
             "suggest": {
                 "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
@@ -612,30 +556,30 @@
             ],
             "support": {
                 "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
-                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.25.2"
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.0"
             },
-            "time": "2022-09-25T17:21:01+00:00"
+            "time": "2023-06-14T22:48:31+00:00"
         },
         {
             "name": "phpoption/phpoption",
-            "version": "1.9.0",
+            "version": "1.9.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/schmittjoh/php-option.git",
-                "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab"
+                "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
-                "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
+                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e",
+                "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.2.5 || ^8.0"
             },
             "require-dev": {
-                "bamarni/composer-bin-plugin": "^1.8",
-                "phpunit/phpunit": "^8.5.28 || ^9.5.21"
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
             },
             "type": "library",
             "extra": {
@@ -677,7 +621,7 @@
             ],
             "support": {
                 "issues": "https://github.com/schmittjoh/php-option/issues",
-                "source": "https://github.com/schmittjoh/php-option/tree/1.9.0"
+                "source": "https://github.com/schmittjoh/php-option/tree/1.9.1"
             },
             "funding": [
                 {
@@ -689,25 +633,25 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-07-30T15:51:26+00:00"
+            "time": "2023-02-25T19:38:58+00:00"
         },
         {
             "name": "psr/http-client",
-            "version": "1.0.1",
+            "version": "1.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/http-client.git",
-                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+                "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
-                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+                "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+                "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.0 || ^8.0",
-                "psr/http-message": "^1.0"
+                "psr/http-message": "^1.0 || ^2.0"
             },
             "type": "library",
             "extra": {
@@ -727,7 +671,7 @@
             "authors": [
                 {
                     "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
+                    "homepage": "https://www.php-fig.org/"
                 }
             ],
             "description": "Common interface for HTTP clients",
@@ -739,27 +683,27 @@
                 "psr-18"
             ],
             "support": {
-                "source": "https://github.com/php-fig/http-client/tree/master"
+                "source": "https://github.com/php-fig/http-client/tree/1.0.2"
             },
-            "time": "2020-06-29T06:28:15+00:00"
+            "time": "2023-04-10T20:12:12+00:00"
         },
         {
             "name": "psr/http-factory",
-            "version": "1.0.1",
+            "version": "1.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/http-factory.git",
-                "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+                "reference": "e616d01114759c4c489f93b099585439f795fe35"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
-                "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+                "reference": "e616d01114759c4c489f93b099585439f795fe35",
                 "shasum": ""
             },
             "require": {
                 "php": ">=7.0.0",
-                "psr/http-message": "^1.0"
+                "psr/http-message": "^1.0 || ^2.0"
             },
             "type": "library",
             "extra": {
@@ -779,7 +723,7 @@
             "authors": [
                 {
                     "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
+                    "homepage": "https://www.php-fig.org/"
                 }
             ],
             "description": "Common interfaces for PSR-7 HTTP message factories",
@@ -794,31 +738,31 @@
                 "response"
             ],
             "support": {
-                "source": "https://github.com/php-fig/http-factory/tree/master"
+                "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
             },
-            "time": "2019-04-30T12:38:16+00:00"
+            "time": "2023-04-10T20:10:41+00:00"
         },
         {
             "name": "psr/http-message",
-            "version": "1.0.1",
+            "version": "2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/http-message.git",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.0"
+                "php": "^7.2 || ^8.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
@@ -833,7 +777,7 @@
             "authors": [
                 {
                     "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
+                    "homepage": "https://www.php-fig.org/"
                 }
             ],
             "description": "Common interface for HTTP messages",
@@ -847,9 +791,9 @@
                 "response"
             ],
             "support": {
-                "source": "https://github.com/php-fig/http-message/tree/master"
+                "source": "https://github.com/php-fig/http-message/tree/2.0"
             },
-            "time": "2016-08-06T14:39:51+00:00"
+            "time": "2023-04-04T09:54:51+00:00"
         },
         {
             "name": "psr/simple-cache",
@@ -951,16 +895,16 @@
         },
         {
             "name": "symfony/polyfill-ctype",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
-                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                 "shasum": ""
             },
             "require": {
@@ -975,7 +919,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -1013,7 +957,7 @@
                 "portable"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -1029,20 +973,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+                "reference": "42292d99c55abe617799667f454222c54c60e229"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
-                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+                "reference": "42292d99c55abe617799667f454222c54c60e229",
                 "shasum": ""
             },
             "require": {
@@ -1057,7 +1001,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -1096,7 +1040,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -1112,20 +1056,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-07-28T09:04:16+00:00"
         },
         {
             "name": "symfony/polyfill-php80",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php80.git",
-                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
-                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
                 "shasum": ""
             },
             "require": {
@@ -1134,7 +1078,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -1179,7 +1123,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -1195,7 +1139,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "vlucas/phpdotenv",
@@ -1290,5 +1234,5 @@
     "prefer-lowest": false,
     "platform": [],
     "platform-dev": [],
-    "plugin-api-version": "2.2.0"
+    "plugin-api-version": "2.3.0"
 }

+ 5 - 5
import/html_css_files.php

@@ -1,6 +1,6 @@
 <link rel="icon" type="image/png" href="imagenes/favicon.png" />
-<link rel="stylesheet" href="css/bootstrap-ulsa.min.css" type="text/css">
-<link rel="stylesheet" href="css/indivisa.css" type="text/css">
-<link rel="stylesheet" href="css/sgi.css?rand=<?php echo rand(); ?>" type="text/css">
-<link rel="stylesheet" href="css/style.css">
-<link rel="stylesheet" href="css/jquery-ui.css">
+<link rel="stylesheet" href="<?= $ruta ?? '' ?>css/bootstrap-ulsa.min.css" type="text/css">
+<link rel="stylesheet" href="<?= $ruta ?? '' ?>css/indivisa.css" type="text/css">
+<link rel="stylesheet" href="<?= $ruta ?? '' ?>css/sgi.css?rand=<?php echo rand(); ?>" type="text/css">
+<link rel="stylesheet" href="<?= $ruta ?? '' ?>css/style.css">
+<link rel="stylesheet" href="<?= $ruta ?? '' ?>css/jquery-ui.css">

+ 7 - 8
import/html_header.php

@@ -1,16 +1,15 @@
-<script defer src="js/sidebarmenu.js"></script>
+<script defer src="<?= $ruta ?? '' ?>js/sidebarmenu.js"></script>
 
 
 <?php
-require_once 'class/c_login.php';
-$ruta = "../";
-require_once 'include/bd_pdo.php';
+require_once ($ruta ?? '') . 'class/c_login.php';
+require_once ($ruta ?? '') . 'include/bd_pdo.php';
 
 $user = Login::get_user();
 
 $user->access();
 $pagina = substr(basename($_SERVER['PHP_SELF']), 0, -4);
-if ($pagina != "main" && !$user->acceso) {
+if (!in_array($pagina, ["main", "test"]) && !$user->acceso) {
     header('Location: main.php?error=1');
     exit;
 }
@@ -19,11 +18,11 @@ $grupos = $user->admin ? queryAll("SELECT * FROM GRUPO ORDER BY grupo_nombre") :
 
 function html_header($title, $header = null)
 {
-    global $grupos, $user, $db;
+    global $grupos, $user, $db, $ruta;
     ?>
     <aside id="sidebar" class="bg-light defaultShadow d-flex flex-column p-4">
         <div class="d-flex align-items-center mb-5">
-            <div class="logotipo"><a href="https://lasalle.mx/" target="_blank"><img src="imagenes/logo_lasalle.png"></a>
+            <div class="logotipo"><a href="https://lasalle.mx/" target="_blank"><img src="<?= $ruta ?? '' ?>imagenes/logo_lasalle.png"></a>
             </div>
             <div class="flex-grow-1 d-flex justify-content-end">
                 <nav class="navbar navbar-expand d-none d-flex">
@@ -94,7 +93,7 @@ function html_header($title, $header = null)
         <div class="container marco menu d-flex align-items-center">
             <div class="logotipo">
                 <a href="https://lasalle.mx/" target="_blank">
-                    <img src="imagenes/logo_lasalle.png">
+                    <img src="<?= $ruta ?? '' ?>imagenes/logo_lasalle.png">
                 </a>
             </div>
             <div class="flex-grow-1 d-flex justify-content-end">

+ 9 - 6
import/html_header_index.php

@@ -2,7 +2,7 @@
 require "include/constantes.php";
 function html_header($title, $header = null, $links = [])
 {
-?>
+    ?>
     <nav class="navbar sticky-top navbar-light bg-white">
         <header class="container-fluid">
             <div class="menu">
@@ -14,18 +14,21 @@ function html_header($title, $header = null, $links = [])
     <div class="row bg-info mx-0 barra-gris">
         <?php
         if ($header != null) {
-        ?>
+            ?>
             <div class="marco">
                 <div class="col-sm-12">
-                    <h2 class="text-muted"><?= $header; ?>
+                    <h2 class="text-muted">
+                        <?= $header; ?>
                 </div>
             </div>
         <?php } ?>
         <div class="marco">
             <div class="col-sm-12 py-3">
-                <h2 class="text-uppercase"><?= $title; ?></h2>
+                <h2 class="text-uppercase">
+                    <?= $title; ?>
+                </h2>
             </div>
         </div>
     </div>
-<?php
-}
+    <?php
+}

+ 188 - 0
logs.php

@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <title>Consultar horario |
+        <?= $user->facultad['facultad'] ?? 'General' ?>
+    </title>
+    <meta 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">
+    <?php include_once "import/html_css_files.php"; ?>
+</head>
+<style>
+    #jsonOutput {
+        background-color: #f4f4f4;
+        padding: 10px;
+        border-radius: 4px;
+        overflow-x: auto;
+    }
+</style>
+<!--  -->
+
+<body style="display: block;">
+    <?php
+    include('include/constantes.php');
+    include("import/html_header.php");
+
+    html_header("Logs");
+    ?>
+    <?= "<!-- $user -->" ?>
+    <main class="container content content-margin" id="local-app">
+        <div class="table-responsive">
+            <table class="table table-hover table-striped table-bordered table-sm">
+                <thead class="thead-dark">
+                    <tr>
+                        <th scope="col" class="text-center align-middle px-2">Fecha</th>
+                        <th scope="col" class="text-center align-middle px-2" width="10%">Hora</th>
+                        <th scope="col" class="text-center align-middle px-2">Clave</th>
+                        <th scope="col" class="text-center align-middle px-2">Profesor</th>
+                        <th scope="col" class="text-center align-middle px-2" width="7%">Horario</th>
+                        <th scope="col" class="text-center align-middle px-2">IP</th>
+                        <th scope="col" class="text-center align-middle px-2">Navegador</th>
+                        <th scope="col" class="text-center align-middle px-2">Información</th>
+                        <th scope="col" class="text-center align-middle px-2">Detalle</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <?
+                    global $db;
+                    $registros = $db
+                        ->where('momento::DATE = CURRENT_DATE')
+                        ->orderBy('momento', 'desc')
+                        ->get('log_registro');
+                    
+                    foreach ($registros as $log) {
+                        ?>
+                        <tr class="<?= $log['success'] ? '' : 'table-danger' ?>" data-id="<?= $log['log_id'] ?>">
+                            <td class="text-center align-middle px-2">
+                                <?= substr($log['momento'], 0, 10) ?>
+                            </td>
+                            <td class="text-center align-middle px-2">
+                                <?= substr($log['momento'], 11, 8) ?>
+                            </td>
+                            <td class="text-center align-middle px-2">
+                                <?= $log['clave'] ?>
+                            </td>
+                            <td class="text-center align-middle px-2">
+                                <?= $log['profesor'] ?>
+                            </td>
+                            <td class="text-center align-middle px-2">
+                                <?
+                                if ($log['horarios'] == null) {
+                                    echo "N/A";
+                                } else {
+                                    ?>
+                                    <button type="button" class="btn btn-info" data-toggle="modal" data-target="#horarioModal"
+                                        data-horario='<?= json_encode($log['horarios'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>'>
+                                        Horario
+                                    </button>
+                                    <?
+                                }
+                                ?>
+                            </td>
+
+                            <td class="text-center align-middle px-2">
+                                <?= $log['ip'] ?>
+                            </td>
+                            <td class="text-center align-middle px-2">
+                                <?= $log['navegador'] ?>
+                            </td>
+                            <td class="text-center align-middle px-2">
+                                <?= $log['informacion'] ?>
+                            </td>
+                            <td class="text-center align-middle px-2">
+                                <?= $log['detalle'] ?>
+                            </td>
+                        </tr>
+                        <?
+                    }
+                    ?>
+                </tbody>
+            </table>
+        </div>
+    </main>
+    <!-- Horario Modal -->
+    <div class="modal fade" id="horarioModal" tabindex="-1" role="dialog" aria-labelledby="horarioModalLabel"
+        aria-hidden="true">
+        <div class="modal-dialog modal-lg">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="horarioModalLabel">Horario</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <pre id="jsonOutput"></pre>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <?
+    include "import/html_footer.php";
+    ?>
+</body>
+<script src="js/jquery.min.js"></script>
+<script src="js/bootstrap/bootstrap.min.js"></script>
+<script src="https://unpkg.com/petite-vue"></script>
+<script>
+    $(document).ready(function () {
+        $('#horarioModal').on('show.bs.modal', function (event) {
+            const button = $(event.relatedTarget);
+            const horario = button.data('horario');
+            const modal = $(this);
+
+            // Ensure horario is an object
+            let parsedHorario;
+            if (typeof horario === 'string') {
+                parsedHorario = JSON.parse(JSON.parse(horario, (key, value) => {
+                    if (typeof value === 'string') {
+                        return value.replace(/\\n/g, '\n');
+                    }
+                    return value;
+                }));
+            } else {
+                parsedHorario = horario;
+            }
+
+            const formattedHorario = formatJson(parsedHorario);
+            modal.find('#jsonOutput').html(formattedHorario);
+        });
+    });
+
+
+    function formatJson(jsonObject) {
+        let formatted = '';
+
+        if (Array.isArray(jsonObject)) {
+            formatted += '<ol>';
+            for (let i = 0; i < jsonObject.length; i++) {
+                formatted += '<li>';
+                formatted += formatJson(jsonObject[i]);
+                formatted += '</li>';
+            }
+            formatted += '</ol>';
+        } else if (typeof jsonObject === 'object') {
+            formatted += '<ol>';
+            for (let key in jsonObject) {
+                formatted += '<li><strong>' + key + ':</strong> ';
+                formatted += formatJson(jsonObject[key]);
+                formatted += '</li>';
+            }
+            formatted += '</ol>';
+        } else {
+            formatted += jsonObject;
+        }
+
+        return formatted;
+    }
+
+
+</script>
+
+</html>

+ 72 - 0
logs/postgres.php

@@ -0,0 +1,72 @@
+<?
+ini_set('display_errors', 1);
+error_reporting(E_ALL);
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Archivos de log Postgres</title>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
+        integrity="sha512-iecdLmaskl7CVkqkXNQ/ZH/XLlvWZOJyj7Yy7tcenmpD1ypASozpmT/E0iPtmFIB46ZmdtAc9eNBvH0H/ZpiBw=="
+        crossorigin="anonymous" referrerpolicy="no-referrer" />
+    <?php
+    $ruta = "../";
+    include '../import/html_css_files.php';
+    include '../import/html_header.php';
+
+    html_header(
+        "Archivos de log Postgres",
+        "Archivos de log Postgres",
+    );
+    ?>
+</head>
+
+<body>
+    <main class="content marco">
+        <form method="POST" class="mb-3">
+            <label for="logDay">Select a day:</label>
+            <select name="logDay" id="logDay" class="form-control">
+
+                <option value="Mon">Monday</option>
+                <option value="Tue">Tuesday</option>
+                <option value="Wed">Wednesday</option>
+                <option value="Thu">Thursday</option>
+                <option value="Fri">Friday</option>
+                <option value="Sat">Saturday</option>
+                <option value="Sun">Sunday</option>
+            </select>
+            <button type="submit" class="btn btn-primary mt-2">View Log</button>
+        </form>
+
+        <?php
+        $password = 'admin';
+        echo "Output: <pre>" . shell_exec("sh ../pgsql-log/get-logs.sh 2>&1") . "</pre>";
+
+        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['logDay'])) {
+            $fileName = "../pgsql-log/postgresql-{$_POST['logDay']}.log";
+            echo "<h3>Log file for {$_POST['logDay']}:</h3>";
+            echo "<p>File path: $fileName</p>";
+
+            // execute a command in the shell: sudo sh get-logs.sh
+        
+
+            if (file_exists($fileName)) {
+                $fileContents = file_get_contents($fileName);
+                echo "<pre>" . htmlspecialchars($fileContents) . "</pre>";
+            } else {
+                echo "Log file for " . $_POST['logDay'] . " does not exist.";
+            }
+        }
+        ?>
+    </main>
+    <?php
+    include "../import/html_footer.php";
+    ?>
+    <script src="<?= $ruta ?? '' ?>js/jquery.min.js"></script>
+    <script src="<?= $ruta ?? '' ?>js/bootstrap/bootstrap.min.js"></script>
+</body>
+
+</html>

+ 23 - 0
pgsql-log/get-logs.sh

@@ -0,0 +1,23 @@
+#!/bin/bash
+
+# Source and destination directories
+SRC_DIR="/var/lib/pgsql/15/data/log/"
+DEST_DIR="/usr/share/nginx/html/paad/pgsql-log/"
+
+# Days of the week
+DAYS=("Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun")
+
+echo "Done"
+# Iterate over each day and copy the file if it exists
+for day in "${DAYS[@]}"; do
+    src_file="${SRC_DIR}postgresql-${day}.log"
+    dest_file="${DEST_DIR}postgresql-${day}.log"
+    
+    if [[ -f "$src_file" ]]; then
+        sudo cp "$src_file" "$dest_file"
+        echo "Copied ${src_file} to ${dest_file}"
+    else
+        echo "File ${src_file} not found"
+    fi
+    
+done

+ 0 - 0
pgsql-log/postgresql-Fri.log


+ 0 - 0
pgsql-log/postgresql-Mon.log


+ 0 - 0
pgsql-log/postgresql-Sat.log


+ 0 - 0
pgsql-log/postgresql-Sun.log


+ 5 - 0
pgsql-log/postgresql-Thu.log

@@ -0,0 +1,5 @@
+2023-09-14 00:04:57.032 UTC [1335198] LOG:  could not receive data from client: Connection timed out
+2023-09-14 00:05:29.800 UTC [1335199] LOG:  could not receive data from client: Connection timed out
+2023-09-14 00:15:52.392 UTC [1335630] LOG:  could not receive data from client: Connection timed out
+2023-09-14 00:15:52.392 UTC [1335631] LOG:  could not receive data from client: Connection timed out
+2023-09-14 00:15:52.392 UTC [1335632] LOG:  could not receive data from client: Connection timed out

+ 159 - 0
pgsql-log/postgresql-Tue.log

@@ -0,0 +1,159 @@
+2023-09-12 00:12:17.352 UTC [1093788] LOG:  could not receive data from client: Connection timed out
+2023-09-12 00:12:17.352 UTC [1093789] LOG:  could not receive data from client: Connection timed out
+2023-09-12 00:12:17.355 UTC [1093796] LOG:  could not receive data from client: Connection timed out
+2023-09-12 16:04:38.145 UTC [1278220] FATAL:  database "paad" does not exist
+2023-09-12 16:04:38.211 UTC [1278221] FATAL:  database "paad" does not exist
+2023-09-12 16:04:38.587 UTC [1278222] FATAL:  database "paad" does not exist
+2023-09-12 16:04:39.607 UTC [1278223] FATAL:  database "paad" does not exist
+2023-09-12 16:04:43.386 UTC [1278224] FATAL:  database "paad" does not exist
+2023-09-12 16:04:51.218 UTC [1278225] FATAL:  database "paad" does not exist
+2023-09-12 16:04:53.150 UTC [1278227] FATAL:  database "paad" does not exist
+2023-09-12 16:04:53.161 UTC [1278228] FATAL:  database "paad" does not exist
+2023-09-12 16:04:53.654 UTC [1278229] FATAL:  database "paad" does not exist
+2023-09-12 16:04:55.210 UTC [1278230] FATAL:  database "paad" does not exist
+2023-09-12 16:04:55.569 UTC [1278231] FATAL:  database "paad" does not exist
+2023-09-12 16:05:07.666 UTC [1278240] FATAL:  database "paad" does not exist
+2023-09-12 16:05:08.015 UTC [1278241] FATAL:  database "paad" does not exist
+2023-09-12 16:05:08.173 UTC [1278242] FATAL:  database "paad" does not exist
+2023-09-12 16:05:08.548 UTC [1278243] FATAL:  database "paad" does not exist
+2023-09-12 16:05:08.590 UTC [1278244] FATAL:  database "paad" does not exist
+2023-09-12 16:05:08.807 UTC [1278245] FATAL:  database "paad" does not exist
+2023-09-12 16:05:09.198 UTC [1278246] FATAL:  database "paad" does not exist
+2023-09-12 16:05:09.964 UTC [1278247] FATAL:  database "paad" does not exist
+2023-09-12 16:05:10.657 UTC [1278248] FATAL:  database "paad" does not exist
+2023-09-12 16:05:14.658 UTC [1278252] FATAL:  database "paad" does not exist
+2023-09-12 16:05:15.371 UTC [1278253] FATAL:  database "paad" does not exist
+2023-09-12 16:05:16.303 UTC [1278255] FATAL:  database "paad" does not exist
+2023-09-12 16:05:16.462 UTC [1278256] FATAL:  database "paad" does not exist
+2023-09-12 16:05:16.834 UTC [1278257] FATAL:  database "paad" does not exist
+2023-09-12 16:05:17.022 UTC [1278258] FATAL:  database "paad" does not exist
+2023-09-12 16:05:17.222 UTC [1278259] FATAL:  database "paad" does not exist
+2023-09-12 16:05:17.392 UTC [1278260] FATAL:  database "paad" does not exist
+2023-09-12 16:05:17.574 UTC [1278261] FATAL:  database "paad" does not exist
+2023-09-12 16:05:17.952 UTC [1278262] FATAL:  database "paad" does not exist
+2023-09-12 16:05:18.880 UTC [1278263] FATAL:  database "paad" does not exist
+2023-09-12 16:05:20.321 UTC [1278265] FATAL:  database "paad" does not exist
+2023-09-12 16:05:20.681 UTC [1278266] FATAL:  database "paad" does not exist
+2023-09-12 16:05:29.281 UTC [1278280] FATAL:  database "paad" does not exist
+2023-09-12 16:05:35.416 UTC [1278284] FATAL:  database "paad" does not exist
+2023-09-12 16:05:41.918 UTC [1278285] FATAL:  database "paad" does not exist
+2023-09-12 16:05:44.962 UTC [1278286] FATAL:  database "paad" does not exist
+2023-09-12 16:05:45.403 UTC [1278287] FATAL:  database "paad" does not exist
+2023-09-12 16:05:45.567 UTC [1278288] FATAL:  database "paad" does not exist
+2023-09-12 16:05:45.745 UTC [1278289] FATAL:  database "paad" does not exist
+2023-09-12 16:05:45.946 UTC [1278290] FATAL:  database "paad" does not exist
+2023-09-12 16:05:45.947 UTC [1278291] FATAL:  database "paad" does not exist
+2023-09-12 16:05:46.204 UTC [1278292] FATAL:  database "paad" does not exist
+2023-09-12 16:05:46.316 UTC [1278293] FATAL:  database "paad" does not exist
+2023-09-12 16:05:46.741 UTC [1278294] FATAL:  database "paad" does not exist
+2023-09-12 16:05:47.078 UTC [1278295] FATAL:  database "paad" does not exist
+2023-09-12 16:05:47.334 UTC [1278296] FATAL:  database "paad" does not exist
+2023-09-12 16:05:47.696 UTC [1278297] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.307 UTC [1278299] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.310 UTC [1278300] FATAL:  expected SASL response, got message type 88
+2023-09-12 16:05:48.318 UTC [1278301] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.326 UTC [1278302] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.336 UTC [1278303] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.344 UTC [1278304] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.441 UTC [1278305] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.452 UTC [1278306] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.461 UTC [1278307] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.469 UTC [1278308] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.477 UTC [1278309] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.486 UTC [1278310] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.539 UTC [1278311] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.656 UTC [1278312] FATAL:  database "paad" does not exist
+2023-09-12 16:05:48.740 UTC [1278313] FATAL:  database "paad" does not exist
+2023-09-12 16:05:49.097 UTC [1278314] FATAL:  database "paad" does not exist
+2023-09-12 16:05:49.308 UTC [1278315] FATAL:  database "paad" does not exist
+2023-09-12 16:05:49.441 UTC [1278316] FATAL:  database "paad" does not exist
+2023-09-12 16:05:49.592 UTC [1278317] FATAL:  database "paad" does not exist
+2023-09-12 16:05:49.839 UTC [1278318] FATAL:  database "paad" does not exist
+2023-09-12 16:05:50.213 UTC [1278319] FATAL:  database "paad" does not exist
+2023-09-12 16:05:50.244 UTC [1278320] FATAL:  database "paad" does not exist
+2023-09-12 16:05:50.584 UTC [1278321] FATAL:  database "paad" does not exist
+2023-09-12 16:05:50.661 UTC [1278322] FATAL:  database "paad" does not exist
+2023-09-12 16:05:51.031 UTC [1278323] FATAL:  database "paad" does not exist
+2023-09-12 16:05:53.822 UTC [1278325] FATAL:  database "paad" does not exist
+2023-09-12 16:05:54.197 UTC [1278326] FATAL:  database "paad" does not exist
+2023-09-12 16:05:55.686 UTC [1278327] FATAL:  database "paad" does not exist
+2023-09-12 16:05:55.686 UTC [1278328] FATAL:  database "paad" does not exist
+2023-09-12 16:05:55.692 UTC [1278329] LOG:  invalid length of startup packet
+2023-09-12 16:05:55.739 UTC [1278330] FATAL:  database "paad" does not exist
+2023-09-12 16:05:55.830 UTC [1278331] FATAL:  database "paad" does not exist
+2023-09-12 16:05:55.923 UTC [1278332] FATAL:  database "paad" does not exist
+2023-09-12 16:05:56.048 UTC [1278333] FATAL:  database "paad" does not exist
+2023-09-12 16:05:56.140 UTC [1278334] FATAL:  database "paad" does not exist
+2023-09-12 16:05:56.168 UTC [1278335] FATAL:  database "paad" does not exist
+2023-09-12 16:05:56.224 UTC [1278336] FATAL:  database "paad" does not exist
+2023-09-12 16:05:56.316 UTC [1278337] FATAL:  database "paad" does not exist
+2023-09-12 16:05:56.684 UTC [1278338] FATAL:  database "paad" does not exist
+2023-09-12 16:05:57.391 UTC [1278339] FATAL:  database "paad" does not exist
+2023-09-12 16:05:57.392 UTC [1278340] FATAL:  expected SASL response, got message type 88
+2023-09-12 16:05:57.763 UTC [1278341] FATAL:  database "paad" does not exist
+2023-09-12 16:05:58.118 UTC [1278342] FATAL:  database "paad" does not exist
+2023-09-12 16:05:58.280 UTC [1278343] FATAL:  database "paad" does not exist
+2023-09-12 16:05:58.514 UTC [1278344] FATAL:  database "paad" does not exist
+2023-09-12 16:05:58.849 UTC [1278350] FATAL:  database "paad" does not exist
+2023-09-12 16:05:59.251 UTC [1278351] FATAL:  database "paad" does not exist
+2023-09-12 16:05:59.313 UTC [1278352] FATAL:  database "paad" does not exist
+2023-09-12 16:05:59.438 UTC [1278353] FATAL:  database "paad" does not exist
+2023-09-12 16:05:59.794 UTC [1278354] FATAL:  database "paad" does not exist
+2023-09-12 16:06:00.072 UTC [1278355] FATAL:  database "paad" does not exist
+2023-09-12 16:06:00.193 UTC [1278356] FATAL:  database "paad" does not exist
+2023-09-12 16:06:00.193 UTC [1278357] FATAL:  database "paad" does not exist
+2023-09-12 16:06:00.196 UTC [1278358] FATAL:  expected SASL response, got message type 88
+2023-09-12 16:06:00.422 UTC [1278359] FATAL:  database "paad" does not exist
+2023-09-12 16:06:00.424 UTC [1278360] FATAL:  expected SASL response, got message type 88
+2023-09-12 16:06:00.793 UTC [1278361] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.106 UTC [1278362] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.124 UTC [1278363] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.411 UTC [1278364] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.414 UTC [1278365] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.495 UTC [1278366] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.555 UTC [1278367] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.590 UTC [1278368] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.628 UTC [1278369] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.739 UTC [1278370] FATAL:  database "paad" does not exist
+2023-09-12 16:06:01.739 UTC [1278371] FATAL:  expected SASL response, got message type 88
+2023-09-12 16:06:02.120 UTC [1278373] FATAL:  database "paad" does not exist
+2023-09-12 16:06:02.140 UTC [1278372] FATAL:  database "paad" does not exist
+2023-09-12 16:06:02.330 UTC [1278374] FATAL:  database "paad" does not exist
+2023-09-12 16:06:02.453 UTC [1278376] FATAL:  database "paad" does not exist
+2023-09-12 16:06:02.454 UTC [1278375] FATAL:  database "paad" does not exist
+2023-09-12 16:06:02.814 UTC [1278377] FATAL:  database "paad" does not exist
+2023-09-12 16:06:03.165 UTC [1278378] FATAL:  database "paad" does not exist
+2023-09-12 16:06:03.203 UTC [1278379] FATAL:  database "paad" does not exist
+2023-09-12 16:06:03.558 UTC [1278380] FATAL:  database "paad" does not exist
+2023-09-12 16:06:03.915 UTC [1278381] FATAL:  database "paad" does not exist
+2023-09-12 16:06:04.214 UTC [1278382] FATAL:  database "paad" does not exist
+2023-09-12 16:06:04.390 UTC [1278383] FATAL:  database "paad" does not exist
+2023-09-12 16:06:04.509 UTC [1278384] FATAL:  database "paad" does not exist
+2023-09-12 16:06:04.879 UTC [1278385] FATAL:  database "paad" does not exist
+2023-09-12 16:06:05.266 UTC [1278386] FATAL:  database "paad" does not exist
+2023-09-12 16:06:05.632 UTC [1278387] FATAL:  database "paad" does not exist
+2023-09-12 16:06:05.981 UTC [1278388] FATAL:  database "paad" does not exist
+2023-09-12 16:06:08.768 UTC [1278390] FATAL:  database "paad" does not exist
+2023-09-12 16:06:08.976 UTC [1278392] FATAL:  database "paad" does not exist
+2023-09-12 16:06:09.347 UTC [1278394] FATAL:  database "paad" does not exist
+2023-09-12 16:06:09.953 UTC [1278395] FATAL:  database "paad" does not exist
+2023-09-12 16:06:10.157 UTC [1278396] FATAL:  database "paad" does not exist
+2023-09-12 16:06:10.383 UTC [1278397] FATAL:  database "paad" does not exist
+2023-09-12 16:06:10.731 UTC [1278398] FATAL:  database "paad" does not exist
+2023-09-12 16:06:10.828 UTC [1278399] FATAL:  database "paad" does not exist
+2023-09-12 16:06:11.182 UTC [1278400] FATAL:  database "paad" does not exist
+2023-09-12 16:06:11.463 UTC [1278401] FATAL:  database "paad" does not exist
+2023-09-12 16:06:16.727 UTC [1278403] FATAL:  database "paad" does not exist
+2023-09-12 16:06:17.169 UTC [1278404] FATAL:  database "paad" does not exist
+2023-09-12 16:06:20.081 UTC [1278405] FATAL:  database "paad" does not exist
+2023-09-12 16:36:39.375 UTC [1202] LOG:  checkpoint starting: time
+2023-09-12 16:36:40.120 UTC [1202] LOG:  checkpoint complete: wrote 8 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.705 s, sync=0.014 s, total=0.746 s; sync files=6, longest=0.009 s, average=0.003 s; distance=31 kB, estimate=390 kB
+2023-09-12 17:27:45.480 UTC [1273693] LOG:  could not receive data from client: Connection timed out
+2023-09-12 17:27:45.480 UTC [1273692] LOG:  could not receive data from client: Connection timed out
+2023-09-12 17:27:45.483 UTC [1273700] LOG:  could not receive data from client: Connection timed out
+2023-09-12 18:11:26.920 UTC [1277694] LOG:  could not receive data from client: Connection timed out
+2023-09-12 18:11:26.920 UTC [1277695] LOG:  could not receive data from client: Connection timed out
+2023-09-12 18:11:26.923 UTC [1277697] LOG:  could not receive data from client: Connection timed out
+2023-09-12 18:50:46.216 UTC [1282892] LOG:  could not receive data from client: Connection timed out
+2023-09-12 18:50:46.217 UTC [1282894] LOG:  could not receive data from client: Connection timed out
+2023-09-12 18:50:46.219 UTC [1282893] LOG:  could not receive data from client: Connection timed out

+ 187 - 0
pgsql-log/postgresql-Wed.log

@@ -0,0 +1,187 @@
+2023-09-13 15:10:48.250 UTC [1314581] ERROR:  syntax error at or near "123" at character 1
+2023-09-13 15:10:48.250 UTC [1314581] STATEMENT:  123
+2023-09-13 15:16:54.253 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 15:16:58.601 UTC [1202] LOG:  checkpoint complete: wrote 44 buffers (0.3%); 0 WAL file(s) added, 0 removed, 0 recycled; write=4.317 s, sync=0.017 s, total=4.349 s; sync files=32, longest=0.007 s, average=0.001 s; distance=156 kB, estimate=367 kB
+2023-09-13 15:21:54.696 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 15:21:55.734 UTC [1202] LOG:  checkpoint complete: wrote 11 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=1.004 s, sync=0.016 s, total=1.038 s; sync files=11, longest=0.008 s, average=0.002 s; distance=49 kB, estimate=335 kB
+2023-09-13 15:26:54.749 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 15:26:55.073 UTC [1202] LOG:  checkpoint complete: wrote 4 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.302 s, sync=0.007 s, total=0.324 s; sync files=4, longest=0.005 s, average=0.002 s; distance=19 kB, estimate=304 kB
+2023-09-13 15:31:54.105 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 15:31:55.137 UTC [1202] LOG:  checkpoint complete: wrote 11 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=1.004 s, sync=0.012 s, total=1.033 s; sync files=11, longest=0.008 s, average=0.002 s; distance=51 kB, estimate=278 kB
+2023-09-13 15:36:52.177 UTC [1319833] ERROR:  column "id" does not exist at character 111
+2023-09-13 15:36:52.177 UTC [1319833] HINT:  Perhaps you meant to reference the column "log_registro.ip".
+2023-09-13 15:36:52.177 UTC [1319833] STATEMENT:  INSERT INTO "log_registro" (clave, ip, navegador, informacion, detalle) VALUES ($1, $2, $3, $4, $5) RETURNING id
+2023-09-13 15:36:54.167 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 15:36:54.595 UTC [1202] LOG:  checkpoint complete: wrote 5 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.402 s, sync=0.010 s, total=0.428 s; sync files=5, longest=0.008 s, average=0.002 s; distance=27 kB, estimate=253 kB
+2023-09-13 15:37:02.062 UTC [1319867] ERROR:  column "id" does not exist at character 111
+2023-09-13 15:37:02.062 UTC [1319867] HINT:  Perhaps you meant to reference the column "log_registro.ip".
+2023-09-13 15:37:02.062 UTC [1319867] STATEMENT:  INSERT INTO "log_registro" (clave, ip, navegador, informacion, detalle) VALUES ($1, $2, $3, $4, $5) RETURNING id
+2023-09-13 15:37:12.285 UTC [1319905] ERROR:  column "id" does not exist at character 111
+2023-09-13 15:37:12.285 UTC [1319905] HINT:  Perhaps you meant to reference the column "log_registro.ip".
+2023-09-13 15:37:12.285 UTC [1319905] STATEMENT:  INSERT INTO "log_registro" (clave, ip, navegador, informacion, detalle) VALUES ($1, $2, $3, $4, $5) RETURNING id
+2023-09-13 15:41:54.688 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 15:41:55.213 UTC [1202] LOG:  checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.502 s, sync=0.009 s, total=0.525 s; sync files=5, longest=0.005 s, average=0.002 s; distance=1 kB, estimate=228 kB
+2023-09-13 15:42:52.137 UTC [1320925] LOG:  could not receive data from client: Connection reset by peer
+2023-09-13 15:46:54.296 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 15:46:54.521 UTC [1202] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.201 s, sync=0.008 s, total=0.225 s; sync files=3, longest=0.005 s, average=0.003 s; distance=7 kB, estimate=206 kB
+2023-09-13 15:47:26.636 UTC [1321052] LOG:  could not receive data from client: Connection reset by peer
+2023-09-13 15:47:26.638 UTC [1321044] LOG:  could not receive data from client: Connection reset by peer
+2023-09-13 17:25:10.856 UTC [1315055] LOG:  could not receive data from client: Connection timed out
+2023-09-13 17:46:56.136 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 17:46:56.663 UTC [1202] LOG:  checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.502 s, sync=0.009 s, total=0.528 s; sync files=6, longest=0.006 s, average=0.002 s; distance=23 kB, estimate=188 kB
+2023-09-13 17:47:01.576 UTC [1315057] LOG:  could not receive data from client: Connection timed out
+2023-09-13 18:43:58.748 UTC [1329584] ERROR:  column "periodo.periodo_id" must appear in the GROUP BY clause or be used in an aggregate function at character 8
+2023-09-13 18:43:58.748 UTC [1329584] STATEMENT:  SELECT periodo.* FROM horario_view
+	JOIN horario_profesor USING (HORARIO_ID)
+	JOIN periodo USING (PERIODO_ID)
+	GROUP BY PERIODO_ID LIMIT 100 OFFSET 0
+2023-09-13 18:51:57.615 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 18:51:58.149 UTC [1202] LOG:  checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.502 s, sync=0.010 s, total=0.535 s; sync files=6, longest=0.006 s, average=0.002 s; distance=2 kB, estimate=169 kB
+2023-09-13 18:56:57.193 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 18:56:57.721 UTC [1202] LOG:  checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.502 s, sync=0.011 s, total=0.529 s; sync files=6, longest=0.008 s, average=0.002 s; distance=27 kB, estimate=155 kB
+2023-09-13 19:01:57.806 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 19:01:58.135 UTC [1202] LOG:  checkpoint complete: wrote 4 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.302 s, sync=0.010 s, total=0.329 s; sync files=4, longest=0.007 s, average=0.003 s; distance=4 kB, estimate=140 kB
+2023-09-13 19:58:05.896 UTC [1325906] LOG:  could not receive data from client: Connection timed out
+2023-09-13 19:58:05.896 UTC [1325966] LOG:  could not receive data from client: Connection timed out
+2023-09-13 19:58:05.899 UTC [1325908] LOG:  could not receive data from client: Connection timed out
+2023-09-13 20:36:58.599 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 20:36:59.033 UTC [1202] LOG:  checkpoint complete: wrote 5 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.402 s, sync=0.012 s, total=0.435 s; sync files=5, longest=0.008 s, average=0.003 s; distance=29 kB, estimate=129 kB
+2023-09-13 20:41:58.126 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 20:41:58.960 UTC [1202] LOG:  checkpoint complete: wrote 9 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.803 s, sync=0.010 s, total=0.835 s; sync files=7, longest=0.006 s, average=0.002 s; distance=49 kB, estimate=121 kB
+2023-09-13 20:46:59.040 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 20:46:59.368 UTC [1202] LOG:  checkpoint complete: wrote 4 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.302 s, sync=0.012 s, total=0.329 s; sync files=4, longest=0.009 s, average=0.003 s; distance=23 kB, estimate=111 kB
+2023-09-13 20:56:59.514 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 20:57:00.247 UTC [1202] LOG:  checkpoint complete: wrote 8 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.703 s, sync=0.013 s, total=0.733 s; sync files=6, longest=0.008 s, average=0.003 s; distance=29 kB, estimate=103 kB
+2023-09-13 21:08:36.720 UTC [1334189] ERROR:  column "reposicion_id" does not exist at character 392
+2023-09-13 21:08:36.720 UTC [1334189] QUERY:  INSERT INTO reposicion_solicitud (fecha_clase, fecha_nueva, hora_nueva, estado_reposicion_id, profesor_id,
+								  descripcion, horario_id, alumnos, es_reposicion, tipoaula_id, duracion_id, usuario_id, bloque, ciclo)
+			VALUES(p_fecha_falta, p_fecha_nueva, p_hora_nueva, p_edo, p_prof, p_desc, p_hor, p_alumnos, p_esrepo, p_aula, p_duracion, p_usr_creador, p_bloque, p_ciclo)
+			RETURNING reposicion_id
+2023-09-13 21:08:36.720 UTC [1334189] CONTEXT:  PL/pgSQL function fi_reposicion_solicitud(date,date,time without time zone,integer,integer,integer,text,integer,boolean,integer,integer,integer,integer,integer) line 6 at SQL statement
+2023-09-13 21:08:36.720 UTC [1334189] STATEMENT:  SELECT * from fi_reposicion_solicitud($1, $2, $3, $4, $5, 1, $6, $7, true, $8, $9, $10, $11, $12)
+2023-09-13 21:09:36.512 UTC [1334212] ERROR:  record "new" has no field "duracion_total"
+2023-09-13 21:09:36.512 UTC [1334212] CONTEXT:  SQL expression "NEW.hora_nueva + (NEW.duracion_total || ' minutes')::interval > '22:00'"
+	PL/pgSQL function validate_reposicion_duration() line 5 at IF
+	SQL statement "INSERT INTO reposicion_solicitud (fecha_clase, fecha_nueva, hora_nueva, estado_reposicion_id, profesor_id,
+								  descripcion, horario_id, alumnos, es_reposicion, tipoaula_id, duracion_id, usuario_id, bloque, ciclo)
+			VALUES(p_fecha_falta, p_fecha_nueva, p_hora_nueva, p_edo, p_prof, p_desc, p_hor, p_alumnos, p_esrepo, p_aula, p_duracion, p_usr_creador, p_bloque, p_ciclo)
+			RETURNING reposicion_solicitud_id"
+	PL/pgSQL function fi_reposicion_solicitud(date,date,time without time zone,integer,integer,integer,text,integer,boolean,integer,integer,integer,integer,integer) line 6 at SQL statement
+2023-09-13 21:09:36.512 UTC [1334212] STATEMENT:  SELECT * from fi_reposicion_solicitud($1, $2, $3, $4, $5, 1, $6, $7, true, $8, $9, $10, $11, $12)
+2023-09-13 21:11:59.523 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 21:12:00.258 UTC [1202] LOG:  checkpoint complete: wrote 8 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.703 s, sync=0.010 s, total=0.736 s; sync files=6, longest=0.005 s, average=0.002 s; distance=29 kB, estimate=95 kB
+2023-09-13 21:12:22.344 UTC [1330587] LOG:  could not receive data from client: Connection timed out
+2023-09-13 21:12:22.345 UTC [1330589] LOG:  could not receive data from client: Connection timed out
+2023-09-13 21:12:22.347 UTC [1330620] LOG:  could not receive data from client: Connection timed out
+2023-09-13 21:16:50.951 UTC [1334211] ERROR:  syntax error at or near "," at character 811
+2023-09-13 21:16:50.951 UTC [1334211] STATEMENT:  CREATE OR REPLACE FUNCTION public.fs_reposiciones_solicitud(p_fecha_ini date, p_fecha_fin date, p_usr integer DEFAULT NULL::integer, p_edo integer DEFAULT NULL::integer, p_esrepo boolean DEFAULT NULL::boolean)
+	 RETURNS TABLE(reposicion_id integer, horario_id integer, fecha_nueva date, hora_nueva time without time zone, descripcion character varying, profesor_id integer, profesor_clave character varying, profesor_nombre character varying, profesor_correo character varying, estado_reposicion_id integer, fecha_clase date, alumnos integer, tipoaula_id integer, tipoaula_nombre character varying, tipoaula_supervisor boolean, es_reposicion boolean, salon_id integer, duracion_total integer, materia_nombre character varying, horario_grupo character varying, horario_hora time without time zone,usuario_nombre, usuario_nombre character varying)
+	 LANGUAGE sql
+	AS $function$
+		/* Obtiene datos de reposición, se filtra por rango de fechas. Opcional: estado y si es reposicion/cambio */
+		SELECT r.reposicion_solicitud_id, r.horario_id, r.fecha_nueva, r.hora_nueva, r.descripcion,
+			r.profesor_id, p.profesor_clave, p.profesor_nombre, p.profesor_correo,
+			r.estado_reposicion_id, r.fecha_clase, r.alumnos, r.tipoaula_id, ta.tipoaula_nombre, ta.tipoaula_supervisor, r.es_reposicion,
+			r.salon_id, d.duracion_interval , m.materia_nombre, h.horario_grupo, h.horario_hora, u.usuario_nombre 
+		FROM reposicion_solicitud r
+			INNER JOIN profesor p ON r.profesor_id = p.profesor_id
+			INNER JOIN horario h ON h.horario_id = r.horario_id
+			INNER JOIN materia m ON m.materia_id = h.materia_id
+			INNER JOIN tipoaula ta ON ta.tipoaula_id = r.tipoaula_id
+			inner join duracion d on d.duracion_id = r.duracion_id
+			inner join usuario u on u.usuario_id = r.usuario_id 
+		WHERE r.fecha_nueva BETWEEN p_fecha_ini AND p_fecha_fin
+			AND r.estado_reposicion_id = COALESCE(p_edo, r.estado_reposicion_id)
+			AND r.es_reposicion = COALESCE(p_esrepo, r.es_reposicion)
+			and r.usuario_id = coalesce(p_usr,r.usuario_id)
+		ORDER BY fecha_nueva DESC, hora_nueva, profesor_nombre
+	$function$
+	
+2023-09-13 21:16:59.336 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 21:17:01.074 UTC [1202] LOG:  checkpoint complete: wrote 18 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=1.707 s, sync=0.014 s, total=1.738 s; sync files=13, longest=0.007 s, average=0.002 s; distance=61 kB, estimate=92 kB
+2023-09-13 21:17:10.919 UTC [1334211] ERROR:  return type mismatch in function declared to return record
+2023-09-13 21:17:10.919 UTC [1334211] DETAIL:  Final statement returns interval instead of integer at column 18.
+2023-09-13 21:17:10.919 UTC [1334211] CONTEXT:  SQL function "fs_reposiciones_solicitud"
+2023-09-13 21:17:10.919 UTC [1334211] STATEMENT:  CREATE OR REPLACE FUNCTION public.fs_reposiciones_solicitud(p_fecha_ini date, p_fecha_fin date, p_usr integer DEFAULT NULL::integer, p_edo integer DEFAULT NULL::integer, p_esrepo boolean DEFAULT NULL::boolean)
+	 RETURNS TABLE(reposicion_id integer, horario_id integer, fecha_nueva date, hora_nueva time without time zone, descripcion character varying, profesor_id integer, profesor_clave character varying, profesor_nombre character varying, profesor_correo character varying, estado_reposicion_id integer, fecha_clase date, alumnos integer, tipoaula_id integer, tipoaula_nombre character varying, tipoaula_supervisor boolean, es_reposicion boolean, salon_id integer, duracion_total integer, materia_nombre character varying, horario_grupo character varying, horario_hora time without time zone, usuario_nombre character varying)
+	 LANGUAGE sql
+	AS $function$
+		/* Obtiene datos de reposición, se filtra por rango de fechas. Opcional: estado y si es reposicion/cambio */
+		SELECT r.reposicion_solicitud_id, r.horario_id, r.fecha_nueva, r.hora_nueva, r.descripcion,
+			r.profesor_id, p.profesor_clave, p.profesor_nombre, p.profesor_correo,
+			r.estado_reposicion_id, r.fecha_clase, r.alumnos, r.tipoaula_id, ta.tipoaula_nombre, ta.tipoaula_supervisor, r.es_reposicion,
+			r.salon_id, d.duracion_interval , m.materia_nombre, h.horario_grupo, h.horario_hora, u.usuario_nombre 
+		FROM reposicion_solicitud r
+			INNER JOIN profesor p ON r.profesor_id = p.profesor_id
+			INNER JOIN horario h ON h.horario_id = r.horario_id
+			INNER JOIN materia m ON m.materia_id = h.materia_id
+			INNER JOIN tipoaula ta ON ta.tipoaula_id = r.tipoaula_id
+			inner join duracion d on d.duracion_id = r.duracion_id
+			inner join usuario u on u.usuario_id = r.usuario_id 
+		WHERE r.fecha_nueva BETWEEN p_fecha_ini AND p_fecha_fin
+			AND r.estado_reposicion_id = COALESCE(p_edo, r.estado_reposicion_id)
+			AND r.es_reposicion = COALESCE(p_esrepo, r.es_reposicion)
+			and r.usuario_id = coalesce(p_usr,r.usuario_id)
+		ORDER BY fecha_nueva DESC, hora_nueva, profesor_nombre
+	$function$
+	
+	
+2023-09-13 21:21:59.104 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 21:21:59.839 UTC [1202] LOG:  checkpoint complete: wrote 8 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.703 s, sync=0.014 s, total=0.735 s; sync files=8, longest=0.008 s, average=0.002 s; distance=38 kB, estimate=87 kB
+2023-09-13 21:36:46.968 UTC [1334883] ERROR:  function fs_reposicionesprofesor(unknown, unknown, unknown, unknown, unknown) does not exist at character 15
+2023-09-13 21:36:46.968 UTC [1334883] HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
+2023-09-13 21:36:46.968 UTC [1334883] STATEMENT:  SELECT * FROM fs_reposicionesprofesor($1, $2, $3 ,NULL, NULL)
+2023-09-13 21:47:00.190 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 21:47:01.318 UTC [1202] LOG:  checkpoint complete: wrote 12 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=1.104 s, sync=0.011 s, total=1.129 s; sync files=7, longest=0.007 s, average=0.002 s; distance=46 kB, estimate=83 kB
+2023-09-13 21:50:56.561 UTC [1335273] ERROR:  column r.profesor_id does not exist at character 574
+2023-09-13 21:50:56.561 UTC [1335273] HINT:  Perhaps you meant to reference the column "p.profesor_id".
+2023-09-13 21:50:56.561 UTC [1335273] QUERY:  
+	/* Obtiene datos de reposición */
+		SELECT r.reposicion_id, r.horario_id, r.fecha_nueva, r.hora_nueva, r.hora_nueva + (r.duracion_total * INTERVAL '1 minute') AS hora_nueva_fin,
+			r.descripcion, r.profesor_id, p.profesor_clave, p.profesor_nombre, p.profesor_correo,
+			r.estado_reposicion_id, r.fecha_clase, r.alumnos, r.tipoaula_id, ta.tipoaula_nombre, ta.tipoaula_supervisor, r.es_reposicion,
+			r.salon_id, r.duracion_total, m.materia_id, m.materia_nombre, h.horario_grupo, h.horario_hora,
+			er.estado_nombre, er.estado_color
+		FROM reposicion r
+			INNER JOIN profesor p ON r.profesor_id = p.profesor_id
+			INNER JOIN horario h ON h.horario_id = r.horario_id
+			INNER JOIN materia m ON m.materia_id = h.materia_id
+			INNER JOIN estado_reposicion er ON er.estado_reposicion_id = r.estado_reposicion_id  
+			INNER JOIN tipoaula ta ON ta.tipoaula_id = r.tipoaula_id
+		WHERE r.reposicion_id = COALESCE(p_rep, r.reposicion_id)
+			AND r.profesor_id = COALESCE(p_prof, r.profesor_id)
+			AND r.fecha_nueva BETWEEN COALESCE(p_fecha_ini, r.fecha_nueva) AND COALESCE(p_fecha_fin,r.fecha_nueva)
+			AND r.estado_reposicion_id = COALESCE(p_edo, r.estado_reposicion_id)
+			AND (
+				(p_jefe_carrera IS NOT NULL AND m.carrera_id IN (SELECT carrera_id FROM fs_usuario_carrera(p_jefe_carrera, NULL))
+				) OR
+				p_jefe_carrera IS NULL
+			)
+		ORDER BY fecha_nueva DESC, hora_nueva, profesor_nombre
+		LIMIT p_limit OFFSET COALESCE(p_offset, 0);
+	
+2023-09-13 21:50:56.561 UTC [1335273] CONTEXT:  SQL function "fs_reposicion" during startup
+2023-09-13 21:50:56.561 UTC [1335273] STATEMENT:  SELECT * from fs_reposicion($1, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
+2023-09-13 21:52:00.410 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 21:52:01.046 UTC [1202] LOG:  checkpoint complete: wrote 7 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.603 s, sync=0.015 s, total=0.637 s; sync files=7, longest=0.010 s, average=0.003 s; distance=42 kB, estimate=79 kB
+2023-09-13 21:57:00.144 UTC [1202] LOG:  checkpoint starting: time
+2023-09-13 21:57:01.074 UTC [1202] LOG:  checkpoint complete: wrote 10 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.904 s, sync=0.010 s, total=0.931 s; sync files=7, longest=0.005 s, average=0.002 s; distance=54 kB, estimate=76 kB
+2023-09-13 22:31:00.936 UTC [1332732] LOG:  could not receive data from client: Connection timed out
+2023-09-13 22:31:00.936 UTC [1332733] LOG:  could not receive data from client: Connection timed out
+2023-09-13 22:31:00.939 UTC [1332734] LOG:  could not receive data from client: Connection timed out
+2023-09-13 22:44:07.368 UTC [1333316] LOG:  could not receive data from client: Connection timed out
+2023-09-13 22:44:07.370 UTC [1333318] LOG:  could not receive data from client: Connection timed out
+2023-09-13 22:48:29.512 UTC [1333475] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:01:35.944 UTC [1333668] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:01:35.944 UTC [1333669] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:01:35.945 UTC [1333670] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:10:20.232 UTC [1333848] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:10:20.232 UTC [1333849] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:10:20.234 UTC [1333850] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:25:54.120 UTC [1334210] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:26:02.312 UTC [1334209] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:29:59.880 UTC [1334211] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:49:39.528 UTC [1334892] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:49:39.528 UTC [1334893] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:49:39.530 UTC [1334894] LOG:  could not receive data from client: Connection timed out
+2023-09-13 23:58:27.912 UTC [1335197] LOG:  could not receive data from client: Connection timed out

+ 0 - 0
pgsql-log/tail


+ 56 - 13
reposiciones_crear.php

@@ -7,15 +7,17 @@ if (!isset($_SESSION['user'])){
 
 //$user = unserialize($_SESSION['user']);
 $user = Login::get_user();
-print_r($user);
+
+$user->access();
+/*print_r($user);
 print_r($user->user["id"]);
 echo "****|";
-$user->access();
 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'));
@@ -25,7 +27,7 @@ print_r($user->facultad["facultad_id"]);
 
 //if (!$user->admin && in_array($user->acceso, ['n']))
     //die(header('Location: main.php?error=1'));
-$user->print_to_log('Reposiciones');
+//$user->print_to_log('Reposiciones');
 
 //$write = $user->admin || in_array($user->acceso, ['w']);
 $write = true; //
@@ -37,6 +39,9 @@ if($user->jefe_carrera){
     $prof_rs = $db->query('SELECT DISTINCT * FROM fs_profesores(null, null, :fac) ORDER BY PROFESOR_NOMBRE', [':fac' => $user->facultad["facultad_id"]]);
 }
 
+//Duraciones
+$duracion_rs = $db->query("select * from duracion order by duracion_interval");
+
 //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"];
@@ -69,8 +74,12 @@ if(isset($_POST["fecha_final"]))
 else
     $fecha_fin = date("d/m/Y", strtotime($periodo_rs["periodo_fecha_fin"]));
 
-$fecha_ini_db= date("Y-m-d", strtotime($fecha_ini));
-$fecha_fin_db= date("Y-m-d", strtotime($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');
+
 ?>
 <!DOCTYPE html>
 <html lang="en">
@@ -150,7 +159,9 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
         </form>
 
         <?php
-        $reposiciones_rs = $db->query('SELECT * FROM fs_reposicionesprofesor(:f_ini, :f_fin, NULL, NULL)', [':f_ini' => $fecha_ini_db, ':f_fin' => $fecha_fin_db]);
+        
+        $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">
@@ -166,6 +177,7 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
                             <th>Tipo</th>
                             <th style="width:160px">Fecha falta</th>
                             <th style="width:160px">Fecha reposición</th>
+                            <th style="width:160px">Duración</th>
                             <th>Salón</th>
                             <?php if($write){ ?><th>Acciones</th><?php } ?>
                         </tr>
@@ -204,6 +216,10 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
                                 echo date("d/m/Y", strtotime($reposicion["fecha_nueva"])) ."<br>".substr($reposicion["hora_nueva"],0,-3)." a ".substr($reposicion["hora_nueva_fin"],0,-3)." hrs.";
                                 ?>
                             </td>
+                            <td class="align-middle text-center"><?php
+                                echo $reposicion["duracion_total"];
+                                ?>
+                            </td>
                             <td class="align-middle text-center"><?php
                                 if($reposicion["salon_id"] != ""){
                                     echo $reposicion["salon_id"];
@@ -249,6 +265,9 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
                         <form action="./action/reposicion_insert.php" method="post" id="formaModal" onsubmit="return submitForm()">
                             <input type="hidden" name="id" id="id">
                             <input type="hidden" name="estado" value="1">
+                            <input type="hidden" name="ciclo" id="ciclo" value="0">
+                            <input type="hidden" name="bloque" id="bloque" value="0">
+                            
                             <div class="form-box">
 
                                 <div class="form-group row" id="profBlock">
@@ -296,6 +315,17 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
                                         </div>
                                     </div>
                                 </div>
+
+                                <div class="form-group row materia-block">
+                                    <label for="duracion" class="col-4 col-form-label">Duración</label> 
+                                    <div class="col-4">
+                                        <select name="duracion" id="duracion" class="form-control" required="required">
+                                            <?php foreach($duracion_rs as $dura){?>
+                                            <option value="<?php echo $dura["duracion_id"];?>" data-duracion="<?php echo $dura["duracion_interval"];?>" ><?php echo $dura["duracion_nombre"];?></option>
+                                            <?php } ?>
+                                        </select>
+                                    </div>
+                                </div>
                                 
                                 <div class="form-group row cambio_block materia-block" style="display: none;">
                                     <label for="fecha_cambio" class="col-4 col-form-label">Fecha de cambio *</label> 
@@ -709,17 +739,15 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
         $(".date-picker-future" ).datepicker( $.datepicker.regional[ "es" ] );
         
         
-        function creaOpcion(id_horario, dia, hora, min, nombre){
-            return '<li data-id="'+id_horario+'" data-dia="'+dia+'" data-hr="'+hora+'" data-min="'+min+'">'+nombre+'</li>';
+        function creaOpcion(id_horario, dia, hora, min, nombre, gpo, duracion){
+            return '<li data-id="'+id_horario+'" data-dia="'+dia+'" data-hr="'+hora+'" data-min="'+min+'" data-gpo="'+gpo+'" data-duracion="'+duracion+'">'+nombre+'</li>';
         }
 
         $('#filtro_final').focus(function(){
             $("#filtro_final").removeClass("is-invalid");
         });
 
-        //****TODO NO SE ACTIVA AL HACER CLICK */
         $("#dlProfesor ul li").click(function(){//cambia datalist
-            console.log("CLICK");
             var pid = $(this).data('id');
             //busca materias del profesor
             $.ajax({
@@ -740,11 +768,14 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
                                 result["materias"][i]["horario_dia"],
                                 result["materias"][i]["horario_hora"],
                                 result["materias"][i]["horario_min"],
-                                result["materias"][i]["materia_nombre"]
+                                result["materias"][i]["materia_nombre"],
+                                result["materias"][i]["grupo"],
+                                result["materias"][i]["duracion"]
                                 );
                             $("#dlMateria ul").append(html);
                         }
-                        setDatalistFirst("#horario");
+                        //setDatalistFirst("#horario");
+                        $("#dlMateria ul li:first").click();
                     }
                 },
                 error: function(jqXHR, textStatus, errorThrown ){
@@ -756,8 +787,10 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
         
         
         //Actualiza días elegibles de calendario
-        $("#dlMateria ul li").click(function(){//cambia datalist
+        $(document).on( "click", "#dlMateria ul li", function(event){//manda al frente de todos
             _dia_valido = $(this).data('dia');
+            var grupo = $(this).data("gpo");
+            var duracionMateria = $(this).data("duracion");
 
             $.ajax({
                 url:  './action/asistenciasprofesor_select.php',
@@ -770,6 +803,16 @@ $fecha_fin_db= date("Y-m-d", strtotime($fecha_fin));
                         $('#modal').modal("hide");
                     }else{
                         _dias_asistencia = result["asistenciaArr"];
+                        //Cambiar ciclo [6] y bloque [8]
+                        $("#ciclo").val(parseInt(grupo[6]));
+                        $("#bloque").val(parseInt(grupo[8]));
+                        
+                        $('#duracion option').each(function() {
+                            if ($(this).data("duracion") === duracionMateria) {
+                                // Selecciona la opción correspondiente en el select de "duracion"
+                                $(this).prop('selected', true);
+                            }
+                        });
                     }
 
                 },

+ 0 - 803
sample/rutas.json

@@ -1,803 +0,0 @@
-[
-  {
-    "id": 0,
-    "ruta": "Edificio 1 / Piso 0",
-    "horarios": [
-      {
-        "id": 0,
-        "salon": "A-1",
-        "materia": "Sistemas",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 1,
-        "salon": "A-2",
-        "materia": "Sistemas",
-        "hora_inicio": "9:00",
-        "hora_fin": "10:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 2,
-        "salon": "A-3",
-        "materia": "Matemáticas",
-        "hora_inicio": "10:00",
-        "hora_fin": "10:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 3,
-        "salon": "A-4",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "10:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 4,
-        "salon": "A-5",
-        "materia": "Base de datos",
-        "hora_inicio": "10:00",
-        "hora_fin": "11:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 5,
-        "salon": "A-6",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 6,
-        "salon": "A-7",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 7,
-        "salon": "A-8",
-        "materia": "Sistemas",
-        "hora_inicio": "10:00",
-        "hora_fin": "11:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 8,
-        "salon": "A-9",
-        "materia": "Matemáticas",
-        "hora_inicio": "10:00",
-        "hora_fin": "9:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 9,
-        "salon": "A-10",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 10,
-        "salon": "A-11",
-        "materia": "Sistemas",
-        "hora_inicio": "11:00",
-        "hora_fin": "11:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 11,
-        "salon": "A-12",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "9:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 12,
-        "salon": "A-13",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "9:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 13,
-        "salon": "A-14",
-        "materia": "Matemáticas",
-        "hora_inicio": "8:00",
-        "hora_fin": "11:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 14,
-        "salon": "A-15",
-        "materia": "Matemáticas",
-        "hora_inicio": "10:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 15,
-        "salon": "A-16",
-        "materia": "Matemáticas",
-        "hora_inicio": "8:00",
-        "hora_fin": "9:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 16,
-        "salon": "A-17",
-        "materia": "Sistemas",
-        "hora_inicio": "9:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 17,
-        "salon": "A-18",
-        "materia": "Matemáticas",
-        "hora_inicio": "8:00",
-        "hora_fin": "11:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 18,
-        "salon": "A-19",
-        "materia": "Sistemas",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 1,
-        "comentario": ""
-      }
-    ]
-  },
-  {
-    "id": 1,
-    "ruta": "Edificio 1 / Piso 1",
-    "horarios": [
-      {
-        "id": 0,
-        "salon": "A-1",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 1,
-        "salon": "A-2",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 2,
-        "salon": "A-3",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 3,
-        "salon": "A-4",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 4,
-        "salon": "A-5",
-        "materia": "Sistemas",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 5,
-        "salon": "A-6",
-        "materia": "Sistemas",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 6,
-        "salon": "A-7",
-        "materia": "Base de datos",
-        "hora_inicio": "8:00",
-        "hora_fin": "10:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 7,
-        "salon": "A-8",
-        "materia": "Sistemas",
-        "hora_inicio": "10:00",
-        "hora_fin": "10:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 8,
-        "salon": "A-9",
-        "materia": "Matemáticas",
-        "hora_inicio": "8:00",
-        "hora_fin": "9:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 9,
-        "salon": "A-10",
-        "materia": "Sistemas",
-        "hora_inicio": "10:00",
-        "hora_fin": "9:00",
-        "estado": 3,
-        "comentario": ""
-      }
-    ]
-  },
-  {
-    "id": 2,
-    "ruta": "Edificio 1 / Piso 2",
-    "horarios": [
-      {
-        "id": 0,
-        "salon": "A-1",
-        "materia": "Sistemas",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 1,
-        "salon": "A-2",
-        "materia": "Sistemas",
-        "hora_inicio": "8:00",
-        "hora_fin": "8:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 2,
-        "salon": "A-3",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "9:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 3,
-        "salon": "A-4",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 4,
-        "salon": "A-5",
-        "materia": "Sistemas",
-        "hora_inicio": "8:00",
-        "hora_fin": "10:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 5,
-        "salon": "A-6",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 6,
-        "salon": "A-7",
-        "materia": "Matemáticas",
-        "hora_inicio": "8:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 7,
-        "salon": "A-8",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "11:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 8,
-        "salon": "A-9",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 9,
-        "salon": "A-10",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "10:00",
-        "estado": 2,
-        "comentario": ""
-      }
-    ]
-  },
-  {
-    "id": 3,
-    "ruta": "Edificio 1 / Piso 3",
-    "horarios": [
-      {
-        "id": 0,
-        "salon": "A-1",
-        "materia": "Base de datos",
-        "hora_inicio": "8:00",
-        "hora_fin": "9:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 1,
-        "salon": "A-2",
-        "materia": "Sistemas",
-        "hora_inicio": "11:00",
-        "hora_fin": "10:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 2,
-        "salon": "A-3",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "9:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 3,
-        "salon": "A-4",
-        "materia": "Sistemas",
-        "hora_inicio": "8:00",
-        "hora_fin": "8:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 4,
-        "salon": "A-5",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 5,
-        "salon": "A-6",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 6,
-        "salon": "A-7",
-        "materia": "Sistemas",
-        "hora_inicio": "8:00",
-        "hora_fin": "8:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 7,
-        "salon": "A-8",
-        "materia": "Sistemas",
-        "hora_inicio": "9:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 8,
-        "salon": "A-9",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 9,
-        "salon": "A-10",
-        "materia": "Base de datos",
-        "hora_inicio": "8:00",
-        "hora_fin": "10:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 10,
-        "salon": "A-11",
-        "materia": "Sistemas",
-        "hora_inicio": "11:00",
-        "hora_fin": "10:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 11,
-        "salon": "A-12",
-        "materia": "Matemáticas",
-        "hora_inicio": "8:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 12,
-        "salon": "A-13",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "10:00",
-        "estado": 0,
-        "comentario": ""
-      }
-    ]
-  },
-  {
-    "id": 4,
-    "ruta": "Edificio 1 / Piso 4",
-    "horarios": [
-      {
-        "id": 0,
-        "salon": "A-1",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 1,
-        "salon": "A-2",
-        "materia": "Sistemas",
-        "hora_inicio": "10:00",
-        "hora_fin": "9:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 2,
-        "salon": "A-3",
-        "materia": "Sistemas",
-        "hora_inicio": "10:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 3,
-        "salon": "A-4",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 4,
-        "salon": "A-5",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "10:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 5,
-        "salon": "A-6",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "10:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 6,
-        "salon": "A-7",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "10:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 7,
-        "salon": "A-8",
-        "materia": "Base de datos",
-        "hora_inicio": "10:00",
-        "hora_fin": "10:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 8,
-        "salon": "A-9",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "8:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 9,
-        "salon": "A-10",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "9:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 10,
-        "salon": "A-11",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "8:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 11,
-        "salon": "A-12",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "8:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 12,
-        "salon": "A-13",
-        "materia": "Sistemas",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 13,
-        "salon": "A-14",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 14,
-        "salon": "A-15",
-        "materia": "Matemáticas",
-        "hora_inicio": "10:00",
-        "hora_fin": "11:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 15,
-        "salon": "A-16",
-        "materia": "Matemáticas",
-        "hora_inicio": "10:00",
-        "hora_fin": "9:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 16,
-        "salon": "A-17",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "11:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 17,
-        "salon": "A-18",
-        "materia": "Base de datos",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 3,
-        "comentario": ""
-      }
-    ]
-  },
-  {
-    "id": 5,
-    "ruta": "Edificio 1 / Piso 5",
-    "horarios": [
-      {
-        "id": 0,
-        "salon": "A-1",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 1,
-        "salon": "A-2",
-        "materia": "Base de datos",
-        "hora_inicio": "10:00",
-        "hora_fin": "10:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 2,
-        "salon": "A-3",
-        "materia": "Matemáticas",
-        "hora_inicio": "9:00",
-        "hora_fin": "11:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 3,
-        "salon": "A-4",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "10:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 4,
-        "salon": "A-5",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "9:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 5,
-        "salon": "A-6",
-        "materia": "Sistemas",
-        "hora_inicio": "10:00",
-        "hora_fin": "9:00",
-        "estado": 2,
-        "comentario": ""
-      },
-      {
-        "id": 6,
-        "salon": "A-7",
-        "materia": "Base de datos",
-        "hora_inicio": "9:00",
-        "hora_fin": "10:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 7,
-        "salon": "A-8",
-        "materia": "Matemáticas",
-        "hora_inicio": "8:00",
-        "hora_fin": "11:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 8,
-        "salon": "A-9",
-        "materia": "Base de datos",
-        "hora_inicio": "10:00",
-        "hora_fin": "8:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 9,
-        "salon": "A-10",
-        "materia": "Matemáticas",
-        "hora_inicio": "10:00",
-        "hora_fin": "10:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 10,
-        "salon": "A-11",
-        "materia": "Sistemas",
-        "hora_inicio": "9:00",
-        "hora_fin": "10:00",
-        "estado": 3,
-        "comentario": ""
-      },
-      {
-        "id": 11,
-        "salon": "A-12",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "8:00",
-        "estado": 1,
-        "comentario": ""
-      },
-      {
-        "id": 12,
-        "salon": "A-13",
-        "materia": "Base de datos",
-        "hora_inicio": "8:00",
-        "hora_fin": "10:00",
-        "estado": 4,
-        "comentario": ""
-      },
-      {
-        "id": 13,
-        "salon": "A-14",
-        "materia": "Base de datos",
-        "hora_inicio": "8:00",
-        "hora_fin": "8:00",
-        "estado": 0,
-        "comentario": ""
-      },
-      {
-        "id": 14,
-        "salon": "A-15",
-        "materia": "Matemáticas",
-        "hora_inicio": "11:00",
-        "hora_fin": "9:00",
-        "estado": 0,
-        "comentario": ""
-      }
-    ]
-  }
-]

+ 5 - 4
supervisor.php

@@ -212,8 +212,9 @@
                             <tr class="table-primary" v-if="reposiciones.length > 0">
                                 <th colspan="5" class="text-center align-middle">Reposiciones</th>
                             </tr>
-                            <tr v-for="clase in reposiciones" :key="`reposicion-${clase.horario_id}-${clase.profesor_id}`">
-                                <td class="text-center align-middle">{{ clase.salon }}</td>
+                            <tr v-for="clase in reposiciones"
+                                :key="`reposicion-${clase.horario_id}-${clase.profesor_id}`">
+                                <td class="text-center align-middle">{{ clase.reposicion_salon }}</td>
                                 <td class="text-center align-middle">
                                     <div class="col-12">
                                         {{ clase.profesor_nombre }}
@@ -226,7 +227,7 @@
                                         </button>
                                     </div>
                                 <td class="text-center align-middle">
-                                    {{ clase.reposicion_hora?.slice(0, 5) }} - {{ clase.horario_fin?.slice(0, 5) }}
+                                    {{ clase.reposicion_hora?.slice(0, 5) }} - {{ clase.reposicion_fin?.slice(0, 5) }}
                                 </td>
                                 <td class="text-center align-middle text-nowrap">
                                     <!-- data-toggle="button" -->
@@ -792,7 +793,7 @@
                 return store.profesor_selected.es_reposicion
                     ? this.reposiciones.find(clase => clase.horario_id == store.profesor_selected.horario_id && clase.profesor_id == store.profesor_selected.profesor_id) ?? false
                     : this.clases.find(clase => clase.horario_id == store.profesor_selected.horario_id && clase.profesor_id == store.profesor_selected.profesor_id) ?? false;
-        },
+            },
         }).mount('#app')
     </script>
 </body>

+ 9 - 5
test.php

@@ -2,7 +2,9 @@
 <html lang="en">
 
 <head>
-    <title>Consultar horario | <?= $user->facultad['facultad'] ?? 'General' ?></title>
+    <title>Consultar horario |
+        <?= $user->facultad['facultad'] ?? 'General' ?>
+    </title>
     <meta 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">
@@ -14,14 +16,16 @@
     <?php
     include('include/constantes.php');
     include("import/html_header.php");
+
+    html_header("test.php");
     ?>
     <?= "<!-- $user -->" ?>
     <main class="container content content-margin" id="local-app">
-        <?=
-        # query all profesores from horario_id = 4250 (JOIN HORARIO_PROFESOR, PROFESOR)
-        ord(" ")
-        ?>
+        
     </main>
+    <?
+    include "import/html_footer.php";
+    ?>
 </body>
 <script src="js/jquery.min.js"></script>
 <script src="js/bootstrap/bootstrap.min.js"></script>