514 lines
15 KiB
YAML
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
|