137 lines
7.0 KiB
Markdown
137 lines
7.0 KiB
Markdown
# Aulas UNICABA
|
|
|
|
Un visor híbrido especializado y offline-first desarrollado para la visualización de la cartelera oficial de aulas, seguimiento automatizado de materias cursadas y generación de la Credencial Digital Universitaria para estudiantes de la Universidad de la Ciudad (UNICABA).
|
|
|
|
---
|
|
|
|
## ✨ Características
|
|
|
|
### 📋 Cartelera de Horarios
|
|
- Visualización completa de la cartelera oficial de aulas organizada por día de la semana (Lunes a Sábado).
|
|
- **Modo offline-first**: la cartelera se cachea localmente al primer acceso y se muestra instantáneamente aunque no haya conexión.
|
|
- **Sincronización automática** en background (Background Fetch) delegada al sistema operativo.
|
|
- **Búsqueda fuzzy** tolerante a errores tipográficos: busca por nombre de materia, código, aula o carrera.
|
|
- **Filtro por vista**: alternás entre "Favoritos" y "Cartelera completa" con un segmento.
|
|
- Acceso directo a clases virtuales (Zoom / Meet) desde el botón de cada materia.
|
|
- Función de compartir el horario de una materia por WhatsApp, Telegram, y cualquier app nativa.
|
|
|
|
### ⭐ Favoritos Inteligentes
|
|
- Marcá hasta 5 materias como favoritas para tenerlas a mano en su propia pestaña.
|
|
- Los favoritos se guardan automáticamente en un archivo `aulas_unicaba_datos.csv` en la carpeta "Documentos" del dispositivo, **sobreviviendo a desinstalaciones y actualizaciones** gracias a las políticas de almacenamiento de Android 11+.
|
|
- **Alertas locales automáticas**: si una materia favorita cambia de aula o link de clase virtual, la app lo detecta en el próximo sincronismo y dispara una notificación push inmediata.
|
|
- Restauración manual de favoritos desde un respaldo CSV (Google Drive, iCloud, Descargas).
|
|
|
|
### 🎓 Banner "Próxima Clase" *(Nuevo en v1.1.6)*
|
|
- Al entrar a la pestaña **Favoritos**, aparece automáticamente un banner destacado con la materia favorita cuya clase es la más cercana en el tiempo (hoy o mañana).
|
|
- **Chip de countdown** en tiempo real que se actualiza cada minuto:
|
|
- 🔵 Azul → más de 2 horas
|
|
- 🟡 Amarillo → entre 30 minutos y 2 horas
|
|
- 🔴 Rojo + animación de pulso → menos de 30 minutos
|
|
- Muestra nombre de la materia, número de aula y día + hora de inicio.
|
|
|
|
### 🔔 Recordatorio Pre-Clase *(Nuevo en v1.1.6)*
|
|
- Cada vez que la app sincroniza la cartelera, programa automáticamente una notificación local **30 minutos antes** del inicio de cada materia favorita del día.
|
|
- Usa IDs de notificación estables para evitar duplicados al sincronizar múltiples veces.
|
|
- Funciona completamente **offline** — no requiere servidor externo.
|
|
|
|
### 📅 Agenda de Hitos y Exámenes *(Nuevo en v1.1.8)*
|
|
- Añade exámenes (Parciales, Finales) y Trabajos Prácticos directamente desde el menú de una materia.
|
|
- Los hitos muestran insignias de tiempo (rojo cuando falta poco, secundario el resto del tiempo) en la tarjeta de la materia en Cartelera.
|
|
- La selección de fecha se hace mediante un popover ligero e intuitivo.
|
|
|
|
### 📍 Integración Nativa con Mapas *(Mejora v1.1.9)*
|
|
- El pie de página renovado con un rediseño UI tipo "botón flotante".
|
|
- Utiliza esquemas nativos (`geo:0,0?q=` en Android y `maps://` en iOS) que dejan al usuario **elegir la app de navegación preferida** (Waze, Google Maps, Apple Maps) al tocar la sede.
|
|
|
|
### 🪪 Credencial Digital Universitaria
|
|
- Inicio de sesión directo al Campus Virtual (Moodle) con DNI y clave.
|
|
- **Sin intermediarios**: las credenciales nunca pasan por ningún servidor tercero. El flujo HTTP se delega al motor nativo del SO mediante `CapacitorHttp`, evitando bloqueos CORS.
|
|
- Descarga y renderiza el PDF de la credencial (código QR) como imagen nativa usando `pdfjs-dist`.
|
|
- La imagen queda **cacheada localmente** para usarla offline sin volver a loguearse.
|
|
- El brillo de la pantalla aumenta automáticamente al mostrar el QR para facilitar su lectura.
|
|
- Login completamente **opcional** — la cartelera funciona sin necesidad de cuenta.
|
|
|
|
### 🛡️ Privacidad y Seguridad
|
|
- No se recopilan nombres, contraseñas ni correos.
|
|
- No hay publicidad, telemetría ni analytics de terceros.
|
|
- Todo el procesamiento ocurre en la memoria del teléfono.
|
|
|
|
---
|
|
|
|
## 🛠️ Información Técnica y Frameworks
|
|
|
|
| Componente | Tecnología |
|
|
|---|---|
|
|
| Base Frontend | [Angular 20.3.x](https://angular.io/) |
|
|
| UI Components | [Ionic Framework v8](https://ionicframework.com/) |
|
|
| Puente Nativo | [Capacitor v8](https://capacitorjs.com/) |
|
|
| Renderizado PDF | `pdfjs-dist` |
|
|
|
|
### Plugins de Capacitor utilizados
|
|
|
|
| Plugin | Uso |
|
|
|---|---|
|
|
| `@capacitor/filesystem` | Escritura y lectura del CSV de respaldo en "Documentos" |
|
|
| `@capawesome/capacitor-file-picker` | Importación manual de CSV desde el explorador de archivos |
|
|
| `@capacitor/local-notifications` | Avisos de cambio de aula y recordatorios pre-clase |
|
|
| `@capacitor/preferences` | Caché rápida de horarios y credencial |
|
|
| `@transistorsoft/capacitor-background-fetch` | Sincronización silenciosa en background |
|
|
| `@capacitor-community/screen-brightness` | Máximo brillo al mostrar la credencial QR |
|
|
| `@capacitor/haptics` | Feedback háptico en acciones clave |
|
|
| `@capacitor/share` | Compartir horarios por WhatsApp, Telegram, etc. |
|
|
| `@capacitor/network` | Detección de estado de conexión |
|
|
| `@capacitor/clipboard` | Acceso al portapapeles del sistema |
|
|
|
|
---
|
|
|
|
## 📱 Compatibilidad Multiplataforma
|
|
|
|
Todo el código fuente (TypeScript, HTML y SCSS) y los plugins seleccionados son **100% compatibles con Android e iOS**. La arquitectura garantiza comportamiento idéntico en ambas plataformas.
|
|
|
|
### 🤖 Despliegue en Android
|
|
|
|
**Requisito previo**: [Android Studio](https://developer.android.com/studio) instalado, Node.js y NPM.
|
|
|
|
```bash
|
|
# 1. Instalar dependencias
|
|
npm install
|
|
|
|
# 2. Compilación del bundle web
|
|
npm run build
|
|
|
|
# 3. Sincronización con puentes nativos
|
|
npx cap sync android
|
|
|
|
# 4. Abrir en Android Studio para firmar APK o ejecutar por ADB
|
|
npx cap open android
|
|
```
|
|
|
|
### 🍏 Despliegue en iOS (iPhone / iPad)
|
|
|
|
**Requisito previo**: macOS reciente, [Xcode](https://developer.apple.com/xcode/), Node.js y CocoaPods (`sudo gem install cocoapods`).
|
|
|
|
```bash
|
|
# 1-2. Instalación y compilación web
|
|
npm install
|
|
npm run build
|
|
|
|
# 3. Agregar plataforma iOS (solo la primera vez)
|
|
npx cap add ios
|
|
|
|
# 4. Sincronizar plugins y actualizar Pods
|
|
npx cap sync ios
|
|
|
|
# 5. Abrir en Xcode
|
|
npx cap open ios
|
|
```
|
|
|
|
> **Nota para Xcode:** Habilitar permisos explícitos para **Local Notifications** y **Background Fetch** en la pestaña *Signing & Capabilities* de Xcode.
|
|
|
|
---
|
|
|
|
## 🔒 Privacidad y Flujo Cero Intermediarios (Zero-Trust)
|
|
|
|
1. **Credenciales en Moodle Bypass**: La app extrae el PDF de credencial logueándose directamente mediante `CapacitorHttp`, delegando el flujo HTTP al motor nativo del OS. Nunca triangula el DNI a través de un backend tercero.
|
|
2. **Resiliencia Anti-Wipes**: Las agresivas políticas *Storage Scoped* de Android 11+ pueden borrar bases de datos SQLite y Preferences al desinstalar. La app mitiga esto exportando automáticamente los favoritos a `aulas_unicaba_datos.csv` en el gestor público de archivos ("Documentos").
|
|
|