Vitrina — Integración HelpU
Definición del modelo comercial y de provisión de Vitrina, alineado con Huella y Habitta: HelpU App gestiona clientes, planes y pagos; VitrinaApp es el producto que usa cada negocio (tienda pública + panel del tenant).
1. División de responsabilidades
| Sistema | Rol | No hace |
|---|---|---|
| HelpU PW | Sitio comercial, checkout Wompi, formularios de alta | No almacena catálogo ni pedidos de tienda |
| HelpU App | WS comercial, empresas, planes, suscripciones, demos, SuperAdmin Vitrina, FE | No impersona sesión del admin de tienda |
| VitrinaApp | /t/{slug} tienda, /admin del negocio (productos, pedidos, config) |
No lista ni administra otras empresas; sin super-admin |
2. Empresa en HelpU (bd_helpu)
Reutiliza el modelo existente de empresa cliente por producto (como Huella/Habitta).
| Campo / concepto | Uso en Vitrina |
|---|---|
producto = vitrina | Discriminador en planes, checkout y WS |
nit | Identificador fiscal del negocio (único por producto) |
nombre | Razón social o nombre comercial |
email, telefono | Contacto comercial y admin inicial |
municipio_id | Ubicación (DANE, mismo catálogo) |
direccion | Opcional en checkout |
| Suscripción / plan | Vigencia, código de plan, estado de pago (en App) |
Campos adicionales en formulario checkout Vitrina (fase 2):
store_slug— URL pública deseada (/t/{slug}), validado único en VitrinaAppstore_tagline— eslogan inicial (opcional)admin_name— nombre del usuario administradoradmin_password— solo en alta nueva; o invitación por correo
3. Tenant en VitrinaApp
Cada empresa contratada = un registro tenants + al menos un users con tenant_id.
| Al provisionar | Origen |
|---|---|
tenants.slug | Checkout store_slug o derivado del nombre |
tenants.name | nombre empresa HelpU |
tenants.tagline, whatsapp, shipping_cost | Checkout o defaults |
tenants.helpu_empresa_id | PK empresa en bd_helpu |
tenants.nit | Copia para consultas locales |
tenants.plan_codigo | Plan contratado (ej. vitrina_starter) |
tenants.estado_comercial | demo | activo | suspendido | cancelado |
tenants.activo_hasta | Fin de vigencia del plan |
| Categoría «General» | Seeder automático al crear tenant |
| Usuario admin | email del checkout, tenant_id, sin rol super-admin |
/admin/register en VitrinaApp se deshabilitará en fase 3 cuando el alta sea solo vía HelpU
(o quedará solo para entorno local de desarrollo).
4. Planes propuestos (catálogo HelpU App)
Métrica de facturación: productos activos en la tienda (análogo a unidades Habitta / alumnos Huella).
| Código | Nombre | Productos activos | Notas |
|---|---|---|---|
vitrina_demo | Demo 30 días | ≤ 20 | Sin pago; vía POST /api/demos o trial post-checkout |
vitrina_starter | Starter | ≤ 100 | Negocio pequeño, 1 usuario admin |
vitrina_pro | Pro | ≤ 500 | Múltiples usuarios (fase 4 VitrinaApp) |
vitrina_enterprise | Enterprise | Cotización | requiere_cotizacion en WS |
Periodos: mensual y anual (misma estructura planes + tarifas en App).
5. Estados comerciales (tenants.estado_comercial)
| Estado | Tienda pública | Admin | Quién lo setea |
|---|---|---|---|
demo | Visible | Visible | Alta demo HelpU |
activo | Visible | Visible | POST /api/pagos/confirmar |
suspendido | Banner / solo lectura | Lectura limitada | SuperAdmin HelpU (mora, fin plan) |
cancelado | No visible (404) | Bloqueado | SuperAdmin HelpU |
6. Flujos
6.1 Contratación (cliente nuevo)
- PW:
checkout.php?producto=vitrina&plan=… - Consulta NIT:
GET /api/empresas/consulta?producto=vitrina&nit=… - Alta:
POST /api/empresasconproducto=vitrina→ crea empresa en HelpU + tenant inactivo en VitrinaApp - Pago Wompi →
POST /api/pagos/confirmar→ activa plan,estado_comercial=activo, correo bienvenida - Cliente entra a
{VITRINA_APP_URL}/admin/login
6.2 Demo / registro de interés
POST /api/demosconproducto=vitrina- SuperAdmin aprueba → provisiona tenant
demo+ 30 díasactivo_hasta
6.3 Operación diaria
El negocio usa solo VitrinaApp. HelpU no interviene salvo soporte o cambio de plan.
7. Esquema VitrinaApp (campos nuevos en tenants)
helpu_empresa_id BIGINT UNSIGNED NULL UNIQUE -- FK lógica bd_helpu.empresas
nit VARCHAR(20) NULL INDEX
plan_codigo VARCHAR(40) NULL
estado_comercial VARCHAR(20) DEFAULT 'demo' -- demo|activo|suspendido|cancelado
activo_hasta DATE NULL
provisioned_at TIMESTAMP NULL
Se elimina users.is_super_admin del producto (super-admin solo en HelpU App).
8. API interna (fase 3)
Auth: Authorization: Bearer {HELPU_WS_TOKEN} o X-Helpu-Ws-Token (mismo token del mostrador).
| Método | Ruta VitrinaApp | Uso |
|---|---|---|
| GET | /api/internal/tenants | Listar tenants (SuperAdmin HelpU; query q=) |
| GET | /api/internal/tenants/consulta?nit=&email= | Consultar tenant existente |
| GET | /api/internal/tenants/slug-disponible?slug= | Validar slug en checkout |
| POST | /api/internal/tenants | Crear tenant + admin + categoría General (demo=true → 30 días activo) |
| PUT | /api/internal/tenants/{id} | Activar post-pago (activar=true, plan, periodo) o actualizar estado |
HelpU App usa VitrinaAppClient contra VITRINA_APP_URL; si la API no responde, fallback a SQLite (DB_VITRINA_DATABASE).
9. Roadmap
| Fase | Alcance | Repos |
|---|---|---|
| 1 Definición | Este documento + esquema tenants | helpU/docs/vitrina, VitrinaApp migration |
| 2 Comercial | Producto en PW, planes, checkout producto=vitrina | HelpU PW + App |
| 3 Provisión | API interna, alta post-pago, demo WS, register cerrado, correo bienvenida | HelpU App + VitrinaApp |
| 4 Producto tenant | Multi-usuario Pro+, límites productos activos, export CSV pedidos, suspendido solo lectura | VitrinaApp |
| 5 Consola HelpU | SuperAdmin tiendas Vitrina: listado, suspender, reactivar, métricas | HelpU App |
| 6 PW Go-live | Banner, menú, portafolio y docs alineados con Vitrina disponible | HelpU PW |
| 7 Demo self-service | /registro en VitrinaApp, demo 30 días vía WS, correo bienvenida | VitrinaApp + HelpU App + PW |
| 8 Consola operativa | Menú Vitrina: planes, tarifas, demos, suscripciones; KPIs en inicio | HelpU App |
| 9 Ciclo comercial | vitrina_pagos, confirmación idempotente, renovación, vitrina:procesar-vencimientos | HelpU App + VitrinaApp |
| 10 UX tienda pública | Banner suspendido (solo lectura), bloqueo compras, notificación cambio estado pedido, badge pedidos pendientes en admin | VitrinaApp |
| 11 Enterprise / cotización | Gate planes Vitrina (cobertura productos), cupo en consulta empresa, contacto prefill, checkout Wompi producto=vitrina | HelpU PW + App |
| 12 QA / E2E | Tests Feature App + VitrinaApp, smoke tools/test-vitrina-ws.php, checklist manual | HelpU App + VitrinaApp + PW |
| 13 Producción | Dominio vitrina.helpu.com.co, token compartido, cola correos, cron, vitrina:verificar-produccion | HelpU PW + App + VitrinaApp |
| 14 Cierre doc | Manuales usuario y SuperAdmin, API técnica, decisiones cerradas | pw/docs/vitrina |
13. Fase 13 — Producción (go-live)
URL pública acordada: https://vitrina.helpu.com.co (multi-tenant por /t/{slug}, no subdominio por cliente).
13.1 Variables por sistema
| Sistema | Variable | Valor producción |
|---|---|---|
| HelpU PW | VITRINA_BASE_URL | https://vitrina.helpu.com.co/ en lib/params.php |
| HelpU PW | HELPU_WS_TOKEN | Mismo token en los tres sistemas (generar con php -r "echo bin2hex(random_bytes(32));") |
| HelpU App | VITRINA_APP_URL | https://vitrina.helpu.com.co |
| HelpU App | QUEUE_CONNECTION | database + worker permanente |
| VitrinaApp | APP_URL | https://vitrina.helpu.com.co |
| VitrinaApp | HELPU_WS_URL | https://app.helpu.com.co/api |
| VitrinaApp | HELP_U_PLANES_URL | https://www.helpu.com.co/vitrina.php#planes-vitrina |
| VitrinaApp | VITRINA_ALLOW_PUBLIC_REGISTER | false |
| VitrinaApp | QUEUE_CONNECTION | database + worker permanente |
13.2 Cola de correos
Correos de bienvenida, pedidos y cambio de estado se encolan. En producción:
# Migrar tablas de cola (si aún no existen)
php artisan queue:table
php artisan migrate
# Worker (supervisor, systemd o servicio Windows)
php artisan queue:work --tries=3 --timeout=90
Mail recomendado: Resend (MAIL_MAILER=resend, RESEND_API_KEY) con remitente verificado notificacionesautomaticas@helpu.com.co.
13.3 Cron
En App y VitrinaApp (misma hora, sin solaparse):
* * * * * cd /ruta/App && php artisan schedule:run
* * * * * cd /ruta/VitrinaApp && php artisan schedule:run
Comando diario: vitrina:procesar-vencimientos a las 02:00 America/Bogota.
13.4 Verificación pre-deploy
# HelpU PW (desde el servidor web)
php tools/test-vitrina-produccion.php
# HelpU App
php artisan vitrina:verificar-produccion --strict
# VitrinaApp
php artisan vitrina:verificar-produccion --strict
El flag --strict convierte advertencias (debug activo, cola sync, URLs locales) en código de salida distinto de cero.
13.5 Checklist go-live
- DNS y TLS para
vitrina.helpu.com.coapuntando al servidor VitrinaApp. - Token
HELPU_WS_TOKENidéntico en PW, App y VitrinaApp. - Wompi producción en
params.php(clavespub_prod_/prv_prod_). APP_DEBUG=falseyAPP_ENV=productionen App y VitrinaApp.- Worker de cola activo en ambas apps.
- Cron
schedule:runen ambas apps. - Smoke PW:
php tools/test-vitrina-ws.php. - Compra de prueba starter + correo de acceso + tienda
/t/{slug}.
12. Fase 12 — QA y pruebas E2E
12.1 Automatizadas (PHPUnit)
| Repo | Archivo | Cubre |
|---|---|---|
| HelpU App | VitrinaIntegracionE2ETest | WS planes → cotizar → pago; comando vencimientos |
| HelpU App | VitrinaCicloComercialTest, MostradorApiTest | Pagos idempotentes, demo WS, consulta cupo |
| VitrinaApp | InternalTenantApiTest | API interna: alta demo, activación, vencimientos |
| VitrinaApp | ShopCheckoutFlowTest | Carrito → checkout COD → confirmación + correo |
| VitrinaApp | ShopSuspendedTest, OrderStatusNotificationTest | Tienda suspendida y notificaciones |
# HelpU App
cd App && composer install && vendor\bin\phpunit --filter Vitrina
# VitrinaApp
cd VitrinaApp && vendor\bin\phpunit tests\Feature
12.2 Smoke manual (PW)
Con App WS activo: php tools/test-vitrina-ws.php o php tools/test-helpu-ws.php (incluye Vitrina).
12.3 Checklist manual E2E
- PW
vitrina.php: gate nuevo / ya tengo tienda → planes → checkout Wompi (starter). - PW: rango >500 o plan Enterprise → contacto con datos prellenados.
- VitrinaApp
/t/demo-shop: compra COD y correo de pedido. - Admin tienda: cambiar estado pedido → correo al cliente.
- HelpU App SuperAdmin: suspender tienda → banner solo lectura en tienda pública.
- Cron
vitrina:procesar-vencimientosen App y VitrinaApp.
11. Fase 11 — Enterprise y cotización
Planes vitrina_enterprise y rangos con requiere_cotizacion (>500 productos) no permiten pago en línea: el visitante es dirigido a contacto con contexto prellenado.
| Componente | Comportamiento |
|---|---|
MetricaCupoService + VitrinaMostradorService | Consulta empresa devuelve tope_self_service, requiere_cotizacion_por_uso, metrica_minima_pago |
layout/vitrina-plans.php | Paridad con Habitta: resumen empresa, auto-rango, rangos deshabilitados, bloquear_pago |
helpu_planes_url_cotizacion() | Enlace a contact.php con plan, rango, volumen y NIT |
checkout.php | Sesión Wompi con producto=vitrina y campo productos |
VitrinaCicloComercialService | Rechaza confirmación si requiere_cotizacion (ya existente fase 9) |
Tests: App/tests/Feature/PlanesApiTest.php (cotizar vitrina), VitrinaEmpresaConsultaTest.php.
10. Fase 10 — UX tienda pública (VitrinaApp)
Cuando estado_comercial=suspendido (p. ej. tras vencimiento en fase 9), la tienda pública permanece visible en modo consulta.
| Componente | Comportamiento |
|---|---|
ResolveTenant | Permite suspendido aunque active=false; 404 solo en cancelado o inactivo no suspendido |
EnsureShopWritable | Bloquea POST/PUT/DELETE en rutas /t/{slug} (carrito, checkout) |
| Layout shop | Banner amarillo con enlace a HELP_U_PLANES_URL |
| Vistas producto / carrito / checkout | Botones de compra deshabilitados si puede_comprar=false |
OrderStatusUpdatedMail | Correo al cliente cuando el admin cambia el estado del pedido |
| Admin nav | Badge con pedidos en recibido, pendiente_pago o pagado |
Tests: VitrinaApp/tests/Feature/ShopSuspendedTest.php, OrderStatusNotificationTest.php.
14. Fase 14 — Documentación y cierre
Entregables de referencia para operación, soporte y desarrollo:
| Documento | Audiencia | Contenido |
|---|---|---|
| Integración HelpU (este archivo) | Equipo técnico | Modelo comercial, esquema, flujos, roadmap fases 1–14 |
| Manual de usuario | Dueño / staff del negocio | Tienda pública, panel admin, pedidos, RRHH, planes Pro |
| SuperAdmin consola | Personal HelpU | Menú Vitrina en App: tiendas, demos, suscripciones, catálogo |
| API técnica | Integradores | WS comercial HelpU App + API interna VitrinaApp |
| WS HelpU App | PW / integradores | Endpoints compartidos con Huella/Habitta |
Repositorios: HelpU/pw (comercial), App (WS + consola), VitrinaApp (producto tenant).
15. Decisiones cerradas
| Tema | Decisión | Fase |
|---|---|---|
| App → VitrinaApp | HTTP interno (VitrinaAppClient + HELPU_WS_TOKEN). Fallback SQLite (DB_VITRINA_DATABASE) solo desarrollo. | 3 |
| Demo 30 días | Self-service en /registro y bandeja SuperAdmin en App (/empresas/vitrina/demos). | 7 |
| Métrica de facturación | Productos activos contratados. Sin límite de pedidos/mes en MVP. | 1 |
| URL producción | https://vitrina.helpu.com.co con rutas /t/{slug} (sin subdominio por cliente). | 13 |
| Login admin | Livewire en /admin/login (correo/contraseña) y Google OAuth (/admin/auth/google). Sin SSO centralizado en HelpU App. | 4 |
| Super-admin producto | Solo en HelpU App; VitrinaApp sin is_super_admin. | 5 |
| Alta de tienda | Checkout Wompi PW o demo WS; /admin/register cerrado en producción. | 3 |
Fuera de alcance MVP (futuro)
- Límite de pedidos por mes o por plan.
- Subdominio dedicado por cliente (
mitienda.helpu.com.co). - OAuth centralizado en HelpU App para todos los productos.
- Pasarela Wompi embebida por tenant (hoy: contra entrega y flujo comercial HelpU).