Espacio Personal
Contexto y objetivo del Addendum
Este documento es el primer addendum a la Biblia de Operaciones GoWeBa (versión 1.0, publicada el 06 de mayo de 2026). Documenta todas las modificaciones realizadas por el proyecto « Espacio Personal », desplegado en tres fases entre el 06 y el 07 de mayo de 2026. El Espacio Personal es una funcionalidad estructurante que introduce la noción de organización personal en GoWeBa, permitiendo a cada usuario separar sus actividades personales de sus actividades profesionales, teniendo acceso a ambas desde una sola interfaz.
Alcance del Addendum
Este addendum cubre:
- La creación automática de un Espacio Personal para cada usuario (Fase 1)
- La composición de emails cross-organización y las pestañas de filtrado de contactos (Fase 2)
- La agregación de mensajes Webabox a través de todas las organizaciones del usuario (Fase 3)
- Las modificaciones al esquema de datos (enum OrgType, campo orgType)
- Los nuevos endpoints API introducidos
- Las nuevas claves de traducción (i18n) en francés, inglés y español
- El impacto en los módulos existentes del Guía Operacional
Convenciones del documento
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Vista general — Concepto de Espacio Personal
El Espacio Personal es un espacio privado creado automáticamente para cada usuario de GoWeBa. Funciona como una organización completa, pero dedicada a las actividades personales del usuario.
¿Por qué un Espacio Personal?
Antes de la introducción del Espacio Personal, un usuario GoWeBa solo podía pertenecer a organizaciones profesionales (empresas, equipos). Esto generaba varios problemas:
- Mezcla de contactos personales y profesionales
- Imposibilidad de recibir emails personales sin compartirlos con el equipo
- Sin separación entre datos privados y datos de empresa
- Confusión al alternar entre varios mandatos/clientes El Espacio Personal resuelve estos problemas creando una separación natural mientras permite una vista unificada cuando el usuario lo desee.
Organización PERSONAL vs STANDARD
Esquema visual del concepto
Estructura multi-organización de un usuario GoWeBa: ┌─────────────────────────────────────────────────────┐ │ Usuario GoWeBa │ │ │ │ 🏠 Espacio Personal (PERSONAL) │ │ ├── Mis contactos personales │ │ ├── Mi bandeja de email personal │ │ └── Mi Webabox personal │ │ │ │ 🏢 Organización A — GoWeBa.com (STANDARD) │ │ ├── Contactos del equipo │ │ ├── Bandeja de email compartida │ │ └── Webabox del equipo │ │ │ │ 🏢 Organización B — AlainBessette.com (STANDARD) │ │ ├── Contactos del equipo │ │ ├── Bandeja de email compartida │ │ └── Webabox del equipo │ │ │ │ ◀═══ Selector de organización (switcher) ═══▶ │ └─────────────────────────────────────────────────────┘
Fase 1 — Arquitectura y creación automática
La Fase 1 establece las bases del Espacio Personal: el tipo de organización (OrgType), la creación automática al registrarse y el selector de organización actualizado.
Modificación del esquema de datos
Un nuevo enum OrgType fue añadido al esquema Prisma:
Definición del enum en el esquema: enum OrgType { PERSONAL STANDARD } Campo en el modelo Organization: orgType OrgType @default(STANDARD) ⚠️ La migración es aditiva y compatible con los datos existentes. Todas las organizaciones creadas antes de la Fase 1 conservan automáticamente el tipo STANDARD.
Creación automática del Espacio Personal
Al registrarse un nuevo usuario, el sistema crea automáticamente:
- Una cuenta de usuario — email, contraseña, nombre
- Una organización personal — con orgType = PERSONAL
- Una membresía — rol OWNER, vinculando al usuario con su espacio personal Reglas de nomenclatura de la organización personal:
Tratamiento de usuarios existentes
Para los usuarios que existían antes de la Fase 1, se ejecutó un script de migración para crear retroactivamente un Espacio Personal para cada uno de ellos. Usuarios afectados durante el despliegue inicial:
Selector de organización (Org Switcher)
El selector de organización en la barra lateral fue actualizado para mostrar dos secciones distintas:
Comportamiento del selector:
- Haz clic en el selector de organización en la barra lateral izquierda
- La lista desplegable se muestra con dos secciones separadas
- La sección 🏠 (Espacio Personal) aparece primero
- La sección 🏢 (Organizaciones) muestra tus organizaciones profesionales
- Haz clic en una organización para cambiar a ella
- La interfaz se actualiza instantáneamente para reflejar la organización seleccionada 💡 El selector muestra un separador visual entre las dos secciones para una distinción clara. ✅ El selector de organización está funcional y desplegado en producción.
Archivos modificados — Fase 1
Fase 2 — Composición cross-org y pestañas Contactos
La Fase 2 introduce dos funcionalidades clave: la posibilidad de componer emails desde cualquier organización, y el filtrado de contactos por organización.
Composición cross-organización
Antes de la Fase 2, un usuario solo podía enviar emails con las cuentas de email de la organización activa. Con la Fase 2, el modal de composición muestra todas las cuentas de email de todas las organizaciones del usuario, agrupadas por organización. Funcionamiento:
- Haz clic en « Componer » en la Webabox
- El modal de composición se abre
- En el selector « De » (remitente), las cuentas están agrupadas por organización
- Cada grupo muestra el nombre de la organización con su icono (🏠 o 🏢)
- Selecciona la cuenta de email desde la cual quieres enviar
- Redacta tu email normalmente
- Haz clic en « Enviar » Ejemplo de agrupación en el selector « De »:
Nuevo endpoint API — Cuentas cross-org
Un nuevo endpoint API fue creado para obtener las cuentas de email de todas las organizaciones del usuario:
Estructura de la respuesta: { "accounts": [ { "id": "...", "emailAddress": "alain@goweba.com", "displayName": "Alain Bessette", "type": "PERSONAL_EMAIL", "status": "active", "isDefault": true, "organizationId": "...", "organizationName": "Alain Bessette", "orgType": "PERSONAL" } ] }
Pestañas de filtrado — Módulo Contactos
El módulo Contactos fue enriquecido con pestañas que permiten filtrar los contactos por organización:
Funcionamiento de las pestañas:
- Abre el módulo Contactos desde el menú lateral
- Las pestañas de filtrado aparecen encima de la lista de contactos
- Por defecto, la pestaña « Todas las organizaciones » está seleccionada
- Haz clic en « Organización actual » para filtrar por la organización activa
- La lista de contactos se actualiza instantáneamente
- El contador de contactos refleja el filtro activo 💡 Las pestañas de contactos son particularmente útiles cuando tienes muchos contactos repartidos entre tu espacio personal y tus organizaciones profesionales.
Archivos modificados — Fase 2
Fase 3 — Agregación Webabox cross-org
La Fase 3 es la de mayor impacto: permite a la Webabox (bandeja de entrada unificada) mostrar los mensajes de todas las organizaciones del usuario simultáneamente, con un sistema de pestañas para filtrar por organización.
Concepto — Vista unificada multi-organización
Antes de la Fase 3, la Webabox solo mostraba los mensajes de la organización activa. El usuario debía cambiar de organización para ver sus otros mensajes. Con la Fase 3, un sistema de « scope » permite mostrar:
Pestañas de la Webabox
La Webabox ahora muestra una barra de pestañas encima de la lista de mensajes: Ejemplo para un usuario con 3 organizaciones:
Comportamiento de las pestañas:
- Por defecto, la pestaña « Todas » está seleccionada (scope=all)
- Haz clic en una pestaña para filtrar los mensajes de esa organización
- Los mensajes, los contadores y las estadísticas se actualizan en tiempo real
- El scope se transmite a todas las llamadas API (threads, snapshot, búsqueda)
- El cambio de pestaña NO cambia la organización activa — solo filtra la vista ⚠️ El cambio de pestaña en la Webabox NO es lo mismo que el cambio de organización en el selector. La pestaña filtra la vista, mientras que el selector cambia el contexto global de la aplicación.
Función resolveOrgIds — Resolución del scope
Una nueva función utilitaria resolveOrgIds fue añadida a los endpoints API de la Webabox. Resuelve el parámetro scope en una lista de identificadores de organización: Lógica de resolución:
Endpoints API modificados — Fase 3
Dos endpoints existentes fueron modificados para soportar el parámetro scope:
Ejemplo de llamada API con scope: GET /api/inbox/threads?tab=inbox&scope=all&page=1&limit=20 GET /api/inbox/snapshot?scope=all
Componentes UI modificados — Fase 3
Varios componentes de la Webabox fueron modificados para soportar la agregación cross-org:
Archivos modificados — Fase 3
Impacto en los módulos existentes
La introducción del Espacio Personal modifica el comportamiento de varios módulos documentados en la Biblia de Operaciones. A continuación, el detalle de los impactos por módulo:
Módulo 02 — Contactos & CRM
Impacto: MODERADO
- Adición de pestañas de filtrado « Todas las organizaciones » y « Organización actual »
- Los contactos ahora están separados por organización
- Un contacto creado en el Espacio Personal es privado e invisible para las organizaciones profesionales
- La búsqueda de contactos puede abarcar todas las organizaciones (pestaña « Todas ») Sección del módulo 02 a actualizar:
- Sección 3 (Interfaz) — Mencionar las pestañas de filtrado
- Sección 4 (Funcionalidades) — Añadir el comportamiento cross-org
Módulo 03 — Webabox / Bandeja de Entrada
Impacto: MAYOR
- La Webabox ahora muestra pestañas de organización encima de la lista de mensajes
- El scope (all, current, orgId) se transmite a todas las llamadas API
- La composición de email utiliza un selector de remitente agrupado por organización
- Los contadores (insignia de mensajes no leídos) reflejan el scope activo Secciones del módulo 03 a actualizar:
- Sección 3 (Interfaz) — Añadir las pestañas de organización
- Sección 4.1 (Componer un email) — Documentar el selector cross-org
- Sección 5 (Casos de uso) — Añadir el caso multi-organización
Módulo 00 — Perímetro funcional
Impacto: MENOR
- Añadir el Espacio Personal a la lista de módulos/funcionalidades
- Actualizar el esquema de arquitectura para incluir el tipo PERSONAL
Módulo 20 — Administración del sistema
Impacto: MENOR
- Documentar el nuevo tipo de organización PERSONAL
- Los administradores del sistema ven los dos tipos en el panel de administración
- Las organizaciones personales no pueden ser eliminadas por el administrador
Módulos NO impactados
Los siguientes módulos no están impactados por el Espacio Personal:
Referencia técnica completa
Modificaciones del esquema de datos
Nuevos endpoints API
Endpoints modificados
Archivos creados
Archivos modificados
Dependencias añadidas
Claves de traducción (i18n)
Las siguientes claves de traducción fueron añadidas para soportar el Espacio Personal en los tres idiomas de GoWeBa:
Claves — Fase 1 (Espacio Personal)
Claves — Fase 2 (Cross-org + Contactos)
Guía de solución de problemas
A continuación, los problemas más frecuentes relacionados con el Espacio Personal y sus soluciones:
Historial de versiones
Próximas actualizaciones previstas:
- Integración de funcionalidades de telefonía avanzada
- Mejoras del pipeline de ventas
- Nuevas automatizaciones basadas en IA
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GoWeBa — Biblia de Operaciones — Addendum 01 Espacio Personal — Fases 1, 2 y 3
| # | Sección | Página |
|---|---|---|
| 1 | Contexto y objetivo del Addendum | 3 |
| 2 | Vista general — Concepto de Espacio Personal | 3 |
| 3 | Fase 1 — Arquitectura y creación automática | 4 |
| 4 | Fase 2 — Composición cross-org y pestañas Contactos | 6 |
| 5 | Fase 3 — Agregación Webabox cross-org | 8 |
| 6 | Impacto en los módulos existentes | 10 |
| 7 | Referencia técnica completa | 11 |
| 8 | Claves de traducción (i18n) | 13 |
| 9 | Guía de solución de problemas | 14 |
| 10 | Historial de versiones | 15 |
| Convención | Significado |
|---|---|
| 💡 | Consejo o truco para un mejor uso |
| ⚠️ | Advertencia — punto de atención importante |
| ✅ | Confirmación — funcionalidad operativa |
| 🏠 | Icono que identifica el Espacio Personal en la interfaz |
| 🏢 | Icono que identifica una organización profesional |
| Texto en cian | Numeración de pasos y elementos técnicos |
| Característica | PERSONAL (Espacio Personal) | STANDARD (Organización clásica) |
|---|---|---|
| Creación | Automática al registrarse | Manual por un administrador |
| Nombre | Nombre Apellido (del usuario) | Nombre de la empresa/equipo |
| Slug | nombre-apellido-personal | slug-de-la-empresa |
| Propietario | El usuario (único miembro) | Uno o varios administradores |
| Miembros | Uno solo (el propietario) | Varios miembros posibles |
| Contactos | Contactos personales privados | Contactos compartidos del equipo |
| Emails | Bandeja personal privada | Bandeja compartida del equipo |
| Icono | 🏠 Casa | 🏢 Edificio |
| Eliminación | No eliminable | Eliminable por el admin |
| Campo orgType | PERSONAL | STANDARD |
| Elemento | Detalle | Impacto |
|---|---|---|
| Enum OrgType | PERSONAL | STANDARD |
| Campo orgType | En el modelo Organization | Valor predeterminado: STANDARD |
| Migración | Aditiva (compatible) | Sin pérdida de datos |
| Propiedad | Valor | Ejemplo |
|---|---|---|
| Nombre | Nombre Apellido (del usuario) | Alain Bessette |
| Slug | nombre-apellido-personal | alain-bessette-personal |
| OrgType | PERSONAL | — |
| Propietario | El propio usuario | — |
| Usuario | Espacio Personal creado | |
|---|---|---|
| Alain Bessette | alain@goweba.com | ✅ alain-bessette-personal |
| Mathieu Villeneuve | mathieu@goweba.com | ✅ mathieu-villeneuve-personal |
| Mariève Émond | marieve@goweba.com | ✅ marieve-emond-personal |
| John Smith | john@goweba.com | ✅ john-smith-personal |
| Sección | Icono | Contenido | Posición |
|---|---|---|---|
| Espacio Personal | 🏠 | La organización personal del usuario | Arriba |
| Organizaciones | 🏢 | Las organizaciones profesionales | Debajo |
| Archivo | Tipo de modificación |
|---|---|
| prisma/schema.prisma | Adición enum OrgType, campo orgType en Organization |
| app/api/auth/signup/route.ts | Creación automática de la org personal al registrarse |
| components/layouts/org-switcher.tsx | Secciones 🏠/🏢, filtrado por OrgType |
| scripts/seed.ts | Creación de espacios personales para usuarios existentes |
| lib/i18n/locales/fr.json | Claves de traducción para el Espacio Personal |
| lib/i18n/locales/en.json | Claves de traducción (inglés) |
| lib/i18n/locales/es.json | Claves de traducción (español) |
| Organización | Icono | Cuentas disponibles |
|---|---|---|
| Alain Bessette (Personal) | 🏠 | alain@goweba.com |
| GoWeBa.com | 🏢 | support@goweba.com, info@goweba.com |
| AlainBessette.com | 🏢 | alain@alainbessette.com |
| Propiedad | Detalle |
|---|---|
| Método | GET |
| URL | /api/inbox/accounts/all |
| Autenticación | Requerida (sesión de usuario) |
| Descripción | Devuelve todas las cuentas de email de todas las organizaciones del usuario |
| Parámetros | Ninguno — las organizaciones se resuelven a partir de la sesión |
| Pestaña | Comportamiento | Uso |
|---|---|---|
| Todas las organizaciones | Muestra los contactos de todas tus organizaciones | Vista global |
| Organización actual | Muestra únicamente los contactos de la organización activa | Vista filtrada |
| Archivo | Tipo de modificación |
|---|---|
| app/api/inbox/accounts/all/route.ts | NUEVO — Endpoint cross-org accounts |
| app/(app)/inbox/compose-modal.tsx | Selector « De » agrupado por organización |
| app/(app)/contacts/page.tsx | Soporte de pestañas de filtrado por org |
| app/(app)/contacts/contacts-table.tsx | Barra de pestañas UI en la tabla |
| lib/i18n/locales/fr.json | Claves contacts.allOrgs, contacts.currentOrg, inbox.compose.defaultOrg |
| lib/i18n/locales/en.json | Mismas claves (inglés) |
| lib/i18n/locales/es.json | Mismas claves (español) |
| Scope | Comportamiento | Caso de uso |
|---|---|---|
| all | Muestra los mensajes de todas las organizaciones | Vista panorámica de todos tus mensajes |
| current | Muestra únicamente los mensajes de la org activa | Trabajo enfocado en una organización |
| <orgId> | Muestra los mensajes de una organización específica | Consulta dirigida de una org |
| Pestaña | Icono | Scope enviado a la API |
|---|---|---|
| Todas | — | scope=all |
| Alain Bessette (Personal) | 🏠 | scope=<orgId_personnel> |
| GoWeBa.com | 🏢 | scope=<orgId_goweba> |
| AlainBessette.com | 🏢 | scope=<orgId_alain> |
| Scope recibido | Resolución | Organizaciones devueltas |
|---|---|---|
| null / "current" | Organización activa del usuario | [currentOrgId] |
| "all" | Todas las organizaciones del usuario | [orgId1, orgId2, ...] |
| "<orgId>" | Verifica el acceso, devuelve la org específica | [orgId] o [currentOrgId] si no hay acceso |
| Endpoint | Parámetro añadido | Comportamiento |
|---|---|---|
| GET /api/inbox/threads | scope=all | current |
| GET /api/inbox/snapshot | scope=all | current |
| Componente | Modificación | Rol |
|---|---|---|
| inbox/page.tsx | Carga las organizaciones del usuario al iniciar | Inyección de datos de org |
| inbox/inbox-shell.tsx | Acepta las props userOrgs y activeOrgId | Transmisión a componentes hijos |
| inbox/webabox-client.tsx | Gestión del state orgScope, barra de pestañas, scope en llamadas API | Interfaz de usuario principal |
| Archivo | Tipo de modificación |
|---|---|
| app/api/inbox/threads/route.ts | Adición param scope + función resolveOrgIds |
| app/api/inbox/snapshot/route.ts | Adición param scope + función resolveOrgIds |
| app/(app)/inbox/page.tsx | Carga de las orgs del usuario (server-side) |
| app/(app)/inbox/inbox-shell.tsx | Props userOrgs + activeOrgId |
| app/(app)/inbox/webabox-client.tsx | State orgScope, pestañas, scope en API calls |
| Módulo | Razón |
|---|---|
| OG_01 — Primeros pasos | Ningún cambio en el proceso de registro visible |
| OG_04 — WEBA Asistente IA | La IA funciona independientemente de la organización |
| OG_05 — Pipeline de ventas | El pipeline permanece vinculado a la organización activa |
| OG_06 — Formularios | Los formularios permanecen vinculados a la organización activa |
| OG_07 — Automatizaciones | Las automatizaciones permanecen vinculadas a la organización activa |
| OG_08 — Telefonía | La telefonía permanece vinculada a la cuenta SIP activa |
| OG_09 — Reportes | Los reportes se generan por organización activa |
| OG_10 — Facturación | La facturación es por organización |
| OG_11 — WEBA Comm | Comunicación independiente del tipo de org |
| OG_12 — Integraciones | Las integraciones son por organización |
| OG_13 — SMS Marketing | El marketing SMS es por organización |
| OG_14 — Templates | Los templates son por organización |
| OG_15 — Calendario | El calendario es por organización |
| OG_16 — Tareas | Las tareas son por organización |
| OG_17 — Sitios Web | Los sitios son por organización |
| OG_18 — Reputación | La reputación es por organización |
| OG_19 — Redes Sociales | Las redes sociales son por organización |
| Elemento | Tipo | Valores | Modelo | Migración |
|---|---|---|---|---|
| enum OrgType | Enum | PERSONAL | STANDARD | — |
| orgType | Campo | OrgType @default(STANDARD) | Organization | Aditiva |
| Endpoint | Método | Descripción | Fase |
|---|---|---|---|
| /api/inbox/accounts/all | GET | Cuentas de email de todas las orgs del usuario | Fase 2 |
| Endpoint | Parámetro añadido | Valores | Fase |
|---|---|---|---|
| GET /api/inbox/threads | scope | all | current |
| GET /api/inbox/snapshot | scope | all | current |
| Archivo | Descripción | Fase |
|---|---|---|
| app/api/inbox/accounts/all/route.ts | Endpoint cross-org accounts | Fase 2 |
| Archivo | Descripción | Fase |
|---|---|---|
| prisma/schema.prisma | Enum OrgType + campo orgType | Fase 1 |
| app/api/auth/signup/route.ts | Creación automática org personal | Fase 1 |
| components/layouts/org-switcher.tsx | Secciones 🏠/🏢 | Fase 1 |
| scripts/seed.ts | Espacios personales existentes | Fase 1 |
| app/(app)/inbox/compose-modal.tsx | Selector cross-org | Fase 2 |
| app/(app)/contacts/page.tsx | Pestañas de filtrado | Fase 2 |
| app/(app)/contacts/contacts-table.tsx | Barra de pestañas UI | Fase 2 |
| app/api/inbox/threads/route.ts | Param scope + resolveOrgIds | Fase 3 |
| app/api/inbox/snapshot/route.ts | Param scope + resolveOrgIds | Fase 3 |
| app/(app)/inbox/page.tsx | Carga orgs del usuario | Fase 3 |
| app/(app)/inbox/inbox-shell.tsx | Props userOrgs/activeOrgId | Fase 3 |
| app/(app)/inbox/webabox-client.tsx | State orgScope, pestañas, API scope | Fase 3 |
| lib/i18n/locales/fr.json | Claves i18n (FR) | Fases 1-2 |
| lib/i18n/locales/en.json | Claves i18n (EN) | Fases 1-2 |
| lib/i18n/locales/es.json | Claves i18n (ES) | Fases 1-2 |
| Paquete | Versión | Razón | Fase |
|---|---|---|---|
| @dnd-kit/utilities | ^3.2.2 | Dependencia faltante (drag & drop inbox) | Fase 3 |
| pdfjs-dist | ^4.4.168 | Dependencia faltante (vista previa PDF) | Fase 3 |
| react-markdown | ^9.0.1 | Dependencia faltante (renderizado markdown) | Fase 3 |
| Clave | FR | EN | ES |
|---|---|---|---|
| org.personalSpace | Espace Personnel | Personal Space | Espacio Personal |
| org.organizations | Organisations | Organizations | Organizaciones |
| org.personalOrg | Mon Espace Personnel | My Personal Space | Mi Espacio Personal |
| Clave | FR | EN | ES |
|---|---|---|---|
| contacts.allOrgs | Toutes les organisations | All organizations | Todas las organizaciones |
| contacts.currentOrg | Organisation courante | Current organization | Organización actual |
| inbox.compose.defaultOrg | Organisation par défaut | Default organization | Organización predeterminada |
| Problema | Causa probable | Solución |
|---|---|---|
| Mi Espacio Personal no aparece en el selector | Error durante la creación de la cuenta | Contactar al administrador para verificar la presencia de la org PERSONAL en la base de datos |
| No veo las cuentas de email de mis otras organizaciones en el compositor | Las cuentas de email no están configuradas en las otras organizaciones | Verificar la configuración de las cuentas de email en cada organización vía Configuración > Email |
| La pestaña « Todas » en la Webabox es lenta | Gran cantidad de mensajes a través de varias organizaciones | Usar las pestañas por organización para una vista más dirigida y rápida |
| Los contactos de mi Espacio Personal aparecen en mi organización profesional | La pestaña « Todas las organizaciones » está seleccionada | Cambiar a la pestaña « Organización actual » para filtrar por org activa |
| No puedo eliminar mi Espacio Personal | Comportamiento normal — por diseño | El Espacio Personal es permanente y no puede ser eliminado. Contactar al administrador si es necesario |
| La insignia de mensajes no leídos no refleja todos mis mensajes | La insignia muestra el scope activo (no necesariamente « Todas ») | Cambiar la pestaña a « Todas » para ver el contador global |
| Versión | Fecha | Descripción | Autor |
|---|---|---|---|
| 1.0 | 06 mayo 2026 | Publicación inicial de la Biblia de Operaciones (20 módulos) | GoWeBa |
| 1.1 | 07 mayo 2026 | Addendum 01 — Espacio Personal (Fases 1, 2 y 3) | GoWeBa |