====== Almacenamiento local: Machine vs RutaPAE ====== ===== Visión general ===== * ''Machine'': almacena datos detallados de entrega con biometría local. * ''RutaPAE'': almacena referencias a máquinas, entregas sincronizadas y estado de operador. ===== Machine - MachineData ===== La aplicación ''Machine'' mantiene una base de datos local completa para procesar entregas de manera autónoma. ==== Entidades principales ==== === 1. ''Delivery'' === Almacena cada entrega procesada localmente. Campos clave: * ''id'': PK autoincrementada * ''registeredAt'': timestamp de creación * ''weight'': peso capturado en gramos * ''beneficiaryPhotoPath'': ruta local a foto del beneficiario * ''alimentPhotoPath'': ruta local a foto del producto * ''similarity'': similitud del embedding con base de datos (0-1) * ''beneficiaryId'': FK a Beneficiary * ''machineEnrollmentShiftId'': FK a MachineEnrollmentShift * ''processTimeMs'': tiempo total de procesamiento * ''deliveryMs'': timestamp en milisegundos de la entrega * ''machineGeneratedBeneficiaryId'': ID temporal generado por la máquina * ''serverDeliveryId'': ID remoto asignado después de sincronización Relaciones: * muchas entregas por beneficiario * muchas entregas por turno === 2. ''Beneficiary'' === Datos del beneficiario registrados localmente. Campos clave: * ''id'': PK autoincrementada * ''embedding'': vector de 512 dimensiones (COSINE) * ''name'': nombre del beneficiario * ''enrollmentId'': ID de inscripción local * ''remoteBeneficiaryId'': ID remoto del servidor * ''lastRecognitionAtMs'': última vez que fue reconocido * ''machineEnrollmentShiftId'': FK a MachineEnrollmentShift Relaciones: * muchos beneficiarios por turno * muchas entregas por beneficiario === 3. ''MachineEnrollmentShift'' === Información técnica de las asignaciones remotas de la máquina. Campos clave: * ''id'': PK autoincrementada * ''campusOfferId'': ID de oferta de campus remota * ''campusOfferPlaces'': cupos disponibles * ''campusId'': ID del campus * ''campusName'': nombre del campus * ''campusCode'': código institucional * ''modalityId'': ID de modalidad * ''modalityTypeName'': nombre de modalidad * ''shiftId'': ID del turno * ''shiftName'': nombre del turno * ''gradeId'': ID del grado * ''gradeName'': nombre del grado * ''active'': indicador de turno activo Relaciones: * una por asignación remota de máquina * muchos beneficiarios por turno * muchas entregas por turno === 4. ''MinutaMenuDue'' === Snapshot local de las jornadas operativas del día descargadas desde backend. Campos clave: * ''id'': PK remota de la minuta * ''dueDate'': fecha/hora programada * ''started'': fecha/hora de inicio reportada por backend * ''ended'': fecha/hora de cierre reportada por backend * ''deliveries'': entregas registradas en backend * ''deliveriesDue'': meta remota esperada * ''modalityId'': modalidad a la que pertenece la jornada Uso principal: * permitir que ''Machine'' construya una vista operativa de jornadas con paridad respecto a la Maquina #1 * ocultar duplicados visibles cuando existen varias asignaciones (''MachineEnrollmentShift'') que pertenecen a la misma jornada del día ==== Proyección operativa ==== La UI principal ya no lista ''MachineEnrollmentShift'' crudo como si fuera una jornada final. Ahora calcula una ''OperationalShift'' en memoria a partir de: * ''MachineEnrollmentShift'' locales * ''MinutaMenuDue'' del día * conteo agregado de entregas Reglas principales: * la unidad técnica sigue siendo ''MachineEnrollmentShift'' * la unidad visible para el operador es la jornada operativa del día * varias asignaciones con la misma modalidad y mismo turno visible se unifican en una sola tarjeta * si una modalidad válida no tiene ''MinutaMenuDue'' de hoy en el snapshot local, la UI conserva fallback con la asignación técnica para no esconder jornadas reales * al seleccionar una tarjeta, se activa un ''MachineEnrollmentShift'' representante para no romper el flujo interno de la Maquina #2 * la card de sincronización usa el conteo de jornadas visibles mostrado en pantalla; el detalle de progreso conserva el conteo técnico de asignaciones ==== Persistencia ==== * Base de datos: ''SQLite'' con ORM personalizado ''VectorDB'' * Índices: índice vectorial local para búsquedas de similitud * Operaciones: lectura/escritura local sin red (excepto sincronización) ===== RutaPAE - RutaPAEData ===== La aplicación ''RutaPAE'' mantiene una vista sincronizada de máquinas y entregas para el operador de ruta. ==== Entidades principales ==== === 1. ''Delivery'' === Almacena entregas descargadas desde máquinas remotas. Campos clave: * ''id'': PK autoincrementada * ''registeredAt'': timestamp de creación en máquina * ''weight'': peso de la entrega * ''latitude'': coordenada GPS de la entrega * ''longitude'': coordenada GPS de la entrega * ''campusId'': ID del campus * ''modalityId'': ID de modalidad * ''benefitPhoto'': URL remota de foto del beneficiario * ''beneficiaryEnrollmentId'': ID de inscripción del beneficiario * ''beneficiaryPhoto'': URL remota de foto del beneficiario * ''beneficiaryName'': nombre del beneficiario * ''machineGeneratedBeneficiaryId'': ID temporal de la máquina * ''processTimeMs'': tiempo de procesamiento en la máquina * ''deliveryMs'': timestamp de la entrega en máquina * ''idLocalDeliveryT'': ID local de entrega en máquina (PK remota) * ''idMachineTmp'': identificador temporal de máquina * ''url'': URL remota de la entrega * ''photosUrl'': URL remota de colección de fotos * ''checkDuplicateUrl'': URL para verificación de duplicados * ''serverDeliveryId'': ID asignado por servidor * ''machineId'': FK a Machine (la máquina de origen) * ''synchronized'': bandera de confirmación de sincronización Relaciones: * muchas entregas por Machine === 2. ''Machine'' === Datos de máquinas descubiertas/conectadas. Campos clave: * ''id'': PK autoincrementada * ''machineId'': identificador único * ''name'': nombre descriptivo * ''unsyncedDeliveries'': entregas no descargadas aún * ''enrolledBeneficiaries'': beneficiarios inscritos * ''unenrolledBeneficiaries'': beneficiarios no inscritos * ''currentDeliveries'': entregas en curso * ''totalGoal'': objetivo de entregas * ''modalityTypeName'', ''shiftName'', ''gradeName'', ''campusName'': contexto * ''machineStatus'': estado P2P (Active/Inactive/Error) * ''weight'': peso o valor relativo * ''active'': máquina activa seleccionada * ''stateName'': nombre del estado * ''localSyncedDeliveries'': entregas ya descargadas localmente Relaciones: * una por dispositivo máquina * muchas entregas por Machine ==== Persistencia ==== * Base de datos: ''SQLite'' con ORM ''VectorDB'' * Operaciones: lectura/escritura local, sincronización vía P2P * Estado transiente: sincronización en progreso, máquina actual ===== Diferencias principales ===== ^ Aspecto ^ Machine ^ RutaPAE ^ | **Propósito** | Procesar entregas | Gestionar entregas remotas | | **Beneficiary** | Embedding vectorial 512d | —(no almacena) | | **Delivery fotos** | Rutas locales al dispositivo | URLs remotas | | **MachineEnrollmentShift** | Asignaciones técnicas de máquina | —(no almacena) | | **MinutaMenuDue** | Jornada operativa del día | —(no almacena) | | **Machine** | —(no almacena) | Múltiples máquinas | | **Sincronización** | Envía a servidor HTTP | Descarga de máquinas vía P2P | | **Contexto** | Biométrico + peso | Geolocalización + estado | ===== Estrategia de sincronización ===== ==== Machine → Servidor ==== * Entregas locales se envían al backend HTTP. * Fotos se suben a servidor. * Se recibe ''serverDeliveryId''. ==== Máquina → RutaPAE (P2P) ==== * ''RutaPAE'' solicita ''DELIVERIES_PAGE'' a la máquina. * Descarga ''P2PDeliveryData'' para cada entrega. * Almacena localmente con ''machineId'' de origen. * Al confirmar sincronización, la máquina marca como procesada. ==== RutaPAE → Usuario ==== * Lista entregas sincronizadas con Machine. * Muestra estado de sincronización (nuevas, presentes, errores). * Permite visualizar fotos remotas y datos geográficos.