metis-desk/docs/auditorias/workplace-dashboard/02-mapa-relaciones.md

15 KiB
Raw Blame History

Mapa de relaciones del puesto

Fecha: 22 de octubre de 2026. Etiquetas y catálogo de fuentes E: inventario. Las tablas describen implementación y DDL inspeccionados, no un esquema instalado consultado.

Relaciones directas y composición

Entidad Relación y cardinalidad Modelo/tabla y condición API disponible Uso actual
Compañía Cada puesto pertenece a 1 compañía; compañía 0..N puestos FK workstations.companyId → companies.id; filtros de contexto Inventario Assets Shell y URL
Sede Puesto 0..1 sede; sede 0..N puestos siteId → company_sites.id; validación de compañía E04 Compañía, inventario Cabecera; enlace al listado
Responsable Puesto 0..1 persona; persona 0..N puestos personId → company_contacts.id; no exclusividad por persona Compañía, inventario Cabecera y panel Personas
Miembros Puesto 0..200 activos actuales; activo como máximo 1 puesto activo workstation_members; workstation_assets.activeKey reserva única Inventario, comandos puesto Equipamiento
Ordenador Puesto 0..1 activo principal incluido en miembros computerAssetId → assets.id; E02/E04 Inventario Destacado; perfiles y software
Revisiones Puesto 1..N revisiones workstation_revisions.workstationId En WorkstationDTO.history Cronología
Miembros históricos Revisión 0..200 activos; activo puede aparecer en N revisiones y puestos en el tiempo workstation_revision_members Valores de cada revisión Nombres resueltos en historial
Actores Revisión 1 usuario de aplicación; usuario 0..N revisiones actorId → users.id; nombre resuelto E06 DTO de puesto Autor de revisión

CONFIRMADO E05/E06/E07: workstation_assets es una proyección de todos los miembros alguna vez registrados, con reserva actual opcional. No usar sus filas como lista de activos actuales. Los miembros actuales proceden de workstation_members; los históricos, de cada revisión. Las relaciones están implementadas con FK y SQL parametrizado; no se localizaron asociaciones Sequelize belongsTo/hasMany para la raíz Workstation.

Personas, departamentos y tiempo

CONFIRMADO E09: la ficha selecciona perfiles cuyo companyId coincide y cuyo values.assetId es el computerAssetId actual. Incluye perfiles inactivos. Deduplica personas de esos perfiles y añade al responsable. Esto no identifica necesariamente ocupantes vigentes.

DERIVABLE: «usuarios actuales» puede definirse como personas de perfiles activos del ordenador actual, separadas del responsable. La decisión de excluir inactivos por defecto sería PROPUESTA, no conducta vigente de la ficha. La inversa personWorkstations ya distingue responsabilidad y uso, y para uso considera puestos y perfiles activos (E10).

No hay fechas de inicio/fin de ocupación en Workstation. Se puede reconstruir cuándo se registró un cambio de responsable mediante revisiones; no una asignación laboral efectiva. Sí existen asignaciones temporales a departamentos (company.assignments, E13): persona, departamento, startDate, endDate, cargo y isPrimary. Para mostrar departamento desde el puesto hay que escoger persona y fecha y evaluar el periodo; nunca convertirlo en departamento propio del puesto.

La sede del activo es independiente de la del puesto. No sobrescribir ni deducir igualdad. La persona del perfil tampoco es automáticamente «propietaria» del activo: AssetInputSchema no tiene personId.

Grafo funcional confirmado

Las líneas representan asociaciones por claves/condiciones comprobadas, no todas son FK. En particular, Puesto–Perfil es un join por ordenador y compañía; no hay workstationId en work_profiles.

flowchart TD
  Company[Compañía] -->|0..N| Station[Puesto: Workstation]
  Station -->|0..1 siteId| Site[Sede]
  Station -->|0..1 personId| Person[Persona responsable]
  Station -->|0..200 miembros exclusivos| Asset[Activo]
  Station -->|0..1 computerAssetId incluido| Computer[Activo principal]
  Station -->|1..N| Revision[Revisión de puesto]
  Revision -->|0..200 miembros de esa revisión| Asset
  Revision -->|actorId| Operator[Usuario de aplicación]
  Computer -.->|join por assetId y companyId: 0..N| Profile[Perfil de trabajo]
  Profile -->|1 personId| UserPerson[Persona del perfil]
  UserPerson -->|0..N asignaciones temporales| Department[Departamento]
  Profile -->|0..1 accountId| Account[Cuenta de acceso]
  Profile -->|0..N| Folder[FolderMapping]
  Folder -->|1 needId| Need[Necesidad de persona]
  Folder -->|0..1 accessAccountId| Account
  Need -->|1 resourceId| AccessResource[Recurso de Access]
  Need -->|0..N| Coverage[Cobertura]
  Coverage -->|grantId| Grant[Concesión a cuenta o grupo]
  Coverage -->|accountPersonId| AccountPerson[Asignación cuenta-persona]
  Coverage -->|0..1 membershipId| Membership[Pertenencia a grupo]
  AccountPerson --> Account
  Profile -->|0..N| Config[Correo, aplicación, certificado, impresora]
  Computer -->|0..N| Software[Instalación de software]
  Software -->|aplicación u OS; licencia opcional| Resource[Recurso del inventario]
  Asset -->|0..N publicaciones| Publication[Publicación SMB]
  Publication -->|1 recurso SMB; máximo 1 publicador activo por recurso| Resource
  Asset -->|0..N históricos| Local[Entorno de identidades locales]
  Asset -->|pertenencia de directorio| Domain[Recurso de dominio]
  Asset -->|0..N| Support[Conexión de soporte]
  Asset -->|0..1 configuración con revisiones| Infrastructure[Roles, interfaces y direcciones registradas]
  UserPerson -->|contexto de persona| Remote[Conexión remota y autorización de teletrabajo]
  Remote -->|origen/destino opcional según tipo| Asset
  UserPerson -->|0..N| Process[Proceso de alta, cambio o baja]

