/** * Minimum NTE floor when a new Webex WO space is opened (first webhook). * Pure logic — no ServiceChannel client import (safe for unit tests). */ function parseNumberEnv(name, fallback) { const raw = process.env[name]; if (raw == null || raw === '') return fallback; const n = Number(raw); return Number.isFinite(n) ? n : fallback; } /** Minimum NTE applied on new space open; 0 disables the feature. */ export function getWoOpenMinNte() { return parseNumberEnv('SC_WO_OPEN_MIN_NTE', 400); } export function createWorkOrderNteService({ getWorkOrderForNte: getWo, updateWorkOrderNte: updateNte, } = {}) { if (typeof getWo !== 'function' || typeof updateNte !== 'function') { throw new Error('createWorkOrderNteService requires getWorkOrderForNte and updateWorkOrderNte'); } async function ensureWorkOrderMinimumNte(woId, { minNte = 400, hintNte = null } = {}) { if (!woId || minNte <= 0) return { updated: false, skipped: true }; let current = hintNte != null ? Number(hintNte) : NaN; if (!Number.isFinite(current)) { const wo = await getWo(woId); current = Number(wo?.Nte); } if (!Number.isFinite(current) || current >= minNte) { return { updated: false, nte: current }; } await updateNte(woId, minNte); return { updated: true, previousNte: current, nte: minNte }; } return { ensureWorkOrderMinimumNte }; }