Se agrega servicio de APIREST y los endpoint para dashboard en conunto a funcionalidades de filtros.
This commit is contained in:
1 parent
a2fbd4b675
commit
d6e4af90b9
17 files changed
+1348
-56
No files matched your search
@@ -0,0 +1,26 @@
|
||||
import { api } from './api';
|
||||
import type { Programa, Libro, CodigoSence, Ponderacion } from './types/academico';
|
||||
|
||||
export const obtenerProgramas = () =>
|
||||
api.get<Programa[]>('/api/academico/programas');
|
||||
|
||||
export const obtenerCursosPorPrograma = (programaId: string) =>
|
||||
api.get<Programa[]>(`/api/academico/programas/${programaId}/cursos`);
|
||||
|
||||
export const agregarCursoPrograma = (data: Omit<Programa, 'id'>) =>
|
||||
api.post('/api/academico/cursos', data);
|
||||
|
||||
export const editarCursoPrograma = (id: string, data: Partial<Programa>) =>
|
||||
api.put(`/api/academico/cursos/${id}`, data);
|
||||
|
||||
export const obtenerLibros = () =>
|
||||
api.get<Libro[]>('/api/academico/libros');
|
||||
|
||||
export const obtenerCodigosSence = (tipo: 'abiertos' | 'cerrados') =>
|
||||
api.get<CodigoSence[]>(`/api/academico/sence/${tipo}`);
|
||||
|
||||
export const obtenerPonderaciones = (cursoId: string) =>
|
||||
api.get<Ponderacion>(`/api/academico/ponderaciones/${cursoId}`);
|
||||
|
||||
export const guardarPonderaciones = (cursoId: string, data: Ponderacion) =>
|
||||
api.put(`/api/academico/ponderaciones/${cursoId}`, data);
|
||||
@@ -0,0 +1,44 @@
|
||||
const PROXY_BASE = '/api/external';
|
||||
|
||||
async function request<T>(endpoint: string, options?: RequestInit): Promise<T> {
|
||||
const url = `${PROXY_BASE}${endpoint}`;
|
||||
|
||||
console.log('[API] →', url);
|
||||
|
||||
let res: Response;
|
||||
try {
|
||||
res = await fetch(url, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...options?.headers,
|
||||
},
|
||||
...options,
|
||||
});
|
||||
} catch (networkError) {
|
||||
console.error('[API] Error de red al llamar:', url);
|
||||
console.error('[API] Detalle:', networkError);
|
||||
throw new Error(`Fallo de red al llamar ${url}: ${networkError}`);
|
||||
}
|
||||
|
||||
if (!res.ok) {
|
||||
const body = await res.text().catch(() => '(sin body)');
|
||||
console.error('[API] Respuesta no OK:', res.status, res.statusText);
|
||||
console.error('[API] Body:', body);
|
||||
throw new Error(`API Error: ${res.status} ${res.statusText} - ${body}`);
|
||||
}
|
||||
|
||||
try {
|
||||
return await res.json();
|
||||
} catch (parseError) {
|
||||
console.error('[API] Error al parsear JSON de:', url);
|
||||
console.error('[API] Detalle:', parseError);
|
||||
throw new Error(`Respuesta no válida JSON de ${url}`);
|
||||
}
|
||||
}
|
||||
|
||||
export const api = {
|
||||
get: <T>(url: string) => request<T>(url),
|
||||
post: <T>(url: string, body: unknown) => request<T>(url, { method: 'POST', body: JSON.stringify(body) }),
|
||||
put: <T>(url: string, body: unknown) => request<T>(url, { method: 'PUT', body: JSON.stringify(body) }),
|
||||
delete: <T>(url: string) => request<T>(url, { method: 'DELETE' }),
|
||||
};
|
||||
@@ -0,0 +1,41 @@
|
||||
import { api } from './api';
|
||||
import type { CursoAdmin, SesionCurso, AsistenciaAlumno, NotaAlumno } from './types/cursos';
|
||||
|
||||
export const obtenerCurso = (codigo: string) =>
|
||||
api.get<CursoAdmin>(`/api/cursos/${codigo}`);
|
||||
|
||||
export const editarFechasCurso = (codigo: string, data: { fechaInicio: string; fechaTermino: string }) =>
|
||||
api.put(`/api/cursos/${codigo}/fechas`, data);
|
||||
|
||||
export const editarHorarioCurso = (codigo: string, data: { horario: string }) =>
|
||||
api.put(`/api/cursos/${codigo}/horario`, data);
|
||||
|
||||
export const cambiarProfesor = (codigo: string, data: { profesorId: string }) =>
|
||||
api.put(`/api/cursos/${codigo}/profesor`, data);
|
||||
|
||||
export const eliminarProfesor = (codigo: string) =>
|
||||
api.delete(`/api/cursos/${codigo}/profesor`);
|
||||
|
||||
export const asignarReemplazo = (codigo: string, data: { profesorId: string; sesiones: string[] }) =>
|
||||
api.post(`/api/cursos/${codigo}/reemplazos`, data);
|
||||
|
||||
export const obtenerSesiones = (codigo: string) =>
|
||||
api.get<SesionCurso[]>(`/api/cursos/${codigo}/sesiones`);
|
||||
|
||||
export const reemplazarSesion = (sesionId: string, data: { nuevoProfesorId: string }) =>
|
||||
api.put(`/api/cursos/sesiones/${sesionId}/reemplazar`, data);
|
||||
|
||||
export const suspenderSesion = (sesionId: string) =>
|
||||
api.put(`/api/cursos/sesiones/${sesionId}/suspender`);
|
||||
|
||||
export const obtenerAsistencias = (codigo: string) =>
|
||||
api.get<AsistenciaAlumno[]>(`/api/cursos/${codigo}/asistencias`);
|
||||
|
||||
export const actualizarAsistencia = (codigo: string, data: AsistenciaAlumno[]) =>
|
||||
api.put(`/api/cursos/${codigo}/asistencias`, data);
|
||||
|
||||
export const obtenerNotas = (codigo: string) =>
|
||||
api.get<NotaAlumno[]>(`/api/cursos/${codigo}/notas`);
|
||||
|
||||
export const actualizarNotas = (codigo: string, data: NotaAlumno[]) =>
|
||||
api.put(`/api/cursos/${codigo}/notas`, data);
|
||||
@@ -0,0 +1,14 @@
|
||||
import { api } from './api';
|
||||
import type { CursoDelDia, EstadisticasDashboard, KpiDashboard, DetalleCursoDia } from './types/dashboard';
|
||||
|
||||
export const obtenerCursosDelDia = (fecha: string, idsede?: string, idjornada?: string) =>
|
||||
api.get<CursoDelDia[]>(`/api/empresas-cursos?fecha=${fecha}&idsede=${idsede ?? ''}&idjornada=${idjornada ?? ''}`);
|
||||
|
||||
export const obtenerEstadisticas = () =>
|
||||
api.get<EstadisticasDashboard>('/api/dashboard/estadisticas');
|
||||
|
||||
export const obtenerKpiDashboard = (fecha: string, idsede?: string, idjornada?: string) =>
|
||||
api.get<KpiDashboard>(`/api/empresas-cursos/kpi-dashboard?fecha=${fecha}&idsede=${idsede ?? ''}&idjornada=${idjornada ?? ''}`);
|
||||
|
||||
export const obtenerDetalleCursoDia = (fecha: string, idsede?: string, idjornada?: string) =>
|
||||
api.get<DetalleCursoDia[]>(`/api/empresas-cursos/detalle?fecha=${fecha}&idsede=${idsede ?? ''}&idjornada=${idjornada ?? ''}`);
|
||||
@@ -0,0 +1,35 @@
|
||||
import { api } from './api';
|
||||
import type {
|
||||
EmpresaItem, EmpresaDetalle, CotizacionItem,
|
||||
ContratoItem, DocumentoItem, AlumnoItem, ComprobanteOC
|
||||
} from './types/empresas';
|
||||
|
||||
export const obtenerEmpresas = () =>
|
||||
api.get<EmpresaItem[]>('/api/empresas');
|
||||
|
||||
export const obtenerEmpresa = (rut: string) =>
|
||||
api.get<EmpresaDetalle>(`/api/empresas/${rut}`);
|
||||
|
||||
export const obtenerCotizaciones = (rutEmpresa: string) =>
|
||||
api.get<CotizacionItem[]>(`/api/empresas/${rutEmpresa}/cotizaciones`);
|
||||
|
||||
export const obtenerContratos = (cotizacionId: string) =>
|
||||
api.get<ContratoItem[]>(`/api/cotizaciones/${cotizacionId}/contratos`);
|
||||
|
||||
export const verificarFirmaContrato = (contratoId: string) =>
|
||||
api.get<{ firmado: boolean }>(`/api/contratos/${contratoId}/firma`);
|
||||
|
||||
export const obtenerDocumentos = (contratoId: string) =>
|
||||
api.get<DocumentoItem[]>(`/api/contratos/${contratoId}/documentos`);
|
||||
|
||||
export const subirDocumento = (contratoId: string, data: FormData) =>
|
||||
api.post(`/api/contratos/${contratoId}/documentos`, data);
|
||||
|
||||
export const obtenerAlumnosContrato = (contratoId: string) =>
|
||||
api.get<AlumnoItem[]>(`/api/contratos/${contratoId}/alumnos`);
|
||||
|
||||
export const obtenerComprobantesOC = (contratoId: string) =>
|
||||
api.get<ComprobanteOC[]>(`/api/contratos/${contratoId}/comprobantes`);
|
||||
|
||||
export const obtenerInscripcionesSNC = (contratoId: string) =>
|
||||
api.get<DocumentoItem[]>(`/api/contratos/${contratoId}/inscripciones`);
|
||||
@@ -0,0 +1,14 @@
|
||||
import { api } from './api';
|
||||
import type { CursoItem, MetricasInforme, InformeAlumno } from './types/informes';
|
||||
|
||||
export const obtenerCursosActivos = (mes: number, anio: number) =>
|
||||
api.get<CursoItem[]>(`/api/informes/cursos-activos?mes=${mes}&anio=${anio}`);
|
||||
|
||||
export const obtenerMetricas = (mes: number, anio: number) =>
|
||||
api.get<MetricasInforme>(`/api/informes/metricas?mes=${mes}&anio=${anio}`);
|
||||
|
||||
export const obtenerInformesAlumnos = (filtros?: { curso?: string; empresa?: string }) =>
|
||||
api.get<InformeAlumno[]>('/api/informes/alumnos');
|
||||
|
||||
export const obtenerSesionesProfesor = (profesorId: string) =>
|
||||
api.get('/api/informes/sesiones-profesor');
|
||||
@@ -0,0 +1,20 @@
|
||||
import { api } from './api';
|
||||
import type { Alumno, FichaAlumno, FichaProfesor, Evaluacion } from './types/secretaria';
|
||||
|
||||
export const buscarAlumno = (tipo: 'run' | 'nombre', texto: string) =>
|
||||
api.get<Alumno[]>(`/api/secretaria/alumnos?tipo=${tipo}&q=${texto}`);
|
||||
|
||||
export const obtenerFichaAlumno = (idAlumno: string) =>
|
||||
api.get<FichaAlumno>(`/api/secretaria/alumnos/${idAlumno}`);
|
||||
|
||||
export const editarAlumno = (idAlumno: string, data: Partial<FichaAlumno>) =>
|
||||
api.put(`/api/secretaria/alumnos/${idAlumno}`, data);
|
||||
|
||||
export const cambiarCursoAlumno = (idAlumno: string, data: { cursoNuevoId: string }) =>
|
||||
api.put(`/api/secretaria/alumnos/${idAlumno}/curso`, data);
|
||||
|
||||
export const obtenerFichaProfesor = (idProfesor: string) =>
|
||||
api.get<FichaProfesor>(`/api/secretaria/profesores/${idProfesor}`);
|
||||
|
||||
export const ingresarEvaluacion = (data: Evaluacion) =>
|
||||
api.post('/api/secretaria/evaluaciones', data);
|
||||
@@ -0,0 +1,26 @@
|
||||
export interface Programa {
|
||||
nivel: string;
|
||||
curso: string;
|
||||
horasCronologicas: string;
|
||||
cefrLevel: string;
|
||||
libro: string;
|
||||
senceOnline: string;
|
||||
sencePresencial: string;
|
||||
}
|
||||
|
||||
export interface Libro {
|
||||
id: string;
|
||||
nombre: string;
|
||||
nivel: string;
|
||||
}
|
||||
|
||||
export interface CodigoSence {
|
||||
codigo: string;
|
||||
descripcion: string;
|
||||
tipo: string;
|
||||
}
|
||||
|
||||
export interface Ponderacion {
|
||||
cursoId: string;
|
||||
ponderaciones: { evaluacion: string; porcentaje: number }[];
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
export interface CursoAdmin {
|
||||
codigo: string;
|
||||
nombre: string;
|
||||
periodo: string;
|
||||
fechaInicio: string;
|
||||
fechaTermino: string;
|
||||
sede: string;
|
||||
estado: string;
|
||||
sala: string;
|
||||
profesor: string;
|
||||
sesiones: number;
|
||||
horario: string;
|
||||
}
|
||||
|
||||
export interface SesionCurso {
|
||||
id: string;
|
||||
fecha: string;
|
||||
horaInicio: string;
|
||||
horaFin: string;
|
||||
estado: string;
|
||||
profesor: string;
|
||||
}
|
||||
|
||||
export interface AsistenciaAlumno {
|
||||
rut: string;
|
||||
nombre: string;
|
||||
asistio: boolean;
|
||||
fecha: string;
|
||||
}
|
||||
|
||||
export interface NotaAlumno {
|
||||
rut: string;
|
||||
nombre: string;
|
||||
nota: number;
|
||||
evaluacion: string;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
export interface CursoDelDia {
|
||||
codigo: number;
|
||||
tipoCurso: string | null;
|
||||
curso: string | null;
|
||||
profesor: string | null;
|
||||
asignacion: string | null;
|
||||
sede: string | null;
|
||||
periodo: string | null;
|
||||
sala: string | null;
|
||||
jornada: string | null;
|
||||
horaInicio: string | null;
|
||||
inicio: string | null;
|
||||
horaTermino: string | null;
|
||||
inicioSesion: string | null;
|
||||
terminoSesion: string | null;
|
||||
sesionRegistrada: string | null;
|
||||
}
|
||||
|
||||
export interface EstadisticasDashboard {
|
||||
empresas: number;
|
||||
cursos: number;
|
||||
alumnosConSence: number;
|
||||
alumnosSinSence: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
export interface KpiDashboard {
|
||||
cantidad_empresas: number;
|
||||
cantidad_cursos: number;
|
||||
cantidad_alumnos: number;
|
||||
cantidad_alumnos_sence: number;
|
||||
cantidad_alumnos_nosence: number;
|
||||
}
|
||||
|
||||
export interface DetalleCursoDia {
|
||||
codigo: number;
|
||||
TipoCurso: string | null;
|
||||
curso: string | null;
|
||||
idAlumno: string | null;
|
||||
idtiporegistroacademico: number | null;
|
||||
contrato: number | null;
|
||||
idEmpresas: string | null;
|
||||
rznscl: string | null;
|
||||
profesor: string | null;
|
||||
asignacion: string | null;
|
||||
sede: string | null;
|
||||
periodo: string | null;
|
||||
sala: string | null;
|
||||
jornada: string | null;
|
||||
Hora_Inicio: string | null;
|
||||
Hora_Termino: string | null;
|
||||
inicio: string | null;
|
||||
termino: string | null;
|
||||
SesionRegistrada: string | null;
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
export interface EmpresaItem {
|
||||
rut: string;
|
||||
razonSocial: string;
|
||||
giro: string;
|
||||
correo: string;
|
||||
ultimoContacto: string;
|
||||
}
|
||||
|
||||
export interface EmpresaDetalle {
|
||||
rut: string;
|
||||
razonSocial: string;
|
||||
giro: string;
|
||||
direccion: string;
|
||||
comuna: string;
|
||||
fono: string;
|
||||
correo: string;
|
||||
contacto: string;
|
||||
}
|
||||
|
||||
export interface CotizacionItem {
|
||||
cotizacion: string;
|
||||
contratosAsociados: string;
|
||||
tipoCotizacion: string;
|
||||
creacion: string;
|
||||
estadoCotizacion: string;
|
||||
valor: string;
|
||||
idTipoCurso: string;
|
||||
condicionCotizacion: string;
|
||||
montoDescto: string;
|
||||
}
|
||||
|
||||
export interface ContratoItem {
|
||||
contrato: string;
|
||||
firmaEstado: number;
|
||||
url: string;
|
||||
cursoInfo: string;
|
||||
valor: string;
|
||||
autorizacionSSEE?: string;
|
||||
}
|
||||
|
||||
export interface DocumentoItem {
|
||||
detalle: string;
|
||||
numeroInterno?: string;
|
||||
fechaSubida: string;
|
||||
tipoDocumento?: string;
|
||||
codInscripcion?: string;
|
||||
responsable: string;
|
||||
}
|
||||
|
||||
export interface AlumnoItem {
|
||||
rut: string;
|
||||
nombre: string;
|
||||
email: string;
|
||||
}
|
||||
|
||||
export interface ComprobanteOC {
|
||||
detalle: string;
|
||||
numeroInterno: string;
|
||||
fechaSubida: string;
|
||||
tipoDocumento: string;
|
||||
responsable: string;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
export interface CursoItem {
|
||||
Codigo: string;
|
||||
Curso: string;
|
||||
TipoCurso: string;
|
||||
Periodo: string;
|
||||
Titular: string;
|
||||
Sede: string;
|
||||
Alumnos: number;
|
||||
Inicio: string;
|
||||
Termino: string;
|
||||
Schedule: string;
|
||||
Estado: string;
|
||||
}
|
||||
|
||||
export interface MetricasInforme {
|
||||
empresasTotal: number;
|
||||
cursosTotal: number;
|
||||
alumnosConSence: number;
|
||||
alumnosSinSence: number;
|
||||
alumnosTotal: number;
|
||||
}
|
||||
|
||||
export interface InformeAlumno {
|
||||
rut: string;
|
||||
nombre: string;
|
||||
curso: string;
|
||||
estado: string;
|
||||
notas: number;
|
||||
asistencia: number;
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
export interface Alumno {
|
||||
idAlumno: string;
|
||||
AP_Paterno: string;
|
||||
AP_Materno: string;
|
||||
Nombres: string;
|
||||
}
|
||||
|
||||
export interface FichaAlumno {
|
||||
idAlumno: string;
|
||||
nombre: string;
|
||||
paterno: string;
|
||||
materno: string;
|
||||
rut: string;
|
||||
telefono: string;
|
||||
email: string;
|
||||
direccion: string;
|
||||
comuna: string;
|
||||
region: string;
|
||||
fechaNacimiento: string;
|
||||
ocupacion: string;
|
||||
profesion: string;
|
||||
cursos: CursoAlumno[];
|
||||
contratos: ContratoAlumno[];
|
||||
apoderados: ApoderadoAlumno[];
|
||||
certificados: CertificadoAlumno[];
|
||||
comentarios: ComentarioAlumno[];
|
||||
}
|
||||
|
||||
export interface CursoAlumno {
|
||||
year: number;
|
||||
id: number;
|
||||
curso: string;
|
||||
contrato: string;
|
||||
fechaInicio: string;
|
||||
fechaTermino: string;
|
||||
estado: string;
|
||||
}
|
||||
|
||||
export interface ContratoAlumno {
|
||||
id: string;
|
||||
numero: string;
|
||||
estado: string;
|
||||
}
|
||||
|
||||
export interface ApoderadoAlumno {
|
||||
rut: string;
|
||||
nombre: string;
|
||||
telefono: string;
|
||||
parentesco: string;
|
||||
}
|
||||
|
||||
export interface CertificadoAlumno {
|
||||
id: string;
|
||||
fechaEmision: string;
|
||||
curso: string;
|
||||
horas: number;
|
||||
}
|
||||
|
||||
export interface ComentarioAlumno {
|
||||
id: string;
|
||||
fecha: string;
|
||||
autor: string;
|
||||
texto: string;
|
||||
}
|
||||
|
||||
export interface FichaProfesor {
|
||||
idProfesor: string;
|
||||
nombre: string;
|
||||
paterno: string;
|
||||
materno: string;
|
||||
rut: string;
|
||||
telefono: string;
|
||||
email: string;
|
||||
cursos: CursoProfesor[];
|
||||
}
|
||||
|
||||
export interface CursoProfesor {
|
||||
codigo: string;
|
||||
curso: string;
|
||||
sede: string;
|
||||
horario: string;
|
||||
alumnos: number;
|
||||
}
|
||||
|
||||
export interface Evaluacion {
|
||||
cursoId: string;
|
||||
alumnoId: string;
|
||||
tipo: string;
|
||||
nota: number;
|
||||
observaciones: string;
|
||||
}
|
||||
Reference in new issue
Block a user