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.
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ó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 |
┌─────────────────────────────┐
│ 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
┌─────────────────────────────┐
│ 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
MachineEnrollmentShift cuando falta MinutaMenuDue para una modalidad válidaContract: todos los módulos usan modelos P2PCore: interfaz para logging y utilidadesStateNameEmitter: cambios de estadoDeliverySyncUiEmitter: progreso de sincronizaciónSyncRunningEmitter: estado global de sincronizaciónStateManager: máquina de estados para entregas (Machine)StateFlow: estado reactivo (Kotlin Coroutines)MachineService: acceso a Machine localDeliveryService: acceso a Delivery localMachine 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)
co.ada.<modulo>.xxx.xxx*Service (e.g., MachineService)*Manager (e.g., StateManager)*Emitter (e.g., DeliveryEmitter)*State (e.g., P2PMachineStatus)Delivery, Machine)