- 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.
55 lines
4.6 KiB
Markdown
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.
|