feat: Add complete epic documentation and orchestration inventories
Sprint 3-4 deliverables: - 28 epics documented (MCH-001 to MCH-028) - 7 development phases fully documented - DATABASE_INVENTORY.yml, BACKEND_INVENTORY.yml, FRONTEND_INVENTORY.yml - Task traces for database and frontend 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
48dea7a5d0
commit
3bba4ce6d7
97
docs/01-epicas/MCH-001-infraestructura-base.md
Normal file
97
docs/01-epicas/MCH-001-infraestructura-base.md
Normal file
@ -0,0 +1,97 @@
|
||||
# MCH-001: Infraestructura Base
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-001
|
||||
- **Fase:** 1 - MVP Core
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** Completado
|
||||
- **Fecha inicio:** 2026-01-04
|
||||
- **Fecha fin:** 2026-01-05
|
||||
|
||||
## Descripcion
|
||||
|
||||
Setup inicial del proyecto MiChangarrito incluyendo estructura monorepo, configuracion de base de datos PostgreSQL multi-tenant, pipelines CI/CD, y entornos de desarrollo.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Establecer estructura de proyecto monorepo
|
||||
2. Configurar PostgreSQL con multi-tenant (RLS)
|
||||
3. Setup de entornos de desarrollo
|
||||
4. Configurar CI/CD basico
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Estructura de carpetas monorepo (apps/, database/, docs/)
|
||||
- PostgreSQL con schemas separados
|
||||
- Scripts de recreacion de BD
|
||||
- Docker Compose para desarrollo
|
||||
- GitHub Actions basico
|
||||
|
||||
### Excluido
|
||||
- Deployment a produccion
|
||||
- Kubernetes (futuro)
|
||||
- Monitoring avanzado
|
||||
|
||||
## Arquitectura
|
||||
|
||||
```
|
||||
michangarrito/
|
||||
├── apps/
|
||||
│ ├── backend/ # NestJS API
|
||||
│ ├── web/ # React Dashboard
|
||||
│ ├── mobile/ # Expo App
|
||||
│ ├── mcp-server/ # Gateway LLM
|
||||
│ └── whatsapp-service/ # Bot WhatsApp
|
||||
├── database/
|
||||
│ ├── schemas/ # DDL files
|
||||
│ ├── seeds/ # Data inicial
|
||||
│ └── *.sh # Scripts
|
||||
├── docs/
|
||||
└── orchestration/
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo/Ubicacion |
|
||||
|------------|--------|-------------------|
|
||||
| Estructura monorepo | Completado | `projects/michangarrito/` |
|
||||
| DDL base PostgreSQL | Completado | `database/schemas/00-02.sql` |
|
||||
| Scripts BD | Completado | `database/*.sh` |
|
||||
| Docker Compose | Completado | `docker-compose.yml` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- Ninguna (epica inicial)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-002 (Auth)
|
||||
- MCH-003 (Productos)
|
||||
- MCH-010 (MCP Server)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] Estructura de carpetas creada
|
||||
- [x] PostgreSQL ejecutandose con schemas
|
||||
- [x] Script drop-and-recreate funcional
|
||||
- [x] Extensiones uuid-ossp, pgcrypto habilitadas
|
||||
- [x] Funcion current_tenant_id() operativa
|
||||
|
||||
## Notas Tecnicas
|
||||
|
||||
- **Puerto PostgreSQL:** 5432
|
||||
- **Puerto Redis:** 6379
|
||||
- **Base de datos:** michangarrito_platform
|
||||
- **Multi-tenant:** Via tenant_id + RLS
|
||||
|
||||
## Historias de Usuario Relacionadas
|
||||
|
||||
| ID | Historia | Estado |
|
||||
|----|----------|--------|
|
||||
| US-001 | Como DevOps, quiero poder recrear la BD facilmente | Completado |
|
||||
| US-002 | Como Dev, quiero estructura clara de proyecto | Completado |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
137
docs/01-epicas/MCH-002-autenticacion.md
Normal file
137
docs/01-epicas/MCH-002-autenticacion.md
Normal file
@ -0,0 +1,137 @@
|
||||
# MCH-002: Autenticacion
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-002
|
||||
- **Fase:** 1 - MVP Core
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** Completado
|
||||
- **Fecha inicio:** 2026-01-05
|
||||
- **Fecha fin:** 2026-01-06
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de autenticacion adaptado a micro-negocios mexicanos: login via telefono con OTP (SMS/WhatsApp), PIN de 4 digitos para acceso rapido, soporte biometrico opcional, y JWT para sesiones.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Login via telefono + OTP
|
||||
2. PIN de 4 digitos para acceso rapido
|
||||
3. Soporte biometrico (Face ID/huella)
|
||||
4. Gestion de sesiones JWT
|
||||
5. Roles: owner, employee, viewer
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Registro con telefono
|
||||
- OTP via SMS/WhatsApp
|
||||
- PIN de 4 digitos
|
||||
- JWT con refresh tokens
|
||||
- Roles basicos (owner/employee/viewer)
|
||||
- Logout y revocacion de sesiones
|
||||
|
||||
### Excluido
|
||||
- OAuth (Google, Facebook) - fase posterior
|
||||
- 2FA via TOTP - fase posterior
|
||||
- SSO empresarial
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Registro Inicial
|
||||
```
|
||||
1. Usuario ingresa telefono
|
||||
2. Se envia OTP via SMS/WhatsApp
|
||||
3. Usuario verifica OTP
|
||||
4. Usuario configura PIN de 4 digitos
|
||||
5. Se crea tenant automaticamente (para owners)
|
||||
6. Usuario accede al dashboard
|
||||
```
|
||||
|
||||
### Login Subsecuente
|
||||
```
|
||||
1. Usuario ingresa telefono
|
||||
2. Usuario ingresa PIN de 4 digitos
|
||||
- O usa biometrico si esta configurado
|
||||
3. JWT generado
|
||||
4. Acceso al sistema
|
||||
```
|
||||
|
||||
### Login por OTP (sin PIN)
|
||||
```
|
||||
1. Usuario selecciona "Olvide mi PIN"
|
||||
2. Se envia OTP
|
||||
3. Usuario verifica OTP
|
||||
4. Puede reconfigurrar PIN
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: auth)
|
||||
- `users`: id, tenant_id, phone, email, password_hash, name, role, pin_hash, status
|
||||
- `sessions`: id, user_id, token, device_info, expires_at, revoked_at
|
||||
- `roles`: id, tenant_id, name, permissions (JSONB)
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /auth/register | Registro nuevo usuario |
|
||||
| POST | /auth/send-otp | Enviar OTP a telefono |
|
||||
| POST | /auth/verify-otp | Verificar OTP |
|
||||
| POST | /auth/set-pin | Configurar PIN |
|
||||
| POST | /auth/login | Login con telefono + PIN |
|
||||
| POST | /auth/login-otp | Login solo con OTP |
|
||||
| GET | /auth/me | Usuario actual |
|
||||
| POST | /auth/refresh | Renovar JWT |
|
||||
| POST | /auth/logout | Cerrar sesion |
|
||||
| DELETE | /auth/sessions | Revocar todas las sesiones |
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| DDL auth schema | Completado | `04-auth.sql` |
|
||||
| auth.module.ts | Completado | `modules/auth/` |
|
||||
| JwtStrategy | Completado | `strategies/jwt.strategy.ts` |
|
||||
| Guards | Completado | `guards/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-001 (Infraestructura)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-003 (Productos)
|
||||
- MCH-004 (POS)
|
||||
- Todos los modulos que requieren auth
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] Registro con telefono funcional
|
||||
- [x] OTP se envia correctamente
|
||||
- [x] PIN de 4 digitos funciona
|
||||
- [x] JWT se genera y valida
|
||||
- [x] Roles owner/employee/viewer funcionan
|
||||
- [x] Sesiones se pueden revocar
|
||||
|
||||
## Configuracion
|
||||
|
||||
```typescript
|
||||
// JWT Config
|
||||
{
|
||||
secret: process.env.JWT_SECRET,
|
||||
expiresIn: '7d',
|
||||
refreshExpiresIn: '30d'
|
||||
}
|
||||
|
||||
// OTP Config
|
||||
{
|
||||
length: 6,
|
||||
expiresIn: '5m',
|
||||
maxAttempts: 3
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
133
docs/01-epicas/MCH-003-catalogo-productos.md
Normal file
133
docs/01-epicas/MCH-003-catalogo-productos.md
Normal file
@ -0,0 +1,133 @@
|
||||
# MCH-003: Catalogo de Productos
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-003
|
||||
- **Fase:** 1 - MVP Core
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** Completado
|
||||
- **Fecha inicio:** 2026-01-05
|
||||
- **Fecha fin:** 2026-01-06
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de gestion de catalogo de productos para micro-negocios: categorias jerarquicas, productos con variantes, codigos de barras, imagenes, y precios con costo para calcular margen.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. CRUD de categorias con jerarquia
|
||||
2. CRUD de productos con atributos completos
|
||||
3. Soporte para variantes de producto
|
||||
4. Busqueda por codigo de barras
|
||||
5. Calculo automatico de margen
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Categorias con parent_id (jerarquia)
|
||||
- Productos con SKU, barcode, precio, costo
|
||||
- Variantes de producto (tallas, colores)
|
||||
- Imagenes de producto
|
||||
- Busqueda por nombre, SKU, barcode
|
||||
- Activar/desactivar productos
|
||||
|
||||
### Excluido
|
||||
- Productos compuestos (kits) - fase posterior
|
||||
- Precios por volumen - fase posterior
|
||||
- Multiples listas de precios
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: catalog)
|
||||
|
||||
**categories**
|
||||
- id, tenant_id, name, parent_id, image_url, sort_order, active
|
||||
|
||||
**products**
|
||||
- id, tenant_id, category_id, sku, name, description
|
||||
- price, cost, tax_rate, image_url, barcode
|
||||
- track_inventory, min_stock, status
|
||||
|
||||
**product_variants**
|
||||
- id, product_id, name, sku, price, attributes (JSONB)
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /categories | Listar categorias |
|
||||
| GET | /categories/:id | Obtener categoria |
|
||||
| POST | /categories | Crear categoria |
|
||||
| PUT | /categories/:id | Actualizar categoria |
|
||||
| DELETE | /categories/:id | Eliminar categoria |
|
||||
| GET | /products | Listar productos |
|
||||
| GET | /products/:id | Obtener producto |
|
||||
| POST | /products | Crear producto |
|
||||
| PUT | /products/:id | Actualizar producto |
|
||||
| DELETE | /products/:id | Eliminar producto |
|
||||
| GET | /products/search | Buscar productos |
|
||||
| GET | /products/barcode/:code | Buscar por barcode |
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Crear Producto Rapido
|
||||
```
|
||||
1. Dueno abre "Nuevo Producto"
|
||||
2. Ingresa nombre y precio
|
||||
3. Opcionalmente: foto, categoria, costo
|
||||
4. Guarda
|
||||
5. Producto disponible en POS
|
||||
```
|
||||
|
||||
### Escanear Codigo de Barras
|
||||
```
|
||||
1. Dueno escanea codigo con camara
|
||||
2. Sistema busca en BD
|
||||
3. Si existe: muestra producto
|
||||
4. Si no existe: ofrece crear nuevo
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| DDL catalog schema | Completado | `05-catalog.sql` |
|
||||
| categories.module | Completado | `modules/categories/` |
|
||||
| products.module | Completado | `modules/products/` |
|
||||
| Components FE | Completado | `components/products/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-001 (Infraestructura)
|
||||
- MCH-002 (Auth)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-004 (POS)
|
||||
- MCH-007 (Templates)
|
||||
- MCH-009 (Predicciones)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] CRUD categorias funcional
|
||||
- [x] CRUD productos funcional
|
||||
- [x] Variantes de producto funcionan
|
||||
- [x] Busqueda por barcode funciona
|
||||
- [x] Imagenes se guardan correctamente
|
||||
- [x] Margen se calcula (precio - costo)
|
||||
|
||||
## UI Components
|
||||
|
||||
### ProductList
|
||||
- Tabla con: imagen, nombre, precio, stock, acciones
|
||||
- Filtros por categoria, estado
|
||||
- Busqueda por nombre/SKU
|
||||
|
||||
### ProductForm
|
||||
- Campos: nombre, precio, costo, categoria
|
||||
- Upload de imagen
|
||||
- Codigo de barras (manual o escaner)
|
||||
- Toggle track_inventory
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
159
docs/01-epicas/MCH-004-punto-venta.md
Normal file
159
docs/01-epicas/MCH-004-punto-venta.md
Normal file
@ -0,0 +1,159 @@
|
||||
# MCH-004: Punto de Venta Basico
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-004
|
||||
- **Fase:** 1 - MVP Core
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** Completado
|
||||
- **Fecha inicio:** 2026-01-06
|
||||
- **Fecha fin:** 2026-01-06
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de punto de venta (POS) optimizado para micro-negocios: interfaz tactil rapida, carrito de compra, multiples metodos de pago, generacion de tickets, y registro de ventas.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Grid de productos tactil
|
||||
2. Carrito con modificacion de cantidades
|
||||
3. Multiples metodos de pago
|
||||
4. Generacion de ticket/recibo
|
||||
5. Historial de ventas del dia
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Grid de productos por categoria
|
||||
- Carrito con +/- cantidad
|
||||
- Descuentos por item o total
|
||||
- Metodos: efectivo, tarjeta, fiado
|
||||
- Ticket imprimible/compartible
|
||||
- Reporte diario de ventas
|
||||
|
||||
### Excluido
|
||||
- Ventas con factura fiscal - MCH-027
|
||||
- Pagos parciales mixtos - fase posterior
|
||||
- Mesas/comandas (restaurante) - vertical separada
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: sales)
|
||||
|
||||
**sales**
|
||||
- id, tenant_id, user_id, customer_id
|
||||
- subtotal, tax, discount, total
|
||||
- payment_method, payment_reference
|
||||
- status (completed/voided), notes, created_at
|
||||
|
||||
**sale_items**
|
||||
- id, sale_id, product_id, quantity
|
||||
- unit_price, discount, total
|
||||
|
||||
**payment_methods**
|
||||
- id, tenant_id, name, type, settings, active
|
||||
|
||||
**cash_registers**
|
||||
- id, tenant_id, name, opening_balance, current_balance, status
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /sales | Listar ventas |
|
||||
| GET | /sales/:id | Obtener venta |
|
||||
| POST | /sales | Registrar venta |
|
||||
| POST | /sales/:id/void | Cancelar venta |
|
||||
| GET | /sales/daily-report | Reporte del dia |
|
||||
| GET | /sales/by-date | Ventas por rango |
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Venta Rapida
|
||||
```
|
||||
1. Empleado abre POS
|
||||
2. Selecciona productos del grid
|
||||
- O escanea codigo de barras
|
||||
3. Ajusta cantidades si necesario
|
||||
4. Aplica descuento (opcional)
|
||||
5. Selecciona metodo de pago
|
||||
6. Si efectivo: ingresa monto recibido
|
||||
7. Sistema calcula cambio
|
||||
8. Genera ticket
|
||||
9. Venta registrada
|
||||
```
|
||||
|
||||
### Venta a Credito (Fiado)
|
||||
```
|
||||
1. Empleado agrega productos
|
||||
2. Selecciona cliente existente
|
||||
3. Elige "Fiado" como pago
|
||||
4. Sistema verifica limite de credito
|
||||
5. Si aprobado: registra venta
|
||||
6. Actualiza saldo del cliente
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| DDL sales schema | Completado | `06-sales.sql` |
|
||||
| sales.module | Completado | `modules/sales/` |
|
||||
| POS.tsx | Completado | `pages/POS.tsx` |
|
||||
| Cart component | Completado | `components/pos/Cart.tsx` |
|
||||
| PaymentModal | Completado | `components/pos/PaymentModal.tsx` |
|
||||
| ReceiptModal | Completado | `components/pos/ReceiptModal.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-001 (Infraestructura)
|
||||
- MCH-002 (Auth)
|
||||
- MCH-003 (Productos)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-005 (Pagos)
|
||||
- MCH-008 (Fiados)
|
||||
- MCH-009 (Predicciones)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] Grid de productos carga correctamente
|
||||
- [x] Carrito funciona (agregar/quitar/cantidad)
|
||||
- [x] Descuentos se aplican correctamente
|
||||
- [x] Pago en efectivo con cambio
|
||||
- [x] Ticket se genera con todos los datos
|
||||
- [x] Historial de ventas funcional
|
||||
|
||||
## UI Components
|
||||
|
||||
### POS Page
|
||||
- Grid de productos (izquierda)
|
||||
- Carrito (derecha)
|
||||
- Barra de busqueda/escaneo
|
||||
|
||||
### ProductGrid
|
||||
- Productos como cards con imagen
|
||||
- Categorias como tabs
|
||||
- Click para agregar al carrito
|
||||
|
||||
### Cart
|
||||
- Lista de items con cantidad
|
||||
- Botones +/- por item
|
||||
- Total, descuento, impuesto
|
||||
- Boton "Cobrar"
|
||||
|
||||
### PaymentModal
|
||||
- Metodos de pago disponibles
|
||||
- Campo monto recibido (efectivo)
|
||||
- Calculo de cambio
|
||||
- Boton confirmar
|
||||
|
||||
### ReceiptModal
|
||||
- Datos del negocio
|
||||
- Lista de productos
|
||||
- Totales
|
||||
- Botones: imprimir, compartir, cerrar
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
170
docs/01-epicas/MCH-005-integraciones-pago.md
Normal file
170
docs/01-epicas/MCH-005-integraciones-pago.md
Normal file
@ -0,0 +1,170 @@
|
||||
# MCH-005: Integraciones de Pago
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-005
|
||||
- **Fase:** 1 - MVP Core
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** Completado
|
||||
- **Fecha inicio:** 2026-01-06
|
||||
- **Fecha fin:** 2026-01-07
|
||||
|
||||
## Descripcion
|
||||
|
||||
Integracion con proveedores de pago populares en Mexico para aceptar pagos con tarjeta: Mercado Pago (lector bluetooth), Clip, y efectivo. Soporte para suscripciones via Stripe.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Integracion Mercado Pago Point
|
||||
2. Integracion Clip
|
||||
3. Registro de pagos en efectivo
|
||||
4. Stripe para suscripciones
|
||||
5. Conciliacion de pagos
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Mercado Pago Point (lector bluetooth)
|
||||
- Clip (terminal)
|
||||
- Efectivo (registro manual)
|
||||
- Stripe (suscripciones y OXXO)
|
||||
- Webhooks para confirmacion
|
||||
|
||||
### Excluido
|
||||
- CoDi/SPEI - MCH-024
|
||||
- Pagos QR propios - fase posterior
|
||||
- Terminales bancarias tradicionales
|
||||
|
||||
## Proveedores
|
||||
|
||||
### Mercado Pago
|
||||
- **Uso:** Pagos con tarjeta en tienda
|
||||
- **Hardware:** Point Bluetooth
|
||||
- **Comision:** ~3.5%
|
||||
- **Integracion:** SDK + Webhooks
|
||||
|
||||
### Clip
|
||||
- **Uso:** Pagos con tarjeta en tienda
|
||||
- **Hardware:** Terminal Clip
|
||||
- **Comision:** ~3.6%
|
||||
- **Integracion:** SDK + Webhooks
|
||||
|
||||
### Stripe
|
||||
- **Uso:** Suscripciones, pagos en linea, OXXO
|
||||
- **Comision:** ~3.6% + $3 MXN
|
||||
- **Integracion:** API + Webhooks
|
||||
|
||||
### Efectivo
|
||||
- **Uso:** Pagos en efectivo
|
||||
- **Registro:** Manual en POS
|
||||
- **Control:** Corte de caja
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /payments/intent | Crear intencion de pago |
|
||||
| POST | /payments/confirm | Confirmar pago |
|
||||
| GET | /payments/:id | Obtener pago |
|
||||
| POST | /payments/webhook | Webhook de proveedores |
|
||||
| GET | /payments/methods | Metodos disponibles |
|
||||
|
||||
## Flujos de Pago
|
||||
|
||||
### Pago con Tarjeta (MercadoPago/Clip)
|
||||
```
|
||||
1. Venta creada en POS
|
||||
2. Empleado selecciona "Tarjeta"
|
||||
3. Se envia monto a terminal
|
||||
4. Cliente pasa tarjeta
|
||||
5. Webhook confirma pago
|
||||
6. Venta marcada como pagada
|
||||
7. Ticket generado
|
||||
```
|
||||
|
||||
### Pago en Efectivo
|
||||
```
|
||||
1. Venta creada en POS
|
||||
2. Empleado selecciona "Efectivo"
|
||||
3. Ingresa monto recibido
|
||||
4. Sistema calcula cambio
|
||||
5. Venta registrada
|
||||
6. Actualiza caja
|
||||
```
|
||||
|
||||
### Pago OXXO (Stripe)
|
||||
```
|
||||
1. Cliente solicita pago en OXXO
|
||||
2. Sistema genera referencia Stripe
|
||||
3. Se muestra codigo de barras
|
||||
4. Cliente paga en OXXO
|
||||
5. Webhook confirma (24-48h)
|
||||
6. Pedido/suscripcion activada
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas
|
||||
|
||||
**payments** (en sales schema)
|
||||
- id, sale_id, provider, amount
|
||||
- reference, status, metadata
|
||||
- created_at, confirmed_at
|
||||
|
||||
**payment_methods** (por tenant)
|
||||
- id, tenant_id, provider, credentials
|
||||
- settings, active
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| payments.module | Completado | `modules/payments/` |
|
||||
| stripe.provider | Completado | `providers/stripe.provider.ts` |
|
||||
| mercadopago.provider | Completado | `providers/mercadopago.provider.ts` |
|
||||
| PaymentModal | Completado | `components/pos/PaymentModal.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-001 (Infraestructura)
|
||||
- MCH-002 (Auth)
|
||||
- MCH-004 (POS)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-018 (Suscripciones)
|
||||
- MCH-020 (Pagos online)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] Mercado Pago procesa pagos
|
||||
- [x] Webhooks se reciben correctamente
|
||||
- [x] Efectivo registra correctamente
|
||||
- [x] Stripe funciona para suscripciones
|
||||
- [x] Conciliacion de pagos funciona
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
// tenant_integrations
|
||||
{
|
||||
provider: 'mercadopago',
|
||||
credentials: {
|
||||
access_token: 'encrypted...',
|
||||
public_key: '...'
|
||||
},
|
||||
settings: {
|
||||
point_device_id: '...'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Seguridad
|
||||
|
||||
- Credenciales encriptadas en BD
|
||||
- Webhooks verificados con firma
|
||||
- Logs de todas las transacciones
|
||||
- PCI compliance delegado a proveedores
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
144
docs/01-epicas/MCH-006-onboarding-inteligente.md
Normal file
144
docs/01-epicas/MCH-006-onboarding-inteligente.md
Normal file
@ -0,0 +1,144 @@
|
||||
# MCH-006: Onboarding Inteligente
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-006
|
||||
- **Fase:** 2 - Inteligencia
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 5-6
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de onboarding conversacional via WhatsApp que permite a los duenos configurar su negocio enviando fotos de productos, notas de voz con precios, y seleccionando templates pre-cargados de proveedores comunes.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Onboarding conversacional via WhatsApp
|
||||
2. Carga de productos via fotos
|
||||
3. Precios via notas de voz
|
||||
4. Templates de proveedores comunes
|
||||
5. Setup guiado paso a paso
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Flujo conversacional en WhatsApp
|
||||
- OCR de etiquetas de precio
|
||||
- Transcripcion de audio (precios)
|
||||
- Templates de productos (Sabritas, Coca-Cola, etc.)
|
||||
- Wizard web alternativo
|
||||
|
||||
### Excluido
|
||||
- Onboarding via app movil (fase posterior)
|
||||
- Importacion masiva CSV
|
||||
- Integracion con mayoristas
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Onboarding via WhatsApp
|
||||
```
|
||||
1. Dueno recibe mensaje de bienvenida
|
||||
2. Bot pregunta nombre del negocio
|
||||
3. Bot pregunta giro (abarrotes, papeleria, etc.)
|
||||
4. Bot sugiere template de productos
|
||||
5. Dueno confirma o ajusta
|
||||
6. Bot pide foto de productos adicionales
|
||||
7. OCR extrae nombre/precio
|
||||
8. Dueno confirma/corrige via audio
|
||||
9. Productos agregados al catalogo
|
||||
```
|
||||
|
||||
### Carga de Producto por Foto
|
||||
```
|
||||
1. Dueno envia foto de producto
|
||||
2. OCR detecta:
|
||||
- Nombre del producto
|
||||
- Codigo de barras
|
||||
- Precio en etiqueta
|
||||
3. Bot muestra: "Coca-Cola 600ml - $18?"
|
||||
4. Dueno responde "Si" o corrige
|
||||
5. Producto creado
|
||||
```
|
||||
|
||||
### Carga de Precio por Audio
|
||||
```
|
||||
1. Dueno envia nota de voz
|
||||
2. Whisper transcribe: "Sabritas a 15, Coca a 18"
|
||||
3. Bot interpreta y confirma
|
||||
4. Productos actualizados
|
||||
```
|
||||
|
||||
## Componentes Tecnicos
|
||||
|
||||
### OCR Pipeline
|
||||
- Google Vision API / Tesseract
|
||||
- Deteccion de codigos de barras
|
||||
- Extraccion de texto de etiquetas
|
||||
- Matching con catalogo de productos conocidos
|
||||
|
||||
### Transcripcion
|
||||
- Whisper API
|
||||
- NLU para extraer entidades (producto, precio)
|
||||
- Confirmacion interactiva
|
||||
|
||||
### Templates
|
||||
- Catalogos pre-cargados de:
|
||||
- Sabritas (snacks)
|
||||
- Coca-Cola/Pepsi (bebidas)
|
||||
- Bimbo (pan)
|
||||
- Marinela (galletas)
|
||||
- Productos genericos por giro
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas Adicionales
|
||||
|
||||
**onboarding_sessions**
|
||||
- id, tenant_id, status, current_step
|
||||
- started_at, completed_at, metadata
|
||||
|
||||
**product_templates**
|
||||
- id, giro, provider, name, sku
|
||||
- default_price, image_url, barcode
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| onboarding.module | Pendiente | `modules/onboarding/` |
|
||||
| OCR service | Pendiente | `services/ocr.service.ts` |
|
||||
| Whisper service | Pendiente | `services/whisper.service.ts` |
|
||||
| Templates seed | Pendiente | `seeds/product-templates/` |
|
||||
| WhatsApp flows | Pendiente | `whatsapp-service/flows/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-002 (Auth)
|
||||
- MCH-003 (Productos)
|
||||
- MCH-007 (Templates)
|
||||
- MCH-011 (WhatsApp Service)
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno (mejora de UX)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Flujo WhatsApp funciona end-to-end
|
||||
- [ ] OCR detecta productos con >80% precision
|
||||
- [ ] Audio se transcribe correctamente
|
||||
- [ ] Templates se cargan rapidamente
|
||||
- [ ] Dueno puede completar setup en <10 min
|
||||
|
||||
## Metricas de Exito
|
||||
|
||||
| Metrica | Objetivo |
|
||||
|---------|----------|
|
||||
| Tiempo de onboarding | < 10 minutos |
|
||||
| Productos cargados | > 20 en primera sesion |
|
||||
| Precision OCR | > 80% |
|
||||
| Abandono | < 20% |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
173
docs/01-epicas/MCH-007-templates-catalogos.md
Normal file
173
docs/01-epicas/MCH-007-templates-catalogos.md
Normal file
@ -0,0 +1,173 @@
|
||||
# MCH-007: Templates y Catalogos
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-007
|
||||
- **Fase:** 2 - Inteligencia
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** En Progreso
|
||||
- **Fecha inicio:** 2026-01-07
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de templates pre-cargados con productos de proveedores comunes en Mexico (Sabritas, Coca-Cola, Bimbo, etc.) organizados por giro de negocio para acelerar el setup inicial.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Catalogos de productos por proveedor
|
||||
2. Templates por giro de negocio
|
||||
3. Precios sugeridos actualizados
|
||||
4. Imagenes de productos
|
||||
5. Codigos de barras correctos
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Catalogo Sabritas/PepsiCo
|
||||
- Catalogo Coca-Cola FEMSA
|
||||
- Catalogo Bimbo/Marinela
|
||||
- Catalogo Gamesa
|
||||
- Catalogo productos genericos
|
||||
- Giros: abarrotes, papeleria, farmacia, ferreteria
|
||||
|
||||
### Excluido
|
||||
- Integracion en tiempo real con mayoristas
|
||||
- Precios automaticos (requiere acuerdo)
|
||||
- Productos frescos/perecederos
|
||||
|
||||
## Estructura de Templates
|
||||
|
||||
### Por Proveedor
|
||||
```
|
||||
templates/
|
||||
├── proveedores/
|
||||
│ ├── sabritas/
|
||||
│ │ ├── metadata.json
|
||||
│ │ └── productos.json (150+ SKUs)
|
||||
│ ├── coca-cola/
|
||||
│ │ ├── metadata.json
|
||||
│ │ └── productos.json (100+ SKUs)
|
||||
│ ├── bimbo/
|
||||
│ ├── marinela/
|
||||
│ └── gamesa/
|
||||
└── giros/
|
||||
├── abarrotes.json
|
||||
├── papeleria.json
|
||||
├── farmacia.json
|
||||
└── ferreteria.json
|
||||
```
|
||||
|
||||
### Por Giro de Negocio
|
||||
```json
|
||||
// giros/abarrotes.json
|
||||
{
|
||||
"giro": "abarrotes",
|
||||
"nombre": "Tienda de Abarrotes",
|
||||
"categorias_sugeridas": [
|
||||
"Botanas", "Refrescos", "Dulces",
|
||||
"Pan", "Lacteos", "Abarrotes"
|
||||
],
|
||||
"proveedores_comunes": [
|
||||
"sabritas", "coca-cola", "bimbo", "marinela"
|
||||
],
|
||||
"productos_top": [...]
|
||||
}
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas
|
||||
|
||||
**product_templates** (global, sin tenant)
|
||||
- id, provider, giro, category
|
||||
- sku, name, description, barcode
|
||||
- suggested_price, image_url
|
||||
- metadata (JSONB), active
|
||||
|
||||
**template_imports** (por tenant)
|
||||
- id, tenant_id, template_id
|
||||
- imported_at, products_count
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /templates/giros | Listar giros |
|
||||
| GET | /templates/giros/:giro | Productos de un giro |
|
||||
| GET | /templates/providers | Listar proveedores |
|
||||
| GET | /templates/providers/:provider | Productos de proveedor |
|
||||
| POST | /templates/import | Importar template a tenant |
|
||||
| GET | /templates/search | Buscar en templates |
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Seleccionar Template al Onboarding
|
||||
```
|
||||
1. Sistema detecta giro del negocio
|
||||
2. Muestra templates sugeridos
|
||||
3. Dueno selecciona proveedores
|
||||
4. Productos se importan al catalogo
|
||||
5. Dueno ajusta precios si necesario
|
||||
```
|
||||
|
||||
### Agregar Producto desde Template
|
||||
```
|
||||
1. Dueno busca producto en POS
|
||||
2. No existe en su catalogo
|
||||
3. Sistema busca en templates
|
||||
4. Muestra "Coca-Cola 600ml - Agregar?"
|
||||
5. Dueno confirma
|
||||
6. Producto agregado con imagen y barcode
|
||||
```
|
||||
|
||||
## Datos de Templates
|
||||
|
||||
### Sabritas (ejemplo)
|
||||
| SKU | Producto | Barcode | Precio Sugerido |
|
||||
|-----|----------|---------|-----------------|
|
||||
| SAB001 | Sabritas Original 45g | 7501011111111 | $18 |
|
||||
| SAB002 | Doritos Nacho 62g | 7501011111112 | $22 |
|
||||
| SAB003 | Cheetos Flamin Hot 52g | 7501011111113 | $20 |
|
||||
| SAB004 | Ruffles Queso 50g | 7501011111114 | $20 |
|
||||
|
||||
### Coca-Cola (ejemplo)
|
||||
| SKU | Producto | Barcode | Precio Sugerido |
|
||||
|-----|----------|---------|-----------------|
|
||||
| CC001 | Coca-Cola 600ml | 7501055300000 | $18 |
|
||||
| CC002 | Coca-Cola 2L | 7501055300001 | $35 |
|
||||
| CC003 | Sprite 600ml | 7501055300002 | $18 |
|
||||
| CC004 | Fanta 600ml | 7501055300003 | $18 |
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| templates.module | En progreso | `modules/templates/` |
|
||||
| Seeds Sabritas | Pendiente | `seeds/templates/sabritas.json` |
|
||||
| Seeds Coca-Cola | Pendiente | `seeds/templates/coca-cola.json` |
|
||||
| Seeds Bimbo | Pendiente | `seeds/templates/bimbo.json` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-003 (Productos)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-006 (Onboarding)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] 500+ productos en templates
|
||||
- [ ] Imagenes de alta calidad
|
||||
- [ ] Barcodes correctos y verificados
|
||||
- [ ] Precios actualizados (2026)
|
||||
- [ ] Import rapido (<5 seg para 100 productos)
|
||||
|
||||
## Actualizacion de Precios
|
||||
|
||||
- Frecuencia: Trimestral
|
||||
- Fuente: Precios de lista de proveedores
|
||||
- Nota: Son precios sugeridos, dueno puede ajustar
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
165
docs/01-epicas/MCH-008-sistema-fiados.md
Normal file
165
docs/01-epicas/MCH-008-sistema-fiados.md
Normal file
@ -0,0 +1,165 @@
|
||||
# MCH-008: Sistema de Fiados
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-008
|
||||
- **Fase:** 2 - Inteligencia
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** En Progreso
|
||||
- **Fecha inicio:** 2026-01-07
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de credito informal ("fiados") tradicional en Mexico: permite a clientes frecuentes comprar a credito con limites personalizados, recordatorios automaticos de pago, y registro de abonos.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Cuentas de credito por cliente
|
||||
2. Limites de credito configurables
|
||||
3. Registro de compras a credito
|
||||
4. Registro de abonos/pagos
|
||||
5. Recordatorios automaticos via WhatsApp
|
||||
6. Reporte de cartera
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Habilitar credito por cliente
|
||||
- Limite de credito configurable
|
||||
- Ventas a credito desde POS
|
||||
- Abonos parciales o totales
|
||||
- Historial de movimientos
|
||||
- Recordatorios via WhatsApp
|
||||
- Bloqueo automatico por limite
|
||||
|
||||
### Excluido
|
||||
- Intereses por mora
|
||||
- Scoring crediticio
|
||||
- Reportes a buro de credito
|
||||
- Contratos formales
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: customers)
|
||||
|
||||
**credit_accounts**
|
||||
- id, customer_id, credit_limit
|
||||
- current_balance, status (active/blocked/closed)
|
||||
- created_at, last_payment_at
|
||||
|
||||
**credit_transactions**
|
||||
- id, credit_account_id, type (charge/payment)
|
||||
- amount, sale_id (si es cargo), notes
|
||||
- created_at, created_by
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /customers/:id/credit | Estado de cuenta |
|
||||
| POST | /customers/:id/credit/enable | Habilitar credito |
|
||||
| PUT | /customers/:id/credit/limit | Ajustar limite |
|
||||
| POST | /customers/:id/credit/payment | Registrar abono |
|
||||
| GET | /customers/:id/credit/history | Historial |
|
||||
| GET | /credit/portfolio | Cartera total |
|
||||
| GET | /credit/overdue | Clientes con adeudo |
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Habilitar Credito
|
||||
```
|
||||
1. Dueno abre ficha del cliente
|
||||
2. Activa "Habilitar fiado"
|
||||
3. Define limite (ej: $500)
|
||||
4. Cliente puede comprar a credito
|
||||
```
|
||||
|
||||
### Venta a Credito
|
||||
```
|
||||
1. Empleado crea venta en POS
|
||||
2. Selecciona cliente con credito
|
||||
3. Elige "Fiado" como pago
|
||||
4. Sistema verifica:
|
||||
- Credito habilitado
|
||||
- Saldo + venta <= limite
|
||||
5. Si OK: registra venta
|
||||
6. Actualiza saldo del cliente
|
||||
```
|
||||
|
||||
### Registrar Abono
|
||||
```
|
||||
1. Cliente llega a pagar
|
||||
2. Dueno abre cuenta del cliente
|
||||
3. Registra abono (monto)
|
||||
4. Sistema actualiza saldo
|
||||
5. Genera recibo de pago
|
||||
```
|
||||
|
||||
### Recordatorio Automatico
|
||||
```
|
||||
1. Cron diario revisa cuentas
|
||||
2. Identifica clientes con saldo > X dias
|
||||
3. Envia WhatsApp:
|
||||
"Hola [nombre], tienes un saldo de $X
|
||||
en [negocio]. Pasa a ponerte al corriente!"
|
||||
4. Registra envio de recordatorio
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
### CreditHistory
|
||||
- Lista de movimientos (cargos/abonos)
|
||||
- Saldo actual
|
||||
- Grafica de historial
|
||||
- Filtros por fecha
|
||||
|
||||
### CreditDashboard
|
||||
- Total cartera
|
||||
- Clientes con adeudo
|
||||
- Promedio de dias de pago
|
||||
- Alertas de limite
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| DDL credit | Completado | `08-customers.sql` |
|
||||
| fiados.module | En progreso | `modules/fiados/` |
|
||||
| CreditHistory.tsx | En progreso | `components/customers/` |
|
||||
| WhatsApp reminder | Pendiente | `whatsapp-service/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-002 (Auth)
|
||||
- MCH-004 (POS)
|
||||
- MCH-014 (Clientes)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-017 (Notificaciones)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Credito se habilita/deshabilita por cliente
|
||||
- [ ] Limite de credito funciona
|
||||
- [ ] Ventas a credito descuentan del disponible
|
||||
- [ ] Abonos se registran correctamente
|
||||
- [ ] Recordatorios se envian via WhatsApp
|
||||
- [ ] Reporte de cartera funciona
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
{
|
||||
fiados: {
|
||||
enabled: true,
|
||||
default_limit: 500,
|
||||
max_limit: 5000,
|
||||
reminder_days: [7, 14, 30],
|
||||
auto_block_days: 60
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
177
docs/01-epicas/MCH-009-prediccion-inventario.md
Normal file
177
docs/01-epicas/MCH-009-prediccion-inventario.md
Normal file
@ -0,0 +1,177 @@
|
||||
# MCH-009: Prediccion de Inventario
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-009
|
||||
- **Fase:** 2 - Inteligencia
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 6-7
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de prediccion de inventario basado en historico de ventas: alertas de stock bajo, sugerencias de reabastecimiento, prediccion de demanda, y deteccion de productos de lento movimiento.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Alertas de stock bajo
|
||||
2. Prediccion de demanda semanal
|
||||
3. Sugerencias de pedido a proveedor
|
||||
4. Deteccion de productos sin movimiento
|
||||
5. Dias de inventario estimados
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Alerta cuando stock < min_stock
|
||||
- Prediccion basada en promedio movil
|
||||
- Calculo de punto de reorden
|
||||
- Lista de sugerencias de compra
|
||||
- Productos sin venta en X dias
|
||||
|
||||
### Excluido
|
||||
- ML avanzado (LSTM, Prophet)
|
||||
- Integracion automatica con proveedores
|
||||
- Pedidos automaticos
|
||||
|
||||
## Algoritmos
|
||||
|
||||
### Prediccion de Demanda
|
||||
```
|
||||
Promedio Movil Ponderado (4 semanas)
|
||||
- Semana -1: peso 0.4
|
||||
- Semana -2: peso 0.3
|
||||
- Semana -3: peso 0.2
|
||||
- Semana -4: peso 0.1
|
||||
|
||||
Demanda_estimada = Σ(ventas_semana * peso)
|
||||
```
|
||||
|
||||
### Punto de Reorden
|
||||
```
|
||||
Punto_reorden = (Demanda_diaria * Lead_time) + Stock_seguridad
|
||||
|
||||
Donde:
|
||||
- Demanda_diaria = Demanda_semanal / 7
|
||||
- Lead_time = dias para recibir pedido (default: 3)
|
||||
- Stock_seguridad = Demanda_diaria * 2
|
||||
```
|
||||
|
||||
### Dias de Inventario
|
||||
```
|
||||
Dias_inventario = Stock_actual / Demanda_diaria
|
||||
```
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /inventory/low-stock | Productos bajo minimo |
|
||||
| GET | /inventory/predictions | Predicciones de demanda |
|
||||
| GET | /inventory/reorder-suggestions | Sugerencias de pedido |
|
||||
| GET | /inventory/slow-moving | Productos sin movimiento |
|
||||
| GET | /inventory/days-on-hand | Dias de inventario |
|
||||
| GET | /inventory/analytics | Dashboard completo |
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas Adicionales
|
||||
|
||||
**inventory_predictions** (cache)
|
||||
- id, product_id, period_start, period_end
|
||||
- predicted_demand, confidence
|
||||
- calculated_at
|
||||
|
||||
**reorder_suggestions**
|
||||
- id, tenant_id, product_id
|
||||
- current_stock, suggested_quantity
|
||||
- priority, status, created_at
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Alerta de Stock Bajo
|
||||
```
|
||||
1. Sistema detecta stock < min_stock
|
||||
2. Genera notificacion push
|
||||
3. Muestra en dashboard
|
||||
4. Dueno revisa y decide
|
||||
```
|
||||
|
||||
### Ver Sugerencias de Pedido
|
||||
```
|
||||
1. Dueno abre "Sugerencias de compra"
|
||||
2. Ve lista ordenada por prioridad
|
||||
3. Cada item muestra:
|
||||
- Producto
|
||||
- Stock actual
|
||||
- Cantidad sugerida
|
||||
- Proveedor (si conocido)
|
||||
4. Puede marcar como "Pedido"
|
||||
```
|
||||
|
||||
### Reporte Semanal
|
||||
```
|
||||
1. Lunes a las 8am
|
||||
2. Sistema genera reporte:
|
||||
- Top 10 productos por venta
|
||||
- Productos a reordenar
|
||||
- Productos sin movimiento
|
||||
3. Envia via WhatsApp al dueno
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
### InventoryDashboard
|
||||
- Grafica de stock vs demanda
|
||||
- Lista de alertas
|
||||
- Indicadores clave
|
||||
|
||||
### ReorderList
|
||||
- Tabla de sugerencias
|
||||
- Filtros por categoria
|
||||
- Accion: marcar como pedido
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| predictions.service | Pendiente | `services/predictions.service.ts` |
|
||||
| inventory.analytics | Pendiente | `modules/inventory/analytics/` |
|
||||
| Dashboard FE | Pendiente | `components/inventory/` |
|
||||
| Cron jobs | Pendiente | `jobs/inventory.jobs.ts` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-003 (Productos)
|
||||
- MCH-004 (POS) - historial de ventas
|
||||
- MCH-007 (Inventory module base)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-012 (Chat LLM puede consultar predicciones)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Alertas de stock bajo funcionan
|
||||
- [ ] Predicciones tienen precision >70%
|
||||
- [ ] Sugerencias de reorden son utiles
|
||||
- [ ] Productos sin movimiento se detectan
|
||||
- [ ] Dashboard muestra info clara
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
{
|
||||
predictions: {
|
||||
enabled: true,
|
||||
low_stock_threshold: 5,
|
||||
lead_time_days: 3,
|
||||
safety_stock_days: 2,
|
||||
slow_moving_days: 30,
|
||||
weekly_report_enabled: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
226
docs/01-epicas/MCH-010-mcp-server.md
Normal file
226
docs/01-epicas/MCH-010-mcp-server.md
Normal file
@ -0,0 +1,226 @@
|
||||
# MCH-010: MCP Server
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-010
|
||||
- **Fase:** 3 - Asistente IA
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** En Progreso
|
||||
- **Fecha inicio:** 2026-01-06
|
||||
|
||||
## Descripcion
|
||||
|
||||
Gateway LLM agnostico usando el protocolo MCP (Model Context Protocol) de Anthropic. Permite conectar multiples proveedores de LLM (Claude, GPT-4, Llama) con tools especificos para el negocio.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Gateway LLM agnostico (OpenRouter)
|
||||
2. Tools MCP para operaciones del negocio
|
||||
3. Contexto por tenant (productos, ventas)
|
||||
4. Rate limiting por tokens
|
||||
5. Logging de conversaciones
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- MCP Server con TypeScript
|
||||
- Tools para: productos, ventas, inventario, clientes
|
||||
- Routing a multiples LLMs via OpenRouter
|
||||
- Contexto del negocio en prompts
|
||||
- Control de consumo de tokens
|
||||
|
||||
### Excluido
|
||||
- Entrenamiento de modelos propios
|
||||
- Fine-tuning
|
||||
- Vision/imagenes (fase posterior)
|
||||
|
||||
## Arquitectura
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ Mobile │ │ WhatsApp │ │ Web │
|
||||
│ App │ │ Service │ │ Dashboard │
|
||||
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
|
||||
│ │ │
|
||||
└───────────────────┼───────────────────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ MCP Server │
|
||||
│ (Gateway) │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌────────────┼────────────┐
|
||||
│ │ │
|
||||
┌──────▼──────┐ ┌───▼───┐ ┌─────▼─────┐
|
||||
│ OpenRouter │ │ Claude│ │ GPT-4 │
|
||||
│ (Default) │ │ API │ │ API │
|
||||
└─────────────┘ └───────┘ └───────────┘
|
||||
```
|
||||
|
||||
## Tools MCP
|
||||
|
||||
### Products
|
||||
```typescript
|
||||
{
|
||||
name: "search_products",
|
||||
description: "Buscar productos en el catalogo",
|
||||
parameters: {
|
||||
query: string,
|
||||
category?: string
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name: "get_product_stock",
|
||||
description: "Obtener stock de un producto",
|
||||
parameters: {
|
||||
product_id: string
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name: "update_product_price",
|
||||
description: "Actualizar precio de producto",
|
||||
parameters: {
|
||||
product_id: string,
|
||||
new_price: number
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Sales
|
||||
```typescript
|
||||
{
|
||||
name: "get_daily_sales",
|
||||
description: "Obtener ventas del dia",
|
||||
parameters: {
|
||||
date?: string
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name: "get_sales_report",
|
||||
description: "Reporte de ventas por periodo",
|
||||
parameters: {
|
||||
start_date: string,
|
||||
end_date: string
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Inventory
|
||||
```typescript
|
||||
{
|
||||
name: "get_low_stock_products",
|
||||
description: "Productos con stock bajo",
|
||||
parameters: {}
|
||||
}
|
||||
|
||||
{
|
||||
name: "get_inventory_value",
|
||||
description: "Valor total del inventario",
|
||||
parameters: {}
|
||||
}
|
||||
```
|
||||
|
||||
### Customers
|
||||
```typescript
|
||||
{
|
||||
name: "search_customers",
|
||||
description: "Buscar clientes",
|
||||
parameters: {
|
||||
query: string
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name: "get_customer_balance",
|
||||
description: "Saldo de fiado de cliente",
|
||||
parameters: {
|
||||
customer_id: string
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /mcp/chat | Enviar mensaje al LLM |
|
||||
| GET | /mcp/tools | Listar tools disponibles |
|
||||
| GET | /mcp/history | Historial de conversacion |
|
||||
| POST | /mcp/feedback | Feedback de respuesta |
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: ai)
|
||||
|
||||
**conversations**
|
||||
- id, tenant_id, user_id, channel
|
||||
- started_at, last_message_at
|
||||
|
||||
**messages**
|
||||
- id, conversation_id, role, content
|
||||
- tokens_used, model, created_at
|
||||
|
||||
**tool_calls**
|
||||
- id, message_id, tool_name
|
||||
- parameters, result, duration_ms
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| MCP Server base | En progreso | `apps/mcp-server/` |
|
||||
| Tools products | Pendiente | `tools/products.tool.ts` |
|
||||
| Tools sales | Pendiente | `tools/sales.tool.ts` |
|
||||
| Tools inventory | Pendiente | `tools/inventory.tool.ts` |
|
||||
| OpenRouter client | En progreso | `clients/openrouter.ts` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-001 (Infraestructura)
|
||||
- MCH-002 (Auth) - para context del tenant
|
||||
- MCH-003 (Productos) - para tools
|
||||
- MCH-004 (Sales) - para tools
|
||||
|
||||
### Bloquea a
|
||||
- MCH-011 (WhatsApp usa MCP)
|
||||
- MCH-012 (Chat dueno)
|
||||
- MCH-013 (Chat cliente)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] MCP Server responde correctamente
|
||||
- [ ] Tools ejecutan operaciones reales
|
||||
- [ ] Contexto del tenant se incluye
|
||||
- [ ] Rate limiting por tokens funciona
|
||||
- [ ] Logs de conversacion completos
|
||||
|
||||
## Configuracion
|
||||
|
||||
```typescript
|
||||
// config/mcp.config.ts
|
||||
{
|
||||
defaultProvider: 'openrouter',
|
||||
providers: {
|
||||
openrouter: {
|
||||
apiKey: process.env.OPENROUTER_API_KEY,
|
||||
defaultModel: 'anthropic/claude-3-haiku'
|
||||
},
|
||||
anthropic: {
|
||||
apiKey: process.env.ANTHROPIC_API_KEY
|
||||
}
|
||||
},
|
||||
maxTokensPerRequest: 4000,
|
||||
maxTokensPerDay: 50000
|
||||
}
|
||||
```
|
||||
|
||||
## Puerto
|
||||
|
||||
- **MCP Server:** 3142
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
219
docs/01-epicas/MCH-011-whatsapp-service.md
Normal file
219
docs/01-epicas/MCH-011-whatsapp-service.md
Normal file
@ -0,0 +1,219 @@
|
||||
# MCH-011: WhatsApp Service
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-011
|
||||
- **Fase:** 3 - Asistente IA
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** En Progreso
|
||||
- **Fecha inicio:** 2026-01-06
|
||||
|
||||
## Descripcion
|
||||
|
||||
Servicio de integracion con WhatsApp Business API de Meta. Permite a los negocios recibir y enviar mensajes, procesar pedidos, enviar notificaciones, y conectar con el asistente IA.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Integracion Meta WhatsApp Business API
|
||||
2. Webhooks para mensajes entrantes
|
||||
3. Envio de mensajes/templates
|
||||
4. Multi-numero por tenant
|
||||
5. Conexion con MCP Server
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- WhatsApp Business API (Cloud)
|
||||
- Recepcion de mensajes (texto, audio, imagen)
|
||||
- Envio de mensajes y templates
|
||||
- Procesamiento via MCP Server
|
||||
- Webhooks verificados
|
||||
- Cola de mensajes (Redis)
|
||||
|
||||
### Excluido
|
||||
- WhatsApp Web (no oficial)
|
||||
- Grupos de WhatsApp
|
||||
- Estados/historias
|
||||
- Llamadas de voz/video
|
||||
|
||||
## Arquitectura
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ Cliente │────▶│ Meta │────▶│ Webhook │
|
||||
│ WhatsApp │◀────│ Cloud API │◀────│ Handler │
|
||||
└─────────────┘ └─────────────┘ └──────┬──────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ Redis │
|
||||
│ (Queue) │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ Processor │
|
||||
│ Worker │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────────────────────────┼──────────────────────────┐
|
||||
│ │ │
|
||||
┌──────▼──────┐ ┌───────▼───────┐ ┌──────▼──────┐
|
||||
│ MCP Server │ │ Backend │ │ Templates │
|
||||
│ (Chat IA) │ │ API │ │ Service │
|
||||
└─────────────┘ └───────────────┘ └─────────────┘
|
||||
```
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /whatsapp/webhook | Webhook de Meta |
|
||||
| GET | /whatsapp/webhook | Verificacion webhook |
|
||||
| POST | /whatsapp/send | Enviar mensaje |
|
||||
| POST | /whatsapp/template | Enviar template |
|
||||
| GET | /whatsapp/conversations | Conversaciones |
|
||||
| GET | /whatsapp/messages/:conversationId | Mensajes |
|
||||
|
||||
## Tipos de Mensaje
|
||||
|
||||
### Entrantes
|
||||
- **text**: Mensaje de texto
|
||||
- **audio**: Nota de voz (se transcribe)
|
||||
- **image**: Imagen (OCR si aplica)
|
||||
- **location**: Ubicacion (para entregas)
|
||||
- **interactive**: Respuesta de botones/lista
|
||||
|
||||
### Salientes
|
||||
- **text**: Mensaje de texto
|
||||
- **template**: Mensaje pre-aprobado
|
||||
- **interactive**: Botones o lista
|
||||
- **media**: Imagen, documento, audio
|
||||
|
||||
## Templates Pre-aprobados
|
||||
|
||||
### Recordatorio de Pago
|
||||
```
|
||||
Hola {{1}}, te recordamos que tienes un saldo
|
||||
pendiente de ${{2}} en {{3}}.
|
||||
¿Cuando podrias pasar a liquidar?
|
||||
```
|
||||
|
||||
### Confirmacion de Pedido
|
||||
```
|
||||
¡Pedido recibido! 🛒
|
||||
|
||||
{{1}}
|
||||
|
||||
Total: ${{2}}
|
||||
Entrega estimada: {{3}}
|
||||
|
||||
¿Confirmas tu pedido?
|
||||
[Si, confirmar] [Cancelar]
|
||||
```
|
||||
|
||||
### Pedido Listo
|
||||
```
|
||||
¡Tu pedido esta listo! 📦
|
||||
|
||||
Puedes pasar a recogerlo a {{1}}
|
||||
o lo enviamos a tu domicilio.
|
||||
|
||||
[Voy para alla] [Enviar a domicilio]
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: messaging)
|
||||
|
||||
**conversations**
|
||||
- id, tenant_id, customer_phone
|
||||
- wa_conversation_id, status
|
||||
- last_message_at, metadata
|
||||
|
||||
**messages**
|
||||
- id, conversation_id, direction (in/out)
|
||||
- type, content, status
|
||||
- wa_message_id, created_at
|
||||
|
||||
## Flujos
|
||||
|
||||
### Mensaje Entrante
|
||||
```
|
||||
1. Meta envia POST a /webhook
|
||||
2. Validamos firma del request
|
||||
3. Extraemos mensaje y metadata
|
||||
4. Encolamos en Redis
|
||||
5. Worker procesa:
|
||||
a. Identifica tenant por numero
|
||||
b. Busca/crea conversacion
|
||||
c. Si es texto: envia a MCP
|
||||
d. Si es audio: transcribe, luego MCP
|
||||
e. Si es imagen: OCR si necesario
|
||||
6. MCP responde con accion
|
||||
7. Enviamos respuesta al cliente
|
||||
```
|
||||
|
||||
### Envio de Notificacion
|
||||
```
|
||||
1. Backend trigger (ej: recordatorio fiado)
|
||||
2. Busca template apropiado
|
||||
3. Llena variables
|
||||
4. POST a Meta API
|
||||
5. Registra en BD
|
||||
6. Espera delivery report
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| WhatsApp Service | En progreso | `apps/whatsapp-service/` |
|
||||
| Webhook handler | En progreso | `handlers/webhook.handler.ts` |
|
||||
| Message processor | Pendiente | `workers/message.worker.ts` |
|
||||
| Template service | Pendiente | `services/template.service.ts` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-001 (Infraestructura)
|
||||
- MCH-002 (Auth)
|
||||
- MCH-010 (MCP Server)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-006 (Onboarding via WhatsApp)
|
||||
- MCH-012 (Chat dueno)
|
||||
- MCH-013 (Chat cliente)
|
||||
- MCH-015 (Pedidos via WhatsApp)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Webhook recibe mensajes correctamente
|
||||
- [ ] Mensajes se procesan via MCP
|
||||
- [ ] Templates se envian correctamente
|
||||
- [ ] Multi-tenant funciona (routing por numero)
|
||||
- [ ] Audio se transcribe correctamente
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
// tenant_integrations
|
||||
{
|
||||
provider: 'whatsapp',
|
||||
credentials: {
|
||||
phone_number_id: '...',
|
||||
access_token: 'encrypted...',
|
||||
verify_token: '...'
|
||||
},
|
||||
settings: {
|
||||
business_name: 'Mi Tiendita',
|
||||
auto_reply: true,
|
||||
ai_enabled: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Puerto
|
||||
|
||||
- **WhatsApp Service:** 3143
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
187
docs/01-epicas/MCH-012-chat-llm-dueno.md
Normal file
187
docs/01-epicas/MCH-012-chat-llm-dueno.md
Normal file
@ -0,0 +1,187 @@
|
||||
# MCH-012: Chat LLM Dueno
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-012
|
||||
- **Fase:** 3 - Asistente IA
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 7-8
|
||||
|
||||
## Descripcion
|
||||
|
||||
Asistente IA conversacional para duenos de negocio: consultas de ventas, inventario, clientes; generacion de reportes; sugerencias de negocio; todo via chat en la app o WhatsApp.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Chat conversacional en app/WhatsApp
|
||||
2. Consultas de ventas y metricas
|
||||
3. Gestion de inventario via chat
|
||||
4. Alertas y sugerencias proactivas
|
||||
5. Generacion de reportes por voz
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- "¿Cuanto vendi hoy/esta semana?"
|
||||
- "¿Cuantas Cocas me quedan?"
|
||||
- "Sube el precio de las Sabritas a $20"
|
||||
- "¿Quien me debe mas?"
|
||||
- "Dame el reporte de la semana"
|
||||
- Alertas: stock bajo, pagos pendientes
|
||||
|
||||
### Excluido
|
||||
- Operaciones bancarias
|
||||
- Gestion de empleados avanzada
|
||||
- Analisis financiero complejo
|
||||
|
||||
## Casos de Uso
|
||||
|
||||
### Consulta de Ventas
|
||||
```
|
||||
Dueno: "¿Cuanto vendi hoy?"
|
||||
Bot: "Hoy llevas $3,450 en 23 ventas.
|
||||
Top productos: Coca-Cola (15), Sabritas (12).
|
||||
Comparado con ayer: +15% 📈"
|
||||
```
|
||||
|
||||
### Consulta de Inventario
|
||||
```
|
||||
Dueno: "¿Tengo Coca de 600?"
|
||||
Bot: "Te quedan 8 Coca-Cola 600ml.
|
||||
Al ritmo actual, duraran ~2 dias.
|
||||
¿Quieres que te recuerde hacer pedido?"
|
||||
```
|
||||
|
||||
### Modificar Precio
|
||||
```
|
||||
Dueno: "Sube las Sabritas a 20 pesos"
|
||||
Bot: "Actualizo precio de Sabritas Original
|
||||
de $18 a $20. ¿Confirmas?"
|
||||
Dueno: "Si"
|
||||
Bot: "Listo, precio actualizado ✓"
|
||||
```
|
||||
|
||||
### Consulta de Fiados
|
||||
```
|
||||
Dueno: "¿Quien me debe mas?"
|
||||
Bot: "Tus clientes con mayor adeudo:
|
||||
1. Juan Perez: $850 (15 dias)
|
||||
2. Maria Lopez: $420 (7 dias)
|
||||
3. Pedro Garcia: $380 (3 dias)
|
||||
¿Quieres enviar recordatorio?"
|
||||
```
|
||||
|
||||
### Reporte Semanal
|
||||
```
|
||||
Dueno: "Dame el reporte de la semana"
|
||||
Bot: "📊 Reporte Semanal (Ene 1-7)
|
||||
|
||||
💰 Ventas: $24,350 (+8% vs anterior)
|
||||
📦 Transacciones: 156
|
||||
🎫 Ticket promedio: $156
|
||||
|
||||
Top 5 productos:
|
||||
1. Coca-Cola 600ml - 89 unidades
|
||||
2. Sabritas - 67 unidades
|
||||
...
|
||||
|
||||
⚠️ 3 productos con stock bajo
|
||||
💳 Cartera por cobrar: $2,150"
|
||||
```
|
||||
|
||||
## Flujo Tecnico
|
||||
|
||||
```
|
||||
1. Dueno envia mensaje (app o WhatsApp)
|
||||
2. WhatsApp Service recibe
|
||||
3. Identifica como chat de dueno
|
||||
4. Envia a MCP Server con contexto:
|
||||
- tenant_id
|
||||
- user_role: "owner"
|
||||
- tools: todos disponibles
|
||||
5. MCP procesa con LLM
|
||||
6. LLM decide tool calls necesarios
|
||||
7. Ejecuta tools (consultas/acciones)
|
||||
8. Genera respuesta natural
|
||||
9. Envia respuesta al dueno
|
||||
```
|
||||
|
||||
## Tools Especificos
|
||||
|
||||
```typescript
|
||||
// Tools habilitados para dueno
|
||||
const ownerTools = [
|
||||
'search_products',
|
||||
'get_product_stock',
|
||||
'update_product_price',
|
||||
'get_daily_sales',
|
||||
'get_sales_report',
|
||||
'get_low_stock_products',
|
||||
'search_customers',
|
||||
'get_customer_balance',
|
||||
'send_payment_reminder',
|
||||
'get_top_products',
|
||||
'get_business_metrics'
|
||||
];
|
||||
```
|
||||
|
||||
## Alertas Proactivas
|
||||
|
||||
### Stock Bajo
|
||||
```
|
||||
Enviado: 9:00 AM
|
||||
"🔔 Alerta de inventario
|
||||
3 productos estan por agotarse:
|
||||
- Coca-Cola 600ml (5 unidades)
|
||||
- Pan Bimbo (3 unidades)
|
||||
- Leche (4 unidades)
|
||||
|
||||
¿Quieres ver sugerencia de pedido?"
|
||||
```
|
||||
|
||||
### Recordatorio de Cobro
|
||||
```
|
||||
Enviado: 10:00 AM Lunes
|
||||
"💰 Tienes $2,150 en fiados pendientes.
|
||||
5 clientes deben desde hace +7 dias.
|
||||
¿Envio recordatorios automaticos?"
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| Owner chat flow | Pendiente | `whatsapp-service/flows/owner.flow.ts` |
|
||||
| MCP tools completos | Pendiente | `mcp-server/tools/` |
|
||||
| Alert scheduler | Pendiente | `backend/jobs/alerts.job.ts` |
|
||||
| App chat UI | Pendiente | `mobile/screens/Chat.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-010 (MCP Server)
|
||||
- MCH-011 (WhatsApp Service)
|
||||
- MCH-003, 004, 008, 009 (datos)
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno (mejora de UX)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Consultas de venta funcionan
|
||||
- [ ] Consultas de inventario funcionan
|
||||
- [ ] Modificacion de precios funciona
|
||||
- [ ] Consultas de fiados funcionan
|
||||
- [ ] Alertas proactivas se envian
|
||||
- [ ] Reportes se generan correctamente
|
||||
|
||||
## Limites de Tokens
|
||||
|
||||
| Plan | Tokens/mes | Interacciones aprox |
|
||||
|------|------------|---------------------|
|
||||
| Changarrito | 500 | ~100 conversaciones |
|
||||
| Tiendita | 2000 | ~400 conversaciones |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
215
docs/01-epicas/MCH-013-chat-llm-cliente.md
Normal file
215
docs/01-epicas/MCH-013-chat-llm-cliente.md
Normal file
@ -0,0 +1,215 @@
|
||||
# MCH-013: Chat LLM Cliente
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-013
|
||||
- **Fase:** 3 - Asistente IA
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 8-9
|
||||
|
||||
## Descripcion
|
||||
|
||||
Asistente IA para clientes del negocio via WhatsApp: consulta de precios, disponibilidad de productos, hacer pedidos, consultar saldo de fiado, y recibir promociones.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Consulta de precios y disponibilidad
|
||||
2. Hacer pedidos via chat
|
||||
3. Consultar saldo de fiado
|
||||
4. Recibir catalogo de productos
|
||||
5. Atender preguntas frecuentes
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- "¿Tienen Coca de 2 litros?"
|
||||
- "¿Cuanto cuesta el pan Bimbo?"
|
||||
- "Quiero pedir 2 Cocas y unas Sabritas"
|
||||
- "¿Cuanto debo?"
|
||||
- "¿A que hora cierran?"
|
||||
- Catalogo de productos (imagen)
|
||||
|
||||
### Excluido
|
||||
- Pagos en linea (fase posterior)
|
||||
- Tracking de entrega en tiempo real
|
||||
- Cambios/devoluciones via chat
|
||||
|
||||
## Casos de Uso
|
||||
|
||||
### Consulta de Precio
|
||||
```
|
||||
Cliente: "¿Cuanto cuesta la Coca?"
|
||||
Bot: "Tenemos Coca-Cola en varios tamaños:
|
||||
- 355ml (lata): $15
|
||||
- 600ml: $18
|
||||
- 2L: $35
|
||||
- 3L: $48
|
||||
¿Cual te gustaria?"
|
||||
```
|
||||
|
||||
### Consulta de Disponibilidad
|
||||
```
|
||||
Cliente: "¿Tienen pan Bimbo?"
|
||||
Bot: "Si, tenemos:
|
||||
✓ Pan Blanco Grande - $48
|
||||
✓ Pan Integral - $52
|
||||
✗ Pan Tostado - Agotado
|
||||
¿Quieres agregar alguno a tu pedido?"
|
||||
```
|
||||
|
||||
### Hacer Pedido
|
||||
```
|
||||
Cliente: "Quiero 2 Cocas de 600 y unas Sabritas"
|
||||
Bot: "Tu pedido:
|
||||
- 2x Coca-Cola 600ml = $36
|
||||
- 1x Sabritas Original = $18
|
||||
|
||||
Total: $54
|
||||
|
||||
¿Lo confirmas?
|
||||
[Confirmar] [Agregar mas] [Cancelar]"
|
||||
|
||||
Cliente: [Confirmar]
|
||||
Bot: "¡Pedido confirmado! 🎉
|
||||
Numero: #123
|
||||
Estara listo en 10 minutos.
|
||||
Te avisamos cuando puedas pasar."
|
||||
```
|
||||
|
||||
### Consulta de Fiado
|
||||
```
|
||||
Cliente: "¿Cuanto debo?"
|
||||
Bot: "Hola Juan, tu saldo actual es de $180.
|
||||
Ultimo movimiento: $45 el 5 de enero.
|
||||
Puedes pasar a abonar cuando gustes."
|
||||
```
|
||||
|
||||
### Horarios y Ubicacion
|
||||
```
|
||||
Cliente: "¿A que hora abren?"
|
||||
Bot: "Tiendita Don Jose 🏪
|
||||
📍 Calle Principal #123
|
||||
|
||||
Horario:
|
||||
Lun-Sab: 7am - 10pm
|
||||
Dom: 8am - 8pm
|
||||
|
||||
¿Te puedo ayudar en algo mas?"
|
||||
```
|
||||
|
||||
## Flujo Tecnico
|
||||
|
||||
```
|
||||
1. Cliente envia mensaje a numero del negocio
|
||||
2. WhatsApp Service recibe
|
||||
3. Identifica como cliente (no dueno)
|
||||
4. Envia a MCP Server con contexto:
|
||||
- tenant_id
|
||||
- customer_phone
|
||||
- customer_id (si existe)
|
||||
- tools: limitados para cliente
|
||||
5. MCP procesa con LLM
|
||||
6. Ejecuta tools (consultas/pedido)
|
||||
7. Genera respuesta amigable
|
||||
8. Envia respuesta al cliente
|
||||
```
|
||||
|
||||
## Tools Limitados para Cliente
|
||||
|
||||
```typescript
|
||||
// Tools habilitados para clientes
|
||||
const customerTools = [
|
||||
'search_products',
|
||||
'get_product_price',
|
||||
'check_availability',
|
||||
'create_order',
|
||||
'get_my_balance',
|
||||
'get_business_info',
|
||||
'get_promotions'
|
||||
];
|
||||
|
||||
// Tools NO disponibles para clientes
|
||||
// - update_product_price
|
||||
// - get_sales_report
|
||||
// - send_payment_reminder
|
||||
// - etc.
|
||||
```
|
||||
|
||||
## Intents del Cliente
|
||||
|
||||
| Intent | Ejemplo | Accion |
|
||||
|--------|---------|--------|
|
||||
| CONSULTA_PRECIO | "Cuanto cuesta..." | search_products |
|
||||
| CONSULTA_DISPONIBILIDAD | "Tienen..." | check_availability |
|
||||
| HACER_PEDIDO | "Quiero pedir..." | create_order |
|
||||
| CONSULTA_SALDO | "Cuanto debo" | get_my_balance |
|
||||
| HORARIOS | "A que hora..." | get_business_info |
|
||||
| UBICACION | "Donde estan" | get_business_info |
|
||||
| PROMOCIONES | "Que ofertas tienen" | get_promotions |
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Asociacion Cliente-Telefono
|
||||
|
||||
```typescript
|
||||
// Al recibir mensaje de numero nuevo
|
||||
1. Buscar en customers por phone
|
||||
2. Si existe: asociar conversacion
|
||||
3. Si no existe: crear customer temporal
|
||||
4. Si hace pedido: pedir nombre
|
||||
```
|
||||
|
||||
## Limites y Seguridad
|
||||
|
||||
- Clientes NO pueden ver info de otros clientes
|
||||
- Clientes NO pueden modificar precios
|
||||
- Clientes NO pueden ver reportes
|
||||
- Rate limit: 20 mensajes/hora por cliente
|
||||
- Tokens: descontados de cuota del tenant
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| Customer chat flow | Pendiente | `whatsapp-service/flows/customer.flow.ts` |
|
||||
| MCP tools (limited) | Pendiente | `mcp-server/tools/customer/` |
|
||||
| Order creation | Pendiente | `backend/modules/orders/` |
|
||||
| FAQ responses | Pendiente | `whatsapp-service/faq/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-010 (MCP Server)
|
||||
- MCH-011 (WhatsApp Service)
|
||||
- MCH-014 (Gestion Clientes)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-015 (Pedidos via WhatsApp)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Consultas de precio funcionan
|
||||
- [ ] Consultas de disponibilidad funcionan
|
||||
- [ ] Pedidos se crean correctamente
|
||||
- [ ] Saldo de fiado se muestra
|
||||
- [ ] Info del negocio se muestra
|
||||
- [ ] No hay fuga de informacion
|
||||
|
||||
## Personalizacion por Tenant
|
||||
|
||||
```typescript
|
||||
// tenant_settings
|
||||
{
|
||||
whatsapp_bot: {
|
||||
greeting: "¡Hola! Bienvenido a {{business_name}}",
|
||||
farewell: "¡Gracias por tu preferencia!",
|
||||
tone: "friendly", // formal, friendly, casual
|
||||
auto_suggest_products: true,
|
||||
show_promotions: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
197
docs/01-epicas/MCH-014-gestion-clientes.md
Normal file
197
docs/01-epicas/MCH-014-gestion-clientes.md
Normal file
@ -0,0 +1,197 @@
|
||||
# MCH-014: Gestion de Clientes
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-014
|
||||
- **Fase:** 4 - Pedidos y Clientes
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Completado
|
||||
- **Fecha inicio:** 2026-01-06
|
||||
- **Fecha fin:** 2026-01-07
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema completo de gestion de clientes: registro, historial de compras, saldo de fiado, comunicacion via WhatsApp, y segmentacion basica.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. CRUD de clientes
|
||||
2. Historial de compras por cliente
|
||||
3. Integracion con sistema de fiados
|
||||
4. Comunicacion via WhatsApp
|
||||
5. Segmentacion basica (frecuencia, monto)
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Registro de clientes (nombre, telefono, direccion)
|
||||
- Historial de compras
|
||||
- Saldo de fiado integrado
|
||||
- Envio de mensajes WhatsApp
|
||||
- Tags/etiquetas para segmentacion
|
||||
- Notas por cliente
|
||||
|
||||
### Excluido
|
||||
- CRM avanzado
|
||||
- Campanas de marketing automatizadas
|
||||
- Programas de lealtad (fase posterior)
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: customers)
|
||||
|
||||
**customers**
|
||||
- id, tenant_id, name, phone
|
||||
- email (opcional), address
|
||||
- credit_enabled, credit_limit, balance
|
||||
- tags (JSONB), notes, status
|
||||
- first_purchase_at, last_purchase_at
|
||||
- total_purchases, total_spent
|
||||
|
||||
**customer_purchases** (vista agregada)
|
||||
- Derivado de sales por customer_id
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /customers | Listar clientes |
|
||||
| GET | /customers/:id | Obtener cliente |
|
||||
| POST | /customers | Crear cliente |
|
||||
| PUT | /customers/:id | Actualizar cliente |
|
||||
| DELETE | /customers/:id | Eliminar cliente |
|
||||
| GET | /customers/:id/purchases | Historial compras |
|
||||
| GET | /customers/:id/credit | Estado de fiado |
|
||||
| POST | /customers/:id/message | Enviar WhatsApp |
|
||||
| GET | /customers/segments | Segmentos |
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Registrar Cliente Nuevo
|
||||
```
|
||||
1. Durante venta, empleado pregunta nombre
|
||||
2. Ingresa telefono (obligatorio para fiado)
|
||||
3. Cliente creado con datos basicos
|
||||
4. Opcionalmente: direccion para entregas
|
||||
```
|
||||
|
||||
### Ver Historial de Cliente
|
||||
```
|
||||
1. Dueno busca cliente por nombre/telefono
|
||||
2. Abre ficha del cliente
|
||||
3. Ve:
|
||||
- Datos de contacto
|
||||
- Total comprado historico
|
||||
- Ultimas 10 compras
|
||||
- Saldo de fiado
|
||||
- Notas
|
||||
```
|
||||
|
||||
### Enviar Mensaje WhatsApp
|
||||
```
|
||||
1. Dueno abre ficha de cliente
|
||||
2. Click en "Enviar WhatsApp"
|
||||
3. Selecciona template o escribe mensaje
|
||||
4. Mensaje enviado via WhatsApp Service
|
||||
```
|
||||
|
||||
### Segmentar Clientes
|
||||
```
|
||||
1. Dueno abre lista de clientes
|
||||
2. Filtra por:
|
||||
- Con/sin fiado
|
||||
- Frecuencia (semanal, mensual, ocasional)
|
||||
- Monto (alto, medio, bajo)
|
||||
3. Puede asignar tags personalizados
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
### CustomerList
|
||||
- Tabla con: nombre, telefono, total, fiado
|
||||
- Busqueda por nombre/telefono
|
||||
- Filtros por tags, estado
|
||||
|
||||
### CustomerForm
|
||||
- Campos: nombre, telefono, email, direccion
|
||||
- Toggle credito + limite
|
||||
- Tags
|
||||
- Notas
|
||||
|
||||
### CustomerDetail
|
||||
- Info de contacto
|
||||
- Metricas: total, # compras, promedio
|
||||
- Historial de compras
|
||||
- Historial de fiado
|
||||
- Boton WhatsApp
|
||||
|
||||
### CreditHistory
|
||||
- Lista de movimientos
|
||||
- Grafica de saldo en el tiempo
|
||||
- Botones: registrar abono, enviar recordatorio
|
||||
|
||||
## Segmentacion
|
||||
|
||||
### Por Frecuencia
|
||||
| Segmento | Criterio |
|
||||
|----------|----------|
|
||||
| Frecuente | >= 4 compras/mes |
|
||||
| Regular | 2-3 compras/mes |
|
||||
| Ocasional | 1 compra/mes |
|
||||
| Inactivo | 0 compras en 30 dias |
|
||||
|
||||
### Por Valor
|
||||
| Segmento | Criterio |
|
||||
|----------|----------|
|
||||
| Alto valor | >= $2000/mes |
|
||||
| Medio | $500-$2000/mes |
|
||||
| Bajo | < $500/mes |
|
||||
|
||||
### Tags Personalizados
|
||||
- Ejemplos: "vecino", "oficina", "escuela", "mayoreo"
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| DDL customers | Completado | `08-customers.sql` |
|
||||
| customers.module | Completado | `modules/customers/` |
|
||||
| Customers.tsx | Completado | `pages/Customers.tsx` |
|
||||
| CustomerList.tsx | Completado | `components/customers/` |
|
||||
| CustomerForm.tsx | Completado | `components/customers/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-002 (Auth)
|
||||
- MCH-004 (Sales - para historial)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-008 (Fiados)
|
||||
- MCH-013 (Chat cliente)
|
||||
- MCH-015 (Pedidos WhatsApp)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] CRUD de clientes funciona
|
||||
- [x] Historial de compras se muestra
|
||||
- [x] Fiado integrado correctamente
|
||||
- [x] Busqueda por nombre/telefono
|
||||
- [x] Tags funcionan
|
||||
- [x] Boton WhatsApp envia mensaje
|
||||
|
||||
## Metricas Calculadas
|
||||
|
||||
```typescript
|
||||
// Se actualizan en cada venta
|
||||
customer.total_purchases++
|
||||
customer.total_spent += sale.total
|
||||
customer.last_purchase_at = new Date()
|
||||
|
||||
// Calculo de segmento (batch job diario)
|
||||
customer.frequency_segment = calculateFrequency(customer)
|
||||
customer.value_segment = calculateValue(customer)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
196
docs/01-epicas/MCH-015-pedidos-whatsapp.md
Normal file
196
docs/01-epicas/MCH-015-pedidos-whatsapp.md
Normal file
@ -0,0 +1,196 @@
|
||||
# MCH-015: Pedidos via WhatsApp
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-015
|
||||
- **Fase:** 4 - Pedidos y Clientes
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 9-10
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema completo de pedidos via WhatsApp: clientes pueden hacer pedidos conversando con el bot, el negocio recibe notificaciones, procesa el pedido, y confirma al cliente.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Recepcion de pedidos via chat
|
||||
2. Confirmacion automatica o manual
|
||||
3. Notificacion al negocio
|
||||
4. Estado del pedido en tiempo real
|
||||
5. Historial de pedidos por cliente
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Pedidos via chat natural (NLU)
|
||||
- Carrito conversacional
|
||||
- Confirmacion de pedido
|
||||
- Notificacion push/WhatsApp al dueno
|
||||
- Estados: recibido, preparando, listo, entregado
|
||||
- Cancelacion de pedido
|
||||
|
||||
### Excluido
|
||||
- Pagos en linea dentro de WhatsApp
|
||||
- Integracion con delivery apps (Rappi, Uber)
|
||||
- Pedidos programados
|
||||
|
||||
## Flujo de Pedido
|
||||
|
||||
### Cliente Hace Pedido
|
||||
```
|
||||
Cliente: "Quiero pedir 2 Cocas y unas Sabritas"
|
||||
Bot: "Perfecto! Tu pedido:
|
||||
- 2x Coca-Cola 600ml = $36
|
||||
- 1x Sabritas Original = $18
|
||||
Total: $54
|
||||
|
||||
¿Lo confirmas?
|
||||
[Confirmar] [Agregar mas] [Cancelar]"
|
||||
|
||||
Cliente: [Confirmar]
|
||||
|
||||
Bot: "¡Pedido #456 confirmado! 🎉
|
||||
Te avisamos cuando este listo.
|
||||
Tiempo estimado: 10-15 min"
|
||||
```
|
||||
|
||||
### Negocio Recibe Notificacion
|
||||
```
|
||||
[Push + WhatsApp al dueno]
|
||||
"🛒 Nuevo Pedido #456
|
||||
|
||||
Cliente: Juan Perez (5512345678)
|
||||
- 2x Coca-Cola 600ml
|
||||
- 1x Sabritas Original
|
||||
Total: $54
|
||||
|
||||
[Ver pedido] [Aceptar] [Rechazar]"
|
||||
```
|
||||
|
||||
### Actualizacion de Estado
|
||||
```
|
||||
[Dueno marca como "Listo"]
|
||||
|
||||
Bot -> Cliente:
|
||||
"Tu pedido #456 esta listo! 📦
|
||||
Puedes pasar a recogerlo.
|
||||
|
||||
Direccion: Calle Principal #123
|
||||
Horario: Abierto hasta 10pm"
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: orders)
|
||||
|
||||
**orders**
|
||||
- id, tenant_id, customer_id, channel
|
||||
- status (pending/confirmed/preparing/ready/delivered/cancelled)
|
||||
- subtotal, delivery_fee, total
|
||||
- delivery_type (pickup/delivery)
|
||||
- delivery_address, scheduled_at
|
||||
- notes, created_at, updated_at
|
||||
|
||||
**order_items**
|
||||
- id, order_id, product_id
|
||||
- quantity, unit_price, notes, total
|
||||
|
||||
**order_status_history**
|
||||
- id, order_id, status, changed_by
|
||||
- notes, created_at
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /orders | Listar pedidos |
|
||||
| GET | /orders/:id | Obtener pedido |
|
||||
| POST | /orders | Crear pedido |
|
||||
| PUT | /orders/:id/status | Cambiar estado |
|
||||
| POST | /orders/:id/cancel | Cancelar pedido |
|
||||
| GET | /orders/pending | Pedidos pendientes |
|
||||
| GET | /customers/:id/orders | Pedidos de cliente |
|
||||
|
||||
## Estados del Pedido
|
||||
|
||||
```
|
||||
pending ──► confirmed ──► preparing ──► ready ──► delivered
|
||||
│ │ │ │
|
||||
└───────────┴─────────────┴───────────┴──► cancelled
|
||||
```
|
||||
|
||||
| Estado | Descripcion | Notifica Cliente |
|
||||
|--------|-------------|------------------|
|
||||
| pending | Pedido recibido | Si |
|
||||
| confirmed | Aceptado por negocio | Si |
|
||||
| preparing | En preparacion | No |
|
||||
| ready | Listo para recoger/enviar | Si |
|
||||
| delivered | Entregado | Si |
|
||||
| cancelled | Cancelado | Si |
|
||||
|
||||
## UI Components
|
||||
|
||||
### OrderList (Dashboard)
|
||||
- Tabla de pedidos del dia
|
||||
- Filtros por estado
|
||||
- Acciones rapidas
|
||||
|
||||
### OrderDetail
|
||||
- Info del cliente
|
||||
- Items del pedido
|
||||
- Cambio de estado
|
||||
- Historial de estados
|
||||
|
||||
### OrderNotification (Mobile)
|
||||
- Push notification
|
||||
- Sonido distintivo
|
||||
- Accion rapida: Aceptar/Rechazar
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| orders.module | Completado | `modules/orders/` |
|
||||
| WhatsApp order flow | Pendiente | `whatsapp-service/flows/order.flow.ts` |
|
||||
| Order notifications | Pendiente | `services/order-notification.service.ts` |
|
||||
| Orders dashboard | Pendiente | `pages/Orders.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-011 (WhatsApp Service)
|
||||
- MCH-013 (Chat cliente)
|
||||
- MCH-014 (Gestion clientes)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-016 (Entregas a domicilio)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Pedidos se crean via WhatsApp
|
||||
- [ ] Dueno recibe notificacion inmediata
|
||||
- [ ] Estados se actualizan correctamente
|
||||
- [ ] Cliente recibe confirmaciones
|
||||
- [ ] Historial de pedidos funciona
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
{
|
||||
orders: {
|
||||
enabled: true,
|
||||
auto_confirm: false, // o true para confirmar automaticamente
|
||||
estimated_time_minutes: 15,
|
||||
channels: ['whatsapp', 'web'],
|
||||
notifications: {
|
||||
push: true,
|
||||
whatsapp: true,
|
||||
sound: 'order_received'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
181
docs/01-epicas/MCH-016-entregas-domicilio.md
Normal file
181
docs/01-epicas/MCH-016-entregas-domicilio.md
Normal file
@ -0,0 +1,181 @@
|
||||
# MCH-016: Entregas a Domicilio
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-016
|
||||
- **Fase:** 4 - Pedidos y Clientes
|
||||
- **Prioridad:** P2
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 10-11
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de entregas a domicilio para micro-negocios: definicion de zonas de cobertura, costos de envio, asignacion de repartidores, y tracking basico del pedido.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Definir zonas de cobertura
|
||||
2. Configurar costos de envio
|
||||
3. Asignar repartidores
|
||||
4. Tracking basico de entrega
|
||||
5. Confirmacion de entrega
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Zonas de cobertura (radio o colonias)
|
||||
- Costo de envio fijo o por zona
|
||||
- Asignacion manual de repartidor
|
||||
- Estados: asignado, en camino, entregado
|
||||
- Confirmacion con foto/firma
|
||||
|
||||
### Excluido
|
||||
- GPS tracking en tiempo real
|
||||
- Optimizacion de rutas
|
||||
- Integracion con apps de delivery
|
||||
- Repartidores externos (Rappi, Uber)
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas Adicionales
|
||||
|
||||
**delivery_zones**
|
||||
- id, tenant_id, name, type (radius/polygon)
|
||||
- coordinates (JSONB), delivery_fee
|
||||
- min_order, estimated_time, active
|
||||
|
||||
**deliveries**
|
||||
- id, order_id, assigned_to (user_id)
|
||||
- status, pickup_at, delivered_at
|
||||
- delivery_address, notes
|
||||
- proof_photo_url, signature_url
|
||||
|
||||
## Flujo de Entrega
|
||||
|
||||
### Cliente Solicita Delivery
|
||||
```
|
||||
Bot: "¿Como quieres recibir tu pedido?
|
||||
[Paso a recoger] [Enviar a domicilio]"
|
||||
|
||||
Cliente: [Enviar a domicilio]
|
||||
|
||||
Bot: "¿A que direccion lo enviamos?"
|
||||
|
||||
Cliente: "Calle Hidalgo 45, Col. Centro"
|
||||
|
||||
Bot: "Perfecto! Envio a Col. Centro = $25
|
||||
Total con envio: $79
|
||||
Tiempo estimado: 30-45 min
|
||||
|
||||
¿Confirmas?
|
||||
[Confirmar] [Cambiar direccion]"
|
||||
```
|
||||
|
||||
### Asignacion de Repartidor
|
||||
```
|
||||
1. Pedido confirmado con delivery
|
||||
2. Dueno ve pedido en dashboard
|
||||
3. Asigna a repartidor (empleado)
|
||||
4. Repartidor recibe notificacion
|
||||
5. Cliente notificado: "Tu pedido va en camino"
|
||||
```
|
||||
|
||||
### Confirmacion de Entrega
|
||||
```
|
||||
1. Repartidor llega a direccion
|
||||
2. Entrega pedido
|
||||
3. Toma foto de entrega (opcional)
|
||||
4. Marca como entregado en app
|
||||
5. Cliente recibe: "Pedido entregado!"
|
||||
```
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /delivery/zones | Zonas de cobertura |
|
||||
| POST | /delivery/zones | Crear zona |
|
||||
| PUT | /delivery/zones/:id | Editar zona |
|
||||
| DELETE | /delivery/zones/:id | Eliminar zona |
|
||||
| POST | /delivery/check-coverage | Verificar cobertura |
|
||||
| POST | /orders/:id/assign-delivery | Asignar repartidor |
|
||||
| PUT | /deliveries/:id/status | Actualizar estado |
|
||||
| POST | /deliveries/:id/confirm | Confirmar entrega |
|
||||
|
||||
## Configuracion de Zonas
|
||||
|
||||
### Por Radio
|
||||
```typescript
|
||||
{
|
||||
type: 'radius',
|
||||
center: { lat: 19.4326, lng: -99.1332 },
|
||||
radius_km: 3,
|
||||
delivery_fee: 25,
|
||||
estimated_time: 30
|
||||
}
|
||||
```
|
||||
|
||||
### Por Colonias
|
||||
```typescript
|
||||
{
|
||||
type: 'polygon',
|
||||
name: 'Centro',
|
||||
colonias: ['Centro', 'Roma Norte', 'Condesa'],
|
||||
delivery_fee: 30,
|
||||
estimated_time: 45
|
||||
}
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
### DeliveryZonesMap
|
||||
- Mapa con zonas definidas
|
||||
- Edicion visual de poligonos
|
||||
- Configuracion de tarifas
|
||||
|
||||
### DeliveryAssignment
|
||||
- Lista de pedidos pendientes de asignar
|
||||
- Dropdown de repartidores disponibles
|
||||
- Boton asignar
|
||||
|
||||
### DeliveryTracking (Mobile - Repartidor)
|
||||
- Lista de entregas asignadas
|
||||
- Boton "En camino"
|
||||
- Boton "Entregado" + foto
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| delivery.module | Pendiente | `modules/delivery/` |
|
||||
| delivery_zones tabla | Pendiente | DDL |
|
||||
| DeliveryZonesMap | Pendiente | `components/delivery/` |
|
||||
| Mobile delivery screen | Pendiente | `mobile/screens/Delivery.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-015 (Pedidos WhatsApp)
|
||||
- MCH-002 (Auth - para repartidores)
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Zonas de cobertura se configuran
|
||||
- [ ] Costo de envio se calcula correctamente
|
||||
- [ ] Repartidor recibe notificacion
|
||||
- [ ] Estados de entrega funcionan
|
||||
- [ ] Confirmacion con foto funciona
|
||||
|
||||
## Roles
|
||||
|
||||
| Rol | Permisos |
|
||||
|-----|----------|
|
||||
| owner | Configurar zonas, ver todas las entregas |
|
||||
| employee | Asignar entregas, ver entregas |
|
||||
| delivery | Ver entregas asignadas, actualizar estado |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
197
docs/01-epicas/MCH-017-notificaciones.md
Normal file
197
docs/01-epicas/MCH-017-notificaciones.md
Normal file
@ -0,0 +1,197 @@
|
||||
# MCH-017: Notificaciones
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-017
|
||||
- **Fase:** 4 - Pedidos y Clientes
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 8-9
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema centralizado de notificaciones multi-canal: push notifications, WhatsApp, y SMS. Soporta notificaciones transaccionales, recordatorios, y alertas de negocio.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Push notifications (Firebase)
|
||||
2. Notificaciones WhatsApp
|
||||
3. SMS como fallback
|
||||
4. Configuracion por usuario
|
||||
5. Historial de notificaciones
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Push via Firebase Cloud Messaging
|
||||
- WhatsApp via MCH-011
|
||||
- SMS via Twilio (fallback)
|
||||
- Preferencias por usuario
|
||||
- Templates de notificacion
|
||||
- Programacion de envios
|
||||
|
||||
### Excluido
|
||||
- Email (no prioritario para micro-negocios)
|
||||
- Notificaciones in-app complejas
|
||||
- Marketing automation
|
||||
|
||||
## Tipos de Notificacion
|
||||
|
||||
### Transaccionales (Inmediatas)
|
||||
| Evento | Canal Default | Mensaje |
|
||||
|--------|---------------|---------|
|
||||
| Nuevo pedido | Push + WhatsApp | "Nuevo pedido #123" |
|
||||
| Pedido listo | WhatsApp | "Tu pedido esta listo" |
|
||||
| Pago recibido | Push | "Pago de $500 recibido" |
|
||||
| Stock bajo | Push | "Coca-Cola: quedan 5" |
|
||||
|
||||
### Recordatorios (Programados)
|
||||
| Tipo | Canal | Frecuencia |
|
||||
|------|-------|------------|
|
||||
| Fiado pendiente | WhatsApp | Segun config |
|
||||
| Reporte semanal | WhatsApp | Lunes 8am |
|
||||
| Cierre de caja | Push | Diario 9pm |
|
||||
|
||||
### Alertas de Negocio
|
||||
| Alerta | Canal | Trigger |
|
||||
|--------|-------|---------|
|
||||
| Stock bajo | Push | stock < min_stock |
|
||||
| Venta grande | Push | sale.total > threshold |
|
||||
| Nuevo cliente | Push | customer.created |
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: notifications)
|
||||
|
||||
**notification_templates**
|
||||
- id, tenant_id, code, channel
|
||||
- title, body, variables
|
||||
- active
|
||||
|
||||
**notifications**
|
||||
- id, tenant_id, user_id, type
|
||||
- channel, title, body
|
||||
- status (pending/sent/delivered/failed)
|
||||
- scheduled_at, sent_at, read_at
|
||||
|
||||
**notification_preferences**
|
||||
- id, user_id, channel
|
||||
- enabled, quiet_hours_start, quiet_hours_end
|
||||
|
||||
**device_tokens**
|
||||
- id, user_id, platform (ios/android/web)
|
||||
- token, active, created_at
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /notifications/send | Enviar notificacion |
|
||||
| GET | /notifications | Historial |
|
||||
| PUT | /notifications/:id/read | Marcar como leida |
|
||||
| GET | /notifications/preferences | Preferencias |
|
||||
| PUT | /notifications/preferences | Actualizar prefs |
|
||||
| POST | /notifications/register-device | Registrar token |
|
||||
|
||||
## Arquitectura
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌─────────────────┐
|
||||
│ Trigger │────▶│ Notification │
|
||||
│ (Event) │ │ Service │
|
||||
└─────────────┘ └────────┬────────┘
|
||||
│
|
||||
┌───────────────────┼───────────────────┐
|
||||
│ │ │
|
||||
┌──────▼──────┐ ┌───────▼───────┐ ┌──────▼──────┐
|
||||
│ Firebase │ │ WhatsApp │ │ Twilio │
|
||||
│ FCM │ │ Service │ │ SMS │
|
||||
└─────────────┘ └───────────────┘ └─────────────┘
|
||||
```
|
||||
|
||||
## Templates de Notificacion
|
||||
|
||||
### Push - Nuevo Pedido
|
||||
```json
|
||||
{
|
||||
"code": "new_order",
|
||||
"channel": "push",
|
||||
"title": "🛒 Nuevo Pedido",
|
||||
"body": "Pedido #{{order_id}} de {{customer_name}} por ${{total}}"
|
||||
}
|
||||
```
|
||||
|
||||
### WhatsApp - Pedido Listo
|
||||
```
|
||||
¡Tu pedido #{{order_id}} esta listo! 📦
|
||||
|
||||
{{items_summary}}
|
||||
|
||||
Total: ${{total}}
|
||||
|
||||
Puedes pasar a recogerlo a:
|
||||
{{business_address}}
|
||||
```
|
||||
|
||||
### WhatsApp - Recordatorio Fiado
|
||||
```
|
||||
Hola {{customer_name}}, te recordamos que tienes
|
||||
un saldo pendiente de ${{balance}} en {{business_name}}.
|
||||
|
||||
¿Cuando podrias pasar a liquidar?
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| notifications.module | Pendiente | `modules/notifications/` |
|
||||
| Firebase integration | Pendiente | `providers/firebase.provider.ts` |
|
||||
| Twilio integration | Pendiente | `providers/twilio.provider.ts` |
|
||||
| Notification preferences UI | Pendiente | `components/settings/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-011 (WhatsApp Service)
|
||||
- MCH-002 (Auth - usuarios)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-008 (Recordatorios fiado)
|
||||
- MCH-015 (Notificaciones pedido)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Push notifications funcionan (iOS/Android)
|
||||
- [ ] WhatsApp notifications funcionan
|
||||
- [ ] SMS fallback funciona
|
||||
- [ ] Preferencias se respetan
|
||||
- [ ] Historial se guarda correctamente
|
||||
|
||||
## Configuracion
|
||||
|
||||
### Firebase
|
||||
```typescript
|
||||
{
|
||||
firebase: {
|
||||
projectId: process.env.FIREBASE_PROJECT_ID,
|
||||
privateKey: process.env.FIREBASE_PRIVATE_KEY,
|
||||
clientEmail: process.env.FIREBASE_CLIENT_EMAIL
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Quiet Hours
|
||||
```typescript
|
||||
// Por usuario
|
||||
{
|
||||
quiet_hours: {
|
||||
enabled: true,
|
||||
start: '22:00',
|
||||
end: '08:00'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
225
docs/01-epicas/MCH-018-planes-suscripciones.md
Normal file
225
docs/01-epicas/MCH-018-planes-suscripciones.md
Normal file
@ -0,0 +1,225 @@
|
||||
# MCH-018: Planes y Suscripciones
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-018
|
||||
- **Fase:** 5 - Monetizacion
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** Completado
|
||||
- **Fecha inicio:** 2026-01-06
|
||||
- **Fecha fin:** 2026-01-07
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de planes de suscripcion para monetizar MiChangarrito: dos planes principales (Changarrito y Tiendita), facturacion mensual, y gestion de ciclos de pago.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Definir planes disponibles
|
||||
2. Proceso de suscripcion
|
||||
3. Facturacion recurrente
|
||||
4. Gestion de ciclo de vida
|
||||
5. Upgrade/downgrade de plan
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Plan Changarrito ($99/mes)
|
||||
- Plan Tiendita ($199/mes)
|
||||
- Trial de 14 dias
|
||||
- Facturacion via Stripe
|
||||
- Cancelacion y pausas
|
||||
- Historial de facturacion
|
||||
|
||||
### Excluido
|
||||
- Planes anuales (fase posterior)
|
||||
- Planes enterprise personalizados
|
||||
- Facturacion fiscal mexicana (MCH-027)
|
||||
|
||||
## Planes
|
||||
|
||||
### Plan Changarrito - $99/mes
|
||||
```
|
||||
✓ App movil completa
|
||||
✓ Punto de venta basico
|
||||
✓ Hasta 500 productos
|
||||
✓ 1 usuario
|
||||
✓ 500 tokens IA/mes
|
||||
✓ Soporte por WhatsApp
|
||||
✗ WhatsApp Business propio
|
||||
✗ Predicciones de inventario
|
||||
```
|
||||
|
||||
### Plan Tiendita - $199/mes
|
||||
```
|
||||
✓ Todo de Changarrito
|
||||
✓ Productos ilimitados
|
||||
✓ Hasta 5 usuarios
|
||||
✓ 2,000 tokens IA/mes
|
||||
✓ WhatsApp Business propio
|
||||
✓ Predicciones de inventario
|
||||
✓ Reportes avanzados
|
||||
✓ Entregas a domicilio
|
||||
✓ Soporte prioritario
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: subscriptions)
|
||||
|
||||
**plans**
|
||||
- id, name, code, price
|
||||
- currency, interval (month/year)
|
||||
- features (JSONB), token_quota
|
||||
- max_products, max_users
|
||||
- stripe_price_id, status
|
||||
|
||||
**subscriptions**
|
||||
- id, tenant_id, plan_id
|
||||
- status (trialing/active/past_due/cancelled)
|
||||
- stripe_subscription_id
|
||||
- current_period_start, current_period_end
|
||||
- trial_end, cancelled_at
|
||||
|
||||
**invoices**
|
||||
- id, subscription_id, amount
|
||||
- status, stripe_invoice_id
|
||||
- paid_at, pdf_url
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /subscriptions/plans | Listar planes |
|
||||
| GET | /subscriptions/current | Suscripcion actual |
|
||||
| POST | /subscriptions/subscribe | Suscribirse |
|
||||
| POST | /subscriptions/cancel | Cancelar |
|
||||
| POST | /subscriptions/resume | Reanudar |
|
||||
| PUT | /subscriptions/change-plan | Cambiar plan |
|
||||
| GET | /subscriptions/invoices | Historial facturas |
|
||||
| POST | /subscriptions/webhook | Webhook Stripe |
|
||||
|
||||
## Flujos
|
||||
|
||||
### Nueva Suscripcion
|
||||
```
|
||||
1. Usuario selecciona plan
|
||||
2. Ingresa metodo de pago (Stripe)
|
||||
3. Se crea suscripcion con trial
|
||||
4. Usuario tiene acceso inmediato
|
||||
5. Al terminar trial, se cobra automaticamente
|
||||
```
|
||||
|
||||
### Cancelacion
|
||||
```
|
||||
1. Usuario solicita cancelar
|
||||
2. Confirmacion requerida
|
||||
3. Suscripcion marcada para cancelar
|
||||
4. Acceso hasta fin del periodo
|
||||
5. Datos preservados 30 dias
|
||||
```
|
||||
|
||||
### Upgrade
|
||||
```
|
||||
1. Usuario en Changarrito
|
||||
2. Solicita upgrade a Tiendita
|
||||
3. Se calcula prorateo
|
||||
4. Pago de diferencia
|
||||
5. Features activadas inmediatamente
|
||||
```
|
||||
|
||||
## Estados de Suscripcion
|
||||
|
||||
```
|
||||
trialing ──► active ──► past_due ──► cancelled
|
||||
│ │
|
||||
└───────────┴──► paused
|
||||
```
|
||||
|
||||
| Estado | Descripcion | Acceso |
|
||||
|--------|-------------|--------|
|
||||
| trialing | En periodo de prueba | Completo |
|
||||
| active | Pagando normalmente | Completo |
|
||||
| past_due | Pago fallido (grace period) | Limitado |
|
||||
| cancelled | Cancelada | Sin acceso |
|
||||
| paused | Pausada temporalmente | Sin acceso |
|
||||
|
||||
## Integracion Stripe
|
||||
|
||||
### Subscription Billing
|
||||
```typescript
|
||||
const subscription = await stripe.subscriptions.create({
|
||||
customer: customer.stripe_id,
|
||||
items: [{ price: plan.stripe_price_id }],
|
||||
trial_period_days: 14,
|
||||
payment_behavior: 'default_incomplete',
|
||||
expand: ['latest_invoice.payment_intent']
|
||||
});
|
||||
```
|
||||
|
||||
### Webhooks Manejados
|
||||
- `customer.subscription.created`
|
||||
- `customer.subscription.updated`
|
||||
- `customer.subscription.deleted`
|
||||
- `invoice.payment_succeeded`
|
||||
- `invoice.payment_failed`
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| DDL subscriptions | Completado | `10-subscriptions.sql` |
|
||||
| subscriptions.module | Completado | `modules/subscriptions/` |
|
||||
| Stripe integration | Completado | `providers/stripe.provider.ts` |
|
||||
| Plans UI | Pendiente | `pages/Plans.tsx` |
|
||||
| Billing UI | Pendiente | `pages/Billing.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-005 (Stripe integration base)
|
||||
- MCH-002 (Auth)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-019 (Tokens)
|
||||
- MCH-020 (Pagos online)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] Planes se muestran correctamente
|
||||
- [x] Suscripcion se crea en Stripe
|
||||
- [x] Trial de 14 dias funciona
|
||||
- [x] Cobro recurrente funciona
|
||||
- [x] Cancelacion funciona
|
||||
- [ ] Upgrade/downgrade funciona
|
||||
|
||||
## Configuracion
|
||||
|
||||
```typescript
|
||||
// plans seed
|
||||
[
|
||||
{
|
||||
name: 'Changarrito',
|
||||
code: 'changarrito',
|
||||
price: 99,
|
||||
currency: 'MXN',
|
||||
token_quota: 500,
|
||||
max_products: 500,
|
||||
max_users: 1,
|
||||
stripe_price_id: 'price_xxx'
|
||||
},
|
||||
{
|
||||
name: 'Tiendita',
|
||||
code: 'tiendita',
|
||||
price: 199,
|
||||
currency: 'MXN',
|
||||
token_quota: 2000,
|
||||
max_products: null, // unlimited
|
||||
max_users: 5,
|
||||
stripe_price_id: 'price_yyy'
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
194
docs/01-epicas/MCH-019-tienda-tokens.md
Normal file
194
docs/01-epicas/MCH-019-tienda-tokens.md
Normal file
@ -0,0 +1,194 @@
|
||||
# MCH-019: Tienda de Tokens
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-019
|
||||
- **Fase:** 5 - Monetizacion
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 11-12
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema de compra de tokens adicionales para funciones de IA: paquetes de tokens, saldo disponible, consumo por operacion, y alertas de saldo bajo.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Paquetes de tokens disponibles
|
||||
2. Compra via Stripe/OXXO
|
||||
3. Saldo y consumo visible
|
||||
4. Alertas de saldo bajo
|
||||
5. Historial de consumo
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- 4 paquetes de tokens
|
||||
- Compra con tarjeta (Stripe)
|
||||
- Compra en OXXO (Stripe)
|
||||
- Saldo en tiempo real
|
||||
- Consumo por operacion
|
||||
- Alertas configurables
|
||||
|
||||
### Excluido
|
||||
- Tokens como moneda interna
|
||||
- Transferencia entre usuarios
|
||||
- Venta de tokens a terceros
|
||||
|
||||
## Paquetes de Tokens
|
||||
|
||||
| Paquete | Tokens | Precio | Precio/Token |
|
||||
|---------|--------|--------|--------------|
|
||||
| Basico | 1,000 | $29 | $0.029 |
|
||||
| Popular | 3,000 | $69 | $0.023 |
|
||||
| Pro | 8,000 | $149 | $0.019 |
|
||||
| Ultra | 20,000 | $299 | $0.015 |
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: subscriptions)
|
||||
|
||||
**token_packages**
|
||||
- id, name, tokens, price
|
||||
- currency, stripe_price_id
|
||||
- popular (boolean), active
|
||||
|
||||
**token_purchases**
|
||||
- id, tenant_id, package_id
|
||||
- tokens, amount, status
|
||||
- stripe_payment_id, purchased_at
|
||||
|
||||
**token_usage**
|
||||
- id, tenant_id, operation
|
||||
- tokens_used, metadata (JSONB)
|
||||
- created_at
|
||||
|
||||
**token_balances** (materialized view o cache)
|
||||
- tenant_id, balance, last_updated
|
||||
|
||||
## Consumo de Tokens
|
||||
|
||||
### Operaciones y Costos
|
||||
| Operacion | Tokens | Descripcion |
|
||||
|-----------|--------|-------------|
|
||||
| chat_message | 3-10 | Segun longitud |
|
||||
| product_ocr | 5 | Reconocimiento de producto |
|
||||
| audio_transcription | 8 | Transcripcion de audio |
|
||||
| sales_report | 15 | Generacion de reporte |
|
||||
| inventory_prediction | 20 | Prediccion de demanda |
|
||||
|
||||
### Calculo de Consumo
|
||||
```typescript
|
||||
// Basado en tokens del LLM
|
||||
const tokensUsed = Math.ceil(
|
||||
(inputTokens + outputTokens) / 100
|
||||
);
|
||||
```
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /tokens/packages | Paquetes disponibles |
|
||||
| GET | /tokens/balance | Saldo actual |
|
||||
| POST | /tokens/purchase | Comprar paquete |
|
||||
| GET | /tokens/usage | Historial de consumo |
|
||||
| GET | /tokens/usage/summary | Resumen de consumo |
|
||||
|
||||
## Flujos
|
||||
|
||||
### Compra de Tokens
|
||||
```
|
||||
1. Usuario ve que tiene saldo bajo
|
||||
2. Abre tienda de tokens
|
||||
3. Selecciona paquete
|
||||
4. Paga con tarjeta o elige OXXO
|
||||
5. Si tarjeta: tokens acreditados inmediatamente
|
||||
6. Si OXXO: tokens acreditados al confirmar pago
|
||||
```
|
||||
|
||||
### Consumo de Tokens
|
||||
```
|
||||
1. Usuario hace pregunta al chat IA
|
||||
2. Sistema verifica saldo
|
||||
3. Si suficiente: procesa pregunta
|
||||
4. Descuenta tokens usados
|
||||
5. Si bajo: alerta de saldo bajo
|
||||
6. Si insuficiente: sugiere comprar mas
|
||||
```
|
||||
|
||||
### Alerta de Saldo Bajo
|
||||
```
|
||||
[Push + WhatsApp]
|
||||
"⚠️ Tu saldo de tokens esta bajo
|
||||
|
||||
Te quedan 45 tokens (~5 consultas).
|
||||
Recarga para seguir usando el asistente IA.
|
||||
|
||||
[Comprar tokens]"
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
### TokenBalance (Header)
|
||||
- Icono de moneda
|
||||
- Saldo actual
|
||||
- Click para ver tienda
|
||||
|
||||
### TokenShop
|
||||
- Grid de paquetes
|
||||
- Precio y ahorro
|
||||
- Boton comprar
|
||||
|
||||
### TokenUsageHistory
|
||||
- Tabla de operaciones
|
||||
- Fecha, tipo, tokens
|
||||
- Grafica de consumo
|
||||
|
||||
### TokenLowAlert
|
||||
- Modal o banner
|
||||
- Saldo actual
|
||||
- CTA comprar
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| token_packages seed | Completado | `seeds/token-packages.sql` |
|
||||
| tokens.service | Pendiente | `services/tokens.service.ts` |
|
||||
| TokenShop UI | Pendiente | `components/tokens/TokenShop.tsx` |
|
||||
| TokenBalance UI | Pendiente | `components/tokens/TokenBalance.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-018 (Suscripciones - Stripe setup)
|
||||
- MCH-010 (MCP Server - consumo)
|
||||
|
||||
### Bloquea a
|
||||
- MCH-012, MCH-013 (Uso de tokens en chats)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Paquetes se muestran correctamente
|
||||
- [ ] Compra con tarjeta funciona
|
||||
- [ ] Compra con OXXO funciona
|
||||
- [ ] Saldo se actualiza en tiempo real
|
||||
- [ ] Consumo se registra por operacion
|
||||
- [ ] Alertas de saldo bajo funcionan
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
// Umbrales de alerta
|
||||
{
|
||||
tokens: {
|
||||
low_balance_threshold: 100,
|
||||
critical_balance_threshold: 20,
|
||||
alert_channels: ['push', 'whatsapp']
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
238
docs/01-epicas/MCH-020-pagos-suscripcion.md
Normal file
238
docs/01-epicas/MCH-020-pagos-suscripcion.md
Normal file
@ -0,0 +1,238 @@
|
||||
# MCH-020: Pagos de Suscripcion
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-020
|
||||
- **Fase:** 5 - Monetizacion
|
||||
- **Prioridad:** P0
|
||||
- **Estado:** En Progreso
|
||||
- **Fecha inicio:** 2026-01-07
|
||||
|
||||
## Descripcion
|
||||
|
||||
Sistema completo de pagos para suscripciones y tokens: Stripe para tarjetas y OXXO, In-App Purchase para iOS/Android, y manejo de pagos fallidos.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Pagos con tarjeta (Stripe)
|
||||
2. Pagos en OXXO (Stripe)
|
||||
3. In-App Purchase iOS
|
||||
4. In-App Purchase Android
|
||||
5. Manejo de pagos fallidos
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Stripe Checkout
|
||||
- OXXO Pay (via Stripe)
|
||||
- Apple In-App Purchase
|
||||
- Google Play Billing
|
||||
- Reintentos automaticos
|
||||
- Recibos por email
|
||||
|
||||
### Excluido
|
||||
- PayPal
|
||||
- Transferencia bancaria manual
|
||||
- Criptomonedas
|
||||
|
||||
## Metodos de Pago
|
||||
|
||||
### Stripe - Tarjeta
|
||||
```
|
||||
Comision: ~3.6% + $3 MXN
|
||||
Confirmacion: Inmediata
|
||||
Uso: Web y App (via Stripe SDK)
|
||||
```
|
||||
|
||||
### Stripe - OXXO
|
||||
```
|
||||
Comision: ~$10-15 MXN fijo
|
||||
Confirmacion: 24-72 horas
|
||||
Uso: Cliente paga en OXXO
|
||||
Vencimiento: 3 dias
|
||||
```
|
||||
|
||||
### Apple In-App Purchase
|
||||
```
|
||||
Comision: 15-30%
|
||||
Confirmacion: Inmediata
|
||||
Uso: App iOS
|
||||
Nota: Obligatorio para apps iOS
|
||||
```
|
||||
|
||||
### Google Play Billing
|
||||
```
|
||||
Comision: 15%
|
||||
Confirmacion: Inmediata
|
||||
Uso: App Android
|
||||
```
|
||||
|
||||
## Flujos de Pago
|
||||
|
||||
### Pago con Tarjeta
|
||||
```
|
||||
1. Usuario selecciona plan/tokens
|
||||
2. Elige "Pagar con tarjeta"
|
||||
3. Stripe Checkout se abre
|
||||
4. Ingresa datos de tarjeta
|
||||
5. Pago procesado
|
||||
6. Redirige a app con confirmacion
|
||||
7. Suscripcion/tokens activados
|
||||
```
|
||||
|
||||
### Pago en OXXO
|
||||
```
|
||||
1. Usuario selecciona plan/tokens
|
||||
2. Elige "Pagar en OXXO"
|
||||
3. Se genera referencia OXXO
|
||||
4. Se muestra:
|
||||
- Monto a pagar
|
||||
- Referencia/codigo de barras
|
||||
- Fecha limite
|
||||
5. Usuario va a OXXO y paga
|
||||
6. Webhook confirma pago (horas despues)
|
||||
7. Suscripcion/tokens activados
|
||||
8. Notificacion al usuario
|
||||
```
|
||||
|
||||
### In-App Purchase (iOS)
|
||||
```
|
||||
1. Usuario abre tienda en app
|
||||
2. Selecciona producto
|
||||
3. StoreKit muestra sheet de Apple
|
||||
4. Usuario confirma con Face ID
|
||||
5. Apple procesa pago
|
||||
6. App recibe notificacion
|
||||
7. Backend valida con Apple
|
||||
8. Suscripcion/tokens activados
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas Adicionales
|
||||
|
||||
**payment_methods**
|
||||
- id, tenant_id, type (card/oxxo/iap)
|
||||
- provider, last4, brand
|
||||
- is_default, stripe_pm_id
|
||||
|
||||
**payments**
|
||||
- id, tenant_id, type (subscription/tokens)
|
||||
- amount, currency, status
|
||||
- provider, provider_id
|
||||
- metadata (JSONB)
|
||||
|
||||
**oxxo_vouchers**
|
||||
- id, payment_id, reference
|
||||
- barcode_url, expires_at
|
||||
- status
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /payments/create-checkout | Crear sesion Stripe |
|
||||
| POST | /payments/create-oxxo | Generar voucher OXXO |
|
||||
| POST | /payments/verify-iap | Verificar IAP |
|
||||
| GET | /payments/methods | Metodos guardados |
|
||||
| POST | /payments/methods | Agregar metodo |
|
||||
| DELETE | /payments/methods/:id | Eliminar metodo |
|
||||
| POST | /payments/webhook/stripe | Webhook Stripe |
|
||||
| POST | /payments/webhook/apple | Webhook Apple |
|
||||
| POST | /payments/webhook/google | Webhook Google |
|
||||
|
||||
## Manejo de Pagos Fallidos
|
||||
|
||||
### Reintentos Automaticos
|
||||
```
|
||||
Dia 1: Primer intento fallido
|
||||
Dia 3: Segundo intento
|
||||
Dia 5: Tercer intento
|
||||
Dia 7: Cuarto intento + alerta
|
||||
Dia 10: Suspension de servicio
|
||||
```
|
||||
|
||||
### Notificaciones
|
||||
```
|
||||
[Pago fallido - Dia 1]
|
||||
"No pudimos procesar tu pago de $99.
|
||||
Actualiza tu metodo de pago para
|
||||
continuar usando MiChangarrito.
|
||||
|
||||
[Actualizar pago]"
|
||||
|
||||
[Ultimo aviso - Dia 7]
|
||||
"⚠️ Tu suscripcion sera cancelada
|
||||
en 3 dias si no actualizas tu pago.
|
||||
|
||||
[Actualizar pago ahora]"
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
### PaymentMethodSelector
|
||||
- Radio buttons de metodos
|
||||
- Tarjeta, OXXO, o guardados
|
||||
- Agregar nueva tarjeta
|
||||
|
||||
### OXXOVoucher
|
||||
- Codigo de barras
|
||||
- Monto y referencia
|
||||
- Instrucciones
|
||||
- Boton compartir
|
||||
|
||||
### PaymentHistory
|
||||
- Lista de pagos
|
||||
- Estado y fecha
|
||||
- Descargar recibo
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| Stripe Checkout | En progreso | `services/stripe-checkout.service.ts` |
|
||||
| OXXO Pay | Pendiente | `services/oxxo.service.ts` |
|
||||
| Apple IAP | Pendiente | `services/apple-iap.service.ts` |
|
||||
| Google Billing | Pendiente | `services/google-billing.service.ts` |
|
||||
| Payment UI | Pendiente | `components/payments/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-005 (Stripe base)
|
||||
- MCH-018 (Suscripciones)
|
||||
- MCH-019 (Tokens)
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Pago con tarjeta funciona
|
||||
- [ ] OXXO genera voucher correcto
|
||||
- [ ] IAP iOS funciona
|
||||
- [ ] IAP Android funciona
|
||||
- [ ] Pagos fallidos se reintentan
|
||||
- [ ] Notificaciones se envian
|
||||
|
||||
## Configuracion Stripe
|
||||
|
||||
```typescript
|
||||
{
|
||||
stripe: {
|
||||
secretKey: process.env.STRIPE_SECRET_KEY,
|
||||
webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,
|
||||
oxxo: {
|
||||
enabled: true,
|
||||
expires_after_days: 3
|
||||
},
|
||||
retry: {
|
||||
max_attempts: 4,
|
||||
days_between: [0, 3, 5, 7]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
200
docs/01-epicas/MCH-021-dashboard-web.md
Normal file
200
docs/01-epicas/MCH-021-dashboard-web.md
Normal file
@ -0,0 +1,200 @@
|
||||
# MCH-021: Dashboard Web
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-021
|
||||
- **Fase:** 5 - Monetizacion
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** En Progreso
|
||||
- **Fecha inicio:** 2026-01-06
|
||||
|
||||
## Descripcion
|
||||
|
||||
Dashboard web completo para duenos de negocio: metricas de ventas, graficas, reportes exportables, configuracion del negocio, y administracion de usuarios.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Metricas de ventas en tiempo real
|
||||
2. Graficas interactivas
|
||||
3. Reportes exportables (PDF/Excel)
|
||||
4. Configuracion del negocio
|
||||
5. Administracion de usuarios
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Dashboard principal con KPIs
|
||||
- Graficas de ventas (dia/semana/mes)
|
||||
- Top productos y categorias
|
||||
- Reportes de corte de caja
|
||||
- Configuracion de negocio
|
||||
- Gestion de usuarios/roles
|
||||
|
||||
### Excluido
|
||||
- BI avanzado (cubos OLAP)
|
||||
- Predicciones ML en graficas
|
||||
- Comparativos multi-sucursal
|
||||
|
||||
## Secciones del Dashboard
|
||||
|
||||
### Home / Resumen
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ DASHBOARD │
|
||||
├─────────────┬─────────────┬─────────────┬──────────────┤
|
||||
│ Ventas Hoy │ Transacc. │ Ticket Prom │ vs Ayer │
|
||||
│ $3,450 │ 23 │ $150 │ +15% │
|
||||
├─────────────┴─────────────┴─────────────┴──────────────┤
|
||||
│ │
|
||||
│ [Grafica de Ventas - Ultimos 7 dias] │
|
||||
│ │
|
||||
├───────────────────────────┬─────────────────────────────┤
|
||||
│ Top 5 Productos │ Alertas │
|
||||
│ 1. Coca-Cola 600ml │ ⚠️ Stock bajo (3) │
|
||||
│ 2. Sabritas Original │ 💰 Fiados pendientes (5) │
|
||||
│ 3. Pan Bimbo │ 📦 Pedidos nuevos (2) │
|
||||
└───────────────────────────┴─────────────────────────────┘
|
||||
```
|
||||
|
||||
### Ventas
|
||||
- Tabla de ventas del periodo
|
||||
- Filtros por fecha, empleado, metodo de pago
|
||||
- Detalle de cada venta
|
||||
- Exportar a Excel
|
||||
|
||||
### Productos
|
||||
- CRUD de productos
|
||||
- Inventario actual
|
||||
- Historial de precios
|
||||
- Importar/exportar
|
||||
|
||||
### Clientes
|
||||
- Lista de clientes
|
||||
- Historial de compras
|
||||
- Saldos de fiado
|
||||
- Segmentacion
|
||||
|
||||
### Reportes
|
||||
- Corte de caja diario
|
||||
- Ventas por periodo
|
||||
- Productos mas vendidos
|
||||
- Inventario valorizado
|
||||
- Fiados por cobrar
|
||||
|
||||
### Configuracion
|
||||
- Datos del negocio
|
||||
- Metodos de pago
|
||||
- Usuarios y roles
|
||||
- Integraciones
|
||||
- Suscripcion
|
||||
|
||||
## KPIs Principales
|
||||
|
||||
| KPI | Descripcion | Calculo |
|
||||
|-----|-------------|---------|
|
||||
| Ventas del dia | Total vendido hoy | SUM(sales.total) |
|
||||
| Transacciones | Numero de ventas | COUNT(sales) |
|
||||
| Ticket promedio | Venta promedio | AVG(sales.total) |
|
||||
| Margen bruto | Ganancia | (precio - costo) / precio |
|
||||
| Productos sin stock | Productos en 0 | COUNT(stock = 0) |
|
||||
|
||||
## Graficas
|
||||
|
||||
### Ventas por Dia (7 dias)
|
||||
- Tipo: Barras o linea
|
||||
- Eje X: Dias
|
||||
- Eje Y: Total ventas
|
||||
- Comparativo vs semana anterior
|
||||
|
||||
### Ventas por Hora
|
||||
- Tipo: Linea
|
||||
- Eje X: Horas (7am - 10pm)
|
||||
- Eje Y: Ventas
|
||||
- Identificar horas pico
|
||||
|
||||
### Top Productos (Pie)
|
||||
- Top 5 productos por ingresos
|
||||
- Porcentaje del total
|
||||
|
||||
### Metodos de Pago (Donut)
|
||||
- Efectivo vs Tarjeta vs Fiado
|
||||
- Porcentaje de cada uno
|
||||
|
||||
## Endpoints API (Existentes)
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /analytics/dashboard | KPIs principales |
|
||||
| GET | /analytics/sales-by-day | Ventas por dia |
|
||||
| GET | /analytics/sales-by-hour | Ventas por hora |
|
||||
| GET | /analytics/top-products | Top productos |
|
||||
| GET | /analytics/payment-methods | Por metodo pago |
|
||||
| GET | /reports/daily-close | Corte de caja |
|
||||
| GET | /reports/export | Exportar reporte |
|
||||
|
||||
## Componentes React
|
||||
|
||||
### Dashboard Page
|
||||
- `pages/Dashboard.tsx`
|
||||
- Grid de KPI cards
|
||||
- Graficas con Recharts
|
||||
- Alertas sidebar
|
||||
|
||||
### KPICard
|
||||
- Valor principal
|
||||
- Comparativo (% vs anterior)
|
||||
- Icono y color
|
||||
|
||||
### SalesChart
|
||||
- Recharts BarChart/LineChart
|
||||
- Selector de periodo
|
||||
- Tooltip interactivo
|
||||
|
||||
### TopProductsList
|
||||
- Lista ordenada
|
||||
- Cantidad y total
|
||||
- Tendencia
|
||||
|
||||
### AlertsPanel
|
||||
- Stock bajo
|
||||
- Fiados pendientes
|
||||
- Pedidos nuevos
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| Dashboard.tsx | Completado | `pages/Dashboard.tsx` |
|
||||
| analytics.module | En progreso | `modules/analytics/` |
|
||||
| KPICard.tsx | Completado | `components/dashboard/` |
|
||||
| SalesChart.tsx | En progreso | `components/dashboard/` |
|
||||
| Reports export | Pendiente | `services/reports.service.ts` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-004 (Sales data)
|
||||
- MCH-003 (Products data)
|
||||
- MCH-014 (Customers data)
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [x] Dashboard muestra KPIs correctos
|
||||
- [x] Graficas cargan datos reales
|
||||
- [ ] Reportes se exportan a PDF/Excel
|
||||
- [ ] Configuracion de negocio funciona
|
||||
- [ ] Gestion de usuarios funciona
|
||||
|
||||
## Tecnologias
|
||||
|
||||
- **Framework:** React 18
|
||||
- **Graficas:** Recharts
|
||||
- **Tablas:** TanStack Table
|
||||
- **Export PDF:** jsPDF
|
||||
- **Export Excel:** SheetJS (xlsx)
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
207
docs/01-epicas/MCH-022-modo-offline.md
Normal file
207
docs/01-epicas/MCH-022-modo-offline.md
Normal file
@ -0,0 +1,207 @@
|
||||
# MCH-022: Modo Offline
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-022
|
||||
- **Fase:** 6 - Crecimiento
|
||||
- **Prioridad:** P1
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 13-14
|
||||
|
||||
## Descripcion
|
||||
|
||||
Soporte offline completo para la app movil: SQLite local, sincronizacion inteligente, resolucion de conflictos, y funcionamiento sin conexion para operaciones criticas (ventas).
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Base de datos local (SQLite)
|
||||
2. Sincronizacion bidireccional
|
||||
3. Ventas sin conexion
|
||||
4. Resolucion de conflictos
|
||||
5. Indicador de estado de conexion
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- SQLite para datos locales
|
||||
- Sync de productos, clientes, ventas
|
||||
- Cola de operaciones offline
|
||||
- Resolucion automatica de conflictos
|
||||
- Indicador visual de estado
|
||||
|
||||
### Excluido
|
||||
- Offline para dashboard web
|
||||
- Sync de imagenes pesadas
|
||||
- Operaciones de pago offline (solo efectivo)
|
||||
|
||||
## Arquitectura
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ APP MOVIL │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌────────────┐ │
|
||||
│ │ UI Layer │───▶│ Repository │───▶│ SQLite │ │
|
||||
│ └─────────────┘ └──────┬──────┘ └────────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────▼──────┐ │
|
||||
│ │ Sync Queue │ │
|
||||
│ └──────┬──────┘ │
|
||||
│ │ │
|
||||
└────────────────────────────┼────────────────────────────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ Backend │
|
||||
│ API │
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
## Datos Sincronizados
|
||||
|
||||
### Alta Prioridad (Sync inmediato)
|
||||
| Tabla | Direccion | Frecuencia |
|
||||
|-------|-----------|------------|
|
||||
| products | Server → Local | Al iniciar + cada 5 min |
|
||||
| categories | Server → Local | Al iniciar |
|
||||
| sales | Local → Server | Inmediato cuando hay conexion |
|
||||
|
||||
### Media Prioridad
|
||||
| Tabla | Direccion | Frecuencia |
|
||||
|-------|-----------|------------|
|
||||
| customers | Bidireccional | Cada 15 min |
|
||||
| inventory | Server → Local | Cada 30 min |
|
||||
|
||||
### Baja Prioridad
|
||||
| Tabla | Direccion | Frecuencia |
|
||||
|-------|-----------|------------|
|
||||
| settings | Server → Local | Al iniciar |
|
||||
| reports | No sync (solo online) | - |
|
||||
|
||||
## Flujo de Venta Offline
|
||||
|
||||
```
|
||||
1. App detecta sin conexion
|
||||
2. Usuario hace venta normal
|
||||
3. Venta se guarda en SQLite
|
||||
4. Se agrega a cola de sync
|
||||
5. UI muestra "Venta guardada offline"
|
||||
6. Cuando hay conexion:
|
||||
a. Cola procesa ventas pendientes
|
||||
b. Envia al servidor
|
||||
c. Actualiza IDs locales
|
||||
d. Marca como sincronizado
|
||||
```
|
||||
|
||||
## Resolucion de Conflictos
|
||||
|
||||
### Estrategia: Last Write Wins + Merge
|
||||
```typescript
|
||||
// Para productos
|
||||
if (local.updated_at > server.updated_at) {
|
||||
// Local gana
|
||||
sync.upload(local);
|
||||
} else if (server.updated_at > local.updated_at) {
|
||||
// Server gana
|
||||
sync.download(server);
|
||||
} else {
|
||||
// Merge campos no conflictivos
|
||||
sync.merge(local, server);
|
||||
}
|
||||
```
|
||||
|
||||
### Casos Especiales
|
||||
|
||||
**Venta offline con producto eliminado:**
|
||||
```
|
||||
1. Producto vendido offline
|
||||
2. Producto eliminado en server
|
||||
3. Al sync: venta se registra con producto_id
|
||||
4. Se marca producto como "deleted" localmente
|
||||
```
|
||||
|
||||
**Stock desactualizado:**
|
||||
```
|
||||
1. Venta offline reduce stock local
|
||||
2. Otra venta online reduce stock
|
||||
3. Al sync: stock negativo posible
|
||||
4. Alerta al dueno para ajuste
|
||||
```
|
||||
|
||||
## Modelo de Datos Local (SQLite)
|
||||
|
||||
### Tablas Adicionales
|
||||
|
||||
**sync_queue**
|
||||
- id, operation (create/update/delete)
|
||||
- table_name, record_id, payload
|
||||
- status, attempts, created_at
|
||||
|
||||
**sync_status**
|
||||
- table_name, last_sync_at
|
||||
- records_count, pending_count
|
||||
|
||||
## UI Components
|
||||
|
||||
### ConnectionIndicator
|
||||
- Icono en header
|
||||
- Verde: online
|
||||
- Amarillo: sync pendiente
|
||||
- Rojo: offline
|
||||
|
||||
### OfflineBanner
|
||||
- Banner visible cuando offline
|
||||
- "Modo offline - cambios se sincronizaran"
|
||||
|
||||
### SyncProgress
|
||||
- Modal de sincronizacion
|
||||
- Progreso por tabla
|
||||
- Errores si hay
|
||||
|
||||
## Tecnologias
|
||||
|
||||
- **SQLite:** react-native-sqlite-storage o expo-sqlite
|
||||
- **Sync:** Custom sync engine o WatermelonDB
|
||||
- **Network:** NetInfo para detectar conexion
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| SQLite setup | Pendiente | `mobile/database/` |
|
||||
| Sync engine | Pendiente | `mobile/sync/` |
|
||||
| Offline queue | Pendiente | `mobile/sync/queue.ts` |
|
||||
| ConnectionIndicator | Pendiente | `mobile/components/` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-004 (Sales module)
|
||||
- MCH-003 (Products module)
|
||||
- App movil base
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno (mejora de UX)
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] App funciona sin conexion
|
||||
- [ ] Ventas se guardan offline
|
||||
- [ ] Sync funciona al reconectar
|
||||
- [ ] Conflictos se resuelven
|
||||
- [ ] Indicador de estado visible
|
||||
|
||||
## Limitaciones Offline
|
||||
|
||||
| Funcion | Disponible Offline |
|
||||
|---------|-------------------|
|
||||
| Ver productos | Si |
|
||||
| Hacer venta (efectivo) | Si |
|
||||
| Hacer venta (tarjeta) | No |
|
||||
| Ver clientes | Si |
|
||||
| Chat IA | No |
|
||||
| Reportes | No |
|
||||
| Configuracion | Solo lectura |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
212
docs/01-epicas/MCH-023-programa-referidos.md
Normal file
212
docs/01-epicas/MCH-023-programa-referidos.md
Normal file
@ -0,0 +1,212 @@
|
||||
# MCH-023: Programa de Referidos
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-023
|
||||
- **Fase:** 6 - Crecimiento
|
||||
- **Prioridad:** P2
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 14-15
|
||||
|
||||
## Descripcion
|
||||
|
||||
Programa de referidos para crecimiento organico: codigos de referencia unicos, beneficios para referidor y referido, tracking de conversiones, y recompensas automaticas.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Codigos de referido unicos
|
||||
2. Beneficios para ambas partes
|
||||
3. Tracking de conversiones
|
||||
4. Recompensas automaticas
|
||||
5. Dashboard de referidos
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Codigo unico por usuario
|
||||
- Link compartible
|
||||
- Beneficio: 1 mes gratis (referidor)
|
||||
- Beneficio: 50% descuento primer mes (referido)
|
||||
- Dashboard con estadisticas
|
||||
- Notificaciones de conversion
|
||||
|
||||
### Excluido
|
||||
- Comisiones en efectivo
|
||||
- Multinivel (referidos de referidos)
|
||||
- Programa de afiliados formal
|
||||
|
||||
## Mecanica del Programa
|
||||
|
||||
### Beneficios
|
||||
| Rol | Beneficio | Condicion |
|
||||
|-----|-----------|-----------|
|
||||
| Referidor | 1 mes gratis de suscripcion | Por cada referido que pague |
|
||||
| Referido | 50% descuento primer mes | Al registrarse con codigo |
|
||||
|
||||
### Flujo de Referido
|
||||
```
|
||||
1. Usuario A tiene codigo "TIENDAJUAN"
|
||||
2. Comparte link: michangarrito.com/r/TIENDAJUAN
|
||||
3. Usuario B se registra con codigo
|
||||
4. Usuario B obtiene 50% descuento
|
||||
5. Usuario B paga primer mes
|
||||
6. Usuario A recibe notificacion
|
||||
7. Usuario A obtiene 1 mes gratis acumulado
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas
|
||||
|
||||
**referral_codes**
|
||||
- id, tenant_id, code (unique)
|
||||
- created_at, active
|
||||
|
||||
**referrals**
|
||||
- id, referrer_tenant_id, referred_tenant_id
|
||||
- code_used, status (pending/converted/expired)
|
||||
- converted_at, reward_applied_at
|
||||
|
||||
**referral_rewards**
|
||||
- id, tenant_id, type (free_month)
|
||||
- months_earned, months_used
|
||||
- expires_at
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /referrals/my-code | Mi codigo |
|
||||
| POST | /referrals/generate-code | Generar nuevo codigo |
|
||||
| GET | /referrals/stats | Estadisticas |
|
||||
| GET | /referrals/list | Mis referidos |
|
||||
| POST | /referrals/apply-code | Aplicar codigo (registro) |
|
||||
| GET | /referrals/rewards | Mis recompensas |
|
||||
|
||||
## Estados del Referido
|
||||
|
||||
```
|
||||
pending ──► converted ──► rewarded
|
||||
│
|
||||
└──► expired (si no paga en 30 dias)
|
||||
```
|
||||
|
||||
| Estado | Descripcion |
|
||||
|--------|-------------|
|
||||
| pending | Referido registrado, no ha pagado |
|
||||
| converted | Referido pago primer mes |
|
||||
| rewarded | Recompensa aplicada al referidor |
|
||||
| expired | Referido no pago en tiempo |
|
||||
|
||||
## UI Components
|
||||
|
||||
### ShareReferralCard
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ Invita amigos y gana │
|
||||
│ │
|
||||
│ Tu codigo: TIENDAJUAN │
|
||||
│ │
|
||||
│ [Copiar] [Compartir WhatsApp] │
|
||||
│ │
|
||||
│ Por cada amigo que se suscriba │
|
||||
│ ganas 1 mes gratis! │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
### ReferralStats
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ Tus Referidos │
|
||||
├─────────────────────────────────┤
|
||||
│ 👥 Invitados: 8 │
|
||||
│ ✅ Convertidos: 3 │
|
||||
│ 🎁 Meses ganados: 3 │
|
||||
│ 📅 Meses disponibles: 2 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
### ReferralList
|
||||
- Tabla de referidos
|
||||
- Nombre, fecha, estado
|
||||
- Recompensa aplicada
|
||||
|
||||
## Notificaciones
|
||||
|
||||
### Referido se Registra
|
||||
```
|
||||
[Push al referidor]
|
||||
"🎉 Juan se registro con tu codigo!
|
||||
Te avisaremos cuando active su suscripcion."
|
||||
```
|
||||
|
||||
### Referido Paga
|
||||
```
|
||||
[Push + WhatsApp al referidor]
|
||||
"🎁 Ganaste 1 mes gratis!
|
||||
Juan activo su suscripcion.
|
||||
Ya tienes 3 meses acumulados."
|
||||
```
|
||||
|
||||
## Integracion con Suscripciones
|
||||
|
||||
```typescript
|
||||
// Al procesar pago de suscripcion
|
||||
async function processSubscriptionPayment(tenant, payment) {
|
||||
// Verificar si tiene meses gratis disponibles
|
||||
const rewards = await getReferralRewards(tenant.id);
|
||||
|
||||
if (rewards.months_available > 0) {
|
||||
// Usar mes gratis en lugar de cobrar
|
||||
await useReferralMonth(tenant.id);
|
||||
return { charged: false, used_referral: true };
|
||||
}
|
||||
|
||||
// Cobrar normalmente
|
||||
return chargeSubscription(tenant, payment);
|
||||
}
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| referrals.module | Pendiente | `modules/referrals/` |
|
||||
| DDL referrals | Pendiente | `schemas/13-referrals.sql` |
|
||||
| ShareReferralCard | Pendiente | `components/referrals/` |
|
||||
| Deep linking | Pendiente | Mobile config |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-018 (Suscripciones)
|
||||
- MCH-017 (Notificaciones)
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Codigo unico se genera
|
||||
- [ ] Link compartible funciona
|
||||
- [ ] Descuento se aplica al referido
|
||||
- [ ] Mes gratis se acredita al referidor
|
||||
- [ ] Dashboard muestra estadisticas
|
||||
- [ ] Notificaciones se envian
|
||||
|
||||
## Configuracion
|
||||
|
||||
```typescript
|
||||
{
|
||||
referrals: {
|
||||
enabled: true,
|
||||
referrer_reward: { type: 'free_month', months: 1 },
|
||||
referred_discount: { percent: 50, months: 1 },
|
||||
code_prefix: 'MCH', // MCH-XXXXX
|
||||
expiry_days: 30 // dias para que referido pague
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
211
docs/01-epicas/MCH-024-codi-spei.md
Normal file
211
docs/01-epicas/MCH-024-codi-spei.md
Normal file
@ -0,0 +1,211 @@
|
||||
# MCH-024: CoDi y SPEI
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-024
|
||||
- **Fase:** 6 - Crecimiento
|
||||
- **Prioridad:** P2
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 15-16
|
||||
|
||||
## Descripcion
|
||||
|
||||
Integracion con CoDi (Cobro Digital) de Banxico y SPEI para pagos instantaneos sin comision: generacion de QR de cobro, CLABE virtual por negocio, y confirmacion automatica.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Generacion de QR CoDi
|
||||
2. CLABE virtual por tenant
|
||||
3. Confirmacion automatica de pagos
|
||||
4. Sin comisiones
|
||||
5. Conciliacion automatica
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- QR CoDi para cobro
|
||||
- CLABE virtual (via proveedor)
|
||||
- Webhook de confirmacion
|
||||
- Registro de pagos en BD
|
||||
- Notificacion al recibir pago
|
||||
|
||||
### Excluido
|
||||
- Transferencias salientes
|
||||
- Pagos programados
|
||||
- Domiciliacion
|
||||
|
||||
## CoDi - Cobro Digital
|
||||
|
||||
### Que es CoDi
|
||||
- Sistema de Banxico
|
||||
- Pagos via QR desde app bancaria
|
||||
- Sin comisiones
|
||||
- Confirmacion en segundos
|
||||
- Opera 24/7
|
||||
|
||||
### Flujo de Pago CoDi
|
||||
```
|
||||
1. Cliente quiere pagar
|
||||
2. POS genera QR CoDi con monto
|
||||
3. Cliente escanea con app de su banco
|
||||
4. Cliente confirma pago
|
||||
5. Dinero se transfiere instantaneamente
|
||||
6. Webhook notifica a MiChangarrito
|
||||
7. Venta marcada como pagada
|
||||
```
|
||||
|
||||
## SPEI con CLABE Virtual
|
||||
|
||||
### Como Funciona
|
||||
```
|
||||
1. Tenant se registra
|
||||
2. Se genera CLABE virtual unica
|
||||
3. Clientes pueden transferir a esa CLABE
|
||||
4. Pagos se concilian automaticamente
|
||||
5. Ideal para pagos grandes o B2B
|
||||
```
|
||||
|
||||
### Proveedores de CLABE Virtual
|
||||
- STP (Sistema de Transferencias y Pagos)
|
||||
- Arcus
|
||||
- Conekta
|
||||
- Openpay
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas Adicionales
|
||||
|
||||
**codi_transactions**
|
||||
- id, tenant_id, sale_id
|
||||
- qr_data, amount, reference
|
||||
- status, confirmed_at
|
||||
|
||||
**virtual_accounts**
|
||||
- id, tenant_id, provider
|
||||
- clabe, status, created_at
|
||||
|
||||
**spei_transactions**
|
||||
- id, tenant_id, virtual_account_id
|
||||
- amount, sender_clabe, sender_name
|
||||
- reference, received_at
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /codi/generate-qr | Generar QR de cobro |
|
||||
| GET | /codi/status/:id | Estado de transaccion |
|
||||
| POST | /codi/webhook | Webhook de confirmacion |
|
||||
| GET | /spei/clabe | Obtener CLABE virtual |
|
||||
| POST | /spei/webhook | Webhook de SPEI |
|
||||
| GET | /spei/transactions | Transacciones recibidas |
|
||||
|
||||
## Flujo Tecnico CoDi
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ POS │────▶│ Generate │────▶│ QR Image │
|
||||
│ │ │ QR │ │ Displayed │
|
||||
└─────────────┘ └─────────────┘ └──────┬──────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ Customer │
|
||||
│ Scans QR │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ Bank App │
|
||||
│ Confirms │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌─────────────┐ ┌─────────────┐ ┌──────▼──────┐
|
||||
│ Update │◀────│ Webhook │◀────│ Banxico │
|
||||
│ Sale │ │ Handler │ │ CoDi │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
### CoDiPaymentOption
|
||||
- Boton "Pagar con CoDi"
|
||||
- Genera y muestra QR
|
||||
- Timer de expiracion (5 min)
|
||||
- Indicador de esperando pago
|
||||
|
||||
### QRCodeDisplay
|
||||
- QR grande y claro
|
||||
- Monto visible
|
||||
- Instrucciones
|
||||
- Boton "Ya pague"
|
||||
|
||||
### CLABEDisplay
|
||||
- CLABE formateada
|
||||
- Boton copiar
|
||||
- Nombre del beneficiario
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| codi.service | Pendiente | `services/codi.service.ts` |
|
||||
| spei.service | Pendiente | `services/spei.service.ts` |
|
||||
| CoDi QR UI | Pendiente | `components/payments/CoDiQR.tsx` |
|
||||
| Virtual account setup | Pendiente | Integracion proveedor |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-004 (POS)
|
||||
- MCH-005 (Payments base)
|
||||
- Cuenta bancaria del negocio
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] QR CoDi se genera correctamente
|
||||
- [ ] Pago CoDi se confirma automaticamente
|
||||
- [ ] CLABE virtual se asigna
|
||||
- [ ] SPEI se recibe y concilia
|
||||
- [ ] Sin comisiones extra
|
||||
|
||||
## Limitaciones
|
||||
|
||||
| Aspecto | Limitacion |
|
||||
|---------|------------|
|
||||
| Monto minimo | $1 MXN |
|
||||
| Monto maximo | $8,000 MXN (CoDi) |
|
||||
| Horario | 24/7 |
|
||||
| Bancos | 20+ bancos soportan CoDi |
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
{
|
||||
codi: {
|
||||
enabled: true,
|
||||
provider: 'banxico', // o agregador
|
||||
merchant_id: '...',
|
||||
qr_expiry_minutes: 5
|
||||
},
|
||||
spei: {
|
||||
enabled: true,
|
||||
provider: 'stp',
|
||||
clabe: '646180123456789012',
|
||||
auto_reconcile: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Beneficios vs Tarjeta
|
||||
|
||||
| Aspecto | Tarjeta | CoDi/SPEI |
|
||||
|---------|---------|-----------|
|
||||
| Comision | 3-4% | 0% |
|
||||
| Confirmacion | Inmediata | Inmediata |
|
||||
| Contracargos | Posible | No |
|
||||
| Requiere terminal | Si | No |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
230
docs/01-epicas/MCH-025-widgets-atajos.md
Normal file
230
docs/01-epicas/MCH-025-widgets-atajos.md
Normal file
@ -0,0 +1,230 @@
|
||||
# MCH-025: Widgets y Atajos
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-025
|
||||
- **Fase:** 6 - Crecimiento
|
||||
- **Prioridad:** P2
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 16
|
||||
|
||||
## Descripcion
|
||||
|
||||
Widgets para pantalla de inicio (Android/iOS) y atajos rapidos: ver ventas del dia, acceso rapido al POS, alertas de stock, y notificaciones importantes sin abrir la app.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Widget de ventas del dia
|
||||
2. Widget de alertas
|
||||
3. Atajos rapidos (Quick Actions)
|
||||
4. Deep linking
|
||||
5. Actualizacion en tiempo real
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Widget pequeno (ventas hoy)
|
||||
- Widget mediano (ventas + alertas)
|
||||
- Quick Actions iOS (3D Touch / Long Press)
|
||||
- App Shortcuts Android
|
||||
- Deep links a secciones
|
||||
|
||||
### Excluido
|
||||
- Widget interactivo completo
|
||||
- Widgets para Apple Watch
|
||||
- Widgets para tablets
|
||||
|
||||
## Widgets
|
||||
|
||||
### Widget Pequeno (2x1)
|
||||
```
|
||||
┌─────────────────────┐
|
||||
│ 💰 Ventas Hoy │
|
||||
│ $3,450 │
|
||||
│ 23 ventas │
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
### Widget Mediano (4x2)
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ MiChangarrito │
|
||||
├─────────────────────────────────────┤
|
||||
│ 💰 Ventas: $3,450 | 📦 Stock: 3 │
|
||||
│ 🛒 Pedidos: 2 | 💳 Fiados: 5 │
|
||||
├─────────────────────────────────────┤
|
||||
│ [Abrir POS] [Ver Pedidos] │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Widget Grande (4x4) - Solo Android
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ MiChangarrito Dashboard │
|
||||
├─────────────────────────────────────┤
|
||||
│ │
|
||||
│ Ventas Hoy: $3,450 (+15%) │
|
||||
│ ████████████░░░ 23 transacciones │
|
||||
│ │
|
||||
│ Alertas: │
|
||||
│ ⚠️ Coca-Cola: 5 unidades │
|
||||
│ ⚠️ Pan Bimbo: 3 unidades │
|
||||
│ 💰 5 fiados pendientes │
|
||||
│ │
|
||||
│ [POS] [Productos] [Pedidos] │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Quick Actions / App Shortcuts
|
||||
|
||||
### iOS (Long Press en icono)
|
||||
```
|
||||
┌─────────────────────┐
|
||||
│ 🛒 Nueva Venta │
|
||||
│ 📦 Ver Inventario │
|
||||
│ 📊 Ventas de Hoy │
|
||||
│ ➕ Agregar Producto │
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
### Android (Long Press en icono)
|
||||
```
|
||||
┌─────────────────────┐
|
||||
│ Nueva Venta │
|
||||
│ Escanear Producto │
|
||||
│ Ver Pedidos │
|
||||
│ Mi Saldo de Tokens │
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
## Deep Links
|
||||
|
||||
| Accion | Deep Link |
|
||||
|--------|-----------|
|
||||
| Abrir POS | `michangarrito://pos` |
|
||||
| Nueva venta | `michangarrito://pos/new` |
|
||||
| Ver producto | `michangarrito://products/:id` |
|
||||
| Ver pedido | `michangarrito://orders/:id` |
|
||||
| Dashboard | `michangarrito://dashboard` |
|
||||
| Escanear | `michangarrito://scan` |
|
||||
|
||||
## Implementacion Tecnica
|
||||
|
||||
### iOS Widgets (WidgetKit)
|
||||
```swift
|
||||
struct SalesWidget: Widget {
|
||||
var body: some WidgetConfiguration {
|
||||
StaticConfiguration(
|
||||
kind: "SalesWidget",
|
||||
provider: SalesProvider()
|
||||
) { entry in
|
||||
SalesWidgetView(entry: entry)
|
||||
}
|
||||
.configurationDisplayName("Ventas del Día")
|
||||
.description("Ve tus ventas en tiempo real")
|
||||
.supportedFamilies([.systemSmall, .systemMedium])
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Android Widgets (Glance / AppWidget)
|
||||
```kotlin
|
||||
class SalesWidget : GlanceAppWidget() {
|
||||
override suspend fun provideGlance(
|
||||
context: Context,
|
||||
id: GlanceId
|
||||
) {
|
||||
provideContent {
|
||||
SalesWidgetContent(getSalesData())
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### React Native Bridge
|
||||
- expo-widgets (si disponible)
|
||||
- react-native-widget-extension
|
||||
- Codigo nativo para cada plataforma
|
||||
|
||||
## Actualizacion de Datos
|
||||
|
||||
### Estrategia
|
||||
```
|
||||
1. Widget se actualiza cada 15 minutos (sistema)
|
||||
2. Push notification trigger refresh
|
||||
3. Background fetch cuando app esta activa
|
||||
4. Datos cacheados localmente
|
||||
```
|
||||
|
||||
### API para Widgets
|
||||
```typescript
|
||||
// Endpoint liviano para widgets
|
||||
GET /api/widget/summary
|
||||
|
||||
Response:
|
||||
{
|
||||
"sales_today": 3450,
|
||||
"transactions_count": 23,
|
||||
"pending_orders": 2,
|
||||
"low_stock_count": 3,
|
||||
"pending_credits": 5,
|
||||
"updated_at": "2026-01-07T15:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| iOS Widget | Pendiente | `ios/MiChangarritoWidget/` |
|
||||
| Android Widget | Pendiente | `android/app/src/widget/` |
|
||||
| Quick Actions | Pendiente | Configuracion nativa |
|
||||
| Deep linking | Pendiente | `mobile/navigation/` |
|
||||
| Widget API | Pendiente | `backend/controllers/widget.controller.ts` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- App movil base
|
||||
- MCH-021 (Dashboard - datos)
|
||||
- Push notifications configuradas
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Widget pequeno funciona iOS
|
||||
- [ ] Widget pequeno funciona Android
|
||||
- [ ] Widget mediano funciona
|
||||
- [ ] Quick Actions funcionan
|
||||
- [ ] Deep links abren seccion correcta
|
||||
- [ ] Datos se actualizan regularmente
|
||||
|
||||
## Configuracion de Usuario
|
||||
|
||||
```typescript
|
||||
// Preferencias de widget
|
||||
{
|
||||
widget: {
|
||||
show_sales: true,
|
||||
show_orders: true,
|
||||
show_stock_alerts: true,
|
||||
show_credits: true,
|
||||
refresh_interval: 15 // minutos
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Limitaciones por Plataforma
|
||||
|
||||
| Feature | iOS | Android |
|
||||
|---------|-----|---------|
|
||||
| Widget pequeno | Si | Si |
|
||||
| Widget mediano | Si | Si |
|
||||
| Widget grande | No | Si |
|
||||
| Interactivo | Limitado | Si |
|
||||
| Background refresh | 15 min min | Configurable |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
242
docs/01-epicas/MCH-026-multi-idioma-latam.md
Normal file
242
docs/01-epicas/MCH-026-multi-idioma-latam.md
Normal file
@ -0,0 +1,242 @@
|
||||
# MCH-026: Multi-idioma LATAM
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-026
|
||||
- **Fase:** 7 - Expansion (Futuro)
|
||||
- **Prioridad:** P3
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 18+
|
||||
|
||||
## Descripcion
|
||||
|
||||
Internacionalizacion (i18n) de la aplicacion para expansion a otros paises de Latinoamerica: soporte multi-idioma, localizacion de formatos (moneda, fecha), y adaptacion de terminologia por pais.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Soporte multi-idioma (es-MX, es-CO, es-AR, pt-BR)
|
||||
2. Localizacion de monedas y formatos
|
||||
3. Terminologia adaptada por pais
|
||||
4. Contenido de ayuda localizado
|
||||
5. Deteccion automatica de region
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Espanol Mexico (es-MX) - default
|
||||
- Espanol Colombia (es-CO)
|
||||
- Espanol Argentina (es-AR)
|
||||
- Portugues Brasil (pt-BR)
|
||||
- Formatos de moneda locales
|
||||
- Formatos de fecha locales
|
||||
|
||||
### Excluido
|
||||
- Ingles (no es mercado objetivo inicial)
|
||||
- Otros idiomas latinoamericanos
|
||||
- Traduccion de contenido generado por usuario
|
||||
|
||||
## Paises Objetivo
|
||||
|
||||
| Pais | Codigo | Moneda | Formato Fecha |
|
||||
|------|--------|--------|---------------|
|
||||
| Mexico | es-MX | MXN ($) | DD/MM/YYYY |
|
||||
| Colombia | es-CO | COP ($) | DD/MM/YYYY |
|
||||
| Argentina | es-AR | ARS ($) | DD/MM/YYYY |
|
||||
| Brasil | pt-BR | BRL (R$) | DD/MM/YYYY |
|
||||
|
||||
## Terminologia por Pais
|
||||
|
||||
| Concepto | Mexico | Colombia | Argentina | Brasil |
|
||||
|----------|--------|----------|-----------|--------|
|
||||
| Tienda | Changarro | Tienda | Almacen | Loja |
|
||||
| Fiado | Fiado | Fiado | Cuenta | Fiado |
|
||||
| Efectivo | Efectivo | Efectivo | Efectivo | Dinheiro |
|
||||
| Codigo de barras | Codigo | Codigo | Codigo | Codigo de barras |
|
||||
|
||||
## Arquitectura i18n
|
||||
|
||||
### Estructura de Archivos
|
||||
```
|
||||
locales/
|
||||
├── es-MX/
|
||||
│ ├── common.json
|
||||
│ ├── pos.json
|
||||
│ ├── products.json
|
||||
│ └── errors.json
|
||||
├── es-CO/
|
||||
│ └── ...
|
||||
├── es-AR/
|
||||
│ └── ...
|
||||
└── pt-BR/
|
||||
└── ...
|
||||
```
|
||||
|
||||
### Ejemplo de Archivo
|
||||
```json
|
||||
// locales/es-MX/pos.json
|
||||
{
|
||||
"title": "Punto de Venta",
|
||||
"cart": {
|
||||
"empty": "Tu carrito esta vacio",
|
||||
"total": "Total",
|
||||
"checkout": "Cobrar"
|
||||
},
|
||||
"payment": {
|
||||
"cash": "Efectivo",
|
||||
"card": "Tarjeta",
|
||||
"credit": "Fiado",
|
||||
"change": "Cambio"
|
||||
}
|
||||
}
|
||||
|
||||
// locales/pt-BR/pos.json
|
||||
{
|
||||
"title": "Ponto de Venda",
|
||||
"cart": {
|
||||
"empty": "Seu carrinho esta vazio",
|
||||
"total": "Total",
|
||||
"checkout": "Finalizar"
|
||||
},
|
||||
"payment": {
|
||||
"cash": "Dinheiro",
|
||||
"card": "Cartao",
|
||||
"credit": "Fiado",
|
||||
"change": "Troco"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Implementacion Tecnica
|
||||
|
||||
### Frontend (React)
|
||||
```typescript
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
function POSPage() {
|
||||
const { t } = useTranslation('pos');
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>{t('title')}</h1>
|
||||
<Cart
|
||||
emptyMessage={t('cart.empty')}
|
||||
totalLabel={t('cart.total')}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
### Mobile (React Native)
|
||||
```typescript
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
// Mismo patron que web
|
||||
```
|
||||
|
||||
### Backend
|
||||
```typescript
|
||||
// Mensajes de error localizados
|
||||
throw new BadRequestException(
|
||||
i18n.t('errors.product_not_found', { lang: user.locale })
|
||||
);
|
||||
```
|
||||
|
||||
## Formatos de Moneda
|
||||
|
||||
```typescript
|
||||
// Formateo dinamico
|
||||
const formatCurrency = (amount: number, locale: string) => {
|
||||
const config = {
|
||||
'es-MX': { currency: 'MXN', symbol: '$' },
|
||||
'es-CO': { currency: 'COP', symbol: '$' },
|
||||
'es-AR': { currency: 'ARS', symbol: '$' },
|
||||
'pt-BR': { currency: 'BRL', symbol: 'R$' }
|
||||
};
|
||||
|
||||
return new Intl.NumberFormat(locale, {
|
||||
style: 'currency',
|
||||
currency: config[locale].currency
|
||||
}).format(amount);
|
||||
};
|
||||
|
||||
// Resultados:
|
||||
// es-MX: $1,234.56
|
||||
// es-CO: $1.234,56
|
||||
// es-AR: $1.234,56
|
||||
// pt-BR: R$ 1.234,56
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Campos Adicionales
|
||||
|
||||
**tenants**
|
||||
- locale: string (es-MX, es-CO, etc.)
|
||||
- timezone: string
|
||||
- currency: string
|
||||
|
||||
**users**
|
||||
- locale: string (override de tenant)
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /locales | Idiomas disponibles |
|
||||
| GET | /locales/:locale | Traducciones |
|
||||
| PUT | /settings/locale | Cambiar idioma |
|
||||
|
||||
## Deteccion Automatica
|
||||
|
||||
```typescript
|
||||
// Al registrarse
|
||||
1. Detectar IP del usuario
|
||||
2. Geolocalizar pais
|
||||
3. Asignar locale default
|
||||
4. Usuario puede cambiar en settings
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| Archivos i18n es-MX | Pendiente | `locales/es-MX/` |
|
||||
| Archivos i18n es-CO | Pendiente | `locales/es-CO/` |
|
||||
| Archivos i18n es-AR | Pendiente | `locales/es-AR/` |
|
||||
| Archivos i18n pt-BR | Pendiente | `locales/pt-BR/` |
|
||||
| i18n setup React | Pendiente | `lib/i18n.ts` |
|
||||
| Currency formatter | Pendiente | `utils/currency.ts` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- App completa y estable
|
||||
- Expansion de negocio a otros paises
|
||||
|
||||
### Bloquea a
|
||||
- Lanzamiento en Colombia, Argentina, Brasil
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] App funciona en es-MX (default)
|
||||
- [ ] App funciona en es-CO
|
||||
- [ ] App funciona en es-AR
|
||||
- [ ] App funciona en pt-BR
|
||||
- [ ] Monedas se formatean correctamente
|
||||
- [ ] Usuario puede cambiar idioma
|
||||
|
||||
## Consideraciones
|
||||
|
||||
### Traduccion
|
||||
- Usar servicio profesional para pt-BR
|
||||
- Validar terminologia con usuarios locales
|
||||
- No traducir nombres de productos
|
||||
|
||||
### Legal
|
||||
- Adaptar terminos y condiciones por pais
|
||||
- Politica de privacidad por region
|
||||
- Cumplimiento normativo local
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
245
docs/01-epicas/MCH-027-integracion-sat.md
Normal file
245
docs/01-epicas/MCH-027-integracion-sat.md
Normal file
@ -0,0 +1,245 @@
|
||||
# MCH-027: Integracion SAT
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-027
|
||||
- **Fase:** 7 - Expansion (Futuro)
|
||||
- **Prioridad:** P3
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 19+
|
||||
|
||||
## Descripcion
|
||||
|
||||
Integracion con el SAT (Servicio de Administracion Tributaria) de Mexico para facturacion electronica simplificada (CFDI): emision de facturas a clientes, cancelacion, y reportes fiscales.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Emision de CFDI (facturas)
|
||||
2. Cancelacion de facturas
|
||||
3. Envio automatico al cliente
|
||||
4. Reportes para contabilidad
|
||||
5. Cumplimiento normativo
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- CFDI de Ingreso (factura de venta)
|
||||
- CFDI de Egreso (nota de credito)
|
||||
- Envio por email al cliente
|
||||
- Descarga de XML y PDF
|
||||
- Reporte mensual
|
||||
|
||||
### Excluido
|
||||
- CFDI de Nomina
|
||||
- CFDI de Pagos complejos
|
||||
- Declaraciones automaticas
|
||||
- Contabilidad electronica
|
||||
|
||||
## Tipos de Comprobante
|
||||
|
||||
| Tipo | Uso | Cuando |
|
||||
|------|-----|--------|
|
||||
| Ingreso | Factura de venta | Cliente solicita factura |
|
||||
| Egreso | Nota de credito | Devolucion o descuento |
|
||||
|
||||
## Flujo de Facturacion
|
||||
|
||||
### Solicitud de Factura (Post-venta)
|
||||
```
|
||||
1. Cliente solicita factura via WhatsApp
|
||||
"Necesito factura del ticket #123"
|
||||
|
||||
2. Bot responde:
|
||||
"Para tu factura necesito:
|
||||
- RFC
|
||||
- Razon social
|
||||
- Codigo postal
|
||||
- Uso CFDI (ej: Gastos en general)"
|
||||
|
||||
3. Cliente proporciona datos
|
||||
|
||||
4. Sistema genera CFDI:
|
||||
- Timbra con PAC
|
||||
- Genera PDF
|
||||
- Envia por email
|
||||
- Guarda en historial
|
||||
|
||||
5. Bot confirma:
|
||||
"Tu factura ha sido enviada a tu email"
|
||||
```
|
||||
|
||||
### Factura desde POS
|
||||
```
|
||||
1. Al finalizar venta
|
||||
2. Empleado pregunta: "¿Requiere factura?"
|
||||
3. Si: captura datos fiscales
|
||||
4. Se genera CFDI
|
||||
5. Se entrega ticket + factura
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: billing)
|
||||
|
||||
**invoices** (CFDI)
|
||||
- id, tenant_id, sale_id, type (ingreso/egreso)
|
||||
- uuid (folio fiscal), serie, folio
|
||||
- customer_rfc, customer_name, customer_zip
|
||||
- uso_cfdi, payment_method, payment_form
|
||||
- subtotal, iva, total
|
||||
- xml_url, pdf_url, status
|
||||
- stamped_at, cancelled_at
|
||||
|
||||
**invoice_items**
|
||||
- id, invoice_id, product_id
|
||||
- clave_prod_serv, clave_unidad
|
||||
- description, quantity, unit_price
|
||||
- discount, iva, total
|
||||
|
||||
**tax_configs** (por tenant)
|
||||
- id, tenant_id, rfc, razon_social
|
||||
- regimen_fiscal, codigo_postal
|
||||
- pac_provider, pac_credentials
|
||||
|
||||
## Claves SAT Requeridas
|
||||
|
||||
### Uso CFDI Comunes
|
||||
| Clave | Descripcion |
|
||||
|-------|-------------|
|
||||
| G01 | Adquisicion de mercancias |
|
||||
| G03 | Gastos en general |
|
||||
| P01 | Por definir |
|
||||
|
||||
### Forma de Pago
|
||||
| Clave | Descripcion |
|
||||
|-------|-------------|
|
||||
| 01 | Efectivo |
|
||||
| 04 | Tarjeta de credito |
|
||||
| 28 | Tarjeta de debito |
|
||||
| 99 | Por definir |
|
||||
|
||||
### Metodo de Pago
|
||||
| Clave | Descripcion |
|
||||
|-------|-------------|
|
||||
| PUE | Pago en una sola exhibicion |
|
||||
| PPD | Pago en parcialidades |
|
||||
|
||||
## Integracion con PAC
|
||||
|
||||
### Proveedores PAC Recomendados
|
||||
- Facturapi (simple, buena API)
|
||||
- SW Sapien
|
||||
- Finkok
|
||||
|
||||
### API Facturapi (Ejemplo)
|
||||
```typescript
|
||||
const facturapi = require('facturapi');
|
||||
|
||||
const invoice = await facturapi.invoices.create({
|
||||
customer: {
|
||||
legal_name: 'Juan Perez',
|
||||
tax_id: 'XAXX010101000',
|
||||
tax_system: '601',
|
||||
address: { zip: '06600' }
|
||||
},
|
||||
items: [{
|
||||
product: {
|
||||
description: 'Coca-Cola 600ml',
|
||||
product_key: '50202301', // Bebidas
|
||||
price: 18,
|
||||
tax_included: true
|
||||
}
|
||||
}],
|
||||
payment_form: '01', // Efectivo
|
||||
use: 'G03' // Gastos generales
|
||||
});
|
||||
```
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| POST | /invoices | Crear factura |
|
||||
| GET | /invoices/:id | Obtener factura |
|
||||
| GET | /invoices/:id/pdf | Descargar PDF |
|
||||
| GET | /invoices/:id/xml | Descargar XML |
|
||||
| POST | /invoices/:id/cancel | Cancelar factura |
|
||||
| POST | /invoices/:id/send | Reenviar por email |
|
||||
| GET | /invoices/report | Reporte mensual |
|
||||
|
||||
## UI Components
|
||||
|
||||
### InvoiceRequestForm
|
||||
- RFC con validacion
|
||||
- Razon social
|
||||
- Codigo postal
|
||||
- Uso CFDI (dropdown)
|
||||
- Email para envio
|
||||
|
||||
### InvoiceHistory
|
||||
- Lista de facturas emitidas
|
||||
- Filtros por periodo
|
||||
- Acciones: ver, descargar, cancelar
|
||||
|
||||
### InvoicePreview
|
||||
- Vista previa del PDF
|
||||
- Datos fiscales
|
||||
- Botones: descargar, enviar
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| billing.module | Parcial | `modules/billing/` |
|
||||
| PAC integration | Pendiente | `services/pac.service.ts` |
|
||||
| Invoice PDF generator | Pendiente | `services/invoice-pdf.service.ts` |
|
||||
| WhatsApp invoice flow | Pendiente | `whatsapp-service/flows/` |
|
||||
| Invoice UI | Pendiente | `pages/Invoices.tsx` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-004 (Sales - datos de venta)
|
||||
- MCH-014 (Customers - datos fiscales)
|
||||
- Cuenta SAT del negocio (e.firma)
|
||||
- Contrato con PAC
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] CFDI se genera correctamente
|
||||
- [ ] XML cumple con esquema SAT
|
||||
- [ ] PDF se genera legible
|
||||
- [ ] Email se envia al cliente
|
||||
- [ ] Cancelacion funciona
|
||||
- [ ] Reporte mensual se genera
|
||||
|
||||
## Configuracion por Tenant
|
||||
|
||||
```typescript
|
||||
{
|
||||
billing: {
|
||||
enabled: true,
|
||||
pac_provider: 'facturapi',
|
||||
pac_api_key: 'encrypted...',
|
||||
rfc: 'XAXX010101000',
|
||||
razon_social: 'Mi Tiendita SA de CV',
|
||||
regimen_fiscal: '601',
|
||||
codigo_postal: '06600',
|
||||
serie: 'A',
|
||||
auto_send_email: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Costos
|
||||
|
||||
| Concepto | Costo Estimado |
|
||||
|----------|----------------|
|
||||
| PAC por timbrado | ~$2-4 MXN/factura |
|
||||
| Certificado e.firma | Gratis (SAT) |
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
223
docs/01-epicas/MCH-028-marketplace-proveedores.md
Normal file
223
docs/01-epicas/MCH-028-marketplace-proveedores.md
Normal file
@ -0,0 +1,223 @@
|
||||
# MCH-028: Marketplace de Proveedores
|
||||
|
||||
## Metadata
|
||||
- **Codigo:** MCH-028
|
||||
- **Fase:** 7 - Expansion (Futuro)
|
||||
- **Prioridad:** P3
|
||||
- **Estado:** Pendiente
|
||||
- **Fecha estimada:** Sprint 20+
|
||||
|
||||
## Descripcion
|
||||
|
||||
Marketplace B2B que conecta micro-negocios con distribuidores y mayoristas: catalogo de proveedores, pedidos directos, comparacion de precios, y entregas coordinadas.
|
||||
|
||||
## Objetivos
|
||||
|
||||
1. Directorio de proveedores verificados
|
||||
2. Catalogos de productos mayoreo
|
||||
3. Pedidos B2B desde la app
|
||||
4. Comparacion de precios
|
||||
5. Tracking de pedidos a proveedor
|
||||
|
||||
## Alcance
|
||||
|
||||
### Incluido
|
||||
- Directorio de distribuidores por zona
|
||||
- Catalogo de productos de mayoreo
|
||||
- Sistema de pedidos B2B
|
||||
- Comparador de precios
|
||||
- Historial de compras
|
||||
|
||||
### Excluido
|
||||
- Pagos procesados por MiChangarrito
|
||||
- Logistica propia
|
||||
- Credito a negocios (lo da el proveedor)
|
||||
- Exclusividad con proveedores
|
||||
|
||||
## Modelo de Negocio
|
||||
|
||||
### Para Tienditas
|
||||
- Acceso gratuito al directorio
|
||||
- Pedidos mas faciles
|
||||
- Mejores precios por volumen
|
||||
- Menos tiempo buscando proveedor
|
||||
|
||||
### Para Proveedores
|
||||
- Acceso a base de clientes
|
||||
- Comision por pedido (3-5%)
|
||||
- Dashboard de ventas
|
||||
- Promociones destacadas
|
||||
|
||||
### Revenue para MiChangarrito
|
||||
- Comision por pedido confirmado
|
||||
- Listados destacados (premium)
|
||||
- Datos de mercado (anonimizados)
|
||||
|
||||
## Flujos de Usuario
|
||||
|
||||
### Tiendita Busca Proveedor
|
||||
```
|
||||
1. Dueno abre "Proveedores"
|
||||
2. Filtra por categoria (bebidas, botanas)
|
||||
3. Ve lista de proveedores en su zona
|
||||
4. Compara precios de Coca-Cola
|
||||
5. Selecciona proveedor con mejor precio
|
||||
6. Hace pedido desde la app
|
||||
7. Proveedor confirma y entrega
|
||||
```
|
||||
|
||||
### Proveedor Recibe Pedido
|
||||
```
|
||||
1. Proveedor recibe notificacion
|
||||
2. Ve pedido en su dashboard:
|
||||
- Tienda: "Tiendita Don Jose"
|
||||
- Productos: 10 cajas Coca-Cola
|
||||
- Direccion: Calle X #123
|
||||
3. Confirma disponibilidad
|
||||
4. Programa entrega
|
||||
5. Tienda recibe notificacion
|
||||
```
|
||||
|
||||
## Modelo de Datos
|
||||
|
||||
### Tablas (schema: marketplace)
|
||||
|
||||
**suppliers**
|
||||
- id, name, legal_name, rfc
|
||||
- categories, coverage_zones
|
||||
- contact_phone, contact_email
|
||||
- logo_url, verified, rating
|
||||
- status
|
||||
|
||||
**supplier_products**
|
||||
- id, supplier_id, name, sku
|
||||
- category, price_unit, min_order
|
||||
- image_url, barcode, active
|
||||
|
||||
**supplier_orders**
|
||||
- id, tenant_id, supplier_id
|
||||
- status, subtotal, total
|
||||
- delivery_address, delivery_date
|
||||
- notes, created_at
|
||||
|
||||
**supplier_order_items**
|
||||
- id, order_id, product_id
|
||||
- quantity, unit_price, total
|
||||
|
||||
**supplier_reviews**
|
||||
- id, tenant_id, supplier_id
|
||||
- rating, comment, created_at
|
||||
|
||||
## Endpoints API
|
||||
|
||||
| Metodo | Endpoint | Descripcion |
|
||||
|--------|----------|-------------|
|
||||
| GET | /marketplace/suppliers | Listar proveedores |
|
||||
| GET | /marketplace/suppliers/:id | Detalle proveedor |
|
||||
| GET | /marketplace/suppliers/:id/products | Productos |
|
||||
| POST | /marketplace/orders | Crear pedido |
|
||||
| GET | /marketplace/orders | Mis pedidos |
|
||||
| PUT | /marketplace/orders/:id/status | Actualizar estado |
|
||||
| POST | /marketplace/reviews | Dejar resena |
|
||||
|
||||
## UI Components
|
||||
|
||||
### SupplierDirectory
|
||||
- Lista de proveedores
|
||||
- Filtros por categoria, zona
|
||||
- Rating y resenas
|
||||
- Productos destacados
|
||||
|
||||
### SupplierProfile
|
||||
- Info del proveedor
|
||||
- Catalogo de productos
|
||||
- Precios y minimos
|
||||
- Boton "Hacer pedido"
|
||||
|
||||
### SupplierOrderForm
|
||||
- Seleccion de productos
|
||||
- Cantidades
|
||||
- Direccion de entrega
|
||||
- Fecha preferida
|
||||
- Notas
|
||||
|
||||
### OrderTracking
|
||||
- Estado del pedido
|
||||
- Fecha estimada
|
||||
- Contacto del proveedor
|
||||
|
||||
## Proveedores Iniciales (Mexico)
|
||||
|
||||
### Categorias Prioritarias
|
||||
1. **Bebidas:** Coca-Cola FEMSA, Pepsi, distribuidores locales
|
||||
2. **Botanas:** Sabritas, Barcel
|
||||
3. **Pan:** Bimbo, Grupo Bimbo
|
||||
4. **Lacteos:** Lala, Alpura, distribuidores
|
||||
5. **Abarrotes:** Mayoristas locales
|
||||
|
||||
### Onboarding de Proveedores
|
||||
```
|
||||
1. Proveedor se registra
|
||||
2. Verifica RFC y datos fiscales
|
||||
3. Sube catalogo de productos
|
||||
4. Define zonas de cobertura
|
||||
5. Configura minimos de pedido
|
||||
6. Queda visible para tiendas
|
||||
```
|
||||
|
||||
## Entregables
|
||||
|
||||
| Entregable | Estado | Archivo |
|
||||
|------------|--------|---------|
|
||||
| marketplace.module | Pendiente | `modules/marketplace/` |
|
||||
| Supplier portal | Pendiente | App separada o seccion |
|
||||
| SupplierDirectory | Pendiente | `pages/Marketplace.tsx` |
|
||||
| Order system B2B | Pendiente | `services/supplier-orders.service.ts` |
|
||||
|
||||
## Dependencias
|
||||
|
||||
### Depende de
|
||||
- MCH-003 (Productos - para matching)
|
||||
- MCH-009 (Predicciones - sugerencias)
|
||||
- Base de usuarios activos
|
||||
|
||||
### Bloquea a
|
||||
- Ninguno
|
||||
|
||||
## Criterios de Aceptacion
|
||||
|
||||
- [ ] Proveedores pueden registrarse
|
||||
- [ ] Tiendas pueden buscar proveedores
|
||||
- [ ] Pedidos B2B funcionan
|
||||
- [ ] Tracking de pedidos funciona
|
||||
- [ ] Reviews funcionan
|
||||
- [ ] Comisiones se calculan
|
||||
|
||||
## Metricas de Exito
|
||||
|
||||
| Metrica | Objetivo Inicial |
|
||||
|---------|------------------|
|
||||
| Proveedores registrados | 50 en zona metro |
|
||||
| Pedidos mensuales | 100 |
|
||||
| GMV mensual | $500,000 MXN |
|
||||
| NPS proveedores | >50 |
|
||||
|
||||
## Riesgos
|
||||
|
||||
| Riesgo | Mitigacion |
|
||||
|--------|------------|
|
||||
| Proveedores no se registran | Onboarding personalizado |
|
||||
| Calidad de servicio variable | Sistema de reviews |
|
||||
| Precios no competitivos | Comparador visible |
|
||||
| Entregas fallidas | Penalizacion a proveedor |
|
||||
|
||||
## Roadmap Interno
|
||||
|
||||
1. **MVP:** Directorio + pedidos manuales
|
||||
2. **V2:** Pedidos automaticos desde inventario bajo
|
||||
3. **V3:** Rutas optimizadas para proveedores
|
||||
4. **V4:** Credito B2B (factoraje)
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
149
docs/_MAP.md
Normal file
149
docs/_MAP.md
Normal file
@ -0,0 +1,149 @@
|
||||
# MiChangarrito - Mapa de Documentacion
|
||||
|
||||
**Proyecto:** michangarrito
|
||||
**Codigo:** MCH
|
||||
**Fecha:** 2026-01-07
|
||||
**Estado:** MVP Implementado, Documentacion en progreso
|
||||
|
||||
---
|
||||
|
||||
## Estructura de Documentacion
|
||||
|
||||
```
|
||||
docs/
|
||||
├── _MAP.md <- ESTE ARCHIVO
|
||||
├── 00-vision-general/
|
||||
│ ├── VISION-PROYECTO.md <- Vision y propuesta de valor
|
||||
│ ├── REQUERIMIENTOS-FUNCIONALES.md <- Requisitos del sistema
|
||||
│ └── ARQUITECTURA-TECNICA.md <- Stack y arquitectura
|
||||
│
|
||||
├── 01-epicas/
|
||||
│ ├── _MAP.md <- Indice de epicas
|
||||
│ ├── MCH-001-infraestructura/ <- FASE 1
|
||||
│ ├── MCH-002-auth/
|
||||
│ ├── MCH-003-productos/
|
||||
│ ├── MCH-004-pos/
|
||||
│ ├── MCH-005-pagos/
|
||||
│ ├── MCH-006-onboarding/ <- FASE 2
|
||||
│ ├── MCH-007-templates/
|
||||
│ ├── MCH-008-fiados/
|
||||
│ ├── MCH-009-predicciones/
|
||||
│ ├── MCH-010-mcp-server/ <- FASE 3
|
||||
│ ├── MCH-011-whatsapp/
|
||||
│ ├── MCH-012-chat-llm/
|
||||
│ ├── MCH-013-clientes/ <- FASE 4
|
||||
│ ├── MCH-014-pedidos-whatsapp/
|
||||
│ ├── MCH-015-entregas/
|
||||
│ ├── MCH-016-suscripciones/ <- FASE 5
|
||||
│ ├── MCH-017-tokens-ia/
|
||||
│ ├── MCH-018-pagos-online/
|
||||
│ ├── MCH-019-offline/ <- FASE 6
|
||||
│ ├── MCH-020-referidos/
|
||||
│ ├── MCH-021-codi/
|
||||
│ ├── MCH-022-widgets/
|
||||
│ └── ... hasta MCH-028
|
||||
│
|
||||
├── 02-especificaciones/
|
||||
│ ├── CATALOGO-PRODUCTOS.md <- Gestion de catalogo
|
||||
│ ├── TEMPLATE-PRODUCTOS.md <- Templates de productos
|
||||
│ ├── POS-BASICO.md <- Punto de venta
|
||||
│ ├── VENTAS-DIARIAS.md <- Registro de ventas
|
||||
│ ├── CALCULADORA-CAMBIO.md <- Logica de cambio
|
||||
│ └── INTEGRACIONES-PAGOS.md <- Mercado Pago, Clip, CoDi
|
||||
│
|
||||
└── 90-transversal/
|
||||
├── arquitectura/
|
||||
│ └── ARCHITECTURE.md <- Arquitectura del sistema
|
||||
├── api/
|
||||
└── deployment/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Carpetas por Fase
|
||||
|
||||
### FASE 1 - MVP Core
|
||||
| Epica | Nombre | Estado |
|
||||
|-------|--------|--------|
|
||||
| MCH-001 | Infraestructura | Implementado |
|
||||
| MCH-002 | Auth | Implementado |
|
||||
| MCH-003 | Productos | Implementado |
|
||||
| MCH-004 | POS | Implementado |
|
||||
| MCH-005 | Pagos | Implementado |
|
||||
|
||||
### FASE 2 - Inteligencia
|
||||
| Epica | Nombre | Estado |
|
||||
|-------|--------|--------|
|
||||
| MCH-006 | Onboarding | Implementado |
|
||||
| MCH-007 | Templates | Implementado |
|
||||
| MCH-008 | Fiados | Implementado |
|
||||
| MCH-009 | Predicciones | Implementado |
|
||||
|
||||
### FASE 3 - Asistente IA
|
||||
| Epica | Nombre | Estado |
|
||||
|-------|--------|--------|
|
||||
| MCH-010 | MCP Server | Implementado |
|
||||
| MCH-011 | WhatsApp | Implementado |
|
||||
| MCH-012 | Chat LLM | Implementado |
|
||||
|
||||
### FASE 4 - Pedidos
|
||||
| Epica | Nombre | Estado |
|
||||
|-------|--------|--------|
|
||||
| MCH-013 | Clientes | Pendiente |
|
||||
| MCH-014 | Pedidos WhatsApp | Pendiente |
|
||||
| MCH-015 | Entregas | Pendiente |
|
||||
|
||||
### FASE 5 - Monetizacion
|
||||
| Epica | Nombre | Estado |
|
||||
|-------|--------|--------|
|
||||
| MCH-016 | Suscripciones | Pendiente |
|
||||
| MCH-017 | Tokens IA | Pendiente |
|
||||
| MCH-018 | Pagos Online | Pendiente |
|
||||
|
||||
### FASE 6 - Crecimiento
|
||||
| Epica | Nombre | Estado |
|
||||
|-------|--------|--------|
|
||||
| MCH-019 | Offline | Pendiente |
|
||||
| MCH-020 | Referidos | Pendiente |
|
||||
| MCH-021 | CoDi | Pendiente |
|
||||
| MCH-022 | Widgets | Pendiente |
|
||||
|
||||
---
|
||||
|
||||
## Archivos Clave
|
||||
|
||||
| Archivo | Proposito | Ubicacion |
|
||||
|---------|-----------|-----------|
|
||||
| VISION-PROYECTO.md | Vision estrategica | 00-vision-general/ |
|
||||
| REQUERIMIENTOS-FUNCIONALES.md | Requisitos | 00-vision-general/ |
|
||||
| ARQUITECTURA-TECNICA.md | Stack tecnico | 00-vision-general/ |
|
||||
| ARCHITECTURE.md | Arquitectura detallada | 90-transversal/arquitectura/ |
|
||||
|
||||
---
|
||||
|
||||
## Navegacion Rapida
|
||||
|
||||
### Por Componente
|
||||
- **Backend:** Ver orchestration/inventarios/BACKEND_INVENTORY.yml
|
||||
- **Frontend:** Ver orchestration/inventarios/FRONTEND_INVENTORY.yml
|
||||
- **Database:** Ver orchestration/inventarios/DATABASE_INVENTORY.yml
|
||||
- **Mobile:** Ver apps/mobile/README.md
|
||||
- **MCP Server:** Ver apps/mcp-server/README.md
|
||||
- **WhatsApp:** Ver apps/whatsapp-service/README.md
|
||||
|
||||
### Por Estado
|
||||
- **Implementado:** Fases 1-3 (MCH-001 a MCH-012)
|
||||
- **Pendiente:** Fases 4-6 (MCH-013 a MCH-022+)
|
||||
|
||||
---
|
||||
|
||||
## Referencias
|
||||
|
||||
- [CONTEXTO-PROYECTO.md](../orchestration/00-guidelines/CONTEXTO-PROYECTO.md)
|
||||
- [PROXIMA-ACCION.md](../orchestration/PROXIMA-ACCION.md)
|
||||
- [PROJECT-STATUS.md](../orchestration/PROJECT-STATUS.md)
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
**Version:** 1.0.0
|
||||
423
orchestration/CONTEXT-MAP.yml
Normal file
423
orchestration/CONTEXT-MAP.yml
Normal file
@ -0,0 +1,423 @@
|
||||
# CONTEXT-MAP: MICHANGARRITO
|
||||
# Sistema: SIMCO - NEXUS v4.0
|
||||
# Proposito: Mapear contexto automatico por nivel y tarea
|
||||
# Version: 1.0.0
|
||||
# Fecha: 2026-01-07
|
||||
|
||||
metadata:
|
||||
proyecto: "michangarrito"
|
||||
nivel: "STANDALONE"
|
||||
version: "1.0.0"
|
||||
ultima_actualizacion: "2026-01-07"
|
||||
workspace_root: "/home/isem/workspace-v1"
|
||||
project_root: "/home/isem/workspace-v1/projects/michangarrito"
|
||||
codigo: "MCH"
|
||||
|
||||
# ===============================================================================
|
||||
# VARIABLES DEL PROYECTO (PRE-RESUELTAS)
|
||||
# ===============================================================================
|
||||
|
||||
variables:
|
||||
# Identificacion
|
||||
PROJECT: "michangarrito"
|
||||
PROJECT_NAME: "MICHANGARRITO"
|
||||
PROJECT_LEVEL: "STANDALONE"
|
||||
PROJECT_CODE: "MCH"
|
||||
|
||||
# Base de datos
|
||||
DB_NAME: "michangarrito"
|
||||
DB_DDL_PATH: "/home/isem/workspace-v1/projects/michangarrito/database/schemas"
|
||||
DB_SCRIPTS_PATH: "/home/isem/workspace-v1/projects/michangarrito/database"
|
||||
DB_SEEDS_PATH: "/home/isem/workspace-v1/projects/michangarrito/database/seeds"
|
||||
RECREATE_CMD: "drop-and-recreate-database.sh"
|
||||
|
||||
# Backend
|
||||
BACKEND_ROOT: "/home/isem/workspace-v1/projects/michangarrito/apps/backend"
|
||||
BACKEND_SRC: "/home/isem/workspace-v1/projects/michangarrito/apps/backend/src"
|
||||
BACKEND_TESTS: "/home/isem/workspace-v1/projects/michangarrito/apps/backend/tests"
|
||||
BACKEND_PORT: 3141
|
||||
|
||||
# Frontend Web
|
||||
FRONTEND_ROOT: "/home/isem/workspace-v1/projects/michangarrito/apps/web"
|
||||
FRONTEND_SRC: "/home/isem/workspace-v1/projects/michangarrito/apps/web/src"
|
||||
FRONTEND_PORT: 3140
|
||||
|
||||
# Mobile
|
||||
MOBILE_ROOT: "/home/isem/workspace-v1/projects/michangarrito/apps/mobile"
|
||||
MOBILE_PORT: 8081
|
||||
|
||||
# MCP Server
|
||||
MCP_SERVER_ROOT: "/home/isem/workspace-v1/projects/michangarrito/apps/mcp-server"
|
||||
MCP_SERVER_PORT: 3142
|
||||
|
||||
# WhatsApp Service
|
||||
WHATSAPP_ROOT: "/home/isem/workspace-v1/projects/michangarrito/apps/whatsapp-service"
|
||||
WHATSAPP_PORT: 3143
|
||||
|
||||
# Documentacion
|
||||
DOCS_PATH: "/home/isem/workspace-v1/projects/michangarrito/docs"
|
||||
ORCHESTRATION_PATH: "/home/isem/workspace-v1/projects/michangarrito/orchestration"
|
||||
|
||||
# ===============================================================================
|
||||
# ALIASES RESUELTOS
|
||||
# ===============================================================================
|
||||
|
||||
aliases:
|
||||
# Directivas globales
|
||||
"@SIMCO": "/home/isem/workspace-v1/orchestration/directivas/simco"
|
||||
"@PRINCIPIOS": "/home/isem/workspace-v1/orchestration/directivas/principios"
|
||||
"@PERFILES": "/home/isem/workspace-v1/orchestration/agents/perfiles"
|
||||
"@CATALOG": "/home/isem/workspace-v1/shared/catalog"
|
||||
|
||||
# Proyecto especifico
|
||||
"@DDL": "/home/isem/workspace-v1/projects/michangarrito/database/schemas"
|
||||
"@SEEDS": "/home/isem/workspace-v1/projects/michangarrito/database/seeds"
|
||||
"@BACKEND": "/home/isem/workspace-v1/projects/michangarrito/apps/backend/src"
|
||||
"@WEB": "/home/isem/workspace-v1/projects/michangarrito/apps/web/src"
|
||||
"@MOBILE": "/home/isem/workspace-v1/projects/michangarrito/apps/mobile"
|
||||
"@MCP": "/home/isem/workspace-v1/projects/michangarrito/apps/mcp-server"
|
||||
"@WHATSAPP": "/home/isem/workspace-v1/projects/michangarrito/apps/whatsapp-service"
|
||||
"@DOCS": "/home/isem/workspace-v1/projects/michangarrito/docs"
|
||||
|
||||
# Inventarios
|
||||
"@INVENTORY": "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios"
|
||||
"@INV_MASTER": "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios/MASTER_INVENTORY.yml"
|
||||
"@INV_DB": "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios/DATABASE_INVENTORY.yml"
|
||||
"@INV_BE": "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios/BACKEND_INVENTORY.yml"
|
||||
"@INV_FE": "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios/FRONTEND_INVENTORY.yml"
|
||||
|
||||
# Trazas
|
||||
"@TRAZA_DB": "/home/isem/workspace-v1/projects/michangarrito/orchestration/trazas/TRAZA-TAREAS-DATABASE.md"
|
||||
"@TRAZA_BE": "/home/isem/workspace-v1/projects/michangarrito/orchestration/trazas/TRAZA-TAREAS-BACKEND.md"
|
||||
"@TRAZA_FE": "/home/isem/workspace-v1/projects/michangarrito/orchestration/trazas/TRAZA-TAREAS-FRONTEND.md"
|
||||
|
||||
# ===============================================================================
|
||||
# CONTEXTO POR NIVEL
|
||||
# ===============================================================================
|
||||
|
||||
contexto_por_nivel:
|
||||
L0_sistema:
|
||||
descripcion: "Principios fundamentales y perfil de agente"
|
||||
tokens_estimados: 4500
|
||||
obligatorio: true
|
||||
archivos:
|
||||
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-CAPVED.md"
|
||||
proposito: "Ciclo de vida de tareas"
|
||||
tokens: 800
|
||||
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-DOC-PRIMERO.md"
|
||||
proposito: "Documentacion antes de codigo"
|
||||
tokens: 500
|
||||
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-ANTI-DUPLICACION.md"
|
||||
proposito: "Verificar catalogo antes de crear"
|
||||
tokens: 600
|
||||
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-VALIDACION-OBLIGATORIA.md"
|
||||
proposito: "Build/lint deben pasar"
|
||||
tokens: 600
|
||||
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-ECONOMIA-TOKENS.md"
|
||||
proposito: "Limites de contexto"
|
||||
tokens: 500
|
||||
- path: "/home/isem/workspace-v1/orchestration/directivas/principios/PRINCIPIO-NO-ASUMIR.md"
|
||||
proposito: "Preguntar si falta informacion"
|
||||
tokens: 500
|
||||
- path: "/home/isem/workspace-v1/orchestration/referencias/ALIASES.yml"
|
||||
proposito: "Resolucion de @ALIAS"
|
||||
tokens: 400
|
||||
|
||||
L1_proyecto:
|
||||
descripcion: "Contexto especifico de MICHANGARRITO"
|
||||
tokens_estimados: 3500
|
||||
obligatorio: true
|
||||
archivos:
|
||||
- path: "/home/isem/workspace-v1/projects/michangarrito/orchestration/00-guidelines/CONTEXTO-PROYECTO.md"
|
||||
proposito: "Variables y configuracion del proyecto"
|
||||
tokens: 1500
|
||||
- path: "/home/isem/workspace-v1/projects/michangarrito/orchestration/PROXIMA-ACCION.md"
|
||||
proposito: "Estado actual y siguiente paso"
|
||||
tokens: 500
|
||||
- path: "/home/isem/workspace-v1/projects/michangarrito/orchestration/PROJECT-STATUS.md"
|
||||
proposito: "Estado detallado del proyecto"
|
||||
tokens: 1000
|
||||
- path: "/home/isem/workspace-v1/projects/michangarrito/orchestration/PLAN-IMPLEMENTACION.md"
|
||||
proposito: "Plan de fases del proyecto"
|
||||
tokens: 500
|
||||
|
||||
L2_operacion:
|
||||
descripcion: "SIMCO especificos segun operacion y dominio"
|
||||
tokens_estimados: 2500
|
||||
archivos_por_operacion:
|
||||
CREAR:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-CREAR.md"
|
||||
MODIFICAR:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-MODIFICAR.md"
|
||||
VALIDAR:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-VALIDAR.md"
|
||||
DELEGAR:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-DELEGACION.md"
|
||||
archivos_por_dominio:
|
||||
DDL:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-DDL.md"
|
||||
- "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios/DATABASE_INVENTORY.yml"
|
||||
BACKEND:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-BACKEND.md"
|
||||
- "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios/BACKEND_INVENTORY.yml"
|
||||
FRONTEND:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-FRONTEND.md"
|
||||
- "/home/isem/workspace-v1/projects/michangarrito/orchestration/inventarios/FRONTEND_INVENTORY.yml"
|
||||
MOBILE:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-MOBILE.md"
|
||||
MCP:
|
||||
- "/home/isem/workspace-v1/orchestration/directivas/simco/SIMCO-MCP.md"
|
||||
|
||||
L3_tarea:
|
||||
descripcion: "Contexto especifico de la tarea"
|
||||
tokens_max: 8000
|
||||
dinamico: true
|
||||
|
||||
# ===============================================================================
|
||||
# INTEGRACION CON DOCUMENTACION (docs/)
|
||||
# ===============================================================================
|
||||
|
||||
integracion_docs:
|
||||
mapa_docs: "@DOCS/_MAP.md"
|
||||
|
||||
estructura:
|
||||
vision: "@DOCS/00-vision-general/"
|
||||
epicas: "@DOCS/01-epicas/"
|
||||
especificaciones: "@DOCS/02-especificaciones/"
|
||||
transversal: "@DOCS/90-transversal/"
|
||||
|
||||
epicas_por_fase:
|
||||
fase1_mvp_core:
|
||||
- MCH-001-infraestructura
|
||||
- MCH-002-auth
|
||||
- MCH-003-productos
|
||||
- MCH-004-pos
|
||||
- MCH-005-pagos
|
||||
fase2_inteligencia:
|
||||
- MCH-006-onboarding
|
||||
- MCH-007-templates
|
||||
- MCH-008-fiados
|
||||
- MCH-009-predicciones
|
||||
fase3_asistente_ia:
|
||||
- MCH-010-mcp-server
|
||||
- MCH-011-whatsapp
|
||||
- MCH-012-chat-llm
|
||||
fase4_pedidos:
|
||||
- MCH-013-clientes
|
||||
- MCH-014-pedidos-whatsapp
|
||||
- MCH-015-entregas
|
||||
fase5_monetizacion:
|
||||
- MCH-016-suscripciones
|
||||
- MCH-017-tokens-ia
|
||||
- MCH-018-pagos-online
|
||||
fase6_crecimiento:
|
||||
- MCH-019-offline
|
||||
- MCH-020-referidos
|
||||
- MCH-021-codi
|
||||
- MCH-022-widgets
|
||||
|
||||
# ===============================================================================
|
||||
# MAPA TAREA -> ARCHIVOS (Especifico MICHANGARRITO)
|
||||
# ===============================================================================
|
||||
|
||||
mapa_tarea_contexto:
|
||||
database:
|
||||
crear_tabla:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-DDL.md"]
|
||||
inventario: "@INV_DB"
|
||||
referencia: "@DDL/*.sql"
|
||||
docs: "@DOCS/02-especificaciones/"
|
||||
|
||||
crear_schema:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-DDL.md"]
|
||||
inventario: "@INV_DB"
|
||||
referencia: "@DDL/*.sql"
|
||||
|
||||
backend:
|
||||
crear_module:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||
inventario: "@INV_BE"
|
||||
referencia: "@BACKEND/modules/*/*.module.ts"
|
||||
|
||||
crear_entity:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||
inventario: "@INV_BE"
|
||||
referencia: "@BACKEND/modules/*/entities/*.entity.ts"
|
||||
|
||||
crear_service:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||
inventario: "@INV_BE"
|
||||
referencia: "@BACKEND/modules/*/services/*.service.ts"
|
||||
|
||||
crear_controller:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||
inventario: "@INV_BE"
|
||||
referencia: "@BACKEND/modules/*/controllers/*.controller.ts"
|
||||
|
||||
frontend:
|
||||
crear_componente:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-FRONTEND.md"]
|
||||
inventario: "@INV_FE"
|
||||
referencia: "@WEB/components/**/*.tsx"
|
||||
|
||||
crear_pagina:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-FRONTEND.md"]
|
||||
inventario: "@INV_FE"
|
||||
referencia: "@WEB/pages/**/*.tsx"
|
||||
|
||||
mobile:
|
||||
crear_screen:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-MOBILE.md"]
|
||||
referencia: "@MOBILE/src/screens/*.tsx"
|
||||
|
||||
mcp:
|
||||
crear_tool:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-MCP.md"]
|
||||
referencia: "@MCP/src/tools/*.ts"
|
||||
|
||||
whatsapp:
|
||||
crear_handler:
|
||||
simco: ["SIMCO-CREAR.md", "SIMCO-BACKEND.md"]
|
||||
referencia: "@WHATSAPP/src/handlers/*.ts"
|
||||
|
||||
# ===============================================================================
|
||||
# INFORMACION ESPECIFICA DEL PROYECTO
|
||||
# ===============================================================================
|
||||
|
||||
info_proyecto:
|
||||
tipo: "SaaS - Punto de Venta + IA para Micro-negocios"
|
||||
estado: "95% MVP Implementado"
|
||||
version: "3.2.0"
|
||||
|
||||
stack:
|
||||
backend: "NestJS"
|
||||
frontend: "React + Vite + TailwindCSS"
|
||||
mobile: "React Native (Expo)"
|
||||
database: "PostgreSQL (multi-tenant)"
|
||||
cache: "Redis"
|
||||
mcp_server: "TypeScript + MCP SDK"
|
||||
whatsapp: "NestJS + Meta API"
|
||||
llm: "Agnostico (OpenRouter/OpenAI/Claude)"
|
||||
|
||||
apps:
|
||||
- backend: "API NestJS"
|
||||
- web: "Dashboard React"
|
||||
- mobile: "App Expo"
|
||||
- mcp-server: "Gateway LLM"
|
||||
- whatsapp-service: "Bot WhatsApp"
|
||||
|
||||
schemas:
|
||||
- tenant_management
|
||||
- core_operations
|
||||
- pos_system
|
||||
- integrations
|
||||
- subscription_system
|
||||
- notifications
|
||||
- analytics
|
||||
- cache
|
||||
- auth
|
||||
- ai
|
||||
|
||||
modulos_backend:
|
||||
implementados:
|
||||
- auth
|
||||
- tenants
|
||||
- products
|
||||
- categories
|
||||
- sales
|
||||
- payments
|
||||
- customers
|
||||
- templates
|
||||
- fiados
|
||||
- predictions
|
||||
- integrations
|
||||
- subscriptions
|
||||
- notifications
|
||||
- analytics
|
||||
|
||||
modelo_negocio:
|
||||
planes:
|
||||
- Changarrito: "$99/mes + 500 tokens IA"
|
||||
- Tiendita: "$199/mes + 2000 tokens + WhatsApp propio"
|
||||
tokens_adicionales:
|
||||
- "$29 = 1,000 tokens"
|
||||
- "$69 = 3,000 tokens"
|
||||
- "$149 = 8,000 tokens"
|
||||
- "$299 = 20,000 tokens"
|
||||
|
||||
# ===============================================================================
|
||||
# VALIDACION DE TOKENS
|
||||
# ===============================================================================
|
||||
|
||||
validacion_tokens:
|
||||
limite_absoluto: 25000
|
||||
limite_seguro: 18000
|
||||
limite_alerta: 20000
|
||||
|
||||
presupuesto:
|
||||
L0_sistema: 4500
|
||||
L1_proyecto: 3500
|
||||
L2_operacion: 2500
|
||||
L3_tarea_max: 8000
|
||||
total_base: 10500
|
||||
disponible_tarea: 7500
|
||||
|
||||
# ===============================================================================
|
||||
# HERENCIA
|
||||
# ===============================================================================
|
||||
|
||||
herencia:
|
||||
tipo: "STANDALONE"
|
||||
hereda_de:
|
||||
- "/home/isem/workspace-v1/orchestration/"
|
||||
usa_catalog:
|
||||
- payments (Stripe, Mercado Pago)
|
||||
- notifications (WhatsApp, Push)
|
||||
- auth (JWT)
|
||||
- multi-tenancy (RLS)
|
||||
|
||||
# ===============================================================================
|
||||
# INTEGRACIONES EXTERNAS
|
||||
# ===============================================================================
|
||||
|
||||
integraciones:
|
||||
whatsapp:
|
||||
proveedor: "Meta WhatsApp Business API"
|
||||
proposito: "Canal principal de comunicacion"
|
||||
stripe:
|
||||
proveedor: "Stripe"
|
||||
proposito: "Suscripciones, pagos, OXXO"
|
||||
mercado_pago:
|
||||
proveedor: "Mercado Pago"
|
||||
proposito: "Terminal de pago con tarjeta"
|
||||
clip:
|
||||
proveedor: "Clip"
|
||||
proposito: "Terminal de pago con tarjeta"
|
||||
codi:
|
||||
proveedor: "CoDi (Banxico)"
|
||||
proposito: "Pagos QR sin comision"
|
||||
llm:
|
||||
proveedor: "OpenRouter (agnostico)"
|
||||
proposito: "Gateway LLM para IA"
|
||||
firebase:
|
||||
proveedor: "Firebase"
|
||||
proposito: "Push notifications"
|
||||
ocr:
|
||||
proveedor: "Google Vision / Tesseract"
|
||||
proposito: "OCR de imagenes"
|
||||
whisper:
|
||||
proveedor: "Whisper"
|
||||
proposito: "Transcripcion de audio"
|
||||
|
||||
# ===============================================================================
|
||||
# BUSQUEDA DE HISTORICO
|
||||
# ===============================================================================
|
||||
|
||||
busqueda_historico:
|
||||
habilitado: true
|
||||
ubicaciones:
|
||||
- "/home/isem/workspace-v1/projects/michangarrito/orchestration/trazas/"
|
||||
- "/home/isem/workspace-v1/projects/michangarrito/orchestration/analisis/"
|
||||
- "/home/isem/workspace-v1/projects/michangarrito/orchestration/reportes/"
|
||||
- "/home/isem/workspace-v1/orchestration/errores/REGISTRO-ERRORES.yml"
|
||||
- "/home/isem/workspace-v1/shared/knowledge-base/lessons-learned/"
|
||||
135
orchestration/PROXIMA-ACCION.md
Normal file
135
orchestration/PROXIMA-ACCION.md
Normal file
@ -0,0 +1,135 @@
|
||||
# PROXIMA ACCION - MiChangarrito
|
||||
|
||||
**Proyecto:** michangarrito
|
||||
**Estado:** 95% MVP Implementado
|
||||
**Fecha:** 2026-01-07
|
||||
**Fase:** Consolidacion de Documentacion SIMCO
|
||||
|
||||
---
|
||||
|
||||
## RESUMEN DEL ESTADO ACTUAL
|
||||
|
||||
### Implementacion Tecnica: 95% COMPLETADA
|
||||
|
||||
| Componente | Estado | Detalles |
|
||||
|------------|--------|----------|
|
||||
| Database | 100% | 10 schemas, 29 tablas |
|
||||
| Backend NestJS | 100% | 14 modulos |
|
||||
| Frontend React | 100% | 7 paginas |
|
||||
| Mobile Expo | 100% | 10 pantallas |
|
||||
| MCP Server | 100% | 15 herramientas |
|
||||
| WhatsApp Service | 100% | Multi-tenant |
|
||||
|
||||
### Documentacion SIMCO: INCOMPLETA
|
||||
|
||||
| Artefacto | Estado | Prioridad |
|
||||
|-----------|--------|-----------|
|
||||
| CONTEXTO-PROYECTO.md | EXISTE | - |
|
||||
| PROJECT-STATUS.md | EXISTE | - |
|
||||
| PLAN-IMPLEMENTACION.md | EXISTE | - |
|
||||
| PROXIMA-ACCION.md | CREADO | P0 |
|
||||
| docs/_MAP.md | FALTA | P0 |
|
||||
| DATABASE_INVENTORY.yml | FALTA | P1 |
|
||||
| BACKEND_INVENTORY.yml | FALTA | P1 |
|
||||
| FRONTEND_INVENTORY.yml | FALTA | P1 |
|
||||
| Epicas MCH-001 a MCH-028 | FALTA | P2 |
|
||||
|
||||
---
|
||||
|
||||
## PROXIMA ACCION INMEDIATA
|
||||
|
||||
### Tarea: Crear docs/_MAP.md
|
||||
|
||||
**Prioridad:** P0
|
||||
**Estimacion:** 0.5 horas
|
||||
**Responsable:** Agente Orquestador
|
||||
|
||||
**Descripcion:**
|
||||
Crear el archivo de navegacion principal para la documentacion del proyecto.
|
||||
|
||||
**Contenido esperado:**
|
||||
```markdown
|
||||
# MiChangarrito - Mapa de Documentacion
|
||||
|
||||
## 00-vision-general/
|
||||
- VISION-PROYECTO.md
|
||||
- REQUERIMIENTOS-FUNCIONALES.md
|
||||
- ARQUITECTURA-TECNICA.md
|
||||
|
||||
## 01-epicas/
|
||||
- MCH-001 a MCH-028
|
||||
|
||||
## 02-especificaciones/
|
||||
- CATALOGO-PRODUCTOS.md
|
||||
- TEMPLATE-PRODUCTOS.md
|
||||
- ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## BACKLOG DE TAREAS
|
||||
|
||||
### Sprint 1: Documentacion Base (4h)
|
||||
|
||||
| # | Tarea | Prioridad | Horas |
|
||||
|---|-------|-----------|-------|
|
||||
| 1 | Crear docs/_MAP.md | P0 | 0.5 |
|
||||
| 2 | Crear DATABASE_INVENTORY.yml | P1 | 1.5 |
|
||||
| 3 | Crear BACKEND_INVENTORY.yml | P1 | 1.5 |
|
||||
| 4 | Crear FRONTEND_INVENTORY.yml | P1 | 1 |
|
||||
|
||||
### Sprint 2: Trazas y Dependencias (4h)
|
||||
|
||||
| # | Tarea | Prioridad | Horas |
|
||||
|---|-------|-----------|-------|
|
||||
| 1 | Crear DEPENDENCIAS.yml | P1 | 1 |
|
||||
| 2 | Crear TRAZA-TAREAS-DATABASE.md | P1 | 1 |
|
||||
| 3 | Crear TRAZA-TAREAS-BACKEND.md | P1 | 1 |
|
||||
| 4 | Crear TRAZA-TAREAS-FRONTEND.md | P1 | 1 |
|
||||
|
||||
### Sprint 3-5: Epicas MCH (42h)
|
||||
|
||||
| # | Tarea | Prioridad | Horas |
|
||||
|---|-------|-----------|-------|
|
||||
| 1-10 | Epicas MCH-001 a MCH-010 | P2 | 15 |
|
||||
| 11-20 | Epicas MCH-011 a MCH-020 | P2 | 15 |
|
||||
| 21-28 | Epicas MCH-021 a MCH-028 | P2 | 12 |
|
||||
|
||||
---
|
||||
|
||||
## DEPENDENCIAS
|
||||
|
||||
### De este proyecto:
|
||||
- @SIMCO para directivas generales
|
||||
- @CATALOG para funcionalidades reutilizables
|
||||
- shared/catalog/payments (Stripe)
|
||||
- shared/catalog/notifications (WhatsApp, Push)
|
||||
|
||||
### Hacia este proyecto:
|
||||
- Ninguna (proyecto STANDALONE)
|
||||
|
||||
---
|
||||
|
||||
## METRICAS DE PROGRESO
|
||||
|
||||
| Metrica | Valor Actual | Objetivo |
|
||||
|---------|--------------|----------|
|
||||
| Archivos SIMCO | 4 de 40+ | 100% |
|
||||
| Epicas documentadas | 0 de 28 | 100% |
|
||||
| Inventarios | 1 (MASTER) | 4 |
|
||||
| Trazas | 0 | 3 |
|
||||
|
||||
---
|
||||
|
||||
## NOTAS
|
||||
|
||||
- El proyecto tiene implementacion tecnica casi completa
|
||||
- Falta documentacion formal SIMCO para trazabilidad
|
||||
- Las epicas MCH-001 a MCH-028 deben seguir el template de gamilit
|
||||
- Priorizar docs/_MAP.md para navegacion
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
**Autor:** Agente Orquestador Workspace
|
||||
**Version:** 1.0.0
|
||||
337
orchestration/inventarios/BACKEND_INVENTORY.yml
Normal file
337
orchestration/inventarios/BACKEND_INVENTORY.yml
Normal file
@ -0,0 +1,337 @@
|
||||
# BACKEND INVENTORY - MiChangarrito
|
||||
# Version: 1.0.0
|
||||
# Ultima actualizacion: 2026-01-07
|
||||
# Sistema: SIMCO - NEXUS v4.0
|
||||
|
||||
metadata:
|
||||
proyecto: "michangarrito"
|
||||
componente: "backend"
|
||||
framework: "NestJS"
|
||||
lenguaje: "TypeScript"
|
||||
puerto: 3141
|
||||
estado: "100% modulos completados"
|
||||
|
||||
# ============================================================================
|
||||
# RESUMEN
|
||||
# ============================================================================
|
||||
|
||||
resumen:
|
||||
total_modulos: 14
|
||||
total_controllers: 14
|
||||
total_services: 14
|
||||
total_entities: 29
|
||||
arquitectura: "modular"
|
||||
orm: "TypeORM"
|
||||
auth: "JWT"
|
||||
|
||||
# ============================================================================
|
||||
# ESTRUCTURA DE CARPETAS
|
||||
# ============================================================================
|
||||
|
||||
estructura:
|
||||
root: "apps/backend"
|
||||
src: "apps/backend/src"
|
||||
modules: "apps/backend/src/modules"
|
||||
shared: "apps/backend/src/shared"
|
||||
config: "apps/backend/src/config"
|
||||
|
||||
# ============================================================================
|
||||
# MODULOS
|
||||
# ============================================================================
|
||||
|
||||
modulos:
|
||||
- nombre: auth
|
||||
ruta: "modules/auth"
|
||||
descripcion: "Autenticacion JWT y sesiones"
|
||||
estado: completado
|
||||
archivos:
|
||||
- auth.module.ts
|
||||
- auth.controller.ts
|
||||
- auth.service.ts
|
||||
- strategies/jwt.strategy.ts
|
||||
- guards/jwt-auth.guard.ts
|
||||
- guards/roles.guard.ts
|
||||
- dto/login.dto.ts
|
||||
- dto/register.dto.ts
|
||||
endpoints:
|
||||
- POST /auth/login
|
||||
- POST /auth/register
|
||||
- POST /auth/logout
|
||||
- GET /auth/me
|
||||
- POST /auth/refresh
|
||||
|
||||
- nombre: billing
|
||||
ruta: "modules/billing"
|
||||
descripcion: "Facturacion y reportes fiscales"
|
||||
estado: completado
|
||||
archivos:
|
||||
- billing.module.ts
|
||||
- billing.controller.ts
|
||||
- billing.service.ts
|
||||
endpoints:
|
||||
- GET /billing/invoices
|
||||
- POST /billing/invoices
|
||||
- GET /billing/reports
|
||||
|
||||
- nombre: categories
|
||||
ruta: "modules/categories"
|
||||
descripcion: "Categorias de productos"
|
||||
estado: completado
|
||||
archivos:
|
||||
- categories.module.ts
|
||||
- categories.controller.ts
|
||||
- categories.service.ts
|
||||
- entities/category.entity.ts
|
||||
- dto/create-category.dto.ts
|
||||
endpoints:
|
||||
- GET /categories
|
||||
- GET /categories/:id
|
||||
- POST /categories
|
||||
- PUT /categories/:id
|
||||
- DELETE /categories/:id
|
||||
|
||||
- nombre: customers
|
||||
ruta: "modules/customers"
|
||||
descripcion: "Clientes y cuentas de credito"
|
||||
estado: completado
|
||||
archivos:
|
||||
- customers.module.ts
|
||||
- customers.controller.ts
|
||||
- customers.service.ts
|
||||
- entities/customer.entity.ts
|
||||
- entities/credit-account.entity.ts
|
||||
- dto/create-customer.dto.ts
|
||||
endpoints:
|
||||
- GET /customers
|
||||
- GET /customers/:id
|
||||
- POST /customers
|
||||
- PUT /customers/:id
|
||||
- DELETE /customers/:id
|
||||
- GET /customers/:id/credit
|
||||
- POST /customers/:id/credit/payment
|
||||
|
||||
- nombre: integrations
|
||||
ruta: "modules/integrations"
|
||||
descripcion: "Integraciones externas por tenant"
|
||||
estado: completado
|
||||
archivos:
|
||||
- integrations.module.ts
|
||||
- integrations.controller.ts
|
||||
- integrations.service.ts
|
||||
- entities/tenant-integration.entity.ts
|
||||
- providers/whatsapp.provider.ts
|
||||
- providers/llm.provider.ts
|
||||
- providers/stripe.provider.ts
|
||||
endpoints:
|
||||
- GET /integrations
|
||||
- GET /integrations/:provider
|
||||
- POST /integrations/:provider/configure
|
||||
- DELETE /integrations/:provider
|
||||
- POST /integrations/:provider/test
|
||||
|
||||
- nombre: inventory
|
||||
ruta: "modules/inventory"
|
||||
descripcion: "Control de inventario"
|
||||
estado: completado
|
||||
archivos:
|
||||
- inventory.module.ts
|
||||
- inventory.controller.ts
|
||||
- inventory.service.ts
|
||||
- entities/stock-movement.entity.ts
|
||||
- entities/inventory-count.entity.ts
|
||||
- dto/stock-adjustment.dto.ts
|
||||
endpoints:
|
||||
- GET /inventory/products/:productId
|
||||
- POST /inventory/adjust
|
||||
- POST /inventory/count
|
||||
- GET /inventory/movements
|
||||
- GET /inventory/low-stock
|
||||
|
||||
- nombre: messaging
|
||||
ruta: "modules/messaging"
|
||||
descripcion: "Mensajeria WhatsApp"
|
||||
estado: completado
|
||||
archivos:
|
||||
- messaging.module.ts
|
||||
- messaging.controller.ts
|
||||
- messaging.service.ts
|
||||
- entities/conversation.entity.ts
|
||||
- entities/message.entity.ts
|
||||
- gateways/whatsapp.gateway.ts
|
||||
endpoints:
|
||||
- GET /messaging/conversations
|
||||
- GET /messaging/conversations/:id
|
||||
- POST /messaging/send
|
||||
- POST /messaging/webhook
|
||||
|
||||
- nombre: orders
|
||||
ruta: "modules/orders"
|
||||
descripcion: "Pedidos"
|
||||
estado: completado
|
||||
archivos:
|
||||
- orders.module.ts
|
||||
- orders.controller.ts
|
||||
- orders.service.ts
|
||||
- entities/order.entity.ts
|
||||
- entities/order-item.entity.ts
|
||||
- dto/create-order.dto.ts
|
||||
endpoints:
|
||||
- GET /orders
|
||||
- GET /orders/:id
|
||||
- POST /orders
|
||||
- PUT /orders/:id/status
|
||||
- DELETE /orders/:id
|
||||
|
||||
- nombre: payments
|
||||
ruta: "modules/payments"
|
||||
descripcion: "Integracion con proveedores de pago"
|
||||
estado: completado
|
||||
archivos:
|
||||
- payments.module.ts
|
||||
- payments.controller.ts
|
||||
- payments.service.ts
|
||||
- providers/stripe.provider.ts
|
||||
- providers/mercadopago.provider.ts
|
||||
endpoints:
|
||||
- POST /payments/intent
|
||||
- POST /payments/confirm
|
||||
- GET /payments/:id
|
||||
- POST /payments/webhook
|
||||
|
||||
- nombre: products
|
||||
ruta: "modules/products"
|
||||
descripcion: "Catalogo de productos"
|
||||
estado: completado
|
||||
archivos:
|
||||
- products.module.ts
|
||||
- products.controller.ts
|
||||
- products.service.ts
|
||||
- entities/product.entity.ts
|
||||
- entities/product-variant.entity.ts
|
||||
- dto/create-product.dto.ts
|
||||
endpoints:
|
||||
- GET /products
|
||||
- GET /products/:id
|
||||
- POST /products
|
||||
- PUT /products/:id
|
||||
- DELETE /products/:id
|
||||
- GET /products/search
|
||||
- GET /products/barcode/:code
|
||||
|
||||
- nombre: sales
|
||||
ruta: "modules/sales"
|
||||
descripcion: "Punto de venta"
|
||||
estado: completado
|
||||
archivos:
|
||||
- sales.module.ts
|
||||
- sales.controller.ts
|
||||
- sales.service.ts
|
||||
- entities/sale.entity.ts
|
||||
- entities/sale-item.entity.ts
|
||||
- dto/create-sale.dto.ts
|
||||
endpoints:
|
||||
- GET /sales
|
||||
- GET /sales/:id
|
||||
- POST /sales
|
||||
- POST /sales/:id/void
|
||||
- GET /sales/daily-report
|
||||
- GET /sales/by-date
|
||||
|
||||
- nombre: subscriptions
|
||||
ruta: "modules/subscriptions"
|
||||
descripcion: "Planes y suscripciones"
|
||||
estado: completado
|
||||
archivos:
|
||||
- subscriptions.module.ts
|
||||
- subscriptions.controller.ts
|
||||
- subscriptions.service.ts
|
||||
- entities/plan.entity.ts
|
||||
- entities/subscription.entity.ts
|
||||
- entities/token-usage.entity.ts
|
||||
endpoints:
|
||||
- GET /subscriptions/plans
|
||||
- GET /subscriptions/current
|
||||
- POST /subscriptions/subscribe
|
||||
- POST /subscriptions/cancel
|
||||
- GET /subscriptions/tokens
|
||||
- POST /subscriptions/tokens/purchase
|
||||
|
||||
# ============================================================================
|
||||
# SHARED
|
||||
# ============================================================================
|
||||
|
||||
shared:
|
||||
guards:
|
||||
- jwt-auth.guard.ts
|
||||
- roles.guard.ts
|
||||
- tenant.guard.ts
|
||||
|
||||
decorators:
|
||||
- current-user.decorator.ts
|
||||
- current-tenant.decorator.ts
|
||||
- roles.decorator.ts
|
||||
|
||||
interceptors:
|
||||
- transform.interceptor.ts
|
||||
- logging.interceptor.ts
|
||||
- tenant.interceptor.ts
|
||||
|
||||
filters:
|
||||
- http-exception.filter.ts
|
||||
- validation.filter.ts
|
||||
|
||||
pipes:
|
||||
- validation.pipe.ts
|
||||
|
||||
middleware:
|
||||
- tenant.middleware.ts
|
||||
- logger.middleware.ts
|
||||
|
||||
# ============================================================================
|
||||
# CONFIGURACION
|
||||
# ============================================================================
|
||||
|
||||
config:
|
||||
database:
|
||||
archivo: "config/database.config.ts"
|
||||
tipo: "TypeORM"
|
||||
|
||||
jwt:
|
||||
archivo: "config/jwt.config.ts"
|
||||
expiracion: "7d"
|
||||
|
||||
redis:
|
||||
archivo: "config/redis.config.ts"
|
||||
db: 8
|
||||
|
||||
# ============================================================================
|
||||
# COMANDOS
|
||||
# ============================================================================
|
||||
|
||||
comandos:
|
||||
build: "npm run build"
|
||||
start_dev: "npm run start:dev"
|
||||
lint: "npm run lint"
|
||||
test: "npm run test"
|
||||
|
||||
# ============================================================================
|
||||
# DEPENDENCIAS PRINCIPALES
|
||||
# ============================================================================
|
||||
|
||||
dependencias:
|
||||
nestjs: "^10.x"
|
||||
typeorm: "^0.3.x"
|
||||
passport: "^0.7.x"
|
||||
passport-jwt: "^4.x"
|
||||
class-validator: "^0.14.x"
|
||||
class-transformer: "^0.5.x"
|
||||
|
||||
# ============================================================================
|
||||
# NOTAS
|
||||
# ============================================================================
|
||||
|
||||
notas:
|
||||
- "Todos los endpoints requieren JWT excepto /auth/login y /auth/register"
|
||||
- "Multi-tenant via header X-Tenant-ID o JWT claim"
|
||||
- "Rate limiting configurado por tenant"
|
||||
- "Swagger disponible en /api/docs"
|
||||
331
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal file
331
orchestration/inventarios/DATABASE_INVENTORY.yml
Normal file
@ -0,0 +1,331 @@
|
||||
# DATABASE INVENTORY - MiChangarrito
|
||||
# Version: 1.0.0
|
||||
# Ultima actualizacion: 2026-01-07
|
||||
# Sistema: SIMCO - NEXUS v4.0
|
||||
|
||||
metadata:
|
||||
proyecto: "michangarrito"
|
||||
componente: "database"
|
||||
db_name: "michangarrito_platform"
|
||||
version_pg: "16+"
|
||||
estado: "100% DDL completado"
|
||||
|
||||
# ============================================================================
|
||||
# RESUMEN
|
||||
# ============================================================================
|
||||
|
||||
resumen:
|
||||
total_schemas: 10
|
||||
total_tablas: 29
|
||||
total_archivos_ddl: 13
|
||||
rls_habilitado: true
|
||||
multi_tenant: true
|
||||
tenant_column: "tenant_id"
|
||||
|
||||
# ============================================================================
|
||||
# ARCHIVOS DDL
|
||||
# ============================================================================
|
||||
|
||||
archivos_ddl:
|
||||
- archivo: "00-extensions.sql"
|
||||
descripcion: "Extensiones PostgreSQL"
|
||||
contenido:
|
||||
- uuid-ossp
|
||||
- pgcrypto
|
||||
estado: completado
|
||||
|
||||
- archivo: "01-schemas.sql"
|
||||
descripcion: "Creacion de schemas"
|
||||
schemas_creados:
|
||||
- public
|
||||
- auth
|
||||
- catalog
|
||||
- sales
|
||||
- inventory
|
||||
- customers
|
||||
- orders
|
||||
- subscriptions
|
||||
- messaging
|
||||
- integrations
|
||||
estado: completado
|
||||
|
||||
- archivo: "02-functions.sql"
|
||||
descripcion: "Funciones utilitarias"
|
||||
funciones:
|
||||
- current_tenant_id()
|
||||
- set_tenant_id(uuid)
|
||||
- updated_at_trigger()
|
||||
estado: completado
|
||||
|
||||
- archivo: "03-public.sql"
|
||||
descripcion: "Schema public - tenants base"
|
||||
tablas:
|
||||
- tenants
|
||||
- tenant_settings
|
||||
estado: completado
|
||||
|
||||
- archivo: "04-auth.sql"
|
||||
descripcion: "Autenticacion y usuarios"
|
||||
tablas:
|
||||
- users
|
||||
- sessions
|
||||
- roles
|
||||
- permissions
|
||||
estado: completado
|
||||
|
||||
- archivo: "05-catalog.sql"
|
||||
descripcion: "Catalogo de productos"
|
||||
tablas:
|
||||
- categories
|
||||
- products
|
||||
- product_variants
|
||||
estado: completado
|
||||
|
||||
- archivo: "06-sales.sql"
|
||||
descripcion: "Punto de venta"
|
||||
tablas:
|
||||
- sales
|
||||
- sale_items
|
||||
- payment_methods
|
||||
- cash_registers
|
||||
estado: completado
|
||||
|
||||
- archivo: "07-inventory.sql"
|
||||
descripcion: "Control de inventario"
|
||||
tablas:
|
||||
- stock_movements
|
||||
- inventory_counts
|
||||
estado: completado
|
||||
|
||||
- archivo: "08-customers.sql"
|
||||
descripcion: "Clientes y fiados"
|
||||
tablas:
|
||||
- customers
|
||||
- credit_accounts
|
||||
- credit_transactions
|
||||
estado: completado
|
||||
|
||||
- archivo: "09-orders.sql"
|
||||
descripcion: "Pedidos"
|
||||
tablas:
|
||||
- orders
|
||||
- order_items
|
||||
estado: completado
|
||||
|
||||
- archivo: "10-subscriptions.sql"
|
||||
descripcion: "Planes y suscripciones"
|
||||
tablas:
|
||||
- plans
|
||||
- subscriptions
|
||||
- token_packages
|
||||
- token_usage
|
||||
estado: completado
|
||||
|
||||
- archivo: "11-messaging.sql"
|
||||
descripcion: "Mensajeria WhatsApp"
|
||||
tablas:
|
||||
- conversations
|
||||
- messages
|
||||
estado: completado
|
||||
|
||||
- archivo: "12-integrations.sql"
|
||||
descripcion: "Integraciones por tenant"
|
||||
tablas:
|
||||
- tenant_integrations
|
||||
- integration_logs
|
||||
estado: completado
|
||||
|
||||
# ============================================================================
|
||||
# SCHEMAS DETALLADOS
|
||||
# ============================================================================
|
||||
|
||||
schemas:
|
||||
public:
|
||||
descripcion: "Datos globales y tenants"
|
||||
tablas:
|
||||
- nombre: tenants
|
||||
columnas: [id, name, slug, settings, status, created_at]
|
||||
rls: false
|
||||
descripcion: "Organizaciones/negocios"
|
||||
|
||||
- nombre: tenant_settings
|
||||
columnas: [id, tenant_id, key, value]
|
||||
rls: true
|
||||
descripcion: "Configuraciones por tenant"
|
||||
|
||||
auth:
|
||||
descripcion: "Autenticacion y sesiones"
|
||||
tablas:
|
||||
- nombre: users
|
||||
columnas: [id, tenant_id, phone, email, password_hash, name, role, status]
|
||||
rls: true
|
||||
descripcion: "Usuarios del sistema"
|
||||
|
||||
- nombre: sessions
|
||||
columnas: [id, user_id, token, device_info, expires_at]
|
||||
rls: true
|
||||
descripcion: "Sesiones activas"
|
||||
|
||||
- nombre: roles
|
||||
columnas: [id, tenant_id, name, permissions]
|
||||
rls: true
|
||||
descripcion: "Roles personalizados"
|
||||
|
||||
catalog:
|
||||
descripcion: "Catalogo de productos"
|
||||
tablas:
|
||||
- nombre: categories
|
||||
columnas: [id, tenant_id, name, parent_id, image_url, sort_order]
|
||||
rls: true
|
||||
descripcion: "Categorias de productos"
|
||||
|
||||
- nombre: products
|
||||
columnas: [id, tenant_id, category_id, sku, name, description, price, cost, image_url, barcode, track_inventory, status]
|
||||
rls: true
|
||||
descripcion: "Productos"
|
||||
|
||||
- nombre: product_variants
|
||||
columnas: [id, product_id, name, sku, price, attributes]
|
||||
rls: true
|
||||
descripcion: "Variantes de producto"
|
||||
|
||||
sales:
|
||||
descripcion: "Punto de venta"
|
||||
tablas:
|
||||
- nombre: sales
|
||||
columnas: [id, tenant_id, user_id, customer_id, subtotal, tax, discount, total, payment_method, status, notes]
|
||||
rls: true
|
||||
descripcion: "Ventas registradas"
|
||||
|
||||
- nombre: sale_items
|
||||
columnas: [id, sale_id, product_id, quantity, unit_price, discount, total]
|
||||
rls: true
|
||||
descripcion: "Detalle de venta"
|
||||
|
||||
- nombre: payment_methods
|
||||
columnas: [id, tenant_id, name, type, settings, active]
|
||||
rls: true
|
||||
descripcion: "Metodos de pago"
|
||||
|
||||
- nombre: cash_registers
|
||||
columnas: [id, tenant_id, name, opening_balance, current_balance, status]
|
||||
rls: true
|
||||
descripcion: "Cajas registradoras"
|
||||
|
||||
inventory:
|
||||
descripcion: "Control de inventario"
|
||||
tablas:
|
||||
- nombre: stock_movements
|
||||
columnas: [id, tenant_id, product_id, type, quantity, reason, reference_id, user_id]
|
||||
rls: true
|
||||
descripcion: "Movimientos de stock"
|
||||
|
||||
- nombre: inventory_counts
|
||||
columnas: [id, tenant_id, product_id, expected, counted, difference, user_id, status]
|
||||
rls: true
|
||||
descripcion: "Conteos de inventario"
|
||||
|
||||
customers:
|
||||
descripcion: "Clientes y credito"
|
||||
tablas:
|
||||
- nombre: customers
|
||||
columnas: [id, tenant_id, name, phone, email, address, credit_enabled, credit_limit, balance]
|
||||
rls: true
|
||||
descripcion: "Clientes"
|
||||
|
||||
- nombre: credit_accounts
|
||||
columnas: [id, customer_id, limit, balance, status]
|
||||
rls: true
|
||||
descripcion: "Cuentas de credito (fiados)"
|
||||
|
||||
- nombre: credit_transactions
|
||||
columnas: [id, credit_account_id, type, amount, sale_id, notes]
|
||||
rls: true
|
||||
descripcion: "Movimientos de credito"
|
||||
|
||||
orders:
|
||||
descripcion: "Pedidos"
|
||||
tablas:
|
||||
- nombre: orders
|
||||
columnas: [id, tenant_id, customer_id, channel, status, total, delivery_address, scheduled_at]
|
||||
rls: true
|
||||
descripcion: "Pedidos"
|
||||
|
||||
- nombre: order_items
|
||||
columnas: [id, order_id, product_id, quantity, unit_price, notes]
|
||||
rls: true
|
||||
descripcion: "Detalle de pedido"
|
||||
|
||||
subscriptions:
|
||||
descripcion: "Planes y tokens IA"
|
||||
tablas:
|
||||
- nombre: plans
|
||||
columnas: [id, name, price, features, token_quota, status]
|
||||
rls: false
|
||||
descripcion: "Planes disponibles"
|
||||
|
||||
- nombre: subscriptions
|
||||
columnas: [id, tenant_id, plan_id, status, current_period_start, current_period_end]
|
||||
rls: true
|
||||
descripcion: "Suscripciones activas"
|
||||
|
||||
- nombre: token_packages
|
||||
columnas: [id, name, tokens, price]
|
||||
rls: false
|
||||
descripcion: "Paquetes de tokens"
|
||||
|
||||
- nombre: token_usage
|
||||
columnas: [id, tenant_id, tokens_used, operation, metadata]
|
||||
rls: true
|
||||
descripcion: "Consumo de tokens"
|
||||
|
||||
messaging:
|
||||
descripcion: "WhatsApp"
|
||||
tablas:
|
||||
- nombre: conversations
|
||||
columnas: [id, tenant_id, customer_phone, status, last_message_at]
|
||||
rls: true
|
||||
descripcion: "Conversaciones"
|
||||
|
||||
- nombre: messages
|
||||
columnas: [id, conversation_id, direction, type, content, status, wa_message_id]
|
||||
rls: true
|
||||
descripcion: "Mensajes"
|
||||
|
||||
integrations:
|
||||
descripcion: "Integraciones externas"
|
||||
tablas:
|
||||
- nombre: tenant_integrations
|
||||
columnas: [id, tenant_id, provider, credentials, settings, status]
|
||||
rls: true
|
||||
descripcion: "Integraciones por tenant"
|
||||
|
||||
- nombre: integration_logs
|
||||
columnas: [id, integration_id, operation, request, response, status]
|
||||
rls: true
|
||||
descripcion: "Logs de integraciones"
|
||||
|
||||
# ============================================================================
|
||||
# COMANDOS UTILES
|
||||
# ============================================================================
|
||||
|
||||
comandos:
|
||||
recrear_db: "./drop-and-recreate-database.sh"
|
||||
conectar: "psql -d michangarrito_platform"
|
||||
ejecutar_ddl: "psql -d michangarrito_platform -f database/schemas/*.sql"
|
||||
|
||||
# ============================================================================
|
||||
# MIGRACIONES PENDIENTES
|
||||
# ============================================================================
|
||||
|
||||
migraciones_pendientes: []
|
||||
|
||||
# ============================================================================
|
||||
# NOTAS
|
||||
# ============================================================================
|
||||
|
||||
notas:
|
||||
- "RLS habilitado en todas las tablas excepto plans y token_packages"
|
||||
- "Usar current_tenant_id() para obtener tenant del contexto"
|
||||
- "Trigger updated_at automatico en todas las tablas"
|
||||
- "Multi-tenant por columna tenant_id"
|
||||
290
orchestration/inventarios/FRONTEND_INVENTORY.yml
Normal file
290
orchestration/inventarios/FRONTEND_INVENTORY.yml
Normal file
@ -0,0 +1,290 @@
|
||||
# FRONTEND INVENTORY - MiChangarrito
|
||||
# Version: 1.0.0
|
||||
# Ultima actualizacion: 2026-01-07
|
||||
# Sistema: SIMCO - NEXUS v4.0
|
||||
|
||||
metadata:
|
||||
proyecto: "michangarrito"
|
||||
componente: "frontend-web"
|
||||
framework: "React 18"
|
||||
bundler: "Vite"
|
||||
styling: "TailwindCSS"
|
||||
puerto: 3140
|
||||
estado: "100% paginas completadas"
|
||||
|
||||
# ============================================================================
|
||||
# RESUMEN
|
||||
# ============================================================================
|
||||
|
||||
resumen:
|
||||
total_paginas: 7
|
||||
total_componentes: 15
|
||||
total_contexts: 3
|
||||
arquitectura: "SPA"
|
||||
state_management: "Context API + React Query"
|
||||
router: "React Router v6"
|
||||
|
||||
# ============================================================================
|
||||
# ESTRUCTURA DE CARPETAS
|
||||
# ============================================================================
|
||||
|
||||
estructura:
|
||||
root: "apps/web"
|
||||
src: "apps/web/src"
|
||||
componentes: "apps/web/src/components"
|
||||
paginas: "apps/web/src/pages"
|
||||
contexts: "apps/web/src/contexts"
|
||||
lib: "apps/web/src/lib"
|
||||
assets: "apps/web/src/assets"
|
||||
|
||||
# ============================================================================
|
||||
# PAGINAS
|
||||
# ============================================================================
|
||||
|
||||
paginas:
|
||||
- nombre: "Login"
|
||||
ruta: "/login"
|
||||
archivo: "pages/Login.tsx"
|
||||
descripcion: "Inicio de sesion"
|
||||
protegida: false
|
||||
estado: completado
|
||||
|
||||
- nombre: "Dashboard"
|
||||
ruta: "/"
|
||||
archivo: "pages/Dashboard.tsx"
|
||||
descripcion: "Panel principal con metricas"
|
||||
protegida: true
|
||||
estado: completado
|
||||
|
||||
- nombre: "POS"
|
||||
ruta: "/pos"
|
||||
archivo: "pages/POS.tsx"
|
||||
descripcion: "Punto de venta"
|
||||
protegida: true
|
||||
estado: completado
|
||||
|
||||
- nombre: "Products"
|
||||
ruta: "/products"
|
||||
archivo: "pages/Products.tsx"
|
||||
descripcion: "Gestion de productos"
|
||||
protegida: true
|
||||
estado: completado
|
||||
|
||||
- nombre: "Customers"
|
||||
ruta: "/customers"
|
||||
archivo: "pages/Customers.tsx"
|
||||
descripcion: "Gestion de clientes"
|
||||
protegida: true
|
||||
estado: completado
|
||||
|
||||
- nombre: "Sales"
|
||||
ruta: "/sales"
|
||||
archivo: "pages/Sales.tsx"
|
||||
descripcion: "Historial de ventas"
|
||||
protegida: true
|
||||
estado: completado
|
||||
|
||||
- nombre: "Settings"
|
||||
ruta: "/settings"
|
||||
archivo: "pages/Settings.tsx"
|
||||
descripcion: "Configuracion del negocio"
|
||||
protegida: true
|
||||
estado: completado
|
||||
|
||||
# ============================================================================
|
||||
# COMPONENTES
|
||||
# ============================================================================
|
||||
|
||||
componentes:
|
||||
layout:
|
||||
- nombre: "Layout"
|
||||
archivo: "components/Layout.tsx"
|
||||
descripcion: "Layout principal con sidebar"
|
||||
|
||||
- nombre: "Sidebar"
|
||||
archivo: "components/Sidebar.tsx"
|
||||
descripcion: "Menu lateral de navegacion"
|
||||
|
||||
- nombre: "Header"
|
||||
archivo: "components/Header.tsx"
|
||||
descripcion: "Header con usuario y notificaciones"
|
||||
|
||||
pos:
|
||||
- nombre: "ProductGrid"
|
||||
archivo: "components/pos/ProductGrid.tsx"
|
||||
descripcion: "Grid de productos para venta"
|
||||
|
||||
- nombre: "Cart"
|
||||
archivo: "components/pos/Cart.tsx"
|
||||
descripcion: "Carrito de compra"
|
||||
|
||||
- nombre: "PaymentModal"
|
||||
archivo: "components/pos/PaymentModal.tsx"
|
||||
descripcion: "Modal de pago"
|
||||
|
||||
- nombre: "ReceiptModal"
|
||||
archivo: "components/pos/ReceiptModal.tsx"
|
||||
descripcion: "Ticket de venta"
|
||||
|
||||
products:
|
||||
- nombre: "ProductList"
|
||||
archivo: "components/products/ProductList.tsx"
|
||||
descripcion: "Tabla de productos"
|
||||
|
||||
- nombre: "ProductForm"
|
||||
archivo: "components/products/ProductForm.tsx"
|
||||
descripcion: "Formulario crear/editar producto"
|
||||
|
||||
- nombre: "CategorySelect"
|
||||
archivo: "components/products/CategorySelect.tsx"
|
||||
descripcion: "Selector de categoria"
|
||||
|
||||
customers:
|
||||
- nombre: "CustomerList"
|
||||
archivo: "components/customers/CustomerList.tsx"
|
||||
descripcion: "Tabla de clientes"
|
||||
|
||||
- nombre: "CustomerForm"
|
||||
archivo: "components/customers/CustomerForm.tsx"
|
||||
descripcion: "Formulario de cliente"
|
||||
|
||||
- nombre: "CreditHistory"
|
||||
archivo: "components/customers/CreditHistory.tsx"
|
||||
descripcion: "Historial de fiados"
|
||||
|
||||
common:
|
||||
- nombre: "Button"
|
||||
archivo: "components/ui/Button.tsx"
|
||||
descripcion: "Boton reutilizable"
|
||||
|
||||
- nombre: "Input"
|
||||
archivo: "components/ui/Input.tsx"
|
||||
descripcion: "Input con validacion"
|
||||
|
||||
- nombre: "Modal"
|
||||
archivo: "components/ui/Modal.tsx"
|
||||
descripcion: "Modal base"
|
||||
|
||||
- nombre: "Table"
|
||||
archivo: "components/ui/Table.tsx"
|
||||
descripcion: "Tabla con paginacion"
|
||||
|
||||
- nombre: "Card"
|
||||
archivo: "components/ui/Card.tsx"
|
||||
descripcion: "Card container"
|
||||
|
||||
# ============================================================================
|
||||
# CONTEXTS
|
||||
# ============================================================================
|
||||
|
||||
contexts:
|
||||
- nombre: "AuthContext"
|
||||
archivo: "contexts/AuthContext.tsx"
|
||||
descripcion: "Estado de autenticacion"
|
||||
provee:
|
||||
- user
|
||||
- token
|
||||
- login()
|
||||
- logout()
|
||||
- isAuthenticated
|
||||
|
||||
- nombre: "CartContext"
|
||||
archivo: "contexts/CartContext.tsx"
|
||||
descripcion: "Estado del carrito POS"
|
||||
provee:
|
||||
- items
|
||||
- addItem()
|
||||
- removeItem()
|
||||
- updateQuantity()
|
||||
- clear()
|
||||
- total
|
||||
|
||||
- nombre: "TenantContext"
|
||||
archivo: "contexts/TenantContext.tsx"
|
||||
descripcion: "Configuracion del tenant"
|
||||
provee:
|
||||
- tenant
|
||||
- settings
|
||||
- updateSettings()
|
||||
|
||||
# ============================================================================
|
||||
# LIB / UTILIDADES
|
||||
# ============================================================================
|
||||
|
||||
lib:
|
||||
- nombre: "api"
|
||||
archivo: "lib/api.ts"
|
||||
descripcion: "Cliente HTTP con Axios"
|
||||
|
||||
- nombre: "auth"
|
||||
archivo: "lib/auth.ts"
|
||||
descripcion: "Funciones de autenticacion"
|
||||
|
||||
- nombre: "format"
|
||||
archivo: "lib/format.ts"
|
||||
descripcion: "Formateo de moneda, fechas"
|
||||
|
||||
- nombre: "storage"
|
||||
archivo: "lib/storage.ts"
|
||||
descripcion: "LocalStorage helpers"
|
||||
|
||||
# ============================================================================
|
||||
# RUTAS
|
||||
# ============================================================================
|
||||
|
||||
rutas:
|
||||
publicas:
|
||||
- /login
|
||||
|
||||
protegidas:
|
||||
- /
|
||||
- /pos
|
||||
- /products
|
||||
- /customers
|
||||
- /sales
|
||||
- /settings
|
||||
|
||||
por_rol:
|
||||
owner:
|
||||
- todas
|
||||
employee:
|
||||
- /
|
||||
- /pos
|
||||
- /sales
|
||||
viewer:
|
||||
- /
|
||||
- /sales
|
||||
|
||||
# ============================================================================
|
||||
# COMANDOS
|
||||
# ============================================================================
|
||||
|
||||
comandos:
|
||||
dev: "npm run dev"
|
||||
build: "npm run build"
|
||||
preview: "npm run preview"
|
||||
lint: "npm run lint"
|
||||
|
||||
# ============================================================================
|
||||
# DEPENDENCIAS PRINCIPALES
|
||||
# ============================================================================
|
||||
|
||||
dependencias:
|
||||
react: "^18.x"
|
||||
react-router-dom: "^6.x"
|
||||
axios: "^1.x"
|
||||
react-query: "^5.x"
|
||||
tailwindcss: "^3.x"
|
||||
lucide-react: "^0.x"
|
||||
react-hook-form: "^7.x"
|
||||
zod: "^3.x"
|
||||
|
||||
# ============================================================================
|
||||
# NOTAS
|
||||
# ============================================================================
|
||||
|
||||
notas:
|
||||
- "Responsive design para tablet y desktop"
|
||||
- "Dark mode pendiente"
|
||||
- "PWA pendiente"
|
||||
- "Offline mode pendiente"
|
||||
154
orchestration/trazas/TRAZA-TAREAS-DATABASE.md
Normal file
154
orchestration/trazas/TRAZA-TAREAS-DATABASE.md
Normal file
@ -0,0 +1,154 @@
|
||||
# TRAZA DE TAREAS - DATABASE
|
||||
|
||||
**Proyecto:** michangarrito
|
||||
**Capa:** Database (PostgreSQL)
|
||||
**Version:** 1.0.0
|
||||
|
||||
---
|
||||
|
||||
## HISTORIAL
|
||||
|
||||
### [2026-01-04] MCH-DB-001
|
||||
**Estado:** completado
|
||||
**Agente:** Database-Agent
|
||||
|
||||
#### Descripcion
|
||||
Setup inicial de base de datos PostgreSQL con multi-tenant.
|
||||
|
||||
#### Archivos Creados
|
||||
- `database/schemas/00-extensions.sql`
|
||||
- `database/schemas/01-schemas.sql`
|
||||
- `database/schemas/02-functions.sql`
|
||||
|
||||
#### Resultado
|
||||
Extensiones uuid-ossp y pgcrypto habilitadas. Funcion current_tenant_id() creada.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-05] MCH-DB-002
|
||||
**Estado:** completado
|
||||
**Agente:** Database-Agent
|
||||
|
||||
#### Descripcion
|
||||
Schema public y auth implementados.
|
||||
|
||||
#### Archivos Creados
|
||||
- `database/schemas/03-public.sql` (tenants, tenant_settings)
|
||||
- `database/schemas/04-auth.sql` (users, sessions, roles)
|
||||
|
||||
#### Resultado
|
||||
Tablas base con RLS configurado.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-05] MCH-DB-003
|
||||
**Estado:** completado
|
||||
**Agente:** Database-Agent
|
||||
|
||||
#### Descripcion
|
||||
Schema catalog para productos y categorias.
|
||||
|
||||
#### Archivos Creados
|
||||
- `database/schemas/05-catalog.sql` (categories, products, product_variants)
|
||||
|
||||
#### Resultado
|
||||
Catalogo con soporte para variantes y codigos de barras.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-06] MCH-DB-004
|
||||
**Estado:** completado
|
||||
**Agente:** Database-Agent
|
||||
|
||||
#### Descripcion
|
||||
Schema sales para punto de venta.
|
||||
|
||||
#### Archivos Creados
|
||||
- `database/schemas/06-sales.sql` (sales, sale_items, payment_methods, cash_registers)
|
||||
|
||||
#### Resultado
|
||||
POS completamente funcional con multiples metodos de pago.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-06] MCH-DB-005
|
||||
**Estado:** completado
|
||||
**Agente:** Database-Agent
|
||||
|
||||
#### Descripcion
|
||||
Schemas inventory y customers.
|
||||
|
||||
#### Archivos Creados
|
||||
- `database/schemas/07-inventory.sql` (stock_movements, inventory_counts)
|
||||
- `database/schemas/08-customers.sql` (customers, credit_accounts, credit_transactions)
|
||||
|
||||
#### Resultado
|
||||
Control de inventario y sistema de fiados implementado.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-06] MCH-DB-006
|
||||
**Estado:** completado
|
||||
**Agente:** Database-Agent
|
||||
|
||||
#### Descripcion
|
||||
Schemas orders, subscriptions, messaging, integrations.
|
||||
|
||||
#### Archivos Creados
|
||||
- `database/schemas/09-orders.sql`
|
||||
- `database/schemas/10-subscriptions.sql`
|
||||
- `database/schemas/11-messaging.sql`
|
||||
- `database/schemas/12-integrations.sql`
|
||||
|
||||
#### Resultado
|
||||
29 tablas totales en 10 schemas. DDL 100% completado.
|
||||
|
||||
---
|
||||
|
||||
## ESTADISTICAS
|
||||
|
||||
| Metrica | Valor |
|
||||
|---------|-------|
|
||||
| Total Schemas | 10 |
|
||||
| Total Tablas | 29 |
|
||||
| Tablas con RLS | 27 |
|
||||
| Archivos DDL | 13 |
|
||||
| Estado | 100% Completado |
|
||||
|
||||
---
|
||||
|
||||
## TAREAS PENDIENTES
|
||||
|
||||
| ID | Tarea | Prioridad | Dependencias |
|
||||
|----|-------|-----------|--------------|
|
||||
| MCH-DB-007 | Seeds de datos demo | P2 | - |
|
||||
| MCH-DB-008 | Indices de performance | P2 | MCH-DB-006 |
|
||||
| MCH-DB-009 | Particionamiento sales | P3 | MCH-DB-008 |
|
||||
|
||||
---
|
||||
|
||||
## REFERENCIA RAPIDA
|
||||
|
||||
```
|
||||
database/
|
||||
├── schemas/
|
||||
│ ├── 00-extensions.sql
|
||||
│ ├── 01-schemas.sql
|
||||
│ ├── 02-functions.sql
|
||||
│ ├── 03-public.sql
|
||||
│ ├── 04-auth.sql
|
||||
│ ├── 05-catalog.sql
|
||||
│ ├── 06-sales.sql
|
||||
│ ├── 07-inventory.sql
|
||||
│ ├── 08-customers.sql
|
||||
│ ├── 09-orders.sql
|
||||
│ ├── 10-subscriptions.sql
|
||||
│ ├── 11-messaging.sql
|
||||
│ └── 12-integrations.sql
|
||||
├── seeds/
|
||||
└── drop-and-recreate-database.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
212
orchestration/trazas/TRAZA-TAREAS-FRONTEND.md
Normal file
212
orchestration/trazas/TRAZA-TAREAS-FRONTEND.md
Normal file
@ -0,0 +1,212 @@
|
||||
# TRAZA DE TAREAS - FRONTEND
|
||||
|
||||
**Proyecto:** michangarrito
|
||||
**Capa:** Frontend Web (React + Vite)
|
||||
**Version:** 1.0.0
|
||||
|
||||
---
|
||||
|
||||
## HISTORIAL
|
||||
|
||||
### [2026-01-04] MCH-FE-001
|
||||
**Estado:** completado
|
||||
**Agente:** Frontend-Agent
|
||||
|
||||
#### Descripcion
|
||||
Setup proyecto React con Vite y TailwindCSS.
|
||||
|
||||
#### Archivos Creados
|
||||
- `apps/web/` (estructura base)
|
||||
- `apps/web/tailwind.config.js`
|
||||
- `apps/web/vite.config.ts`
|
||||
|
||||
#### Resultado
|
||||
Proyecto configurado con React 18, Vite, TailwindCSS.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-05] MCH-FE-002
|
||||
**Estado:** completado
|
||||
**Agente:** Frontend-Agent
|
||||
|
||||
#### Descripcion
|
||||
Layout principal y componentes base UI.
|
||||
|
||||
#### Archivos Creados
|
||||
- `apps/web/src/components/Layout.tsx`
|
||||
- `apps/web/src/components/Sidebar.tsx`
|
||||
- `apps/web/src/components/Header.tsx`
|
||||
- `apps/web/src/components/ui/Button.tsx`
|
||||
- `apps/web/src/components/ui/Input.tsx`
|
||||
- `apps/web/src/components/ui/Modal.tsx`
|
||||
- `apps/web/src/components/ui/Card.tsx`
|
||||
- `apps/web/src/components/ui/Table.tsx`
|
||||
|
||||
#### Resultado
|
||||
Sistema de componentes UI base implementado.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-05] MCH-FE-003
|
||||
**Estado:** completado
|
||||
**Agente:** Frontend-Agent
|
||||
|
||||
#### Descripcion
|
||||
Contexts de autenticacion y carrito.
|
||||
|
||||
#### Archivos Creados
|
||||
- `apps/web/src/contexts/AuthContext.tsx`
|
||||
- `apps/web/src/contexts/CartContext.tsx`
|
||||
- `apps/web/src/contexts/TenantContext.tsx`
|
||||
|
||||
#### Resultado
|
||||
State management con Context API configurado.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-06] MCH-FE-004
|
||||
**Estado:** completado
|
||||
**Agente:** Frontend-Agent
|
||||
|
||||
#### Descripcion
|
||||
Pagina de Login y Dashboard.
|
||||
|
||||
#### Archivos Creados
|
||||
- `apps/web/src/pages/Login.tsx`
|
||||
- `apps/web/src/pages/Dashboard.tsx`
|
||||
|
||||
#### Resultado
|
||||
Login funcional con OTP. Dashboard con metricas.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-06] MCH-FE-005
|
||||
**Estado:** completado
|
||||
**Agente:** Frontend-Agent
|
||||
|
||||
#### Descripcion
|
||||
Pagina POS y componentes relacionados.
|
||||
|
||||
#### Archivos Creados
|
||||
- `apps/web/src/pages/POS.tsx`
|
||||
- `apps/web/src/components/pos/ProductGrid.tsx`
|
||||
- `apps/web/src/components/pos/Cart.tsx`
|
||||
- `apps/web/src/components/pos/PaymentModal.tsx`
|
||||
- `apps/web/src/components/pos/ReceiptModal.tsx`
|
||||
|
||||
#### Resultado
|
||||
Punto de venta completo con carrito y pago.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-06] MCH-FE-006
|
||||
**Estado:** completado
|
||||
**Agente:** Frontend-Agent
|
||||
|
||||
#### Descripcion
|
||||
Paginas Products y Customers.
|
||||
|
||||
#### Archivos Creados
|
||||
- `apps/web/src/pages/Products.tsx`
|
||||
- `apps/web/src/pages/Customers.tsx`
|
||||
- `apps/web/src/components/products/ProductList.tsx`
|
||||
- `apps/web/src/components/products/ProductForm.tsx`
|
||||
- `apps/web/src/components/products/CategorySelect.tsx`
|
||||
- `apps/web/src/components/customers/CustomerList.tsx`
|
||||
- `apps/web/src/components/customers/CustomerForm.tsx`
|
||||
- `apps/web/src/components/customers/CreditHistory.tsx`
|
||||
|
||||
#### Resultado
|
||||
CRUD completo de productos y clientes.
|
||||
|
||||
---
|
||||
|
||||
### [2026-01-07] MCH-FE-007
|
||||
**Estado:** completado
|
||||
**Agente:** Frontend-Agent
|
||||
|
||||
#### Descripcion
|
||||
Paginas Sales y Settings.
|
||||
|
||||
#### Archivos Creados
|
||||
- `apps/web/src/pages/Sales.tsx`
|
||||
- `apps/web/src/pages/Settings.tsx`
|
||||
|
||||
#### Resultado
|
||||
Historial de ventas y configuracion del negocio.
|
||||
|
||||
---
|
||||
|
||||
## ESTADISTICAS
|
||||
|
||||
| Metrica | Valor |
|
||||
|---------|-------|
|
||||
| Total Paginas | 7 |
|
||||
| Total Componentes | 15 |
|
||||
| Contexts | 3 |
|
||||
| Libs/Utils | 4 |
|
||||
| Estado | 100% Completado |
|
||||
|
||||
---
|
||||
|
||||
## TAREAS PENDIENTES
|
||||
|
||||
| ID | Tarea | Prioridad | Dependencias |
|
||||
|----|-------|-----------|--------------|
|
||||
| MCH-FE-008 | Implementar Dark Mode | P2 | MCH-FE-006 |
|
||||
| MCH-FE-009 | PWA y Service Worker | P1 | MCH-FE-007 |
|
||||
| MCH-FE-010 | Modo Offline | P1 | MCH-FE-009 |
|
||||
| MCH-FE-011 | Dashboard reportes avanzados | P2 | MCH-FE-007 |
|
||||
| MCH-FE-012 | Integracion WebSocket | P2 | MCH-BE-010 |
|
||||
|
||||
---
|
||||
|
||||
## REFERENCIA RAPIDA
|
||||
|
||||
```
|
||||
apps/web/src/
|
||||
├── components/
|
||||
│ ├── Layout.tsx
|
||||
│ ├── Sidebar.tsx
|
||||
│ ├── Header.tsx
|
||||
│ ├── pos/
|
||||
│ │ ├── ProductGrid.tsx
|
||||
│ │ ├── Cart.tsx
|
||||
│ │ ├── PaymentModal.tsx
|
||||
│ │ └── ReceiptModal.tsx
|
||||
│ ├── products/
|
||||
│ │ ├── ProductList.tsx
|
||||
│ │ ├── ProductForm.tsx
|
||||
│ │ └── CategorySelect.tsx
|
||||
│ ├── customers/
|
||||
│ │ ├── CustomerList.tsx
|
||||
│ │ ├── CustomerForm.tsx
|
||||
│ │ └── CreditHistory.tsx
|
||||
│ └── ui/
|
||||
│ ├── Button.tsx
|
||||
│ ├── Input.tsx
|
||||
│ ├── Modal.tsx
|
||||
│ ├── Card.tsx
|
||||
│ └── Table.tsx
|
||||
├── contexts/
|
||||
│ ├── AuthContext.tsx
|
||||
│ ├── CartContext.tsx
|
||||
│ └── TenantContext.tsx
|
||||
├── pages/
|
||||
│ ├── Login.tsx
|
||||
│ ├── Dashboard.tsx
|
||||
│ ├── POS.tsx
|
||||
│ ├── Products.tsx
|
||||
│ ├── Customers.tsx
|
||||
│ ├── Sales.tsx
|
||||
│ └── Settings.tsx
|
||||
└── lib/
|
||||
├── api.ts
|
||||
├── auth.ts
|
||||
├── format.ts
|
||||
└── storage.ts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizacion:** 2026-01-07
|
||||
Loading…
Reference in New Issue
Block a user