Equipamiento y relaciones entre activos

CONFIRMADO E14: los activos tienen plantillas, características y estados técnicos operational, broken, maintenance, retired; available/in_use son estados de presentación derivados de reserva, no salud online. Las revisiones pueden conservar estados antiguos.

Ordenador, monitor, teléfono o dispositivo de red son datos de plantilla/capacidad del activo. El puesto no dispone de una enumeración propia de funciones. La ficha actual llama «periféricos» a todos los miembros salvo el principal (E11); esa etiqueta no demuestra que todos lo sean.

PROPUESTO: agrupar por plantilla real y distinguir el ordenador principal. Las impresoras utilizadas por un perfil pueden ser compartidas y no estar en assetIds; deben ir en «Configuraciones del perfil», con su procedencia, sin incorporarlas al equipamiento exclusivo. Las relaciones genéricas AssetRelationship (inventario relationships) pueden aportar enlaces, pero no transfieren pertenencia, asignación, permisos ni conectividad transitiva.

Cambiar computerAssetId cambia inmediatamente los perfiles y software seleccionados por la ficha. Sus registros siguen vinculados al activo anterior. Desmantelar el puesto no mueve ni desactiva esos registros. Una cronología que muestre «todos los perfiles históricos del puesto» exigiría una regla temporal adicional y no puede derivarse solo del filtro actual.

Recursos, accesos y SMB

Recorrido Significado y cardinalidad Fuente / tablas / API Clasificación para el dashboard
Puesto → ordenador → perfiles 0..N perfiles del host, cada perfil 1 persona/activo y 0..1 cuenta E09/E15; work_profiles, revisiones; /api/work-profiles/:companyId DERIVABLE, contexto de perfil
Perfil → FolderMapping → need → resource 0..N mapeos; cada uno 1 necesidad de la misma persona del perfil E17/E18; folder_mappings, access_items; /api/folder-mappings/:companyId, /api/access/:scope Carpeta configurada en ese perfil, no todos los recursos del responsable
Mapping → cuenta elegida 0..1 cuenta, independiente de cuenta de inicio de sesión del perfil accessAccountId; folderAccountUsable, folderAccountCoverage Mantener separadas cuenta del perfil y cuenta de acceso a carpeta
Persona → need → coverage → grant N necesidades y coberturas; concesión a cuenta XOR grupo E16/E18; access_items, access_references, revisiones Contexto de autorización documental; no comprobación real contra servidor SMB
Cuenta → account_person → persona Asignaciones temporales; cuenta compartida admite varias personas según política AccessPolicy, accessConflict No atribuir todos sus permisos al puesto
Cuenta → membership → grupo → grant Pertenencias y concesiones con periodo y configuración E16/E18 Respetar configuración, vigencia y catálogo activo
Recurso inventariado → integración Access Recurso con integration.kind=access, tipo y referencia E19; ResourceIntegrationSchema, escritor de Access; resources y access_items Resolver la identidad mediante integración; no unir por nombre
Activo → publicación SMB → recurso Publicador 0..N recursos; recurso máximo 1 publicador activo E20; asset_network_share_publications; /api/asset-network-share-publications/:companyId Publicar no concede acceso ni prueba consumo desde el puesto
Perfil → aplicación/certificado/correo/impresora Cada configuración pertenece a 1 perfil; recurso/buzón/activo destino según tipo E21; tablas específicas, revisiones y APIs homónimas Configuraciones contextualizadas, distintas de software instalado en el equipo
Perfil → correo → buzón → uso de persona Configuración referencia buzón; autorización exige uso vigente de ese buzón por la persona del perfil E36; mailboxes, mailbox_uses, revisiones; /api/mailboxes/:companyId; mailAuthorized No inferir acceso a todos los buzones por usar un equipo

AccessWorkspace es un agregado de accesos global o de compañía. No representa un escritorio ni un puesto y no debe enlazarse a Workstation por su nombre (E16).

