# TRACEABILITY.yml - MGN-008: Notifications # Matriz de trazabilidad: Documentacion -> Codigo # Ubicacion: docs/02-fase-core-business/MGN-008-notifications/implementacion/ epic_code: MGN-008 epic_name: Notifications phase: 2 phase_name: Core Business story_points: 25 status: rf_documented # ============================================================================= # DOCUMENTACION # ============================================================================= documentation: requirements: - id: RF-NOTIF-001 title: Notificaciones In-App file: ../requerimientos/RF-NOTIF-001.md priority: P0 story_points: 8 status: documented traces_to: tables: [notifications] services: [InAppService, NotificationsGateway] endpoints: [GET /api/v1/notifications, PUT /api/v1/notifications/:id/read] - id: RF-NOTIF-002 title: Notificaciones Email file: ../requerimientos/RF-NOTIF-002.md priority: P0 story_points: 8 status: documented traces_to: tables: [notification_templates, notification_queue, notification_logs] services: [EmailService, TemplateService] endpoints: [GET /api/v1/notifications/templates, POST /api/v1/notifications/templates] - id: RF-NOTIF-003 title: Notificaciones Push file: ../requerimientos/RF-NOTIF-003.md priority: P1 story_points: 5 status: documented traces_to: tables: [push_subscriptions, notification_queue] services: [PushService] endpoints: [POST /api/v1/notifications/push/subscribe, DELETE /api/v1/notifications/push/unsubscribe] - id: RF-NOTIF-004 title: Preferencias de Notificacion file: ../requerimientos/RF-NOTIF-004.md priority: P1 story_points: 5 status: documented traces_to: tables: [notification_preferences] services: [PreferencesService] endpoints: [GET /api/v1/notifications/preferences, PUT /api/v1/notifications/preferences] specifications: [] # Pendiente de documentacion user_stories: [] # Pendiente de documentacion # ============================================================================= # IMPLEMENTACION # ============================================================================= implementation: database: schema: core_notifications path: apps/database/ddl/schemas/core_notifications/ status: pending tables: - name: notifications file: apps/database/ddl/schemas/core_notifications/tables/notifications.sql status: pending requirement: RF-NOTIF-001 columns: - {name: id, type: UUID, pk: true} - {name: tenant_id, type: UUID, fk: tenants} - {name: user_id, type: UUID, fk: users} - {name: type, type: VARCHAR(50)} - {name: category, type: VARCHAR(50)} - {name: priority, type: VARCHAR(20)} - {name: title, type: VARCHAR(255)} - {name: message, type: TEXT} - {name: data, type: JSONB} - {name: action_url, type: VARCHAR(500)} - {name: is_read, type: BOOLEAN, default: false} - {name: read_at, type: TIMESTAMPTZ} - {name: expires_at, type: TIMESTAMPTZ} - {name: created_at, type: TIMESTAMPTZ} - name: notification_templates file: apps/database/ddl/schemas/core_notifications/tables/notification_templates.sql status: pending requirement: RF-NOTIF-002 columns: - {name: id, type: UUID, pk: true} - {name: tenant_id, type: UUID, fk: tenants, nullable: true} - {name: code, type: VARCHAR(100)} - {name: name, type: VARCHAR(255)} - {name: channel, type: VARCHAR(20)} - {name: locale, type: VARCHAR(10)} - {name: subject, type: VARCHAR(255)} - {name: body_html, type: TEXT} - {name: body_text, type: TEXT} - {name: variables, type: JSONB} - {name: is_system, type: BOOLEAN, default: false} - {name: is_active, type: BOOLEAN, default: true} - {name: created_at, type: TIMESTAMPTZ} - {name: updated_at, type: TIMESTAMPTZ} - name: notification_queue file: apps/database/ddl/schemas/core_notifications/tables/notification_queue.sql status: pending requirements: [RF-NOTIF-002, RF-NOTIF-003] columns: - {name: id, type: UUID, pk: true} - {name: tenant_id, type: UUID, fk: tenants} - {name: notification_id, type: UUID, fk: notifications} - {name: channel, type: VARCHAR(20)} - {name: recipient, type: VARCHAR(255)} - {name: payload, type: JSONB} - {name: status, type: VARCHAR(20)} - {name: attempts, type: INTEGER, default: 0} - {name: max_attempts, type: INTEGER, default: 3} - {name: scheduled_at, type: TIMESTAMPTZ} - {name: sent_at, type: TIMESTAMPTZ} - {name: error, type: TEXT} - {name: created_at, type: TIMESTAMPTZ} - name: push_subscriptions file: apps/database/ddl/schemas/core_notifications/tables/push_subscriptions.sql status: pending requirement: RF-NOTIF-003 columns: - {name: id, type: UUID, pk: true} - {name: user_id, type: UUID, fk: users} - {name: device_id, type: VARCHAR(255)} - {name: platform, type: VARCHAR(20)} - {name: endpoint, type: TEXT} - {name: keys, type: JSONB} - {name: is_active, type: BOOLEAN, default: true} - {name: last_used_at, type: TIMESTAMPTZ} - {name: created_at, type: TIMESTAMPTZ} - name: notification_preferences file: apps/database/ddl/schemas/core_notifications/tables/notification_preferences.sql status: pending requirement: RF-NOTIF-004 columns: - {name: id, type: UUID, pk: true} - {name: user_id, type: UUID, fk: users} - {name: notification_type, type: VARCHAR(50)} - {name: channel_inapp, type: BOOLEAN, default: true} - {name: channel_email, type: BOOLEAN, default: true} - {name: channel_push, type: BOOLEAN, default: true} - {name: quiet_hours_start, type: TIME} - {name: quiet_hours_end, type: TIME} - {name: digest_enabled, type: BOOLEAN, default: false} - {name: digest_frequency, type: VARCHAR(20)} - {name: created_at, type: TIMESTAMPTZ} - {name: updated_at, type: TIMESTAMPTZ} - name: notification_logs file: apps/database/ddl/schemas/core_notifications/tables/notification_logs.sql status: pending requirement: RF-NOTIF-002 columns: - {name: id, type: UUID, pk: true} - {name: queue_id, type: UUID, fk: notification_queue} - {name: event, type: VARCHAR(50)} - {name: metadata, type: JSONB} - {name: created_at, type: TIMESTAMPTZ} backend: module: notifications path: apps/backend/src/modules/notifications/ framework: NestJS status: pending entities: - name: Notification file: apps/backend/src/modules/notifications/entities/notification.entity.ts status: pending requirement: RF-NOTIF-001 - name: NotificationTemplate file: apps/backend/src/modules/notifications/entities/notification-template.entity.ts status: pending requirement: RF-NOTIF-002 - name: NotificationQueue file: apps/backend/src/modules/notifications/entities/notification-queue.entity.ts status: pending requirements: [RF-NOTIF-002, RF-NOTIF-003] - name: PushSubscription file: apps/backend/src/modules/notifications/entities/push-subscription.entity.ts status: pending requirement: RF-NOTIF-003 - name: NotificationPreference file: apps/backend/src/modules/notifications/entities/notification-preference.entity.ts status: pending requirement: RF-NOTIF-004 services: - name: NotificationsService file: apps/backend/src/modules/notifications/notifications.service.ts status: pending requirements: [RF-NOTIF-001, RF-NOTIF-002, RF-NOTIF-003] methods: - {name: send, description: Enviar notificacion} - {name: sendBulk, description: Enviar notificacion masiva} - {name: getUserNotifications, description: Obtener notificaciones de usuario} - name: InAppService file: apps/backend/src/modules/notifications/channels/in-app.service.ts status: pending requirement: RF-NOTIF-001 methods: - {name: create, description: Crear notificacion in-app} - {name: markAsRead, description: Marcar como leida} - {name: getUnreadCount, description: Obtener conteo de no leidas} - name: EmailService file: apps/backend/src/modules/notifications/channels/email.service.ts status: pending requirement: RF-NOTIF-002 methods: - {name: send, description: Enviar email} - {name: sendWithTemplate, description: Enviar con template} - {name: sendBulk, description: Enviar emails masivos} - name: PushService file: apps/backend/src/modules/notifications/channels/push.service.ts status: pending requirement: RF-NOTIF-003 methods: - {name: send, description: Enviar push notification} - {name: subscribe, description: Registrar suscripcion} - {name: unsubscribe, description: Eliminar suscripcion} - name: PreferencesService file: apps/backend/src/modules/notifications/preferences.service.ts status: pending requirement: RF-NOTIF-004 methods: - {name: getPreferences, description: Obtener preferencias} - {name: updatePreferences, description: Actualizar preferencias} - {name: shouldNotify, description: Verificar si debe notificar} gateways: - name: NotificationsGateway file: apps/backend/src/modules/notifications/notifications.gateway.ts status: pending requirement: RF-NOTIF-001 description: WebSocket gateway para notificaciones en tiempo real controllers: - name: NotificationsController file: apps/backend/src/modules/notifications/notifications.controller.ts status: pending endpoints: - method: GET path: /api/v1/notifications description: Listar notificaciones del usuario requirement: RF-NOTIF-001 - method: GET path: /api/v1/notifications/unread/count description: Obtener conteo de no leidas requirement: RF-NOTIF-001 - method: PUT path: /api/v1/notifications/:id/read description: Marcar como leida requirement: RF-NOTIF-001 - method: PUT path: /api/v1/notifications/read-all description: Marcar todas como leidas requirement: RF-NOTIF-001 - method: GET path: /api/v1/notifications/templates description: Listar templates requirement: RF-NOTIF-002 - method: POST path: /api/v1/notifications/templates description: Crear template requirement: RF-NOTIF-002 - method: POST path: /api/v1/notifications/push/subscribe description: Suscribir a push requirement: RF-NOTIF-003 - method: DELETE path: /api/v1/notifications/push/unsubscribe description: Desuscribir de push requirement: RF-NOTIF-003 - method: GET path: /api/v1/notifications/preferences description: Obtener preferencias requirement: RF-NOTIF-004 - method: PUT path: /api/v1/notifications/preferences description: Actualizar preferencias requirement: RF-NOTIF-004 # ============================================================================= # DEPENDENCIAS # ============================================================================= dependencies: depends_on: - module: MGN-001 type: hard reason: Autenticacion requerida - module: MGN-002 type: hard reason: Referencia a usuarios - module: MGN-004 type: hard reason: Aislamiento por tenant - module: MGN-006 type: soft reason: Configuracion de canales required_by: - module: BUSINESS_MODULES type: soft reason: Modulos de negocio envian notificaciones # ============================================================================= # METRICAS # ============================================================================= metrics: story_points: estimated: 25 actual: null documentation: requirements: 4 specifications: 0 user_stories: 0 files: database: 6 backend: 12 frontend: 5 total: 23 # ============================================================================= # HISTORIAL # ============================================================================= history: - date: "2025-12-05" action: "Creacion de estructura GAMILIT" author: Requirements-Analyst changes: - "Creacion de TRACEABILITY.yml" - "Definicion de estructura base" - date: "2025-12-05" action: "Documentacion de RF" author: Requirements-Analyst changes: - "RF-NOTIF-001: Notificaciones In-App" - "RF-NOTIF-002: Notificaciones Email" - "RF-NOTIF-003: Notificaciones Push" - "RF-NOTIF-004: Preferencias de Notificacion" - "Actualizacion de trazabilidad RF -> implementacion"