metis-desk/.artifacts/account-deletion/validacion.md
David 0e8e15c9c2 feat: Implement account deletion functionality with UI and API integration
- Added `removeAccessAccount` function to handle account deletion in the database, ensuring no external references exist.
- Created `deleteAccount` API function to facilitate account deletion requests from the client.
- Developed `AccountDeleteDialog` component for user confirmation before account deletion, integrating with the delete API.
- Introduced resource image handling with validation for PNG uploads, including UI components for image selection and preview.
- Implemented resource icon template evolution logic to maintain icon bindings without overwriting existing fields.
- Added scripts for auditing account deletion and usage checks, ensuring robust testing of the new features.
2026-10-27 11:39:53 +01:00

55 lines
4.6 KiB
Markdown

# Eliminación de cuentas — validación del 27/10/2026
Se añade «Eliminar cuenta» al menú de fila de las cuentas de compañía. La confirmación
identifica la cuenta y explica que el borrado incluye su historial propio y no elimina
la cuenta externa. Las referencias actuales e históricas bloquean la operación con
`ACCOUNT_IN_USE`; no se borran titulares, pertenencias, permisos ni perfiles en cascada.
La API valida compañía, UUID, cuerpo y query, usa sesión/CSRF y ejecuta el borrado
transaccional con bloqueos y comprobación de referencias entrantes por FK.
Archivos principales:
- `modules/companies/src/api/infrastructure/persistence/remove-access-account.ts`
- `modules/companies/src/api/infrastructure/http/access.routes.ts`
- `modules/companies/src/web/access/delete/ui/account-delete-dialog.tsx`
- `modules/companies/src/web/access/list/ui/access-workspace.tsx`
- `apps/server/src/account-deletion.integration.test.ts`
- `scripts/account-deletion-ui-audit.py`
## Comprobaciones correctas
- `pnpm --filter @metis/companies typecheck`.
- `pnpm --filter @metis/server typecheck`.
- `TSX_TSCONFIG_PATH=tsconfig.json node --import tsx --test modules/companies/src/web/shared/client-contracts.test.ts modules/companies/src/web/access/shared/access.test.tsx`.
- `DB_NAME=metis_desk_test NODE_ENV=test node --env-file=../../.env --import tsx --test src/account-deletion.integration.test.ts` desde `apps/server`: borrado de cuentas activas/inactivas, historial propio, unicidad liberada, aislamiento, repetición y protección de referencias externas incluso con una FK CASCADE.
- Biome dirigido a los archivos de código cambiados: sin errores; una advertencia de complejidad 16/15 en `AccessWorkspacePage`.
- `git diff --check` y ESLint dirigido a los archivos añadidos y modificados del servidor y del diálogo.
- `python3 scripts/visual-audit.py --account-deletion --check`: 17 comprobaciones correctas mediante Playwright MCP en Docker stdio; login ordinario real, HTTP, cancelación, Escape, retorno del foco al menú, reintento tras 503, listado actualizado y rechazo de cuentas con relaciones.
- Volumen real: 15 compañías; principal con 50 personas, 51 activos, 66 recursos, 50 perfiles, 50 puestos y 62 cuentas creadas durante el recorrido. Únicamente `metis_desk_test` desechable; entorno retirado y sesión eliminada.
- Capturas de 1440, 390 y 320 px; abiertas e inspeccionadas las de 320 px y el error por cuenta en uso de escritorio. Sin desbordamiento horizontal del diálogo en los tres tamaños.
- La compilación de producción pasó; conserva el aviso de tamaño de chunks.
Evidencias de la auditoría:
[Informe de navegador](../playwright/authenticated-jjxhf9iu/account-deletion-report.json),
[diálogo a 320 px](../playwright/authenticated-jjxhf9iu/account-delete-320.png),
[cuenta en uso](../playwright/authenticated-jjxhf9iu/account-delete-in-use.png).
## Comprobaciones globales con fallos ajenos al cambio
Se ejecutaron `pnpm typecheck`, `pnpm lint`, `pnpm test`, `pnpm check` y `pnpm build`.
Los cuatro primeros no quedaron verdes:
- Typecheck global: `packages/shadcn-ui/src/components/calendar.tsx:165`, propiedad `locale` incompatible con exactOptionalPropertyTypes. Vendor sin modificar.
- Tests globales: dos aserciones de textos de `modules/companies/src/web/companies/shared/companies-page.test.tsx`; el fichero y los componentes de personas no forman parte del cambio. El fallo de Companies detuvo Turbo antes de completar la suite global.
- Lint/check globales: diagnósticos de archivos ajenos (incluidos person-photo y evidencias JSON). No se reformatearon otros cambios del workspace.
- Integración antigua `identity.test.ts`: el primer intento requiere migración global R2.1b; con gates cerrados falla antes de llegar a los nuevos casos de cuentas porque una ruta archivada devuelve 401 y su prueba espera 404. Los casos HTTP añadidos en `access.integration.ts` no llegaron a ejecutarse en esa suite; la operación se verificó con la prueba de persistencia específica y la auditoría HTTP aislada.
## Skills y límites
Consultadas `rdx-solid` (capas, contratos y pruebas), `ux-error-recovery` (confirmación y
recuperación), `shadcn` (reutilización de las primitivas instaladas) y
`vercel-react-best-practices` (estado derivado sin efectos ni cachés remotas duplicadas).
Se reutiliza `ConfirmDeleteDialog` de rdx-ui y los tokens y patrones de DESIGN.md.
Los auditores especializados ux-*-audit de la skill no están instalados; no se invocaron
ni instalaron. No se declara una auditoría WCAG completa, lector de pantalla, contraste
global, tema oscuro ni todos los estados de carga del listado. No se borraron datos de
Abeto Design ni de ninguna compañía real durante la validación.