softseti-sale-calculator-library
Version:
Sales calculation engine by Softseti
78 lines (69 loc) • 1.93 kB
JavaScript
// src/rules/RuleManager.js
const BusinessRuleModel = require('../models/BusinessRuleModel');
/**
* Rule Manager for handling business rule execution
* @class RuleManager
*/
class RuleManager {
constructor() {
this.rulesByTrigger = new Map();
}
/**
* Load rules organized by trigger event
* @param {Object} rules - Rules indexed by trigger event
*/
loadRules(rules) {
this.rulesByTrigger.clear();
Object.entries(rules).forEach(([trigger, ruleList]) => {
const ruleModels = ruleList.map(rule => new BusinessRuleModel(rule));
this.rulesByTrigger.set(trigger, ruleModels);
});
}
/**
* Get rules for a specific trigger event
* @param {string} triggerEvent - Trigger event name
* @returns {Array<BusinessRuleModel>}
*/
getRulesForTrigger(triggerEvent) {
const rules = this.rulesByTrigger.get(triggerEvent) || [];
// Filter active and valid rules, then sort by execution_order (ascending)
return rules
.filter(rule => rule.isActive() && rule.isValid())
.sort((a, b) => (a.execution_order || 0) - (b.execution_order || 0));
}
/**
* Get all trigger events with rules
* @returns {Array<string>}
*/
getAvailableTriggers() {
return Array.from(this.rulesByTrigger.keys());
}
/**
* Clear all loaded rules
*/
clearRules() {
this.rulesByTrigger.clear();
}
/**
* Get statistics about loaded rules
* @returns {Object}
*/
getStats() {
const stats = {
totalRules: 0,
byTrigger: {},
activeRules: 0
};
this.rulesByTrigger.forEach((rules, trigger) => {
const activeRules = rules.filter(rule => rule.isActive());
stats.byTrigger[trigger] = {
total: rules.length,
active: activeRules.length
};
stats.totalRules += rules.length;
stats.activeRules += activeRules.length;
});
return stats;
}
}
module.exports = RuleManager;