FolderMappingSchema ya expone permissionsCovered, accessAccountCoverage (unknown, covered, not-covered) y needsReview. folderAccountCoverage filtra por la cuenta elegida y por necesidades/vías pertinentes. Reutilizar esos resultados; no reducir autorización a state === configured. folderAvailable comprueba también persona/perfil/activo/recurso, coincidencia de ruta, catálogo y fechas.

Las publicaciones SMB son explícitas, con inicio, fin, actores y predecessor; el host de una UNC no sustituye esa relación. La referencia canónica SMB y la cobertura son dimensiones separadas. No mostrar «acceso efectivo comprobado»: no se inspeccionaron conexiones reales a SMB ni credenciales.

Conectividad, dominios y entornos

Capacidad Evidencia Qué puede afirmarse
Autorización de teletrabajo CONFIRMADO, TeleworkAuthorizationInputSchema, DTO con status, effective, needsReview; E23 Pertenece a persona; fechas opcionales. No prueba que esté trabajando en remoto
Conexión remota CONFIRMADO, E22 Persona; origen equipo de compañía/ordenador personal/móvil personal; destino red/activo/recurso; método libre, requiresVpn, configuración y revisión
VPN CONFIRMADO como booleano en conexión remota y soporte No hay agregado VPN, túnel activo, credenciales ni telemetría de conexión localizados en contratos inspeccionados
Soporte remoto del activo CONFIRMADO, E24 Herramienta/recurso, destino, VPN requerida, preferencia, estado; no equivale a autorización de teletrabajo
Interfaces y direcciones de red CONFIRMADO, E35 Activo 0..1 agregado de infraestructura, 0..32 interfaces y 0..32 direcciones por interfaz; tipo ethernet/wifi/other, MAC, IPv4/IPv6, notas, roles e historial. No prueba conexión actual
Entorno local CONFIRMADO, E25 access_local_identity_environments: ciclo de vida que vincula entorno Access y activo con identityScope=local-device
Directorio corporativo CONFIRMADO, E26 DirectoryMembership une activo y recurso de dominio con rol e historial; no demuestra conexión online
Portátil corporativo DERIVABLE de plantilla/capacidad de activo y compañía No es una modalidad de Workstation ni prueba movilidad efectiva
Presencia/remoto actual, topología y conectividad online NO DISPONIBLE en puesto, conexiones/soporte e inventarios inspeccionados No dibujar mapas de red, estado «conectado» ni ubicación física actual como hechos

Para conexiones remotas: mostrar por separado «conexiones que usan este equipo» (sourceAssetId o destino activo) y «contexto de esta persona» (personId). No asumir que todas las conexiones de una persona usan el ordenador del puesto. Una autorización documental tampoco asegura acceso real a recursos.

Infraestructura persiste en asset_infrastructure, asset_infrastructure_revisions, asset_infrastructure_roles, asset_interface_snapshots y asset_interface_address_snapshots. Tiene FK de compañía/activo, revisiones ordenadas e identidad para interfaces/direcciones. Sus roles son network, server, storage, shared_peripheral; no clasifican el puesto ni convierten un activo en miembro compartido. Puede mostrarse como detalle técnico del equipo sin inventar una topología física.

Tickets, procesos e historial

DOCUMENTADO y CONFIRMADO en composición activa: tickets, intervenciones y plantillas de intervención se retiraron. Se buscaron ticket, incidencia, intervention, workplace y workstationId en módulos, apps y paquetes activos; se contrastaron composition roots, mapa de rutas y remove-archived-support-tables.ts. docs/funcionalidades-archivadas.md describe el código conservado en archive/tickets-and-interventions. No se propone restaurarlo.

NO DISPONIBLE: panel de tickets/incidencias/solicitudes del puesto como capacidad activa. Omitirlo del mockup de capacidades actuales; no mostrar un cero que sugiera un módulo operativo vacío.

CONFIRMADO E27: los procesos de persona (onboarding, change, offboarding) tienen tareas con referencias a perfil, activo, cuenta, necesidad y configuraciones. No admiten referencia tipada workstation. DERIVABLE: localizar procesos de personas relacionadas o tareas que refieran activos/perfiles, explicando la vía. No llamarlos incidencias ni cambios automáticos del puesto.

La actividad propia segura es workstation.history: instantáneas de creación y cambios registrados. Se puede comparar semánticamente cada revisión con la anterior para resumir cambios (DERIVABLE). Los nombres de personas/sedes/activos se resuelven con datos actuales: no prometer fidelidad histórica de sus etiquetas. Un feed combinado de revisiones de varias entidades requeriría agregación, identificadores de origen, deduplicación y una política temporal; queda PROPUESTO.

Discrepancia documental

docs/rutas-del-cliente.md aún describe puestos que agrupan activos «exclusivos o compartidos». El código actual elimina miembros shared y reconstruye únicamente exclusive (E07). Para esta propuesta prevalece la implementación contrastada y se registra la discrepancia sin modificar la guía ajena al alcance.