From 2e00fbec203323de7f20c79ea040ac7a938fa920 Mon Sep 17 00:00:00 2001 From: Alejandro Rosales Date: Thu, 12 Oct 2023 16:29:39 +0000 Subject: [PATCH] STD --- action/action_auditoria.php | 7 +- action/action_facultad.php | 1 + action/carrera.php | 38 +- action/nivel.php | 31 ++ carreras.php | 899 +++++------------------------------- css/sgi.css | 11 +- horario_profesor.php | 133 ------ js/carreras.js | 44 ++ js/periodos.js | 44 ++ periodos.php | 220 +++++++++ puestos.php | 20 +- ts/carreras.ts | 63 +++ ts/periodos.ts | 63 +++ 13 files changed, 633 insertions(+), 941 deletions(-) create mode 100644 action/nivel.php delete mode 100644 horario_profesor.php create mode 100644 js/carreras.js create mode 100644 js/periodos.js create mode 100644 periodos.php create mode 100644 ts/carreras.ts create mode 100644 ts/periodos.ts diff --git a/action/action_auditoria.php b/action/action_auditoria.php index e15f7c9..0d5f095 100644 --- a/action/action_auditoria.php +++ b/action/action_auditoria.php @@ -36,8 +36,8 @@ try { horario_fecha_fin, horario_grupo, horario_hora, - periodo_fecha_inicio, - periodo_fecha_fin, + PERIODO.periodo_fecha_inicio, + PERIODO.periodo_fecha_fin, salon, materia_nombre as materia, carrera_nombre as carrera, @@ -49,10 +49,9 @@ try { JOIN carrera USING (carrera_id) JOIN nivel USING (nivel_id) JOIN facultad ON facultad.facultad_id = carrera.facultad_id - JOIN PERIODO_CARRERA USING (carrera_id) JOIN PERIODO USING (periodo_id) JOIN SALON USING (salon_id) - WHERE (periodo_id, facultad.facultad_id) = (:periodo_id, COALESCE(:facultad_id, facultad.facultad_id)) + WHERE (PERIODO.periodo_id, facultad.facultad_id) = (:periodo_id, COALESCE(:facultad_id, facultad.facultad_id)) ), fechas AS ( SELECT fechas_clase(h.horario_id, true) as registro_fecha_ideal, h.horario_id diff --git a/action/action_facultad.php b/action/action_facultad.php index c22ee32..3790346 100644 --- a/action/action_facultad.php +++ b/action/action_facultad.php @@ -30,6 +30,7 @@ try { SELECT facultad_nombre, facultad_id, clave_dependencia FROM facultad WHERE facultad_id = :facultad_id OR :facultad_id IS NULL + ORDER BY facultad_nombre ASC SQL , [':facultad_id' => $user->facultad['facultad_id']] diff --git a/action/carrera.php b/action/carrera.php index 7aed854..5d86594 100644 --- a/action/carrera.php +++ b/action/carrera.php @@ -1,5 +1,4 @@ facultad['facultad_id']; + $periodo_nivel_id = $db->where('periodo_id', $user->periodo_id)->getOne('periodo', 'nivel_id')['nivel_id']; $carreras = $db->query(<< $facultad_id]); + join nivel using (nivel_id) + join facultad using (facultad_id) + WHERE facultad_id = :facultad_id OR :facultad_id IS NULL AND + nivel.nivel_id = :periodo_nivel_id + ORDER BY facultad_nombre, carrera_nombre + SQL, [ + 'facultad_id' => $facultad_id, + 'periodo_nivel_id' => $periodo_nivel_id + ]); echo json_encode($carreras); break; + + case 'PUT': + // Update carrera {nivel_id} + $raw = file_get_contents('php://input'); + $data = json_decode($raw, true); + + if (!isset($data['carrera_id'], $data['nivel_id'])) { + header('HTTP/1.1 400 Bad Request'); + echo json_encode(['error' => 'Falta el id de la carrera o el nivel']); + exit(); + } + + $carrera_id = $data['carrera_id']; + $nivel_id = $data['nivel_id']; + $db->where('carrera_id', $carrera_id)->update('carrera', ['nivel_id' => $nivel_id]); + + $carrera_nombre = $db->where('carrera_id', $carrera_id)->getOne('carrera', 'carrera_nombre')['carrera_nombre']; + $nivel_nombre = $db->where('nivel_id', $nivel_id)->getOne('nivel', 'nivel_nombre')['nivel_nombre']; + + echo json_encode(['success' => "$carrera_nombre actualizada a $nivel_nombre"]); + break; default: header('HTTP/1.1 405 Method Not Allowed'); echo json_encode(['error' => 'Método no permitido']); diff --git a/action/nivel.php b/action/nivel.php new file mode 100644 index 0000000..5a5d58a --- /dev/null +++ b/action/nivel.php @@ -0,0 +1,31 @@ + 'No se ha iniciado sesión']); + exit(); +} +$user = Login::get_user(); + +try { + switch ($_SERVER['REQUEST_METHOD']) { + case 'GET': + // Fetch all puestos + $nivel = $db->get('nivel'); + echo json_encode($nivel); + break; + default: + header('HTTP/1.1 405 Method Not Allowed'); + echo json_encode(['error' => 'Método no permitido']); + break; + } +} catch (PDOException $e) { + echo json_encode([ + 'error' => $e->getMessage(), + 'query' => $db->getLastQuery(), + 'exception' => $e->getTraceAsString() + ]); +} \ No newline at end of file diff --git a/carreras.php b/carreras.php index 6eec3a7..397b7a0 100644 --- a/carreras.php +++ b/carreras.php @@ -1,809 +1,124 @@ -access('facultades'); -if($user->acceso == null){ - header('Location: main.php?error=1'); -}else{ - $user->print_to_log('Carreras'); -} -if($user->facultad['facultad_id']!=$_GET['facultad']){ - header('Location: carreras.php?facultad='.$user->facultad['facultad_id']); - $mal=true; -} -$mal=false; -?> - Carreras - - - + Auditoría asistencial - - - - $_GET['facultad']), true); - $fs_carreras = query( - "SELECT * FROM fs_carreras(:idfacultad, null, null)", - array(':idfacultad' => $_GET['facultad']), - single:false - ); - } - include "import/html_header.php"; - html_header( - "CARRERAS | " . $facultad['facultad_nombre'], - "Gestión de Checador " - ); - $user->access('facultades'); - - - $fs_niveles = query( - "SELECT * FROM nivel", null, false - ); - - $fs_periodos = query( - "SELECT * FROM fs_periodos(:idfacultad) WHERE estado = 'Activo' ", - array(':idfacultad' => $_GET['facultad']), - false - ); - - $fs_tiempoLic = query( - "SELECT * FROM fs_tiempo_checado(:idfacultad, 1)", - array(':idfacultad' => $_GET['facultad']), - true - ); - $fs_tiempoPos = query( - "SELECT * FROM fs_tiempo_checado(:idfacultad, 2)", - array(':idfacultad' => $_GET['facultad']), - true - ); - ?> -
- -
- -
- -
- -
- - -
-
- acceso == 'w') {?> -
- -
- -
- -
-
- - - - - - - - - acceso == 'w') {?> - - - - - - - - - - - - - acceso == 'w') {?> - - - - - -
EstadoNivelPeriodoInicioFinAcciones
- - - - - - - - - - - -
-
-
-
- -
-
- acceso == 'w') {?> -
- -
- -
- -
-
- - - - - - - acceso == 'w') {?> - - - - - - - - - - - acceso == 'w') {?> - - - - - -
EstadoNivelCarreraAcciones
- - - -
-
-
-
- -
-

Asigna los minutos de tolerancia antes y después del horario de clase

- -
- -

Licenciatura

-
-
- Antes - -
- Debe ser un numero mayor que 0 -
- min -
-
-
Hora de clase
-
-
- Despues - -
- Debe ser un numero mayor que 0 -
- min -
-
- Retardos - -
- Debe ser un numero mayor que 0 -
- min -
-
- ¿Tiene retardos?
-
- - -
-
-
-

-

Posgrado

-
-
- Antes - -
- Debe ser un numero mayor que 0 -
- min -
-
-
Hora de clase
-
-
- Despues - -
- Debe ser un numero mayor que 0 -
- min -
-
- Retardo - -
- Debe ser un numero mayor que 0 -
- min -
-
- ¿Tiene retardos?
-
- - -
-
-
-
-
-
-
- - -
-
-
-
-
- - - - - + + - - - - + + + - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/sgi.css b/css/sgi.css index 66b72f8..6e7f562 100644 --- a/css/sgi.css +++ b/css/sgi.css @@ -863,7 +863,7 @@ footer ul { } footer .footerTop .menuFooter ul>li { - *zoom: 1; + zoom: 1; float: left; clear: none; text-align: inherit; @@ -1058,11 +1058,18 @@ footer .tab-pane p { .movie { transition: all 0.1s; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + height: 8rem; + /* align all inside content to the middle */ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #f7f7f7; } .movie:hover { transform: scale(1.05); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5); font-size: 1.1em; } diff --git a/horario_profesor.php b/horario_profesor.php deleted file mode 100644 index 3458b23..0000000 --- a/horario_profesor.php +++ /dev/null @@ -1,133 +0,0 @@ -access(); -if (in_array($user->acceso, ['n'])) - die(header('Location: main.php?error=1')); - -$user->print_to_log('Consultar horario'); - -$write = $user->admin || in_array($user->acceso, ['w']); -// var_dump($user); -?> - - - - - Consultar horario | <?= $user->facultad['facultad'] ?? 'General' ?> - - - - - - - - - - - - - - - - - - - " ?> -
-
- - -
-
-
- -
- -
- -
- Profesor encontrado -
-
- Profesor no encontrado -
- - where('facultad_id', $user->facultad['facultad_id'])->get("fs_profesor"); - foreach ($profesores as $profesor) { - extract($profesor); - ?> - - - -
    - - -
    -
    - - -
    - - -
    -
    -
    -
    -
    - - - -
    - - - - - - - -
    - - - - - - - - - - - - - -
    HoraLunesMartesMiércolesJuevesViernesSábado
    -
    -
    - - - \ No newline at end of file diff --git a/js/carreras.js b/js/carreras.js new file mode 100644 index 0000000..ef4018f --- /dev/null +++ b/js/carreras.js @@ -0,0 +1,44 @@ +import { createApp } from 'https://unpkg.com/petite-vue?module'; +const app = createApp({ + carreras: [], + niveles: [], + message: {}, + async setNivel(carrera, nivel) { + if (carrera.nivel_id === nivel.nivel_id) { + return; + } + carrera.nivel_id = nivel.nivel_id; + carrera.nivel_nombre = nivel.nivel_nombre; + await fetch('action/carrera.php', { + method: 'PUT', + body: JSON.stringify({ + carrera_id: carrera.carrera_id, + nivel_id: nivel.nivel_id + }) + }) + .then(res => res.json()) + .then(res => { + this.message.title = "Actualización"; + this.message.text = res.error ?? res.success; + this.message.type = res.error ? 'danger' : 'success'; + this.message.timestamp = new Date().toLocaleTimeString(); + }); + }, + async mounted() { + this.carreras = await fetch('action/carrera.php').then(res => res.json()); + this.niveles = await fetch('action/nivel.php').then(res => res.json()); + // group by facultad_id + const carreras = this.carreras.reduce((acc, cur) => { + const { facultad_nombre } = cur; + if (!acc[facultad_nombre]) { + acc[facultad_nombre] = []; + } + acc[facultad_nombre].push(cur); + return acc; + }, {}); + this.carreras = Object.entries(carreras).map(([facultad_nombre, carreras]) => ({ + facultad_nombre: facultad_nombre, + carreras + })); + } +}).mount('#app'); diff --git a/js/periodos.js b/js/periodos.js new file mode 100644 index 0000000..ef4018f --- /dev/null +++ b/js/periodos.js @@ -0,0 +1,44 @@ +import { createApp } from 'https://unpkg.com/petite-vue?module'; +const app = createApp({ + carreras: [], + niveles: [], + message: {}, + async setNivel(carrera, nivel) { + if (carrera.nivel_id === nivel.nivel_id) { + return; + } + carrera.nivel_id = nivel.nivel_id; + carrera.nivel_nombre = nivel.nivel_nombre; + await fetch('action/carrera.php', { + method: 'PUT', + body: JSON.stringify({ + carrera_id: carrera.carrera_id, + nivel_id: nivel.nivel_id + }) + }) + .then(res => res.json()) + .then(res => { + this.message.title = "Actualización"; + this.message.text = res.error ?? res.success; + this.message.type = res.error ? 'danger' : 'success'; + this.message.timestamp = new Date().toLocaleTimeString(); + }); + }, + async mounted() { + this.carreras = await fetch('action/carrera.php').then(res => res.json()); + this.niveles = await fetch('action/nivel.php').then(res => res.json()); + // group by facultad_id + const carreras = this.carreras.reduce((acc, cur) => { + const { facultad_nombre } = cur; + if (!acc[facultad_nombre]) { + acc[facultad_nombre] = []; + } + acc[facultad_nombre].push(cur); + return acc; + }, {}); + this.carreras = Object.entries(carreras).map(([facultad_nombre, carreras]) => ({ + facultad_nombre: facultad_nombre, + carreras + })); + } +}).mount('#app'); diff --git a/periodos.php b/periodos.php new file mode 100644 index 0000000..80b2bfc --- /dev/null +++ b/periodos.php @@ -0,0 +1,220 @@ + + + + + + + Auditoría asistencial + + + + + + + + + + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +

    + + +

    +
    + +
    +
    + +
    + +
    +
    + ({{puesto.encargado.usuario_clave}}) {{ puesto.encargado.usuario_nombre }} +
    +
    + Selecciona un encargado +
    + +
      +
    • + ( {{usuario.usuario_clave}} ) {{ usuario.usuario_nombre }} +
    • +
    + +
    +
    +
    + +
    + +
    +
    + Selecciona una carrera +
    + +
      +
    • + Todas las carreras +
    • +
    • + ( {{carrera.clave_carrera}} ) {{ carrera.carrera_nombre }} +
    • +
    + +
    +
    +
    + + +
    + + + +
    +
    + Materias Asignadas {{puesto.materias.length}} +
      +
    • +
      +
      + +
      +
      + {{materia.clave_materia}} - {{materia.materia_nombre}} +
      +
      +
    • +
    + +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/puestos.php b/puestos.php index e956ee7..b58eedf 100644 --- a/puestos.php +++ b/puestos.php @@ -38,12 +38,20 @@ -
    - -
    + + acceso == 'w') { + ?> +
    + +
    + +
    , + async setNivel(carrera: Carrera, nivel: Nivel) { + if (carrera.nivel_id === nivel.nivel_id) { + return + } + carrera.nivel_id = nivel.nivel_id + carrera.nivel_nombre = nivel.nivel_nombre + + await fetch('action/carrera.php', { + method: 'PUT', + body: JSON.stringify({ + carrera_id: carrera.carrera_id, + nivel_id: nivel.nivel_id + }) + }) + .then(res => res.json()) + .then(res => { + this.message.title = "Actualización" + this.message.text = res.error ?? res.success + this.message.type = res.error ? 'danger' : 'success' + this.message.timestamp = new Date().toLocaleTimeString() + }) + + + }, + async mounted() { + this.carreras = await fetch('action/carrera.php').then(res => res.json()) + this.niveles = await fetch('action/nivel.php').then(res => res.json()) + // group by facultad_id + const carreras = this.carreras.reduce((acc, cur) => { + const { facultad_nombre } = cur + if (!acc[facultad_nombre]) { + acc[facultad_nombre] = [] + } + acc[facultad_nombre].push(cur) + return acc + }, {} as Record) + this.carreras = Object.entries(carreras).map(([facultad_nombre, carreras]) => ({ + facultad_nombre: facultad_nombre, + carreras + })) + } +}).mount('#app') \ No newline at end of file diff --git a/ts/periodos.ts b/ts/periodos.ts new file mode 100644 index 0000000..de8fb43 --- /dev/null +++ b/ts/periodos.ts @@ -0,0 +1,63 @@ +import { createApp, reactive } from 'https://unpkg.com/petite-vue?module' + +type Carrera = { + carrera_id: number; + carrera_nombre: string; + clave_carrera: string; + facultad_id: number; + facultad_nombre: string; + nivel_id: number; + nivel_nombre: string; +} + +type Nivel = { + nivel_id: number; + nivel_nombre: string; +} + +const app = createApp({ + carreras: [] as Carrera[], + niveles: [] as Nivel[], + message: {} as Record, + async setNivel(carrera: Carrera, nivel: Nivel) { + if (carrera.nivel_id === nivel.nivel_id) { + return + } + carrera.nivel_id = nivel.nivel_id + carrera.nivel_nombre = nivel.nivel_nombre + + await fetch('action/carrera.php', { + method: 'PUT', + body: JSON.stringify({ + carrera_id: carrera.carrera_id, + nivel_id: nivel.nivel_id + }) + }) + .then(res => res.json()) + .then(res => { + this.message.title = "Actualización" + this.message.text = res.error ?? res.success + this.message.type = res.error ? 'danger' : 'success' + this.message.timestamp = new Date().toLocaleTimeString() + }) + + + }, + async mounted() { + this.carreras = await fetch('action/carrera.php').then(res => res.json()) + this.niveles = await fetch('action/nivel.php').then(res => res.json()) + // group by facultad_id + const carreras = this.carreras.reduce((acc, cur) => { + const { facultad_nombre } = cur + if (!acc[facultad_nombre]) { + acc[facultad_nombre] = [] + } + acc[facultad_nombre].push(cur) + return acc + }, {} as Record) + this.carreras = Object.entries(carreras).map(([facultad_nombre, carreras]) => ({ + facultad_nombre: facultad_nombre, + carreras + })) + } +}).mount('#app') \ No newline at end of file