diff --git a/arbol del proyecto b/arbol del proyecto new file mode 100644 index 0000000..0343a72 --- /dev/null +++ b/arbol del proyecto @@ -0,0 +1,47 @@ +Proyecto Web/Web (solo archivos .aspx) +├── Academico/ +│ ├── CodigosSence.aspx +│ ├── CodigosSencePC.aspx +│ ├── Cursos.aspx +│ ├── CursosPC.aspx +│ ├── index.aspx +│ ├── Libros.aspx +│ ├── PlanDeEstudio.aspx +│ └── Ponderaciones.aspx +├── Administrador/ +│ └── ActualizarSesiones.aspx +├── Alumnos/ +│ ├── EvaluacionPresencial.aspx +│ ├── Ficha.aspx +│ └── Index.aspx +├── Clientes/ +│ ├── Autorizador.aspx +│ ├── DesactivaContratos.aspx +│ ├── Ficha.aspx +│ ├── Index.aspx +│ └── InfoEmpresas.aspx +├── Cursos/ +│ ├── Administrador.aspx +│ ├── Index.aspx +│ └── Reemplazo.aspx +├── Informes/ +│ ├── AlumnosActivos.aspx +│ ├── AlumnosCursos.aspx +│ ├── AlumnosEmpresas.aspx +│ ├── AlumnosPeriodos.aspx +│ ├── Autorizados.aspx +│ ├── ContratosHistorial.aspx +│ ├── CursosActivos.aspx +│ ├── CursosAsistencias.aspx +│ ├── CursosDocentes.aspx +│ ├── CursosDocentesFinalizados.aspx +│ ├── CursosFechas.aspx +│ ├── CursosInicios.aspx +│ ├── Index.aspx +│ ├── PollAnalysis.aspx +│ ├── PollStudents.aspx +│ ├── SesionesEstipuladas.aspx +│ └── SesionesProfesores.aspx +├── Profesor/ +│ └── Ficha.aspx +└── Index.aspx diff --git a/conversor.txt b/conversor.txt new file mode 100644 index 0000000..92e9b37 --- /dev/null +++ b/conversor.txt @@ -0,0 +1,352 @@ + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ + + + +
diff --git a/package.json b/package.json index 3ecc51b..fb8de7d 100755 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "@boxicons/react": "^1.0.3", "bootstrap": "5.3.8", + "chart.js": "^4.5.1", "next": "16.2.12", "react": "19.2.4", "react-dom": "19.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e70922..629e1bd 100755 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,12 @@ importers: bootstrap: specifier: 5.3.8 version: 5.3.8(@popperjs/core@2.11.8) + chart.js: + specifier: ^4.5.1 + version: 4.5.1 next: specifier: 16.2.12 - version: 16.2.12(@babel/core@7.29.7)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.2.12(@babel/core@7.29.7(supports-color@7.2.0))(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: specifier: 19.2.4 version: 19.2.4 @@ -44,10 +47,10 @@ importers: version: 1.0.0 eslint: specifier: ^9 - version: 9.39.5 + version: 9.39.5(supports-color@7.2.0) eslint-config-next: specifier: 16.2.12 - version: 16.2.12(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3) + version: 16.2.12(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) typescript: specifier: ^5 version: 5.9.3 @@ -365,6 +368,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@kurkle/color@0.3.4': + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + '@napi-rs/wasm-runtime@1.2.0': resolution: {integrity: sha512-kDoONqMa+VnZ4vvvu/ZUurpJ4gkZU57e7g69qpNgWhYcZFPUHZM2CEMKm+cG6ufDVALbjMvfmMjFVqaK7uEMnA==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -802,6 +808,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chart.js@4.5.1: + resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} + engines: {pnpm: '>=8'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -1869,20 +1879,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@7.2.0) '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -1907,19 +1917,19 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@7.2.0) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -1944,7 +1954,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.7(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -1952,7 +1962,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -1986,17 +1996,17 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5)': + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5(supports-color@7.2.0))': dependencies: - eslint: 9.39.5 + eslint: 9.39.5(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.21.2(supports-color@7.2.0)': dependencies: '@eslint/object-schema': 2.1.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -2009,10 +2019,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.6': + '@eslint/eslintrc@3.3.6(supports-color@7.2.0)': dependencies: ajv: 6.15.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -2164,6 +2174,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@kurkle/color@0.3.4': {} + '@napi-rs/wasm-runtime@1.2.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -2250,15 +2262,15 @@ snapshots: dependencies: csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/type-utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) - '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.65.0 - eslint: 9.39.5 + eslint: 9.39.5(supports-color@7.2.0) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -2266,23 +2278,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3)': + '@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3 - eslint: 9.39.5 + debug: 4.4.3(supports-color@7.2.0) + eslint: 9.39.5(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.65.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) '@typescript-eslint/types': 8.65.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2296,13 +2308,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.65.0(eslint@9.39.5)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.5 + '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + debug: 4.4.3(supports-color@7.2.0) + eslint: 9.39.5(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -2310,13 +2322,13 @@ snapshots: '@typescript-eslint/types@8.65.0': {} - '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.65.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.65.0(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) '@typescript-eslint/types': 8.65.0 '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 @@ -2325,13 +2337,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.65.0(eslint@9.39.5)(typescript@5.9.3)': + '@typescript-eslint/utils@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(supports-color@7.2.0)) '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) - eslint: 9.39.5 + '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@5.9.3) + eslint: 9.39.5(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2579,6 +2591,10 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chart.js@4.5.1: + dependencies: + '@kurkle/color': 0.3.4 + client-only@0.0.1: {} codepage@1.15.0: {} @@ -2623,13 +2639,17 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - debug@3.2.7: + debug@3.2.7(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 deep-is@0.1.4: {} @@ -2777,18 +2797,18 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@16.2.12(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3): + eslint-config-next@16.2.12(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.2.12 - eslint: 9.39.5 - eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5))(eslint@9.39.5) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5) - eslint-plugin-react: 7.37.5(eslint@9.39.5) - eslint-plugin-react-hooks: 7.1.1(eslint@9.39.5) + eslint: 9.39.5(supports-color@7.2.0) + eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(supports-color@7.2.0)) + eslint-plugin-react: 7.37.5(eslint@9.39.5(supports-color@7.2.0)) + eslint-plugin-react-hooks: 7.1.1(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0) globals: 16.4.0 - typescript-eslint: 8.65.0(eslint@9.39.5)(typescript@5.9.3) + typescript-eslint: 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2797,52 +2817,52 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-import-resolver-node@0.3.10: + eslint-import-resolver-node@0.3.10(supports-color@7.2.0): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) is-core-module: 2.16.2 resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5))(eslint@9.39.5): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3 - eslint: 9.39.5 + debug: 4.4.3(supports-color@7.2.0) + eslint: 9.39.5(supports-color@7.2.0) get-tsconfig: 4.14.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.17 unrs-resolver: 1.12.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5))(eslint@9.39.5))(eslint@9.39.5): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) optionalDependencies: - '@typescript-eslint/parser': 8.65.0(eslint@9.39.5)(typescript@5.9.3) - eslint: 9.39.5 - eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5))(eslint@9.39.5) + '@typescript-eslint/parser': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + eslint: 9.39.5(supports-color@7.2.0) + eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) doctrine: 2.1.0 - eslint: 9.39.5 - eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5))(eslint@9.39.5))(eslint@9.39.5) + eslint: 9.39.5(supports-color@7.2.0) + eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -2854,13 +2874,13 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(supports-color@7.2.0)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -2870,7 +2890,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.5 + eslint: 9.39.5(supports-color@7.2.0) hasown: 2.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -2879,18 +2899,18 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@7.1.1(eslint@9.39.5): + eslint-plugin-react-hooks@7.1.1(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/parser': 7.29.7 - eslint: 9.39.5 + eslint: 9.39.5(supports-color@7.2.0) hermes-parser: 0.25.1 zod: 4.4.3 zod-validation-error: 4.0.2(zod@4.4.3) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.5): + eslint-plugin-react@7.37.5(eslint@9.39.5(supports-color@7.2.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -2898,7 +2918,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.4.0 - eslint: 9.39.5 + eslint: 9.39.5(supports-color@7.2.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -2923,14 +2943,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.5: + eslint@9.39.5(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 + '@eslint/config-array': 0.21.2(supports-color@7.2.0) '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.6 + '@eslint/eslintrc': 3.3.6(supports-color@7.2.0) '@eslint/js': 9.39.5 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 @@ -2940,7 +2960,7 @@ snapshots: ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -3352,7 +3372,7 @@ snapshots: natural-compare@1.4.0: {} - next@16.2.12(@babel/core@7.29.7)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next@16.2.12(@babel/core@7.29.7(supports-color@7.2.0))(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@next/env': 16.2.12 '@swc/helpers': 0.5.15 @@ -3361,7 +3381,7 @@ snapshots: postcss: 8.4.31 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.4) + styled-jsx: 5.1.6(@babel/core@7.29.7(supports-color@7.2.0))(react@19.2.4) optionalDependencies: '@next/swc-darwin-arm64': 16.2.12 '@next/swc-darwin-x64': 16.2.12 @@ -3717,12 +3737,12 @@ snapshots: strip-json-comments@3.1.1: {} - styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.4): + styled-jsx@5.1.6(@babel/core@7.29.7(supports-color@7.2.0))(react@19.2.4): dependencies: client-only: 0.0.1 react: 19.2.4 optionalDependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) supports-color@7.2.0: dependencies: @@ -3789,13 +3809,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.65.0(eslint@9.39.5)(typescript@5.9.3): + typescript-eslint@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3) - '@typescript-eslint/parser': 8.65.0(eslint@9.39.5)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) - eslint: 9.39.5 + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.5(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + eslint: 9.39.5(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color diff --git a/src/app/Informes/CursosActivos/page.tsx b/src/app/Informes/CursosActivos/page.tsx new file mode 100644 index 0000000..91b7647 --- /dev/null +++ b/src/app/Informes/CursosActivos/page.tsx @@ -0,0 +1,483 @@ +"use client"; + +import React, { useState } from "react"; +import { + User, + Buildings, + Book, + UserCircle, + // Export, + CheckCircle, + // ErrorCircle, +} from "@boxicons/react"; + +// Interfaz para el listado de cursos +interface CursoItem { + Codigo: string; + Curso: string; + TipoCurso: string; + Periodo: string; + Titular: string; + Sede: string; + Alumnos: number; + Inicio: string; + Termino: string; + Schedule: string; + Estado: "Finalizado" | "En curso" | string; +} + +export default function CursosPorMesPage() { + // Filtros de búsqueda (Mes y Año) + const [mes, setMes] = useState("1"); + const [agno, setAgno] = useState(new Date().getFullYear().toString()); + + // Visibilidad del reporte + const [mostrarReporte, setMostrarReporte] = useState(false); + + // Totales + const [empTotal, setEmpTotal] = useState("0"); + const [cursosTotal, setCursosTotal] = useState("0 %"); + const [almConSnc, setAlmConSnc] = useState("0"); + const [almSinSnc, setAlmSinSnc] = useState("0"); + const [alumnosTotal, setAlumnosTotal] = useState("0"); + + // Lista de cursos + const [cursos, setCursos] = useState([]); + + // Modales de estado + const [isLoading, setIsLoading] = useState(false); + const [modalAlerta, setModalAlerta] = useState<{ + show: boolean; + mensaje: string; + }>({ show: false, mensaje: "" }); + + // Manejador del botón Buscar + const handleBuscar = () => { + if (!agno) { + setModalAlerta({ + show: true, + mensaje: "Por favor, ingrese un año válido.", + }); + return; + } + + setIsLoading(true); + + // Simulación de carga de datos + setTimeout(() => { + setIsLoading(false); + setMostrarReporte(true); + + // Datos de ejemplo + setEmpTotal("8"); + setCursosTotal("90 %"); + setAlmConSnc("32"); + setAlmSinSnc("10"); + setAlumnosTotal("42"); + + setCursos([ + { + Codigo: "CUR-201", + Curso: "Inglés de Negocios A2", + TipoCurso: "Cerrado", + Periodo: `${agno}-${mes}`, + Titular: "Carlos Mendoza", + Sede: "Santiago Centro", + Alumnos: 12, + Inicio: `01/${mes.padStart(2, "0")}/${agno}`, + Termino: `28/${mes.padStart(2, "0")}/${agno}`, + Schedule: "Lun-Mié 10:00 - 12:00", + Estado: "Finalizado", + }, + { + Codigo: "CUR-202", + Curso: "Inglés Conversacional B1", + TipoCurso: "Abierto", + Periodo: `${agno}-${mes}`, + Titular: "Patricia Silva", + Sede: "Providencia", + Alumnos: 15, + Inicio: `05/${mes.padStart(2, "0")}/${agno}`, + Termino: `30/${mes.padStart(2, "0")}/${agno}`, + Schedule: "Mar-Jue 19:00 - 21:00", + Estado: "En curso", + }, + ]); + }, 1000); + }; + + // Restablecer vista + const handleVolver = () => { + setMostrarReporte(false); + setCursos([]); + }; + + // Exportar Excel + const handleExportarExcel = () => { + setIsLoading(true); + setTimeout(() => { + setIsLoading(false); + setModalAlerta({ + show: true, + mensaje: "El reporte en Excel ha sido generado con éxito.", + }); + }, 800); + }; + + return ( + <> +
+
+
+ {/* ENCABEZADO Y VOLVER */} +
+
+
+
+ + + + + Cursos por Mes + +
+
+ +
+
+
+
+ + {/* FILTROS MES Y AÑO */} +
+
+
+
+ Mes +
+
+ +
+
+ Agno +
+
+ setAgno(e.target.value)} + /> +
+
+ +
+
+
+
+ + {/* REPORTE Y RESULTADOS */} + {mostrarReporte && ( +
+
+ {/* METRICA EMPRESAS */} +
+
+
+
+

+ +

+ + Empresas + +
+
+ + Total + +
+ {empTotal} +
+
+
+
+
+ + {/* METRICA CURSOS */} +
+
+
+
+

+ +

+ + Cursos + +
+
+ + Total + +
+ {cursosTotal} +
+
+
+
+
+ + {/* METRICA ALUMNOS */} +
+
+
+
+

+ +

+ + Alumnos + +
+
+
+
+ + Con SENCE + +
+ {almConSnc} +
+
+
+ + Sin SENCE + +
+ {almSinSnc} +
+
+
+ + Total + +
+ {alumnosTotal} +
+
+
+
+
+
+
+ + {/* BOTÓN EXPORTAR EXCEL */} +
+
+
+
+

+ {/* */} +

+
+
+ + Excel + + +
+
+
+
+ + {/* TABLA DE RESULTADOS */} +
+
+
+ + + + + + + + + + + + + + + + + {cursos.map((item, idx) => ( + + + + + + + + + + + + + ))} + +
Tipo de CursoCursoPeriodoProfesorSedeAlumnosFechaScheduleEstado
+ {item.TipoCurso === "Cerrado" ? ( + + + Ver + + + ) : ( + + + Ver + + + )} + + {item.TipoCurso} + + {`${item.Codigo} - ${item.Curso}`} + + {item.Periodo} + + {item.Titular} + + {item.Sede} + + {item.Alumnos} + + {`${item.Inicio} || ${item.Termino}`} + + {item.Schedule} + + {item.Estado === "Finalizado" ? ( + + Finalizado + + ) : ( + + {/* */} En curso + + )} +
+
+
+
+
+
+ )} +
+
+
+ + {/* MODAL DE ALERTA / MENSAJE */} + {modalAlerta.show && ( + + )} + + {/* MODAL DE CARGANDO */} + {isLoading && ( +
+
+
+
+
+
+ Cargando... +
+

Cargando información...

+
+
+
+
+
+ )} + + ); +} \ No newline at end of file diff --git a/src/app/Informes/CursosIniTer/page.tsx b/src/app/Informes/CursosIniTer/page.tsx new file mode 100644 index 0000000..56cba4c --- /dev/null +++ b/src/app/Informes/CursosIniTer/page.tsx @@ -0,0 +1,285 @@ +"use client"; + +import React, { useState } from "react"; +import { User, InfoCircle } from "@boxicons/react"; + +// Interfaz para la estructura del listado del informe +interface InformeItem { + Codigo: string; + Curso: string; + idAlumno: string; + Alumno: string; + RegsitroAcademico: string; + idEmpresas: string; + Empresa: string; + contrato: string; + Sede: string; + Jornada: string; + Fecha: string; +} + +export default function InformeCursosPage() { + // Estados para textos e información dinámica + const [mensajeLabel, setMensajeLabel] = useState("Información del reporte cargada correctamente."); + const [fechTypeLabel, setFechTypeLabel] = useState("Fecha Inicio"); + + // Estado para el listado de datos + const [informeList, setInformeList] = useState([ + { + Codigo: "CUR-101", + Curso: "Inglés Técnico para Empresas", + idAlumno: "18.765.432-1", + Alumno: "Roberto Gómez", + RegsitroAcademico: "REG-2026-01", + idEmpresas: "76.543.210-K", + Empresa: "Servicios Tecnológicos SpA", + contrato: "CTR-88", + Sede: "Santiago Centro", + Jornada: "Vespertina", + Fecha: "15/03/2026", + }, + { + Codigo: "CUR-102", + Curso: "Inglés Negocios B1", + idAlumno: "19.123.456-7", + Alumno: "Andrea Morales", + RegsitroAcademico: "REG-2026-02", + idEmpresas: "77.111.222-3", + Empresa: "Consultoras Unidas S.A.", + contrato: "CTR-92", + Sede: "Providencia", + Jornada: "Diurna", + Fecha: "18/03/2026", + }, + ]); + + // Estados para modales + const [isLoading, setIsLoading] = useState(false); + const [modalAlerta, setModalAlerta] = useState<{ + show: boolean; + mensaje: string; + }>({ show: false, mensaje: "" }); + + // Evento para descargar Excel + const handleDescargarExcel = () => { + setIsLoading(true); + + setTimeout(() => { + setIsLoading(false); + setModalAlerta({ + show: true, + mensaje: "El archivo Excel se ha generado y descargado con éxito.", + }); + }, 1200); + }; + + return ( + <> +
+
+
+ {/* ENCABEZADO Y BOTÓN VOLVER */} +
+
+
+
+ + + + + Informe + +
+ +
+
+
+ + {/* SECCIÓN INFORMACIÓN Y DESCARGA EXCEL */} +
+
+
+
+ + + + + {mensajeLabel} + +
+
+ +
+
+
+
+ + {/* TABLA PRINCIPAL DEL INFORME */} +
+
+
+ + + + + + + + + + + + + + + + + + {informeList.map((item, index) => ( + + + + + + + + + + + + + + ))} + +
+ Curso ID + + Curso + + Alumno RUN + + Alumno + + Registro + + Empresa Rut + + Empresa + + Contrato + + Sede + + Jornada + + {fechTypeLabel} Curso +
+ {item.Codigo} + + {item.Curso} + + {item.idAlumno} + + {item.Alumno} + + {item.RegsitroAcademico} + + {item.idEmpresas} + + {item.Empresa} + + {item.contrato} + + {item.Sede} + + {item.Jornada} + + {item.Fecha} +
+
+
+
+
+
+
+ + {/* MODAL DE ALERTA / MENSAJE DE ERROR O ÉXITO */} + {modalAlerta.show && ( + + )} + + {/* MODAL DE CARGANDO / LOADING */} + {isLoading && ( +
+
+
+
+
+
+ Procesando... +
+

Procesando descarga...

+
+
+
+
+
+ )} + + ); +} \ No newline at end of file diff --git a/src/app/Informes/CursosInicio/page.tsx b/src/app/Informes/CursosInicio/page.tsx new file mode 100644 index 0000000..368c769 --- /dev/null +++ b/src/app/Informes/CursosInicio/page.tsx @@ -0,0 +1,483 @@ +"use client"; + +import React, { useState } from "react"; +import { + User, + Buildings, + Book, + UserCircle, + //Export, + CheckCircle, + //ErrorCircle, +} from "@boxicons/react"; + +// Interfaz para la estructura del listado de cursos +interface CursoItem { + Codigo: string; + Curso: string; + TipoCurso: string; + Periodo: string; + Titular: string; + Sede: string; + Alumnos: number; + Inicio: string; + Termino: string; + Schedule: string; + Estado: "Finalizado" | "En curso" | string; +} + +export default function CursosIniciadosPage() { + // Filtros de fecha + const [fechaInicio, setFechaInicio] = useState(""); + const [fechaTermino, setFechaTermino] = useState(""); + + // Visibilidad de datos / reporte + const [mostrarReporte, setMostrarReporte] = useState(false); + + // Totales + const [empTotal, setEmpTotal] = useState("0"); + const [cursosTotal, setCursosTotal] = useState("0 %"); + const [almConSnc, setAlmConSnc] = useState("0"); + const [almSinSnc, setAlmSinSnc] = useState("0"); + const [alumnosTotal, setAlumnosTotal] = useState("0"); + + // Lista de datos + const [cursos, setCursos] = useState([]); + + // Modals de estado + const [isLoading, setIsLoading] = useState(false); + const [modalAlerta, setModalAlerta] = useState<{ + show: boolean; + mensaje: string; + }>({ show: false, mensaje: "" }); + + // Manejador del botón Buscar + const handleBuscar = () => { + if (!fechaInicio || !fechaTermino) { + setModalAlerta({ + show: true, + mensaje: "Por favor, seleccione un rango de fechas válido.", + }); + return; + } + + setIsLoading(true); + + // Simulación de consulta API + setTimeout(() => { + setIsLoading(false); + setMostrarReporte(true); + + // Datos ficticios de prueba basados en el modelo + setEmpTotal("12"); + setCursosTotal("85 %"); + setAlmConSnc("45"); + setAlmSinSnc("15"); + setAlumnosTotal("60"); + + setCursos([ + { + Codigo: "CUR-001", + Curso: "Inglés Avanzado B2", + TipoCurso: "Cerrado", + Periodo: "2026-1", + Titular: "Juan Pérez", + Sede: "Santiago Centro", + Alumnos: 15, + Inicio: "01/03/2026", + Termino: "30/06/2026", + Schedule: "Lun-Mié 09:00 - 11:00", + Estado: "Finalizado", + }, + { + Codigo: "CUR-002", + Curso: "Inglés Intermedio A2", + TipoCurso: "Abierto", + Periodo: "2026-1", + Titular: "María González", + Sede: "Providencia", + Alumnos: 20, + Inicio: "10/03/2026", + Termino: "15/07/2026", + Schedule: "Mar-Jue 18:30 - 20:30", + Estado: "En curso", + }, + ]); + }, 1000); + }; + + // Manejador para volver o limpiar + const handleVolver = () => { + setMostrarReporte(false); + setFechaInicio(""); + setFechaTermino(""); + setCursos([]); + }; + + // Manejador para exportar a Excel + const handleExportarExcel = () => { + setIsLoading(true); + setTimeout(() => { + setIsLoading(false); + setModalAlerta({ + show: true, + mensaje: "El reporte en Excel ha sido generado con éxito.", + }); + }, 800); + }; + + return ( + <> +
+
+
+ {/* ENCABEZADO Y BOTÓN VOLVER */} +
+
+
+
+ + + + + Cursos iniciados por fecha + +
+
+ +
+
+
+
+ + {/* FILTROS DE FECHA Y BÚSQUEDA */} +
+
+
+
+ Inicio +
+
+ setFechaInicio(e.target.value)} + /> +
+
+ Termino +
+
+ setFechaTermino(e.target.value)} + /> +
+
+ +
+
+
+
+ + {/* SECCIÓN REPORTE / RESULTADOS */} + {mostrarReporte && ( +
+
+ {/* METRICA EMPRESAS */} +
+
+
+
+

+ +

+ + Empresas + +
+
+ + Total + +
+ {empTotal} +
+
+
+
+
+ + {/* METRICA CURSOS */} +
+
+
+
+

+ +

+ + Cursos + +
+
+ + Total + +
+ {cursosTotal} +
+
+
+
+
+ + {/* METRICA ALUMNOS */} +
+
+
+
+

+ +

+ + Alumnos + +
+
+
+
+ + Con SENCE + +
+ {almConSnc} +
+
+
+ + Sin SENCE + +
+ {almSinSnc} +
+
+
+ + Total + +
+ {alumnosTotal} +
+
+
+
+
+
+
+ + {/* BOTÓN EXPORTAR EXCEL */} +
+
+
+
+

+ {/* */} +

+
+
+ + Excel + + +
+
+
+
+ + {/* TABLA DE RESULTADOS */} +
+
+
+ + + + + + + + + + + + + + + + + {cursos.map((item, idx) => ( + + + + + + + + + + + + + ))} + +
Tipo de CursoCursoPeriodoProfesorSedeAlumnosFechaScheduleEstado
+ {item.TipoCurso === "Cerrado" ? ( + + + Ver + + + ) : ( + + + Ver + + + )} + + {item.TipoCurso} + + {`${item.Codigo} - ${item.Curso}`} + + {item.Periodo} + + {item.Titular} + + {item.Sede} + + {item.Alumnos} + + {`${item.Inicio} || ${item.Termino}`} + + {item.Schedule} + + {item.Estado === "Finalizado" ? ( + + Finalizado + + ) : ( + + {/* En curso */} + + )} +
+
+
+
+
+
+ )} +
+
+
+ + {/* MODAL DE ALERTA / MENSAJE */} + {modalAlerta.show && ( + + )} + + {/* MODAL DE CARGANDO */} + {isLoading && ( +
+
+
+
+
+
+ Cargando... +
+

Cargando información...

+
+
+
+
+
+ )} + + ); +} \ No newline at end of file diff --git a/src/app/Informes/SEAlumnos/page.tsx b/src/app/Informes/SEAlumnos/page.tsx new file mode 100644 index 0000000..d790eed --- /dev/null +++ b/src/app/Informes/SEAlumnos/page.tsx @@ -0,0 +1,649 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import Link from "next/link"; +import { + User, + // AlertOctagon, + // Export, + Buildings, + UserCircle, + BookLibrary, + // Error as ErrorIcon, +} from "@boxicons/react"; + + import Chart from "chart.js/auto"; + +export default function AlumnosPorMesPage() { + // Estados para controlar las vistas + const [divReporteV2, setDivReporteV2] = useState(true); + const [divReporte, setDivReporte] = useState(false); + + // Estados para modales + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showAlertModal, setShowAlertModal] = useState(false); + const [mensajeAlerta, setMensajeAlerta] = useState(""); + + // Datos simulados para tablas + const [regiones] = useState([ + { Region: "Región Metropolitana", Cantidad: 150 }, + { Region: "Valparaíso", Cantidad: 45 }, + ]); + + const [comunas] = useState([ + { Comuna: "Santiago", Cantidad: 80 }, + { Comuna: "Providencia", Cantidad: 70 }, + ]); + + // Manejador de búsqueda + const handleBuscar = (e: React.FormEvent) => { + e.preventDefault(); + setShowLoadingModal(true); + + setTimeout(() => { + setShowLoadingModal(false); + }, 1500); + }; + + // Inicialización de gráficos Chart.js + useEffect(() => { + // Gráfico de Ocupación (Bar) + const ctxOcupacion = document.getElementById( + "OcupacionBar" + ) as HTMLCanvasElement; + let chartOcupacion: Chart | null = null; + if (ctxOcupacion) { + chartOcupacion = new Chart(ctxOcupacion, { + type: "bar", + data: { + labels: ["Enero", "Febrero", "Marzo"], + datasets: [ + { + label: "Cantidad", + data: [12, 19, 3], + borderWidth: 1, + }, + ], + }, + options: { responsive: true }, + }); + } + + // Gráfico de Profesiones (Pie) + const ctxProfesion = document.getElementById( + "ProfesionPies" + ) as HTMLCanvasElement; + let chartProfesion: Chart | null = null; + if (ctxProfesion) { + chartProfesion = new Chart(ctxProfesion, { + type: "pie", + data: { + labels: ["Ingeniería", "Medicina", "Educación", "Otros"], + datasets: [ + { + label: "Cantidad", + data: [30, 20, 15, 35], + }, + ], + }, + options: { responsive: true }, + }); + } + + // Limpieza al desmontar componente + return () => { + if (chartOcupacion) chartOcupacion.destroy(); + if (chartProfesion) chartProfesion.destroy(); + }; + }, [divReporteV2]); + + return ( +
+
+ {/* Encabezado y Filtros */} +
+
+
+
+
+
+ + + + + Alumnos por Mes + +
+
+ + Volver + +
+
+
+
+
+
+
+
+ Mes +
+
+ +
+
+ Año +
+
+ +
+
+ +
+
+
+
+
+
+ + {/* Reporte V2 */} + {divReporteV2 && ( +
+
+
+ {/* Columna Izquierda (Totales, Exportar y Grafico Bar) */} +
+
+
+ +
+ +
+
+
+
+

+ +

+ + Alumnos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+ +
+
+
+
+ + {/* Columna Central (Tablas Regiones y Comunas) */} +
+
+
+
+
+ + + + + + + + + {regiones.map((item, index) => ( + + + + + ))} + +
+ Regiones + + Cantidad +
{item.Region}{item.Cantidad}
+
+
+
+ +
+
+
+ + + + + + + + + {comunas.map((item, index) => ( + + + + + ))} + +
+ Comuna + + Cantidad +
{item.Comuna}{item.Cantidad}
+
+
+
+
+
+ + {/* Columna Derecha (Gráfico de Profesiones) */} +
+
+
+
+

+ + + Profesiones + + +

+ +
+
+
+
+
+
+
+ )} + + {/* Reporte V1 (Oculto por defecto) */} + {divReporte && ( +
+
+
+
+
+
+

+ +

+ + Alumnos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Cursos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Alumnos + +
+
+
+
+ + Con SENCE + +
+ 0 +
+
+
+ + Sin SENCE + +
+ 0 +
+
+
+ + Total + +
+ 0 +
+
+
+
+
+
+
+ +
+
+
+
+

+ +

+ + Empresas + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

+ +

+ + Alumnos por Planes + +
+
+
+
+ + Adults + +
+
+ 0 +
+
+
+
+ + Business + +
+
+ 0 +
+
+
+
+ + Teens + +
+
+ 0 +
+
+
+
+ + Kids + +
+
+ 0 +
+
+
+
+
+
+ +
+
+
+
+

+ +

+ + Condicion de registro + +
+
+
+
+ + Plan Central + +
+ 0 +
+
+
+ + Curso Cerrado + +
+ 0 +
+
+
+ + Total + +
+ 0 +
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ )} +
+ + {/* MODAL DE MENSAJES/ALERTAS */} + {showAlertModal && ( +
+
+
+
+
+ Módulo Académico - Reporte +
+ +
+
+
+ {mensajeAlerta} +
+
+
+ +
+
+
+
+ )} + + {/* MODAL CARGANDO */} + {showLoadingModal && ( +
+
+
+
+
+ SAM - Académico Empresas +
+
+
+
+ Procesando, espere un momento... +
+
+
+
+
+
+
+
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/Informes/SEAlumnosCursosCC/page.tsx b/src/app/Informes/SEAlumnosCursosCC/page.tsx new file mode 100644 index 0000000..d2405a0 --- /dev/null +++ b/src/app/Informes/SEAlumnosCursosCC/page.tsx @@ -0,0 +1,658 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import Link from "next/link"; +import { User, + //Export + +} from "@boxicons/react"; + +export default function CursosPorMesPage() { + // Estados para modales + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showAlertModal, setShowAlertModal] = useState(false); + const [mensajeAlerta, setMensajeAlerta] = useState(""); + + // Datos simulados para la tabla de Planes (DataList en ASP.NET) + const [planes] = useState([ + { Plan: "Intensivo Adults", Cantidad: 45 }, + { Plan: "Regular Kids", Cantidad: 30 }, + { Plan: "Business Express", Cantidad: 25 }, + ]); + + // Manejo de búsqueda + const handleBuscar = (e: React.FormEvent) => { + e.preventDefault(); + setShowLoadingModal(true); + + setTimeout(() => { + setShowLoadingModal(false); + }, 1500); + }; + + // Manejo de exportación a Excel + const handleExportarExcel = (e: React.MouseEvent) => { + e.preventDefault(); + setMensajeAlerta("Generando y descargando archivo Excel..."); + setShowAlertModal(true); + }; + + // Carga de Chart.js mediante importación dinámica + useEffect(() => { + let chartJornadas: any = null; + let chartPlan: any = null; + + import("chart.js/auto").then(({ default: Chart }) => { + // Gráfico de Jornadas (Bar) + const ctxJornadas = document.getElementById( + "jornadasBar" + ) as HTMLCanvasElement; + if (ctxJornadas) { + chartJornadas = new Chart(ctxJornadas, { + type: "bar", + data: { + labels: ["Mañana", "Tarde", "Noche", "Sábado"], + datasets: [ + { + label: "Cantidad", + data: [15, 25, 40, 10], + borderWidth: 1, + }, + ], + }, + options: { + responsive: true, + }, + }); + } + + // Gráfico de Programas (Pie) + const ctxPlan = document.getElementById("planPie") as HTMLCanvasElement; + if (ctxPlan) { + chartPlan = new Chart(ctxPlan, { + type: "pie", + data: { + labels: ["Adults", "Kids", "Teens", "Business"], + datasets: [ + { + label: "Cantidad", + data: [45, 30, 15, 25], + }, + ], + }, + options: { + maintainAspectRatio: false, + responsive: true, + plugins: { + legend: { + position: "left", + labels: { + font: { + size: 11, + }, + }, + }, + }, + }, + }); + } + }); + + return () => { + if (chartJornadas) chartJornadas.destroy(); + if (chartPlan) chartPlan.destroy(); + }; + }, []); + + return ( +
+
+ {/* Filtros superiores */} +
+
+
+
+
+
+ + + + + Cursos por mes + +
+
+ + Volver + +
+
+
+
+
+
+
+
+ Mes +
+
+ +
+
+ Año +
+
+ +
+
+ +
+
+
+
+
+
+ + {/* Sección Reporte Principal */} +
+
+
+ {/* Columna Izquierda: Tarjetas y métricas */} +
+
+
+ +
+ +
+
+
+
+

+ +

+ + Alumnos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Cursos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Inscripción de Alumnos + +
+
+ + Con SENCE + +
+ 0 +
+
+
+ + Sin SENCE + +
+ 0 +
+
+
+ + Total + +
+ 0 +
+
+
+
+
+
+
+ + {/* Columna Central: Tabla de Planes y Progreso de Sedes */} +
+
+
+
+
+ + + + + + + + + {planes.map((item, index) => ( + + + + + ))} + +
+ Plan + + Cantidad +
{item.Plan}{item.Cantidad}
+ + + + + + + +
+ TOTAL + + {planes.reduce((acc, curr) => acc + curr.Cantidad, 0)} +
+
+
+
+ +
+
+
+

+ + Cursos por sedes con alumnos de empresas + +

+
+

+ +

+ + Sedes + +
+
+
+
+ Cursos sin SENCE +
+
+
+
+
+ Cursos con SENCE +
+
+
+ +
+
+ Moneda +
+
+
+
+
+
+
+
+
+ Providencia +
+
+
+
+
+
+
+ +
+
+ La Florida +
+
+
+
+
+
+
+
+
+ Online +
+
+
+
+
+
+
+
+
+ Empresas +
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Columna Derecha: Gráficos de Jornadas y Programas */} +
+
+
+
+

+ + + Jornadas + + +

+ +
+
+
+
+

+ + + Programas + + +

+ +
+
+
+
+
+
+
+
+ + {/* MODAL ALERTA / MENSAJES */} + {showAlertModal && ( +
+
+
+
+
+ Módulo Académico - Cursos +
+ +
+
+
+ {mensajeAlerta} +
+
+
+ +
+
+
+
+ )} + + {/* MODAL CARGANDO */} + {showLoadingModal && ( +
+
+
+
+
+ SAM - Académico Empresas +
+
+
+
+ Procesando, espere un momento... +
+
+
+
+
+
+
+
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/Informes/SEAlumnosCursosPC/page.tsx b/src/app/Informes/SEAlumnosCursosPC/page.tsx new file mode 100644 index 0000000..6a4ac1c --- /dev/null +++ b/src/app/Informes/SEAlumnosCursosPC/page.tsx @@ -0,0 +1,666 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import Link from "next/link"; +import { User } from "@boxicons/react"; + +export default function CursosPlanCentralPage() { + // Estado para visibilidad del reporte (corresponde a visible="false" en ASP.NET) + const [divReporte, setDivReporte] = useState(true); + + // Estados para modales de carga y mensajes/errores + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showAlertModal, setShowAlertModal] = useState(false); + const [mensajeAlerta, setMensajeAlerta] = useState(""); + + // Estado para los filtros de Periodo y Letras + const [periodo, setPeriodo] = useState(""); + const [letras, setLetras] = useState([]); + + // Datos para la tabla de Planes (DataList en ASP.NET) + const [planes] = useState([ + { Plan: "Plan Central General", Cantidad: 35 }, + { Plan: "Plan Intensivo", Cantidad: 20 }, + ]); + + // Evento al cambiar Periodo (simula el AutoPostBack de ASP.NET) + const handlePeriodoChange = (e: React.ChangeEvent) => { + const val = e.target.value; + setPeriodo(val); + + // Actualización dinámica de select según el periodo seleccionado + if (val === "1") { + setLetras(["A", "B", "C"]); + } else if (val === "2") { + setLetras(["D", "E", "F"]); + } else { + setLetras([]); + } + }; + + // Manejo de búsqueda + const handleBuscar = (e: React.FormEvent) => { + e.preventDefault(); + setShowLoadingModal(true); + + setTimeout(() => { + setShowLoadingModal(false); + setDivReporte(true); // Hace visible el reporte tras buscar + }, 1200); + }; + + // Exportar a Excel + const handleExportarExcel = (e: React.MouseEvent) => { + e.preventDefault(); + setMensajeAlerta("Generando y exportando reporte Excel..."); + setShowAlertModal(true); + }; + + // Inicialización de Chart.js dinámico en cliente + useEffect(() => { + if (!divReporte) return; + + let chartJornadas: any = null; + let chartPlan: any = null; + + import("chart.js/auto").then(({ default: Chart }) => { + // Gráfico de Jornadas (Bar) + const ctxJornadas = document.getElementById( + "jornadasBar" + ) as HTMLCanvasElement; + + if (ctxJornadas) { + chartJornadas = new Chart(ctxJornadas, { + type: "bar", + data: { + labels: ["Mañana", "Tarde", "Noche"], + datasets: [ + { + label: "Cantidad", + data: [12, 19, 8], + borderWidth: 1, + }, + ], + }, + options: { + responsive: true, + }, + }); + } + + // Gráfico de Programas (Pie) + const ctxPlan = document.getElementById("planPie") as HTMLCanvasElement; + + if (ctxPlan) { + chartPlan = new Chart(ctxPlan, { + type: "pie", + data: { + labels: ["Programa A", "Programa B", "Programa C"], + datasets: [ + { + label: "Cantidad", + data: [20, 15, 10], + borderWidth: 1, + }, + ], + }, + options: { + maintainAspectRatio: false, + responsive: true, + plugins: { + legend: { + position: "left", + labels: { + font: { + size: 11, + }, + }, + }, + }, + }, + }); + } + }); + + return () => { + if (chartJornadas) chartJornadas.destroy(); + if (chartPlan) chartPlan.destroy(); + }; + }, [divReporte]); + + return ( +
+
+ {/* Encabezado y Filtros */} +
+
+
+
+
+
+ + + + + + Cursos plan central por mes + + +
+
+ + Volver + +
+
+
+
+
+
+
+
+ Año +
+
+ +
+
+ Periodo +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ + {/* Sección Reporte Principal */} + {divReporte && ( +
+
+
+ {/* Métricas y Tarjetas Izquierda */} +
+
+
+ +
+ +
+
+
+
+

+ +

+ + Alumnos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Cursos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Inscripción de Alumnos + +
+
+ + Con SENCE + +
+ 0 +
+
+
+ + Sin SENCE + +
+ 0 +
+
+
+ + Total + +
+ 0 +
+
+
+
+
+
+
+ + {/* Tabla de Planes y Progreso de Sedes */} +
+
+
+
+
+ + + + + + + + + {planes.map((item, index) => ( + + + + + ))} + +
+ Plan + + Cantidad +
{item.Plan}{item.Cantidad}
+ + + + + + + +
+ TOTAL + + {planes.reduce((acc, curr) => acc + curr.Cantidad, 0)} +
+
+
+
+ +
+
+
+

+ + Cursos por sedes con Alumnos de empresas + +

+
+

+ +

+ + Sedes + +
+
+
+
+ Cursos sin SENCE +
+
+
+
+
+ Cursos con SENCE +
+
+
+ +
+
+ Moneda +
+
+
+
+
+
+
+
+
+ Providencia +
+
+
+
+
+
+
+ +
+
+ La Florida +
+
+
+
+
+
+
+
+
+ Online +
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Canvas de Gráficos */} +
+
+
+
+

+ + + Jornadas + + +

+ +
+
+
+
+

+ + + Programas + + +

+ +
+
+
+
+
+
+
+ )} +
+ + {/* MODAL ALERTA / MENSAJES */} + {showAlertModal && ( +
+
+
+
+
+ Módulo Académico - Plan Central +
+ +
+
+
+ {mensajeAlerta} +
+
+
+ +
+
+
+
+ )} + + {/* MODAL CARGANDO */} + {showLoadingModal && ( +
+
+
+
+
+ SAM - Académico Empresas +
+
+
+
+ Procesando, espere un momento... +
+
+
+
+
+
+
+
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/Informes/SEAlumnosEmpresas/page.tsx b/src/app/Informes/SEAlumnosEmpresas/page.tsx new file mode 100644 index 0000000..cfffe47 --- /dev/null +++ b/src/app/Informes/SEAlumnosEmpresas/page.tsx @@ -0,0 +1,611 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import Link from "next/link"; +import { User, BuildingHouse } from "@boxicons/react"; + +export default function EmpresasPorMesPage() { + // Estado de visibilidad del reporte principal (div_reporte) + const [divReporte, setDivReporte] = useState(true); + + // Estados para modales de Carga y Alertas/Errores + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showAlertModal, setShowAlertModal] = useState(false); + const [mensajeAlerta, setMensajeAlerta] = useState(""); + + // Manejo de búsqueda + const handleBuscar = (e: React.FormEvent) => { + e.preventDefault(); + setShowLoadingModal(true); + + setTimeout(() => { + setShowLoadingModal(false); + setDivReporte(true); + }, 1200); + }; + + // Manejo de exportación Excel + const handleExportarExcel = (e: React.MouseEvent) => { + e.preventDefault(); + setMensajeAlerta("Generando y exportando reporte Excel..."); + setShowAlertModal(true); + }; + + // Carga e inicialización de Chart.js dinámico para Tipo de Ventas (Doughnut) + useEffect(() => { + if (!divReporte) return; + + let chartVenta: any = null; + + import("chart.js/auto").then(({ default: Chart }) => { + const ctxVenta = document.getElementById( + "ventaPie" + ) as HTMLCanvasElement; + + if (ctxVenta) { + chartVenta = new Chart(ctxVenta, { + type: "doughnut", + data: { + labels: ["Directa", "Licitación", "Convenio Marco", "Otros"], + datasets: [ + { + label: "Cantidad", + data: [40, 25, 20, 15], + borderWidth: 1, + }, + ], + }, + options: { + responsive: true, + }, + }); + } + }); + + return () => { + if (chartVenta) chartVenta.destroy(); + }; + }, [divReporte]); + + return ( +
+
+ {/* Encabezado y Filtros */} +
+
+
+
+
+
+ + + + + Empresas por mes + +
+
+ + Volver + +
+
+
+
+
+
+
+
+ Mes +
+
+ +
+
+ Año +
+
+ +
+
+ +
+
+
+
+
+
+ + {/* Sección Reporte Principal */} + {divReporte && ( +
+
+
+ {/* Métricas y Tarjetas Izquierda */} +
+
+
+ +
+ +
+
+
+
+

+ +

+ + Alumnos + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Empresas + +
+
+ + Total + +
+ 0 +
+
+
+
+
+ +
+
+
+
+

+ +

+ + Alumnos + +
+
+ + Con SENCE + +
+ 0 +
+
+
+ + Sin SENCE + +
+ 0 +
+
+
+ + Total + +
+ 0 +
+
+
+
+
+
+
+ + {/* Tabla Alumnos de empresas y Progreso de Sedes */} +
+
+
+
+
+

Alumnos de empresas

+ + + + + + + + + + + + + + + + + + + + + +
+ Tipo + + Cantidad +
+ Cursos Abierto + + 0 +
+ Cursos Cerrado + + 0 +
+ Total + + 0 +
+
+
+
+ +
+
+
+

+ + Sedes con alumnos de empresas + +

+
+

+ +

+ + Sedes + +
+
+
+
+ Alumnos sin SENCE +
+
+
+
+
+ Alumnos con SENCE +
+
+
+ +
+
+ Moneda +
+
+
+
+
+
+
+
+
+ Providencia +
+
+
+
+
+
+
+ +
+
+ La Florida +
+
+
+
+
+
+
+
+
+ Online +
+
+
+
+
+
+
+
+
+ Empresas +
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Canvas de Gráfico Tipos de Ventas */} +
+
+
+
+

+ + + Tipos de ventas + + +

+ +
+
+
+
+
+
+
+ )} +
+ + {/* MODAL ALERTA / ERRORES */} + {showAlertModal && ( +
+
+
+
+
+ Módulo Académico - Empresas +
+ +
+
+
+ {mensajeAlerta} +
+
+
+ +
+
+
+
+ )} + + {/* MODAL CARGANDO */} + {showLoadingModal && ( +
+
+
+
+
+ SAM - Académico Empresas +
+
+
+
+ Procesando, espere un momento... +
+
+
+
+
+
+
+
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/cursos/page.tsx b/src/app/cursos/page.tsx index 953d49f..57135e8 100755 --- a/src/app/cursos/page.tsx +++ b/src/app/cursos/page.tsx @@ -15,25 +15,25 @@ export default function Page() { icon: , color: "text-warning", label: "Informe cursos iniciados por fecha", - href: "/Informes/Index?boton=periodo", + href: "/Informes/CursosInicio", }, { icon: , color: "text-warning", label: "Informe cursos activos por mes", - href: "/Informes/Index?boton=activos", + href: "/Informes/CursosActivos", }, { icon: , color: "text-info", label: "Cursos por iniciar", - href: "/Informes/CursosInicios?search=CURSOSINICIAN", + href: "/Informes/CursosIniTer", }, { icon: , color: "text-info", label: "Cursos por finalizar", - href: "/Informes/CursosInicios?search=CURSOSFINALIZAN", + href: "/Informes/CursosIniTer", }, ]; diff --git a/src/app/cursos/reemplazos/page.tsx b/src/app/cursos/reemplazos/page.tsx new file mode 100644 index 0000000..0d4156d --- /dev/null +++ b/src/app/cursos/reemplazos/page.tsx @@ -0,0 +1,386 @@ +"use client"; + +import React, { useState } from "react"; +import { + // TransferAlt, + Check, + X, + // Error as ErrorIcon, + // ErrorCircle, + CheckCircle, +} from "@boxicons/react"; + +// Interfaz para los datos del reemplazo +interface ReemplazoItem { + idCursoAbierto: string; + Curso: string; + FechaAsistencia: string; + HoraInicio: string; + HoraSalida: string; + rutProfesor: string; + Profesor: string; + Estado: string; + idAsistenciaProfesor: string; + Email?: string; +} + +// Interfaz para la configuración de la confirmación +interface ModalConfirmacionState { + show: boolean; + accion: "autorizar" | "rechazar" | null; + item: ReemplazoItem | null; +} + +export default function ReemplazosPendientesPage() { + // Estado con datos de ejemplo + const [reemplazos, setReemplazos] = useState([ + { + idCursoAbierto: "CUR-101", + Curso: "Inglés Básico A1", + FechaAsistencia: "15-02-2026", + HoraInicio: "09:00", + HoraSalida: "10:30", + rutProfesor: "12.345.678-9", + Profesor: "Juan Pérez", + Estado: "Pendiente", + idAsistenciaProfesor: "SES-001", + Email: "jperez@correo.cl", + }, + { + idCursoAbierto: "CUR-102", + Curso: "Inglés Intermedio B2", + FechaAsistencia: "16-02-2026", + HoraInicio: "11:00", + HoraSalida: "12:30", + rutProfesor: "15.987.654-3", + Profesor: "María González", + Estado: "Pendiente", + idAsistenciaProfesor: "SES-002", + Email: "mgonzalez@correo.cl", + }, + ]); + + // Estados para diálogos y procesamientos + const [modalConfirm, setModalConfirm] = useState({ + show: false, + accion: null, + item: null, + }); + const [isLoading, setIsLoading] = useState(false); + const [modalRespuesta, setModalRespuesta] = useState<{ + show: boolean; + errorMsg: string; + okMsg: string; + }>({ show: false, errorMsg: "", okMsg: "" }); + + // Abrir modal customizado de confirmación + const abrirConfirmacion = (item: ReemplazoItem, accion: "autorizar" | "rechazar") => { + setModalConfirm({ + show: true, + accion, + item, + }); + }; + + // Procesar la autorización / rechazo + const handleConfirmar = () => { + if (!modalConfirm.item || !modalConfirm.accion) return; + + const { idAsistenciaProfesor } = modalConfirm.item; + const accion = modalConfirm.accion; + + // Cerrar modal de confirmación y mostrar loader + setModalConfirm({ show: false, accion: null, item: null }); + setIsLoading(true); + + setTimeout(() => { + setIsLoading(false); + // Eliminar el ítem procesado de la lista + setReemplazos((prev) => prev.filter((r) => r.idAsistenciaProfesor !== idAsistenciaProfesor)); + setModalRespuesta({ + show: true, + errorMsg: "", + okMsg: `El reemplazo se ha ${ + accion === "autorizar" ? "autorizado" : "rechazado" + } correctamente.`, + }); + }, 1000); + }; + + return ( + <> +
+ {/* ENCABEZADO */} +
+
+
+
+ {/* */} +
+
+ + Autorización + +
+ Reemplazos Pendientes +
+
+
+
+
+ + {/* TABLA O ALERTA */} + {reemplazos.length > 0 ? ( +
+
+
+ + + + + + + + + + + + + + + {reemplazos.map((item) => ( + + + + + + + + + + + ))} + +
CursoSesiónInicioSalidaRunReemplazanteEstado SesionAcción
+ {item.Curso} + + {item.idCursoAbierto} + + + {item.FechaAsistencia} + + {item.HoraInicio} + + {item.HoraSalida} + + {item.rutProfesor} + + {item.Profesor} + + + {item.Estado} + + + + +
+
+
+
+ ) : ( +
+
+
+
+
+
+ + {/* */} + +
+
+
+ No hay reemplazos pendientes de autorización +
+
+ + Si cree que esto es un error, contáctenos.{" "} + + Generar Ticket + + +
+
+
+
+
+ )} +
+ + {/* MODAL PERSONALIZADO DE CONFIRMACIÓN (REEMPLAZO DE SWEETALERT2) */} + {modalConfirm.show && modalConfirm.item && ( +
+
+
+
+ {modalConfirm.accion === "autorizar" ? ( + + + + + ) : ( + + + + + + )} + +

+ {modalConfirm.accion === "autorizar" ? "Autorizar Reemplazo" : "Rechazar Reemplazo"} +

+

+ {modalConfirm.accion === "autorizar" + ? "Se asignará al profesor reemplazante" + : "Se rechazará al profesor reemplazante"} +

+ +
+
+ Curso + + {modalConfirm.item.Curso}{" "} + + {modalConfirm.item.idCursoAbierto} + + +
+
+ Sesión + + {modalConfirm.item.FechaAsistencia} | {modalConfirm.item.HoraInicio} - {modalConfirm.item.HoraSalida} + +
+
+ Profesor + {modalConfirm.item.rutProfesor} +
+
+ Reemplazante + + {modalConfirm.item.Profesor} + +
+
+ +
+ + +
+
+
+
+
+ )} + + {/* MODAL RESPUESTA */} + {modalRespuesta.show && ( +
+
+
+
+
Reemplazos
+
+
+ {modalRespuesta.errorMsg && ( +
+ + {/* */} + {modalRespuesta.errorMsg} + +
+ )} + {modalRespuesta.okMsg && ( +
+ + + {modalRespuesta.okMsg} + +
+ )} +
+
+ +
+
+
+
+ )} + + {/* MODAL CARGANDO */} + {isLoading && ( +
+
+
+
+
+
+ Procesando... +
+

Procesando la información...

+
+
+
+
+
+ )} + + ); +} \ No newline at end of file diff --git a/src/app/secretaria/EvaluacionPO/page.tsx b/src/app/secretaria/EvaluacionPO/page.tsx new file mode 100644 index 0000000..bcc6af9 --- /dev/null +++ b/src/app/secretaria/EvaluacionPO/page.tsx @@ -0,0 +1,533 @@ +"use client"; + +import React, { useState } from "react"; +import Link from "next/link"; +import { User, Save, Receipt } from "@boxicons/react"; + +export default function EvaluacionAlumnosPage() { + // Estados para visibilidad de secciones (equivalente a Visible="false") + const [showCreateAlm, setShowCreateAlm] = useState(false); + const [showUpdatePlacement, setShowUpdatePlacement] = useState(false); + + // Estados para modales + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showAlertModal, setShowAlertModal] = useState(false); + const [mensajeAlerta, setMensajeAlerta] = useState("Mensaje de prueba"); + + // Estados para botones con estado de carga + const [isSearching, setIsSearching] = useState(false); + const [isSavingAlumno, setIsSavingAlumno] = useState(false); + const [isSavingEvaluacion, setIsSavingEvaluacion] = useState(false); + + // Handlers para simular acciones + const handleBuscar = (e: React.FormEvent) => { + e.preventDefault(); + setIsSearching(true); + setShowLoadingModal(true); + + setTimeout(() => { + setIsSearching(false); + setShowLoadingModal(false); + // Muestra la sección deseada al terminar la búsqueda + setShowUpdatePlacement(true); + }, 1500); + }; + + const handleGuardarAlumno = (e: React.FormEvent) => { + e.preventDefault(); + setIsSavingAlumno(true); + + setTimeout(() => { + setIsSavingAlumno(false); + setMensajeAlerta("Alumno guardado correctamente."); + setShowAlertModal(true); + }, 1500); + }; + + const handleGuardarEvaluacion = (e: React.FormEvent) => { + e.preventDefault(); + setIsSavingEvaluacion(true); + + setTimeout(() => { + setIsSavingEvaluacion(false); + setMensajeAlerta("Evaluación guardada correctamente."); + setShowAlertModal(true); + }, 1500); + }; + + return ( +
+
+ {/* Búsqueda del alumno */} +
+
+
+
+
+
+ + + + + Evaluación alumnos + +
+
+ + Volver + +
+
+
+
+
+
+
+
+ RUN del alumno +
+
+ +
+
+ +
+
+
+
+
+
+ + {/* Carta de ingreso alumno nuevo */} + {showCreateAlm && ( +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ R.U.N. + + +
+ Nombre + + +
+ Apellido Paterno + + +
+ Apellido Materno + + +
+ Dirección + + +
+ Región + + +
+ Comuna + + +
+ Telefono + + +
+ Email + + +
+ Fecha de nacimiento + + +
+ Profesion + + +
+ +
+
+
+ )} + + {/* Carta del alumno y selección de nivel */} + {showUpdatePlacement && ( +
+
+
+
+ + + + + + + + + + + + + + + +
+ +
+ Juan Pérez +
+ + 12.345.678-9 + +
+ + Nivel Inicial + +
+
+
+
+
+

Evaluacion

+
+ + +
+
+ + +
+
+
+ Nivel + +
+
+
+
+ +
+
+
+
+ )} +
+ + {/* POPUPS Y MODALES */} + + {/* Modal Alerta */} + {showAlertModal && ( + + )} + + {/* Modal Cargando */} + {showLoadingModal && ( + + )} +
+ ); +} \ No newline at end of file diff --git a/src/app/secretaria/FichaAlumnos/page.tsx b/src/app/secretaria/FichaAlumnos/page.tsx new file mode 100644 index 0000000..3e23429 --- /dev/null +++ b/src/app/secretaria/FichaAlumnos/page.tsx @@ -0,0 +1,846 @@ +'use client'; + +import React, { useState } from 'react'; +import Link from 'next/link'; +import { + //Transfer, + User, + // PhoneCall, + // MailSend, + Envelope, + // CurrentLocation, + // Cake, + Edit, + Pencil, + File, + UserPlus, + Certification, + // Comment, + // Error as ErrorIcon, + RefreshCwDot, + // Download, + // FilePdf, + Save +} from '@boxicons/react'; + +export default function FichaAlumnoPage() { + // --- ESTADOS DE PESTAÑAS --- + const [activeTab, setActiveTab] = useState<'cursos' | 'contratos' | 'apoderados' | 'certificados' | 'comentarios'>('cursos'); + + // --- ESTADOS DE VISTAS INTERNAS --- + const [subViewCursos, setSubViewCursos] = useState<'reporte' | 'error' | 'detalle' | 'confirma_cambio'>('reporte'); + const [hasCursosError, setHasCursosError] = useState(false); + + // --- ESTADOS DE MODALS --- + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showErrorModal, setShowErrorModal] = useState(false); + const [errorMessage, setErrorMessage] = useState(''); + + const [showModalNotas, setShowModalNotas] = useState(false); + const [showModalAsistencia, setShowModalAsistencia] = useState(false); + const [showModalCursosDisp, setShowModalCursosDisp] = useState(false); + const [showModalEditarAlumno, setShowModalEditarAlumno] = useState(false); + + // --- ESTADOS DE FORMULARIOS --- + const [comentarioInput, setComentarioInput] = useState(''); + const [confirmCambioCheck, setConfirmCambioCheck] = useState(false); + + const [editForm, setEditForm] = useState({ + nombre: '', + paterno: '', + materno: '', + nacimiento: '', + fono: '', + mail: '', + direccion: '', + region: '', + comuna: '', + ocupacion: '', + profesion: '' + }); + + // --- DISPARADORES DE EJEMPLO PARA ACCIONES Y CARGAS --- + const handleSimulateLoading = (action: () => void) => { + setShowLoadingModal(true); + setTimeout(() => { + setShowLoadingModal(false); + action(); + }, 1200); + }; + + const triggerError = (msg: string) => { + setErrorMessage(msg); + setShowErrorModal(true); + }; + + return ( +
+ {/* BARRA SUPERIOR */} +
+
+
+
+
+
+ Ficha Alumno +
+
+
+ + {/* */} + Cambiar Alumno + +
+
+
+
+ + {/* PANEL IZQUIERDO: INFORMACIÓN DE CONTACTO */} +
+
+ + + + + + + + + + + + + + + + +
+ +
+ Juan Pérez González +
+ 12.345.678-9 +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Contacto +
+
+ {/* */} + +56 9 1234 5678
alumno@email.com
+ {/* */} + Av. Providencia 1234
+ {/* */} + Providencia, Región Metropolitana
+ {/* */} + 15/08/1995
+
+ +
+
+
+
+
+ + {/* PANEL DERECHO: PESTAÑAS Y CONTENIDOS */} +
+
+
+
+ {/* NAVEGACIÓN TAB */} +
+
+ + + + + +
+
+ + {/* --- PESTAÑA: CURSOS --- */} + {activeTab === 'cursos' && ( +
+ {subViewCursos === 'reporte' && !hasCursosError && ( +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
YearIDCursoContratoFechaEstado
+ + 202610242026-1 - Inglés Avanzado C1 + PARTICULAR + 01/03/2026 | 30/06/2026 + + Cursando + +
+
+
+ )} + + {hasCursosError && ( +
+
+
+
+
+ {/* */} +

+
El alumno no tiene Cursos disponibles
+
+ + Si cree que esto es un error, contáctenos.{' '} + Generar Ticket + +
+
+
+
+ )} + + {subViewCursos === 'detalle' && ( +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CursoInglés Avanzado C1
Código1024
EstadoCursando
SedeProvidencia
ProfesorJohn Doe
SalaLab 402
HorarioLu-Mi-Vi 19:00 - 21:00
Inicio01/03/2026
Término30/06/2026
+
+ +
+ + + + + + + + + +
Opciones
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
RollBook
Nota + +
Asistencia + +
EstadoEn proceso
Certificado + + ---
+
+
+
+
+
+
+ )} + + {subViewCursos === 'confirma_cambio' && ( +
+
+
+ + + + + + + + + + + + + + + + +
Actual Curso
CursoInglés Avanzado C1
Código1024
SedeProvidencia
+
+
+

+ {/* */} +

+
+
+ + + + + + + + + + + + + + + + +
Nuevo Curso
CursoInglés Intensivo C1
Código2048
SedeSantiago Centro
+
+
+
+ setConfirmCambioCheck(e.target.checked)} + /> + +
+
+
+ +
+
+
+ )} +
+ )} + + {/* --- PESTAÑA: CONTRATOS --- */} + {activeTab === 'contratos' && ( +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FechaContratoTipoRUT EmpresaEmpresaCursoRegistro
+ + 01/01/2026CNT-991Empresa76.123.456-7Corporación XInglés C1SENCE
+
+
+
+ )} + + {/* --- PESTAÑA: APODERADOS --- */} + {activeTab === 'apoderados' && ( +
+
+
+ + + + + + + + + + + + + + + + + +
FechaRUT EmpresaEmpresa
10/02/202676.123.456-7Corporación X
+
+
+
+ )} + + {/* --- PESTAÑA: CERTIFICADOS --- */} + {activeTab === 'certificados' && ( +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
CursosEstadoFechaNotaAsistencia
+ + {/* */} + Ver Certificado + + Inglés B2 Finalizado + Aprobado + 20/12/20256.595%
+
+
+
+ )} + + {/* --- PESTAÑA: COMENTARIOS --- */} + {activeTab === 'comentarios' && ( +
+
+
+
+
+ + + + + + + + + + + + + + + + + +
FechaHoraComentarioUsuario
14/09/202610:30Alumno solicita cambio de horario.Admin_User
+
+
+
+
+
+
+ setComentarioInput(e.target.value)} + /> +
+
+ +
+
+
+
+
+
+ )} + +
+
+
+
+
+ + {/* --- MODAL NOTAS --- */} + {showModalNotas && ( +
+
+
+
+
Notas
+ +
+
+ + + + + + + + + + + + + + + +
FechaTestGrade
05/04/2026Midterm Exam92%
+
+
+ +
+
+
+
+ )} + + {/* --- MODAL ASISTENCIA --- */} + {showModalAsistencia && ( +
+
+
+
+
Asistencia
+ +
+
+ + + + + + + + + + + + + +
FechaMarcaciones
01/03/2026Present
+
+
+ +
+
+
+
+ )} + + {/* --- MODAL EDITAR ALUMNO --- */} + {showModalEditarAlumno && ( +
+
+
+
+
Editar Alumno
+ +
+
+ + + + + + + + + + + + + + + +
Nombre + setEditForm({ ...editForm, nombre: e.target.value })} + /> +
Paterno + setEditForm({ ...editForm, paterno: e.target.value })} + /> +
+
+ + +
+
+
+
+
+
+ )} + + {/* --- MODAL CARGANDO (LOADING) --- */} + {showLoadingModal && ( +
+
+
+
+
SAM - Empresas
+
+
+
+
+
Procesando, espere un momento
+
+
+
+
+
+
+
+
+
+
+ )} + + {/* --- MODAL ERROR / ALERTA --- */} + {showErrorModal && ( +
+
+
+
+
Módulo Academico - Empresa
+ +
+
+
+
+
{errorMessage || 'Ocurrió un error en la operación.'}
+
+
+
+
+ +
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/secretaria/FichaProfesor/page.tsx b/src/app/secretaria/FichaProfesor/page.tsx new file mode 100644 index 0000000..8ef7f62 --- /dev/null +++ b/src/app/secretaria/FichaProfesor/page.tsx @@ -0,0 +1,703 @@ +"use client"; + +import React, { useState } from "react"; +import { + // UserDetail, + Plus, + Save, + User, + // MailSend, + // PhoneCall, + Envelope, + // CurrentLocation, + // Cake, + Flag, + Edit, + UserCheck, + Pencil, + File, + Book, + // Error as ErrorIcon, + CheckCircle, + XCircle, +} from "@boxicons/react"; + +export default function ProfesorPage() { + // Estados para controlar vistas del flujo ASP.NET + const [vistas, setVistas] = useState({ + divBuscar: true, + divBuscarResultado: false, + agregarProfe: false, + fichaProfe: false, + profeCursosActivos: true, + profeCursosActivosOk: false, + profeCursosActivosError: false, + profeCursosFinalizados: false, + profeCursosFinalizadosOk: false, + profeCursosFinalizadosError: false, + profePerfil: false, + }); + + // Estados para Modales + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showAlertModal, setShowAlertModal] = useState(false); + const [showEditModal, setShowEditModal] = useState(false); + const [mensajeAlerta, setMensajeAlerta] = useState("Mensaje de prueba"); + + // Función equivalente a GmailPopup + const handleGmailPopup = (mail: string, name: string) => { + const title = "Contacto"; + const w = 800; + const h = 600; + const options = "scrollbars=no,resizable=no"; + const url = `https://mail.google.com/mail/u/0/?view=cm&fs=1&to=${mail.toLowerCase()}&su=Contacto%20Ichn`; + + const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX; + const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY; + const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; + const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; + + const left = width / 2 - w / 2 + dualScreenLeft; + const top = height / 2 - h / 2 + dualScreenTop; + + window.open(url, title, `${options}, width=${w}, height=${h}, top=${top}, left=${left}`); + }; + + // Solo números para teléfono + const handleOnlyNumbers = (e: React.KeyboardEvent) => { + if (!/[0-9]/.test(e.key) && e.key !== "Backspace" && e.key !== "Tab") { + e.preventDefault(); + } + }; + + return ( +
+ {/* SECCIÓN DE BÚSQUEDA */} + {vistas.divBuscar && ( +
+
+
+
+
+
+
+ Profesor +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + {/* RESULTADOS BÚSQUEDA */} + {vistas.divBuscarResultado && ( +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
RunNombreEstadoFonoMail
+ + 12345678-9PérezJuan + Activo + 912345678juan.perez@example.com
+
+
+ +
+ +
+
+ )} +
+
+
+ )} + + {/* SECCIÓN AGREGAR PROFESOR */} + {vistas.agregarProfe && ( +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
Información Personal
+
Run
Nombre
PaternoMaterno
NacimientoNacionalidad
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
Información de contacto
+
Fono (+56) + +
Mail + +
Dirección
RegiónComuna
+ + + + + + + + +
+
+ +
+
+
+ +
+
+
+
+
+ )} + + {/* SECCIÓN FICHA PROFESOR */} + {vistas.fichaProfe && ( +
+
+
+
+
+
+ Ficha Profesor +
+
+
+ +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + +
+ +
+ Juan Pérez +
+ 12.345.678-9 +
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Contacto +
+
+ {/* */} + +56 9 1234 5678
+ + juan.perez@example.com
+ {/* */} + Av. Siempre Viva 123
+ {/* */} + Santiago
+ {/* */} + 01/01/1990
Chilena
+
+ +
+
+
+
+ +
+
+
+
+
+
+ + + + +
+
+
+ + {/* CURSOS ACTIVOS */} + {vistas.profeCursosActivos && ( +
+ {vistas.profeCursosActivosOk ? ( +
+
+
+
+
+
+ +
+
+ Cursos +

2

+
+
+ +
+
+ Alumnos +

25

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IDCursoCursoParticipantesDiasHorasFechas
+ Ver + 101InglésInglés Básico12Lu-Mi19:00 - 21:0001/03 / 30/04
+
+
+
+
+ ) : ( +
+
+
+
+
+ + {/* */} + +

+
El profesor no tiene Cursos Activos
+
+ + Si cree que esto es un error, contáctenos.{" "} + + Generar Ticket + + +
+
+
+
+ )} +
+ )} + + {/* CURSOS FINALIZADOS */} + {vistas.profeCursosFinalizados && ( +
+
+
+
+
+ + + + + + + + +
Año +
+ +
+
+
+
+
+
+ )} + + {/* PERFIL */} + {vistas.profePerfil && ( +
+
+
+
+
+
  DIURNO
+
+
+
  VESPERTINO
+
+
+
+
+
  0
+
+
+
  0
+
+
+ +
+
+
  PRESENCIAL
+
+
+
  ONLINE
+
+
+
+
+
  0
+
+
+
  0
+
+
+
+
+
+ )} + +
+
+
+
+ )} + + {/* MODAL CARGANDO */} + {showLoadingModal && ( +
+
+
+
+
SAM - Empresas
+
+
+
Procesando, espere un momento
+
+
+
+
+
+
+
+
+ )} + + {/* MODAL ALERTA / MENSAJES */} + {showAlertModal && ( +
+
+
+
+
Módulo Academico - Empresa
+ +
+
+
{mensajeAlerta}
+
+
+ +
+
+
+
+ )} + + {/* MODAL EDITAR PROFESOR */} + {showEditModal && ( +
+
+
+
+
Editar Profe
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nombre
Paterno
Materno
Fono (+56)
Mail
+
+ + +
+
+
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/secretaria/page.tsx b/src/app/secretaria/page.tsx index 02267e0..28d1722 100755 --- a/src/app/secretaria/page.tsx +++ b/src/app/secretaria/page.tsx @@ -1,3 +1,402 @@ +'use client'; + +import React, { useState } from 'react'; +import Link from 'next/link'; +import { + User, + //Graduation, + File, + //IdCard, + ContactBook, + Book, + AddressBook, + //ErrorAlt +} from '@boxicons/react'; + +interface Alumno { + idAlumno: string; + AP_Paterno: string; + AP_Materno: string; + Nombres: string; +} + export default function Page() { - return

Hello, Next.js!

; - } \ No newline at end of file + // --- ESTADOS DE VISTA --- + const [currentView, setCurrentView] = useState<'menu' | 'buscar'>('menu'); + const [errorData, setErrorData] = useState(false); + + // --- ESTADOS DE FORMULARIO DE BÚSQUEDA --- + const [tipoBusqueda, setTipoBusqueda] = useState('run'); + const [textoBusqueda, setTextoBusqueda] = useState(''); + + // --- ESTADOS DE MODALES --- + const [showModalResultados, setShowModalResultados] = useState(false); + const [showLoadingModal, setShowLoadingModal] = useState(false); + const [showErrorModal, setShowErrorModal] = useState(false); + const [errorMessage, setErrorMessage] = useState(''); + + // --- DATOS DE EJEMPLO PARA RESULTADOS --- + const [alumnosEncontrados, setAlumnosEncontrados] = useState([]); + + // --- MANEJADORES DE EVENTOS --- + const handleOpenBuscarAlumno = () => { + setCurrentView('buscar'); + setErrorData(false); + }; + + const handleBuscarAlumno = (e: React.FormEvent) => { + e.preventDefault(); + + if (!textoBusqueda.trim()) { + setErrorData(true); + return; + } + + setErrorData(false); + setShowLoadingModal(true); + + // Simulación de búsqueda + setTimeout(() => { + setShowLoadingModal(false); + const mockResultados: Alumno[] = [ + { idAlumno: '12.345.678-9', AP_Paterno: 'Pérez', AP_Materno: 'González', Nombres: 'Juan Carlos' }, + { idAlumno: '98.765.432-1', AP_Paterno: 'Pérez', AP_Materno: 'Muñoz', Nombres: 'María José' } + ]; + setAlumnosEncontrados(mockResultados); + setShowModalResultados(true); + }, 1000); + }; + + const handleSeleccionarAlumno = (alumno: Alumno) => { + setShowModalResultados(false); + setShowLoadingModal(true); + + // Redirección o acción con el alumno seleccionado + setTimeout(() => { + setShowLoadingModal(false); + alert(`Alumno seleccionado: ${alumno.Nombres} ${alumno.AP_Paterno}`); + }, 800); + }; + + return ( +
+ {/* VISTA: MENÚ PRINCIPAL */} + {currentView === 'menu' && ( +