Sistema de Administración y Punto de Venta para Tienda de Abarrotes
Flutter · Dart · Supabase · Firebase · Riverpod
Abarrotería Pro es una aplicación móvil (Android/iOS) de gestión integral para tiendas de abarrotes: punto de venta (POS), escaneo de códigos de barras con la cámara del celular, gestión de inventario, caja, reportes y analítica de negocio.
Implementado y funcionando contra Supabase real: EP-01 (autenticación y usuarios), EP-02 (apertura de caja), EP-03 (CRUD de productos, escaneo por cámara, import CSV, foto de producto) y EP-04 (inventario, ajustes de stock, restock). El punto de venta (EP-05) está en desarrollo; el resto de épicas (gastos, cierre de caja, reportes, estadísticas, notificaciones) siguen pendientes — ver la tabla de Pantallas para el detalle.
| Rol | Descripción |
|---|---|
| AdminMaster (AM) | Acceso completo: gestión de usuarios, productos, inventario, reportes y analítica |
| Cajero (CAJ) | Operativo de punto de venta: ventas, caja, gastos del turno |
El proyecto sigue Clean Architecture por features, con separación clara en capas:
lib/
├── core/
│ ├── constants/ # Constantes de la app
│ ├── errors/ # Manejo de errores (Failures)
│ ├── router/ # GoRouter con guards de rol
│ ├── theme/ # Design system (colores, tipografía)
│ ├── utils/ # Utilitarios generales
│ └── widgets/ # Widgets compartidos entre features
│
└── features/
├── auth/ # EP-01: Login, sesiones, roles
├── cash_register/ # EP-02: Apertura de caja
├── products/ # EP-03: CRUD productos, escaneo, import CSV, foto
├── inventory/ # EP-04: Stock, movimientos, restock
├── pos/ # EP-05: Punto de venta (en desarrollo)
├── dashboard/ # Dashboard AM y CAJ
├── users/ # Gestión de cajeros (AM)
└── settings/ # Configuración de la app
Cada feature contiene su propia capa data/ (models, datasources, repository impl), sin una carpeta data/ compartida a nivel raíz — así se mantiene cada épica autocontenida. Las épicas EP-06 en adelante (gastos, cierre de caja, reportes, estadísticas, Bluetooth, notificaciones) todavía no tienen feature propia.
Cada feature sigue la estructura:
feature/
├── data/ # Models, datasources, repository impl
├── domain/ # Entities, repository interface, use cases
└── presentation/
├── pages/ # Screens
├── widgets/ # Componentes propios del feature
└── providers/# Riverpod providers
| Capa | Tecnología | Uso |
|---|---|---|
| UI | Flutter 3.44 + Dart 3.12 | Interfaz multiplataforma |
| Estado | Riverpod 2.x + riverpod_generator | Gestión de estado reactivo |
| Backend | Supabase (PostgreSQL) | Base de datos + Auth + Storage + Realtime |
| Auth | Supabase Auth (JWT + RLS) | Roles por metadata |
| DB Local | Drift (SQLite) | Modo offline (dependencia instalada, sin integrar aún) |
| Push | Firebase Messaging (FCM) | Notificaciones push (dependencia instalada, sin integrar aún) |
| Barcode | mobile_scanner | Escáner por cámara (reemplaza la pistola Bluetooth del backlog original) |
| pdf + printing | Recibos y reportes | |
| Charts | fl_chart | Gráficas y tendencias |
| Navegación | GoRouter | Rutas con guards de rol |
| Código gen. | freezed + build_runner | Modelos inmutables |
users -- Perfil de usuarios con rol (adminmaster | cajero)
products -- Catálogo de productos con barcode, stock, precio
sales -- Cabecera de ventas POS
sale_items -- Ítems de cada venta
cash_registers -- Turnos de caja (apertura → cierre)
cash_movements -- Movimientos de efectivo del turno
expenses -- Gastos registrados por cajero
stock_movements -- Historial de entradas/salidas de inventario
daily_closings -- Cuadres diarios con diferencias de caja
expense_categories -- Categorías de gasto configurables| # | Épica | US | SP | Sprint |
|---|---|---|---|---|
| EP-01 | Autenticación y Gestión de Usuarios | 7 | 31 | 1-2 |
| EP-02 | Apertura de Caja y Arqueo | 5 | 26 | 2-3 |
| EP-03 | CRUD de Productos | 8 | 42 | 3-4 |
| EP-04 | Gestión de Inventario y Stock | 5 | 28 | 4-5 |
| EP-05 | Flujo de Ventas (POS) | 9 | 55 | 5-7 |
| EP-06 | Control de Caja y Gastos | 6 | 32 | 7-8 |
| EP-07 | Cierre de Caja y Cuadres | 5 | 30 | 8-9 |
| EP-08 | Historial y Reportes | 6 | 35 | 9-10 |
| EP-09 | Estadísticas y Tendencias | 5 | 38 | 10-11 |
| EP-10 | Pistola Bluetooth de Códigos de Barras | 4 | 22 | 3 |
| EP-11 | Notificaciones y Alertas | 4 | 18 | 6 |
| EP-12 | Funcionalidades Sugeridas | 7 | 40 | 11-13 |
| Total | 71 | 397 | ~13 Sprints |
- Flutter SDK ≥ 3.44.4
- Dart SDK ≥ 3.12.2
- Cuenta en Supabase
- Cuenta en Firebase (para push notifications)
- Android Studio / VS Code con extensión Flutter
git clone https://github.com/johan-850/SIstema_AS.git
cd SIstema_AScp .env.example .env
# Edita .env con tus credenciales de SupabaseSUPABASE_URL=https://xxxx.supabase.co
SUPABASE_ANON_KEY=your_anon_keyLa dependencia de Firebase Messaging ya está en pubspec.yaml, pero todavía no está conectada a ningún flujo del código (EP-11, notificaciones push, sigue pendiente). Puedes omitir este paso hasta que esa épica se implemente:
- Crea un proyecto en Firebase Console
- Descarga
google-services.json→android/app/ - Descarga
GoogleService-Info.plist→ios/Runner/
flutter pub getdart run build_runner build --delete-conflicting-outputsflutter runEjecuta los scripts, en orden, en el SQL Editor de tu proyecto Supabase (no hay CLI de Supabase configurada en este repo, así que se aplican manualmente):
| Migración | Contenido |
|---|---|
supabase/migrations/001_ep01_auth_users.sql |
profiles, user_activity_logs, triggers de alta/último login, RLS por rol |
supabase/migrations/002_ep03_product_images_storage.sql |
Bucket product-images + políticas RLS para fotos de producto |
supabase/migrations/003_ep04_inventory.sql |
stock_movements, restock_requests, función atómica adjust_product_stock, Realtime sobre products |
Las tablas products, cash_registers y stock_movements referenciadas en el código de EP-02/EP-03 aún no tienen una migración formal previa (se asumen creadas manualmente desde el Dashboard) — es una deuda técnica conocida, no un olvido de este README.
- Todas las tablas tienen Row Level Security habilitado
- Los cajeros solo acceden a datos de su propio turno activo
- Los AdminMasters tienen acceso completo vía policy
role = 'adminmaster' - Las políticas se basan en claims del JWT de Supabase Auth
| Pantalla | Rol | US | Estado |
|---|---|---|---|
| Login | AM / CAJ | US-001, US-002 | Listo |
| Dashboard Admin | AM | US-048 | Listo |
| Gestión de Cajeros | AM | US-003 → US-007 | Listo |
| Apertura de Caja | CAJ | US-008, US-009 | Listo |
| Catálogo de Productos (AM) | AM | US-013 → US-019 | Listo |
| Catálogo de solo lectura (CAJ) | CAJ | US-018 | Listo |
| Inventario y Stock | AM | US-020 → US-024 | Listo |
| Punto de Venta (POS) | CAJ | US-025 → US-033 | En desarrollo |
| Gastos de Turno | CAJ | US-034, US-035 | Pendiente |
| Cierre de Caja | CAJ | US-039 → US-042 | Pendiente |
| Historial de Ventas | AM | US-044 → US-049 | Pendiente |
| Estadísticas | AM | US-050 → US-054 | Pendiente |
| Configuración BT | AM/CAJ | US-055 → US-058 | Pendiente (se reemplazó por escaneo con cámara en US-013/US-018) |
| Centro de Alertas | AM | US-059 → US-062 | Pendiente |
| Sprint | Foco | SP |
|---|---|---|
| S-01 | Auth completo y gestión de usuarios | 31 |
| S-02 | Apertura de caja y arqueo inicial | 24 |
| S-03 | Pistola BT + CRUD productos (AM) | 38 |
| S-04 | Catálogo completo + inventario | 38 |
| S-05 | POS básico (carrito y búsqueda) | 26 |
| S-06 | POS completo + alertas | 42 |
| S-07 | Gastos de caja | 21 |
| S-08 | Cierre de caja y cuadre | 29 |
| S-09 | Historial y reportes | 34 |
| S-10 | Estadísticas básicas | 24 |
| S-11 | Estadísticas avanzadas | 16 |
| S-12 | Mejoras sugeridas vol.1 | 29 |
| S-13 | Mejoras sugeridas vol.2 | 39 |
Este es un proyecto privado de desarrollo activo. El flujo real que se viene usando es una rama por épica:
- Crea una rama desde
develop:git checkout -b epica_N - Implementa las historias de usuario de esa épica (commits con formato
feat(epN): US-XXX - descripción) - Crea un Pull Request hacia
developreferenciando los US-ID incluidos
Todos los derechos reservados © 2026 — Abarrotería Pro