metis-desk/docs/auditorias/workplace-dashboard/01-inventario-funcional.md

252 lines
33 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Inventario funcional del puesto de trabajo
Fecha: 22 de octubre de 2026. Auditoría estática del árbol de trabajo, incluidos sus cambios locales previos. Entrada a los entregables: [resumen ejecutivo](08-resumen-ejecutivo.md).
## Alcance y evidencia
La entidad implementada es **Workstation**, en el módulo Assets; «Workplace» es el nombre de la carpeta solicitado para esta auditoría, no otro agregado. Companies compone su ficha. El objetivo de diseño asumido es ayudar al técnico a identificar el puesto, entender su composición y consultar sus entornos de usuario. Esta hipótesis no sustituye investigación con usuarios.
Etiquetas utilizadas en todos los documentos:
- **CONFIRMADO**: inspeccionado en implementación; no implica ejecución ni comprobación de la BD instalada.
- **DERIVABLE**: necesita el recorrido o cálculo descrito sobre fuentes existentes.
- **DOCUMENTADO**: aparece en documentación, sin implementación confirmada para esa afirmación.
- **PROPUESTO**: decisión de presentación o desarrollo futuro.
- **NO DISPONIBLE**: no localizado en el ámbito y búsquedas declarados.
La implementación se ha mantenido en solo lectura. No se ha consultado una BD ni iniciado la API: su arranque ejecuta migraciones. No se han creado usuarios ni fixtures persistentes. El JSON entregado es exclusivamente un ejemplo de diseño. La sintaxis y los contratos de ese ejemplo se verifican sin acceso a red ni BD; véase el registro de validaciones en [viabilidad](05-viabilidad-tecnica.md).
## Tecnologías verificadas
| Fuente | Declaración comprobada |
| --- | --- |
| `package.json` raíz | Node >=24 <25; PNPM 11.25.0. Entorno ejecutado: Node 24.20.0, PNPM 11.25.0 |
| `apps/web/package.json` | React 19.2.5, Vite 8.3.0, TanStack Query 5.98.0, Tailwind 4.2.2, i18next 26.0.4 |
| `apps/server/package.json` | Express 4.22.1, Sequelize 6.37.8, driver MariaDB 3.5.4, Zod 4.3.6 |
| `apps/web/components.json` | `base-vega`, RSC desactivado, iconografía Tabler |
| `packages/shadcn-ui/components.json` | Vendor base-vega, con su iconografía interna Lucide conservada |
| `modules/assets/package.json`, `modules/companies/package.json` | React Hook Form 7.72.1, TanStack Table 8.21.3; APIs públicas `./client`, `./common`, `./module` |
Son versiones declaradas en manifests, no una certificación de ejecución de cada dependencia. TypeScript 6.0.2 está fijado en la raíz.
## Atributos completos del puesto
Fuentes normativas de datos: `WorkstationInputSchema`, `WorkstationSchema`, `WorkstationValues`, `Workstation` y `WorkstationPersistenceMapper` (referencias E01–E06 al final).
| Campo | Tipo / obligatorio | Origen | Uso funcional | Visible actualmente |
| --- | --- | --- | --- | --- |
| `id` | UUID; sí | Identidad del agregado, columna `workstations.id` | URL, comandos y referencias | En URL; sin campo de lectura específico |
| `companyId` | UUID; sí | Columna y contexto de inventario | Ámbito de compañía atendida | Contexto del shell y URL |
| `values.name` | String 1–100; sí | Columna `name`; VO `Name` | Identidad legible; nombre normalizado por VO | Cabecera editable e historial |
| `values.active` | Boolean; sí | Columna `active` | Estado del puesto y reserva de miembros | Cabecera, edición e historial |
| `values.siteId` | UUID o null; clave requerida | FK `company_sites` | Sede del puesto | Cabecera enlazada al listado de sedes |
| `values.personId` | UUID o null; clave requerida | FK `company_contacts` | Responsable del puesto | Cabecera si existe y panel Personas |
| `values.computerAssetId` | UUID, null o ausente | FK `assets`; el VO omite la propiedad si no hay ordenador | Ordenador principal; asociación de perfiles y software | Equipamiento e historial |
| `values.assetIds` | UUID[]; requerido, 0–200 | `workstation_members` | Composición exclusiva actual; sin duplicados | Ordenador y demás activos |
| `history` | Revisiones, mínimo 1 | `workstation_revisions` y `workstation_revision_members` | Instantáneas completas del puesto | Pestaña Historial |
| `history[].id` | UUID; sí | Identidad de revisión | Identificar revisión, no entidad relacionada nueva | Clave interna de cronología |
| `history[].values` | Mismo contrato de valores | Columnas de revisión y sus miembros | Estado en cada revisión | Valores de la cronología |
| `history[].actorId` | UUID; sí | FK `users` | Operador que registró la revisión | No como campo independiente |
| `history[].actorName` | String no vacío; sí en DTO | Resuelto desde usuarios al construir respuesta | Mostrar autor | Cronología; no es snapshot histórico del nombre del usuario |
| `history[].recordedAt` | ISO datetime; sí | Columna de revisión | Momento de registro | Cronología localizada |
| `position`, `activeKey`, `kind` de miembros | Internos de persistencia | Tablas relacionales / proyección | Orden, reserva exclusiva y coherencia | No son campos de negocio del DTO |
**NO DISPONIBLE** en el agregado: descripción, notas propias, tipología propia del puesto, departamento propio, coordenadas, fecha contractual de ocupación, `createdAt` y `updatedAt` como campos raíz, métricas de salud o disponibilidad online. Se inspeccionaron E01–E06 y la persistencia. Las notas y características pertenecen a activos/perfiles/recursos, no al puesto.
**DERIVABLE**: fecha de registro inicial = primera revisión; última modificación registrada = última revisión. No equivalen a antigüedad del equipo, alta laboral ni fecha efectiva de asignación. El orden de `assetIds` se conserva al persistir, pero su igualdad de dominio ignora reordenaciones; no prometer una función de ordenación persistente sin revisar ese contrato.
## Reglas funcionales
| Regla CONFIRMADA | Fuente / consecuencia |
| --- | --- |
| El ordenador principal, si se indica, debe estar en `assetIds` | `WorkstationValues.create`; no es un miembro adicional |
| Miembros únicos y máximo 200 | Schema y VO; vacío válido, incluso en puesto activo |
| Sede y persona deben existir en contexto de compañía | `mapWorkstationInput`; se puede conservar una referencia inactiva previamente existente |
| Nuevo miembro de puesto activo debe ser operativo | `memberError`; permite conservar un miembro de un puesto antes activo aunque deje de ser operativo |
| Un activo no puede estar en dos puestos activos | Validación de aplicación y `workstation_assets.activeKey` único |
| Puesto inactivo no reserva activos | Mapper; las referencias históricas no equivalen a composición actual |
| Desmantelar desactiva, vacía miembros, ordenador y responsable; conserva sede y nombre | `Workstation.decommission`; crea revisión solo si hay cambio |
| Actualización semánticamente idéntica no crea revisión | `Workstation.update`; no es garantía universal de idempotencia de creación |
| Fechas de revisión válidas y no decrecientes | Agregado y mapper; última instantánea debe coincidir con valores actuales |
| Borrar elimina el puesto y sus revisiones, no los activos | Repositorio, transacción; referencias externas pueden impedirlo con `WORKSTATION_IN_USE` |
No se encontró una exigencia de categoría «ordenador» sobre `computerAssetId` en el mapper del puesto. La aptitud como host se valida al activar perfiles (`isProfileHost` en `profileReferencesAvailable`); no confundir la selección del editor con una invariante backend adicional.
## Datos de entidades relacionadas
| Entidad | Datos que pueden aportar contexto; fuente |
| --- | --- |
| Compañía | `id`, nombre, estado, logo opcional; personas, contactos, sedes, departamentos, asignaciones en `CompanySchema` |
| Sede | Nombre, estado, dirección, teléfono; `SiteSchema` |
| Persona | Nombre, cargo textual `position`, email, teléfono, estado, `isContact`, foto opcional; `PersonSchema` |
| Asignación departamental | Persona, departamento, cargo, fechas, principal y revisiones; `DepartmentAssignmentSchema` |
| Activo | Nombre, plantilla/especificación, sede, marca opcional, `registeredOn` opcional, estado técnico, notas, características tipadas, `assigned`, `displayStatus`, revisiones; `AssetSchema` |
| Perfil | Persona, activo host, cuenta opcional, nombre, activo, notas, `needsReview`, revisiones; `WorkProfileSchema` |
| Software instalado | Activo, recurso aplicación/OS, licencia opcional, versión, estado, notas, revisión y `needsReview`; `SoftwareInstallationSchema` |
| Configuraciones | Carpetas, correo, impresoras, aplicaciones y certificados referidos por `profileId`; tienen estados y revisiones propios |
| Recursos/accesos | Catálogo de recursos, recursos SMB, publicaciones, cuentas, necesidades, concesiones y coberturas; detalle en [mapa](02-mapa-relaciones.md) |
| Conectividad | Soporte de activo; conexiones remotas y autorización de teletrabajo de persona; no hay modalidad presencial/remota propia del puesto |
| Infraestructura | Roles de activo, interfaces ethernet/wifi/other, MAC, direcciones IPv4/IPv6, notas e historial; `InfrastructureSchema` (E35). Son datos registrados, no telemetría |
| Buzones y usos | `MailboxSchema`, `MailboxUseSchema`: dirección, tipo, contexto, cuenta opcional y asignaciones temporales de uso por persona (E36) |
| Procesos | Altas/cambios/bajas de persona con tareas y referencias tipadas; no son tickets ni FK directa al puesto |
## Localización de implementación y responsabilidades
Las rutas de esta tabla son relativas a la raíz. En los conjuntos con varios ficheros se enumeran las unidades relevantes, sin implicar que exista un modelo ORM por cada agregado.
| Elemento | Ruta exacta / responsabilidad |
| --- | --- |
| Valores y agregado | `modules/assets/src/api/domain/workstation-values.ts`, `value-objects/workstation-values.vo.ts`, `workstation.aggregate.ts`, `workstation-revision.entity.ts` |
| Puerto de repositorio | `modules/assets/src/api/application/asset.repository.ts`: `IAssetRepository`, contexto de inventario y comandos de puesto |
| Casos de uso y mapper | `modules/assets/src/api/application/workstation.use-cases.ts`, `workstation-input.mapper.ts`, `workstation-response.builder.ts` |
| HTTP | `modules/assets/src/api/infrastructure/http/workstation.routes.ts`: alta, actualización, desmantelamiento y borrado |
| Persistencia | `modules/assets/src/api/infrastructure/persistence/sequelize-asset.repository.ts`, `workstation-persistence.mapper.ts`, `load-workstations.ts`, `workstation-relational.ts` |
| Modelo/migración | `modules/assets/src/api/infrastructure/persistence/workstation.model.ts`: `WorkstationAssetModel`, `migrateWorkstations`; raíces leídas/escritas mediante SQL parametrizado, no `WorkstationModel` |
| Retirada de miembros compartidos | `modules/assets/src/api/infrastructure/persistence/remove-shared-workstation-assets.ts` |
| Contratos | `modules/assets/src/common/workstations.ts`, `inventory.ts` |
| Composición servidor | `modules/assets/src/api/module.ts`, `modules/companies/src/api/module.ts`, `apps/server/src/index.ts` |
| Ficha | `modules/companies/src/web/workstations/detail/ui/workstation-detail-page.tsx`, `workstation-detail-content.tsx`, `workstation-assets.tsx`, `workstation-people.tsx`, `workstation-profiles.tsx` |
| Coordinación | `modules/companies/src/web/workstations/detail/controllers/use-workstation-detail-controller.ts` |
| Cálculo de relaciones e inversa | `modules/companies/src/web/workstations/detail/helpers/workstation-relations.ts`, `person-workstations.ts` |
| Entrada de compañía | `modules/companies/src/web/companies/detail/ui/company-inventory.tsx` |
| Listado y controlador | `modules/assets/src/web/workstations/list/ui/workstations-page.tsx`, `list/controllers/use-workstations-page-controller.ts` |
| Editor | `modules/assets/src/web/workstations/shared/ui/workstation-editor-dialog.tsx`, `workstation-form.tsx`, `workstation-identity-fields.tsx`, `workstation-association-fields.tsx`, `workstation-computer-field.tsx`, `workstation-asset-fields.tsx`, `workstation-form-actions.tsx` |
| Estado y creación | `modules/assets/src/web/workstations/shared/controllers/use-workstation-form-controller.ts`, `shared/helpers/workstation-creation.ts`, `shared/workstation-name.ts` |
| Acciones | `modules/assets/src/web/workstations/shared/ui/workstation-actions.tsx`, `workstation-lifecycle-dialog.tsx` |
| Renombrado | `modules/assets/src/web/workstations/rename/ui/workstation-name-editor.tsx`, `rename/api/rename-workstation.api.ts` |
| Historial | `modules/assets/src/web/workstations/history/ui/workstation-history.tsx`, `workstation-history-dialog.tsx` |
| Cliente HTTP y claves | `modules/assets/src/web/workstations/shared/api/save-workstation.api.ts`, `modules/assets/src/web/shared/api/inventory-request.ts`, `modules/assets/src/web/shared/queries/index.ts` |
| Rutas de compañía | `modules/companies/src/web/workspace/shared/helpers/workspace-routes.ts`; selección de ficha por UUID |
| Traducciones | `modules/assets/src/common/locales/es.json`, `en.json`; claves `workstationDetail`, `workstationLifecycle`, `workstationComputer`, `workstationPerson`. Perfiles/configuraciones usan `modules/companies/src/common/locales/es.json`, `en.json` |
| Tests de dominio/UI | `modules/assets/src/api/domain/workstation.test.ts`; `modules/companies/src/web/workstations/detail/helpers/workstation-relations.test.ts`; `detail/ui/workstation-detail.test.tsx` |
| Tests de edición/alta | `modules/assets/src/web/workstations/shared/helpers/workstation-creation.test.ts`, `shared/workstation-name.test.ts`, `rename/api/rename-workstation.test.ts` |
| Integración | `apps/server/src/workstations.integration.ts`, `workstation-lifecycle.integration.ts`; no se ejecutan aquí porque requieren persistencia |
## APIs y acciones existentes
| Operación | Contrato | Efecto / exposición actual |
| --- | --- | --- |
| Consultar puesto | `GET /api/assets/:companyId` | Devuelve inventario completo con `workstations`, activos y relaciones. El controller selecciona el UUID; no se encontró GET individual del puesto |
| Crear | `POST /api/assets/:companyId/workstations` con `{values}` | 201, revisión inicial; se inicia en listado |
| Editar / renombrar / cambiar composición | `POST /api/assets/:companyId/workstations/:id/update` con `{values}` | 200; cabecera y modal; renombrado reutiliza comando de guardado |
| Desmantelar | `POST /api/assets/:companyId/workstations/:id/decommission`, body `{}` | Menú con confirmación; libera reserva, no desactiva perfiles automáticamente |
| Borrar | `POST /api/assets/:companyId/workstations/:id/delete`, body `{}` | Confirmación; retorno al listado tras éxito; puede fallar por referencias |
| Crear perfil | `POST /api/work-profiles/:companyId` | Modal separado; la ficha requiere puesto activo, ordenador presente y no retirado; aplicación valida además host, persona y cuenta |
| Software | `GET/POST /api/software-installations/:companyId`, `POST /:id/update`, `POST /:id/delete` bajo esa base | Panel filtra por ordenador principal, permite alta, edición, historial, borrado |
| Navegar | `/companies/:companyId/workstations/:id`, `/people/:id`, `/assets/:id`, `/work-profiles/:id`, `/resources/:id` | Enlaces reales; sede apunta a `/sites`, sin ficha individual de sede |
Errores HTTP de comandos de puesto: 400 para `INVALID_REQUEST`, 404 para códigos terminados en `NOT_FOUND`, 409 para otros fallos de negocio; excepciones se propagan al middleware. Autenticación y límites del aislamiento: [viabilidad](05-viabilidad-tecnica.md).
## Skills y normativa aplicadas
Se inspeccionaron las 15 carpetas de `.agents/skills/` y las 15 entradas de `skills-lock.json`. Los hashes del lock no equivalen a releases ni se verificó upstream.
| Skill leída | Criterio aplicado |
| --- | --- |
| `ux-dashboard` — principal | Empezar por preguntas operativas; priorizar y justificar cada indicador; evitar gráficos decorativos |
| `ux-tables` | Elegir tabla para comparación y lista para lectura; formatos, volumen, búsqueda y acciones accesibles; prevalece el patrón Metis de acciones visibles |
| `ux-design-review` | Unificar hallazgos por prioridad y separar evidencia estática, reproducción y pendientes |
| `shadcn` y referencias de composición/Base vs Radix | Comprobar APIs instaladas y wrappers antes de proponer componentes; `render` de Base UI, títulos y estructura semántica |
| `vercel-composition-patterns`, regla `architecture-avoid-boolean-props` | Bloques por responsabilidad y composición explícita; sin componente universal de dashboard |
| `vercel-react-best-practices`, reglas `async-parallel`, `rerender-derived-state-no-effect` | Consultas independientes, cálculo derivado sin efectos y caché remota única |
Las otras nueve skills están inventariadas, no se declara su aplicación. Faltan las skills auditoras `ux-*-audit` que referencia el orquestador y su política `docs/orchestration-policy.md`; la revisión es manual apoyada en las guías disponibles, sin auditor especializado de accesibilidad. No se instaló nada. DESIGN.md gobierna color, tipografía y espaciado; no se diseña otra identidad.
Normativa consultada: AGENTS.md, DESIGN.md, `docs/skills-frontend-ui-ux.md`, capas/composición de servidor, estructura web, rutas del cliente, componentes de interfaz, patrones de listados/diálogos, procedimiento Playwright y funcionalidades archivadas. Las referencias enlazadas en los demás documentos distinguen norma e implementación.
## Referencias de evidencia
El catálogo de fuentes con enlaces a símbolos y líneas figura a continuación. Las referencias E se utilizan en los ocho entregables; las líneas corresponden al árbol auditado y pueden cambiar con ediciones posteriores.
| Evidencia | Archivo y símbolo / línea |
| --- | --- |
| E01 | [modules/assets/src/api/domain/workstation-values.ts:3](../../../modules/assets/src/api/domain/workstation-values.ts#L3) — `WorkstationInputSchema` |
| E01 | [modules/assets/src/common/workstations.ts:19](../../../modules/assets/src/common/workstations.ts#L19) — `WorkstationSchema` |
| E02 | [modules/assets/src/api/domain/value-objects/workstation-values.vo.ts:20](../../../modules/assets/src/api/domain/value-objects/workstation-values.vo.ts#L20) — `static create` |
| E03 | [modules/assets/src/api/domain/workstation.aggregate.ts:56](../../../modules/assets/src/api/domain/workstation.aggregate.ts#L56) — `decommission(` |
| E04 | [modules/assets/src/api/application/workstation-input.mapper.ts:11](../../../modules/assets/src/api/application/workstation-input.mapper.ts#L11) — `mapWorkstationInput` |
| E05 | [modules/assets/src/api/infrastructure/persistence/workstation.model.ts:18](../../../modules/assets/src/api/infrastructure/persistence/workstation.model.ts#L18) — `migrateWorkstations` |
| E06 | [modules/assets/src/api/infrastructure/persistence/workstation-persistence.mapper.ts:79](../../../modules/assets/src/api/infrastructure/persistence/workstation-persistence.mapper.ts#L79) — `toPersistence(` |
| E06 | [modules/assets/src/api/application/workstation-response.builder.ts:4](../../../modules/assets/src/api/application/workstation-response.builder.ts#L4) — `export function` |
| E07 | [modules/assets/src/api/infrastructure/persistence/workstation-relational.ts:66](../../../modules/assets/src/api/infrastructure/persistence/workstation-relational.ts#L66) — `readWorkstations` |
| E07 | [modules/assets/src/api/infrastructure/persistence/remove-shared-workstation-assets.ts:4](../../../modules/assets/src/api/infrastructure/persistence/remove-shared-workstation-assets.ts#L4) — `removeSharedWorkstationAssets` |
| E07 | [modules/assets/src/api/infrastructure/persistence/load-workstations.ts:10](../../../modules/assets/src/api/infrastructure/persistence/load-workstations.ts#L10) — `loadWorkstations` |
| E08 | [modules/companies/src/web/workstations/detail/ui/workstation-detail-page.tsx:19](../../../modules/companies/src/web/workstations/detail/ui/workstation-detail-page.tsx#L19) — `export function` |
| E08 | [modules/companies/src/web/workstations/detail/controllers/use-workstation-detail-controller.ts:9](../../../modules/companies/src/web/workstations/detail/controllers/use-workstation-detail-controller.ts#L9) — `export function` |
| E09 | [modules/companies/src/web/workstations/detail/helpers/workstation-relations.ts:6](../../../modules/companies/src/web/workstations/detail/helpers/workstation-relations.ts#L6) — `export function` |
| E10 | [modules/companies/src/web/workstations/detail/helpers/person-workstations.ts:5](../../../modules/companies/src/web/workstations/detail/helpers/person-workstations.ts#L5) — `export function` |
| E11 | [modules/companies/src/web/workstations/detail/ui/workstation-assets.tsx:10](../../../modules/companies/src/web/workstations/detail/ui/workstation-assets.tsx#L10) — `export function` |
| E12 | [modules/companies/src/web/workstations/detail/ui/workstation-profiles.tsx:12](../../../modules/companies/src/web/workstations/detail/ui/workstation-profiles.tsx#L12) — `export function` |
| E12 | [modules/companies/src/web/workstations/detail/ui/workstation-people.tsx:9](../../../modules/companies/src/web/workstations/detail/ui/workstation-people.tsx#L9) — `export function` |
| E13 | [modules/companies/src/common/dto/shared/company.dto.ts:47](../../../modules/companies/src/common/dto/shared/company.dto.ts#L47) — `CompanySchema` |
| E13 | [modules/companies/src/common/dto/shared/people.dto.ts:55](../../../modules/companies/src/common/dto/shared/people.dto.ts#L55) — `DepartmentAssignmentSchema` |
| E14 | [modules/assets/src/api/domain/asset-values.ts:19](../../../modules/assets/src/api/domain/asset-values.ts#L19) — `AssetInputSchema` |
| E14 | [modules/assets/src/common/inventory.ts:33](../../../modules/assets/src/common/inventory.ts#L33) — `AssetSchema` |
| E14 | [modules/assets/src/api/domain/asset-state.ts:7](../../../modules/assets/src/api/domain/asset-state.ts#L7) — `assetDisplayStatus` |
| E15 | [modules/companies/src/api/domain/work-profile-values.ts:3](../../../modules/companies/src/api/domain/work-profile-values.ts#L3) — `WorkProfileInputSchema` |
| E15 | [modules/companies/src/api/application/work-profile-input.mapper.ts:10](../../../modules/companies/src/api/application/work-profile-input.mapper.ts#L10) — `profileReferencesAvailable` |
| E15 | [modules/companies/src/api/application/work-profile-response.builder.ts:7](../../../modules/companies/src/api/application/work-profile-response.builder.ts#L7) — `buildWorkProfileResponse` |
| E15 | [modules/companies/src/api/infrastructure/persistence/work-profile-migration.ts:6](../../../modules/companies/src/api/infrastructure/persistence/work-profile-migration.ts#L6) — `migrateWorkProfiles` |
| E15 | [modules/companies/src/api/infrastructure/persistence/sequelize-work-profile.repository.ts:17](../../../modules/companies/src/api/infrastructure/persistence/sequelize-work-profile.repository.ts#L17) — `class SequelizeWorkProfileRepository` |
| E16 | [modules/companies/src/api/domain/access/access-definition.ts:103](../../../modules/companies/src/api/domain/access/access-definition.ts#L103) — `AccessDefinitionSchema` |
| E16 | [modules/companies/src/api/domain/access/access-workspace.aggregate.ts:25](../../../modules/companies/src/api/domain/access/access-workspace.aggregate.ts#L25) — `class AccessWorkspace` |
| E16 | [modules/companies/src/api/infrastructure/persistence/access-persistence.ts:70](../../../modules/companies/src/api/infrastructure/persistence/access-persistence.ts#L70) — `migrateAccess` |
| E17 | [modules/companies/src/api/domain/folder-mapping-values.ts:5](../../../modules/companies/src/api/domain/folder-mapping-values.ts#L5) — `FolderMappingInputSchema` |
| E17 | [modules/companies/src/common/folder-mappings.ts:16](../../../modules/companies/src/common/folder-mappings.ts#L16) — `FolderMappingSchema` |
| E18 | [modules/companies/src/api/application/folder-mapping-policy.ts:39](../../../modules/companies/src/api/application/folder-mapping-policy.ts#L39) — `folderAvailable` |
| E18 | [modules/companies/src/api/application/folder-mapping-account-policy.ts:50](../../../modules/companies/src/api/application/folder-mapping-account-policy.ts#L50) — `folderAccountCoverage` |
| E18 | [modules/companies/src/api/domain/access/access-policy.ts:165](../../../modules/companies/src/api/domain/access/access-policy.ts#L165) — `checkCoverage` |
| E18 | [modules/companies/src/api/domain/access/access-projection.ts:302](../../../modules/companies/src/api/domain/access/access-projection.ts#L302) — `projectAccess` |
| E19 | [modules/resources/src/api/domain/resource-values.ts:21](../../../modules/resources/src/api/domain/resource-values.ts#L21) — `ResourceIntegrationSchema` |
| E19 | [modules/resources/src/common/inventory.ts:35](../../../modules/resources/src/common/inventory.ts#L35) — `ResourceSchema` |
| E19 | [modules/companies/src/api/infrastructure/persistence/resource-access-writer.ts:85](../../../modules/companies/src/api/infrastructure/persistence/resource-access-writer.ts#L85) — `async project` |
| E20 | [modules/assets/src/common/network-share-publications.ts:10](../../../modules/assets/src/common/network-share-publications.ts#L10) — `NETWORK_SHARE_PUBLICATION_DEFINITION` |
| E20 | [modules/assets/src/api/infrastructure/persistence/network-share-publication-migration.ts:4](../../../modules/assets/src/api/infrastructure/persistence/network-share-publication-migration.ts#L4) — `CREATE TABLE` |
| E20 | [modules/assets/src/api/infrastructure/http/network-share-publication.routes.ts:24](../../../modules/assets/src/api/infrastructure/http/network-share-publication.routes.ts#L24) — `registerNetworkSharePublicationRoutes` |
| E21 | [modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts:12](../../../modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts#L12) — `profileSnapshot` |
| E21 | [modules/companies/src/api/infrastructure/persistence/mail-remote-snapshots.ts:42](../../../modules/companies/src/api/infrastructure/persistence/mail-remote-snapshots.ts#L42) — `mailSnapshot` |
| E21 | [modules/companies/src/api/domain/application-configuration-values.ts:5](../../../modules/companies/src/api/domain/application-configuration-values.ts#L5) — `ApplicationConfigurationInputSchema` |
| E21 | [modules/companies/src/api/domain/printer-configuration-values.ts:5](../../../modules/companies/src/api/domain/printer-configuration-values.ts#L5) — `PrinterConfigurationInputSchema` |
| E21 | [modules/companies/src/api/domain/certificate-configuration-values.ts:5](../../../modules/companies/src/api/domain/certificate-configuration-values.ts#L5) — `CertificateConfigurationInputSchema` |
| E22 | [modules/companies/src/api/domain/remote-connection-values.ts:5](../../../modules/companies/src/api/domain/remote-connection-values.ts#L5) — `RemoteConnectionInputSchema` |
| E22 | [modules/companies/src/api/application/remote-connection-policy.ts:31](../../../modules/companies/src/api/application/remote-connection-policy.ts#L31) — `remoteNeedsReview` |
| E23 | [modules/companies/src/api/domain/telework-authorization-values.ts:3](../../../modules/companies/src/api/domain/telework-authorization-values.ts#L3) — `TeleworkAuthorizationInputSchema` |
| E23 | [modules/companies/src/api/application/telework-authorization-policy.ts:6](../../../modules/companies/src/api/application/telework-authorization-policy.ts#L6) — `teleworkAuthorizationState` |
| E24 | [modules/assets/src/common/support.ts:15](../../../modules/assets/src/common/support.ts#L15) — `SupportConnectionSchema` |
| E24 | [modules/assets/src/api/domain/support-values.ts:3](../../../modules/assets/src/api/domain/support-values.ts#L3) — `SupportValuesSchema` |
| E24 | [modules/assets/src/api/infrastructure/http/support.routes.ts:18](../../../modules/assets/src/api/infrastructure/http/support.routes.ts#L18) — `registerSupportRoutes` |
| E25 | [modules/companies/src/common/local-identity-environments.ts:18](../../../modules/companies/src/common/local-identity-environments.ts#L18) — `LocalIdentityEnvironmentSchema` |
| E25 | [modules/companies/src/api/infrastructure/persistence/local-identity-migration.ts:6](../../../modules/companies/src/api/infrastructure/persistence/local-identity-migration.ts#L6) — `CREATE TABLE` |
| E26 | [modules/assets/src/common/directory-memberships.ts:54](../../../modules/assets/src/common/directory-memberships.ts#L54) — `DirectoryMembershipSchema` |
| E26 | [modules/assets/src/api/infrastructure/http/directory-membership.routes.ts:21](../../../modules/assets/src/api/infrastructure/http/directory-membership.routes.ts#L21) — `registerDirectoryMembershipRoutes` |
| E27 | [modules/companies/src/api/domain/process-values.ts:27](../../../modules/companies/src/api/domain/process-values.ts#L27) — `ProcessReferenceSchema` |
| E27 | [modules/companies/src/api/infrastructure/http/process.routes.ts:27](../../../modules/companies/src/api/infrastructure/http/process.routes.ts#L27) — `registerProcessRoutes` |
| E27 | [docs/funcionalidades-archivadas.md:28](../../../docs/funcionalidades-archivadas.md#L28) — `## Aplicación activa` |
| E27 | [modules/companies/src/api/infrastructure/persistence/remove-archived-support-tables.ts:5](../../../modules/companies/src/api/infrastructure/persistence/remove-archived-support-tables.ts#L5) — `const` |
| E28 | [modules/companies/src/web/workstations/detail/ui/workstation-detail-content.tsx:17](../../../modules/companies/src/web/workstations/detail/ui/workstation-detail-content.tsx#L17) — `export function` |
| E28 | [modules/companies/src/web/software-installations/list/ui/software-installations-panel.tsx:26](../../../modules/companies/src/web/software-installations/list/ui/software-installations-panel.tsx#L26) — `export function` |
| E29 | [modules/assets/src/web/workstations/history/ui/workstation-history.tsx:15](../../../modules/assets/src/web/workstations/history/ui/workstation-history.tsx#L15) — `export function` |
| E30 | [modules/companies/src/web/work-environments/detail/hooks/use-environment-queries.ts:20](../../../modules/companies/src/web/work-environments/detail/hooks/use-environment-queries.ts#L20) — `export function` |
| E30 | [modules/companies/src/web/work-environments/shared/helpers/work-environment.model.ts:60](../../../modules/companies/src/web/work-environments/shared/helpers/work-environment.model.ts#L60) — `export function buildEnvironment` |
| E30 | [modules/companies/src/web/work-environments/detail/ui/environment-content.tsx:19](../../../modules/companies/src/web/work-environments/detail/ui/environment-content.tsx#L19) — `export function` |
| E31 | [packages/rdx-ui/src/components/detail-panel.tsx:6](../../../packages/rdx-ui/src/components/detail-panel.tsx#L6) — `export function` |
| E31 | [packages/rdx-ui/src/components/detail-field.tsx:4](../../../packages/rdx-ui/src/components/detail-field.tsx#L4) — `export function` |
| E31 | [packages/rdx-ui/src/components/statistic-card.tsx:19](../../../packages/rdx-ui/src/components/statistic-card.tsx#L19) — `export function` |
| E32 | [apps/web/components.json:3](../../../apps/web/components.json#L3) — `base-vega` |
| E32 | [packages/rdx-ui/src/components/entity-list.tsx:17](../../../packages/rdx-ui/src/components/entity-list.tsx#L17) — `export` |
| E32 | [packages/shadcn-ui/src/components/tabs.tsx:7](../../../packages/shadcn-ui/src/components/tabs.tsx#L7) — `function Tabs` |
| E32 | [packages/shadcn-ui/src/components/button.tsx:42](../../../packages/shadcn-ui/src/components/button.tsx#L42) — `function Button` |
| E33 | [modules/identity/src/api/infrastructure/http/require-authenticated.ts:6](../../../modules/identity/src/api/infrastructure/http/require-authenticated.ts#L6) — `export function` |
| E33 | [modules/assets/src/api/infrastructure/http/workstation.routes.ts:16](../../../modules/assets/src/api/infrastructure/http/workstation.routes.ts#L16) — `registerWorkstationRoutes` |
| E33 | [modules/assets/src/api/infrastructure/persistence/sequelize-asset.repository.ts:157](../../../modules/assets/src/api/infrastructure/persistence/sequelize-asset.repository.ts#L157) — `saveWorkstation(` |
| E34 | [apps/server/src/infrastructure/http/relationship-read-access.ts:7](../../../apps/server/src/infrastructure/http/relationship-read-access.ts#L7) — `class SessionRelationshipReadAccess` |
| E35 | [modules/assets/src/api/domain/infrastructure-values.ts:33](../../../modules/assets/src/api/domain/infrastructure-values.ts#L33) — `InfrastructureInputSchema` |
| E35 | [modules/assets/src/api/infrastructure/persistence/infrastructure-migration.ts:4](../../../modules/assets/src/api/infrastructure/persistence/infrastructure-migration.ts#L4) — `migrateInfrastructure` |
| E35 | [modules/assets/src/api/infrastructure/persistence/sequelize-infrastructure.repository.ts:21](../../../modules/assets/src/api/infrastructure/persistence/sequelize-infrastructure.repository.ts#L21) — `class SequelizeInfrastructureRepository` |
| E36 | [modules/companies/src/common/mailboxes.ts:34](../../../modules/companies/src/common/mailboxes.ts#L34) — `MailboxesResponseSchema` |
| E36 | [modules/companies/src/api/application/mail-configuration-policy.ts:5](../../../modules/companies/src/api/application/mail-configuration-policy.ts#L5) — `mailAuthorized` |
| E36 | [modules/companies/src/api/infrastructure/persistence/mailbox-migration.ts:6](../../../modules/companies/src/api/infrastructure/persistence/mailbox-migration.ts#L6) — `migrateMailboxes` |
| E37 | [apps/server/src/infrastructure/http/identity-runtime.ts:17](../../../apps/server/src/infrastructure/http/identity-runtime.ts#L17) — `createIdentityRuntime` |
| E37 | [modules/assets/src/api/module.ts:67](../../../modules/assets/src/api/module.ts#L67) — `createAssetModule` |
| E37 | [modules/companies/src/api/module.ts:99](../../../modules/companies/src/api/module.ts#L99) — `createCompanyModule` |