- Configure workspace Git repository with comprehensive .gitignore - Add Odoo as submodule for ERP reference code - Include documentation: SETUP.md, GIT-STRUCTURE.md - Add gitignore templates for projects (backend, frontend, database) - Structure supports independent repos per project/subproject level Workspace includes: - core/ - Reusable patterns, modules, orchestration system - projects/ - Active projects (erp-suite, gamilit, trading-platform, etc.) - knowledge-base/ - Reference code and patterns (includes Odoo submodule) - devtools/ - Development tools and templates - customers/ - Client implementations template 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| 01-notification_templates.sql | ||
| README.md | ||
Notification Templates Seeds - Documentación
Fecha: 2025-11-13 Relacionado: DB-115 (Validación de alineación Database) Schema: notifications Feature: EXT-003 (Sistema Multi-Canal de Notificaciones)
📋 Descripción General
Este directorio contiene los seeds de producción para la tabla notifications.notification_templates, que almacena plantillas reutilizables para el sistema multi-canal de notificaciones de Gamilit.
Archivo principal: 01-notification_templates.sql
Templates incluidos: 8 plantillas de producción
🎯 Propósito
Las plantillas de notificación permiten:
- Consistencia: Mensajes uniformes en toda la plataforma
- Mantenibilidad: Actualizar mensajes sin modificar código
- Multi-idioma: Preparado para internacionalización futura
- Multi-canal: Soporte para email, push, in-app simultáneamente
- Variables dinámicas: Interpolación de datos personalizados
📬 Templates Disponibles
1. welcome_email - Bienvenida al Usuario
Propósito: Mensaje de bienvenida para usuarios nuevos
Canales: Email únicamente
Variables:
user_name: Nombre completo del usuariouser_email: Correo electrónico del usuario
Uso recomendado: Enviar tras registro exitoso o activación de cuenta
Ejemplo de uso:
await notificationService.send({
templateKey: 'welcome_email',
userId: newUser.id,
variables: {
user_name: 'María García',
user_email: 'maria@example.com'
}
});
2. new_assignment - Nueva Asignación
Propósito: Notificar asignación creada por profesor
Canales: Email, Push, In-app (multi-canal)
Variables:
student_name: Nombre del estudianteteacher_name: Nombre del profesorassignment_title: Título de la asignaciónassignment_description: Descripción brevedue_date: Fecha de entrega (formato ISO o localizado)module_name: Nombre del módulo educativoassignment_url: URL directa a la asignación
Uso recomendado: Enviar inmediatamente después de que profesor crea asignación
Ejemplo de uso:
await notificationService.sendToMultipleUsers({
templateKey: 'new_assignment',
userIds: assignedStudentIds,
variables: {
student_name: '{{user.name}}', // interpolado por usuario
teacher_name: 'Prof. Juan Pérez',
assignment_title: 'Módulo 3: Análisis de Sesgos',
assignment_description: 'Completar ejercicios 1-5 sobre identificación de sesgos cognitivos',
due_date: '2025-11-20',
module_name: 'Pensamiento Crítico',
assignment_url: 'https://gamilit.com/student/assignments/abc123'
}
});
3. assignment_reminder - Recordatorio de Asignación
Propósito: Recordar asignación próxima a vencer
Canales: Email, Push (alto impacto)
Variables:
student_name: Nombre del estudianteassignment_title: Título de la asignaciónhours_remaining: Horas restantes (ej: "24", "12", "3")due_date: Fecha de entregacompletion_status: Estado (ej: "0/5 ejercicios", "50% completado")assignment_url: URL directa
Uso recomendado: Sistema de cron jobs que verifica asignaciones a 24h, 12h, 3h de vencimiento
Ejemplo de uso:
await notificationService.send({
templateKey: 'assignment_reminder',
userId: student.id,
variables: {
student_name: 'Carlos Ruiz',
assignment_title: 'Módulo 3: Análisis de Sesgos',
hours_remaining: '12',
due_date: '2025-11-20 23:59',
completion_status: '3/5 ejercicios completados',
assignment_url: 'https://gamilit.com/student/assignments/abc123'
}
});
4. achievement_unlocked - Logro Desbloqueado
Propósito: Celebrar logro conseguido por estudiante
Canales: In-app, Push (gamificación)
Variables:
student_name: Nombre del estudianteachievement_name: Nombre del logro (ej: "Primera Racha de 7 Días")achievement_description: Descripción del logroachievement_icon: Emoji o código de íconoml_coins_earned: Cantidad de ML Coins ganados
Uso recomendado: Enviar inmediatamente cuando trigger de achievement se dispara
Ejemplo de uso:
await notificationService.send({
templateKey: 'achievement_unlocked',
userId: student.id,
variables: {
student_name: 'Ana Torres',
achievement_name: 'Maestro del Pensamiento Crítico',
achievement_description: 'Completaste todos los ejercicios del Módulo 3 con puntaje perfecto',
achievement_icon: '🏆',
ml_coins_earned: '500'
}
});
5. teacher_message - Mensaje del Profesor
Propósito: Mensaje directo de profesor a estudiante
Canales: Email, In-app
Variables:
student_name: Nombre del estudianteteacher_name: Nombre del profesormessage_subject: Asunto del mensajemessage_body: Cuerpo del mensaje (puede incluir HTML simple)reply_url: URL para responder
Uso recomendado: Cuando profesor envía mensaje directo desde plataforma
6. team_invitation - Invitación a Equipo
Propósito: Invitar estudiante a unirse a equipo/grupo
Canales: Email, In-app, Push
Variables:
student_name: Nombre del estudiante invitadoteam_name: Nombre del equipoinviter_name: Nombre de quien invitateam_description: Descripción del equipoinvitation_url: URL para aceptar/rechazar
Uso recomendado: Cuando estudiante es invitado a equipo colaborativo
7. exercise_feedback - Retroalimentación de Ejercicio
Propósito: Notificar que profesor calificó ejercicio
Canales: Email, In-app
Variables:
student_name: Nombre del estudianteexercise_title: Título del ejercicioteacher_name: Nombre del profesorscore: Puntaje obtenido (ej: "85/100")feedback_text: Comentarios del profesorsubmission_url: URL para ver detalles
Uso recomendado: Enviar cuando profesor termina de calificar
8. streak_milestone - Hito de Racha
Propósito: Celebrar racha de días consecutivos
Canales: In-app, Push (gamificación)
Variables:
student_name: Nombre del estudiantestreak_days: Número de días consecutivos (ej: "7", "30", "100")streak_emoji: Emoji representativobonus_coins: ML Coins de bonificaciónnext_milestone: Próximo hito (ej: "30 días")
Uso recomendado: Sistema diario que verifica rachas y celebra hitos (7, 14, 30, 60, 100 días)
🔧 Estructura de Template
Cada template contiene los siguientes campos:
INSERT INTO notifications.notification_templates (
template_key, -- Identificador único (NO modificar)
name, -- Nombre descriptivo
description, -- Propósito del template
subject_template, -- Asunto (para email/in-app)
body_template, -- Versión texto plano
html_template, -- Versión HTML (para email)
variables, -- Array JSONB de variables requeridas
default_channels, -- Canales predeterminados: ['in_app', 'email', 'push']
is_active -- true/false (permite deshabilitar sin borrar)
) VALUES (...);
📐 Sistema de Variables
Sintaxis de Interpolación
Las variables se definen con doble llave: {{variable_name}}
Ejemplo:
Hola {{student_name}}, tu asignación "{{assignment_title}}" vence el {{due_date}}.
Variables Obligatorias vs Opcionales
- Obligatorias: Listadas en campo
variablesde cada template - Opcionales: Pueden incluirse en texto pero no son requeridas
- Validación: Backend debe validar que todas las variables obligatorias están presentes
Variables del Sistema (Auto-inyectadas)
El sistema automáticamente agrega:
{{system.date}}: Fecha actual{{system.time}}: Hora actual{{system.platform_url}}: URL base de la plataforma{{user.id}}: ID del usuario receptor (automático)
🎨 Personalización de Templates
Para Modificar un Template Existente
- NO modificar
template_key(es el identificador único) - Actualizar
body_templatey/ohtml_templatesegún necesidad - Si agregas variables nuevas, actualizar campo
variables - Ejecutar ALTER UPDATE en base de datos
Ejemplo:
UPDATE notifications.notification_templates
SET body_template = 'Nuevo texto con {{new_variable}}',
variables = variables || '["new_variable"]'::jsonb
WHERE template_key = 'welcome_email';
Para Agregar Nuevo Template
- Agregar INSERT en
01-notification_templates.sql - Documentar en este README
- Actualizar contador en comentario final del archivo SQL
- Re-ejecutar seeds en desarrollo para validar
🧪 Templates de Testing (DEV)
En ambiente de desarrollo, además de los 8 templates de producción, existen 3 templates adicionales para testing:
test_notification: Template simple para pruebas básicastest_all_variables: Template con máxima cantidad de variables (validación de interpolación)test_multichannel: Template para probar envío simultáneo por múltiples canales
Estos templates están definidos en apps/database/seeds/dev/notifications/01-notification_templates.sql
🔗 Integración con Backend
Uso desde NestJS
// apps/backend/src/modules/notifications/services/notification.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { NotificationTemplate } from '../entities/notification-template.entity';
@Injectable()
export class NotificationService {
async sendFromTemplate(
templateKey: string,
userId: string,
variables: Record<string, string>,
channels?: string[]
) {
// 1. Obtener template de BD
const template = await this.templatesRepo.findOne({
where: { templateKey, isActive: true }
});
// 2. Validar variables requeridas
this.validateVariables(template.variables, variables);
// 3. Interpolar variables en templates
const subject = this.interpolate(template.subjectTemplate, variables);
const body = this.interpolate(template.bodyTemplate, variables);
const html = this.interpolate(template.htmlTemplate, variables);
// 4. Usar canales del template o sobreescribir
const finalChannels = channels || template.defaultChannels;
// 5. Llamar a SQL function send_notification()
await this.db.query(`
SELECT notifications.send_notification(
$1::uuid, -- user_id
$2::text, -- title
$3::text, -- content
$4::text, -- notification_type
$5::text[] -- channels
)
`, [userId, subject, body, templateKey, finalChannels]);
}
}
📊 Estadísticas
| Métrica | Valor |
|---|---|
| Templates de producción | 8 |
| Templates de desarrollo | 3 |
| Total templates | 11 |
| Variables únicas | 28+ |
| Canales soportados | 3 (in_app, email, push) |
| Templates multi-canal | 3 |
| Templates solo email | 1 |
| Templates gamificación | 3 |
🔍 Relación con Otras Tablas
notification_templates (esta tabla)
↓ (es utilizada por)
notifications.notifications
→ Crea notificaciones usando template_key como referencia
→ Aplica variables específicas del contexto
→ Respeta default_channels del template (o sobreescribe)
📚 Referencias
- Schema completo:
apps/database/ddl/schemas/notifications/ - Funciones SQL:
send_notification(),get_user_preferences(),queue_batch_notifications() - Documentación EXT-003: Ver
orchestration/features/EXT-003/(si existe) - Backend entities:
apps/backend/src/modules/notifications/entities/(pendiente implementación)
⚠️ Estado Actual (2025-11-13)
Status de Implementación:
- ✅ Database (DDL): 100% implementado (6 tablas, 3 funciones)
- ✅ Seeds: 100% implementado (8 templates prod + 3 test)
- ⚠️ Backend: 0% implementado (GAP crítico - P0)
- ⚠️ Frontend: 0% implementado (depende de Backend)
Próximos pasos:
- Backend Agent debe implementar módulo completo (entities, services, controllers)
- Frontend Agent debe integrar consumo de API multi-canal
- Configurar proveedores externos (SendGrid para email, Firebase para push)
Ver: orchestration/database/DB-115/REPORTE-FINAL-ALINEACION.md para más detalles
Última actualización: 2025-11-13 Responsable: Database Agent Relacionado: DB-115 (Validación de alineación)