Suite operativa para ventas, reservas y flujo de confirmacion de Taller Alejo.
Un mismo producto, multiples roles, una sola estrategia tecnica: persistencia local, sincronizacion remota y eventos en tiempo real.
TallerAlejo es un monorepo que concentra las aplicaciones cliente y operativas del negocio:
- una aplicacion Android para cliente final
- una aplicacion Android para operador de escaneo y confirmacion
- una aplicacion web para cliente
- una function ligera para publicar eventos realtime sin exponer secretos en frontend
El objetivo del producto es claro:
- permitir compras y reservaciones con experiencia consistente
- soportar operacion con conectividad inestable
- sincronizar con Appwrite como fuente remota
- propagar cambios relevantes por Pusher en tiempo real
Este repositorio representa un MVP serio, ya con decisiones de arquitectura, separacion por capas, modulos compartidos y una estrategia clara de evolucion hacia cores posteriores.
- Navegacion Del Repositorio
- Panorama Del Monorepo
- Aplicaciones Incluidas
- Arquitectura
- Stack Tecnico
- Patrones Y Tecnicas Programaticas
- Sincronizacion Y Realtime
- Fortalezas Del MVP
- Deuda Tecnica Conocida
- Roadmap Por Cores
- Estructura Del Repositorio
- Puesta En Marcha
- Criterio De Calidad
- Web desplegada en Render: https://alejotaller.onrender.com/
- Dashboard de administracion: https://github.com/danielitoCode/dash_alejo_taller
- usa este README para entender la vision general, arquitectura y roadmap del producto
- usa los README especificos para despliegue, configuracion y detalles operativos de cada superficie
TallerAlejo/
|- app/ -> Android cliente
|- alejotallerscan/ -> Android operador
|- web/ -> Cliente web
|- function/
| \- alejo_publisher/ -> Servicio HTTP para publicar eventos a Pusher
|- shared-auth/ -> Autenticacion compartida
|- shared-core/ -> Reglas y utilidades transversales
|- shared-data/ -> Data layer compartida, mappers, DTOs, repositorios
|- shared-sale/ -> Dominio de ventas compartido
|- mapper-processor/ -> Procesamiento auxiliar
La idea central del repositorio es evitar duplicacion de logica critica entre clientes y mantener las reglas de negocio sensibles dentro de modulos compartidos.
Aplicacion Android orientada al cliente final.
Responsabilidades principales:
- autenticacion y sesion de usuario
- consulta de catalogo
- compra o reservacion
- persistencia local para operacion offline
- recepcion de eventos realtime de verificacion de venta
Aplicacion Android para operadores.
Responsabilidades principales:
- escaneo QR moderno
- carga manual de reservaciones
- verificacion o rechazo de ventas
- historial local interno del operador
- sincronizacion de pendientes locales
- notificaciones locales cuando otra operadora ya proceso una reserva
Aplicacion cliente web.
Responsabilidades principales:
- onboarding y experiencia comercial web
- compra o reservacion desde navegador
- persistencia offline en IndexedDB
- suscripcion a eventos realtime por Pusher
- descarga guiada de APK desde releases
Servicio HTTP minimo para publicar eventos a Pusher desde infraestructura controlada.
Responsabilidades principales:
- recibir payload validado desde la app operadora
- publicar
sale:confirmedysale:rejectedal canal esperado - aislar secretos de Pusher del frontend
- evitar problemas de firma por timestamp desde cliente movil
El repositorio sigue una arquitectura modular, por feature y por capas:
datadomainpresentation
Cada feature implementa el mismo lenguaje arquitectonico, tanto en Android como en la capa web equivalente.
feature/{feature}/
|- data/
| |- dao/
| |- dto/
| |- mapper/
| \- repository/
|- domain/
| |- caseuse/
| |- entity/
| \- repository/
|- presentation/
| |- model/
| |- screen/
| \- viewmodel/
\- di/
La fuente de verdad no es solamente la nube.
El sistema opera con una mentalidad offline-first con reconciliacion:
- guarda local primero cuando el flujo lo requiere
- sincroniza con Appwrite cuando la conectividad lo permite
- conserva la coherencia mediante repositorios especializados
- consume realtime para reducir latencia perceptiva entre actores
- Kotlin
- Jetpack Compose
- Material 3
- Koin
- Room
- Coroutines
- StateFlow
- CameraX
- ML Kit Barcode Scanning
- Appwrite Kotlin SDK
- OkHttp
- Svelte
- Vite
- TypeScript
- Dexie
- Appwrite Web SDK
- Pusher JS
- M3 Svelte
- Appwrite
- Pusher
- Render
- GitHub Releases
Se prioriza persistencia local y posterior reconciliacion remota.
Esto permite:
- operar sin depender de red estable
- recuperar pendientes locales
- reintentar pushes remotos
- fusionar remoto y local sin perder contexto del usuario
Los repositorios separan claramente:
- acceso local
- acceso remoto
- reglas de sincronizacion
- traduccion entre DTOs y entidades de dominio
La logica del negocio no se concentra en UI ni en repositorios gigantes.
Cada accion importante se encapsula en casos de uso concretos.
Ejemplos del dominio:
- autenticar usuario
- registrar nueva venta
- interpretar evento realtime
- sincronizar pendientes del operador
- enriquecer productos tras escaneo QR
Los ViewModels exponen StateFlow inmutable y manejan estados de UI explicitamente:
- loading
- selected item
- error
- notice
- sync status
Esto reduce acoplamiento visual y hace mas predecible la UI.
Buena parte de la logica critica no vive duplicada por app.
Los modulos shared-* concentran:
- entidades de negocio
- autenticacion compartida
- contratos de repositorio
- mappers y repositorios de soporte
- casos de uso reutilizables
La verificacion de ventas no depende solo de polling.
Se utiliza una estrategia dirigida por eventos:
- Appwrite persiste el cambio
- la operadora verifica el estado remoto
- la function publica a Pusher
- cliente Android y web reaccionan al evento
flowchart LR
A["Cliente Android / Web"] --> B["Appwrite"]
B --> C["Operadora Android"]
C --> D["Actualiza buy_state"]
D --> E["Verificacion remota"]
E --> F["Function alejo_publisher"]
F --> G["Pusher"]
G --> H["Cliente Android"]
G --> I["Cliente Web"]
- la operadora ya no firma directamente contra Pusher
- la function
alejo_publisherse encarga de publicar - el flujo no continua si Appwrite no confirma el cambio esperado
- el historial interno del operador se conserva localmente
- menos fragilidad por reloj del dispositivo
- secretos de Pusher fuera del APK
- flujo mas auditable
- mejor base para endurecimiento posterior
La mayor fortaleza del proyecto es que ya existe una estructura tecnica coherente y reutilizable, no un conjunto de pantallas aisladas.
La coexistencia de Android cliente, Android operador y web cliente sobre modulos compartidos reduce divergencias funcionales.
El producto no depende ingenuamente de conectividad perfecta.
Tiene persistencia local, sync y manejo de pendientes como parte del diseño, no como agregado tardio.
El rol operador ya resuelve un problema real de negocio:
- captura
- validacion
- confirmacion
- rechazo
- historial
- sincronizacion de pendientes
El monorepo ya tiene forma de plataforma:
- apps
- modulos compartidos
- servicio auxiliar
- pipeline de releases descargables
Estas deudas no invalidan el MVP, pero deben considerarse para una fase posterior:
- la seguridad del
publisheraun usa una API key simple de MVP - Appwrite sigue siendo accedido desde clientes en varias operaciones sensibles
- el esquema remoto arrastra decisiones de modelado mejorables como
productsserializado como string - falta endurecer mejor politicas de conflicto y reconciliacion para todos los features
- todavia hay espacio para mas homogeneidad visual entre todas las superficies
- la cobertura automatizada aun no es uniforme en todas las capas y apps
- hay flows donde conviene mover mas logica sensible a backend o functions
Objetivo:
- estabilizar compra, reserva, verificacion y realtime
- cerrar consistencia entre Android, web y operadora
- asegurar deploys y releases trazables
Objetivo:
- endurecer seguridad y backends auxiliares
- reducir responsabilidad sensible en frontend
Pendientes naturales:
- auth mas robusta entre apps y roles
- API key temporal o firma mejorada para functions
- mas operaciones mediadas por backend
- mejoras de observabilidad y monitoreo
Objetivo:
- escalar operacion y analitica
Pendientes naturales:
- dashboards mas avanzados
- reportes y metricas de negocio
- auditoria operativa mas completa
- mayor automatizacion de conciliacion y alertas
.
|- app/
|- alejotallerscan/
|- web/
|- function/
| \- alejo_publisher/
|- shared-auth/
|- shared-core/
|- shared-data/
|- shared-sale/
|- mapper-processor/
|- build.gradle.kts
|- settings.gradle.kts
\- local.properties
shared-auth: autenticacion, roles, acceso de operadorshared-core: piezas transversales y reglas comunmente reutilizadasshared-data: DTOs, mappers, repositorios y soporte de persistencia/syncshared-sale: dominio de venta, estados, entidades y casos de uso
./gradlew assembleDebug./gradlew :alejotallerscan:compileDebugKotlincd web
pnpm install
pnpm devcd function/alejo_publisher
npm install
npm run devEl repositorio utiliza variables o propiedades para:
- Appwrite endpoint y project id
- credenciales de Pusher
- URL del publisher
- URLs de releases APK
- claves de Telegram
En Android parte de esta configuracion se inyecta desde local.properties hacia BuildConfig.
El repositorio se considera sano cuando conserva estas propiedades:
- compilacion estable por modulo
- reglas de dominio compartidas entre superficies
- sincronizacion local/remota verificable
- realtime alineado entre emisor y suscriptores
- pantallas resilientes a contenido largo y estados de red
- estructura por feature clara
- separacion de responsabilidades
- modulos compartidos reales
- test unitarios en modulos clave
- flows criticos ya instrumentados con logs y verificacion de estado remoto
TallerAlejo no es un prototipo visual suelto.
Es un MVP funcional con base arquitectonica seria, pensado para seguir creciendo por iteraciones sin rehacerse desde cero.
El foco actual del repositorio es:
- consolidar la estabilidad del flujo comercial
- mantener coherencia entre plataformas
- endurecer progresivamente los tramos sensibles
Repositorio privado de trabajo para el ecosistema TallerAlejo.
Su estructura, modulos y despliegues responden al producto y a sus necesidades operativas reales.