Resumen del Proyecto
Qué es la app móvil de INSIGHT, qué incluye el paquete descargable y cómo se conecta con tu sistema web actual.
App Android nativa
React Native + Expo SDK 52 + TypeScript + NativeWind. 17 pantallas: POS con escáner, inventario, caja, SUNAT, dashboard.
API Go dedicada
insight_mobile_api (Gin + pgx): REST + SSE. Lee y escribe en la MISMA base de datos PostgreSQL db_kora del sistema web.
Tiempo real web ↔ móvil
PostgreSQL LISTEN/NOTIFY → broker Go (canaliza insight_dashboard_events) → SSE. Una venta desde el móvil actualiza la web al instante.
Offline + idempotente
Cola de ventas offline con reintento y client_request_id: sin duplicados al recuperar la conexión. JWT con refresh.
Qué contiene el archivo mobile_insight.zip
mobile_kora/├── app/ # Expo Router — pantallas (rutas por archivo)│ ├── _layout.tsx # Raíz: providers, gate de autenticación│ ├── (auth)/login.tsx # Login (credenciales del sistema web)│ ├── (tabs)/ # Tabs inferiores: Inicio · Inventario · Ventas · Reportes│ │ ├── _layout.tsx│ │ └── index.tsx # Home: saludo + accesos + módulos│ ├── inventario/ # Productos · [id] · Categorías · Almacenes · Kardex│ ├── ventas/ # Nueva (POS) · Caja · Historial · [id] ·│ │ # Facturación SUNAT · Clientes│ ├── reportes/dashboard.tsx # Dashboard KPI en tiempo real (SSE)│ └── +not-found.tsx├── src/│ ├── api/client.ts # Cliente HTTP tipado (fetch + JWT)│ ├── api/schema.d.ts # Tipos TS 1:1 con openapi.yaml│ ├── components/ # ListCard expandible, Pagination, KpiTile,│ │ │ # ScannerOverlay (cámara), PaymentEditor, charts/│ ├── features/ # Hooks TanStack Query por dominio│ ├── hooks/ # useSSE (tiempo real), useOfflineQueue, useAuth│ ├── lib/ # format (S/), constants (IGV 18%), uuid│ └── store/ # zustand: sesión + carrito POS├── server/ # kora_mobile_api — backend Go (Gin + pgx)│ ├── cmd/api/main.go│ ├── internal/ # config · db · auth(JWT) · handlers ·│ │ # services · realtime(LISTEN/NOTIFY + SSE)│ ├── migrations/30_mobile_client_request_id.sql│ ├── Dockerfile│ └── go.mod├── infra/ # docker-compose.mobile.yml · nginx · deploy├── openapi.yaml # Contrato API único (Go + TS)├── app.config.ts # com.sandaliaskora.app├── eas.json # Perfiles build APK└── package.jsonapp/ + src/
Aplicación Expo (UI móvil en español)
server/
Backend Go compilable (probado con go build + go vet)
infra/ + openapi.yaml
Despliegue Docker/nginx y contrato de API
credentials), descuenta stock del almacén principal, valida caja abierta y respeta la regla IGV incluido en precios (INDECOPI).Probador en vivo de la regla IGV
18% · INDECOPIEn INSIGHT los precios ya incluyen el IGV. Esta es exactamente la fórmula que aplica insight_mobile_api al grabar cada venta: elige un modo, escribe un monto y mira el desglose que saldrá en la BOLETA.
base = total ÷ 1.18 · igv = total − base
Base imponible
S/ 0.00
IGV 18%
S/ 0.00
Total a pagar
S/ 0.00
Una venta de S/ 132.70 se graba como base S/ 112.46 + IGV S/ 20.24 — lo verás en el endpoint POST /sales del explorador de la API o, completa con carrito y pagos, en el .
Módulos de la App
Explora pantalla por pantalla lo que la app puede hacer. Cambia de pestaña para ver el detalle de cada módulo, sus funciones y los endpoints que consume.
POS — punto de venta con escáner
El corazón de la app: busca por descripción o dispara la cámara para escanear códigos EAN-13/EAN-8/UPC/Code128. Carrito con descuentos por línea, cliente (o «Cliente Varios»), comprobante BOLETA/FACTURA/TICKET, canal TIENDA/ONLINE y pagos divididos en varios métodos con cálculo de vuelto. Totales con IGV 18% incluido (norma INDECOPI).
- Escáner de barras con linterna y overlay guía
- Descuentos por línea + cliente + comprobante
- Pagos múltiples con vuelto calculado
- Cobro idempotente (client_request_id)
- Comprobante PDF 80mm/A4 + WhatsApp al cliente
- Cola offline: vende sin señal y sincroniza solo
Endpoints principales
POST /v1/salesGET /v1/products?per_page=10GET /v1/clientsWeb vs Móvil — misma datos, más formas de trabajar
→ Desliza la tabla horizontalmente para ver las tres columnas.
| Funcionalidad | Web | Móvil |
|---|---|---|
| Ventas POS | Sí | Sí, táctil + escáner |
| Escáner de código de barras | Lector USB (opcional) | Cámara del teléfono |
| Inventario + kardex | Sí | Sí, ListCards expandibles |
| Caja (apertura/cierre) | Sí | Sí, con esperado vs real |
| Facturación SUNAT | Sí (completa) | Envío + estado + reenvío |
| Comprobante por WhatsApp | Sí | Sí, desde el detalle |
| Dashboard KPI en vivo | Sí (SSE) | Sí (SSE + fallback polling) |
| Clientes CRUD | Sí | Sí, con validación DNI/RUC |
| Venta sin internet | —No | Sí — cola offline idempotente |
| Uso en piso de tienda | —Requiere PC | Bolsillo, listo en 1 toque |
Mapa de pantallas de la app
Galería de Pantallas
Las pantallas clave de la app recreadas al detalle. Pulsa cualquier teléfono para ampliarlo, leer qué hace y ver qué endpoints consume.
Atajo de teclado: pulsagy luego1…6para abrir una pantalla directamente desde cualquier punto de la guía.
Productos — lista
Listado paginado de 10 en 10 con búsqueda por nombre y filtros por categoría. Cada producto es un ListCard expandible que despliega sus ejemplares (talla · color) con precio y stock por variante.
GET /v1/products?page=1&searc…GET /v1/products/{id}Producto — detalle
La ficha del producto: foto/placeholder, categoría, precio con IGV desglosado y la tabla de ejemplares con SKU y stock por almacén. Desde aquí se salta directo a Vender (POS) o al Kardex del ejemplar.
GET /v1/products/{id}GET /v1/samples/{id}Caja — apertura y movimientos
Estado de la caja del vendedor logueado: apertura con monto inicial, esperado vs real en tiempo real y el movimiento del día (ventas, ingresos y gastos). El cierre calcula la diferencia automáticamente.
GET /v1/cash/statusPOST /v1/cash/closeHistorial de ventas
Todas las ventas con filtros por estado, canal y rango de fechas. El detalle muestra items, pagos múltiples y comprobante; desde ahí se puede anular (devuelve stock) o reenviar por WhatsApp/PDF.
GET /v1/sales?status=&channel=POST /v1/sales/{id}/voidClientes
CRUD completo de clientes con búsqueda por nombre o documento. Valida DNI (8 dígitos) y RUC (11 dígitos). En el POS, si no eliges cliente se usa «Cliente General» (id 1), igual que el sistema web.
GET /v1/clients?search=POST /v1/clientsKardex por ejemplar
El kardex clásico del calzado: entradas, salidas y saldo por ejemplar en un rango de fechas. Cada fila es un movimiento (compra, venta o ajuste) con su signo y el saldo va acumulándose.
GET /v1/kardex?id_sample=&fro…GET /v1/stock-movementsSimulador de Venta
Prueba el flujo completo del POS de INSIGHT sin instalar nada: catálogo, escáner, descuentos, pagos divididos, regla IGV, BOLETA/FACTURA y venta offline idempotente.
Todo ocurre en tu navegador — ningún dato se envía. Consultapara ver la teoría detrás de los totales.
Simulador del Punto de Venta
Catálogo · ejemplares
Bravo
TP 12T 37NegroDAMA
KOR-BRV-37-NEG
S/ 0.00
Bravo
TP 4T 38NegroDAMA
KOR-BRV-38-NEG
S/ 0.00
Caribe
TP 5T 36CaféDAMA
KOR-CRB-36-CAF
S/ 0.00
Tacna
AGOTADOT 40BeigeCABALLERO
KOR-TCN-40-BEI
S/ 0.00
Andina
TP 8T 35BeigeDAMA
KOR-AND-35-BEI
S/ 0.00
Escáner EAN-13 / SKU
El escáner de la app llama a GET /samples/barcode/{code} y agrega el ejemplar al ticket.
Cliente
Ticket de venta
Caribe · T 36 · Café
2 × S/ 68.85
2S/ 0.00
subtotal: S/ 137.70
Pagos
- EfectivoS/
S/ 150.00
Cobrado S/ 150.00 de S/ 132.70
vuelto S/ 17.30Base imponible
S/ 0.00
IGV 18%
S/ 0.00
Total a pagar
S/ 0.00
Al emitir se simula POST /sales: la API graba venta + detalle + pagos + comprobante y descuenta stock del almacén. Pruébalo también en el .
Descargar y Descomprimir el Proyecto
Obtén el .zip en tu PC con Windows y extráelo en una ruta simple.
- 1Pulsa el botón verde «Descargar Proyecto (.zip)» de esta página.
- 2Guarda mobile_insight.zip en tu Escritorio (o C:\Projects).
- 3Clic derecho sobre el zip → «Extraer todo…».
- 4Elige una ruta SIN espacios ni tildes, p. ej. C:\Projects\mobile_insight. Evita carpetas de OneDrive / iCloud.
- 5Dentro debes ver: app/, src/, server/, infra/, openapi.yaml, package.json.
- 6Descarga también la documentación Word (botón del pie de página) para el detalle técnico completo.
mobile_insight.zip
App Expo + API Go + infra + contrato OpenAPI
Instalar Prerrequisitos
Herramientas necesarias en tu PC para compilar la app Android. Solo se instalan una vez.
- 1Abre https://nodejs.org/ en tu navegador.
- 2Descarga la versión «LTS» (20.x o superior) — instalador .msi para Windows.
- 3Doble clic → Next → Next → Install (deja las opciones por defecto).
- 4Abre el Símbolo del sistema (tecla Win → escribe «cmd» → Enter).
- 5Verifica con el comando de la derecha.
node -vnpm -v# Esperado: v20.x.x y 10.x.x- 1Descarga Eclipse Temurin 17 (JDK) desde https://adoptium.net/temurin/releases/?version=17.
- 2Instala el .msi para Windows x64. Marca la opción «Set JAVA_HOME» si el instalador la ofrece.
- 3Reabre el Símbolo del sistema y verifica con el comando de la derecha.
- 4Si java no aparece: agrega C:\Program Files\Eclipse Adoptium\jdk-17.x\bin a la variable de entorno PATH.
java -version# Esperado: openjdk version "17.x.x"- 1Descarga Android Studio desde https://developer.android.com/studio e instala con los valores por defecto.
- 2En el asistente inicial (o en Tools → SDK Manager) instala: Android SDK Platform 34, SDK Platform-Tools, Android Emulator y (recomendado) un system image API 34 x86_64.
- 3Crea un dispositivo virtual: Device Manager → «+» → Create Virtual Device → Pixel 7 → API 34 → Finish.
- 4Configura las variables de entorno ANDROID_HOME (comandos de la derecha).
- 5CIERRA y reabre el Símbolo del sistema tras ejecutar setx.
setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk"setx JAVA_HOME "C:\Program Files\Eclipse Adoptium\jdk-17.x.x-hotspot" # IMPORTANTE: cierra y reabre la terminal después de estos comandos.# Verificación:adb --version- 1Solo necesitas Go si ejecutarás insight_mobile_api localmente (Paso 05). Para apuntar la app al servidor de producción este paso NO es necesario.
- 2Descarga el instalador desde https://go.dev/dl/ (go1.22.x.windows-amd64.msi) e instala con valores por defecto.
- 3Verifica con: go version (esperado: go version go1.22.x windows/amd64).
https://kora.insight-platforms.com/v1 (producción). El backend local es útil para desarrollar sin depender del VPS.Preparar el Proyecto
Instala las dependencias de la app y crea el archivo .env con la URL de la API.
- 1Abre una terminal en la carpeta del proyecto: Win + R → cmd → Enter, luego: cd C:\Projects\mobile_insight.
- 2Ejecuta npm install (tarda 1–3 min la primera vez; descarga ~600 MB en node_modules).
- 3Crea el archivo .env en la RAÍZ del proyecto con el contenido de la derecha.
- 4Si compilarás el APK para uso interno, agrega los iconos: assets/icon.png (1024×1024) y assets/splash.png — ver assets/README.md dentro del proyecto.
- 5Revisa que package.json tenga el script "start": "expo start".
# mobile_kora/.env (crea este archivo con un editor de texto)# Backend de producción (recomendado para probar la app real):EXPO_PUBLIC_API_BASE=https://kora.insight-platforms.com/v1 # --- o, si ejecutas el backend Go en TU PC (ver paso 05) ---# EXPO_PUBLIC_API_BASE=http://192.168.1.50:8090/v1# (usa la IP local de tu PC, NO localhost, para que el teléfono llegue)El Backend Go (insight_mobile_api)
La app consume una API REST + SSE escrita en Go que opera sobre la misma base db_kora. Elige: usar producción o ejecutarlo local.
Usa el servicio ya desplegado en el VPS:
EXPO_PUBLIC_API_BASE=https://kora.insight-platforms.com/v1Requiere haber desplegado insight_mobile_api en el servidor (ver Paso 09 — Producción). Verifica con: curl https://kora.insight-platforms.com/v1/healthz
Ejecuta la API en tu PC conectada a la BD (local o del VPS por túnel SSH):
- Instala Go 1.22 (paso 2.4)
- Crea server/.env con DATABASE_URL + JWT_SECRET
go run ./cmd/api
# mobile_kora/server/.env (copia de server/.env.example)DATABASE_URL=postgres://postgres:TU_PASSWORD@localhost:5434/db_kora_v4JWT_SECRET=genera_un_secreto_largo_aleatorio_aquiLISTEN_CHANNEL=kora_dashboard_eventsEVOLUTION_URL=http://localhost:8081PORT=8090cd mobile_kora/server # 1) (Opcional) aplicar migración de idempotencia de ventas:# docker exec -i kora_postgres psql -U postgres -d db_kora_v4 \# < migrations/30_mobile_client_request_id.sql # 2) Instalar dependencias y ejecutar:go mod tidygo run ./cmd/api # Verificar (en otra terminal):curl http://localhost:8090/healthz# {"status":"ok","db":"ok","listen":"ok","version":"1.0.0"}ssh -L 5434:127.0.0.1:5434 usuario@tu-vps y usar DATABASE_URL=postgres://…@localhost:5434/db_kora.Ejecutar la App en Desarrollo
Con Expo no necesitas compilar para probar: recarga instantánea en tu teléfono o emulador.
- 1En la terminal, dentro de C:\Projects\mobile_insight, ejecuta el comando de la derecha.
- 2Se abre el «Metro Bundler» en http://localhost:8081 con un código QR.
- 3TELEFONO FÍSICO: instala «Expo Go» desde Play Store, ábrela y escanea el QR (mismo Wi-Fi que tu PC).
- 4EMULADOR: presiona la tecla «a» en la terminal para abrir la app en el emulador de Android Studio.
- 5La app abre en la pantalla de Login. Ingresa con las MISMAS credenciales del sistema web INSIGHT.
- 6Cualquier cambio en el código se refleja al instante (Fast Refresh).
cd mobile_koranpm install npx expo start # Terminal interactivo:# presiona a → abre en el emulador de Android Studio# presiona w → abre en el navegador (modo web)# escanea el QR con la app "Expo Go" (instálala de Play Store)# Si la app del emulador no alcanza tu backend local:adb reverse tcp:8090 tcp:8090# Ahora http://localhost:8090/v1 funciona DENTRO del emuladornpx expo start --tunnel (instala ngrok automáticamente).Generar el APK Instalable
Dos caminos: EAS Build (en la nube de Expo, el más fácil) o compilación local con Gradle (sin cuenta).
- 1Crea una cuenta gratuita en https://expo.dev/signup.
- 2Asegúrate de haber agregado assets/icon.png y assets/splash.png (el build falla sin icono).
- 3Ejecuta los comandos de la derecha dentro de la carpeta del proyecto.
- 4EAS compila en la nube (15–30 min). Al terminar imprime un enlace de descarga del .apk.
- 5Descarga el .apk desde ese enlace en tu teléfono (o PC y pásalo por USB).
cd mobile_koranpm install -g eas-cli eas login # cuenta gratuita en expo.deveas build:configure # genera eas.json (ya incluido) # Construcción del APK en la nube de Expo (15–30 min aprox.):eas build -p android --profile preview# Al terminar, EAS imprime un enlace https://expo.dev/artifacts/...# descarga ahí el archivo .apk e instálalo en el teléfono- 1Requisitos: JDK 17 y ANDROID_HOME configurados (pasos 2.2 y 2.3).
- 2Ejecuta los comandos de la derecha. La primera compilación tarda 10–25 min (descarga dependencias Gradle).
- 3El APK queda en android/app/build/outputs/apk/release/app-release.apk.
- 4Si aparece error de firma, usa assembleDebug (APK de depuración, válido para uso interno) o genera un keystore.
cd mobile_koranpm install # Genera el proyecto nativo android/ (Gradle):npx expo prebuild -p android # Compilar el APK de producción localmente (requiere JDK 17 + SDK):cd android./gradlew assembleRelease # Windows: gradlew.bat assembleRelease # APK resultante:# android/app/build/outputs/apk/release/app-release.apk # Alternativa en un solo comando:# npx expo run:android --variant releasekeytool -genkey -v -keystore insight.keystore) y configurarlo en android/app/build.gradle. Para distribución interna (WhatsApp/enlace) el APK sin firma es suficiente.Antes de compilar el APK definitivo, fija la URL de producción en el .env (o crea .env.production):
EXPO_PUBLIC_API_BASE=https://kora.insight-platforms.com/v1Instalar y Probar el APK
En el emulador o en tu teléfono físico.
- 1Abre Android Studio → Device Manager (icono de teléfono arriba a la derecha) → ▶ para lanzar el emulador.
- 2Arrastra el archivo .apk desde el Explorador de Windows directamente sobre la ventana del emulador.
- 3Aparece «App installed». Desliza hacia arriba en el emulador y busca la app «INSIGHT» (icono ámbar).
- 4Alternativa por terminal: adb install app-release.apk.
adb install android/app/build/outputs/apk/release/app-release.apk- 1Pasa el .apk al teléfono (USB, WhatsApp a ti mismo, o descarga directa desde el enlace de EAS).
- 2Toca el archivo .apk → si pide permiso, habilita «Instalar apps desconocidas» para tu navegador/administrador de archivos.
- 3Instala → abre «INSIGHT» → acepta el permiso de Cámara (se usa para el escáner de códigos de barras).
- 4Inicia sesión con tu usuario del sistema web.
- 5PRUEBA CLAVE: Inicio → Ventas → Nueva Venta → pulsa «Cod. Barras» → escanea un EAN-13 de una etiqueta INSIGHT → el ejemplar se carga con su stock.
adb logcat -s ReactNativeJS Expo# Ver peticiones y errores JS de la app en tiempo realPuesta en Producción (VPS Hostinger Ubuntu)
Despliega insight_mobile_api junto al stack actual de Docker: mismo dominio, mismo certificado SSL, misma base de datos.
- 1Sube la carpeta mobile_insight/ al VPS (scp -r mobile_insight usuario@tu-vps:/opt/insight/ o git clone).
- 2Agrega INSIGHT_MOBILE_JWT_SECRET (y opcionalmente INSIGHT_WEB_API_URL/TOKEN) al .env de producción.
- 3Aplica la migración 30 (columna client_request_id para idempotencia de ventas).
- 4Levanta el servicio con el overlay de docker compose incluido.
- 5Inserta el bloque /v1/ de nginx y recarga la configuración.
- 6Ejecuta las pruebas de humo (healthz + login) y verifica el LISTEN en los logs.
- 7Todo lo anterior automatizado: bash mobile_insight/infra/scripts/deploy_mobile.sh
# ===== En el VPS Hostinger (SSH) ===== # 1) Sube la carpeta mobile_kora/ al servidor (scp o git), por ejemplo a /opt/kora # 2) Agrega las variables móviles al .env de producción:cat /opt/kora/mobile_kora/infra/envs/.env.mobile.example >> ~/kora/infra_kora/envs/.envnano ~/kora/infra_kora/envs/.env # ajusta KORA_MOBILE_JWT_SECRET (openssl rand -hex 32) # 3) Migración de idempotencia:docker exec -i kora_postgres psql -U postgres -d db_kora_v4 \ < /opt/kora/mobile_kora/server/migrations/30_mobile_client_request_id.sql # 4) Levanta el servicio kora_mobile_api (overlay sobre el compose existente):cd ~/kora/infra_kora/deploy_koradocker compose -f docker-compose.yml \ -f /opt/kora/mobile_kora/infra/docker-compose.mobile.yml \ up -d --build kora_mobile_api # 5) nginx: inserta el bloque /v1/ en ~/nginx/conf/default.conf# (usa el snippet mobile_kora/infra/nginx/kora-mobile.conf) y recarga:docker exec nginx_proxy nginx -s reload # 6) Pruebas de humo:curl https://kora.insight-platforms.com/v1/healthzdocker logs kora_mobile_api 2>&1 | grep -i "LISTEN"# → "LISTEN established on kora_dashboard_events" # --- o simplemente ejecuta el script incluido ---# bash /opt/kora/mobile_kora/infra/scripts/deploy_mobile.shMisma BD
insight_mobile_api se une a insight_network y consulta kora_postgres directamente
Mismo dominio
https://kora.insight-platforms.com/v1 con el SSL Let's Encrypt existente
Sin secretos en el APK
JWT + HTTPS; credenciales solo en el .env del servidor
/v1/stream) exige proxy_buffering off en nginx — el snippet incluido (mobile_insight/infra/nginx/insight-mobile.conf) ya lo configura. Sin eso el dashboard en vivo no refresca.Verificación Web ↔ Móvil en Tiempo Real
La prueba cruzada que confirma que ambos sistemas comparten la misma fuente de verdad.
- 1En el PC abre el dashboard web: https://kora.insight-platforms.com/dashboard.
- 2En el teléfono abre la app → pestaña «Reportes» → Dashboard KPI (verás el punto verde «En vivo»).
- 3En la MÓVIL: Ventas → Nueva Venta → agrega un producto de prueba → COBRAR.
- 4Mira las DOS pantallas: KPIs y gráficos se actualizan en ambas al instante (≤ 1 s).
- 5El camino del dato: venta → PostgreSQL (trigger pg_notify insight_dashboard_events) → broker Go (400 ms) → SSE → web y app invalidan y recargan.
- 6Verifica también el stock: Inventario → el current_stock del ejemplar bajó en ambas vistas.
- 7Anula la venta de prueba (Historial → detalle → Anular) para dejar la BD limpia: el stock se devuelve automáticamente.
¿Cómo funciona?
Arquitectura y Estructura del Código
Cómo se organiza el ecosistema: app, API Go, base de datos y servicios externos.
Navegador (web Gentelella) App Android (mobile_insight) │ HTTPS │ HTTPS REST + SSE ▼ ▼ nginx (SSL, kora.insight-platforms.com) ── /v1/ ──► insight_mobile_api (Go, puerto 8080) │ │ ▼ ▼ kora_app (Flask + Gunicorn) pgx pool ──┐ │ │ │ └────────────► kora_postgres (db_kora) ◄───┘ │ LISTEN insight_dashboard_events triggers pg_notify ────────────────────┘ │ ├──► Evolution API (WhatsApp) ◄── también usada por Go (whatsapp_config) └──► SUNAT (facturación electrónica, reutilizada vía sunat_config)Explora el código antes de descomprimir
Cada archivo y carpeta del zip con su propósito. En la impresión el árbol sale completo y anotado.
25Explorador del proyecto
Selecciona un archivo o carpeta del árbol para leer qué hace dentro del proyecto.
Módulos implementados en la app
- 🏠 Home — saludo, accesos rápidos, descripción de módulos
- 📦 Inventario — Productos + ejemplares, Categorías/Marcas/Tallas/Colores/Géneros (CRUD), Almacenes + stock + movimientos, Kardex con saldo
- 🛒 Ventas — POS con escáner EAN-13/8/UPC/Code128, carrito, cliente, BOLETA/FACTURA/TICKET, pagos múltiples + vuelto; Caja (abrir/cerrar); Historial + detalle + Anular; Facturación SUNAT + WhatsApp; Clientes CRUD
- 📊 Reportes — Dashboard KPI en vivo: 8 tiles, vistas Mensual/Semanal/Semestral/Diaria, gastos por categoría, métodos de pago, canales
Patrones de UX móvil
- 🗂️ ListCard expandible: lista compacta (2–3 datos + badge) → al pulsar se despliega el detalle completo con acciones (efecto drop-down animado)
- 📄 Paginación de 10 en TODAS las listas (◀ Página i de N ▶)
- ⬇️ Pull-to-refresh, esqueletos de carga, estados vacíos y de error con reintento
- 📴 Modo offline: cola de ventas con reintento idempotente al recuperar red
- 🔴 SSE: indicador «En vivo», reconexión con backoff, resync por hueco de secuencia
Explorador de la API REST
Los 43 endpoints de insight_mobile_api agrupados por módulo. Busca, filtra por método y copia el curl listo para probar.
https://kora.insight-platforms.com/v1·http://localhost:8090/v143/43 endpoints3Autenticación
9Catálogos
9Inventario
6Ventas POS
5Caja
5Clientes
3Facturación SUNAT
2Dashboard & Tiempo real
1Operación
Pulsa una fila para ver el detalle y el curl listo para probar · El icono copia METHOD ruta · «Probar» muestra una respuesta de ejemplo.
Las respuestas simuladas usan el envelope real de la API — éxito: { "data": … } · error: {…
Chuleta de Comandos
Todos los comandos de la guía en una sola vista, agrupados por fase. Filtra por palabra clave, copia un bloque concreto o llévatelos todos de golpe.
6 bloques · 22 comandos listos para copiar y pegar en tu terminal — pulsa el icono de cada línea, o Ctrl+K para buscar uno concreto.
Preparar el proyecto
Instalar dependencias de la app
Backend Go local
Levantar kora_mobile_api en tu PC
Ejecutar la app (Expo)
Desarrollo con recarga instantánea
Compilar el APK
EAS (nube) o Gradle (local)
Producción (VPS)
Desplegar junto al stack actual
Diagnóstico
Cuando algo no funciona
C:\Projects\mobile_insight y el VPS accesible por SSH. El script deploy_mobile.sh incluido en el proyecto ejecuta el bloque de producción completo de una sola vez.Preguntas Frecuentes
Las dudas más comunes al adoptar la app móvil, respondidas en lenguaje llano.
Glosario del Proyecto
Todos los términos técnicos y de negocio que aparecen en la guía — IGV, idempotencia, EAS, SSE, kardex… — explicados en una línea y enlazados a su sección.
IGV
NegocioImpuesto General a las Ventas (18% en Perú). En INSIGHT los precios ya INCLUYEN el IGV: el total es Σ(precio×cantidad)−descuentos y la base imponible se calcula como total÷1.18, el IGV es la diferencia (criterio INDECOPI).
BOLETA
NegocioComprobante electrónico simplificado para consumidores finales. La app lo emite en cada venta y lo registra en la tabla invoice para su envío a SUNAT.
FACTURA
NegocioComprobante electrónico con RUC del cliente, requerido para crédito fiscal. Reutiliza el mismo servicio SUNAT del sistema web.
SUNAT
NegocioAutoridad tributaria peruana. El backend móvil no implementa el envío desde cero: reutiliza el servicio del sistema web (tabla sunat_config) para enviar o reenviar comprobantes.
Kardex
NegocioHistorial de entradas, salidas y saldo de un ejemplar concreto. La app lo consulta por ejemplar y rango de fechas, con saldo calculado.
Idempotencia
NegocioPropiedad que evita duplicados: cada venta offline lleva un client_request_id único; si la app reintenta al recuperar conexión, el backend devuelve la venta original en vez de crear otra.
Ejemplar
NegocioVariación de un producto por talla, color y género (tabla product_sample): tiene su propio SKU, código de barras, precios y stock por almacén.
Caja
NegocioTurno de apertura/cierre por usuario: monto inicial, esperado vs real y diferencia al cierre. La app valida que exista una caja abierta antes de registrar ventas.
Cliente General
NegocioCliente por defecto (id=1) que el backend asigna automáticamente cuando una venta POS no indica un cliente concreto.
SSE
TécnicoServer-Sent Events: canal HTTP persistente donde el backend empuja frames del dashboard (evento, payload, seq y ping) sin que la app tenga que preguntar cada vez.
LISTEN/NOTIFY
TécnicoMecanismo nativo de PostgreSQL: los triggers del sistema web emiten pg_notify('kora_dashboard_events', …) y el broker Go los escucha y redistribuye a los móviles por SSE.
Coalescing
TécnicoAgrupación de eventos: si llegan varios cambios seguidos de la misma sección, el broker emite solo el último frame para no saturar la batería ni el ancho de banda del móvil.
JWT
TécnicoJSON Web Token: credencial firmada con par access (vida corta) + refresh (renovable). La app la guarda segura y la adjunta como Authorization: Bearer en cada petición.
Gin
TécnicoFramework HTTP de Go que estructura kora_mobile_api: rutas, middleware, validación y serialización JSON de alto rendimiento.
pgx
TécnicoDriver PostgreSQL para Go con soporte nativo de LISTEN/NOTIFY, transacciones y batch; es la capa de acceso a datos del backend móvil.
Transacción ACID
TécnicoLa venta completa (cabecera + detalles + pagos + descuento de stock + comprobante) se graba en UNA transacción de PostgreSQL: o entra todo, o no entra nada.
OpenAPI
TécnicoContrato formal de la API (openapi.yaml): los 43 endpoints documentados. De él se generan los tipos TypeScript (schema.d.ts) que comparten app y backend.
EAN-13
TécnicoCódigo de barras de 13 dígitos estándar en retail. El escáner del POS lo lee con la cámara y consulta /samples/barcode/{code} para agregar el producto al carrito.
/healthz
TécnicoSonda de vida del backend: verifica conexión a la base de datos y el canal LISTEN. Docker la usa como healthcheck del contenedor kora_mobile_api.
Migración 30
TécnicoScript SQL incluido en el paquete (server/migrations/30_mobile_client_request_id.sql): crea la tabla mobile_client_request_log que da soporte a la idempotencia de ventas offline.
Expo
MóvilToolkit sobre React Native: servidor de desarrollo con recarga instantánea, publicaciones OTA y compilación en la nube. La app usa Expo SDK 52.
Expo Router
MóvilNavegación por archivos: cada archivo dentro de app/ es una ruta. Incluye layout raíz con proveedores y puerta de autenticación, y tabs inferiores.
EAS Build
MóvilServicio de compilación en la nube de Expo: genera el APK/AAB sin necesidad de instalar Android Studio en tu PC. Perfiles preview (APK) y production (AAB).
APK
MóvilPaquete instalable de Android. El perfil preview de EAS lo genera firmado para instalar directamente en el teléfono (instalar apps de orígenes desconocidos).
AAB
MóvilAndroid App Bundle: formato requerido por Google Play. Se genera con el perfil production y la firma se gestiona en la consola de Play.
Metro
MóvilBundler de JavaScript de React Native: empaqueta el código de la app. Cuando algo falla tras editar dependencias, se limpia su caché con npx expo start -c.
prebuild
MóvilComando (npx expo prebuild -p android) que genera la carpeta android/ nativa para compilar con Gradle localmente, alternativa a EAS.
adb reverse
MóvilTruco para emuladores: redirige el puerto 8090 del emulador al PC (adb reverse tcp:8090 tcp:8090) para que la app alcance el backend Go local.
NativeWind
MóvilEstilos dentro de React Native con clases Tailwind: mismo lenguaje visual que la guía web, adaptado a componentes nativos.
TanStack Query
MóvilGestión de datos servidor→cliente con caché, revalidación y reintentos. Un hook por dominio (productos, ventas, caja…) en src/features/.
Zustand
MóvilAlmacén de estado ligero usado para la sesión del usuario y el carrito del POS (agregar/quitar items sin recargar la pantalla).
Tunnel
MóvilModo de Expo (npx expo start --tunnel) para probar con el teléfono físico en una red WiFi distinta a la del PC, sin exponer puertos.
Docker Compose
InfraestructuraOrquestador de contenedores: el backend móvil se integra al stack existente añadiendo docker-compose.mobile.yml (servicio kora_mobile_api en la red kora).
nginx (proxy inverso)
InfraestructuraEnruta el tráfico HTTPS de kora.insight-platforms.com/v1/* hacia el contenedor Go dentro de la red Docker. Se recarga sin downtime con nginx -s reload.
VPS
InfraestructuraServidor privado virtual donde corre todo el stack INSIGHT (web + base de datos + backend móvil). En esta guía, accesible por SSH.
DuckDNS
InfraestructuraServicio de DNS dinámico gratuito usado por varios dominios del ecosistema (*.duckdns.org). El dominio principal de producción es kora.insight-platforms.com (DNS gestionado por Insight Platforms), con certificado HTTPS gestionado por el proxy.
Hoja de Ruta
Lo que ya está entregado y las mejoras planificadas para las próximas versiones de la app.
- v1.0Entregado disponible en el zip
Ecosistema móvil completo
- POS con escáner + inventario + caja
- Historial, SUNAT, WhatsApp, PDF
- Dashboard KPI en vivo (SSE)
- Cola offline idempotente
- v1.1v1.1Próximo
Notificaciones push
- FCM: stock bajo por ejemplar
- Alerta de cierre de caja pendiente
- Resumen diario de ventas al gerente
- v1.2v1.2Planificado
Modo oscuro + reportes exportables
- Tema oscuro NativeWind en toda la app
- Exportar reportes a Excel/CSV desde el móvil
- Filtro por vendedor en historial
- v1.3v1.3Planificado
Catálogo offline total
- Descarga incremental de productos a SQLite
- Creación de clientes offline
- Sincronización diferencial por timestamp
- v2.0v2.0Visión
Multi-tienda y biometría
- Selector de sede/almacén al iniciar
- Login con huella / rostro
- Roles granulares por pantalla
openapi.yaml y el API Go están listos para sumar notificaciones push y sincronización offline avanzada sin reescribir el cliente.Problemas Comunes y Soluciones
Si algo falla, revisa aquí primero.
"npx: command not found" o "expo" no arranca
Node no está en PATH. Reinstala Node 20 LTS (paso 2.1) o reabre la terminal. Verifica con node -v.
Metro se queda cargando / pantallas blancas
Limpia la caché del bundler: npx expo start -c. Si persiste, borra node_modules y .expo y repite npm install.
Gradle: «SDK location not found»
ANDROID_HOME no está definido. Repite el paso 2.3 (setx ANDROID_HOME ...) y REABRE la terminal antes de ./gradlew.
Gradle: error de versión de Java
Necesitas JDK 17 exactamente. java -version debe decir 17.x. Revisa JAVA_HOME (paso 2.2).
La app (emulador) no conecta con el backend local
El localhost del emulador no es tu PC. Usa adb reverse tcp:8090 tcp:8090 y EXPO_PUBLIC_API_BASE=http://localhost:8090/v1.
Expo Go del teléfono no abre la app (otra red)
Usa el modo túnel: npx expo start --tunnel. También revisa el firewall de Windows (permitir Node).
Login rechazado (401)
Usa el usuario/contraseña del sistema web (tabla credentials). Si el backend es local, confirma que DATABASE_URL apunta a la BD correcta.
Dashboard no se actualiza «En vivo»
1) ¿El log de insight_mobile_api muestra LISTEN established? 2) nginx debe tener proxy_buffering off en /v1/ (usa el snippet incluido). 3) Si el teléfono pierde el SSE, la app cae a polling 10 s.
EAS build falla por icono
Agrega assets/icon.png (1024×1024) y assets/splash.png antes de construir; se declaran en app.config.ts.
«Stock insuficiente» al vender
Regla del sistema: el current_stock del ejemplar debe cubrir la cantidad. Verifica en Inventario → producto → ejemplar. La venta exige caja abierta (Ventas → Caja).