// src/rules-engine/actions/score.action.ts import type { ActionHandler, ActionResult } from '../types/action.types'; import type { RuleAction, ScoreActionParams } from '../types/rule.types'; import { computeSlaMultiplier } from '../facts/call-facts.provider'; export class ScoreActionHandler implements ActionHandler { type = 'score'; async execute(action: RuleAction, context: Record): Promise { const params = action.params as ScoreActionParams; let score = params.weight; let slaApplied = false; let campaignApplied = false; if (params.slaMultiplier && context['call.slaElapsedPercent'] != null) { score *= computeSlaMultiplier(context['call.slaElapsedPercent']); slaApplied = true; } if (params.campaignMultiplier) { const campaignWeight = (context['_campaignWeight'] ?? 5) / 10; const sourceWeight = (context['_sourceWeight'] ?? 5) / 10; score *= campaignWeight * sourceWeight; campaignApplied = true; } return { success: true, data: { score, weight: params.weight, slaApplied, campaignApplied }, }; } }