UNPKG

softseti-sale-calculator-library

Version:

Sales calculation engine by Softseti

78 lines (69 loc) 1.93 kB
// 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;