Arquitectura de Gamificación
Arquitectura técnica del sistema de misiones, motor de XP, cálculo de tablas de clasificación e integración con la pista de auditoría.
Última actualización: 2025-02-18
Arquitectura de Gamificación
El sistema de gamificación está construido como una capa sobre el registro de auditoría event-sourced. Las recompensas de XP se derivan de eventos operacionales, asegurando que las mecánicas de juego nunca entren en conflicto con los requisitos de cumplimiento.
Arquitectura del Sistema
Motor de Reglas de XP
El motor de reglas mapea eventos operacionales a recompensas de XP:
<Card className="w-80"> <CardHeader className="pb-2"> <CardTitle className="text-sm">Configuración de Reglas XP</CardTitle> <CardDescription>Puntos otorgados por acción</CardDescription> </CardHeader> <CardContent className="space-y-2"> <div className="flex items-center justify-between text-xs p-2 rounded bg-muted"> <span>Colocación con evidencia completa</span> <Badge variant="outline">100 XP</Badge> </div> <div className="flex items-center justify-between text-xs p-2 rounded"> <span>Verificación de supervisor</span> <Badge variant="outline">50 XP</Badge> </div> <div className="flex items-center justify-between text-xs p-2 rounded bg-muted"> <span>Avance de etapa</span> <Badge variant="outline">75 XP</Badge> </div> <div className="flex items-center justify-between text-xs p-2 rounded"> <span>Completado antes de tiempo</span> <Badge variant="outline">25 XP bonus</Badge> </div> <div className="flex items-center justify-between text-xs p-2 rounded bg-muted"> <span>Auditoría perfecta (sin disputas)</span> <Badge variant="outline">500 XP</Badge> </div> </CardContent> </Card>
Pipeline de Procesamiento de Reglas
interface XPRule {
eventType: EventType;
condition?: (event: Event) => boolean;
baseXP: number;
multipliers?: XPMultiplier[];
}
// Example rule: placement with photo evidence
const placementRule: XPRule = {
eventType: 'PLACED',
condition: (e) => !!e.photo_url && !!e.scale_weight_kg,
baseXP: 100,
multipliers: [
{ type: 'streak', factor: (streak) => 1 + streak * 0.1 },
{ type: 'time', factor: (elapsed) => elapsed < 120 ? 1.25 : 1.0 },
],
};
Sistema de Misiones
Las misiones son configuradas por administradores y rastreadas en tiempo real:
Tipos de Misiones
| Tipo | Duración | Alcance | Ejemplo |
|---|---|---|---|
| Diaria | 24 horas | Individual | Procesar 20 unidades |
| Semanal | 7 días | Individual | Semana sin incidentes |
| Equipo | Variable | Equipo | Procesar 500 unidades como equipo |
| Desafío | Personalizado | Instalación | Mayor rendimiento este mes |
| Logro | Permanente | Individual | 1,000 colocaciones de por vida |
Modelo de Datos de Misiones
interface Quest {
id: string;
title: string;
description: string;
type: 'daily' | 'weekly' | 'team' | 'challenge' | 'achievement';
criteria: QuestCriteria[];
xpReward: number;
badgeReward?: string;
deadline?: Date;
assignedTo: string[]; // operator IDs or 'all'
}
interface QuestCriteria {
metric: string; // e.g., 'placements_count', 'incidents_zero'
target: number;
current: number; // derived from events
}
Arquitectura de Tablas de Clasificación
Las tablas de clasificación se computan desde el registro de eventos XP usando agregaciones materializadas:
| Tabla | Período de Reinicio | Alcance | Métrica de Ranking |
|---|---|---|---|
| Diaria | Cada 24h | Instalación | XP ganado hoy |
| Semanal | Cada lunes | Instalación | XP ganado esta semana |
| Mensual | 1ro del mes | Organización | XP ganado este mes |
| Todo el tiempo | Nunca | Organización | XP total de por vida |
Cómputo
-- Weekly leaderboard (cached, refreshed every 5 minutes)
SELECT
operator_id,
SUM(xp_amount) as weekly_xp,
COUNT(*) as actions,
RANK() OVER (ORDER BY SUM(xp_amount) DESC) as rank
FROM xp_events
WHERE created_at >= date_trunc('week', NOW())
GROUP BY operator_id
ORDER BY weekly_xp DESC
LIMIT 50;
Progresión de Nivel
| Nivel | XP Requerido | Título | Beneficios |
|---|---|---|---|
| 1-5 | 0-2,500 | Novato | Misiones básicas |
| 6-10 | 2,500-10,000 | Hábil | Misiones avanzadas |
| 11-15 | 10,000-25,000 | Experto | Misiones de equipo |
| 16-20 | 25,000-50,000 | Maestro | Creación de desafíos |
| 21+ | 50,000+ | Leyenda | Todas las funciones |
Integración con Auditoría
Seguro para Cumplimiento
Cada recompensa de XP, completación de misión y cambio en la tabla de clasificación se registra en la misma pista de auditoría inmutable que los eventos operacionales. La gamificación nunca compromete la integridad de la auditoría.
La capa de gamificación produce sus propios eventos de auditoría:
// Gamification events in the audit trail
{
type: 'GAMIFICATION',
subtype: 'XP_AWARDED',
operator: 'op-123',
data: {
amount: 100,
source: 'placement',
sourceEventId: 'evt-456',
questId: 'quest-789',
multiplier: 1.5,
streakDays: 15
},
hash: 'sha256:...',
timestamp: '2025-01-15T14:32:07Z'
}
Componentes
| Componente | Ruta | Descripción |
|---|---|---|
GamificationHeader | @/components/whms/GamificationHeader | Barra de XP persistente |
QuestCard | @/components/whms/QuestCard | Tarjeta de progreso de misión |
QuestsTab | @/components/whms/QuestsTab | Vista de lista de misiones |
QuestCreator | @/components/whms/QuestCreator | Constructor de misiones para admin |
MissionCard | @/components/whms/MissionCard | Tarjeta de misión de equipo |
MissionsTab | @/components/whms/MissionsTab | Misiones en el mapa |
AdminGameSetup | @/components/whms/admin/AdminGameSetup | Configuración del juego |