Bienvenido al repositorio del proyecto Cliente Mapper EC, un ERP dinámico móvil enfocado en el registro y gestión de visitas a clientes.
El núcleo del sistema es su arquitectura 100% Offline-First y Serverless, lo que significa que la app es completamente funcional y rápida sin necesidad de conexión a internet, sincronizando los datos directamente con la nube (Supabase) únicamente cuando la red está disponible.
- Estructura de base de datos relacional definida y creada en Supabase (
empresas,usuarios,whitelist, etc.). - Lógica del
Android_ID/Vendor_IDimplementada en la inicialización móvil. - Políticas RLS en Supabase para proteger e insertar de forma autónoma solicitudes en
whitelist. - Interfaz básica móvil para solicitar acceso al sistema y notificar estados (Pendiente, Activo, Revocado).
- Instalación de
@powersync/react-nativey del motor nativo JSI@powersync/op-sqlite. - Esquema de base de datos local en SQLite definido en
app/powerSyncSchema.ts, espejeando todas las tablas del negocio (clientes,rutas,visitas,productos,whitelist,usuarios). - Conector de Supabase-PowerSync creado en
app/powerSync.tsutilizando la autenticación mediante tokens JWT (getSupabaseToken).
- Consulta Relacional Multi-nivel: Obtención del nombre del usuario y su empresa mediante un join relacional en una sola llamada inicial.
- Checklist de Validaciones:
- 🛜 Internet: Verificación de conectividad real mediante un ping ultrarrápido (HTTP HEAD con timeout).
- 👤 Usuario: Comprobación de que el dispositivo esté asignado a un usuario real en Supabase.
- 🏢 Empresa: Validación de que el usuario tenga un
empresa_idasignado.
- Sincronización Automatizada: Si todas las validaciones son exitosas, la app inicializa la base SQLite local (
powerSync.init()) e inicia la sincronización de red (startSync()) descargando los datos locales de forma segura y aislada por empresa. - UI Premium: Panel de bienvenida interactivo que muestra el estado en tiempo real de cada paso y botón de reintento en caso de error.
- Instalación y configuración de React Navigation (
@react-navigation/native-stack) para transiciones nativas y manejo del historial de navegación (botón Atrás). - Implementación de
SessionContextpara lectura y persistencia deusuario_idyempresa_idusandoAsyncStorage. - Bypass de Sincronización: Almacenamiento del estado
isInitialSyncCompletepara saltar la pantalla deCheck_syncen inicios posteriores y enrutar directamente alMainMenu. - Menú Principal Moderno: Cuadrícula de opciones (Clientes, Rutas, Visitas, Productos) y un indicador semafórico que monitorea la conexión a internet cada 30 segundos.
- Integración total de operaciones CRUD mediante
powerSync.execute()para inserciones y modificaciones 100% locales en SQLite. - Consultas ultra-rápidas y reactivas usando
usePowerSyncWatchedQuery. - Auto-generación de IDs universales (
UUID v4) del lado del cliente al crear registros sin internet. - Lógica de "Tombstone" (Soft Delete en SQLite) delegada a PowerSync para eliminar registros de la nube al recuperar conectividad.
- Formulario Completo: Modificado para almacenar campos de contacto del cliente (
cedula,correo,telefono) localmente y sincronizarlos correctamente.
- Vínculo Seguro de Autenticación: Lógica basada en Supabase Anonymous Auth (
signInAnonymously) vinculada al usuario de la base de datos local usando la función segura RPCvincular_usuario_auth(p_device_id)que registra elauth.uid()en la tablausuarios.auth_user_id. - Seguridad RLS (Supabase): Habilitación de políticas a nivel de fila (Row Level Security) para restringir que los usuarios solo puedan leer o modificar la información de clientes que pertenezcan a su misma
empresa_id. - Reglas de Sincronización Avanzadas: Archivo
sync-rules.yamlparametrizado dinámicamente medianterequest.user_id()para generar cubos de datos aislados a nivel corporativo (company_datayuser_whitelist), evitando fugas de datos y permitiendo que todos los usuarios de la misma empresa visualicen la información compartida (clientes, productos, etc.). - Espejeo de Esquemas: Actualización de
powerSyncSchema.ts(añadiendo la columnaauth_user_id) para evitar inconsistencias de sincronización nativa (Schema Mismatch). - Publicación de Datos (Logical Replication): Integración de tablas críticas en la publicación de PostgreSQL
powersyncpara la correcta recepción de mutaciones del lado del servidor.
- Consola SQL Integrada: Accesible desde el ícono de engranaje (configuración) en el
ProfileNavbar. Permite ejecutar sentencias SELECT personalizadas, consultar tablas del motor SQLite (sqlite_master), visualizar colas de subida locales de PowerSync (ps_crud) y verificar en tiempo real el estado y estadísticas de red del conector. - Herramientas de Auditoría: Implementación de scripts Node.js para inspeccionar la integridad del esquema en Supabase (
check-schema.js) y auditar el mapeo relacional de datos (check-data.js).
Arquitectura_ERP_Visitas.md: Flujo de trabajo, geolocalización, diagramas y fases de desarrollo del proyecto./docs: Documentación y configuración./scripts: Scripts utilitarios de prueba y mantenimiento.check-schema.js: Compara las columnas de base de datos en Supabase con los esquemas móviles.check-data.js: Diagnostica el mapeo deauth_user_idy relaciones multi-tenant entre usuarios y empresas.
/app: Código fuente del cliente móvil Expo / React Native./context:SessionContext.tsxpara proveer los datos de la sesión offline a todas las vistas./hooks: Lógica de inicialización (useAppInit.ts)./views: Componentes segmentados por dominios (diseño, vista, lógica):Check_sync: Tablero de estado inicial y descarga de SQLite.Main_menu: Menú central del ERP y monitor de red./Customers: CRUD offline para la cartera de clientes./SqlRunner: Consola de administración local de bases de datos.
powerSyncSchema.ts: Definición del esquema local de tablas SQLite para sincronización offline.powerSync.ts: Conector de sincronización que interactúa con la nube a través de tokens JWT firmados.
Para que la sincronización en tiempo real y offline-first funcione correctamente entre Supabase, PowerSync Cloud y la aplicación móvil, asegúrate de tener configurado lo siguiente:
- Publicación en Supabase:
Ejecuta el siguiente comando SQL en Supabase para habilitar la réplica lógica sobre las tablas críticas:
ALTER PUBLICATION powersync ADD TABLE public.clientes, public.usuarios, public.empresas, public.rutas, public.visitas, public.productos, public.visita_productos, public.whitelist;
- Client Auth en PowerSync Cloud:
En el panel de control de tu instancia en PowerSync, ve a Client Auth e introduce los certificados del emisor de JWT (Supabase):
- JWKS URL:
https://<tu-id-proyecto>.supabase.co/auth/v1/certs - Accepted JWT Audience:
authenticated
- JWKS URL:
Al usar @powersync/op-sqlite, la aplicación contiene código nativo C++ de alto rendimiento (JSI). Por lo tanto, no es compatible con el entorno de pruebas de Expo Go. Debes generar una build nativa o emular de la siguiente forma:
- Instala de forma global las herramientas de Expo CLI y EAS CLI:
npm install -g eas-cli
- Inicia sesión en tu cuenta de Expo (puedes crear una cuenta gratuita en expo.dev):
eas login
- Enlaza el proyecto local a tu cuenta (ejecutar en la carpeta
app/):eas project:init
- Genera la APK directamente en los servidores de Expo en la nube (el perfil
previewestá preconfigurado para generar una APK descargable):Nota: Si te pregunta por el archivo Keystore de Android, selecciona que Expo lo gestione automáticamente.eas build --profile preview --platform android
Al terminar, la terminal te entregará un link de descarga y un código QR para instalar la APK en tu dispositivo móvil.
Para correr y compilar la app directamente en un emulador local de Android Studio con el SDK instalado:
npx expo run:android