diff --git a/docs/01-epicas/MCH-001-infraestructura-base.md b/docs/01-epicas/MCH-001-infraestructura-base.md new file mode 100644 index 000000000..d726c8f7c --- /dev/null +++ b/docs/01-epicas/MCH-001-infraestructura-base.md @@ -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 diff --git a/docs/01-epicas/MCH-002-autenticacion.md b/docs/01-epicas/MCH-002-autenticacion.md new file mode 100644 index 000000000..d0b2dfc3e --- /dev/null +++ b/docs/01-epicas/MCH-002-autenticacion.md @@ -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 diff --git a/docs/01-epicas/MCH-003-catalogo-productos.md b/docs/01-epicas/MCH-003-catalogo-productos.md new file mode 100644 index 000000000..d7f333333 --- /dev/null +++ b/docs/01-epicas/MCH-003-catalogo-productos.md @@ -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 diff --git a/docs/01-epicas/MCH-004-punto-venta.md b/docs/01-epicas/MCH-004-punto-venta.md new file mode 100644 index 000000000..965d69291 --- /dev/null +++ b/docs/01-epicas/MCH-004-punto-venta.md @@ -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 diff --git a/docs/01-epicas/MCH-005-integraciones-pago.md b/docs/01-epicas/MCH-005-integraciones-pago.md new file mode 100644 index 000000000..92185fa7b --- /dev/null +++ b/docs/01-epicas/MCH-005-integraciones-pago.md @@ -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 diff --git a/docs/01-epicas/MCH-006-onboarding-inteligente.md b/docs/01-epicas/MCH-006-onboarding-inteligente.md new file mode 100644 index 000000000..58dc0a713 --- /dev/null +++ b/docs/01-epicas/MCH-006-onboarding-inteligente.md @@ -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 diff --git a/docs/01-epicas/MCH-007-templates-catalogos.md b/docs/01-epicas/MCH-007-templates-catalogos.md new file mode 100644 index 000000000..d1485a467 --- /dev/null +++ b/docs/01-epicas/MCH-007-templates-catalogos.md @@ -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 diff --git a/docs/01-epicas/MCH-008-sistema-fiados.md b/docs/01-epicas/MCH-008-sistema-fiados.md new file mode 100644 index 000000000..17e5d1046 --- /dev/null +++ b/docs/01-epicas/MCH-008-sistema-fiados.md @@ -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 diff --git a/docs/01-epicas/MCH-009-prediccion-inventario.md b/docs/01-epicas/MCH-009-prediccion-inventario.md new file mode 100644 index 000000000..468d96de2 --- /dev/null +++ b/docs/01-epicas/MCH-009-prediccion-inventario.md @@ -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 diff --git a/docs/01-epicas/MCH-010-mcp-server.md b/docs/01-epicas/MCH-010-mcp-server.md new file mode 100644 index 000000000..5f48df01d --- /dev/null +++ b/docs/01-epicas/MCH-010-mcp-server.md @@ -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 diff --git a/docs/01-epicas/MCH-011-whatsapp-service.md b/docs/01-epicas/MCH-011-whatsapp-service.md new file mode 100644 index 000000000..a8c153ea4 --- /dev/null +++ b/docs/01-epicas/MCH-011-whatsapp-service.md @@ -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 diff --git a/docs/01-epicas/MCH-012-chat-llm-dueno.md b/docs/01-epicas/MCH-012-chat-llm-dueno.md new file mode 100644 index 000000000..31f963202 --- /dev/null +++ b/docs/01-epicas/MCH-012-chat-llm-dueno.md @@ -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 diff --git a/docs/01-epicas/MCH-013-chat-llm-cliente.md b/docs/01-epicas/MCH-013-chat-llm-cliente.md new file mode 100644 index 000000000..9fc93aaf5 --- /dev/null +++ b/docs/01-epicas/MCH-013-chat-llm-cliente.md @@ -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 diff --git a/docs/01-epicas/MCH-014-gestion-clientes.md b/docs/01-epicas/MCH-014-gestion-clientes.md new file mode 100644 index 000000000..e2288027d --- /dev/null +++ b/docs/01-epicas/MCH-014-gestion-clientes.md @@ -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 diff --git a/docs/01-epicas/MCH-015-pedidos-whatsapp.md b/docs/01-epicas/MCH-015-pedidos-whatsapp.md new file mode 100644 index 000000000..9cead872d --- /dev/null +++ b/docs/01-epicas/MCH-015-pedidos-whatsapp.md @@ -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 diff --git a/docs/01-epicas/MCH-016-entregas-domicilio.md b/docs/01-epicas/MCH-016-entregas-domicilio.md new file mode 100644 index 000000000..07f0eebd1 --- /dev/null +++ b/docs/01-epicas/MCH-016-entregas-domicilio.md @@ -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 diff --git a/docs/01-epicas/MCH-017-notificaciones.md b/docs/01-epicas/MCH-017-notificaciones.md new file mode 100644 index 000000000..c519960bb --- /dev/null +++ b/docs/01-epicas/MCH-017-notificaciones.md @@ -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 diff --git a/docs/01-epicas/MCH-018-planes-suscripciones.md b/docs/01-epicas/MCH-018-planes-suscripciones.md new file mode 100644 index 000000000..e31b99754 --- /dev/null +++ b/docs/01-epicas/MCH-018-planes-suscripciones.md @@ -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 diff --git a/docs/01-epicas/MCH-019-tienda-tokens.md b/docs/01-epicas/MCH-019-tienda-tokens.md new file mode 100644 index 000000000..018079517 --- /dev/null +++ b/docs/01-epicas/MCH-019-tienda-tokens.md @@ -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 diff --git a/docs/01-epicas/MCH-020-pagos-suscripcion.md b/docs/01-epicas/MCH-020-pagos-suscripcion.md new file mode 100644 index 000000000..0c591d75d --- /dev/null +++ b/docs/01-epicas/MCH-020-pagos-suscripcion.md @@ -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 diff --git a/docs/01-epicas/MCH-021-dashboard-web.md b/docs/01-epicas/MCH-021-dashboard-web.md new file mode 100644 index 000000000..3dd503f6c --- /dev/null +++ b/docs/01-epicas/MCH-021-dashboard-web.md @@ -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 diff --git a/docs/01-epicas/MCH-022-modo-offline.md b/docs/01-epicas/MCH-022-modo-offline.md new file mode 100644 index 000000000..6a277b4f4 --- /dev/null +++ b/docs/01-epicas/MCH-022-modo-offline.md @@ -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 diff --git a/docs/01-epicas/MCH-023-programa-referidos.md b/docs/01-epicas/MCH-023-programa-referidos.md new file mode 100644 index 000000000..33e1eb097 --- /dev/null +++ b/docs/01-epicas/MCH-023-programa-referidos.md @@ -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 diff --git a/docs/01-epicas/MCH-024-codi-spei.md b/docs/01-epicas/MCH-024-codi-spei.md new file mode 100644 index 000000000..cc74bfcb4 --- /dev/null +++ b/docs/01-epicas/MCH-024-codi-spei.md @@ -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 diff --git a/docs/01-epicas/MCH-025-widgets-atajos.md b/docs/01-epicas/MCH-025-widgets-atajos.md new file mode 100644 index 000000000..86065547f --- /dev/null +++ b/docs/01-epicas/MCH-025-widgets-atajos.md @@ -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 diff --git a/docs/01-epicas/MCH-026-multi-idioma-latam.md b/docs/01-epicas/MCH-026-multi-idioma-latam.md new file mode 100644 index 000000000..769586bf6 --- /dev/null +++ b/docs/01-epicas/MCH-026-multi-idioma-latam.md @@ -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 ( +