====== Arquitectura General del Proyecto PAE ======
===== Visión macro =====
PAE utiliza una arquitectura multicapa basada en módulos independientes que comunican a través de contratos claramente definidos. El proyecto sigue patrones de clean architecture con separación de responsabilidades entre presentación, dominio y datos.
===== Estructura de módulos =====
PAE (root)
├── Machine (app) # Aplicación Android de máquina
├── RutaPAE (app) # Aplicación Android de operador
│
├── MachineDomain # Lógica de dominio de máquina
├── MachineData # Acceso a datos de máquina
│
├── RutaPAEDomain # Lógica de dominio de ruta
├── RutaPAEData # Acceso a datos de ruta
│
├── Contract # Contrato P2P compartido
├── Core # Utilidades compartidas
├── DirectLink # Implementación P2P
│
├── ComputerVision # Modelos de visión por computadora
├── VectorialDB # Motor de base de datos vectorial
└── gradle/ # Configuración de dependencias
==== Módulos principales ====
^ Módulo ^ Tipo ^ Responsabilidad ^
| ''Machine'' | Application | UI/UX de máquina, orquestación de flujo |
| ''MachineDomain'' | Library | Lógica de entrega, hardware, sincronización |
| ''MachineData'' | Library | Persistencia local, entidades, servicios |
| ''RutaPAE'' | Application | UI/UX de operador, gestión de máquinas |
| ''RutaPAEDomain'' | Library | Gestión P2P, lógica de sincronización remota |
| ''RutaPAEData'' | Library | Persistencia local, API de máquinas |
| ''Contract'' | Library | Modelos P2P, rutas, topics compartidos |
| ''DirectLink'' | Library | Implementación Wi-Fi Direct / hotspot |
| ''VectorialDB'' | Library | ORM con índices vectoriales para embeddings |
| ''ComputerVision'' | Library | Modelos IA para reconocimiento facial |
| ''Core'' | Library | Interfaces y utilidades de log |
===== Arquitectura por capas =====
==== Machine ====
┌─────────────────────────────┐
│ Capa de Presentación │
│ (Machine app) │
│ - UI Compose │
│ - ViewModels │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ Capa de Dominio │
│ (MachineDomain) │
│ - StateManager │
│ - Estado de entregas │
│ - SyncDeliveries │
│ - P2PManager │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ Capa de Datos │
│ (MachineData) │
│ - Delivery │
│ - Beneficiary │
│ - MachineEnrollmentShift │
│ - MinutaMenuDue │
│ - OperationalShift │
│ - Repository │
└─────────────────────────────┘
│
SQLite DB
==== RutaPAE ====
┌─────────────────────────────┐
│ Capa de Presentación │
│ (RutaPAE app) │
│ - UI Compose │
│ - Screens │
│ - Components │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ Capa de Dominio │
│ (RutaPAEDomain) │
│ - P2PManager │
│ - SyncDeliveries │
│ - Descubrimiento │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ Capa de Datos │
│ (RutaPAEData) │
│ - Machine │
│ - Delivery │
│ - Services │
└─────────────────────────────┘
│
SQLite DB
===== Flujo de comunicación entre capas =====
==== Machine: Captura de entrega ====
- **UI** → usuario solicita captura
- **Data** → se resuelve la jornada operativa visible del día con fallback a ''MachineEnrollmentShift'' cuando falta ''MinutaMenuDue'' para una modalidad válida
- **Domain** → StateManager ejecuta WaitingForWeight
- **Data** → Beneficiary consulta base de datos
- **Domain** → GenerateEmbedding crea vector 512d
- **Data** → Delivery se guarda en base de datos
==== RutaPAE: Sincronización de entregas ====
- **UI** → usuario selecciona máquina y solicita sincronización
- **Domain** → P2PManager conecta vía P2P
- **Domain** → syncDeliveriesFromMachine descarga entregas
- **Data** → Delivery se almacena localmente
- **UI** → muestra progreso y resultado
===== Responsabilidades por capa =====
==== Presentación (Machine / RutaPAE) ====
* Renderizar UI con Jetpack Compose
* Capturar interacciones del usuario
* Mostrar la card de sincronización con el mismo conteo de jornadas visibles que la lista operativa
* Mostrar estados vía ViewModels y StateFlow
* No contiene lógica de negocio
==== Dominio (MachineDomain / RutaPAEDomain) ====
* Implementar casos de uso
* Orquestar flujos complejos
* Coordinar entre Data y Presentación
* Manejar errores y reintentos
==== Datos (MachineData / RutaPAEData) ====
* Acceso a repositorios locales
* Operaciones CRUD
* Caché y persistencia
* Mapeo de entidades
* Proyecciones operativas para UI cuando la entidad técnica no coincide con la entidad visible del negocio
===== Comunicación inter-módulos =====
==== A través de interfaces comunes ====
* ''Contract'': todos los módulos usan modelos P2P
* ''Core'': interfaz para logging y utilidades
==== A través de emisores (Emitters) ====
* ''StateNameEmitter'': cambios de estado
* ''DeliverySyncUiEmitter'': progreso de sincronización
* ''SyncRunningEmitter'': estado global de sincronización
==== A través de inyección de dependencias ====
* Dagger2 / Hilt (Machine)
* Inyección manual (RutaPAE Domain)
===== Patrones clave =====
==== State Management ====
* ''StateManager'': máquina de estados para entregas (Machine)
* ''StateFlow'': estado reactivo (Kotlin Coroutines)
==== Repository Pattern ====
* ''MachineService'': acceso a Machine local
* ''DeliveryService'': acceso a Delivery local
* Abstraen acceso a datos
==== Observer Pattern ====
* Emisores: para distribución de eventos
* Flow: para observar cambios
==== Factory Pattern ====
* Creación de estados en StateManager
* Creación de P2PManager en DomainManager
===== Dependencias entre módulos =====
Machine RutaPAE
├── MachineDomain ├── RutaPAEDomain
├── MachineData ├── RutaPAEData
├── Contract ├── Contract
└── Core └── Core
MachineDomain
├── MachineData
├── Contract
├── DirectLink
└── Core
RutaPAEDomain
├── RutaPAEData
├── Contract
├── DirectLink
└── Core
MachineData / RutaPAEData
├── VectorialDB
├── Contract
└── Core
DirectLink
└── Contract
VectorialDB
└── (sin dependencias PAE)
ComputerVision
└── (sin dependencias PAE)
===== Versiones de compilación =====
* **API mínima**: 24 (Android 7.0)
* **API objetivo**: 36 (Android 15)
* **JVM target**: 17
* **Lenguaje**: Kotlin
===== Librerías principales =====
* **Jetpack Compose**: UI declarativa
* **Coroutines**: asincronía
* **Dagger2/Hilt**: inyección de dependencias (Machine)
* **Fuel**: cliente HTTP
* **Kotlinx Serialization**: serialización JSON
* **Camera2 API**: captura de imágenes
* **WorkManager**: tareas en segundo plano
===== Convenciones de nomenclatura =====
* **Paquetes**: ''co.ada..xxx.xxx''
* **Servicios**: ''*Service'' (e.g., ''MachineService'')
* **Managers**: ''*Manager'' (e.g., ''StateManager'')
* **Emisores**: ''*Emitter'' (e.g., ''DeliveryEmitter'')
* **Estados**: ''*State'' (e.g., ''P2PMachineStatus'')
* **Data classes**: nombres directos (e.g., ''Delivery'', ''Machine'')