erp-core/docs/01-fase-foundation/MGN-002-users/implementacion/TRACEABILITY.yml

514 lines
15 KiB
YAML

# TRACEABILITY.yml - MGN-002: Usuarios
# Matriz de trazabilidad: Documentacion -> Codigo
# Ubicacion: docs/01-fase-foundation/MGN-002-users/implementacion/
epic_code: MGN-002
epic_name: Usuarios
phase: 1
phase_name: Foundation
story_points: 35
status: documented
# =============================================================================
# DOCUMENTACION
# =============================================================================
documentation:
requirements:
- id: RF-USER-001
file: ../requerimientos/RF-USER-001.md
title: CRUD de Usuarios
priority: P0
status: migrated
description: |
Crear, leer, actualizar y eliminar usuarios del sistema.
Incluye soft delete para mantener trazabilidad.
- id: RF-USER-002
file: ../requerimientos/RF-USER-002.md
title: Perfil de Usuario
priority: P0
status: migrated
description: |
Gestion de perfil extendido: bio, empresa, cargo,
direccion, links sociales.
- id: RF-USER-003
file: ../requerimientos/RF-USER-003.md
title: Cambio de Email
priority: P1
status: migrated
description: |
Proceso seguro para cambiar email del usuario.
Requiere verificacion del nuevo email antes del cambio.
- id: RF-USER-004
file: ../requerimientos/RF-USER-004.md
title: Cambio de Password
priority: P1
status: migrated
description: |
Permitir al usuario cambiar su password.
Requiere confirmacion del password actual.
- id: RF-USER-005
file: ../requerimientos/RF-USER-005.md
title: Preferencias de Usuario
priority: P1
status: migrated
description: |
Personalizacion: tema, idioma, formato fecha,
configuracion de notificaciones.
requirements_index:
file: ../requerimientos/INDICE-RF-USER.md
status: migrated
specifications:
- id: ET-USERS-001
file: ../especificaciones/ET-users-backend.md
title: Backend Users
rf: [RF-USER-001, RF-USER-002, RF-USER-003, RF-USER-004, RF-USER-005]
status: migrated
- id: ET-USERS-002
file: ../especificaciones/ET-USER-database.md
title: Database Users
rf: [RF-USER-001, RF-USER-002, RF-USER-003]
status: migrated
user_stories:
- id: US-MGN002-001
file: ../historias-usuario/US-MGN002-001.md
title: Crear Usuario
rf: [RF-USER-001]
story_points: 5
status: migrated
- id: US-MGN002-002
file: ../historias-usuario/US-MGN002-002.md
title: Editar Usuario
rf: [RF-USER-001]
story_points: 3
status: migrated
- id: US-MGN002-003
file: ../historias-usuario/US-MGN002-003.md
title: Gestionar Perfil
rf: [RF-USER-002]
story_points: 5
status: migrated
- id: US-MGN002-004
file: ../historias-usuario/US-MGN002-004.md
title: Configurar Preferencias
rf: [RF-USER-005]
story_points: 3
status: migrated
- id: US-MGN002-005
file: ../historias-usuario/US-MGN002-005.md
title: Cambio de Email
rf: [RF-USER-003]
story_points: 6
status: ready
backlog:
file: ../historias-usuario/BACKLOG-MGN002.md
status: migrated
# =============================================================================
# IMPLEMENTACION
# =============================================================================
implementation:
database:
schema: core_users
path: apps/database/ddl/schemas/core_users/
tables:
- name: users
file: apps/database/ddl/schemas/core_users/tables/users.sql
rf: RF-USERS-001
status: pending
columns:
- {name: id, type: UUID, pk: true}
- {name: tenant_id, type: UUID, fk: tenants}
- {name: first_name, type: VARCHAR(100)}
- {name: last_name, type: VARCHAR(100)}
- {name: display_name, type: VARCHAR(200)}
- {name: avatar_url, type: TEXT}
- {name: phone, type: VARCHAR(20)}
- {name: timezone, type: VARCHAR(50)}
- {name: locale, type: VARCHAR(10)}
- {name: is_active, type: BOOLEAN}
- {name: created_at, type: TIMESTAMPTZ}
- {name: updated_at, type: TIMESTAMPTZ}
- {name: deleted_at, type: TIMESTAMPTZ}
indexes:
- idx_users_tenant
- idx_users_name_search
rls_policies:
- tenant_isolation
- name: user_profiles
file: apps/database/ddl/schemas/core_users/tables/user_profiles.sql
rf: RF-USERS-002
status: pending
columns:
- {name: id, type: UUID, pk: true}
- {name: user_id, type: UUID, fk: users, unique: true}
- {name: bio, type: TEXT}
- {name: company, type: VARCHAR(200)}
- {name: job_title, type: VARCHAR(100)}
- {name: address, type: JSONB}
- {name: social_links, type: JSONB}
- {name: created_at, type: TIMESTAMPTZ}
- {name: updated_at, type: TIMESTAMPTZ}
- name: user_preferences
file: apps/database/ddl/schemas/core_users/tables/user_preferences.sql
rf: RF-USERS-003
status: pending
columns:
- {name: id, type: UUID, pk: true}
- {name: user_id, type: UUID, fk: users, unique: true}
- {name: theme, type: VARCHAR(20)}
- {name: notifications_email, type: BOOLEAN}
- {name: notifications_push, type: BOOLEAN}
- {name: language, type: VARCHAR(10)}
- {name: date_format, type: VARCHAR(20)}
- {name: created_at, type: TIMESTAMPTZ}
- {name: updated_at, type: TIMESTAMPTZ}
backend:
module: users
path: apps/backend/src/modules/users/
framework: NestJS
entities:
- name: User
file: apps/backend/src/modules/users/entities/user.entity.ts
rf: RF-USERS-001
status: pending
table: users
- name: UserProfile
file: apps/backend/src/modules/users/entities/user-profile.entity.ts
rf: RF-USERS-002
status: pending
table: user_profiles
- name: UserPreferences
file: apps/backend/src/modules/users/entities/user-preferences.entity.ts
rf: RF-USERS-003
status: pending
table: user_preferences
services:
- name: UsersService
file: apps/backend/src/modules/users/users.service.ts
rf: [RF-USERS-001, RF-USERS-004, RF-USERS-005]
status: pending
methods:
- {name: create, rf: RF-USERS-001}
- {name: findAll, rf: RF-USERS-001}
- {name: findOne, rf: RF-USERS-001}
- {name: update, rf: RF-USERS-001}
- {name: remove, rf: RF-USERS-001}
- {name: activate, rf: RF-USERS-004}
- {name: deactivate, rf: RF-USERS-004}
- {name: search, rf: RF-USERS-005}
- name: ProfileService
file: apps/backend/src/modules/users/profile.service.ts
rf: [RF-USERS-002]
status: pending
methods:
- {name: getProfile, rf: RF-USERS-002}
- {name: updateProfile, rf: RF-USERS-002}
- {name: uploadAvatar, rf: RF-USERS-002}
- name: PreferencesService
file: apps/backend/src/modules/users/preferences.service.ts
rf: [RF-USERS-003]
status: pending
methods:
- {name: getPreferences, rf: RF-USERS-003}
- {name: updatePreferences, rf: RF-USERS-003}
controllers:
- name: UsersController
file: apps/backend/src/modules/users/users.controller.ts
status: pending
endpoints:
- method: GET
path: /api/v1/users
rf: RF-USERS-001
description: Listar usuarios con paginacion
- method: GET
path: /api/v1/users/:id
rf: RF-USERS-001
description: Obtener usuario por ID
- method: POST
path: /api/v1/users
rf: RF-USERS-001
description: Crear nuevo usuario
- method: PATCH
path: /api/v1/users/:id
rf: RF-USERS-001
description: Actualizar usuario
- method: DELETE
path: /api/v1/users/:id
rf: RF-USERS-001
description: Soft delete usuario
- method: GET
path: /api/v1/users/:id/profile
rf: RF-USERS-002
description: Obtener perfil
- method: PATCH
path: /api/v1/users/:id/profile
rf: RF-USERS-002
description: Actualizar perfil
- method: POST
path: /api/v1/users/:id/avatar
rf: RF-USERS-002
description: Subir avatar
- method: GET
path: /api/v1/users/:id/preferences
rf: RF-USERS-003
description: Obtener preferencias
- method: PATCH
path: /api/v1/users/:id/preferences
rf: RF-USERS-003
description: Actualizar preferencias
- method: POST
path: /api/v1/users/:id/activate
rf: RF-USERS-004
description: Activar usuario
- method: POST
path: /api/v1/users/:id/deactivate
rf: RF-USERS-004
description: Desactivar usuario
- method: GET
path: /api/v1/users/search
rf: RF-USERS-005
description: Buscar usuarios
dtos:
- name: CreateUserDto
file: apps/backend/src/modules/users/dto/create-user.dto.ts
rf: RF-USERS-001
status: pending
- name: UpdateUserDto
file: apps/backend/src/modules/users/dto/update-user.dto.ts
rf: RF-USERS-001
status: pending
- name: UserFilterDto
file: apps/backend/src/modules/users/dto/user-filter.dto.ts
rf: RF-USERS-005
status: pending
- name: UpdateProfileDto
file: apps/backend/src/modules/users/dto/update-profile.dto.ts
rf: RF-USERS-002
status: pending
- name: UpdatePreferencesDto
file: apps/backend/src/modules/users/dto/update-preferences.dto.ts
rf: RF-USERS-003
status: pending
frontend:
feature: users
path: apps/frontend/src/features/users/
framework: React
pages:
- name: UsersPage
file: apps/frontend/src/features/users/pages/UsersPage.tsx
rf: RF-USERS-001
status: pending
route: /users
- name: UserDetailPage
file: apps/frontend/src/features/users/pages/UserDetailPage.tsx
rf: RF-USERS-001
status: pending
route: /users/:id
- name: ProfilePage
file: apps/frontend/src/features/users/pages/ProfilePage.tsx
rf: RF-USERS-002
status: pending
route: /profile
- name: PreferencesPage
file: apps/frontend/src/features/users/pages/PreferencesPage.tsx
rf: RF-USERS-003
status: pending
route: /settings/preferences
components:
- name: UserTable
file: apps/frontend/src/features/users/components/UserTable.tsx
rf: RF-USERS-001
status: pending
- name: UserForm
file: apps/frontend/src/features/users/components/UserForm.tsx
rf: RF-USERS-001
status: pending
- name: ProfileForm
file: apps/frontend/src/features/users/components/ProfileForm.tsx
rf: RF-USERS-002
status: pending
- name: AvatarUpload
file: apps/frontend/src/features/users/components/AvatarUpload.tsx
rf: RF-USERS-002
status: pending
- name: PreferencesForm
file: apps/frontend/src/features/users/components/PreferencesForm.tsx
rf: RF-USERS-003
status: pending
- name: UserSearchInput
file: apps/frontend/src/features/users/components/UserSearchInput.tsx
rf: RF-USERS-005
status: pending
stores:
- name: usersStore
file: apps/frontend/src/features/users/stores/usersStore.ts
rf: [RF-USERS-001, RF-USERS-005]
status: pending
state:
- {name: users, type: "User[]"}
- {name: selectedUser, type: "User | null"}
- {name: isLoading, type: boolean}
- {name: pagination, type: PaginationState}
actions:
- fetchUsers
- createUser
- updateUser
- deleteUser
- searchUsers
api:
- name: usersApi
file: apps/frontend/src/features/users/api/usersApi.ts
status: pending
methods:
- {name: getUsers, endpoint: "GET /users"}
- {name: getUser, endpoint: "GET /users/:id"}
- {name: createUser, endpoint: "POST /users"}
- {name: updateUser, endpoint: "PATCH /users/:id"}
- {name: deleteUser, endpoint: "DELETE /users/:id"}
- {name: getProfile, endpoint: "GET /users/:id/profile"}
- {name: updateProfile, endpoint: "PATCH /users/:id/profile"}
- {name: getPreferences, endpoint: "GET /users/:id/preferences"}
- {name: updatePreferences, endpoint: "PATCH /users/:id/preferences"}
- {name: searchUsers, endpoint: "GET /users/search"}
# =============================================================================
# DEPENDENCIAS
# =============================================================================
dependencies:
depends_on:
- module: MGN-001
type: hard
reason: Usuarios requieren autenticacion
required_by:
- module: MGN-003
type: hard
reason: Roles se asignan a usuarios
- module: MGN-004
type: hard
reason: Usuarios pertenecen a tenants
- module: MGN-011
type: soft
reason: HR extiende usuarios como empleados
- module: MGN-019
type: soft
reason: Audit registra acciones de usuarios
# =============================================================================
# TESTS
# =============================================================================
tests:
unit:
- name: UsersService.spec.ts
file: apps/backend/src/modules/users/__tests__/users.service.spec.ts
status: pending
cases: 15
rf: [RF-USERS-001, RF-USERS-004, RF-USERS-005]
- name: ProfileService.spec.ts
file: apps/backend/src/modules/users/__tests__/profile.service.spec.ts
status: pending
cases: 6
rf: [RF-USERS-002]
integration:
- name: users.controller.e2e.spec.ts
file: apps/backend/test/users/users.controller.e2e.spec.ts
status: pending
cases: 14
frontend:
- name: UserForm.test.tsx
file: apps/frontend/src/features/users/__tests__/UserForm.test.tsx
status: pending
cases: 6
coverage:
target: 80%
current: 0%
# =============================================================================
# METRICAS
# =============================================================================
metrics:
story_points:
estimated: 35
actual: null
files:
database: 4
backend: 15
frontend: 12
tests: 6
total: 37
# =============================================================================
# HISTORIAL
# =============================================================================
history:
- date: "2025-12-05"
action: "Creacion de TRACEABILITY.yml"
author: Requirements-Analyst