- Create orchestration/tareas/_INDEX.yml for task tracking - Create TASK-TEMPLATE with METADATA.yml and phase templates - Add TASK-2026-01-20-001 documenting Sprint 8 completion - Update agents/trazas/_INDEX.yml with activity records - Update inventarios (MASTER, FRONTEND) to reflect Sprint 8 - Update PROJECT-STATUS.md and PROXIMA-ACCION.md Gobernanza SIMCO v4.0.0 completa para michangarrito. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
538 lines
17 KiB
YAML
538 lines
17 KiB
YAML
# FRONTEND INVENTORY - MiChangarrito
|
|
# Version: 2.4.0
|
|
# Ultima actualizacion: 2026-01-20
|
|
# Sistema: SIMCO v4.0.0 + CAPVED
|
|
# Actualizado: Sprint 8 - Frontend Integration Complete
|
|
|
|
metadata:
|
|
proyecto: "michangarrito"
|
|
componente: "frontend-web"
|
|
framework: "React 19.2.0"
|
|
bundler: "Vite 7.2.4"
|
|
styling: "TailwindCSS 4.1.18"
|
|
puerto: 3140
|
|
estado: "100% paginas funcionales (14/14 conectadas a APIs)"
|
|
actualizado: "2026-01-20"
|
|
actualizado_por: "Agente Orquestador"
|
|
|
|
# ============================================================================
|
|
# NOTA IMPORTANTE (2026-01-20)
|
|
# ============================================================================
|
|
#
|
|
# Estado real del frontend (Sprint 8 COMPLETADO):
|
|
# - 14 paginas FUNCIONALES (conectadas a APIs reales)
|
|
# - Dark Mode implementado con ThemeContext
|
|
# - PWA habilitado con Vite plugin
|
|
# - Exportacion PDF/Excel disponible
|
|
#
|
|
# Paginas funcionales: Login, Register, Dashboard, Products, Orders, Customers,
|
|
# Fiado, Inventory, Invoices, Marketplace, Tokens, CodiSpei, Referrals, Settings
|
|
#
|
|
|
|
# ============================================================================
|
|
# CONFIGURACION
|
|
# ============================================================================
|
|
|
|
configuracion:
|
|
puerto: 3140
|
|
proxy_api: "http://localhost:3141"
|
|
api_prefix: "/api/v1"
|
|
router: "React Router DOM 7.11.0"
|
|
state_management: "Context API + TanStack React Query 5.90.16 + Zustand"
|
|
http_client: "Axios 1.13.2"
|
|
icons: "Lucide React 0.562.0"
|
|
forms: "React Hook Form + Zod"
|
|
|
|
# ============================================================================
|
|
# RESUMEN
|
|
# ============================================================================
|
|
|
|
resumen:
|
|
total_paginas: 14
|
|
total_componentes_reutilizables: 3 # Layout, ClabeDisplay, CodiQR
|
|
total_componentes_internos_paginas: 8 # Modales y subcomponentes en paginas
|
|
total_contexts: 1 # AuthContext
|
|
total_servicios_api: 12 # Grupos de API en lib/api.ts
|
|
arquitectura: "SPA"
|
|
documentacion: "docs/_definitions/COMPONENTES-FRONTEND.md"
|
|
paginas_nuevas:
|
|
- Tokens (Tienda de Tokens - Sprint 6)
|
|
- CodiSpei (CoDi QR + SPEI CLABE - Sprint 6)
|
|
- Invoices (Facturacion CFDI 4.0)
|
|
- Marketplace (Proveedores B2B)
|
|
- Referrals (Sistema de referidos)
|
|
|
|
# ============================================================================
|
|
# ESTRUCTURA DE CARPETAS
|
|
# ============================================================================
|
|
|
|
estructura:
|
|
root: "apps/frontend"
|
|
src: "apps/frontend/src"
|
|
componentes: "apps/frontend/src/components"
|
|
paginas: "apps/frontend/src/pages"
|
|
contexts: "apps/frontend/src/contexts"
|
|
lib: "apps/frontend/src/lib"
|
|
assets: "apps/frontend/src/assets"
|
|
|
|
# ============================================================================
|
|
# PAGINAS
|
|
# ============================================================================
|
|
|
|
paginas:
|
|
- nombre: "Dashboard"
|
|
ruta: "/dashboard"
|
|
archivo: "pages/Dashboard.tsx"
|
|
descripcion: "Panel principal con metricas y resumen del negocio"
|
|
protegida: true
|
|
estado: funcional # Conectado a dashboardApi (2026-01-20)
|
|
api_consumida: "dashboardApi (getStats), ordersApi (getAll), inventoryApi (getLowStock)"
|
|
caracteristicas:
|
|
- Tarjetas de estadisticas (ventas, pedidos, clientes, fiados)
|
|
- Pedidos recientes
|
|
- Alertas de stock bajo
|
|
|
|
- nombre: "Products"
|
|
ruta: "/products"
|
|
archivo: "pages/Products.tsx"
|
|
descripcion: "Catalogo de productos con busqueda y filtrado"
|
|
protegida: true
|
|
estado: funcional # Conectado a productsApi (2026-01-20)
|
|
api_consumida: "productsApi (getAll, getById, create, update, delete)"
|
|
caracteristicas:
|
|
- Busqueda por nombre
|
|
- Filtrado por categoria
|
|
- Vista en grid
|
|
- Acciones editar/eliminar
|
|
|
|
- nombre: "Orders"
|
|
ruta: "/orders"
|
|
archivo: "pages/Orders.tsx"
|
|
descripcion: "Gestion de pedidos con seguimiento de estado"
|
|
protegida: true
|
|
estado: funcional # Conectado a ordersApi (2026-01-20)
|
|
api_consumida: "ordersApi (getAll, getById, create, updateStatus)"
|
|
caracteristicas:
|
|
- Filtrado por estado
|
|
- Flujo de transicion de estados
|
|
- Informacion de pedido y cliente
|
|
|
|
- nombre: "Customers"
|
|
ruta: "/customers"
|
|
archivo: "pages/Customers.tsx"
|
|
descripcion: "Directorio de clientes con historial de compras"
|
|
protegida: true
|
|
estado: funcional # Conectado a customersApi (2026-01-20)
|
|
api_consumida: "customersApi (getAll, getById, create, update)"
|
|
caracteristicas:
|
|
- Busqueda por nombre/telefono
|
|
- Informacion de compras
|
|
- Balance de fiado
|
|
|
|
- nombre: "Fiado"
|
|
ruta: "/fiado"
|
|
archivo: "pages/Fiado.tsx"
|
|
descripcion: "Gestion de cuentas de credito y cobranza"
|
|
protegida: true
|
|
estado: funcional # Conectado a fiadosApi (2026-01-20)
|
|
api_consumida: "fiadosApi (getAll, getPending, create, pay, cancel), customersApi (getAll)"
|
|
caracteristicas:
|
|
- Resumen de totales
|
|
- Lista de fiados pendientes/vencidos
|
|
- Registro de pagos
|
|
- Envio de recordatorios
|
|
|
|
- nombre: "Inventory"
|
|
ruta: "/inventory"
|
|
archivo: "pages/Inventory.tsx"
|
|
descripcion: "Control de existencias y movimientos"
|
|
protegida: true
|
|
estado: funcional # Conectado a inventoryApi (2026-01-20)
|
|
api_consumida: "inventoryApi (getMovements, getLowStock, getAlerts), productsApi (getAll)"
|
|
caracteristicas:
|
|
- Resumen de inventario
|
|
- Tabla de productos con stock
|
|
- Indicadores visuales
|
|
- Movimientos recientes
|
|
|
|
- nombre: "Settings"
|
|
ruta: "/settings"
|
|
archivo: "pages/Settings.tsx"
|
|
descripcion: "Configuracion de la tienda y preferencias"
|
|
protegida: true
|
|
estado: funcional # Conectado a settingsApi (2026-01-20)
|
|
api_consumida: "settingsApi (get, update, getWhatsAppStatus, testWhatsApp, getSubscription)"
|
|
caracteristicas:
|
|
- Informacion del negocio
|
|
- Configuracion de fiado
|
|
- WhatsApp Business
|
|
- Notificaciones
|
|
- Plan de suscripcion
|
|
|
|
- nombre: "Login"
|
|
ruta: "/login"
|
|
archivo: "pages/Login.tsx"
|
|
descripcion: "Autenticacion de usuarios"
|
|
protegida: false
|
|
estado: funcional # Conectado a authApi
|
|
api_consumida: "authApi.login()"
|
|
caracteristicas:
|
|
- Campos telefono (10 digitos) y PIN (4-6 digitos)
|
|
- Validacion HTML5
|
|
- Redireccion a dashboard
|
|
|
|
- nombre: "Register"
|
|
ruta: "/register"
|
|
archivo: "pages/Register.tsx"
|
|
descripcion: "Registro de nuevos negocios"
|
|
protegida: false
|
|
estado: funcional # Conectado a authApi
|
|
api_consumida: "authApi.register()"
|
|
caracteristicas:
|
|
- Campos obligatorios (negocio, propietario, tipo, telefono, PIN)
|
|
- Campos opcionales (email)
|
|
- Tipos de negocio (tiendita, fonda, taqueria, etc)
|
|
- Validacion de PIN coincidente
|
|
|
|
- nombre: "Invoices"
|
|
ruta: "/invoices"
|
|
archivo: "pages/Invoices.tsx"
|
|
descripcion: "Facturacion electronica CFDI 4.0"
|
|
protegida: true
|
|
estado: funcional # Conectado a invoicesApi
|
|
api_consumida: "invoicesApi (9 endpoints)"
|
|
lineas: 24626
|
|
caracteristicas:
|
|
- Listado de facturas emitidas
|
|
- Formulario de creacion de factura
|
|
- Timbrado y envio automatico
|
|
- Cancelacion de facturas
|
|
- Configuracion fiscal por tenant
|
|
|
|
- nombre: "Marketplace"
|
|
ruta: "/marketplace"
|
|
archivo: "pages/Marketplace.tsx"
|
|
descripcion: "Marketplace B2B de proveedores"
|
|
protegida: true
|
|
estado: funcional # Conectado a marketplaceApi
|
|
api_consumida: "marketplaceApi (11 endpoints)"
|
|
lineas: 26180
|
|
caracteristicas:
|
|
- Busqueda de proveedores por zona
|
|
- Catalogo de productos por proveedor
|
|
- Creacion de ordenes de compra
|
|
- Seguimiento de pedidos
|
|
- Sistema de reseñas y favoritos
|
|
|
|
- nombre: "Referrals"
|
|
ruta: "/referrals"
|
|
archivo: "pages/Referrals.tsx"
|
|
descripcion: "Sistema de referidos y recompensas"
|
|
protegida: true
|
|
estado: funcional # Conectado a referralsApi
|
|
api_consumida: "referralsApi (8 endpoints)"
|
|
lineas: 10166
|
|
caracteristicas:
|
|
- Codigo de referido unico
|
|
- Estadisticas de referidos
|
|
- Lista de referidos activos
|
|
- Recompensas disponibles
|
|
- Canje de recompensas
|
|
|
|
- nombre: "Tokens"
|
|
ruta: "/tokens"
|
|
archivo: "pages/Tokens.tsx"
|
|
descripcion: "Tienda de tokens para servicios premium"
|
|
protegida: true
|
|
estado: funcional # Conectado a billingApi
|
|
api_consumida: "billingApi (10 endpoints)"
|
|
sprint: "Sprint 6"
|
|
caracteristicas:
|
|
- Balance de tokens actual
|
|
- Paquetes de tokens disponibles
|
|
- Checkout con Stripe
|
|
- Historial de uso de tokens
|
|
- Costos por servicio (WhatsApp, LLM, OCR, Facturacion)
|
|
|
|
- nombre: "CodiSpei"
|
|
ruta: "/codi-spei"
|
|
archivo: "pages/CodiSpei.tsx"
|
|
descripcion: "Cobros via CoDi QR y SPEI CLABE virtual"
|
|
protegida: true
|
|
estado: funcional # Conectado a codiSpeiApi
|
|
api_consumida: "codiSpeiApi (8 endpoints)"
|
|
sprint: "Sprint 6"
|
|
caracteristicas:
|
|
- Generacion de QR CoDi para cobros
|
|
- CLABE virtual para transferencias SPEI
|
|
- Historial de transacciones CoDi
|
|
- Historial de transferencias SPEI
|
|
- Instrucciones de uso
|
|
|
|
# ============================================================================
|
|
# COMPONENTES
|
|
# ============================================================================
|
|
|
|
componentes:
|
|
layout:
|
|
- nombre: "Layout"
|
|
archivo: "components/Layout.tsx"
|
|
lineas: 178
|
|
descripcion: "Layout principal con sidebar responsive y navegacion completa"
|
|
estado_interno:
|
|
- sidebarOpen (boolean)
|
|
hooks_usados:
|
|
- useState
|
|
- useNavigate
|
|
- useAuth
|
|
dependencias:
|
|
- react-router-dom (Outlet, NavLink, useNavigate)
|
|
- lucide-react (16 iconos)
|
|
- clsx
|
|
- AuthContext
|
|
caracteristicas:
|
|
- Sidebar fijo (desktop) / colapsable (mobile)
|
|
- 12 items de navegacion
|
|
- Header mobile con menu hamburger
|
|
- Avatar con iniciales del tenant
|
|
- Boton de logout
|
|
- Outlet para renderizar paginas
|
|
|
|
payments:
|
|
- nombre: "ClabeDisplay"
|
|
archivo: "components/payments/ClabeDisplay.tsx"
|
|
lineas: 113
|
|
descripcion: "Muestra y permite copiar la CLABE virtual para SPEI"
|
|
props:
|
|
- showCreateButton (boolean, default: true)
|
|
- beneficiaryName (string, optional)
|
|
estado_interno:
|
|
- copied (boolean)
|
|
hooks_usados:
|
|
- useState
|
|
- useQuery
|
|
- useMutation
|
|
- useQueryClient
|
|
dependencias:
|
|
- "@tanstack/react-query"
|
|
- lucide-react (Copy, Check, Building)
|
|
- codiSpeiApi
|
|
caracteristicas:
|
|
- CLABE formateada (XXX XXX XXXX XXXX XXXX)
|
|
- Copiar al clipboard
|
|
- Crear CLABE si no existe
|
|
- Estados loading/vacio
|
|
|
|
- nombre: "CodiQR"
|
|
archivo: "components/payments/CodiQR.tsx"
|
|
lineas: 168
|
|
descripcion: "Genera y muestra QR de cobro CoDi con temporizador"
|
|
props:
|
|
- amount (number, requerido)
|
|
- description (string, optional)
|
|
- saleId (string, optional)
|
|
- onSuccess (callback, optional)
|
|
- onCancel (callback, optional)
|
|
estado_interno:
|
|
- transactionId (string | null)
|
|
- timeLeft (number, inicia en 300)
|
|
hooks_usados:
|
|
- useState
|
|
- useEffect (x3)
|
|
- useMutation
|
|
- useQuery
|
|
dependencias:
|
|
- "@tanstack/react-query"
|
|
- lucide-react (QrCode, Clock, Check, X, RefreshCw)
|
|
- codiSpeiApi
|
|
caracteristicas:
|
|
- Genera QR automaticamente
|
|
- Countdown 5 minutos
|
|
- Polling cada 3s
|
|
- Estados (loading, confirmado, expirado)
|
|
- Regenerar QR
|
|
|
|
# ============================================================================
|
|
# CONTEXTS
|
|
# ============================================================================
|
|
|
|
contexts:
|
|
- nombre: "AuthContext"
|
|
archivo: "contexts/AuthContext.tsx"
|
|
lineas: 119
|
|
descripcion: "Gestion de autenticacion"
|
|
provee:
|
|
- user (User | null)
|
|
- tenant (Tenant | null)
|
|
- isAuthenticated (boolean)
|
|
- isLoading (boolean)
|
|
- login(phone, pin)
|
|
- register(data)
|
|
- logout()
|
|
persistencia: localStorage (accessToken, refreshToken, user, tenant)
|
|
|
|
# ============================================================================
|
|
# SERVICIOS API
|
|
# ============================================================================
|
|
|
|
lib:
|
|
- nombre: "api"
|
|
archivo: "lib/api.ts"
|
|
lineas: 132
|
|
descripcion: "Cliente HTTP Axios con endpoints API"
|
|
grupos:
|
|
- authApi:
|
|
- register(data)
|
|
- login(phone, pin)
|
|
- refresh(refreshToken)
|
|
- changePin(...)
|
|
- productsApi:
|
|
- getAll(params)
|
|
- getById(id)
|
|
- create(data)
|
|
- update(id, data)
|
|
- delete(id)
|
|
- ordersApi:
|
|
- getAll(params)
|
|
- getById(id)
|
|
- create(data)
|
|
- updateStatus(id, status)
|
|
- customersApi:
|
|
- getAll(params)
|
|
- getById(id)
|
|
- create(data)
|
|
- update(id, data)
|
|
- getFiado(id)
|
|
- inventoryApi:
|
|
- getMovements(params)
|
|
- createMovement(data)
|
|
- getLowStock()
|
|
- getAlerts()
|
|
- dashboardApi:
|
|
- getStats()
|
|
- getSalesChart(period)
|
|
- getTopProducts()
|
|
interceptores:
|
|
- request: "Agrega Bearer token"
|
|
- response: "Maneja 401, intenta refresh, limpia localStorage"
|
|
|
|
# ============================================================================
|
|
# RUTAS
|
|
# ============================================================================
|
|
|
|
rutas:
|
|
publicas:
|
|
- path: "/login"
|
|
componente: "Login"
|
|
- path: "/register"
|
|
componente: "Register"
|
|
|
|
protegidas:
|
|
- path: "/"
|
|
componente: "Layout"
|
|
redirect: "/dashboard"
|
|
- path: "/dashboard"
|
|
componente: "Dashboard"
|
|
- path: "/products"
|
|
componente: "Products"
|
|
- path: "/orders"
|
|
componente: "Orders"
|
|
- path: "/customers"
|
|
componente: "Customers"
|
|
- path: "/fiado"
|
|
componente: "Fiado"
|
|
- path: "/inventory"
|
|
componente: "Inventory"
|
|
- path: "/codi-spei"
|
|
componente: "CodiSpei"
|
|
- path: "/invoices"
|
|
componente: "Invoices"
|
|
- path: "/marketplace"
|
|
componente: "Marketplace"
|
|
- path: "/tokens"
|
|
componente: "Tokens"
|
|
- path: "/referrals"
|
|
componente: "Referrals"
|
|
- path: "/settings"
|
|
componente: "Settings"
|
|
|
|
wrappers:
|
|
- ProtectedRoute: "Verifica isAuthenticated, redirige a /login"
|
|
- PublicRoute: "Redirige a /dashboard si autenticado"
|
|
|
|
# ============================================================================
|
|
# ESTILOS
|
|
# ============================================================================
|
|
|
|
estilos:
|
|
framework: "TailwindCSS 4.1.18"
|
|
plugins:
|
|
- "@tailwindcss/forms"
|
|
colores_custom:
|
|
primary: "Orange (50-900)"
|
|
secondary: "Green (50-900)"
|
|
componentes_css:
|
|
- ".btn-primary"
|
|
- ".btn-secondary"
|
|
- ".btn-outline"
|
|
- ".card"
|
|
- ".input"
|
|
|
|
# ============================================================================
|
|
# DEPENDENCIAS PRINCIPALES
|
|
# ============================================================================
|
|
|
|
dependencias:
|
|
"react": "19.2.0"
|
|
"react-dom": "19.2.0"
|
|
"react-router-dom": "7.11.0"
|
|
"@tanstack/react-query": "5.90.16"
|
|
"axios": "1.13.2"
|
|
"tailwindcss": "4.1.18"
|
|
"lucide-react": "0.562.0"
|
|
"clsx": "2.1.1"
|
|
|
|
devDependencias:
|
|
"typescript": "5.9.3"
|
|
"vite": "7.2.4"
|
|
"@vitejs/plugin-react": "*"
|
|
"eslint": "*"
|
|
"postcss": "*"
|
|
"autoprefixer": "*"
|
|
|
|
# ============================================================================
|
|
# COMANDOS
|
|
# ============================================================================
|
|
|
|
comandos:
|
|
dev: "npm run dev"
|
|
build: "npm run build"
|
|
preview: "npm run preview"
|
|
lint: "npm run lint"
|
|
|
|
# ============================================================================
|
|
# CONFIGURACION VITE
|
|
# ============================================================================
|
|
|
|
vite:
|
|
puerto: 3140
|
|
proxy:
|
|
"/api":
|
|
target: "http://localhost:3141"
|
|
changeOrigin: true
|
|
secure: false
|
|
|
|
# ============================================================================
|
|
# NOTAS
|
|
# ============================================================================
|
|
|
|
notas:
|
|
- "Responsive design para tablet y desktop"
|
|
- "Dark mode implementado con ThemeContext (Sprint 8)"
|
|
- "PWA habilitado con vite-plugin-pwa (Sprint 8)"
|
|
- "Offline mode pendiente para frontend web"
|
|
- "14/14 paginas conectadas a APIs reales (Sprint 8)"
|
|
- "React Query configurado con staleTime 5min, retry 1"
|
|
- "Exportacion PDF/Excel disponible en Dashboard, Inventory, Fiado"
|
|
- "ThemeContext para Dark Mode con persistencia en localStorage"
|