SISA es la aplicación móvil y web de gestión operativa de Depros. Unifica la agenda de trabajos, la relación con clientes y proveedores, la gestión documental y los circuitos financieros (recibos, pagos, cajas, tarifas) sobre una única experiencia construida con Expo Router y React Native. El frontend consume la API sisa.api y prioriza el trabajo híbrido online/offline combinando AsyncStorage (datos en caché) y expo-file-system (archivos descargados con metadatos cacheados en el cliente), con sincronización diferencial de operaciones.
- Expo 53 con
expo-routerpara navegación basada en archivos. - React 19 y React Native 0.79 con TypeScript.
- Componentes nativos y librerías Expo para archivos, cámara, documentos, autenticación segura y caché (
expo-secure-store,expo-file-system,expo-document-picker, etc.). AsyncStorage+ hooks propios (useCachedState) para persistencia de datos yexpo-file-systemcon metadatos en caché para archivos descargados con rutas determinísticas.Fuse.jsyreact-native-calendarspara búsquedas tolerantes y visualización de agenda.
- Node.js 18 LTS o 20 LTS y npm 9+ (también es compatible con pnpm/yarn si el equipo lo adopta).
- Cuenta en Expo (opcional pero recomendada) y el CLI disponible a través de
npx. - Android Studio / Xcode si se van a usar emuladores nativos.
- Acceso a la API
sisa.api(por defecto se apunta ahttps://sistema.depros.com.ar, editable enconfig/Index.ts).
- Clona el repositorio y entra en la carpeta del proyecto.
git clone <url-del-repo> cd sisa.ui
- Instala las dependencias.
npm install
- Configura la URL del backend si es necesario editando
config/Index.ts. - Arranca Metro bundler.
Desde la consola de Expo puedes elegir abrir la aplicación en Android (
npx expo start
a), iOS (i), web (w) o un build de desarrollo. También hay atajos empaquetados:npm run androidnpm run iosnpm run web
- Para reiniciar el proyecto base puedes usar
npm run reset-project, que mueve el ejemplo inicial aapp-example/y dejaapp/vacía.
AuthContextse encarga del inicio de sesión, la revalidación de tokens y la detección de modo offline. Los tokens se obtienen del encabezadoAuthorizationtras llamar a/loginy se guardan enexpo-secure-storejunto con las credenciales cifradas.- Cada hora se renueva el token si el usuario sigue activo; también se comprueba el perfil cada 2 minutos (
/profile) para validar la sesión. - Bearer obligatorio: todas las peticiones a
sisa.apideben llevarAuthorization: Bearer <token>salvo los endpoints de inicio de sesión y registro. - El contexto expone
checkConnectionpara que la UI pueda forzar una reconexión y alterna entre modo online/offline según el estado del backend.
- Mantén la convención de no utilizar
FOREIGN KEYen la base de datos del backend, tal como se definió parasisa.api. - Los módulos de la aplicación envían un
timestampen cada operación de escritura (por ejemplo citas, trabajos, pagos) para facilitar la reconstrucción de historial y resolver conflictos de sincronización. - Campos como
attached_filesyparticipantsse serializan en JSON desde el frontend; la API debe aceptarlos en ese formato. - El endpoint
/sync/batchexpone el mapamap.local_to_remotepara reconciliar IDs temporales con los definitivos asignados por el servidor:Cada operación entrante se despacha por entidad en el backend (por ejemplo{ "ok": true, "batch_id": "example-batch-id", "results": [], "map": { "local_to_remote": { "1": 42 } }, "history": { "max_history_id": 0, "changes": [] } }ClientsHandler) para mantener el controlador desacoplado.
app/_layout.tsxcompone el árbol de proveedores (auth, permisos, archivos, catálogos, etc.) y define unStackde Expo Router sin cabeceras. También aplica elThemeProviderque armoniza el esquema de color con la configuración del usuario.app/Index.tsxactúa como splash screen mostrando el logotipo hasta que se resuelve el estado de autenticación;app/+not-found.tsxdelega los errores de routing al enlace raíz.
AuthContext: login, autologin, renovación y almacenamiento seguro del token.PermissionsContext: fusiona permisos globales y del usuario consultando/permissions/globaly/permissions/user/:id, con refresco automático cada 5 minutos.FilesContext: subida (/files), descarga y cacheo de metadatos/archivos conexpo-file-systemyAsyncStorage, incluyendo utilidades para limpiar almacenamiento local.ConfigContext: obtiene y actualiza preferencias (/user_configurations) y expone el tema elegido por el usuario, el cual se integra enuseColorScheme.ProfileContext,ProfilesContextyProfilesListContext: cachean perfiles del usuario actual, perfiles externos y listados completos para selector de permisos.useCachedState: hook genérico para hidratar estado desdeAsyncStoragey escuchar limpiezas de caché.
app/login/: pantallas de login, registro y recuperación que consumen/login,/registery/forgot_password.app/Home.tsx: menú dinámico que muestra secciones según los permisos del usuario y expone accesos a agenda, clientes, finanzas, configuración y permisos.app/appointments/: calendario (conreact-native-calendars), listado diario y CRUD de citas asociados a clientes y trabajos.app/jobs/: listado de trabajos con cálculo de duración y costos en base a tarifas o montos manuales.app/clients/,app/providers/: listados con búsqueda difusa (Fuse.js), modales de detalle y formularios de alta/edición condicionados por permisos.app/folders/: navegación jerárquica de carpetas por cliente, con soporte para imágenes y borrado controlado por permisos.app/products_services/,app/categories/,app/statuses/,app/tariffs/,app/cash_boxes/: catálogos maestros con búsqueda, acciones restringidas y refresco tras cada operación.app/payments/yapp/receipts/: flujos financieros que combinan clientes/proveedores, adjuntos y banderas contables.【F:app/payments/index.tsx†L61-L187】app/payment_templates/: catálogo, formularios y modal de lectura para definir plantillas reutilizables de pagos; exigelistPaymentTemplatespara navegar y aplica los permisosaddPaymentTemplate,updatePaymentTemplate,deletePaymentTemplatesobre las acciones disponibles, siempre bajo autenticación Bearer.【F:app/payment_templates/index.tsx†L61-L187】【F:contexts/PaymentTemplatesContext.tsx†L271-L441】app/shortcuts/payment_templates.tsx: vista de atajos "Planillas de pagos" que permite elegir una plantilla habilitada y abre/payments/createcon los valores contables precargados cuando el perfil cuenta conusePaymentTemplateShortcuts.【F:app/shortcuts/payment_templates.tsx†L1-L139】【F:app/payments/create.tsx†L1-L210】app/permission/: UI para asignar permisos globales o por usuario mediante checkboxes, agrupando sectores y utilizandoPermissionsContext.app/user/:ProfileScreenpara editar datos personales yConfigScreenpara cambiar tema, limpiar cachés (clearAllDataCaches) y purgar archivos locales.
- Los adjuntos se almacenan en
expo-file-systemdentro dedocumentDirectory/files/{id}/con renombrado incremental para evitar colisiones;FilesContextreutiliza copias locales cuando es posible y mantiene metadatos sincronizados enAsyncStoragepara resolverlos offline. - La opción "Borrar datos de archivos" de
ConfigScreenelimina metadatos y archivos locales, mientras que "Borrar datos de la caché" limpia todos los estados persistidos víauseCachedState.
- El directorio
database/contiene scripts SQL (clients.sql,sync_tables.sql) y migraciones (database/migrations/*) que definen la estructura esperada porsisa.api. Respeta el criterio de no crear claves foráneas y realiza las asociaciones en capa de aplicación.
La documentación funcional y técnica ampliada se mantiene en la carpeta docs/ (por ejemplo, guías de sincronización, manuales operativos y convenciones de API). Si no la encuentras en este repositorio, consulta el repositorio principal o al equipo de backend para obtenerla. El documento docs/architecture/payments-vs-templates.md resume las diferencias entre los pagos tradicionales y las plantillas de pago, incluyendo sus flujos de sincronización y dependencias de permisos.【F:docs/architecture/payments-vs-templates.md†L1-L43】
- Release 1.3.5 (cajas con asignaciones y permisos administrativos): la
APP_VERSIONse fijó en1.3.5y se alinea con el release declarado ensisa.api(config/version.json), manteniendo los camposassigned_user_idsyadmin_permissionspara documentar quién puede operar o administrar cada caja; revisa la colección de Postman y la pantalla de permisos para habilitarlos con autenticación Bearer.【F:docs/features/modules.md†L330-L367】【F:app/permission/PermissionScreen.tsx†L53-L82】【F:docs/postman/Sistema.postman_collection.json†L2213-L2266】 - Release 1.3.9 (bootstrap offline de datos críticos): la
APP_VERSIONahora es1.3.9y el arranque de la app queda orquestado porBootstrapProvider, que hidrata cachés de empresas, membresías, permisos, categorías e ingresos/egresos antes de mostrar/Home; si las peticiones fallan, la UI continúa con los datos persistidos. La guía de caché documenta el flujo de arranque y la pantalla principal espera a que el bootstrap termine.【F:config/Index.ts†L1-L3】【F:contexts/BootstrapContext.tsx†L1-L83】【F:app/_layout.tsx†L39-L172】【F:docs/architecture/state-and-cache.md†L95-L116】 - Release 1.3.8 (registro de red con verbos completos): la
APP_VERSIONahora es1.3.8, el sniffer normaliza el método en mayúsculas y discrimina por método + URL al evitar duplicados, con lo que los eventosPOST/PUT/DELETE/PATCHvuelven a aparecer en el historial. La guía se actualiza para reflejarlo.【F:config/Index.ts†L1-L3】【F:utils/networkSniffer.ts†L1-L145】【F:docs/features/network-logs.md†L1-L20】 - Release 1.3.7 (registro de red documentado y con límites): la
APP_VERSIONahora es1.3.7, el visor/network/logsdocumenta campos capturados, límite de rotación y respuesta a limpiezas de caché, y la colección Postman remarca que solo el login prescinde del Bearer mientras el visor captura todas las llamadas. El changelog interno enlaza la guía y mantiene la versión alineada.【F:config/Index.ts†L1-L3】【F:docs/features/network-logs.md†L1-L20】【F:docs/postman/Sistema.postman_collection.json†L1-L360】【F:docs/architecture/state-and-cache.md†L75-L87】 - Plantillas de pago: funcionalidad disponible desde el menú financiero y los atajos para definir valores predeterminados de pagos. Requiere permisos
listPaymentTemplates(navegación) yaddPaymentTemplate/updatePaymentTemplate/deletePaymentTemplate(operaciones), además de token Bearer en todas las llamadas apayment_templatessalvo el login.【F:app/payment_templates/index.tsx†L61-L187】【F:contexts/PaymentTemplatesContext.tsx†L271-L441】 - Planillas de pagos (atajo): acceso directo (
/shortcuts/payment_templates) que lista plantillas habilitadas para atajos, respetausePaymentTemplateShortcutsy precarga/payments/createcon la configuración contable correspondiente.【F:constants/menuSections.ts†L29-L40】【F:app/shortcuts/payment_templates.tsx†L1-L139】【F:app/payments/create.tsx†L1-L210】 - Colección Postman actualizada: consulta
docs/postman/sisa-api.postman_collection.jsonpara probar los endpoints de pagos, plantillas y empresas (incluyendo direcciones, contactos y canales) con autenticación Bearer.【F:docs/postman/sisa-api.postman_collection.json†L1-L40】【F:docs/postman/sisa-api.postman_collection.json†L647-L2415】
npm start/npx expo start: inicia el bundler de Expo.npm run android,npm run ios,npm run web: abre la app directamente en cada plataforma.npm run lint: ejecutaexpo lintcon la configuración ESLint del proyecto.npm run reset-project: restaura el esqueleto inicial de Expo.
- Problemas de compilación: borra cachés con
npx expo start --clear, reinstala dependencias (rm -rf node_modules && npm install) o ejecutanpx expo-doctor. - Errores de autenticación: usa la pantalla de Configuración para limpiar cachés o cierra sesión; asegúrate de que el backend responde y de que el token no ha caducado.
- Permisos insuficientes: verifica que
PermissionsContextse haya refrescado (botón de recarga o volver a entrar) y que el usuario tenga los sectores requeridos. - Adjuntos corruptos: desde Configuración ejecuta "Borrar datos de archivos" para forzar la re-descarga; los archivos se regeneran con
FilesContextal volver a abrirlos. - Desajustes de datos: ejecuta manualmente las sincronizaciones (
load*) disponibles en cada módulo o revisa el historial expuesto por/sync/batch. - Estilo de código: antes de abrir un PR ejecuta
npm run linty corrige los reportes de ESLint.