Documento histórico
Este documento se conserva solo para trazabilidad. Consulte el índice maestro para la fuente vigente.
Documento histórico — no usar como fuente de decisiones actuales
Reemplazado por la versión canónica del 2026-07-11. Conservar solo como trazabilidad histórica.
Auditoria de flujos de la APK IslaBox¶
Informe ejecutivo de los hallazgos detectados al cruzar la documentacion funcional con el codigo real de la APK. Generado el 2026-06-07 a partir de la revision de
tareas.md,discrepancias.md,gap-mvp.md, los archivos del grafo de navegacion, las pantallas de consolidacion, el detalle del reporte yFakeDataSource.
1. Resumen ejecutivo¶
| Bloque | Avance | Tareas | Bloqueantes para usuario final |
|---|---|---|---|
| Modelos de dominio | 100 % | 17/17 | No |
| Drawables, manifest, permisos | 100 % | 3/3 | No |
| Pantallas KYC completas | 100 % | 6/6 | No |
| Pantallas Auth (Welcome, Login, Register) | 100 % | 5/5 | Parcial (validaciones) |
| Pantalla de lista de consolidaciones | 100 % | 1/1 | No (solo lectura) |
| Pantalla de detalle de consolidacion | 100 % | 1/1 | No (solo lectura) |
| Stack y configuracion (AGP 9.1.1, Java 17, etc.) | 100 % | 5/5 | No |
| Pantalla de CREAR consolidacion (CU-007, sin backend) | 0 % | 0/9 pasos | Si (T-406) |
| Pantalla de pago con datos mockeados coherentes | 0 % | hardcodeado QUO-001 | Si (T-422) |
| Perfil con navegacion a sub-pantallas (maquetacion) | 12 % | 1/8 items | Si (T-423) |
| Dashboard con seccion "Requiere tu atencion" | 100 % | 1/1 | No |
| Validaciones de cliente en Login / Register | 0 % | 0/2 | Si (T-426, T-427) |
Veredicto (alcance maquetacion visual, sin backend): la base tecnica (modelos, enums, KYC, drawables, manifest, ViewModels) esta solida. El objetivo del Bloque D en tareas.md es avanzar la maquetacion visual sin backend ni autenticacion real: las pantallas navegan entre si, las validaciones son de cliente (regex, longitud), los datos se leen de FakeDataSource. No se pretende reemplazar la logica de servidor (login real, cobro real, conciliacion real).
2. Tareas que se han cumplido bien¶
De las 27 tareas originales mas 9 nuevas, 27 (71 %) estan completadas y la base tecnica es solida.
2.1 Datos y dominio (capa modelo)¶
| Tarea | Estado | Resolucion |
|---|---|---|
| T-001 Drawables faltantes | ✅ | 4 PNG creados en res/drawable/ (isotipo, logo horizontal, isotipo-texto, success) |
| T-002 Identificador Mod-10 | ✅ | lockerId = "CP-001042-8" correcto en CurrentUser.kt |
| T-003 Permisos Manifest | ✅ | 5 permisos declarados (Internet, Camara, Media, Storage, Notifications) |
T-101 FakeDataSource central |
✅ | Object con currentUser, recipients, reports, serviceRequests, charges, invoices, quotes, consolidations, packageSummary, attentionItems |
T-102 Datos leidos de CurrentUser |
✅ | Dashboard y Perfil leen de CurrentUser.user |
| T-103 Iniciales calculadas | ✅ | User.initials para "Kleudy Victor Torno Peña" -> "KT" |
T-104 Separar Reporte (hibrido) |
✅ | Reporte con purchaseStatus + packageStatus + propiedad derivada estado |
| T-105 Enums en lugar de String | ✅ | 10 enums: KycStatus, DocumentType, PurchaseReportStatus, PhysicalPackageStatus, ConsolidationStatus, PaymentStatus, ShipmentStatus, ServiceType, ServiceStatus, Acceptance, RiskLevel, LockerCodeStatus |
T-106 LockerCode con Mod-10 |
✅ | Data class + LockerCodeGenerator con calculateCheckDigit, normalize, validate, format, generate |
T-107 KycRecord |
✅ | 13 campos con expiresAt (10 anios), reviewedBy, rejectionReason |
T-108 ServiceRequest |
✅ | 4 ServiceType + 10 ServiceStatus |
T-109 CustomsCategory |
✅ | 15 categorias operativas con metadata (accepted, requiresInvoice, riskLevel, allowsAir, allowsSea, etc.) |
T-110 Consolidation + ConsolidationPackage |
✅ | 8 estados + relacion N:N |
T-111 Quote, Payment, Charge, Invoice |
✅ | Modelos con PaymentMethodMix (real/credit/card) |
2.2 Pantallas de auth y KYC¶
- ✅ T-301 a T-306: 7 pantallas KYC completas,
KycViewModelconStateFlow, banner diferenciado por estado. - ✅ Register: valida origen US, dropdown bloqueado a
+1(RegisterScreen.kt:73-76). - ✅ Login: placeholders, toggle de visibilidad, links a ForgotPassword / Register.
- ✅ Welcome / Success: usan los PNG reales de
IslaImages.kt.
2.3 Pantallas de envio y servicios¶
- ✅ T-401: 4 secciones en el dashboard (en almacen / en transito / enviados / entregados), con
PaquetesFilterpor enum. - ✅ T-402 / T-203:
ShipmentDetailScreencon timeline de 16 estados (ShipmentStatus.step). - ✅ T-501 / T-502 / T-503: lista, alta de inspeccion y alta de devolucion, con
FilterChip.
2.4 Stack y configuracion¶
- ✅ Java 17, AGP 9.1.1, Kotlin 2.2.10, Compose BOM 2026.02.01 (todo vigente).
- ✅ Reglas ProGuard para
kotlinx-serializationagregadas. - ✅ Permisos (Internet, Camara, Media, Notifications).
- ✅ ViewModel + StateFlow adoptados en
DashboardViewModelyKycViewModel(cumple T-409 parcialmente).
3. Estado de la vista de consolidacion¶
Hay pantalla, pero el flujo de consolidacion no funciona como dice la doc. Veamos que hay y que falta.
3.1 Lo que existe¶
| Componente | Archivo | Estado |
|---|---|---|
ConsolidationListScreen |
ui/screens/reporte/ConsolidationListScreen.kt |
Lista con cards + status badge, navega a detalle |
ConsolidationDetailScreen |
ui/screens/reporte/ConsolidationDetailScreen.kt |
Resumen + paquetes incluidos, status badge |
Consolidation + ConsolidationPackage |
domain/model/ |
Modelos correctos con 8 estados |
ConsolidationStatus enum |
domain/enums/ |
8 valores (BORRADOR, EN_PREPARACION, COTIZADA, PENDIENTE_PAGO, PAGADA, DESPACHADA, ENTREGADA, CANCELADA) |
| Card en Dashboard | ConsolidationsActionCard (Dashboard) |
Se muestra solo si consolidationCount > 0 |
| Rutas en NavGraph | Screen.ConsolidationList, Screen.ConsolidationDetail |
Registradas y conectadas |
3.2 Lo que falta para que el flujo sea correcto (alcance maquetacion visual)¶
Nota: el objetivo de T-406 es dejar el flujo navegable y visible (con datos mockeados en
FakeDataSource). No se pretende reemplazar la logica de backend: el lock distribuido de Redis, el calculo real contra la agencia aliada, la persistencia en PostgreSQL son todos temas de la Fase 2.
Comparado con CU-007 el flujo esta roto en su origen:
| Paso del CU-007 | Estado en APK |
|---|---|
| 1. Acceder a Consolidar desde detalle de paquete o lista "En almacen" | ❌ No existe ningun punto de entrada para crear una consolidacion |
| 2. Lista de paquetes con checkbox | ❌ No existe ConsolidationCreateScreen |
| 3. Seleccion 2+ paquetes -> "Continuar" | ❌ No existe |
| 4. Pantalla de resumen (peso, via, destinatario, costo) | ❌ No existe |
| 5. Selector de via (Barco $2.40 / Avion $3.35) | ❌ No existe (no hay constantes en AppSettings para estas tarifas) |
| 6. Validacion KYC aprobado | ❌ No existe |
7. Lock distribuido / creacion de Consolidation + ConsolidationPackage |
❌ No existe |
8. Generacion de Quote (vigencia 7 dias) |
❌ No existe (el Quote actual es mockeado, no se genera desde consolidacion) |
| 9. Cambio de paquetes -> recalculo | ❌ No existe |
Resultado: las dos consolidaciones que muestra el dashboard (CON-001, CON-002) son estaticas de FakeDataSource. El usuario:
- No puede crear una consolidacion propia.
- No puede agregar paquetes a una consolidacion desde el detalle del paquete.
- No ve costo calculado por peso x via.
- No puede elegir barco o avion.
- No se le exige KYC aprobado.
- No ve flujo a pago/cotizacion tras consolidar.
Ademas hay problemas de navegacion cruzada entre el sub-grafo de la bottom nav y el grafo raiz:
ConsolidationListScreenesta enrootNavController(es ruta top-level, no del bottom nav) -> el usuario pierde la bottom bar al entrar.ReporteDetalleScreen.onPackageClickenConsolidationDetailScreen(linea 273) navega aScreen.ReporteDetalledesde la lista de paquetes, pero al volver el usuario termina en la bottom nav, no en la consolidacion (porquepopBackStacklo devuelve a la ultima ruta del grafo raiz, que es otra cosa).
3.3 Faltan los flujos alternativos del CU-007¶
- FA-1: mensaje "necesitas 2+ paquetes" -> no existe.
- FA-3: pantalla de bloqueo KYC -> no existe.
- FA-7: cancelar consolidacion (liberar paquetes a
en_almacen) -> no existe. - Boton "Ver envio" desde
ReporteDetalleScreenpara paquetesCONSOLIDADO-> esta enTODO(ReporteDetalleScreen.kt:344).
Conclusion: la vista de consolidacion solo sirve para leer, no para operar. T-406 (ahora en 🔴 Critica) cubre la maquetacion completa:
ConsolidationCreateScreen, selector de paquetes, resumen con cálculo de costo, bloqueo KYC, generación deQuotemockeada. Todo guardado en memoria (no PostgreSQL). La integracion con backend llegara en Fase 2.
4. Otros flujos incorrectos o incompletos para el usuario final¶
4.1 🔴 Criticos (bloquean el uso real)¶
4.1.1 Flujo de Pago esta desconectado de Consolidacion¶
ReporteDetalleScreenlinea 360:onPayClick = { onPayClick("QUO-001") }-> usa un ID hardcodeado (QUO-001) en vez de buscar laQuotereal del envio. Si el paquete no tiene cotizacion, igual lo manda aQuoteScreenmostrando datos de la cotizacion de muestra.- No existe la pantalla CU-008 "Cotizacion y Pago" ligada al
Shipment. Las pantallasQuoteScreen,PaymentScreen,InvoiceScreenexisten pero nadie las navega de forma natural desde consolidar.
4.1.2 Validacion de login no existe¶
LoginScreen.kt:90-91:onClick = { onLoginClick(email, password) }navega aMainsin validar nada (sin email, sin contrasena, sin rate-limit).- Cumple la doc (
gap-mvp.mdlo marca como❌), pero para el usuario final no es un flujo correcto: cualquier toque entra a la app.
4.1.3 Register no valida formato email ni requisitos de contrasena¶
gap-mvp.mdlo lista como❌y sigue asi. El boton se habilita conisFormValidque solo chequea no-vacio y longitud 10 del telefono.phoneErrorsolo se muestra si hay texto y no es US, pero el selector de pais esta forzado a+1(linea 154availableCountries = listOf(countries[0])), asi que en la practica el error nunca se ve.
4.1.4 El campo telefono de destinatarios sigue siendo +53 hardcodeado¶
FakeDataSource.recipients(linea 32) tienephone = "+53 5555 5555". La doc T-415 (🟠 Alta) pide que el campophonedeContact/Recipientacepte +53 (8 digitos) y +1 (10 digitos), pero laIslaPhoneFieldactual solo soporta +1.- El usuario no puede agregar destinatarios con telefonos reales de Cuba o EE.UU. correctamente.
4.1.5 Busqueda de paquetes - el dashboard no tiene buscador¶
PaquetesScreensolo filtra porPaquetesFilterdesde el dashboard. No hay busqueda por tracking, tienda, destinatario. La docpantallas-mvp.mdno lo exige explicitamente, pero para 50+ paquetes se vuelve inmanejable.
4.2 🟠 Altos (UX rota o confusa)¶
4.2.1 ReportActionBanner en el dashboard lleva a "Reportes" pero al usuario probablemente quiere crear un reporte nuevo¶
DashboardScreen.ktlinea 199:onClicknavega aScreen.Dashboard.Reportes(la lista), no aScreen.Dashboard.ReporteForm. El usuario que toca "Reportar compra" espera el formulario, no una lista donde debe volver a tocar el FAB.- La FAB si esta en la lista de reportes (
ReportesScreen.kt:135), pero el banner no.
4.2.2 NotificationsScreen con notificaciones inventadas¶
FakeDataSource.notificationstiene 12 notificaciones estaticas, pero la pantalla las muestra como si fueran reales. No hay marca de "demo" o seed-data badge. El usuario podria pensar que paso todo eso en su cuenta recien creada.- Es un buen ejemplo de datos demo que se confunden con datos reales.
4.2.3 Seccion "Consolidaciones" del dashboard aparece condicional con logica rara¶
DashboardScreen.kt:213: solo se muestraif (consolidationCount > 0). Si el usuario no tiene consolidaciones, no tiene como saber que esa funcionalidad existe. La doc dice que consolidar es un caso de uso clave (CU-007).
4.2.4 El dashboard no muestra el estado KYC en la cabecera¶
- Solo aparece el
KycBannercuandokycStatus != APPROVED. Si estaAPPROVED, no hay confirmacion visual. Para un usuario que paso por un proceso de 6 pantallas, seria bueno un check verde pequeno.
4.2.5 ReporteDetalleScreen muestra reporte.destinatarioId como texto crudo¶
- Linea 234:
DetalleMini(label = "Destinatario (Cuba)", value = reporte.destinatarioId ?: "No asignado")-> deberia mostrar el nombre del destinatario, no el ID. El usuario veCONT-001en vez de "Juan Perez".
4.2.6 ReporteDetalleScreen Acciones disponibles tiene handlers vacios¶
ActionButtonsGrouprecibe la lista pero elwhensolo maneja"Solicitar inspeccion"y"Solicitar devolucion". Los botones "Solicitar reempaque", "Agregar a consolidacion" y "Enviar solo" no hacen nada al tocarse (linea 282:// TODO: Otras acciones).
4.2.7 PerfilScreen - la mayoria de items son onClick vacios¶
- "Informacion personal", "Metodos de pago", "Notificaciones", "Ayuda", "Privacidad" -> todos sin handler (lineas 67-105). "Cerrar sesion" tampoco tiene logica (linea 119:
/* Logout logic */). - El usuario ve un menu profesional pero todo esta roto.
4.3 🟡 Medios (calidad de codigo/extensibilidad)¶
4.3.1 AppSettings.kt tiene valores desactualizados¶
- Linea 21-22:
FREE_STORAGE_DAYS = 5(debe ser 15),STORAGE_DAILY_COST = 1.00(debe ser 0.50),STORAGE_WARNING_DAYS = 1(debe ser 3 o 5). - Las decisiones de negocio estan resueltas en preguntas.md pero el codigo no las refleja. Tarea T-206b lo cubre.
4.3.2 No existen constantes para tarifas de envio¶
AppSettingsno defineSHIPPING_RATE_SEA = 2.40niSHIPPING_RATE_AIR = 3.35. LaQuoteScreenmuestra valores estaticos delFakeDataSource.quotes, no calcula nada.
4.3.3 Enums desalineados con la doc¶
- Tarea T-405 documenta que faltan 6 estados fisicos, 1 estado de prealerta y los renombres de 3 estados. Ejemplo:
REPORTADA_SIN_TRACKINGesta comoPENDIENTE_TRACKINGen codigo. Esto rompe la trazabilidad con la doc.
4.3.4 ConsolidationDetailScreen navega mal al volver¶
- Como vimos en §3, navegar a
ReporteDetalledesde la consolidacion hace que el back del sistema cierre la app o vuelva a un destino inconsistente.
4.3.5 Strings en espanol hardcodeados¶
- Varios strings de la seccion consolidacion estan en espanol hardcodeado en los
.kt("Consolidaciones", "No tienes consolidaciones activas", "Estado", "Peso Total") en vez de estar enres/values/strings.xml. La doc discrepancias.md §10 lo marca como deuda de ~80 strings.
4.3.6 Inconsistencia namespace en Manifest¶
- Tarea T-413 critica:
app/build.gradle.ktsdefinenamespace = "com.islabox.app"pero elAndroidManifest.xmldeclaracom.example.islabox.MainActivity. El build tira warnings,Rresuelve acom.islabox.app.R(lo cual ya se usa enRegisterScreen.kt:17).
5. Tabla resumen de prioridades¶
| # | Problema | Impacto usuario | Tarea nueva | Recomendacion |
|---|---|---|---|---|
| 1 | Flujo de consolidacion no permite crear | 🔴 Critica | T-406 (promovida) | Crear ConsolidationCreateScreen con seleccion multiple, calculo, via, KYC check, generacion de Quote |
| 2 | Pago hardcodeado QUO-001 desde detalle |
🔴 Critica | T-422 | Cambiar onPayClick para que reciba la Quote real del Shipment o navegar a flujo de pago |
| 3 | Login entra sin validar | 🔴 Critica | T-426 | Validar email, contrasena, agregar estado error |
| 4 | Perfil 90 % de opciones sin handler | 🔴 Critica | T-423 | Implementar al menos los 3 mas importantes (editar info, direcciones, cerrar sesion) |
| 5 | ReportActionBanner lleva a lista, no a form |
🟠 Alta | T-424 | Cambiar onClick para que vaya a ReporteForm |
| 6 | Destinatario se muestra como ID | 🟠 Alta | T-425 | Hacer join con FakeDataSource.recipients |
| 7 | Botones de accion en ReporteDetalle sin handler |
🟠 Alta | T-428 | Conectar "Agregar a consolidacion" -> flujo nuevo; "Enviar solo" -> cotizacion individual |
| 8 | AppSettings desactualizado |
🟠 Alta | T-206b | Actualizar a 15 / 0.50 |
| 9 | Register no valida email ni password |
🟠 Alta | T-427 | Regex + requisitos minimos |
| 10 | IslaPhoneField no internacional para destinatarios |
🟠 Alta | T-415 | Crear variante IslaPhoneFieldInternational |
| 11 | 6 estados fisicos + 1 prealerta faltan en enums | 🟡 Media | T-405 | Agregar al enum correspondiente |
| 12 | namespace vs Manifest |
🟡 Media | T-413 | Sincronizar |
| 13 | Strings hardcodeados en espanol | 🟡 Media | Discrepancias §10 | Mover a strings.xml |
| 14 | consolidationCount == 0 no muestra entrada al feature |
🟡 Media | T-406 | Mostrar card "Crear tu primera consolidacion" |
| 15 | Notificaciones demo confundibles con reales | 🟢 Baja | T-429 | Marcar como seed con badge "Demo" en MVP |
6. Recomendacion concreta para empezar (alcance maquetacion visual)¶
Si tuviera que elegir 3 tareas para que el usuario pueda recorrer el flujo visualmente sin backend, atacaria en este orden:
- T-406 — Maquetar el flujo de Consolidacion completo:
ConsolidationCreateScreencon checkboxes, resumen con peso/via/destinatario/costo, bloqueo visual de KYC,ConsolidationSummaryScreencon laQuotemockeada. Todo persiste enFakeDataSource.consolidations(memoria). - T-422 + T-428 — Enlazar
ReporteDetallecon suQuotecorrespondiente: helperfindQuoteForReporteenFakeDataSource, botones "Enviar solo" y "Ver envio" navegan a laQuotecorrecta. Ya no masQUO-001hardcodeado. - T-423 — Cablear navegacion del Perfil: reusar
ContactosScreenpara Direcciones, crearEditProfileScreenyPaymentMethodsScreen(mockeadas), "Cerrar Sesion" navega aScreen.Welcome.
El resto (validaciones de cliente T-426/T-427, enums T-405, strings a strings.xml, namespace T-413, consolidationCount==0 T-406, badge Demo T-429) se puede hacer en paralelo como limpieza visual sin afectar el flujo de cara al usuario en demos.
7. Trazabilidad con las tareas vigentes¶
Este informe se refleja en:
- tareas.md -> Bloque B actualizado (T-406 promovida a Critica) + Bloque D con 8 tareas nuevas (T-422 a T-429) + Tabla resumen al 2026-06-07.
- discrepancias.md -> Resumen actualizado + nueva seccion 12 con D-12.1 a D-12.9 (problemas de flujos de usuario).
- gap-mvp.md -> pendiente: los Flujos 8, 9 y 10 siguen con la copia original (todo en ❌). Falta reescribirlos con la separacion "existe / falta / bloqueante para usuario final" y el alcance de maquetacion visual.
- tareas.md -> Bloque D (T-422 a T-429) reorientado a maquetacion visual sin backend, con "Alcance MVP visual" explicito en cada tarea.
- discrepancias.md -> Resumen actualizado + nueva seccion 12 con D-12.1 a D-12.9.