@org-design-studio/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +108 -0
- package/dist-core/core.d.mts +642 -0
- package/dist-core/core.d.ts +642 -0
- package/dist-core/core.js +2323 -0
- package/dist-core/core.js.map +1 -0
- package/dist-core/core.mjs +2280 -0
- package/dist-core/core.mjs.map +1 -0
- package/docs/API.md +202 -0
- package/package.json +36 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/types.ts","../src/lib/hierarchy.ts","../src/lib/utils.ts","../src/lib/analytics.ts","../src/lib/validation.ts","../src/lib/scenario.ts","../src/lib/insights.ts","../src/lib/org-layout.ts","../src/lib/demo-data.ts","../src/lib/hris-templates.ts"],"names":["tree","name","hierarchy","seq"],"mappings":"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","file":"core.js","sourcesContent":["/**\n * ORG DESIGN STUDIO — Core data model.\n *\n * All workforce data is processed client-side. The Employee record mirrors the\n * upload template; optional fields degrade gracefully throughout analytics.\n */\n\n/**\n * Seat occupancy of a position record. Absent = \"filled\" — every record\n * persisted or imported before this field existed represents a person in a\n * seat. \"vacant\" = budgeted seat, currently unoccupied (open requisition);\n * \"tbh\" = planned/to-be-hired seat (e.g. created in a scenario). For\n * vacant/TBH seats, total_cost carries the BUDGETED cost of the seat.\n */\nexport type PositionStatus = \"filled\" | \"vacant\" | \"tbh\";\n\n/**\n * Resolve a record's seat status, guarding legacy/malformed data: anything\n * other than an explicit \"vacant\"/\"tbh\" reads as \"filled\".\n */\nexport function positionStatus(e: Pick<Employee, \"position_status\">): PositionStatus {\n return e.position_status === \"vacant\" || e.position_status === \"tbh\"\n ? e.position_status\n : \"filled\";\n}\n\nexport interface Employee {\n employee_id: string;\n employee_name: string;\n role_title: string;\n manager_id: string | null; // null = root (CEO)\n manager_name?: string;\n department: string;\n function: string;\n business_unit: string;\n location: string;\n country: string;\n grade: string;\n level: number; // numeric seniority level, 1 = most senior\n employment_type: string;\n fte: number;\n salary: number;\n bonus: number;\n total_cost: number;\n status: string;\n // Optional fields\n /** Seat occupancy — absent = filled. Read via positionStatus(), never directly. */\n position_status?: PositionStatus;\n tenure?: number;\n gender?: string;\n age_band?: string;\n performance_rating?: string;\n potential_rating?: string;\n critical_role?: boolean;\n role_family?: string;\n role_type?: string;\n cost_center?: string;\n legal_entity?: string;\n contract_type?: string;\n remote_status?: string;\n skills?: string;\n succession_risk?: string;\n attrition_risk?: string;\n change_impact?: string;\n comments?: string;\n}\n\n/** Derived, computed per-employee attributes (never stored, always recomputed). */\nexport interface EmployeeNode {\n employee: Employee;\n layer: number; // 1 = CEO/root\n directReports: string[]; // employee_ids\n span: number; // direct report count — ALL seats (designed structure)\n filledSpan: number; // direct reports whose seats are filled (operating reality)\n downstreamHeadcount: number; // all reports below (excl. self)\n downstreamCost: number; // total_cost of all reports below (excl. self)\n isManager: boolean;\n isManagerOfOne: boolean; // span === 1\n managesOnlyManagers: boolean; // span > 0 and every direct report is itself a manager\n managerChain: string[]; // ids from root → this employee's manager\n}\n\nexport interface OrgTree {\n nodes: Map<string, EmployeeNode>;\n roots: string[]; // employee_ids with no manager\n maxLayer: number;\n orphans: string[]; // manager_id refers to missing employee\n circular: string[]; // employees in circular reporting chains\n}\n\n// ---------------------------------------------------------------------------\n// Assumptions / settings\n// ---------------------------------------------------------------------------\n\nexport interface SpanTargetByLevel {\n level: number;\n label: string;\n min: number;\n max: number;\n}\n\n/**\n * Transition / one-time cost model for restructuring scenarios.\n * Used to net year-1 savings against the cost of executing the change.\n */\nexport interface TransitionAssumptions {\n // Severance entitlement (in months of total annualized cost) by seniority band.\n // Entries are matched by largest maxLevel >= employee level (most senior first).\n severanceMonthsByLevel: { maxLevel: number; months: number }[];\n backfillPct: number; // % of removed-role cost incurred as hiring/ramp drag (annualized)\n oneTimeChangeCostPerMove: number; // flat one-time cost per employee moved\n // Month (1–12) in which the restructure takes effect. Year 1 captures\n // (12 − effectiveMonth + 1)/12 of the run-rate saving. May be absent in\n // persisted assumptions from older versions — consumers must guard with `?? 4`.\n effectiveMonth: number;\n // Multiplier applied to severance months by employee country (e.g.\n // { Germany: 1.5 }). Unknown country → 1. May be absent in persisted\n // assumptions from older versions — consumers must guard with `?? {}`.\n countrySeveranceMultipliers: Record<string, number>;\n}\n\n/** Month labels for the transition effective-month control (1-indexed). */\nexport const MONTH_NAMES = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n] as const;\n\n/**\n * Default seniority-noise tokens stripped from role titles before duplication\n * grouping. Deliberately excludes \"assistant\" / \"lead\" / \"associate\" — those\n * usually denote genuinely different jobs (\"Assistant Manager\" ≠ \"Manager\").\n */\nexport const DEFAULT_TITLE_NOISE_WORDS: string[] = [\n \"senior\",\n \"sr\",\n \"jr\",\n \"junior\",\n \"principal\",\n \"i\",\n \"ii\",\n \"iii\",\n \"iv\",\n \"v\",\n \"1\",\n \"2\",\n \"3\",\n];\n\nexport interface Assumptions {\n narrowSpanThreshold: number; // below this = narrow\n wideSpanThreshold: number; // above this = overloaded\n targetSpansByLevel: SpanTargetByLevel[];\n targetMaxLayers: number;\n delayeringSavingPct: number; // % of narrow-span manager cost counted as indicative opportunity\n duplicateRoleSavingPct: number; // % of duplicate role cost counted as indicative opportunity\n // % management premium counted for span-1–2 managers who could be ICs.\n // May be absent in persisted assumptions from older versions — consumers\n // must guard with `?? 20` at point of use.\n spanOptPremiumPct: number;\n locationCostMultipliers: Record<string, number>; // e.g. { \"Mumbai\": 0.45 }\n currency: string; // e.g. \"USD\"\n currencySymbol: string;\n scoringWeights: ScenarioScoringWeights;\n benchmarkLayersForSize: { maxHeadcount: number; layers: number }[];\n transitionAssumptions: TransitionAssumptions;\n // Optional explicit AI-augmentation potential per role family (\"high\"|\"medium\"|\"low\").\n // When a role's family is absent or unmapped, analytics falls back to a title heuristic.\n aiAugmentationByRoleFamily: Record<string, \"high\" | \"medium\" | \"low\">;\n // Seniority-noise tokens stripped during title normalization for duplication\n // analysis. May be absent in persisted assumptions from older versions —\n // consumers must fall back to DEFAULT_TITLE_NOISE_WORDS.\n titleNoiseWords: string[];\n // Total cost above which a role gets the \"High cost\" flag in the UI.\n // May be absent in persisted assumptions — consumers must guard with `?? 400000`.\n highCostThreshold: number;\n}\n\nexport interface ScenarioScoringWeights {\n financialImpact: number;\n spanImprovement: number;\n layerReduction: number;\n complexityReduction: number;\n changeRisk: number; // weight of (inverse) risk\n implementationEase: number;\n}\n\nexport const DEFAULT_ASSUMPTIONS: Assumptions = {\n narrowSpanThreshold: 4,\n wideSpanThreshold: 12,\n targetSpansByLevel: [\n { level: 1, label: \"Executive (L1–L2)\", min: 5, max: 8 },\n { level: 3, label: \"Middle management (L3–L4)\", min: 6, max: 10 },\n { level: 5, label: \"Frontline management (L5+)\", min: 8, max: 15 },\n ],\n targetMaxLayers: 7,\n delayeringSavingPct: 50,\n duplicateRoleSavingPct: 30,\n spanOptPremiumPct: 20,\n locationCostMultipliers: {\n \"New York\": 1.0,\n London: 0.95,\n Singapore: 0.85,\n Dublin: 0.8,\n Warsaw: 0.45,\n Bangalore: 0.35,\n Manila: 0.3,\n },\n currency: \"USD\",\n currencySymbol: \"$\",\n scoringWeights: {\n financialImpact: 25,\n spanImprovement: 15,\n layerReduction: 15,\n complexityReduction: 15,\n changeRisk: 20,\n implementationEase: 10,\n },\n benchmarkLayersForSize: [\n { maxHeadcount: 100, layers: 4 },\n { maxHeadcount: 500, layers: 6 },\n { maxHeadcount: 2000, layers: 7 },\n { maxHeadcount: 10000, layers: 8 },\n ],\n transitionAssumptions: {\n severanceMonthsByLevel: [\n { maxLevel: 2, months: 12 },\n { maxLevel: 4, months: 9 },\n { maxLevel: 99, months: 6 },\n ],\n backfillPct: 20,\n oneTimeChangeCostPerMove: 2000,\n effectiveMonth: 4,\n countrySeveranceMultipliers: {},\n },\n aiAugmentationByRoleFamily: {},\n titleNoiseWords: [...DEFAULT_TITLE_NOISE_WORDS],\n highCostThreshold: 400000,\n};\n\n/**\n * Normalize assumptions from untrusted/legacy sources (old persisted state,\n * imported workspace files). Backfills every missing field — including nested\n * objects added in later versions — from DEFAULT_ASSUMPTIONS so downstream\n * analytics can dereference nested assumptions unguarded.\n */\nexport function normalizeAssumptions(input: unknown): Assumptions {\n const d = DEFAULT_ASSUMPTIONS;\n if (!input || typeof input !== \"object\") return structuredCloneSafe(d);\n const a = input as Partial<Assumptions>;\n const num = (v: unknown, fallback: number) =>\n typeof v === \"number\" && isFinite(v) ? v : fallback;\n const str = (v: unknown, fallback: string) => (typeof v === \"string\" && v ? v : fallback);\n const rec = (v: unknown, fallback: Record<string, number>) =>\n v && typeof v === \"object\" && !Array.isArray(v) ? (v as Record<string, number>) : fallback;\n const t = (a.transitionAssumptions ?? {}) as Partial<Assumptions[\"transitionAssumptions\"]>;\n const w = (a.scoringWeights ?? {}) as Partial<ScenarioScoringWeights>;\n return {\n narrowSpanThreshold: num(a.narrowSpanThreshold, d.narrowSpanThreshold),\n wideSpanThreshold: num(a.wideSpanThreshold, d.wideSpanThreshold),\n targetSpansByLevel: Array.isArray(a.targetSpansByLevel) && a.targetSpansByLevel.length > 0\n ? a.targetSpansByLevel\n : structuredCloneSafe(d.targetSpansByLevel),\n targetMaxLayers: num(a.targetMaxLayers, d.targetMaxLayers),\n delayeringSavingPct: num(a.delayeringSavingPct, d.delayeringSavingPct),\n duplicateRoleSavingPct: num(a.duplicateRoleSavingPct, d.duplicateRoleSavingPct),\n spanOptPremiumPct: num(a.spanOptPremiumPct, d.spanOptPremiumPct),\n locationCostMultipliers: rec(a.locationCostMultipliers, structuredCloneSafe(d.locationCostMultipliers)),\n currency: str(a.currency, d.currency),\n currencySymbol: str(a.currencySymbol, d.currencySymbol),\n scoringWeights: {\n financialImpact: num(w.financialImpact, d.scoringWeights.financialImpact),\n spanImprovement: num(w.spanImprovement, d.scoringWeights.spanImprovement),\n layerReduction: num(w.layerReduction, d.scoringWeights.layerReduction),\n complexityReduction: num(w.complexityReduction, d.scoringWeights.complexityReduction),\n changeRisk: num(w.changeRisk, d.scoringWeights.changeRisk),\n implementationEase: num(w.implementationEase, d.scoringWeights.implementationEase),\n },\n benchmarkLayersForSize: Array.isArray(a.benchmarkLayersForSize) && a.benchmarkLayersForSize.length > 0\n ? a.benchmarkLayersForSize\n : structuredCloneSafe(d.benchmarkLayersForSize),\n transitionAssumptions: {\n severanceMonthsByLevel: Array.isArray(t.severanceMonthsByLevel) && t.severanceMonthsByLevel.length > 0\n ? t.severanceMonthsByLevel\n : structuredCloneSafe(d.transitionAssumptions.severanceMonthsByLevel),\n backfillPct: num(t.backfillPct, d.transitionAssumptions.backfillPct),\n oneTimeChangeCostPerMove: num(t.oneTimeChangeCostPerMove, d.transitionAssumptions.oneTimeChangeCostPerMove),\n effectiveMonth: num(t.effectiveMonth, d.transitionAssumptions.effectiveMonth),\n countrySeveranceMultipliers: rec(t.countrySeveranceMultipliers, {}),\n },\n aiAugmentationByRoleFamily:\n a.aiAugmentationByRoleFamily && typeof a.aiAugmentationByRoleFamily === \"object\" && !Array.isArray(a.aiAugmentationByRoleFamily)\n ? a.aiAugmentationByRoleFamily\n : {},\n titleNoiseWords: Array.isArray(a.titleNoiseWords) ? a.titleNoiseWords : [...DEFAULT_TITLE_NOISE_WORDS],\n highCostThreshold: num(a.highCostThreshold, d.highCostThreshold),\n };\n}\n\n/** structuredClone with a JSON fallback for older runtimes. */\nfunction structuredCloneSafe<T>(v: T): T {\n return typeof structuredClone === \"function\" ? structuredClone(v) : (JSON.parse(JSON.stringify(v)) as T);\n}\n\n// ---------------------------------------------------------------------------\n// Data quality\n// ---------------------------------------------------------------------------\n\nexport type IssueSeverity = \"critical\" | \"warning\" | \"info\";\n\nexport interface DataQualityIssue {\n id: string;\n severity: IssueSeverity;\n category: string;\n message: string;\n employeeIds: string[];\n}\n\nexport interface DataQualityReport {\n score: number; // 0–100\n band: \"Strong\" | \"Usable\" | \"Needs cleanup\" | \"Poor\";\n issues: DataQualityIssue[];\n counts: { critical: number; warning: number; info: number };\n}\n\n// ---------------------------------------------------------------------------\n// Scenarios\n// ---------------------------------------------------------------------------\n\nexport type ScenarioChange =\n | {\n type: \"move\";\n // Move an employee (and their whole subtree) to a new manager\n employeeId: string;\n newManagerId: string;\n description: string;\n }\n | {\n type: \"remove_role\";\n employeeId: string;\n // What to do with direct reports:\n reportsTo: \"managers_manager\" | \"specific\" | \"orphan\";\n newManagerId?: string;\n description: string;\n }\n | {\n type: \"add_role\";\n employee: Employee;\n description: string;\n }\n | {\n type: \"merge_teams\";\n sourceManagerId: string; // manager whose team is absorbed (role removed)\n targetManagerId: string;\n description: string;\n }\n | {\n type: \"delayer\";\n // Remove all managers at a given layer within scope; reports move up\n layer: number;\n scope: { field: \"function\" | \"business_unit\" | \"all\"; value?: string };\n description: string;\n }\n | {\n type: \"location_shift\";\n employeeIds: string[];\n targetLocation: string;\n costMultiplier: number;\n description: string;\n }\n | {\n type: \"cost_change\";\n employeeId: string;\n newTotalCost: number;\n description: string;\n }\n | {\n type: \"fill_role\";\n // Fill a vacant/TBH seat: flips position_status to \"filled\" and names\n // the occupant. Skipped with a warning when the seat is already filled.\n employeeId: string;\n employeeName: string;\n description: string;\n };\n\nexport interface ChangeLogEntry {\n id: string;\n timestamp: string;\n change: ScenarioChange;\n affectedCount: number;\n costBefore: number;\n costAfter: number;\n headcountBefore: number;\n headcountAfter: number;\n layersBefore: number;\n layersAfter: number;\n}\n\nexport interface Scenario {\n id: string;\n name: string;\n description: string;\n owner: string;\n createdAt: string;\n changes: ScenarioChange[];\n changeLog: ChangeLogEntry[];\n commentary: string;\n}\n\n// ---------------------------------------------------------------------------\n// Metrics\n// ---------------------------------------------------------------------------\n\nexport interface SpanBucket {\n label: string;\n min: number;\n max: number; // inclusive; Infinity for last bucket\n count: number;\n managerIds: string[];\n}\n\nexport interface LayerStat {\n layer: number;\n headcount: number;\n managers: number;\n ics: number;\n cost: number;\n managementCost: number; // cost of managers at this layer\n avgSpan: number;\n medianSpan: number;\n unfilledSeats: number; // vacant + TBH seats at this layer\n}\n\nexport interface OrgMetrics {\n headcount: number; // ALL seats (designed structure), incl. vacant/TBH\n totalFte: number;\n totalCost: number; // fully-loaded designed cost — every seat's (budgeted) cost\n // ---- position-vs-person split (all degenerate to the designed numbers\n // when the dataset carries no vacant/TBH seats) ----\n filledHeadcount: number; // seats with a person in them\n vacantSeats: number;\n tbhSeats: number;\n unfilledSeats: number; // vacant + tbh\n vacancyRate: number; // unfilled / total seats (0-guarded)\n runRateCost: number; // cost of FILLED seats only — what payroll runs today\n unfilledSeatCost: number; // budgeted cost of unfilled seats = totalCost − runRateCost\n avgFilledSpan: number; // avg filled span across the designed-manager population\n medianFilledSpan: number;\n unfilledByFunction: Record<string, number>; // unfilled seat count per function\n unfilledByLayer: Record<number, number>; // unfilled seat count per layer\n managerCount: number;\n icCount: number;\n managerRatio: number; // managers / headcount\n managementCost: number;\n icCost: number;\n managementCostRatio: number; // manager cost / total cost\n maxLayers: number;\n avgSpan: number;\n medianSpan: number;\n narrowSpanManagers: string[];\n wideSpanManagers: string[];\n narrowSpanPct: number; // of managers\n wideSpanPct: number;\n narrowSpanCost: number;\n spanBuckets: SpanBucket[];\n layerStats: LayerStat[];\n costByFunction: Record<string, number>;\n headcountByFunction: Record<string, number>;\n layersByFunction: Record<string, number>;\n avgSpanByFunction: Record<string, number>;\n costByBU: Record<string, number>;\n headcountByBU: Record<string, number>;\n layersByBU: Record<string, number>;\n costByLocation: Record<string, number>;\n headcountByLocation: Record<string, number>;\n costByGrade: Record<string, number>;\n headcountByGrade: Record<string, number>;\n costByLayer: Record<number, number>;\n managementCostByLayer: Record<number, number>; // manager cost at each layer\n layerTaxPerIC: number; // total management cost ÷ IC count (0-guarded)\n managerOfOneCount: number; // managers with exactly one direct report\n managerOfManagersCount: number; // managers whose every report is itself a manager\n pureSupervisoryLayers: number[]; // layers where every member is a manager-of-managers\n aiExposure: { band: \"high\" | \"medium\" | \"low\"; headcount: number; cost: number }[];\n duplicateRoles: DuplicateRoleGroup[];\n duplicateRoleCost: number;\n deepestChains: { ids: string[]; depth: number }[];\n delayeringOpportunity: number; // indicative $\n spanOptimizationOpportunity: number; // indicative $\n duplicationOpportunity: number; // indicative $\n totalOpportunity: number;\n orgHealth: OrgHealthScore;\n}\n\nexport interface DuplicateRoleGroup {\n normalizedTitle: string;\n employees: { id: string; name: string; title: string; unit: string; cost: number }[];\n units: string[];\n totalCost: number;\n /** Distinct raw titles that normalized into this group — lets the UI show the normalization. */\n normalizedFrom: string[];\n}\n\nexport interface OrgHealthScore {\n total: number; // 0–100\n components: { name: string; score: number; weight: number; explanation: string }[];\n}\n\n// ---------------------------------------------------------------------------\n// Insights\n// ---------------------------------------------------------------------------\n\nexport type InsightCategory =\n | \"structure\"\n | \"cost\"\n | \"span\"\n | \"layer\"\n | \"duplication\"\n | \"location\"\n | \"grade\"\n | \"risk\"\n | \"scenario\"\n | \"executive\";\n\nexport interface Insight {\n id: string;\n title: string;\n severity: \"high\" | \"medium\" | \"low\";\n category: InsightCategory;\n evidence: string;\n impact: string;\n recommendation: string;\n relatedEntities: string[]; // employee ids or function names\n financialImpact: number; // indicative $; 0 if N/A\n employeesAffected: number;\n confidence: \"high\" | \"medium\" | \"low\";\n easeOfAction: \"easy\" | \"moderate\" | \"hard\";\n linkTo: string; // route\n rank?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Scenario comparison / scoring\n// ---------------------------------------------------------------------------\n\nexport interface ChangeRisk {\n level: \"Low\" | \"Medium\" | \"High\" | \"Very High\";\n score: number; // 0–100, higher = riskier\n factors: { name: string; value: number | string; contribution: number }[];\n recommendation: string;\n}\n\nexport interface ScenarioScore {\n total: number; // 0–100\n categories: { name: string; score: number; weight: number }[];\n}\n\nexport interface ScenarioEvaluation {\n scenarioId: string;\n metrics: OrgMetrics;\n risk: ChangeRisk;\n score: ScenarioScore;\n costDelta: number;\n headcountDelta: number;\n layerDelta: number;\n employeesMoved: number;\n rolesRemoved: number;\n rolesAdded: number;\n transitionCost: number; // one-time + ramp cost of executing the change\n netYear1Saving: number; // captured year-1 run-rate saving net of transition cost (positive = saving)\n runRateSaving: number; // steady-state annual saving (= -costDelta)\n // Share (0–1) of the run-rate saving captured in year 1, derived from\n // transitionAssumptions.effectiveMonth: (12 − month + 1)/12.\n year1CapturePct: number;\n // Position-vs-person ops: vacant/TBH seats removed (zero-severance\n // eliminations) and previously-unfilled seats filled by this scenario.\n vacantSeatsRemoved: number;\n seatsFilled: number;\n}\n\n// ---------------------------------------------------------------------------\n// Field mapping (upload)\n// ---------------------------------------------------------------------------\n\nexport const REQUIRED_FIELDS = [\n \"employee_id\",\n \"employee_name\",\n \"role_title\",\n \"manager_id\",\n \"department\",\n \"function\",\n \"business_unit\",\n \"location\",\n \"country\",\n \"grade\",\n \"level\",\n \"employment_type\",\n \"fte\",\n \"salary\",\n \"bonus\",\n \"total_cost\",\n \"status\",\n] as const;\n\nexport const OPTIONAL_FIELDS = [\n \"manager_name\",\n \"position_status\",\n \"tenure\",\n \"gender\",\n \"age_band\",\n \"performance_rating\",\n \"potential_rating\",\n \"critical_role\",\n \"role_family\",\n \"role_type\",\n \"cost_center\",\n \"legal_entity\",\n \"contract_type\",\n \"remote_status\",\n \"skills\",\n \"succession_risk\",\n \"attrition_risk\",\n \"change_impact\",\n \"comments\",\n] as const;\n\nexport type FieldMapping = Record<string, string | null>; // canonical field -> uploaded column\n","/**\n * Hierarchy engine: builds the org tree from flat employee records,\n * computes layers, spans, downstream rollups, and detects structural defects\n * (cycles, orphans, multiple roots).\n *\n * All functions are pure — they never mutate the input employee array.\n */\nimport { Employee, EmployeeNode, OrgTree, positionStatus } from \"./types\";\n\nconst ACTIVE = (e: Employee) => (e.status || \"Active\").toLowerCase() !== \"inactive\";\n\nexport function buildOrgTree(employees: Employee[]): OrgTree {\n const active = employees.filter(ACTIVE);\n const byId = new Map<string, Employee>();\n for (const e of active) byId.set(e.employee_id, e);\n\n const nodes = new Map<string, EmployeeNode>();\n const childrenOf = new Map<string, string[]>();\n const roots: string[] = [];\n const orphans: string[] = [];\n\n for (const e of active) {\n nodes.set(e.employee_id, {\n employee: e,\n layer: 0,\n directReports: [],\n span: 0,\n filledSpan: 0,\n downstreamHeadcount: 0,\n downstreamCost: 0,\n isManager: false,\n isManagerOfOne: false,\n managesOnlyManagers: false,\n managerChain: [],\n });\n }\n\n for (const e of active) {\n const mid = e.manager_id;\n if (!mid || mid === e.employee_id) {\n roots.push(e.employee_id);\n } else if (!byId.has(mid)) {\n orphans.push(e.employee_id); // manager not in dataset — treat as detached root\n } else {\n (childrenOf.get(mid) ?? childrenOf.set(mid, []).get(mid)!).push(e.employee_id);\n }\n }\n\n // Detect circular chains: walk up from each employee; if we revisit a node\n // in the current path, everyone in the loop is circular.\n const circular = new Set<string>();\n const safe = new Set<string>(roots);\n for (const e of active) {\n if (safe.has(e.employee_id) || circular.has(e.employee_id)) continue;\n const path: string[] = [];\n const onPath = new Set<string>();\n let cur: string | undefined = e.employee_id;\n while (cur) {\n if (safe.has(cur)) break;\n if (circular.has(cur)) { path.forEach((p) => circular.add(p)); break; }\n if (onPath.has(cur)) {\n // found a loop — mark loop members\n const loopStart = path.indexOf(cur);\n path.slice(loopStart).forEach((p) => circular.add(p));\n break;\n }\n onPath.add(cur);\n path.push(cur);\n const mgr: string | null = byId.get(cur)?.manager_id ?? null;\n if (!mgr || !byId.has(mgr) || mgr === cur) break; // reaches a root/orphan — safe\n cur = mgr;\n }\n if (!path.some((p) => circular.has(p))) path.forEach((p) => safe.add(p));\n }\n\n // BFS from roots + orphans (orphans behave as local roots so downstream\n // analytics still work; validation flags them separately).\n const startIds = [...roots, ...orphans];\n let maxLayer = 0;\n const queue: { id: string; layer: number; chain: string[] }[] = startIds.map((id) => ({\n id,\n layer: 1,\n chain: [],\n }));\n const visited = new Set<string>();\n // Index-pointer BFS: queue.shift() is O(n) per dequeue (array re-index),\n // which goes quadratic on large orgs. The queue array only grows; `head`\n // walks it instead.\n let head = 0;\n while (head < queue.length) {\n const { id, layer, chain } = queue[head++];\n if (visited.has(id) || circular.has(id)) continue;\n visited.add(id);\n const node = nodes.get(id)!;\n node.layer = layer;\n node.managerChain = chain;\n maxLayer = Math.max(maxLayer, layer);\n const kids = (childrenOf.get(id) ?? []).filter((k) => !circular.has(k));\n node.directReports = kids;\n node.span = kids.length; // ALL seats — designed structure\n // Operating reality: reports whose seats are actually filled.\n node.filledSpan = kids.filter((k) => positionStatus(byId.get(k)!) === \"filled\").length;\n node.isManager = kids.length > 0;\n for (const kid of kids) queue.push({ id: kid, layer: layer + 1, chain: [...chain, id] });\n }\n\n // Downstream rollups — process deepest-first.\n const ordered = [...visited].sort((a, b) => nodes.get(b)!.layer - nodes.get(a)!.layer);\n for (const id of ordered) {\n const node = nodes.get(id)!;\n let hc = 0;\n let cost = 0;\n for (const kid of node.directReports) {\n const kn = nodes.get(kid)!;\n hc += 1 + kn.downstreamHeadcount;\n cost += (kn.employee.total_cost || 0) + kn.downstreamCost;\n }\n node.downstreamHeadcount = hc;\n node.downstreamCost = cost;\n node.isManagerOfOne = node.span === 1;\n node.managesOnlyManagers =\n node.span > 0 && node.directReports.every((kid) => (nodes.get(kid)?.span ?? 0) > 0);\n }\n\n return { nodes, roots, maxLayer, orphans, circular: [...circular] };\n}\n\n/** All employee ids in the subtree rooted at `id` (including `id`). */\nexport function subtreeIds(tree: OrgTree, id: string): string[] {\n const out: string[] = [];\n const stack = [id];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n const node = tree.nodes.get(cur);\n if (!node) continue;\n out.push(cur);\n stack.push(...node.directReports);\n }\n return out;\n}\n\n/** Longest reporting chains (root → leaf), top N. */\nexport function deepestChains(tree: OrgTree, topN = 5): { ids: string[]; depth: number }[] {\n const chains: { ids: string[]; depth: number }[] = [];\n for (const [id, node] of tree.nodes) {\n if (node.directReports.length === 0 && node.layer > 0) {\n chains.push({ ids: [...node.managerChain, id], depth: node.layer });\n }\n }\n chains.sort((a, b) => b.depth - a.depth);\n return chains.slice(0, topN);\n}\n\n/** Would moving `employeeId` under `newManagerId` create a cycle? */\nexport function wouldCreateCycle(tree: OrgTree, employeeId: string, newManagerId: string): boolean {\n if (employeeId === newManagerId) return true;\n return subtreeIds(tree, employeeId).includes(newManagerId);\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/** Compact currency: $1.2M, $840K, $312 */\nexport function fmtMoney(value: number, symbol = \"$\"): string {\n const abs = Math.abs(value);\n const sign = value < 0 ? \"-\" : \"\";\n if (abs >= 1_000_000_000) return `${sign}${symbol}${(abs / 1_000_000_000).toFixed(2)}B`;\n if (abs >= 1_000_000) return `${sign}${symbol}${(abs / 1_000_000).toFixed(1)}M`;\n if (abs >= 10_000) return `${sign}${symbol}${Math.round(abs / 1000)}K`;\n if (abs >= 1_000) return `${sign}${symbol}${(abs / 1000).toFixed(1)}K`;\n return `${sign}${symbol}${Math.round(abs)}`;\n}\n\nexport function fmtNum(value: number, decimals = 0): string {\n return value.toLocaleString(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n}\n\nexport function fmtPct(value: number, decimals = 0): string {\n return `${(value * 100).toFixed(decimals)}%`;\n}\n\nexport function median(values: number[]): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];\n}\n\nexport function average(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((a, b) => a + b, 0) / values.length;\n}\n\nexport function sum(values: number[]): number {\n return values.reduce((a, b) => a + b, 0);\n}\n\nlet idCounter = 0;\nexport function uid(prefix = \"id\"): string {\n idCounter += 1;\n return `${prefix}_${Date.now().toString(36)}_${idCounter}`;\n}\n\n/** Group an array by a key function into a Record. */\nexport function groupBy<T>(items: T[], key: (item: T) => string): Record<string, T[]> {\n const out: Record<string, T[]> = {};\n for (const item of items) {\n const k = key(item) || \"(blank)\";\n (out[k] ??= []).push(item);\n }\n return out;\n}\n\n/** Sort record entries by value descending. */\nexport function sortedEntries(rec: Record<string, number>): [string, number][] {\n return Object.entries(rec).sort((a, b) => b[1] - a[1]);\n}\n","/**\n * Analytics engine: computes the full OrgMetrics set from an employee list.\n * Every dashboard number traces back to these functions.\n */\nimport { buildOrgTree, deepestChains } from \"./hierarchy\";\nimport {\n Assumptions,\n DEFAULT_TITLE_NOISE_WORDS,\n DuplicateRoleGroup,\n Employee,\n LayerStat,\n OrgHealthScore,\n OrgMetrics,\n OrgTree,\n positionStatus,\n SpanBucket,\n SpanTargetByLevel,\n} from \"./types\";\nimport { average, groupBy, median, sum } from \"./utils\";\n\n// ---------------------------------------------------------------------------\n// Role title normalization (for duplication analysis)\n// ---------------------------------------------------------------------------\n\n// Structural qualifiers — a digit/numeral following one of these is meaningful\n// (e.g. \"Region 2\" vs \"Region 3\") and must NOT be stripped as seniority noise.\nconst STRUCTURAL_WORD = /(region|zone|area|tier|band|grade|level|market)$/;\n\n/**\n * Normalize a role title for duplication grouping. Noise words default to\n * DEFAULT_TITLE_NOISE_WORDS (seniority markers + roman/arabic numerals) and are\n * configurable via assumptions.titleNoiseWords. Words like \"assistant\", \"lead\"\n * and \"associate\" are deliberately NOT noise by default — they usually denote\n * genuinely different jobs.\n */\nexport function normalizeTitle(title: string, noiseWords?: string[]): string {\n const noise = new Set((noiseWords ?? DEFAULT_TITLE_NOISE_WORDS).map((w) => w.toLowerCase().trim()));\n const base = title\n .toLowerCase()\n .replace(/[^a-z0-9 ]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n // Strip seniority noise tokens, but keep a token when the immediately\n // preceding (already-emitted) word is a structural qualifier.\n const kept: string[] = [];\n for (const tok of base.split(\" \")) {\n if (!tok) continue;\n const isNoise = noise.has(tok);\n const prev = kept[kept.length - 1] ?? \"\";\n if (isNoise && !STRUCTURAL_WORD.test(prev)) continue; // drop noise token\n kept.push(tok);\n }\n return kept.join(\" \").replace(/\\s+/g, \" \").trim();\n}\n\n// ---------------------------------------------------------------------------\n// Level-aware span bands\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the applicable target span band for an employee level from\n * assumptions.targetSpansByLevel (assumed sorted by level ascending). Picks the\n * entry with the largest level <= the employee level; if the level is below the\n * first entry's level, the first entry is used. Returns undefined if there are\n * no bands configured.\n */\nexport function spanBandForLevel(\n level: number,\n assumptions: Assumptions\n): SpanTargetByLevel | undefined {\n const bands = assumptions.targetSpansByLevel;\n if (!bands || bands.length === 0) return undefined;\n const sorted = [...bands].sort((a, b) => a.level - b.level);\n let chosen = sorted[0];\n for (const b of sorted) {\n if (b.level <= level) chosen = b;\n else break;\n }\n return chosen;\n}\n\n/**\n * Level-aware narrow/wide classification for a single manager span.\n * When the employee level is 0/blank, falls back to the flat thresholds.\n */\nexport function classifySpan(\n span: number,\n level: number,\n assumptions: Assumptions\n): { narrow: boolean; wide: boolean } {\n const band = level > 0 ? spanBandForLevel(level, assumptions) : undefined;\n if (!band) {\n return {\n narrow: span < assumptions.narrowSpanThreshold,\n wide: span > assumptions.wideSpanThreshold,\n };\n }\n // Narrow = below the level band AND below the flat threshold fallback.\n const narrow = span < band.min && span < assumptions.narrowSpanThreshold;\n const wide = span > band.max;\n return { narrow, wide };\n}\n\n// ---------------------------------------------------------------------------\n// AI-augmentation classification\n// ---------------------------------------------------------------------------\n\nconst AI_HIGH_KEYWORDS = [\"processing\", \"support\", \"coordinator\", \"analyst\", \"specialist\"];\nconst AI_MEDIUM_KEYWORDS = [\"engineer\", \"accountant\", \"recruiter\", \"marketing\"];\nconst AI_LOW_KEYWORDS = [\"counsel\", \"director\", \"officer\", \"manager\", \"executive\"];\n\n/**\n * Classify a role's AI-augmentation potential. Uses an explicit role_family\n * mapping when available; otherwise falls back to a conservative title-keyword\n * heuristic. Augmentation potential is NOT a judgement on elimination.\n */\nexport function classifyAiAugmentation(\n employee: Employee,\n assumptions: Assumptions\n): \"high\" | \"medium\" | \"low\" {\n const fam = employee.role_family?.trim().toLowerCase();\n if (fam && assumptions.aiAugmentationByRoleFamily[fam]) {\n return assumptions.aiAugmentationByRoleFamily[fam];\n }\n // Some callers may key the map by the original (non-lowercased) family.\n if (employee.role_family && assumptions.aiAugmentationByRoleFamily[employee.role_family]) {\n return assumptions.aiAugmentationByRoleFamily[employee.role_family];\n }\n const title = (employee.role_title || \"\").toLowerCase();\n if (AI_LOW_KEYWORDS.some((k) => title.includes(k))) return \"low\";\n if (AI_MEDIUM_KEYWORDS.some((k) => title.includes(k))) return \"medium\";\n if (AI_HIGH_KEYWORDS.some((k) => title.includes(k))) return \"high\";\n return \"low\";\n}\n\n/**\n * Potential duplicate leadership/specialist roles: same normalized title held\n * in 2+ different business units (or 3+ holders in one unit) among the senior\n * population. Seniority = explicit level 1–4; employees with no level data\n * (level 0/blank) use a cost-percentile fallback — only the top 25% of\n * total_cost within the dataset counts as senior, so unleveled populations are\n * never flagged wholesale. Flagged as \"potential duplication requiring\n * review\" — never auto-judged bad.\n */\nexport function findDuplicateRoles(\n employees: Employee[],\n assumptions?: Assumptions\n): DuplicateRoleGroup[] {\n // Explicitly leveled senior roles (level 1 = most senior).\n const seniors = employees.filter((e) => e.level >= 1 && e.level <= 4);\n // Level-0 / blank-level fallback: top 25% of total_cost within the dataset.\n const unleveled = employees.filter((e) => !(e.level >= 1));\n if (unleveled.length > 0) {\n const costs = employees.map((e) => e.total_cost || 0).sort((a, b) => a - b);\n const p75 = costs[Math.min(costs.length - 1, Math.floor(costs.length * 0.75))];\n seniors.push(...unleveled.filter((e) => (e.total_cost || 0) >= p75));\n }\n const noiseWords = assumptions?.titleNoiseWords; // undefined → defaults inside normalizeTitle\n const byTitle = groupBy(seniors, (e) => normalizeTitle(e.role_title, noiseWords));\n const groups: DuplicateRoleGroup[] = [];\n for (const [normalizedTitle, emps] of Object.entries(byTitle)) {\n if (!normalizedTitle || emps.length < 2) continue;\n const units = [...new Set(emps.map((e) => e.business_unit))];\n if (units.length < 2 && emps.length < 3) continue;\n groups.push({\n normalizedTitle,\n employees: emps.map((e) => ({\n id: e.employee_id,\n name: e.employee_name,\n title: e.role_title,\n unit: e.business_unit,\n cost: e.total_cost,\n })),\n units,\n totalCost: sum(emps.map((e) => e.total_cost)),\n normalizedFrom: [...new Set(emps.map((e) => e.role_title))],\n });\n }\n return groups.sort((a, b) => b.totalCost - a.totalCost);\n}\n\n// ---------------------------------------------------------------------------\n// Span buckets\n// ---------------------------------------------------------------------------\n\nconst BUCKET_DEFS: { label: string; min: number; max: number }[] = [\n { label: \"1–2\", min: 1, max: 2 },\n { label: \"3–5\", min: 3, max: 5 },\n { label: \"6–8\", min: 6, max: 8 },\n { label: \"9–12\", min: 9, max: 12 },\n { label: \"13+\", min: 13, max: Infinity },\n];\n\n// ---------------------------------------------------------------------------\n// Main metrics computation\n// ---------------------------------------------------------------------------\n\nexport function computeMetrics(employees: Employee[], assumptions: Assumptions): OrgMetrics {\n const tree = buildOrgTree(employees);\n return computeMetricsFromTree(employees, tree, assumptions);\n}\n\nexport function computeMetricsFromTree(\n employees: Employee[],\n tree: OrgTree,\n assumptions: Assumptions\n): OrgMetrics {\n const active = employees.filter((e) => (e.status || \"Active\").toLowerCase() !== \"inactive\");\n const nodes = [...tree.nodes.values()].filter((n) => n.layer > 0);\n const managers = nodes.filter((n) => n.isManager);\n const ics = nodes.filter((n) => !n.isManager);\n\n const headcount = nodes.length;\n const totalFte = sum(nodes.map((n) => n.employee.fte || 1));\n const totalCost = sum(nodes.map((n) => n.employee.total_cost || 0));\n const managementCost = sum(managers.map((n) => n.employee.total_cost || 0));\n const icCost = totalCost - managementCost;\n\n // Position-vs-person split. headcount/totalCost above are the DESIGNED\n // numbers (every seat, vacant/TBH seats at budgeted cost); the run-rate\n // numbers cover filled seats only. Identical when no seat is unfilled.\n const filledNodes = nodes.filter((n) => positionStatus(n.employee) === \"filled\");\n const filledHeadcount = filledNodes.length;\n const vacantSeats = nodes.filter((n) => positionStatus(n.employee) === \"vacant\").length;\n const tbhSeats = nodes.filter((n) => positionStatus(n.employee) === \"tbh\").length;\n const unfilledSeats = vacantSeats + tbhSeats;\n const runRateCost = sum(filledNodes.map((n) => n.employee.total_cost || 0));\n const unfilledSeatCost = totalCost - runRateCost;\n const unfilledByFunction: Record<string, number> = {};\n const unfilledByLayer: Record<number, number> = {};\n for (const n of nodes) {\n if (positionStatus(n.employee) === \"filled\") continue;\n const f = n.employee.function || \"(blank)\";\n unfilledByFunction[f] = (unfilledByFunction[f] || 0) + 1;\n unfilledByLayer[n.layer] = (unfilledByLayer[n.layer] || 0) + 1;\n }\n\n const spans = managers.map((m) => m.span);\n // Filled spans averaged over the SAME designed-manager population so the\n // designed vs operating averages compare like-for-like.\n const filledSpans = managers.map((m) => m.filledSpan);\n // Level-aware span assessment: resolve each manager's target band from\n // assumptions.targetSpansByLevel; fall back to flat thresholds when level is blank.\n const narrow = managers.filter(\n (m) => classifySpan(m.span, m.employee.level || 0, assumptions).narrow\n );\n const wide = managers.filter(\n (m) => classifySpan(m.span, m.employee.level || 0, assumptions).wide\n );\n\n const spanBuckets: SpanBucket[] = BUCKET_DEFS.map((b) => {\n const inBucket = managers.filter((m) => m.span >= b.min && m.span <= b.max);\n return { ...b, count: inBucket.length, managerIds: inBucket.map((m) => m.employee.employee_id) };\n });\n\n // Layer stats\n const layerStats: LayerStat[] = [];\n for (let layer = 1; layer <= tree.maxLayer; layer++) {\n const atLayer = nodes.filter((n) => n.layer === layer);\n if (atLayer.length === 0) continue;\n const layerManagers = atLayer.filter((n) => n.isManager);\n const layerSpans = layerManagers.map((m) => m.span);\n layerStats.push({\n layer,\n headcount: atLayer.length,\n managers: layerManagers.length,\n ics: atLayer.length - layerManagers.length,\n cost: sum(atLayer.map((n) => n.employee.total_cost || 0)),\n managementCost: sum(layerManagers.map((n) => n.employee.total_cost || 0)),\n avgSpan: average(layerSpans),\n medianSpan: median(layerSpans),\n unfilledSeats: atLayer.filter((n) => positionStatus(n.employee) !== \"filled\").length,\n });\n }\n\n // Dimension rollups\n const dim = (key: (e: Employee) => string) => {\n const out: Record<string, number> = {};\n for (const n of nodes) {\n const k = key(n.employee) || \"(blank)\";\n out[k] = (out[k] || 0) + (n.employee.total_cost || 0);\n }\n return out;\n };\n const dimCount = (key: (e: Employee) => string) => {\n const out: Record<string, number> = {};\n for (const n of nodes) {\n const k = key(n.employee) || \"(blank)\";\n out[k] = (out[k] || 0) + 1;\n }\n return out;\n };\n const dimMaxLayer = (key: (e: Employee) => string) => {\n const out: Record<string, number> = {};\n const minL: Record<string, number> = {};\n for (const n of nodes) {\n const k = key(n.employee) || \"(blank)\";\n out[k] = Math.max(out[k] || 0, n.layer);\n minL[k] = Math.min(minL[k] ?? Infinity, n.layer);\n }\n // Layers *within* the function = deepest minus shallowest + 1\n for (const k of Object.keys(out)) out[k] = out[k] - (minL[k] === Infinity ? 1 : minL[k]) + 1;\n return out;\n };\n const dimAvgSpan = (key: (e: Employee) => string) => {\n const out: Record<string, number[]> = {};\n for (const m of managers) {\n const k = key(m.employee) || \"(blank)\";\n (out[k] ??= []).push(m.span);\n }\n return Object.fromEntries(Object.entries(out).map(([k, v]) => [k, average(v)]));\n };\n\n const costByLayer: Record<number, number> = {};\n const managementCostByLayer: Record<number, number> = {};\n for (const ls of layerStats) {\n costByLayer[ls.layer] = ls.cost;\n managementCostByLayer[ls.layer] = ls.managementCost;\n }\n // Layer tax: management chain cost carried per frontline IC.\n const layerTaxPerIC = ics.length ? managementCost / ics.length : 0;\n\n // Manager-of-one / manager-of-managers structure\n const managerOfOneCount = managers.filter((m) => m.isManagerOfOne).length;\n const managerOfManagersCount = managers.filter((m) => m.managesOnlyManagers).length;\n // Pure supervisory (pass-through) layers: every member at the layer is a\n // manager whose reports are all themselves managers.\n const pureSupervisoryLayers: number[] = [];\n for (let layer = 1; layer <= tree.maxLayer; layer++) {\n const atLayer = nodes.filter((n) => n.layer === layer);\n if (atLayer.length === 0) continue;\n if (atLayer.every((n) => n.isManager && n.managesOnlyManagers)) {\n pureSupervisoryLayers.push(layer);\n }\n }\n\n // AI-augmentation exposure (high/medium/low) by headcount and cost.\n const aiBands: Record<\"high\" | \"medium\" | \"low\", { headcount: number; cost: number }> = {\n high: { headcount: 0, cost: 0 },\n medium: { headcount: 0, cost: 0 },\n low: { headcount: 0, cost: 0 },\n };\n for (const n of nodes) {\n const band = classifyAiAugmentation(n.employee, assumptions);\n aiBands[band].headcount += 1;\n aiBands[band].cost += n.employee.total_cost || 0;\n }\n const aiExposure = ([\"high\", \"medium\", \"low\"] as const).map((band) => ({\n band,\n headcount: aiBands[band].headcount,\n cost: aiBands[band].cost,\n }));\n\n const duplicateRoles = findDuplicateRoles(active, assumptions);\n // Duplicate cost = cost beyond one holder per group (the \"extra\" instances)\n const duplicateRoleCost = sum(\n duplicateRoles.map((g) => g.totalCost - Math.max(...g.employees.map((e) => e.cost)))\n );\n\n const narrowSpanCost = sum(narrow.map((m) => m.employee.total_cost || 0));\n // The two SPAN levers are disjoint (no manager counted in both):\n // - Span optimization covers very-narrow managers (span 1–2): these could be\n // ICs, so we count the management premium (spanOptPremiumPct% of their cost).\n // - Delayering covers the remaining narrow-span managers (span 3..threshold-1):\n // candidates for layer consolidation at the configurable capture rate.\n // Duplication is a SEPARATE lens: duplicate senior roles may theoretically\n // overlap with the delayering population, so the three levers are presented\n // as indicative views rather than a strictly additive, fully disjoint pool.\n const tinySpanMgrs = narrow.filter((m) => m.span <= 2);\n // `?? 20` guards persisted assumptions saved before spanOptPremiumPct existed.\n const spanOptPremium = (assumptions.spanOptPremiumPct ?? 20) / 100;\n const spanOptimizationOpportunity = sum(\n tinySpanMgrs.map((m) => (m.employee.total_cost || 0) * spanOptPremium)\n );\n const delayerMgrs = narrow.filter((m) => m.span >= 3);\n const delayerNarrowCost = sum(delayerMgrs.map((m) => m.employee.total_cost || 0));\n const delayeringOpportunity = (delayerNarrowCost * assumptions.delayeringSavingPct) / 100;\n const duplicationOpportunity = (duplicateRoleCost * assumptions.duplicateRoleSavingPct) / 100;\n\n const orgHealth = computeOrgHealth(\n {\n maxLayers: tree.maxLayer,\n headcount,\n narrowPct: managers.length ? narrow.length / managers.length : 0,\n widePct: managers.length ? wide.length / managers.length : 0,\n managerRatio: headcount ? managers.length / headcount : 0,\n mgmtCostRatio: totalCost ? managementCost / totalCost : 0,\n duplicateCost: duplicateRoleCost,\n totalCost,\n },\n assumptions\n );\n\n return {\n headcount,\n totalFte,\n totalCost,\n filledHeadcount,\n vacantSeats,\n tbhSeats,\n unfilledSeats,\n vacancyRate: headcount ? unfilledSeats / headcount : 0,\n runRateCost,\n unfilledSeatCost,\n avgFilledSpan: average(filledSpans),\n medianFilledSpan: median(filledSpans),\n unfilledByFunction,\n unfilledByLayer,\n managerCount: managers.length,\n icCount: ics.length,\n managerRatio: headcount ? managers.length / headcount : 0,\n managementCost,\n icCost,\n managementCostRatio: totalCost ? managementCost / totalCost : 0,\n maxLayers: tree.maxLayer,\n avgSpan: average(spans),\n medianSpan: median(spans),\n narrowSpanManagers: narrow.map((m) => m.employee.employee_id),\n wideSpanManagers: wide.map((m) => m.employee.employee_id),\n narrowSpanPct: managers.length ? narrow.length / managers.length : 0,\n wideSpanPct: managers.length ? wide.length / managers.length : 0,\n narrowSpanCost,\n spanBuckets,\n layerStats,\n costByFunction: dim((e) => e.function),\n headcountByFunction: dimCount((e) => e.function),\n layersByFunction: dimMaxLayer((e) => e.function),\n avgSpanByFunction: dimAvgSpan((e) => e.function),\n costByBU: dim((e) => e.business_unit),\n headcountByBU: dimCount((e) => e.business_unit),\n layersByBU: dimMaxLayer((e) => e.business_unit),\n costByLocation: dim((e) => e.location),\n headcountByLocation: dimCount((e) => e.location),\n costByGrade: dim((e) => e.grade),\n headcountByGrade: dimCount((e) => e.grade),\n costByLayer,\n managementCostByLayer,\n layerTaxPerIC,\n managerOfOneCount,\n managerOfManagersCount,\n pureSupervisoryLayers,\n aiExposure,\n duplicateRoles,\n duplicateRoleCost,\n deepestChains: deepestChains(tree, 5),\n delayeringOpportunity,\n spanOptimizationOpportunity,\n duplicationOpportunity,\n totalOpportunity: delayeringOpportunity + duplicationOpportunity + spanOptimizationOpportunity,\n orgHealth,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Org Health Score — weighted, explainable composite (0–100)\n// ---------------------------------------------------------------------------\n\ninterface HealthInputs {\n maxLayers: number;\n headcount: number;\n narrowPct: number;\n widePct: number;\n managerRatio: number;\n mgmtCostRatio: number;\n duplicateCost: number;\n totalCost: number;\n}\n\nexport function computeOrgHealth(inp: HealthInputs, assumptions: Assumptions): OrgHealthScore {\n // Benchmark layers for org size\n const bench =\n assumptions.benchmarkLayersForSize.find((b) => inp.headcount <= b.maxHeadcount)?.layers ?? 8;\n\n // Layer health: 100 if at/below benchmark, -15 per extra layer\n const excessLayers = Math.max(0, inp.maxLayers - bench);\n const layerScore = Math.max(0, 100 - excessLayers * 15);\n\n // Span health: penalize narrow and wide span share\n const spanScore = Math.max(0, 100 - inp.narrowPct * 120 - inp.widePct * 80);\n\n // Manager ratio: healthy band roughly 10–20% of headcount as managers\n const mr = inp.managerRatio;\n const ratioScore =\n mr <= 0.2 && mr >= 0.08 ? 100 : Math.max(0, 100 - Math.abs(mr - 0.15) * 400);\n\n // Management cost ratio: healthy below ~30%\n const mcScore = inp.mgmtCostRatio <= 0.3 ? 100 : Math.max(0, 100 - (inp.mgmtCostRatio - 0.3) * 300);\n\n // Duplication: penalty scaled by duplicate cost share\n const dupShare = inp.totalCost ? inp.duplicateCost / inp.totalCost : 0;\n const dupScore = Math.max(0, 100 - dupShare * 600);\n\n const components = [\n {\n name: \"Layer health\",\n score: Math.round(layerScore),\n weight: 25,\n explanation: `${inp.maxLayers} layers vs ~${bench} benchmark for ${inp.headcount} employees${excessLayers > 0 ? ` (+${excessLayers} excess)` : \"\"}.`,\n },\n {\n name: \"Span health\",\n score: Math.round(spanScore),\n weight: 25,\n explanation: `${Math.round(inp.narrowPct * 100)}% of managers below / ${Math.round(inp.widePct * 100)}% above their level's target span band (flat thresholds ${assumptions.narrowSpanThreshold}/${assumptions.wideSpanThreshold} for unleveled roles).`,\n },\n {\n name: \"Management ratio\",\n score: Math.round(ratioScore),\n weight: 20,\n explanation: `${Math.round(mr * 100)}% of employees are managers (healthy band ≈ 8–20%).`,\n },\n {\n name: \"Management cost\",\n score: Math.round(mcScore),\n weight: 15,\n explanation: `Managers account for ${Math.round(inp.mgmtCostRatio * 100)}% of total cost (target ≤ 30%).`,\n },\n {\n name: \"Role duplication\",\n score: Math.round(dupScore),\n weight: 15,\n explanation: `Potential duplicate senior roles represent ${(dupShare * 100).toFixed(1)}% of total cost.`,\n },\n ];\n\n const totalWeight = sum(components.map((c) => c.weight));\n const total = Math.round(sum(components.map((c) => (c.score * c.weight) / totalWeight)));\n return { total, components };\n}\n","/**\n * Data validation engine: checks uploaded workforce data, produces a\n * categorized issue list and a 0–100 Data Quality Score.\n */\nimport { buildOrgTree } from \"./hierarchy\";\nimport {\n DataQualityIssue,\n DataQualityReport,\n Employee,\n IssueSeverity,\n PositionStatus,\n positionStatus,\n} from \"./types\";\nimport { groupBy } from \"./utils\";\n\nlet issueSeq = 0;\nfunction issue(\n severity: IssueSeverity,\n category: string,\n message: string,\n employeeIds: string[] = []\n): DataQualityIssue {\n issueSeq += 1;\n return { id: `dq_${issueSeq}`, severity, category, message, employeeIds };\n}\n\nexport function validateEmployees(employees: Employee[]): DataQualityReport {\n const issues: DataQualityIssue[] = [];\n if (employees.length === 0) {\n // An empty dataset is unusable: floor the score to 0 / \"Poor\" rather than\n // letting finalize() deduct only a partial penalty.\n issues.push(issue(\"critical\", \"Empty dataset\", \"No employee rows were found.\"));\n const counts = { critical: 1, warning: 0, info: 0 };\n return { score: 0, band: \"Poor\", issues, counts };\n }\n\n // Duplicate employee IDs\n const byId = groupBy(employees, (e) => e.employee_id);\n const dups = Object.entries(byId).filter(([, v]) => v.length > 1);\n if (dups.length > 0) {\n issues.push(\n issue(\n \"critical\",\n \"Duplicate IDs\",\n `${dups.length} employee ID(s) appear more than once: ${dups.slice(0, 5).map(([k]) => k).join(\", \")}${dups.length > 5 ? \"…\" : \"\"}`,\n dups.map(([k]) => k)\n )\n );\n }\n\n // Missing required field values. Vacant/TBH seats have no occupant by\n // definition — only FILLED records with blank names are data defects.\n const missingName = employees.filter(\n (e) => positionStatus(e) === \"filled\" && !e.employee_name?.trim()\n );\n if (missingName.length > 0)\n issues.push(issue(\"critical\", \"Missing names\", `${missingName.length} employee(s) have no name.`, missingName.map((e) => e.employee_id)));\n\n // Unfilled positions are a property of the dataset, not a defect — surface\n // the count as information so designed-vs-run-rate cost gaps aren't a surprise.\n const unfilled = employees.filter((e) => positionStatus(e) !== \"filled\");\n if (unfilled.length > 0)\n issues.push(\n issue(\n \"info\",\n \"Unfilled positions\",\n `${unfilled.length} position(s) are vacant or to-be-hired — included in designed cost and structure, excluded from run-rate cost.`,\n unfilled.map((e) => e.employee_id)\n )\n );\n\n const missingTitle = employees.filter((e) => !e.role_title?.trim());\n if (missingTitle.length > 0)\n issues.push(issue(\"warning\", \"Missing role titles\", `${missingTitle.length} employee(s) have no role title.`, missingTitle.map((e) => e.employee_id)));\n\n const blankDept = employees.filter((e) => !e.department?.trim());\n if (blankDept.length > 0)\n issues.push(issue(\"warning\", \"Blank departments\", `${blankDept.length} employee(s) have a blank department.`, blankDept.map((e) => e.employee_id)));\n\n const blankFunc = employees.filter((e) => !e.function?.trim());\n if (blankFunc.length > 0)\n issues.push(issue(\"warning\", \"Blank functions\", `${blankFunc.length} employee(s) have a blank function.`, blankFunc.map((e) => e.employee_id)));\n\n const blankLoc = employees.filter((e) => !e.location?.trim());\n if (blankLoc.length > 0)\n issues.push(issue(\"info\", \"Blank locations\", `${blankLoc.length} employee(s) have a blank location.`, blankLoc.map((e) => e.employee_id)));\n\n // Invalid costs\n const badCost = employees.filter(\n (e) => e.total_cost == null || isNaN(e.total_cost) || e.total_cost < 0\n );\n if (badCost.length > 0)\n issues.push(issue(\"critical\", \"Invalid costs\", `${badCost.length} employee(s) have missing/negative/non-numeric total cost.`, badCost.map((e) => e.employee_id)));\n\n const zeroCost = employees.filter((e) => e.total_cost === 0);\n if (zeroCost.length > 0)\n issues.push(issue(\"warning\", \"Zero cost\", `${zeroCost.length} employee(s) have zero total cost — cost analytics will undercount.`, zeroCost.map((e) => e.employee_id)));\n\n const costBelowSalary = employees.filter(\n (e) => e.total_cost > 0 && e.salary > 0 && e.total_cost < e.salary\n );\n if (costBelowSalary.length > 0)\n issues.push(issue(\"warning\", \"Cost below salary\", `${costBelowSalary.length} employee(s) have total cost lower than base salary.`, costBelowSalary.map((e) => e.employee_id)));\n\n // Invalid FTE\n const badFte = employees.filter((e) => e.fte != null && (isNaN(e.fte) || e.fte <= 0 || e.fte > 2));\n if (badFte.length > 0)\n issues.push(issue(\"warning\", \"Suspicious FTE\", `${badFte.length} employee(s) have FTE outside (0, 2].`, badFte.map((e) => e.employee_id)));\n\n // Structural checks via the tree\n const tree = buildOrgTree(employees);\n\n // Invalid manager IDs (manager not found)\n if (tree.orphans.length > 0)\n issues.push(\n issue(\n \"critical\",\n \"Invalid manager IDs\",\n `${tree.orphans.length} employee(s) reference a manager_id that does not exist in the data (treated as detached roots).`,\n tree.orphans\n )\n );\n\n // Circular references\n if (tree.circular.length > 0)\n issues.push(\n issue(\n \"critical\",\n \"Circular reporting lines\",\n `${tree.circular.length} employee(s) sit in circular reporting chains and are excluded from hierarchy analytics.`,\n tree.circular\n )\n );\n\n // Multiple roots\n if (tree.roots.length > 1)\n issues.push(\n issue(\n \"warning\",\n \"Multiple root nodes\",\n `${tree.roots.length} employees have no manager (multiple CEOs/roots). Layer analytics use each root independently.`,\n tree.roots\n )\n );\n if (tree.roots.length === 0)\n issues.push(issue(\"critical\", \"No root node\", \"No employee without a manager was found — cannot identify the CEO/top of the organization.\"));\n\n // Inconsistent levels vs layers (level says senior, layer says deep)\n const inconsistent = [...tree.nodes.values()].filter(\n (n) => n.layer > 0 && n.employee.level > 0 && Math.abs(n.employee.level - n.layer) >= 3\n );\n if (inconsistent.length > 0)\n issues.push(\n issue(\n \"info\",\n \"Level/layer mismatch\",\n `${inconsistent.length} employee(s) have a stated level differing from their computed layer by 3+, suggesting grade data drift.`,\n inconsistent.map((n) => n.employee.employee_id)\n )\n );\n\n // Role title inconsistency: same normalized title, many raw spellings\n const titleVariants = groupBy(\n employees.filter((e) => e.role_title),\n (e) => e.role_title.toLowerCase().replace(/[^a-z]/g, \"\")\n );\n const messyTitles = Object.values(titleVariants).filter(\n (v) => new Set(v.map((e) => e.role_title)).size > 1\n );\n if (messyTitles.length > 0)\n issues.push(\n issue(\n \"info\",\n \"Inconsistent role titles\",\n `${messyTitles.length} title(s) appear with multiple spellings/capitalizations (e.g. ${[...new Set(messyTitles[0].map((e) => e.role_title))].slice(0, 3).join(\" / \")}).`,\n []\n )\n );\n\n return finalize(issues, employees.length);\n}\n\nfunction finalize(issues: DataQualityIssue[], rowCount: number): DataQualityReport {\n const counts = {\n critical: issues.filter((i) => i.severity === \"critical\").length,\n warning: issues.filter((i) => i.severity === \"warning\").length,\n info: issues.filter((i) => i.severity === \"info\").length,\n };\n // Score: start at 100; critical issues weigh by affected share, warnings less.\n let score = 100;\n for (const i of issues) {\n const share = rowCount > 0 ? Math.min(1, (i.employeeIds.length || 1) / rowCount) : 1;\n if (i.severity === \"critical\") score -= 15 + share * 25;\n else if (i.severity === \"warning\") score -= 5 + share * 10;\n else score -= 1 + share * 3;\n }\n score = Math.max(0, Math.round(score));\n const band =\n score >= 90 ? \"Strong\" : score >= 75 ? \"Usable\" : score >= 50 ? \"Needs cleanup\" : \"Poor\";\n return { score, band, issues, counts };\n}\n\n// ---------------------------------------------------------------------------\n// Row parsing: convert raw uploaded rows + field mapping into Employees\n// ---------------------------------------------------------------------------\n\nfunction num(v: unknown): number {\n if (v == null || v === \"\") return 0;\n const n = typeof v === \"number\" ? v : parseFloat(String(v).replace(/[,$€£\\s]/g, \"\"));\n return isNaN(n) ? 0 : n;\n}\n\nfunction str(v: unknown): string {\n return v == null ? \"\" : String(v).trim();\n}\n\nfunction bool(v: unknown): boolean {\n const s = str(v).toLowerCase();\n return s === \"true\" || s === \"yes\" || s === \"y\" || s === \"1\";\n}\n\nconst VACANT_TOKENS = new Set([\"vacant\", \"open\", \"unfilled\", \"vacancy\", \"openposition\", \"openseat\"]);\nconst TBH_TOKENS = new Set([\"tbh\", \"tobehired\", \"planned\", \"hiring\"]);\nconst FILLED_TOKENS = new Set([\"filled\", \"active\", \"occupied\"]);\n\n/**\n * Normalize a raw position-status cell to a PositionStatus. Recognizes common\n * HRIS spellings case-/punctuation-insensitively; unknown values return\n * undefined so callers can fall back to other signals (the safe default for\n * anything unrecognized is \"filled\").\n */\nexport function normalizePositionStatus(v: unknown): PositionStatus | undefined {\n const s = str(v).toLowerCase().replace(/[^a-z]/g, \"\");\n if (!s) return undefined;\n if (VACANT_TOKENS.has(s)) return \"vacant\";\n if (TBH_TOKENS.has(s)) return \"tbh\";\n if (FILLED_TOKENS.has(s)) return \"filled\";\n return undefined;\n}\n\nexport function rowsToEmployees(\n rows: Record<string, unknown>[],\n mapping: Record<string, string | null>\n): Employee[] {\n const get = (row: Record<string, unknown>, field: string) => {\n const col = mapping[field];\n return col ? row[col] : undefined;\n };\n return rows\n .filter((row) => str(get(row, \"employee_id\")))\n .map((row) => {\n const salary = num(get(row, \"salary\"));\n const bonus = num(get(row, \"bonus\"));\n const totalCostRaw = num(get(row, \"total_cost\"));\n const name = str(get(row, \"employee_name\"));\n // Vacancy signaling (PRD position-vs-person): an explicit mapped status\n // column wins; otherwise an id-bearing row with NO name is a vacant\n // seat (how position-based HRIS exports represent open positions).\n // Named rows without a status stay filled — exactly as before.\n const posStatus = normalizePositionStatus(get(row, \"position_status\")) ?? (name ? undefined : \"vacant\");\n return {\n employee_id: str(get(row, \"employee_id\")),\n employee_name: name,\n role_title: str(get(row, \"role_title\")),\n manager_id: str(get(row, \"manager_id\")) || null,\n manager_name: str(get(row, \"manager_name\")) || undefined,\n department: str(get(row, \"department\")),\n function: str(get(row, \"function\")),\n business_unit: str(get(row, \"business_unit\")),\n location: str(get(row, \"location\")),\n country: str(get(row, \"country\")),\n grade: str(get(row, \"grade\")),\n level: num(get(row, \"level\")) || 0,\n employment_type: str(get(row, \"employment_type\")) || \"Full-time\",\n fte: num(get(row, \"fte\")) || 1,\n salary,\n bonus,\n total_cost: totalCostRaw || salary + bonus, // fall back to salary+bonus\n status: str(get(row, \"status\")) || \"Active\",\n position_status: posStatus === \"filled\" ? undefined : posStatus,\n tenure: get(row, \"tenure\") != null ? num(get(row, \"tenure\")) : undefined,\n gender: str(get(row, \"gender\")) || undefined,\n age_band: str(get(row, \"age_band\")) || undefined,\n performance_rating: str(get(row, \"performance_rating\")) || undefined,\n critical_role: get(row, \"critical_role\") != null ? bool(get(row, \"critical_role\")) : undefined,\n role_family: str(get(row, \"role_family\")) || undefined,\n cost_center: str(get(row, \"cost_center\")) || undefined,\n contract_type: str(get(row, \"contract_type\")) || undefined,\n remote_status: str(get(row, \"remote_status\")) || undefined,\n skills: str(get(row, \"skills\")) || undefined,\n attrition_risk: str(get(row, \"attrition_risk\")) || undefined,\n comments: str(get(row, \"comments\")) || undefined,\n };\n });\n}\n\n/**\n * Auto-map uploaded column names to canonical fields by fuzzy name match.\n *\n * `extraAliases` (e.g. from an HRIS import template) are merged with the\n * built-in ALIASES using the same normalization; where both could match,\n * the extra aliases take precedence — exact extra match, then exact\n * built-in, then fuzzy extra, then fuzzy built-in.\n */\nexport function autoMapColumns(\n columns: string[],\n fields: readonly string[],\n extraAliases?: Record<string, string[]>\n): Record<string, string | null> {\n const norm = (s: string) => s.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n const colNorm = columns.map((c) => ({ raw: c, norm: norm(c) }));\n const ALIASES: Record<string, string[]> = {\n employee_id: [\"empid\", \"id\", \"workerid\", \"personid\", \"employeenumber\"],\n employee_name: [\"name\", \"fullname\", \"employee\", \"workername\"],\n role_title: [\"title\", \"jobtitle\", \"position\", \"role\"],\n manager_id: [\"managerid\", \"supervisorid\", \"reportsto\", \"mgrid\"],\n manager_name: [\"manager\", \"supervisor\", \"mgrname\"],\n position_status: [\"positionstatus\", \"seatstatus\", \"vacancystatus\", \"vacancy\"],\n business_unit: [\"bu\", \"division\", \"businessarea\"],\n total_cost: [\"cost\", \"totalcomp\", \"totalcompensation\", \"fullycost\", \"loadedcost\"],\n employment_type: [\"emptype\", \"workertype\"],\n fte: [\"ftevalue\", \"workload\"],\n };\n const mapping: Record<string, string | null> = {};\n for (const field of fields) {\n const fNorm = norm(field);\n const base = [fNorm, ...(ALIASES[field] || []).map(norm)];\n const extra = (extraAliases?.[field] ?? []).map(norm).filter(Boolean);\n const exact = (aliases: string[]) => colNorm.find((c) => aliases.includes(c.norm));\n const fuzzy = (aliases: string[]) =>\n colNorm.find((c) => aliases.some((a) => c.norm.includes(a) || a.includes(c.norm)));\n const hit = exact(extra) || exact(base) || fuzzy(extra) || fuzzy(base);\n mapping[field] = hit?.raw ?? null;\n }\n return mapping;\n}\n","/**\n * Scenario engine.\n *\n * The baseline employee list is immutable. A Scenario is an ordered list of\n * ScenarioChange objects; `applyChanges(baseline, changes)` deterministically\n * replays them to produce the scenario's employee list. Undo = drop the last\n * change and replay. All metrics are recomputed from the derived list.\n */\nimport { computeMetrics } from \"./analytics\";\nimport { buildOrgTree, subtreeIds, wouldCreateCycle } from \"./hierarchy\";\nimport {\n Assumptions,\n ChangeRisk,\n Employee,\n OrgMetrics,\n positionStatus,\n Scenario,\n ScenarioChange,\n ScenarioEvaluation,\n ScenarioScore,\n} from \"./types\";\n\nexport interface ApplyResult {\n employees: Employee[];\n warnings: string[];\n}\n\n/** Replay a change list onto the baseline. Pure — returns a new array. */\nexport function applyChanges(baseline: Employee[], changes: ScenarioChange[]): ApplyResult {\n let employees = baseline.map((e) => ({ ...e }));\n const warnings: string[] = [];\n\n for (const change of changes) {\n const byId = new Map(employees.map((e) => [e.employee_id, e]));\n switch (change.type) {\n case \"move\": {\n const target = byId.get(change.employeeId);\n const newMgr = byId.get(change.newManagerId);\n if (!target || !newMgr) { warnings.push(`Move skipped: employee not found (${change.employeeId}).`); break; }\n const tree = buildOrgTree(employees);\n if (wouldCreateCycle(tree, change.employeeId, change.newManagerId)) {\n warnings.push(`Move skipped: moving ${target.employee_name} under ${newMgr.employee_name} would create a cycle.`);\n break;\n }\n target.manager_id = change.newManagerId;\n target.manager_name = newMgr.employee_name;\n break;\n }\n case \"remove_role\": {\n const target = byId.get(change.employeeId);\n if (!target) { warnings.push(`Remove skipped: ${change.employeeId} not found.`); break; }\n const newMgrId =\n change.reportsTo === \"specific\"\n ? change.newManagerId ?? target.manager_id\n : change.reportsTo === \"managers_manager\"\n ? target.manager_id\n : null;\n for (const e of employees) {\n if (e.manager_id === change.employeeId) {\n e.manager_id = newMgrId;\n e.manager_name = newMgrId ? byId.get(newMgrId)?.employee_name : undefined;\n if (!newMgrId) warnings.push(`${e.employee_name} is temporarily orphaned after removing ${target.employee_name}.`);\n }\n }\n employees = employees.filter((e) => e.employee_id !== change.employeeId);\n break;\n }\n case \"add_role\": {\n if (byId.has(change.employee.employee_id)) {\n warnings.push(`Add skipped: ID ${change.employee.employee_id} already exists.`);\n break;\n }\n employees.push({ ...change.employee });\n break;\n }\n case \"merge_teams\": {\n const source = byId.get(change.sourceManagerId);\n const target = byId.get(change.targetManagerId);\n if (!source || !target) { warnings.push(\"Merge skipped: manager not found.\"); break; }\n if (change.sourceManagerId === change.targetManagerId) {\n warnings.push(`Merge skipped: source and target manager are the same (${source.employee_name}).`);\n break;\n }\n // Reports of source move to target; source role is eliminated.\n for (const e of employees) {\n if (e.manager_id === change.sourceManagerId) {\n e.manager_id = change.targetManagerId;\n e.manager_name = target.employee_name;\n }\n }\n employees = employees.filter((e) => e.employee_id !== change.sourceManagerId);\n break;\n }\n case \"delayer\": {\n const tree = buildOrgTree(employees);\n const inScope = (e: Employee) =>\n change.scope.field === \"all\" ||\n (change.scope.field === \"function\" && e.function === change.scope.value) ||\n (change.scope.field === \"business_unit\" && e.business_unit === change.scope.value);\n // Managers at the target layer, in scope → removed; reports move to their manager.\n const toRemove = [...tree.nodes.values()].filter(\n (n) => n.layer === change.layer && n.isManager && inScope(n.employee)\n );\n if (toRemove.length === 0) { warnings.push(`Delayer: no managers found at layer ${change.layer} in scope.`); break; }\n const removeIds = new Set(toRemove.map((n) => n.employee.employee_id));\n for (const e of employees) {\n if (e.manager_id && removeIds.has(e.manager_id)) {\n const removedMgr = byId.get(e.manager_id)!;\n e.manager_id = removedMgr.manager_id;\n e.manager_name = removedMgr.manager_id ? byId.get(removedMgr.manager_id)?.employee_name : undefined;\n }\n }\n employees = employees.filter((e) => !removeIds.has(e.employee_id));\n break;\n }\n case \"location_shift\": {\n for (const id of change.employeeIds) {\n const e = byId.get(id);\n if (!e) continue;\n e.location = change.targetLocation;\n e.salary = Math.round(e.salary * change.costMultiplier);\n e.bonus = Math.round(e.bonus * change.costMultiplier);\n e.total_cost = Math.round(e.total_cost * change.costMultiplier);\n }\n break;\n }\n case \"cost_change\": {\n const e = byId.get(change.employeeId);\n if (!e) { warnings.push(`Cost change skipped: ${change.employeeId} not found.`); break; }\n e.total_cost = change.newTotalCost;\n break;\n }\n case \"fill_role\": {\n const e = byId.get(change.employeeId);\n if (!e) { warnings.push(`Fill seat skipped: ${change.employeeId} not found.`); break; }\n if (positionStatus(e) === \"filled\") {\n warnings.push(`Fill seat skipped: ${e.role_title || e.employee_id} is already filled.`);\n break;\n }\n e.position_status = \"filled\";\n if (change.employeeName.trim()) e.employee_name = change.employeeName.trim();\n break;\n }\n }\n }\n return { employees, warnings };\n}\n\n/** Employees whose manager changed or who were removed/added vs baseline. */\nexport function diffEmployees(baseline: Employee[], scenario: Employee[]) {\n const baseById = new Map(baseline.map((e) => [e.employee_id, e]));\n const scenById = new Map(scenario.map((e) => [e.employee_id, e]));\n const moved: Employee[] = [];\n const removed: Employee[] = [];\n const added: Employee[] = [];\n const costChanged: Employee[] = [];\n // Employees whose location differs vs baseline (scenario records). Note:\n // location-changed employees usually ALSO appear in costChanged (a location\n // shift changes cost) — consumers must treat the two sets disjointly.\n const locationChanged: Employee[] = [];\n // Seats unfilled in the baseline and filled in the scenario (scenario records).\n const seatsFilled: Employee[] = [];\n for (const e of baseline) {\n const s = scenById.get(e.employee_id);\n if (!s) removed.push(e);\n else {\n if (s.manager_id !== e.manager_id) moved.push(s);\n if (s.total_cost !== e.total_cost) costChanged.push(s);\n if (s.location !== e.location) locationChanged.push(s);\n if (positionStatus(e) !== \"filled\" && positionStatus(s) === \"filled\") seatsFilled.push(s);\n }\n }\n for (const e of scenario) if (!baseById.has(e.employee_id)) added.push(e);\n return { moved, removed, added, costChanged, locationChanged, seatsFilled };\n}\n\n// ---------------------------------------------------------------------------\n// Change Risk Model\n// ---------------------------------------------------------------------------\n\nexport function computeChangeRisk(\n baseline: Employee[],\n scenarioEmployees: Employee[],\n baselineMetrics: OrgMetrics,\n scenarioMetrics: OrgMetrics\n): ChangeRisk {\n const { moved, removed, added } = diffEmployees(baseline, scenarioEmployees);\n const headcount = Math.max(1, baseline.length);\n\n const seniorAffected = [...moved, ...removed].filter((e) => e.level <= 3).length;\n const criticalAffected = [...moved, ...removed].filter((e) => e.critical_role).length;\n const functionsImpacted = new Set([...moved, ...removed, ...added].map((e) => e.function)).size;\n const locationsImpacted = new Set([...moved, ...removed, ...added].map((e) => e.location)).size;\n const layerDelta = Math.abs(scenarioMetrics.maxLayers - baselineMetrics.maxLayers);\n const costDeltaPct = baselineMetrics.totalCost\n ? Math.abs(scenarioMetrics.totalCost - baselineMetrics.totalCost) / baselineMetrics.totalCost\n : 0;\n\n // Each factor contributes 0–N points; total normalized to 0–100.\n const factors = [\n { name: \"Employees moved\", value: moved.length, contribution: Math.min(25, (moved.length / headcount) * 120) },\n { name: \"Roles eliminated\", value: removed.length, contribution: Math.min(20, (removed.length / headcount) * 200) },\n { name: \"Senior leaders affected\", value: seniorAffected, contribution: Math.min(15, seniorAffected * 3) },\n { name: \"Critical roles affected\", value: criticalAffected, contribution: Math.min(15, criticalAffected * 5) },\n { name: \"Functions impacted\", value: functionsImpacted, contribution: Math.min(10, functionsImpacted * 1.5) },\n { name: \"Locations impacted\", value: locationsImpacted, contribution: Math.min(5, locationsImpacted * 1) },\n { name: \"Layer change\", value: layerDelta, contribution: Math.min(5, layerDelta * 2.5) },\n { name: \"Cost change\", value: `${(costDeltaPct * 100).toFixed(1)}%`, contribution: Math.min(5, costDeltaPct * 40) },\n ];\n const score = Math.min(100, Math.round(factors.reduce((a, f) => a + f.contribution, 0)));\n const level = score < 20 ? \"Low\" : score < 45 ? \"Medium\" : score < 70 ? \"High\" : \"Very High\";\n const recommendation = {\n Low: \"Suitable for quick implementation with standard communication.\",\n Medium: \"Requires stakeholder alignment and a clear communication plan.\",\n High: \"Requires a detailed change plan, consultation, and phased rollout.\",\n \"Very High\": \"Requires a phased transformation program with executive sponsorship and workforce consultation.\",\n }[level];\n\n return { level, score, factors, recommendation };\n}\n\n// ---------------------------------------------------------------------------\n// Transition cost model\n// ---------------------------------------------------------------------------\n\n/** Default effective month (April) when persisted assumptions predate the field. */\nexport const DEFAULT_EFFECTIVE_MONTH = 4;\n\n/**\n * Share (0–1) of the run-rate saving captured in year 1, derived from the\n * month the changes take effect: (12 − effectiveMonth + 1)/12. Month 1 →\n * full-year capture; month 12 → 1/12. Guards stale persisted assumptions\n * (missing/out-of-range months fall back to the default).\n */\nexport function year1CapturePct(assumptions: Assumptions): number {\n const raw = assumptions.transitionAssumptions?.effectiveMonth ?? DEFAULT_EFFECTIVE_MONTH;\n const month =\n Number.isFinite(raw) && raw >= 1 && raw <= 12 ? Math.round(raw) : DEFAULT_EFFECTIVE_MONTH;\n return (12 - month + 1) / 12;\n}\n\n/**\n * Severance-month multiplier for an employee's country (e.g. Germany 1.5).\n * Unknown country or missing map (stale persisted assumptions) → 1.\n */\nfunction severanceCountryMultiplier(\n country: string | undefined,\n assumptions: Assumptions\n): number {\n const map = assumptions.transitionAssumptions?.countrySeveranceMultipliers ?? {};\n const m = country ? map[country] : undefined;\n return typeof m === \"number\" && Number.isFinite(m) && m > 0 ? m : 1;\n}\n\n/** Severance entitlement (months of annualized cost) for a given level. */\nfunction severanceMonthsForLevel(level: number, assumptions: Assumptions): number {\n const bands = assumptions.transitionAssumptions.severanceMonthsByLevel;\n const sorted = [...bands].sort((a, b) => a.maxLevel - b.maxLevel);\n // Blank/0 level: default to the MOST generous (senior) band — conservative\n // direction, so unleveled employees never understate transition cost.\n const effectiveLevel = level > 0 ? level : 1;\n // Pick the entry with the smallest maxLevel >= level (most generous matching band).\n for (const b of sorted) {\n if (effectiveLevel <= b.maxLevel) return b.months;\n }\n return sorted.length ? sorted[sorted.length - 1].months : 0;\n}\n\n/**\n * One-time + ramp cost of executing a scenario, computed additively:\n * - severance: monthly cost (total_cost/12) × severance months, per removed role\n * (severance months are scaled by the employee country's severance multiplier)\n * - backfill drag: backfillPct% of removed-role cost (annualized hiring/ramp)\n * - change cost: oneTimeChangeCostPerMove × employees moved\n * - location shifts: treated conservatively as exit-and-rehire — severance on\n * the BASELINE cost + backfillPct% of baseline cost (hiring/ramp in the new\n * location) + oneTimeChangeCostPerMove, per location-changed employee\n * - cost changes without a location change: oneTimeChangeCostPerMove only\n * - seat fills: backfillPct% of the seat's budgeted cost (hiring/ramp drag)\n *\n * Position-vs-person: vacant/TBH seats have nobody in them, so changes to\n * unfilled seats move budget, not people — eliminating, moving or re-locating\n * an unfilled seat incurs NO severance, backfill or per-move cost.\n */\nexport function computeTransitionCost(\n baseline: Employee[],\n scenarioEmployees: Employee[],\n assumptions: Assumptions\n): number {\n const ta = assumptions.transitionAssumptions;\n const { moved, removed, costChanged, locationChanged, seatsFilled } = diffEmployees(\n baseline,\n scenarioEmployees\n );\n const baseById = new Map(baseline.map((e) => [e.employee_id, e]));\n const isFilled = (e: Employee | undefined) => !!e && positionStatus(e) === \"filled\";\n let severance = 0;\n let backfill = 0;\n for (const r of removed) {\n if (!isFilled(r)) continue; // eliminating an unfilled seat exits nobody\n const months =\n severanceMonthsForLevel(r.level, assumptions) * severanceCountryMultiplier(r.country, assumptions);\n severance += ((r.total_cost || 0) / 12) * months;\n backfill += ((r.total_cost || 0) * ta.backfillPct) / 100;\n }\n // Location shifts: exit-and-rehire on the BASELINE employee record (the\n // shifted record's cost already reflects the new location, so using it would\n // understate severance for offshoring moves). Unfilled seats re-budget only.\n const filledLocationChanged = locationChanged.filter((s) => isFilled(baseById.get(s.employee_id)));\n const locationChangedIds = new Set(locationChanged.map((e) => e.employee_id));\n for (const s of filledLocationChanged) {\n const base = baseById.get(s.employee_id);\n const baseCost = base?.total_cost || 0;\n const months =\n severanceMonthsForLevel(base?.level ?? 0, assumptions) *\n severanceCountryMultiplier(base?.country, assumptions);\n severance += (baseCost / 12) * months;\n backfill += (baseCost * ta.backfillPct) / 100;\n }\n // Filling a previously-unfilled seat is a hire: hiring/ramp drag at\n // backfillPct% of the seat's budgeted cost (designed cost is unchanged —\n // the seat was already budgeted).\n let hiring = 0;\n for (const f of seatsFilled) hiring += ((f.total_cost || 0) * ta.backfillPct) / 100;\n // Pure cost changes (no location change) incur the flat per-move cost only.\n // Disjoint from locationChanged: location-shifted employees also appear in\n // costChanged when their cost moved, so they are excluded here. Per-move\n // change cost applies to PEOPLE — unfilled-seat records are excluded.\n const costOnlyChanged = costChanged.filter(\n (e) => !locationChangedIds.has(e.employee_id) && isFilled(e)\n );\n const filledMoved = moved.filter((e) => isFilled(e));\n const changeCost =\n ta.oneTimeChangeCostPerMove *\n (filledMoved.length + filledLocationChanged.length + costOnlyChanged.length);\n return Math.round(severance + backfill + hiring + changeCost);\n}\n\n// ---------------------------------------------------------------------------\n// Scenario scoring — configurable weights\n// ---------------------------------------------------------------------------\n\nexport function scoreScenario(\n baselineMetrics: OrgMetrics,\n scenarioMetrics: OrgMetrics,\n risk: ChangeRisk,\n assumptions: Assumptions,\n changeCount: number,\n // Year-1 net saving (run-rate saving minus transition cost). Drives the\n // financial score. Defaults to gross run-rate saving when not provided.\n netYear1Saving?: number,\n // Total employees touched (moved + removed + added) — drives implementation ease.\n affectedEmployees?: number\n): ScenarioScore {\n const w = assumptions.scoringWeights;\n const costDelta = baselineMetrics.totalCost - scenarioMetrics.totalCost; // positive = saving\n // Financial score reflects net YEAR-1 saving (after transition cost), not gross.\n const netSaving = netYear1Saving ?? costDelta;\n const netPct = baselineMetrics.totalCost ? netSaving / baselineMetrics.totalCost : 0;\n // 0% net saving → 50; 10% net saving → 100; net cost increase reduces below 50.\n const financial = clamp(50 + netPct * 500);\n\n const narrowDelta = baselineMetrics.narrowSpanPct - scenarioMetrics.narrowSpanPct;\n const wideDelta = baselineMetrics.wideSpanPct - scenarioMetrics.wideSpanPct;\n const spanImprovement = clamp(50 + narrowDelta * 250 + wideDelta * 150);\n\n const layerDelta = baselineMetrics.maxLayers - scenarioMetrics.maxLayers;\n const layerReduction = clamp(50 + layerDelta * 20);\n\n const mgrRatioDelta = baselineMetrics.managerRatio - scenarioMetrics.managerRatio;\n const dupDelta = baselineMetrics.duplicateRoleCost - scenarioMetrics.duplicateRoleCost;\n const complexity = clamp(\n 50 + mgrRatioDelta * 400 + (baselineMetrics.totalCost ? (dupDelta / baselineMetrics.totalCost) * 800 : 0)\n );\n\n const changeRiskScore = clamp(100 - risk.score); // lower risk = higher score\n // Ease reflects the size of the population touched, not how many granular\n // change objects were authored (so modelling precision is not penalized).\n // `changeCount` is retained for API stability but no longer scored.\n void changeCount;\n const affected = affectedEmployees ?? 0;\n const implementationEase = clamp(100 - Math.min(40, affected * 0.8) - risk.score * 0.3);\n\n const categories = [\n { name: \"Financial impact\", score: Math.round(financial), weight: w.financialImpact },\n { name: \"Span improvement\", score: Math.round(spanImprovement), weight: w.spanImprovement },\n { name: \"Layer reduction\", score: Math.round(layerReduction), weight: w.layerReduction },\n { name: \"Operational simplicity\", score: Math.round(complexity), weight: w.complexityReduction },\n { name: \"People / change risk\", score: Math.round(changeRiskScore), weight: w.changeRisk },\n { name: \"Speed to execute\", score: Math.round(implementationEase), weight: w.implementationEase },\n ];\n const totalWeight = categories.reduce((a, c) => a + c.weight, 0) || 1;\n const total = Math.round(categories.reduce((a, c) => a + (c.score * c.weight) / totalWeight, 0));\n return { total, categories };\n}\n\nfunction clamp(v: number): number {\n return Math.max(0, Math.min(100, v));\n}\n\n// ---------------------------------------------------------------------------\n// Full evaluation\n// ---------------------------------------------------------------------------\n\nexport function evaluateScenario(\n baseline: Employee[],\n scenario: Scenario,\n baselineMetrics: OrgMetrics,\n assumptions: Assumptions\n): ScenarioEvaluation {\n const { employees } = applyChanges(baseline, scenario.changes);\n const metrics = computeMetrics(employees, assumptions);\n const risk = computeChangeRisk(baseline, employees, baselineMetrics, metrics);\n const { moved, removed, added, seatsFilled } = diffEmployees(baseline, employees);\n\n const costDelta = metrics.totalCost - baselineMetrics.totalCost;\n const runRateSaving = -costDelta; // positive = steady-state annual saving\n const transitionCost = computeTransitionCost(baseline, employees, assumptions);\n // Year 1 only captures the post-effective-month share of the run-rate.\n const capturePct = year1CapturePct(assumptions);\n const netYear1Saving = runRateSaving * capturePct - transitionCost;\n const affectedEmployees = moved.length + removed.length + added.length + seatsFilled.length;\n const vacantSeatsRemoved = removed.filter((r) => positionStatus(r) !== \"filled\").length;\n\n const score = scoreScenario(\n baselineMetrics,\n metrics,\n risk,\n assumptions,\n scenario.changes.length,\n netYear1Saving,\n affectedEmployees\n );\n return {\n scenarioId: scenario.id,\n metrics,\n risk,\n score,\n costDelta,\n headcountDelta: metrics.headcount - baselineMetrics.headcount,\n layerDelta: metrics.maxLayers - baselineMetrics.maxLayers,\n employeesMoved: moved.length,\n rolesRemoved: removed.length,\n rolesAdded: added.length,\n transitionCost,\n netYear1Saving,\n runRateSaving,\n year1CapturePct: capturePct,\n vacantSeatsRemoved,\n seatsFilled: seatsFilled.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Suggested actions (used by scenario workspace + cost reduction)\n// ---------------------------------------------------------------------------\n\nexport interface SuggestedAction {\n change: ScenarioChange;\n rationale: string;\n estimatedSaving: number;\n}\n\n/** Rule-based consolidation suggestions: merge narrow-span managers into peers. */\nexport function suggestConsolidations(\n employees: Employee[],\n assumptions: Assumptions,\n scopeFunction?: string\n): SuggestedAction[] {\n const tree = buildOrgTree(employees);\n const out: SuggestedAction[] = [];\n const nodes = [...tree.nodes.values()].filter((n) => n.layer > 1);\n\n const narrowMgrs = nodes.filter(\n (n) =>\n n.isManager &&\n n.span < assumptions.narrowSpanThreshold &&\n n.span <= 2 &&\n (!scopeFunction || n.employee.function === scopeFunction)\n );\n const isSensitive = (e: Employee) => !!e.critical_role || e.attrition_risk === \"High\";\n for (const mgr of narrowMgrs) {\n // Find a peer manager (same parent, same function) with capacity\n const parent = mgr.employee.manager_id ? tree.nodes.get(mgr.employee.manager_id) : undefined;\n if (!parent) continue;\n const peers = parent.directReports\n .map((id) => tree.nodes.get(id)!)\n .filter(\n (p) =>\n p.employee.employee_id !== mgr.employee.employee_id &&\n p.isManager &&\n p.span + mgr.span <= assumptions.wideSpanThreshold &&\n p.employee.function === mgr.employee.function\n )\n // Prefer peers without High attrition risk as the absorbing target.\n .sort((a, b) => {\n const aRisk = a.employee.attrition_risk === \"High\" ? 1 : 0;\n const bRisk = b.employee.attrition_risk === \"High\" ? 1 : 0;\n if (aRisk !== bRisk) return aRisk - bRisk;\n return a.span - b.span;\n });\n const target = peers[0] ?? parent;\n let rationale = `${mgr.employee.employee_name} (${mgr.employee.role_title}) manages only ${mgr.span} ${mgr.span === 1 ? \"person\" : \"people\"} — below the ${assumptions.narrowSpanThreshold}-report threshold.`;\n const flags: string[] = [];\n if (mgr.employee.critical_role) flags.push(\"flagged as a critical role\");\n if (mgr.employee.attrition_risk === \"High\") flags.push(\"at high attrition risk\");\n if (flags.length) {\n rationale += ` Caution: this manager is ${flags.join(\" and \")} — validate retention/continuity impact before acting (de-prioritized).`;\n }\n out.push({\n change: {\n type: \"merge_teams\",\n sourceManagerId: mgr.employee.employee_id,\n targetManagerId: target.employee.employee_id,\n description: `Merge ${mgr.employee.employee_name}'s team (${mgr.span} report${mgr.span === 1 ? \"\" : \"s\"}) into ${target.employee.employee_name}`,\n },\n rationale,\n estimatedSaving: mgr.employee.total_cost,\n });\n }\n // Rank sensitive (critical / high-attrition) managers last, otherwise by saving.\n return out.sort((a, b) => {\n const aMgr = tree.nodes.get(a.change.type === \"merge_teams\" ? a.change.sourceManagerId : \"\")?.employee;\n const bMgr = tree.nodes.get(b.change.type === \"merge_teams\" ? b.change.sourceManagerId : \"\")?.employee;\n const aSens = aMgr && isSensitive(aMgr) ? 1 : 0;\n const bSens = bMgr && isSensitive(bMgr) ? 1 : 0;\n if (aSens !== bSens) return aSens - bSens;\n return b.estimatedSaving - a.estimatedSaving;\n });\n}\n\n/** Suggest team members for a location shift (whole subtree of a manager). */\nexport function teamMemberIds(employees: Employee[], managerId: string, includeManager = true): string[] {\n const tree = buildOrgTree(employees);\n const ids = subtreeIds(tree, managerId);\n return includeManager ? ids : ids.filter((id) => id !== managerId);\n}\n","/**\n * Insights engine — deterministic, rule-based consulting-style insights.\n *\n * AI-ready architecture: `generateInsights(data, assumptions, scenario?)` is\n * the single entry point. An LLM-backed generator can later implement the same\n * signature and be swapped in (or merged) without touching any UI component.\n * No insight text lives in components.\n */\nimport { computeMetrics } from \"./analytics\";\nimport { buildOrgTree } from \"./hierarchy\";\nimport { Assumptions, Employee, Insight, OrgMetrics, ScenarioEvaluation } from \"./types\";\nimport { fmtMoney, fmtPct, sortedEntries } from \"./utils\";\n\nlet seq = 0;\nfunction insight(partial: Omit<Insight, \"id\">): Insight {\n seq += 1;\n return { id: `ins_${seq}`, ...partial };\n}\n\nexport interface InsightContext {\n employees: Employee[];\n metrics: OrgMetrics;\n assumptions: Assumptions;\n scenarioEvaluations?: { name: string; evaluation: ScenarioEvaluation }[];\n}\n\nexport function generateInsights(ctx: InsightContext): Insight[] {\n const { metrics: m, assumptions: a, employees } = ctx;\n const sym = a.currencySymbol;\n const out: Insight[] = [];\n const tree = buildOrgTree(employees);\n if (m.headcount === 0) return [];\n\n const bench = a.benchmarkLayersForSize.find((b) => m.headcount <= b.maxHeadcount)?.layers ?? 8;\n\n // ---- Layer insights ----\n if (m.maxLayers > bench) {\n out.push(\n insight({\n title: `Organization has ${m.maxLayers} layers — ${m.maxLayers - bench} above benchmark`,\n severity: m.maxLayers - bench >= 2 ? \"high\" : \"medium\",\n category: \"layer\",\n evidence: `The deepest reporting chain runs ${m.maxLayers} layers from CEO to frontline. For an organization of ${m.headcount} employees, a typical benchmark is ~${bench} layers.`,\n impact: \"Excess layers slow decision-making, dilute accountability and add management cost.\",\n recommendation: `Review the deepest chains (Diagnostics → deepest chains) and test a delayering scenario targeting layer ${Math.max(3, m.maxLayers - 2)}–${m.maxLayers - 1} in the most layered functions.`,\n relatedEntities: m.deepestChains[0]?.ids ?? [],\n financialImpact: m.delayeringOpportunity,\n employeesAffected: m.deepestChains[0]?.ids.length ?? 0,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/diagnostics\",\n })\n );\n }\n // Most layered functions\n for (const [func, layers] of sortedEntries(m.layersByFunction).slice(0, 2)) {\n if (layers > bench - 1 && func !== \"(blank)\") {\n out.push(\n insight({\n title: `${func} spans ${layers} internal layers — the most layered function`,\n severity: layers >= bench ? \"high\" : \"medium\",\n category: \"layer\",\n evidence: `${func} has ${layers} layers internally with ${m.headcountByFunction[func] ?? 0} employees and ${fmtMoney(m.costByFunction[func] ?? 0, sym)} total cost.`,\n impact: \"Deep functional hierarchies create approval bottlenecks and fragmented spans.\",\n recommendation: `Run a delayering scenario scoped to ${func} and compare before/after spans.`,\n relatedEntities: [func],\n financialImpact: 0,\n employeesAffected: m.headcountByFunction[func] ?? 0,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/diagnostics\",\n })\n );\n }\n }\n if (m.deepestChains[0]) {\n const chain = m.deepestChains[0];\n const top = tree.nodes.get(chain.ids[1] ?? chain.ids[0]);\n out.push(\n insight({\n title: `Deepest reporting chain has ${chain.depth} layers${top ? ` under ${top.employee.role_title}` : \"\"}`,\n severity: chain.depth > bench ? \"medium\" : \"low\",\n category: \"structure\",\n evidence: `The longest path from the CEO to the frontline passes through ${chain.depth - 1} managers: ${chain.ids.map((id) => tree.nodes.get(id)?.employee.role_title ?? id).slice(0, 5).join(\" → \")}${chain.depth > 5 ? \" → …\" : \"\"}.`,\n impact: \"Long chains mean frontline information passes through many filters before reaching leadership.\",\n recommendation: \"Validate whether each intermediate manager adds distinct decision rights.\",\n relatedEntities: chain.ids,\n financialImpact: 0,\n employeesAffected: chain.ids.length,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/org\",\n })\n );\n }\n\n // ---- Span insights ----\n if (m.narrowSpanPct > 0.25) {\n const tiny = m.spanBuckets.find((b) => b.label === \"1–2\");\n out.push(\n insight({\n title: `${fmtPct(m.narrowSpanPct)} of managers fall below their level's target span band`,\n severity: m.narrowSpanPct > 0.4 ? \"high\" : \"medium\",\n category: \"span\",\n evidence: `${m.narrowSpanManagers.length} of ${m.managerCount} managers fall below the target span band for their level (bands are set per level in Settings; the flat ${a.narrowSpanThreshold}-report threshold applies as fallback for unleveled employees); ${tiny?.count ?? 0} manage only 1–2 people. Combined cost of narrow-span managers: ${fmtMoney(m.narrowSpanCost, sym)}.`,\n impact: \"Fragmented spans suggest management capacity is underused and layers may be redundant.\",\n recommendation: \"Use Scenario Modelling → Apply Target Spans to generate consolidation options for review.\",\n relatedEntities: m.narrowSpanManagers.slice(0, 10),\n financialImpact: m.delayeringOpportunity,\n employeesAffected: m.narrowSpanManagers.length,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/diagnostics\",\n })\n );\n }\n if (m.wideSpanManagers.length > 0) {\n const widest = m.wideSpanManagers\n .map((id) => tree.nodes.get(id)!)\n .sort((x, y) => y.span - x.span)[0];\n out.push(\n insight({\n title: `${m.wideSpanManagers.length} manager(s) exceed their level's target span band (max ${a.wideSpanThreshold} for unleveled roles)`,\n severity: widest.span >= a.wideSpanThreshold + 4 ? \"high\" : \"medium\",\n category: \"span\",\n evidence: `The widest span is ${widest.span} reports (${widest.employee.employee_name}, ${widest.employee.role_title}, ${widest.employee.function}). Target span bands are set per level in Settings; the flat ${a.wideSpanThreshold}-report ceiling applies as fallback for unleveled employees.`,\n impact: \"Overloaded managers risk supervision gaps, slower coaching and attrition in their teams.\",\n recommendation: \"Consider splitting overloaded teams or adding a team-lead level only where supervision genuinely requires it.\",\n relatedEntities: m.wideSpanManagers,\n financialImpact: 0,\n employeesAffected: m.wideSpanManagers.length,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/diagnostics\",\n })\n );\n }\n\n // ---- Manager-of-one (flattening playbook) ----\n if (m.managerOfOneCount >= 2) {\n const m1Nodes = [...tree.nodes.values()].filter((n) => n.isManagerOfOne);\n const m1Cost = m1Nodes.reduce((s2, n) => s2 + (n.employee.total_cost || 0), 0);\n const share = m.managerCount ? m.managerOfOneCount / m.managerCount : 0;\n out.push(\n insight({\n title: `${m.managerOfOneCount} \"manager of one\" roles each oversee a single report`,\n severity: share > 0.15 ? \"high\" : \"medium\",\n category: \"span\",\n evidence: `${m.managerOfOneCount} of ${m.managerCount} managers (${fmtPct(share)}) have exactly one direct report, with combined cost ${fmtMoney(m1Cost, sym)}. Single-report management layers are a primary target in 2025–26 flattening playbooks.`,\n impact: \"A manager with one report usually adds a hand-off and an approval step without widening coordination — a candidate to flatten by merging the role into player-coach or peer structures.\",\n recommendation: \"Review each manager-of-one: convert to an individual contributor / player-coach, or consolidate the pair under a peer manager. Validate against development and succession intent before acting.\",\n relatedEntities: m1Nodes.map((n) => n.employee.employee_id).slice(0, 15),\n financialImpact: m.spanOptimizationOpportunity,\n employeesAffected: m.managerOfOneCount,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/diagnostics\",\n })\n );\n }\n\n // ---- Pure supervisory (pass-through) layers ----\n if (m.pureSupervisoryLayers.length > 0) {\n const layersList = m.pureSupervisoryLayers.join(\", \");\n const passThruNodes = [...tree.nodes.values()].filter(\n (n) => m.pureSupervisoryLayers.includes(n.layer) && n.isManager\n );\n const passCost = passThruNodes.reduce((s2, n) => s2 + (n.employee.total_cost || 0), 0);\n out.push(\n insight({\n title: `Layer${m.pureSupervisoryLayers.length > 1 ? \"s\" : \"\"} ${layersList} ${m.pureSupervisoryLayers.length > 1 ? \"are\" : \"is\"} purely supervisory (managers managing managers)`,\n severity: \"medium\",\n category: \"layer\",\n evidence: `Every role at layer ${layersList} is a manager whose direct reports are all themselves managers — a management-only pass-through with no ICs (${passThruNodes.length} role(s), ${fmtMoney(passCost, sym)} cost).`,\n impact: \"Pass-through layers add escalation distance and dilute accountability without owning delivery work.\",\n recommendation: \"Test a delayering scenario targeting these layers; confirm each retained layer holds distinct decision rights.\",\n relatedEntities: passThruNodes.map((n) => n.employee.employee_id).slice(0, 15),\n financialImpact: 0,\n employeesAffected: passThruNodes.length,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/diagnostics\",\n })\n );\n }\n\n // ---- AI-augmentation lens ----\n const aiHigh = m.aiExposure.find((b) => b.band === \"high\");\n if (aiHigh && m.totalCost > 0 && aiHigh.cost / m.totalCost > 0.1) {\n const costShare = aiHigh.cost / m.totalCost;\n out.push(\n insight({\n title: `${fmtPct(costShare)} of workforce cost sits in roles with high AI-augmentation potential`,\n severity: costShare > 0.25 ? \"high\" : \"medium\",\n category: \"cost\",\n evidence: `${aiHigh.headcount} role(s) (${fmtMoney(aiHigh.cost, sym)}) fall in the high AI-augmentation band — predominantly processing, support, coordination and analytical work. Banding is heuristic and indicative.`,\n impact: \"High-augmentation work is where AI-enabled productivity and role redesign can compound — but augmentation is not elimination; the lens is about reshaping work, not headcount cuts.\",\n recommendation: \"Run a role-level assessment for the high-band population: identify tasks suited to augmentation, redesign workflows, and reinvest freed capacity. Treat as a productivity/redesign opportunity requiring validation, not an automatic reduction.\",\n relatedEntities: [],\n financialImpact: 0,\n employeesAffected: aiHigh.headcount,\n confidence: \"low\",\n easeOfAction: \"hard\",\n linkTo: \"/cost\",\n })\n );\n }\n\n // ---- Position-vs-person: designed vs run-rate cost gap ----\n if (m.totalCost > 0 && m.unfilledSeatCost / m.totalCost >= 0.03) {\n const gapShare = m.unfilledSeatCost / m.totalCost;\n out.push(\n insight({\n title: `Designed cost runs ${fmtMoney(m.unfilledSeatCost, sym)} above current run-rate — ${m.unfilledSeats} unfilled seat${m.unfilledSeats === 1 ? \"\" : \"s\"}`,\n severity: gapShare >= 0.08 ? \"high\" : \"medium\",\n category: \"cost\",\n evidence: `${m.unfilledSeats} budgeted seat${m.unfilledSeats === 1 ? \" is\" : \"s are\"} vacant or to-be-hired (${m.vacantSeats} vacant, ${m.tbhSeats} TBH), carrying ${fmtMoney(m.unfilledSeatCost, sym)} of budgeted cost — ${fmtPct(gapShare)} of the ${fmtMoney(m.totalCost, sym)} designed cost base. Run-rate today is ${fmtMoney(m.runRateCost, sym)}.`,\n impact: \"Every unfilled seat is a pending cost commitment. Closing vacancies instead of filling them avoids future cost with zero severance — the cheapest restructuring lever available.\",\n recommendation: \"Review each open seat against the target structure before recruiting: model a scenario eliminating the vacancies that the future design doesn't need.\",\n relatedEntities: employees.filter((e) => (e.position_status === \"vacant\" || e.position_status === \"tbh\")).map((e) => e.employee_id).slice(0, 15),\n financialImpact: m.unfilledSeatCost,\n employeesAffected: m.unfilledSeats,\n confidence: \"high\",\n easeOfAction: \"easy\",\n linkTo: \"/scenarios\",\n })\n );\n }\n\n // ---- Position-vs-person: vacancy concentration by function ----\n if (m.vacancyRate > 0) {\n const concentrated = Object.entries(m.unfilledByFunction)\n .map(([func, count]) => ({\n func,\n count,\n rate: count / Math.max(1, m.headcountByFunction[func] ?? 0),\n }))\n .filter((f) => f.count >= 3 && f.rate >= m.vacancyRate * 2)\n .sort((x, y) => y.count - x.count)[0];\n if (concentrated) {\n out.push(\n insight({\n title: `${concentrated.func} concentrates ${concentrated.count} of the organization's ${m.unfilledSeats} unfilled seats`,\n severity: concentrated.rate >= 0.25 ? \"high\" : \"medium\",\n category: \"structure\",\n evidence: `${fmtPct(concentrated.rate)} of ${concentrated.func}'s ${m.headcountByFunction[concentrated.func] ?? 0} seats are vacant or to-be-hired, versus ${fmtPct(m.vacancyRate)} organization-wide.`,\n impact: \"Concentrated vacancy signals either acute hiring exposure (delivery risk in that function) or phantom structure — seats budgeted for an organization that no longer matches the plan.\",\n recommendation: `Validate ${concentrated.func}'s open seats with its leadership: confirm which are genuinely needed in the target design, then either prioritize the hires or model eliminating the remainder.`,\n relatedEntities: [concentrated.func],\n financialImpact: 0,\n employeesAffected: concentrated.count,\n confidence: \"high\",\n easeOfAction: \"moderate\",\n linkTo: \"/org\",\n })\n );\n }\n }\n\n // ---- Cost / management burden ----\n const avgMgmtRatio = m.managementCostRatio;\n const funcMgmtRatios: [string, number][] = [];\n for (const func of Object.keys(m.costByFunction)) {\n const funcNodes = [...tree.nodes.values()].filter((n) => n.layer > 0 && n.employee.function === func);\n const funcCost = funcNodes.reduce((s2, n) => s2 + (n.employee.total_cost || 0), 0);\n const funcMgmt = funcNodes.filter((n) => n.isManager).reduce((s2, n) => s2 + (n.employee.total_cost || 0), 0);\n if (funcCost > 0 && funcNodes.length >= 5) funcMgmtRatios.push([func, funcMgmt / funcCost]);\n }\n funcMgmtRatios.sort((x, y) => y[1] - x[1]);\n if (funcMgmtRatios[0] && funcMgmtRatios[0][1] > avgMgmtRatio + 0.08) {\n const [func, ratio] = funcMgmtRatios[0];\n out.push(\n insight({\n title: `${func} has the highest management cost ratio at ${fmtPct(ratio)}`,\n severity: ratio > 0.45 ? \"high\" : \"medium\",\n category: \"cost\",\n evidence: `${fmtPct(ratio)} of ${func}'s cost sits with people managers, versus a company average of ${fmtPct(avgMgmtRatio)}.`,\n impact: \"A high management cost share can indicate over-layering or narrow spans within the function.\",\n recommendation: `Review ${func}'s structure in the Org Explorer and test span/layer scenarios.`,\n relatedEntities: [func],\n financialImpact: (ratio - avgMgmtRatio) * (m.costByFunction[func] ?? 0),\n employeesAffected: m.headcountByFunction[func] ?? 0,\n confidence: \"medium\",\n easeOfAction: \"moderate\",\n linkTo: \"/cost\",\n })\n );\n }\n const topFunc = sortedEntries(m.costByFunction)[0];\n if (topFunc) {\n out.push(\n insight({\n title: `${topFunc[0]} is the highest-cost function at ${fmtMoney(topFunc[1], sym)}`,\n severity: \"low\",\n category: \"cost\",\n evidence: `${topFunc[0]} accounts for ${fmtPct(topFunc[1] / m.totalCost)} of total workforce cost with ${m.headcountByFunction[topFunc[0]] ?? 0} employees.`,\n impact: \"Cost concentration identifies where structural decisions have the largest financial leverage.\",\n recommendation: \"Prioritize this function when evaluating delayering and span scenarios.\",\n relatedEntities: [topFunc[0]],\n financialImpact: 0,\n employeesAffected: m.headcountByFunction[topFunc[0]] ?? 0,\n confidence: \"high\",\n easeOfAction: \"easy\",\n linkTo: \"/cost\",\n })\n );\n }\n\n // ---- Duplication ----\n if (m.duplicateRoles.length > 0) {\n const top = m.duplicateRoles[0];\n out.push(\n insight({\n title: `${m.duplicateRoles.length} potential duplicate senior role group(s) across business units`,\n severity: m.duplicateRoleCost > m.totalCost * 0.02 ? \"high\" : \"medium\",\n category: \"duplication\",\n evidence: `Largest group: \"${top.employees[0].title}\" held by ${top.employees.length} people across ${top.units.join(\", \")} (combined cost ${fmtMoney(top.totalCost, sym)}). Total cost of potential duplicates beyond one holder per group: ${fmtMoney(m.duplicateRoleCost, sym)}.`,\n impact: \"Duplicated leadership roles across units may indicate decentralization without deliberate design.\",\n recommendation: \"Mark as potential duplication requiring review — consider a shared-services scenario to test consolidation. Duplication is not automatically bad; validate with business owners.\",\n relatedEntities: m.duplicateRoles.flatMap((g) => g.employees.map((e) => e.id)).slice(0, 15),\n financialImpact: m.duplicationOpportunity,\n employeesAffected: m.duplicateRoles.reduce((s2, g) => s2 + g.employees.length, 0),\n confidence: \"medium\",\n easeOfAction: \"hard\",\n linkTo: \"/insights\",\n })\n );\n }\n\n // ---- Senior ICs reporting to executives ----\n const execNodes = [...tree.nodes.values()].filter((n) => n.layer <= 2 && n.isManager);\n const seniorIcs = execNodes.flatMap((ex) =>\n ex.directReports\n .map((id) => tree.nodes.get(id)!)\n .filter((n) => !n.isManager && (n.employee.total_cost || 0) > 350000)\n );\n if (seniorIcs.length >= 2) {\n const totalIcCost = seniorIcs.reduce((s2, n) => s2 + n.employee.total_cost, 0);\n out.push(\n insight({\n title: `${seniorIcs.length} expensive individual contributors report directly to executives`,\n severity: \"medium\",\n category: \"structure\",\n evidence: `${seniorIcs.length} ICs costing over ${fmtMoney(350000, sym)} each (combined ${fmtMoney(totalIcCost, sym)}) sit at executive level: ${seniorIcs.slice(0, 3).map((n) => n.employee.role_title).join(\"; \")}.`,\n impact: \"Senior IC roles at the top consume executive attention and can blur accountability for delivery.\",\n recommendation: \"Validate the mandate of each senior advisory role; consider anchoring them within functions.\",\n relatedEntities: seniorIcs.map((n) => n.employee.employee_id),\n financialImpact: 0,\n employeesAffected: seniorIcs.length,\n confidence: \"medium\",\n easeOfAction: \"easy\",\n linkTo: \"/org\",\n })\n );\n }\n\n // ---- Location insights ----\n const locEntries = sortedEntries(m.costByLocation);\n if (locEntries.length >= 2) {\n const hqLoc = locEntries[0];\n const avgCostByLoc = Object.entries(m.costByLocation).map(([loc, cost]) => ({\n loc,\n avg: cost / Math.max(1, m.headcountByLocation[loc] ?? 1),\n hc: m.headcountByLocation[loc] ?? 0,\n }));\n avgCostByLoc.sort((x, y) => y.avg - x.avg);\n const high = avgCostByLoc[0];\n const low = avgCostByLoc[avgCostByLoc.length - 1];\n if (high && low && high.avg > low.avg * 2 && low.hc >= 5) {\n out.push(\n insight({\n title: `Average cost per head in ${high.loc} is ${(high.avg / low.avg).toFixed(1)}× ${low.loc}`,\n severity: \"low\",\n category: \"location\",\n evidence: `${high.loc}: ${fmtMoney(high.avg, sym)}/head across ${high.hc} employees vs ${low.loc}: ${fmtMoney(low.avg, sym)}/head across ${low.hc}. ${hqLoc[0]} carries the largest absolute cost (${fmtMoney(hqLoc[1], sym)}).`,\n impact: \"Location mix is a structural cost lever, particularly for transactional and delivery roles.\",\n recommendation: \"Test a location-shift scenario for portable role families. Requires validation against service, regulatory and talent constraints.\",\n relatedEntities: [high.loc, low.loc],\n financialImpact: 0,\n employeesAffected: high.hc,\n confidence: \"medium\",\n easeOfAction: \"hard\",\n linkTo: \"/scenarios\",\n })\n );\n }\n }\n\n // ---- Grade pyramid ----\n const gradeCounts = sortedEntries(m.headcountByGrade);\n const seniorShare =\n (m.headcountByGrade[\"E1\"] ?? 0) + (m.headcountByGrade[\"E2\"] ?? 0) + (m.headcountByGrade[\"M1\"] ?? 0);\n if (m.headcount > 0 && seniorShare / m.headcount > 0.12 && gradeCounts.length >= 4) {\n out.push(\n insight({\n title: `Senior grades represent ${fmtPct(seniorShare / m.headcount)} of headcount — top-heavy pyramid`,\n severity: \"medium\",\n category: \"grade\",\n evidence: `${seniorShare} employees sit in the top three grades out of ${m.headcount} total.`,\n impact: \"A top-heavy grade mix inflates cost and can compress development paths for mid-level talent.\",\n recommendation: \"Review the grade pyramid in Cost Analytics and validate spans at senior grades.\",\n relatedEntities: [\"E1\", \"E2\", \"M1\"],\n financialImpact: 0,\n employeesAffected: seniorShare,\n confidence: \"medium\",\n easeOfAction: \"hard\",\n linkTo: \"/cost\",\n })\n );\n }\n\n // ---- Risk: overloaded + high attrition ----\n const overloadedHighRisk = m.wideSpanManagers\n .map((id) => tree.nodes.get(id)!)\n .filter((n) => n.directReports.some((rid) => tree.nodes.get(rid)?.employee.attrition_risk === \"High\"));\n if (overloadedHighRisk.length > 0) {\n out.push(\n insight({\n title: `Overloaded teams contain high attrition-risk employees`,\n severity: \"high\",\n category: \"risk\",\n evidence: `${overloadedHighRisk.length} overloaded manager(s) have direct reports flagged high attrition risk (e.g. ${overloadedHighRisk[0].employee.employee_name}'s team of ${overloadedHighRisk[0].span}).`,\n impact: \"Wide spans plus attrition risk compound: less manager attention precisely where retention is fragile.\",\n recommendation: \"Prioritize span relief for these teams before broader restructuring.\",\n relatedEntities: overloadedHighRisk.map((n) => n.employee.employee_id),\n financialImpact: 0,\n employeesAffected: overloadedHighRisk.reduce((s2, n) => s2 + n.span, 0),\n confidence: \"medium\",\n easeOfAction: \"moderate\",\n linkTo: \"/diagnostics\",\n })\n );\n }\n\n // ---- Opportunity summary (executive) ----\n if (m.totalOpportunity > 0) {\n out.push(\n insight({\n title: `Indicative simplification opportunity of ${fmtMoney(m.totalOpportunity, sym)}`,\n severity: m.totalOpportunity > m.totalCost * 0.03 ? \"high\" : \"medium\",\n category: \"executive\",\n evidence: `Composed of three levers: delayering of narrow-span managers with 3+ reports (${fmtMoney(m.delayeringOpportunity, sym)}), span optimization of managers with only 1–2 reports who could be ICs (${fmtMoney(m.spanOptimizationOpportunity, sym)}) and duplicate-role consolidation (${fmtMoney(m.duplicationOpportunity, sym)}). The two span levers are disjoint (no manager counted in both); duplication is a separate lens that may overlap with delayering. Based on configurable assumptions (${a.delayeringSavingPct}% / ${a.duplicateRoleSavingPct}% capture rates, ${a.spanOptPremiumPct ?? 20}% management premium).`,\n impact: `Equivalent to ${fmtPct(m.totalOpportunity / m.totalCost)} of total workforce cost. Indicative only — requires validation through detailed design.`,\n recommendation: \"Build 2–3 scenarios capturing different portions of this opportunity and compare them in From-To Comparison.\",\n relatedEntities: [],\n financialImpact: m.totalOpportunity,\n employeesAffected: m.narrowSpanManagers.length,\n confidence: \"medium\",\n easeOfAction: \"moderate\",\n linkTo: \"/scenarios\",\n })\n );\n }\n\n // ---- Scenario insights ----\n for (const { name, evaluation: ev } of ctx.scenarioEvaluations ?? []) {\n const saving = -ev.costDelta;\n out.push(\n insight({\n title: `Scenario \"${name}\": ${saving >= 0 ? `${fmtMoney(saving, sym)} indicative saving` : `${fmtMoney(-saving, sym)} cost increase`}, ${ev.layerDelta === 0 ? \"no layer change\" : `${Math.abs(ev.layerDelta)} layer${Math.abs(ev.layerDelta) > 1 ? \"s\" : \"\"} ${ev.layerDelta < 0 ? \"removed\" : \"added\"}`}`,\n severity: ev.risk.level === \"High\" || ev.risk.level === \"Very High\" ? \"medium\" : \"low\",\n category: \"scenario\",\n evidence: `Headcount ${ev.headcountDelta >= 0 ? \"+\" : \"\"}${ev.headcountDelta}; ${ev.employeesMoved} moved, ${ev.rolesRemoved} roles removed, ${ev.rolesAdded} added. Change risk: ${ev.risk.level} (${ev.risk.score}/100). Scenario score: ${ev.score.total}/100.`,\n impact: ev.risk.recommendation,\n recommendation: `Compare against other options in From-To Comparison before committing.`,\n relatedEntities: [],\n financialImpact: Math.max(0, saving),\n employeesAffected: ev.employeesMoved + ev.rolesRemoved,\n confidence: \"high\",\n easeOfAction: ev.risk.level === \"Low\" ? \"easy\" : ev.risk.level === \"Medium\" ? \"moderate\" : \"hard\",\n linkTo: \"/compare\",\n })\n );\n }\n\n return rankInsights(out);\n}\n\n/** Rank: severity, then financial impact, then employees affected, confidence, ease. */\nexport function rankInsights(insights: Insight[]): Insight[] {\n const sevW = { high: 3, medium: 2, low: 1 };\n const confW = { high: 1.2, medium: 1.0, low: 0.8 };\n const easeW = { easy: 1.2, moderate: 1.0, hard: 0.85 };\n const maxFin = Math.max(1, ...insights.map((i) => i.financialImpact));\n const maxEmp = Math.max(1, ...insights.map((i) => i.employeesAffected));\n const scored = insights.map((i) => ({\n i,\n s:\n sevW[i.severity] * 40 +\n (i.financialImpact / maxFin) * 30 +\n (i.employeesAffected / maxEmp) * 15 +\n confW[i.confidence] * 10 +\n easeW[i.easeOfAction] * 5,\n }));\n scored.sort((a, b) => b.s - a.s);\n return scored.map(({ i }, idx) => ({ ...i, rank: idx + 1 }));\n}\n\n/** Convenience: compute everything from raw employees. */\nexport function generateInsightsFromEmployees(\n employees: Employee[],\n assumptions: Assumptions,\n scenarioEvaluations?: { name: string; evaluation: ScenarioEvaluation }[]\n): Insight[] {\n const metrics = computeMetrics(employees, assumptions);\n return generateInsights({ employees, metrics, assumptions, scenarioEvaluations });\n}\n","/**\n * Org canvas layout: converts an OrgTree + expansion state into positioned\n * nodes and edges using d3-hierarchy's tidy-tree algorithm.\n * Pure module — fully unit-testable, no React/DOM.\n */\nimport { hierarchy, tree, type HierarchyPointNode } from \"d3-hierarchy\";\nimport { EmployeeNode, OrgTree } from \"./types\";\n\nexport interface LayoutDatum {\n id: string;\n node: EmployeeNode;\n collapsed: boolean; // has hidden children\n children?: LayoutDatum[];\n}\n\nexport interface PositionedNode {\n id: string;\n x: number; // center x\n y: number; // top y\n node: EmployeeNode;\n collapsed: boolean;\n}\n\nexport interface PositionedEdge {\n id: string;\n /** Elbow path string in canvas coordinates. */\n path: string;\n sourceId: string;\n targetId: string;\n}\n\nexport interface CanvasLayout {\n nodes: PositionedNode[];\n edges: PositionedEdge[];\n bounds: { minX: number; minY: number; maxX: number; maxY: number };\n visibleCount: number;\n}\n\nexport interface LayoutOptions {\n nodeWidth: number;\n nodeHeight: number;\n gapX: number;\n gapY: number;\n}\n\nexport const FULL_NODE: LayoutOptions = { nodeWidth: 224, nodeHeight: 104, gapX: 24, gapY: 56 };\nexport const COMPACT_NODE: LayoutOptions = { nodeWidth: 128, nodeHeight: 40, gapX: 14, gapY: 36 };\n\n/**\n * Build the visible (expansion-aware) hierarchy input for one root.\n * Iterative (explicit stack) — a recursive walk overflows the call stack on\n * pathological 10k-deep reporting chains.\n */\nexport function buildLayoutTree(\n orgTree: OrgTree,\n rootId: string,\n isExpanded: (id: string) => boolean\n): LayoutDatum | null {\n const rootNode = orgTree.nodes.get(rootId);\n if (!rootNode) return null;\n const root: LayoutDatum = { id: rootId, node: rootNode, collapsed: false };\n const stack: LayoutDatum[] = [root];\n while (stack.length > 0) {\n const datum = stack.pop()!;\n const open = isExpanded(datum.id);\n datum.collapsed = datum.node.directReports.length > 0 && !open;\n if (!open) continue;\n const kids: LayoutDatum[] = [];\n for (const id of datum.node.directReports) {\n const node = orgTree.nodes.get(id);\n if (!node) continue;\n const kid: LayoutDatum = { id, node, collapsed: false };\n kids.push(kid);\n stack.push(kid);\n }\n if (kids.length > 0) datum.children = kids;\n }\n return root;\n}\n\n/** Run tidy-tree layout; returns positioned nodes/edges in canvas coords. */\nexport function layoutOrg(\n orgTree: OrgTree,\n rootIds: string[],\n isExpanded: (id: string) => boolean,\n opts: LayoutOptions\n): CanvasLayout {\n const nodes: PositionedNode[] = [];\n const edges: PositionedEdge[] = [];\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let offsetX = 0;\n\n for (const rootId of rootIds) {\n const datum = buildLayoutTree(orgTree, rootId, isExpanded);\n if (!datum) continue;\n const root = hierarchy<LayoutDatum>(datum, (d) => d.children);\n const layout = tree<LayoutDatum>().nodeSize([\n opts.nodeWidth + opts.gapX,\n opts.nodeHeight + opts.gapY,\n ]);\n const positioned = layout(root);\n\n // Normalize this subtree so its left edge starts at offsetX\n let treeMinX = Infinity, treeMaxX = -Infinity;\n positioned.each((n) => {\n treeMinX = Math.min(treeMinX, n.x);\n treeMaxX = Math.max(treeMaxX, n.x);\n });\n const shift = offsetX - treeMinX + opts.nodeWidth / 2;\n\n positioned.each((n: HierarchyPointNode<LayoutDatum>) => {\n const x = n.x + shift;\n const y = n.depth * (opts.nodeHeight + opts.gapY);\n nodes.push({ id: n.data.id, x, y, node: n.data.node, collapsed: n.data.collapsed });\n minX = Math.min(minX, x - opts.nodeWidth / 2);\n maxX = Math.max(maxX, x + opts.nodeWidth / 2);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y + opts.nodeHeight);\n if (n.parent) {\n const px = n.parent.x + shift;\n const py = n.parent.depth * (opts.nodeHeight + opts.gapY);\n edges.push({\n id: `${n.parent.data.id}->${n.data.id}`,\n sourceId: n.parent.data.id,\n targetId: n.data.id,\n path: elbowPath(px, py + opts.nodeHeight, x, y),\n });\n }\n });\n offsetX += treeMaxX - treeMinX + opts.nodeWidth + opts.gapX * 4;\n }\n\n if (nodes.length === 0) return { nodes, edges, bounds: { minX: 0, minY: 0, maxX: 0, maxY: 0 }, visibleCount: 0 };\n return { nodes, edges, bounds: { minX, minY, maxX, maxY }, visibleCount: nodes.length };\n}\n\n/** Orthogonal elbow: parent bottom-center → child top-center, rounded corners. */\nexport function elbowPath(x1: number, y1: number, x2: number, y2: number): string {\n const midY = y1 + (y2 - y1) / 2;\n if (Math.abs(x1 - x2) < 1) return `M${x1},${y1} L${x2},${y2}`;\n const r = Math.min(8, Math.abs(x2 - x1) / 2, Math.abs(y2 - midY));\n const dir = x2 > x1 ? 1 : -1;\n return [\n `M${x1},${y1}`,\n `L${x1},${midY - r}`,\n `Q${x1},${midY} ${x1 + r * dir},${midY}`,\n `L${x2 - r * dir},${midY}`,\n `Q${x2},${midY} ${x2},${midY + r}`,\n `L${x2},${y2}`,\n ].join(\" \");\n}\n\n/** Ids on the path from a root to `id` (exclusive of id). */\nexport function pathToRoot(orgTree: OrgTree, id: string): string[] {\n return orgTree.nodes.get(id)?.managerChain ?? [];\n}\n\n/** Default expansion: roots expanded down to `depth` levels below the shallowest root. */\nexport function defaultExpandedIds(orgTree: OrgTree, rootIds: string[], depth: number): Set<string> {\n const out = new Set<string>();\n const baseLayer = Math.min(...rootIds.map((r) => orgTree.nodes.get(r)?.layer ?? 1));\n const stack = [...rootIds];\n while (stack.length > 0) {\n const id = stack.pop()!;\n const node = orgTree.nodes.get(id);\n if (!node) continue;\n if (node.layer - baseLayer < depth) {\n out.add(id);\n stack.push(...node.directReports);\n }\n }\n return out;\n}\n\n/** Viewport transform helpers (pan/zoom math, kept pure for tests). */\nexport interface Viewport { x: number; y: number; k: number }\n\nexport function fitToBounds(\n bounds: CanvasLayout[\"bounds\"],\n containerW: number,\n containerH: number,\n padding = 48,\n maxK = 1,\n // Floor on the fitted scale: on a huge org an unclamped fit produces a\n // near-zero k, which makes every node \"visible\" and defeats culling.\n minK = 0.05\n): Viewport {\n const bw = Math.max(1, bounds.maxX - bounds.minX);\n const bh = Math.max(1, bounds.maxY - bounds.minY);\n const k = Math.max(\n minK,\n Math.min(maxK, (containerW - padding * 2) / bw, (containerH - padding * 2) / bh)\n );\n return {\n k,\n x: (containerW - bw * k) / 2 - bounds.minX * k,\n y: (containerH - bh * k) / 2 - bounds.minY * k,\n };\n}\n\nexport function centerOn(\n nodeX: number,\n nodeY: number,\n containerW: number,\n containerH: number,\n k: number\n): Viewport {\n return { k, x: containerW / 2 - nodeX * k, y: containerH / 3 - nodeY * k };\n}\n\n/** Zoom around a screen point (cursor), clamped. */\nexport function zoomAround(\n vp: Viewport,\n screenX: number,\n screenY: number,\n factor: number,\n minK = 0.08,\n maxK = 2\n): Viewport {\n const k = Math.min(maxK, Math.max(minK, vp.k * factor));\n const ratio = k / vp.k;\n return { k, x: screenX - (screenX - vp.x) * ratio, y: screenY - (screenY - vp.y) * ratio };\n}\n\n/** Nodes intersecting the visible canvas region (viewport culling). */\nexport function visibleNodes(\n nodes: PositionedNode[],\n vp: Viewport,\n containerW: number,\n containerH: number,\n opts: LayoutOptions,\n overscan = 400\n): PositionedNode[] {\n const left = (-vp.x - overscan) / vp.k;\n const right = (containerW - vp.x + overscan) / vp.k;\n const top = (-vp.y - overscan) / vp.k;\n const bottom = (containerH - vp.y + overscan) / vp.k;\n return nodes.filter(\n (n) =>\n n.x + opts.nodeWidth / 2 >= left &&\n n.x - opts.nodeWidth / 2 <= right &&\n n.y + opts.nodeHeight >= top &&\n n.y <= bottom\n );\n}\n","/**\n * Demo dataset: \"Meridian Global Services\" — a fictional ~300-person company.\n *\n * Deterministic (seeded PRNG) so every load produces the same organization.\n * The structure deliberately contains consulting-style findings:\n * - Technology is over-layered (8 layers) with a deep infrastructure chain\n * - Several narrow-span managers (1–2 reports), esp. in Finance & Technology\n * - Two overloaded managers (14–16 reports) in Customer Service & Operations\n * - Duplicate senior roles across business units (Heads of PMO, Ops Excellence)\n * - Expensive senior ICs reporting directly to executives\n * - Inconsistent role-title spellings\n * - One employee with an invalid manager reference, one zero-cost row\n */\nimport { Employee } from \"./types\";\n\n// Mulberry32 — small deterministic PRNG\nfunction mulberry32(seed: number) {\n let a = seed;\n return () => {\n a |= 0;\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nlet rand = mulberry32(420042);\nconst pick = <T,>(arr: T[]): T => arr[Math.floor(rand() * arr.length)];\nconst randint = (min: number, max: number) => min + Math.floor(rand() * (max - min + 1));\n\nconst FIRST = [\"James\",\"Mary\",\"Robert\",\"Patricia\",\"John\",\"Jennifer\",\"Michael\",\"Linda\",\"David\",\"Elena\",\"William\",\"Barbara\",\"Richard\",\"Susan\",\"Joseph\",\"Jessica\",\"Thomas\",\"Sarah\",\"Carlos\",\"Karen\",\"Daniel\",\"Nancy\",\"Matthew\",\"Lisa\",\"Anthony\",\"Betty\",\"Mark\",\"Maya\",\"Donald\",\"Sandra\",\"Steven\",\"Ashley\",\"Paul\",\"Kim\",\"Andrew\",\"Donna\",\"Joshua\",\"Emily\",\"Kenneth\",\"Priya\",\"Kevin\",\"Carol\",\"Brian\",\"Amanda\",\"George\",\"Melissa\",\"Timothy\",\"Deborah\",\"Ronald\",\"Stephanie\",\"Wei\",\"Rebecca\",\"Jason\",\"Sharon\",\"Edward\",\"Laura\",\"Jeffrey\",\"Cynthia\",\"Ryan\",\"Aisha\",\"Jacob\",\"Amy\",\"Gary\",\"Anna\",\"Nicholas\",\"Ingrid\",\"Eric\",\"Ruth\",\"Jonathan\",\"Fatima\",\"Stephen\",\"Olivia\",\"Larry\",\"Noor\",\"Justin\",\"Diane\",\"Scott\",\"Alice\",\"Brandon\",\"Julie\",\"Raj\",\"Heather\",\"Samuel\",\"Teresa\",\"Benjamin\",\"Gloria\",\"Hiroshi\",\"Sofia\",\"Frank\",\"Evelyn\",\"Gregory\",\"Joan\",\"Tomasz\",\"Lucia\",\"Alexander\",\"Judith\",\"Patrick\",\"Mei\",\"Jack\",\"Andrea\"];\nconst LAST = [\"Smith\",\"Johnson\",\"Williams\",\"Brown\",\"Jones\",\"Garcia\",\"Miller\",\"Davis\",\"Rodriguez\",\"Martinez\",\"Hernandez\",\"Lopez\",\"Gonzalez\",\"Wilson\",\"Anderson\",\"Thomas\",\"Taylor\",\"Moore\",\"Jackson\",\"Martin\",\"Lee\",\"Perez\",\"Thompson\",\"White\",\"Harris\",\"Sanchez\",\"Clark\",\"Ramirez\",\"Lewis\",\"Robinson\",\"Walker\",\"Young\",\"Allen\",\"King\",\"Wright\",\"Scott\",\"Torres\",\"Nguyen\",\"Hill\",\"Flores\",\"Green\",\"Adams\",\"Nelson\",\"Baker\",\"Hall\",\"Rivera\",\"Campbell\",\"Mitchell\",\"Carter\",\"Roberts\",\"Sharma\",\"Patel\",\"Kowalski\",\"Tan\",\"Lim\",\"Murphy\",\"O'Brien\",\"Kelly\",\"Novak\",\"Kumar\",\"Singh\",\"Reyes\",\"Santos\",\"Cruz\",\"Mendoza\",\"Fischer\",\"Weber\",\"Meyer\",\"Wagner\",\"Becker\"];\n\nconst usedNames = new Set<string>();\nfunction name(): string {\n for (let i = 0; i < 50; i++) {\n const n = `${pick(FIRST)} ${pick(LAST)}`;\n if (!usedNames.has(n)) {\n usedNames.add(n);\n return n;\n }\n }\n return `${pick(FIRST)} ${pick(LAST)} ${randint(1, 99)}`;\n}\n\ninterface LocInfo { city: string; country: string; mult: number }\nconst HQ: LocInfo = { city: \"New York\", country: \"United States\", mult: 1.0 };\nconst LOCS: LocInfo[] = [\n HQ,\n { city: \"London\", country: \"United Kingdom\", mult: 0.95 },\n { city: \"Singapore\", country: \"Singapore\", mult: 0.85 },\n { city: \"Dublin\", country: \"Ireland\", mult: 0.8 },\n { city: \"Warsaw\", country: \"Poland\", mult: 0.45 },\n { city: \"Bangalore\", country: \"India\", mult: 0.35 },\n { city: \"Manila\", country: \"Philippines\", mult: 0.3 },\n];\n\n// Grade by level: L1=CEO ... L8=entry\nconst GRADES = [\"E1\", \"E2\", \"M1\", \"M2\", \"M3\", \"P3\", \"P2\", \"P1\"];\nconst BASE_SALARY = [950000, 520000, 320000, 230000, 165000, 125000, 92000, 62000];\n\nlet seq = 0;\nfunction emp(opts: {\n nameOverride?: string;\n title: string;\n managerId: string | null;\n managerName?: string;\n dept: string;\n func: string;\n bu: string;\n loc?: LocInfo;\n level: number;\n critical?: boolean;\n costOverride?: number;\n roleFamily?: string;\n}): Employee {\n seq += 1;\n const id = `E${String(seq).padStart(4, \"0\")}`;\n const loc = opts.loc ?? (rand() < 0.55 ? HQ : pick(LOCS));\n const lvlIdx = Math.min(opts.level, 8) - 1;\n const base = BASE_SALARY[lvlIdx] * loc.mult * (0.85 + rand() * 0.3);\n const salary = Math.round(base / 1000) * 1000;\n const bonusPct = opts.level <= 2 ? 0.5 : opts.level <= 4 ? 0.25 : 0.1;\n const bonus = Math.round((salary * bonusPct * (0.6 + rand() * 0.8)) / 1000) * 1000;\n const total = opts.costOverride ?? Math.round((salary + bonus) * 1.18); // +18% on-costs\n return {\n employee_id: id,\n employee_name: opts.nameOverride ?? name(),\n role_title: opts.title,\n manager_id: opts.managerId,\n manager_name: opts.managerName,\n department: opts.dept,\n function: opts.func,\n business_unit: opts.bu,\n location: loc.city,\n country: loc.country,\n grade: GRADES[lvlIdx],\n level: opts.level,\n employment_type: rand() < 0.93 ? \"Full-time\" : \"Contractor\",\n fte: rand() < 0.95 ? 1 : 0.5,\n salary,\n bonus,\n total_cost: total,\n status: \"Active\",\n tenure: randint(0, 18),\n gender: rand() < 0.48 ? \"Female\" : rand() < 0.96 ? \"Male\" : \"Non-binary\",\n performance_rating: pick([\"Exceeds\", \"Meets\", \"Meets\", \"Meets\", \"Below\"]),\n critical_role: opts.critical ?? rand() < 0.06,\n role_family: opts.roleFamily,\n attrition_risk: pick([\"Low\", \"Low\", \"Low\", \"Medium\", \"Medium\", \"High\"]),\n };\n}\n\n/** Build a team: a manager + N reports, optionally with a sub-layer. */\nfunction team(opts: {\n mgrTitle: string;\n reportTitle: string;\n managerId: string;\n dept: string;\n func: string;\n bu: string;\n loc?: LocInfo;\n mgrLevel: number;\n size: number;\n}): Employee[] {\n const out: Employee[] = [];\n const mgr = emp({\n title: opts.mgrTitle,\n managerId: opts.managerId,\n dept: opts.dept,\n func: opts.func,\n bu: opts.bu,\n loc: opts.loc,\n level: opts.mgrLevel,\n });\n out.push(mgr);\n for (let i = 0; i < opts.size; i++) {\n out.push(\n emp({\n title: opts.reportTitle,\n managerId: mgr.employee_id,\n managerName: mgr.employee_name,\n dept: opts.dept,\n func: opts.func,\n bu: opts.bu,\n loc: opts.loc,\n level: Math.min(8, opts.mgrLevel + randint(1, 2)),\n })\n );\n }\n return out;\n}\n\nexport function generateDemoData(): Employee[] {\n seq = 0;\n usedNames.clear();\n rand = mulberry32(420042); // reset PRNG so every call is identical\n const all: Employee[] = [];\n const add = (...es: Employee[]) => { all.push(...es); return es[0]; };\n\n // --- CEO ---\n const ceo = add(emp({ nameOverride: \"Margaret Chen\", title: \"Chief Executive Officer\", managerId: null, dept: \"Executive\", func: \"Executive\", bu: \"Corporate\", loc: HQ, level: 1, critical: true }));\n\n // Chief of Staff — expensive senior IC reporting to CEO\n add(emp({ title: \"Chief of Staff\", managerId: ceo.employee_id, dept: \"Executive\", func: \"Executive\", bu: \"Corporate\", loc: HQ, level: 3, critical: true }));\n add(emp({ title: \"Executive Assistant\", managerId: ceo.employee_id, dept: \"Executive\", func: \"Executive\", bu: \"Corporate\", loc: HQ, level: 7 }));\n\n // --- Executive team ---\n const exec = (title: string, func: string, bu = \"Corporate\") =>\n add(emp({ title, managerId: ceo.employee_id, dept: func, func, bu, loc: HQ, level: 2, critical: true }));\n const cfo = exec(\"Chief Financial Officer\", \"Finance\");\n const chro = exec(\"Chief Human Resources Officer\", \"HR\");\n const cto = exec(\"Chief Technology Officer\", \"Technology\");\n const coo = exec(\"Chief Operating Officer\", \"Operations\");\n const cro = exec(\"Chief Revenue Officer\", \"Sales\");\n const cmo = exec(\"Chief Marketing Officer\", \"Marketing\");\n const gc = exec(\"General Counsel\", \"Legal\");\n const cpo = exec(\"Chief Product Officer\", \"Product\");\n const cco = exec(\"Chief Customer Officer\", \"Customer Service\");\n\n // ============ FINANCE (narrow spans by design) ============\n const finVp = (t: string) => add(emp({ title: t, managerId: cfo.employee_id, dept: \"Finance\", func: \"Finance\", bu: \"Corporate\", loc: HQ, level: 3 }));\n const vpFpa = finVp(\"VP Financial Planning & Analysis\");\n const vpCtrl = finVp(\"VP Controller\");\n const vpTreas = finVp(\"VP Treasury\"); // narrow: will get only 2 reports\n const vpTax = finVp(\"VP Tax\"); // narrow: 1 report\n // Senior IC reporting to CFO — expensive\n add(emp({ title: \"Senior Finance Advisor\", managerId: cfo.employee_id, dept: \"Finance\", func: \"Finance\", bu: \"Corporate\", loc: HQ, level: 3 }));\n\n add(...team({ mgrTitle: \"Director, FP&A\", reportTitle: \"FP&A Analyst\", managerId: vpFpa.employee_id, dept: \"FP&A\", func: \"Finance\", bu: \"Corporate\", mgrLevel: 4, size: 5 }));\n add(...team({ mgrTitle: \"Director, Business Finance\", reportTitle: \"Finance Business Partner\", managerId: vpFpa.employee_id, dept: \"FP&A\", func: \"Finance\", bu: \"Corporate\", mgrLevel: 4, size: 4 }));\n add(...team({ mgrTitle: \"Director, Accounting\", reportTitle: \"Senior Accountant\", managerId: vpCtrl.employee_id, dept: \"Accounting\", func: \"Finance\", bu: \"Corporate\", loc: LOCS[4], mgrLevel: 4, size: 6 }));\n add(...team({ mgrTitle: \"Director, Accounts Payable\", reportTitle: \"AP Specialist\", managerId: vpCtrl.employee_id, dept: \"Accounting\", func: \"Finance\", bu: \"Corporate\", loc: LOCS[5], mgrLevel: 4, size: 5 }));\n // Narrow-span: Treasury VP with a 2-person chain\n add(...team({ mgrTitle: \"Treasury Manager\", reportTitle: \"Treasury Analyst\", managerId: vpTreas.employee_id, dept: \"Treasury\", func: \"Finance\", bu: \"Corporate\", mgrLevel: 4, size: 1 }));\n add(emp({ title: \"Cash Management Analyst\", managerId: vpTreas.employee_id, dept: \"Treasury\", func: \"Finance\", bu: \"Corporate\", level: 6 }));\n // Narrow-span: Tax VP with single report\n add(emp({ title: \"Tax Manager\", managerId: vpTax.employee_id, dept: \"Tax\", func: \"Finance\", bu: \"Corporate\", level: 4 }));\n\n // ============ HR ============\n const vpPeopleOps = add(emp({ title: \"VP People Operations\", managerId: chro.employee_id, dept: \"HR\", func: \"HR\", bu: \"Corporate\", loc: HQ, level: 3 }));\n const vpTalent = add(emp({ title: \"VP Talent Acquisition\", managerId: chro.employee_id, dept: \"HR\", func: \"HR\", bu: \"Corporate\", loc: HQ, level: 3 }));\n add(emp({ title: \"Head of Total Rewards\", managerId: chro.employee_id, dept: \"HR\", func: \"HR\", bu: \"Corporate\", loc: HQ, level: 3 }));\n add(...team({ mgrTitle: \"Manager, HR Business Partners\", reportTitle: \"HR Business Partner\", managerId: vpPeopleOps.employee_id, dept: \"HR\", func: \"HR\", bu: \"Corporate\", mgrLevel: 4, size: 6 }));\n add(...team({ mgrTitle: \"Manager, HR Shared Services\", reportTitle: \"HR Operations Specialist\", managerId: vpPeopleOps.employee_id, dept: \"HR\", func: \"HR\", bu: \"Corporate\", loc: LOCS[5], mgrLevel: 4, size: 7 }));\n add(...team({ mgrTitle: \"Manager, Recruiting\", reportTitle: \"Recruiter\", managerId: vpTalent.employee_id, dept: \"HR\", func: \"HR\", bu: \"Corporate\", mgrLevel: 4, size: 5 }));\n\n // ============ TECHNOLOGY (over-layered: 8 layers, duplicated PMO) ============\n const svpEng = add(emp({ title: \"SVP Engineering\", managerId: cto.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", loc: HQ, level: 3, critical: true }));\n const vpInfra = add(emp({ title: \"VP Infrastructure\", managerId: svpEng.employee_id, dept: \"Infrastructure\", func: \"Technology\", bu: \"Corporate\", loc: HQ, level: 3 }));\n const vpApps = add(emp({ title: \"VP Application Development\", managerId: svpEng.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", loc: HQ, level: 3 }));\n add(emp({ title: \"Head of PMO\", managerId: cto.employee_id, dept: \"Technology PMO\", func: \"Technology\", bu: \"Corporate\", loc: HQ, level: 3 })); // duplicate #1\n add(emp({ title: \"Chief Architect\", managerId: cto.employee_id, dept: \"Architecture\", func: \"Technology\", bu: \"Corporate\", loc: HQ, level: 3, costOverride: 720000, critical: true })); // expensive senior IC\n const vpSec = add(emp({ title: \"VP Information Security\", managerId: cto.employee_id, dept: \"Security\", func: \"Technology\", bu: \"Corporate\", loc: HQ, level: 3 }));\n\n // Deep infrastructure chain: CTO(2) > SVP(3) > VP(4) > Sr Dir(5) > Dir(6) > Mgr(7) > Engineers(8)\n const srDirInfra = add(emp({ title: \"Senior Director, Cloud Platform\", managerId: vpInfra.employee_id, dept: \"Infrastructure\", func: \"Technology\", bu: \"Corporate\", level: 4 }));\n const dirCloud = add(emp({ title: \"Director, Cloud Operations\", managerId: srDirInfra.employee_id, dept: \"Infrastructure\", func: \"Technology\", bu: \"Corporate\", level: 5 }));\n add(...team({ mgrTitle: \"Manager, Cloud Operations\", reportTitle: \"Cloud Engineer\", managerId: dirCloud.employee_id, dept: \"Infrastructure\", func: \"Technology\", bu: \"Corporate\", loc: LOCS[5], mgrLevel: 6, size: 6 }));\n add(...team({ mgrTitle: \"Manager, Site Reliability\", reportTitle: \"SRE Engineer\", managerId: dirCloud.employee_id, dept: \"Infrastructure\", func: \"Technology\", bu: \"Corporate\", loc: LOCS[4], mgrLevel: 6, size: 5 }));\n // Narrow-span middle managers in the chain\n add(...team({ mgrTitle: \"Director, Network Engineering\", reportTitle: \"Network Engineer\", managerId: srDirInfra.employee_id, dept: \"Infrastructure\", func: \"Technology\", bu: \"Corporate\", mgrLevel: 5, size: 2 }));\n\n add(...team({ mgrTitle: \"Director, Platform Engineering\", reportTitle: \"Software Engineer\", managerId: vpApps.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", loc: LOCS[5], mgrLevel: 4, size: 8 }));\n add(...team({ mgrTitle: \"Director, Data Engineering\", reportTitle: \"Data Engineer\", managerId: vpApps.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", mgrLevel: 4, size: 6 }));\n // Title inconsistency: \"Sr. Software Engineer\" vs \"Senior Software Engineer\"\n const dirQa = add(emp({ title: \"Director, Quality Engineering\", managerId: vpApps.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", level: 4 }));\n add(emp({ title: \"Sr. Software Engineer\", managerId: dirQa.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", level: 6 }));\n add(emp({ title: \"Senior Software Engineer\", managerId: dirQa.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", level: 6 }));\n add(emp({ title: \"QA Engineer\", managerId: dirQa.employee_id, dept: \"Engineering\", func: \"Technology\", bu: \"Corporate\", level: 7 }));\n add(...team({ mgrTitle: \"Manager, Security Operations\", reportTitle: \"Security Analyst\", managerId: vpSec.employee_id, dept: \"Security\", func: \"Technology\", bu: \"Corporate\", mgrLevel: 5, size: 4 }));\n\n // ============ OPERATIONS (overloaded manager + regional duplication) ============\n const svpOps = add(emp({ title: \"SVP Global Operations\", managerId: coo.employee_id, dept: \"Operations\", func: \"Operations\", bu: \"Corporate\", loc: HQ, level: 3 }));\n add(emp({ title: \"Head of Operational Excellence\", managerId: coo.employee_id, dept: \"Operations\", func: \"Operations\", bu: \"Corporate\", level: 3 })); // duplicate base\n add(emp({ title: \"Head of PMO\", managerId: coo.employee_id, dept: \"Operations PMO\", func: \"Operations\", bu: \"Corporate\", level: 3 })); // duplicate #2\n\n // Regional ops: Americas / EMEA / APAC — each with own Ops Excellence head (duplication)\n const regions: [string, LocInfo][] = [[\"Americas\", HQ], [\"EMEA\", LOCS[1]], [\"APAC\", LOCS[2]]];\n for (const [region, loc] of regions) {\n const rh = add(emp({ title: `VP Operations, ${region}`, managerId: svpOps.employee_id, dept: \"Operations\", func: \"Operations\", bu: region, loc, level: 3 }));\n add(emp({ title: \"Head of Operational Excellence\", managerId: rh.employee_id, dept: \"Operations\", func: \"Operations\", bu: region, loc, level: 4 })); // duplicates\n add(...team({ mgrTitle: `Director, Service Delivery ${region}`, reportTitle: \"Operations Analyst\", managerId: rh.employee_id, dept: \"Service Delivery\", func: \"Operations\", bu: region, loc, mgrLevel: 4, size: region === \"Americas\" ? 7 : 5 }));\n if (region !== \"APAC\") {\n add(...team({ mgrTitle: `Manager, Logistics ${region}`, reportTitle: \"Logistics Coordinator\", managerId: rh.employee_id, dept: \"Logistics\", func: \"Operations\", bu: region, loc, mgrLevel: 5, size: 4 }));\n }\n }\n // Overloaded frontline manager: 15 direct reports\n const bigOpsMgr = add(emp({ title: \"Manager, Processing Center\", managerId: svpOps.employee_id, dept: \"Processing\", func: \"Operations\", bu: \"Americas\", loc: LOCS[6], level: 5 }));\n for (let i = 0; i < 15; i++) add(emp({ title: \"Processing Associate\", managerId: bigOpsMgr.employee_id, managerName: bigOpsMgr.employee_name, dept: \"Processing\", func: \"Operations\", bu: \"Americas\", loc: LOCS[6], level: 8 }));\n\n // ============ SALES (regional, includes narrow + duplicate roles) ============\n const salesRegions: [string, LocInfo][] = [[\"Americas\", HQ], [\"EMEA\", LOCS[1]], [\"APAC\", LOCS[2]]];\n for (const [region, loc] of salesRegions) {\n const rvp = add(emp({ title: `RVP Sales, ${region}`, managerId: cro.employee_id, dept: \"Sales\", func: \"Sales\", bu: region, loc, level: 3 }));\n add(...team({ mgrTitle: `Director, Enterprise Sales ${region}`, reportTitle: \"Account Executive\", managerId: rvp.employee_id, dept: \"Sales\", func: \"Sales\", bu: region, loc, mgrLevel: 4, size: region === \"Americas\" ? 8 : 6 }));\n add(...team({ mgrTitle: `Manager, Sales Development ${region}`, reportTitle: \"Sales Development Rep\", managerId: rvp.employee_id, dept: \"Sales\", func: \"Sales\", bu: region, loc, mgrLevel: 5, size: 6 }));\n add(emp({ title: \"Head of Sales Operations\", managerId: rvp.employee_id, dept: \"Sales Ops\", func: \"Sales\", bu: region, loc, level: 4 })); // duplicate x3\n }\n add(emp({ title: \"VP Strategic Accounts\", managerId: cro.employee_id, dept: \"Sales\", func: \"Sales\", bu: \"Corporate\", loc: HQ, level: 3, costOverride: 680000 })); // expensive near-IC\n add(emp({ title: \"Strategic Account Director\", managerId: cro.employee_id, dept: \"Sales\", func: \"Sales\", bu: \"Corporate\", loc: HQ, level: 4 }));\n\n // ============ MARKETING ============\n const vpBrand = add(emp({ title: \"VP Brand & Communications\", managerId: cmo.employee_id, dept: \"Marketing\", func: \"Marketing\", bu: \"Corporate\", loc: HQ, level: 3 }));\n const vpGrowth = add(emp({ title: \"VP Growth Marketing\", managerId: cmo.employee_id, dept: \"Marketing\", func: \"Marketing\", bu: \"Corporate\", loc: HQ, level: 3 }));\n add(...team({ mgrTitle: \"Director, Content & Creative\", reportTitle: \"Content Specialist\", managerId: vpBrand.employee_id, dept: \"Marketing\", func: \"Marketing\", bu: \"Corporate\", mgrLevel: 4, size: 4 }));\n add(...team({ mgrTitle: \"Director, Digital Marketing\", reportTitle: \"Digital Marketing Manager\", managerId: vpGrowth.employee_id, dept: \"Marketing\", func: \"Marketing\", bu: \"Corporate\", loc: LOCS[3], mgrLevel: 4, size: 5 }));\n add(emp({ title: \"Events Manager\", managerId: vpBrand.employee_id, dept: \"Marketing\", func: \"Marketing\", bu: \"Corporate\", level: 5 }));\n\n // ============ LEGAL & RISK ============\n add(...team({ mgrTitle: \"Deputy General Counsel\", reportTitle: \"Corporate Counsel\", managerId: gc.employee_id, dept: \"Legal\", func: \"Legal\", bu: \"Corporate\", mgrLevel: 3, size: 3 }));\n const vpRisk = add(emp({ title: \"VP Risk & Compliance\", managerId: gc.employee_id, dept: \"Risk & Compliance\", func: \"Risk\", bu: \"Corporate\", loc: HQ, level: 3 }));\n add(...team({ mgrTitle: \"Director, Compliance\", reportTitle: \"Compliance Officer\", managerId: vpRisk.employee_id, dept: \"Risk & Compliance\", func: \"Risk\", bu: \"Corporate\", loc: LOCS[3], mgrLevel: 4, size: 4 }));\n add(emp({ title: \"Risk Analyst\", managerId: vpRisk.employee_id, dept: \"Risk & Compliance\", func: \"Risk\", bu: \"Corporate\", level: 6 }));\n\n // ============ PRODUCT ============\n const vpProd = add(emp({ title: \"VP Product Management\", managerId: cpo.employee_id, dept: \"Product\", func: \"Product\", bu: \"Corporate\", loc: HQ, level: 3 }));\n const vpDesign = add(emp({ title: \"VP Design\", managerId: cpo.employee_id, dept: \"Design\", func: \"Product\", bu: \"Corporate\", loc: HQ, level: 3 }));\n add(...team({ mgrTitle: \"Director, Product — Core Platform\", reportTitle: \"Product Manager\", managerId: vpProd.employee_id, dept: \"Product\", func: \"Product\", bu: \"Corporate\", mgrLevel: 4, size: 5 }));\n add(...team({ mgrTitle: \"Director, Product — New Ventures\", reportTitle: \"Product Manager\", managerId: vpProd.employee_id, dept: \"Product\", func: \"Product\", bu: \"Corporate\", mgrLevel: 4, size: 3 }));\n add(...team({ mgrTitle: \"Manager, UX Design\", reportTitle: \"Product Designer\", managerId: vpDesign.employee_id, dept: \"Design\", func: \"Product\", bu: \"Corporate\", mgrLevel: 5, size: 4 }));\n add(emp({ title: \"Principal Product Strategist\", managerId: cpo.employee_id, dept: \"Product\", func: \"Product\", bu: \"Corporate\", level: 4, costOverride: 540000 })); // expensive IC\n\n // ============ CUSTOMER SERVICE (overloaded manager, low-cost locations) ============\n const vpCs = add(emp({ title: \"VP Customer Support\", managerId: cco.employee_id, dept: \"Customer Service\", func: \"Customer Service\", bu: \"Corporate\", loc: LOCS[6], level: 3 }));\n const vpCsm = add(emp({ title: \"VP Customer Success\", managerId: cco.employee_id, dept: \"Customer Success\", func: \"Customer Service\", bu: \"Corporate\", loc: HQ, level: 3 }));\n // Overloaded: 16 direct reports\n const bigCsMgr = add(emp({ title: \"Manager, Support Tier 1\", managerId: vpCs.employee_id, dept: \"Customer Service\", func: \"Customer Service\", bu: \"Corporate\", loc: LOCS[6], level: 5 }));\n for (let i = 0; i < 16; i++) add(emp({ title: \"Support Agent\", managerId: bigCsMgr.employee_id, managerName: bigCsMgr.employee_name, dept: \"Customer Service\", func: \"Customer Service\", bu: \"Corporate\", loc: LOCS[6], level: 8 }));\n add(...team({ mgrTitle: \"Manager, Support Tier 2\", reportTitle: \"Senior Support Specialist\", managerId: vpCs.employee_id, dept: \"Customer Service\", func: \"Customer Service\", bu: \"Corporate\", loc: LOCS[6], mgrLevel: 5, size: 9 }));\n add(...team({ mgrTitle: \"Manager, Customer Success\", reportTitle: \"Customer Success Manager\", managerId: vpCsm.employee_id, dept: \"Customer Success\", func: \"Customer Service\", bu: \"Corporate\", mgrLevel: 5, size: 7 }));\n\n // --- Intentional data-quality defects ---\n // 1) Employee with invalid manager reference\n const ghost = emp({ title: \"Business Analyst\", managerId: \"E9999\", dept: \"Operations\", func: \"Operations\", bu: \"EMEA\", loc: LOCS[1], level: 6 });\n all.push(ghost);\n // 2) Zero-cost row\n const zc = emp({ title: \"Operations Coordinator\", managerId: svpOps.employee_id, dept: \"Operations\", func: \"Operations\", bu: \"Corporate\", level: 7, costOverride: 0 });\n zc.salary = 0; zc.bonus = 0;\n all.push(zc);\n\n // Fill manager_name where missing\n const byId = new Map(all.map((e) => [e.employee_id, e]));\n for (const e of all) {\n if (e.manager_id && !e.manager_name) e.manager_name = byId.get(e.manager_id)?.employee_name;\n }\n return all;\n}\n","/**\n * Built-in HRIS import templates: column-name aliases + export instructions\n * for the most common HR systems. Selecting a template on the upload page\n * seeds `autoMapColumns` with each system's standard report/export field\n * names so a raw export maps onto the canonical model with little manual work.\n *\n * Aliases are matched with the same normalization as autoMapColumns\n * (lowercase, alphanumerics only), so spelling variants like \"Reports To\"\n * vs \"ReportsTo\" need only one entry.\n */\n\nexport interface HrisTemplate {\n /** Stable identifier, e.g. \"workday\". */\n id: string;\n /** Display name, e.g. \"Workday\". */\n name: string;\n /** Canonical field -> column-name aliases as they appear in this system's exports. */\n aliases: Record<string, string[]>;\n /** Numbered steps an admin follows to pull the right report from the system. */\n exportInstructions: string[];\n /** Optional caveats about the system's export format. */\n notes?: string;\n}\n\nexport const HRIS_TEMPLATES: HrisTemplate[] = [\n {\n id: \"workday\",\n name: \"Workday\",\n aliases: {\n employee_id: [\"Employee ID\", \"Worker ID\", \"WID\"],\n employee_name: [\"Worker\", \"Legal Name\", \"Preferred Name\"],\n role_title: [\"Business Title\", \"Job Profile\", \"Job Title\"],\n manager_id: [\"Manager Employee ID\", \"Worker's Manager ID\", \"Manager ID\"],\n business_unit: [\"Supervisory Organization\", \"Cost Center Hierarchy\"],\n location: [\"Location\", \"Work Location\"],\n country: [\"Location Country\", \"Country\"],\n grade: [\"Compensation Grade\", \"Pay Grade\"],\n level: [\"Job Level\", \"Management Level\"],\n employment_type: [\"Worker Type\", \"Employee Type\", \"Time Type\"],\n fte: [\"FTE\", \"FTE %\", \"Scheduled Weekly Hours FTE\"],\n salary: [\"Annual Base Pay\", \"Base Pay Annualized\", \"Primary Compensation\"],\n total_cost: [\"Total Base Pay Annualized\", \"Total Compensation\"],\n status: [\"Active Status\", \"Worker Status\"],\n },\n exportInstructions: [\n \"Create or run a custom report on the Worker business object (typically under Reports/Analytics).\",\n \"Include the fields: Employee ID, Worker, Business Title, Worker's Manager ID, Supervisory Organization, Location, Compensation Grade, Worker Type, FTE, Annual Base Pay and Total Base Pay Annualized.\",\n \"Filter to active workers (or include terminations if you want leavers in the analysis).\",\n \"Export the report output to XLSX or CSV and upload the file here.\",\n ],\n notes:\n \"Workday reports are highly configurable — column labels follow your tenant's report definition, so review the mapping step carefully.\",\n },\n {\n id: \"successfactors\",\n name: \"SAP SuccessFactors\",\n aliases: {\n employee_id: [\"userId\", \"Person ID External\", \"User/Employee ID\"],\n employee_name: [\"Full Name\", \"Display Name\", \"defaultFullName\"],\n role_title: [\"Job Title\", \"jobTitle\"],\n manager_id: [\"Manager User Sys ID\", \"managerId\", \"Manager ID\"],\n function: [\"Job Function\"],\n business_unit: [\"Business Unit\", \"Division\"],\n location: [\"Location\", \"Location Code\"],\n grade: [\"Pay Grade\", \"payGrade\"],\n level: [\"Job Level\", \"jobLevel\"],\n employment_type: [\"Employee Class\", \"employeeClass\", \"Employment Type\"],\n fte: [\"FTE\", \"Standard Hours FTE\"],\n salary: [\"Annual Salary\", \"annualSalary\", \"Base Salary\"],\n total_cost: [\"Total Target Cash\", \"Total Compensation\"],\n status: [\"Employee Status\", \"emplStatus\"],\n },\n exportInstructions: [\n \"Open the reporting area (typically Report Center / Report Story under Analytics).\",\n \"Build a live-data report on Employee Profile / Job Information including userId, Manager User Sys ID, Department, Division, Location, Pay Grade and Annual Salary.\",\n \"Alternatively, use an ad-hoc report or the Employee Export if your role allows it.\",\n \"Run the report and download it as CSV or XLSX, then upload the file here.\",\n ],\n },\n {\n id: \"bamboohr\",\n name: \"BambooHR\",\n aliases: {\n employee_id: [\"Employee #\", \"employeeNumber\", \"EEID\"],\n employee_name: [\"Full Name\", \"Display Name\"],\n role_title: [\"Job Title\", \"jobTitle\"],\n manager_id: [\"ReportsTo\", \"Reports To\", \"Manager ID\"],\n manager_name: [\"Manager Name\", \"Reporting To\"],\n business_unit: [\"Division\"],\n location: [\"Location\", \"Work Location\"],\n country: [\"Country\"],\n employment_type: [\"Employment Status\", \"FLSA Code\"],\n fte: [\"FTE\"],\n salary: [\"Pay Rate\", \"Annual Salary\", \"payRate\"],\n total_cost: [\"Total Annual Compensation\"],\n status: [\"Status\"],\n tenure: [\"Years of Service\"],\n },\n exportInstructions: [\n \"Open the reports area (typically Reports in the main navigation).\",\n \"Create a custom report (or copy a standard roster report) and add: Employee #, Full Name, Job Title, ReportsTo, Department, Division, Location, Employment Status and Pay Rate.\",\n \"Filter to active employees if you only want the current organization.\",\n \"Download the report as CSV or Excel and upload the file here.\",\n ],\n notes:\n \"BambooHR's ReportsTo column often contains the manager's name rather than their ID — map it to manager_id only if your report exports IDs.\",\n },\n {\n id: \"adp\",\n name: \"ADP Workforce Now\",\n aliases: {\n employee_id: [\"Associate ID\", \"Position ID\", \"File Number\"],\n employee_name: [\"Payroll Name\", \"Legal Name\", \"Name\"],\n role_title: [\"Job Title Description\", \"Position Description\"],\n manager_id: [\"Reports To Associate ID\", \"Reports To Position ID\"],\n manager_name: [\"Reports To Name\"],\n department: [\"Home Department Description\", \"Department Description\"],\n business_unit: [\"Business Unit Description\", \"Business Unit Code\"],\n location: [\"Location Description\", \"Home Work Location\"],\n country: [\"Work Country\"],\n grade: [\"Pay Grade Code\"],\n employment_type: [\"Worker Category Description\", \"Full Time/Part Time Code\"],\n salary: [\"Annual Salary\", \"Regular Pay Amount\"],\n total_cost: [\"Total Annual Compensation\", \"Annual Benefit Base Rate\"],\n status: [\"Position Status Code\", \"Status Type\"],\n },\n exportInstructions: [\n \"Open the reporting area (typically Reports & Analytics).\",\n \"Run or build a worker-level report including: Associate ID, Payroll Name, Job Title Description, Reports To Associate ID, Home Department Description, Business Unit Description, Location Description and Annual Salary.\",\n \"Filter to active associates unless you want terminated workers included.\",\n \"Export the output to CSV or Excel and upload the file here.\",\n ],\n },\n {\n id: \"dayforce\",\n name: \"Dayforce\",\n aliases: {\n employee_id: [\"Employee Number\", \"XRefCode\", \"Employee XRefCode\"],\n employee_name: [\"Display Name\", \"Employee Name\"],\n role_title: [\"Job Assignment\", \"Job Name\", \"Position\"],\n manager_id: [\"Manager XRefCode\", \"Manager Employee Number\"],\n department: [\"Department\", \"Org Unit\"],\n business_unit: [\"Business Unit\"],\n location: [\"Location\", \"Site\"],\n country: [\"Country Code\"],\n grade: [\"Pay Grade\"],\n employment_type: [\"Pay Class\", \"Employment Status Type\"],\n fte: [\"FTE\", \"Normal Weekly Hours FTE\"],\n salary: [\"Annual Salary\", \"Base Salary\"],\n total_cost: [\"Total Remuneration\", \"Total Annual Compensation\"],\n status: [\"Employment Status\", \"Status\"],\n },\n exportInstructions: [\n \"Open the reporting area (typically Reporting / Reports and Analytics).\",\n \"Run an employee or position report including: Employee Number (or XRefCode), Display Name, Job Assignment, Manager XRefCode, Department, Location, Pay Class and Annual Salary.\",\n \"Filter to active employees as needed.\",\n \"Export the report to CSV or Excel and upload the file here.\",\n ],\n },\n {\n id: \"ukg\",\n name: \"UKG Pro\",\n aliases: {\n employee_id: [\"Employee Number\", \"EmpNo\", \"Employee ID\"],\n employee_name: [\"Employee Name\", \"Full Name\"],\n role_title: [\"Job Description\", \"Job Title\"],\n manager_id: [\"Supervisor Employee Number\", \"Supervisor ID\"],\n manager_name: [\"Supervisor Name\", \"Supervisor\"],\n department: [\"Department\", \"Org Level 2\"],\n business_unit: [\"Org Level 1\", \"Division\"],\n location: [\"Location\", \"Work Location Description\"],\n grade: [\"Salary Grade\", \"Pay Grade\"],\n employment_type: [\"Employee Type\", \"Full/Part Time\"],\n fte: [\"Scheduled FTE\", \"FTE\"],\n salary: [\"Annual Pay\", \"Annual Salary\"],\n total_cost: [\"Total Annual Compensation\"],\n status: [\"Employment Status\", \"Status Code\"],\n },\n exportInstructions: [\n \"Open the reporting/BI area (typically under Administration > Reporting or People Analytics).\",\n \"Run an employee roster report including: Employee Number, Employee Name, Job Description, Supervisor Employee Number, Org Levels, Location, Employee Type and Annual Pay.\",\n \"Filter to active employment status if you only want the current organization.\",\n \"Export the result to CSV or Excel and upload the file here.\",\n ],\n notes:\n \"UKG Pro org levels are tenant-specific — confirm which Org Level corresponds to your business units before mapping.\",\n },\n {\n id: \"rippling\",\n name: \"Rippling\",\n aliases: {\n employee_id: [\"Employee Id\", \"Work Email\", \"Employee Number\"],\n employee_name: [\"Full Name\", \"Preferred Full Name\", \"Name\"],\n role_title: [\"Job Title\", \"Title\"],\n manager_id: [\"Manager Id\", \"Manager Email\", \"Manager's Work Email\"],\n manager_name: [\"Manager\", \"Manager Name\"],\n department: [\"Department\"],\n business_unit: [\"Team\", \"Division\"],\n location: [\"Work Location\", \"Office\"],\n country: [\"Work Country\", \"Country\"],\n level: [\"Level\", \"Job Level\"],\n employment_type: [\"Employment Type\", \"Worker Type\"],\n salary: [\"Annual Salary\", \"Base Salary\", \"Compensation Annual Salary\"],\n total_cost: [\"Total Compensation\"],\n status: [\"Employment Status\", \"Roster Status\"],\n },\n exportInstructions: [\n \"Open the reports area (typically Reports in the left navigation).\",\n \"Create a report on employee data including: Employee Id, Full Name, Job Title, Manager, Department, Work Location, Employment Type and Annual Salary.\",\n \"Filter to active employees as needed.\",\n \"Download the report as CSV and upload the file here.\",\n ],\n notes:\n \"If your export identifies people by work email, map both employee_id and manager_id to the email columns — IDs just need to be consistent.\",\n },\n {\n id: \"hibob\",\n name: \"HiBob\",\n aliases: {\n employee_id: [\"Employee ID\", \"Emp ID\"],\n employee_name: [\"Display name\", \"Full name\"],\n role_title: [\"Job title\", \"Title\"],\n manager_id: [\"Manager ID\", \"Reports to ID\"],\n manager_name: [\"Reports to\", \"Manager\"],\n business_unit: [\"Division\"],\n location: [\"Site\", \"Work site\"],\n country: [\"Site country\", \"Country\"],\n level: [\"Level\", \"Job level\"],\n employment_type: [\"Employment type\", \"Employee type\"],\n fte: [\"FTE\", \"Working pattern FTE\"],\n salary: [\"Base salary\", \"Annual salary\"],\n total_cost: [\"Total compensation\"],\n status: [\"Lifecycle status\", \"Employment status\"],\n },\n exportInstructions: [\n \"Open the analytics/reports area (typically Analytics > Reports).\",\n \"Create a people report including: Employee ID, Display name, Job title, Reports to ID, Department, Site, Employment type and Base salary.\",\n \"Filter the lifecycle status to Employed if you only want current staff.\",\n \"Export the report to CSV or Excel and upload the file here.\",\n ],\n },\n {\n id: \"personio\",\n name: \"Personio\",\n aliases: {\n employee_id: [\"Employee ID\", \"ID\"],\n employee_name: [\"Full name\", \"Name\"],\n role_title: [\"Position\", \"Job title\"],\n manager_id: [\"Supervisor ID\", \"Manager ID\"],\n manager_name: [\"Supervisor\", \"Manager\"],\n business_unit: [\"Subcompany\", \"Division\"],\n location: [\"Office\", \"Location\"],\n country: [\"Office country\", \"Country\"],\n employment_type: [\"Employment type\"],\n contract_type: [\"Contract type\"],\n fte: [\"FTE\", \"Weekly hours FTE\"],\n salary: [\"Fix salary\", \"Annual fixed salary\"],\n bonus: [\"Variable salary\", \"Bonus\"],\n total_cost: [\"Total compensation\", \"Total salary\"],\n },\n exportInstructions: [\n \"Open the employee list (typically under People) or the reports area.\",\n \"Choose the columns to include: Employee ID, Full name, Position, Supervisor ID, Department, Subcompany, Office, Employment type and Fix salary.\",\n \"Filter to active employees as needed.\",\n \"Use the export action to download CSV or Excel, then upload the file here.\",\n ],\n notes:\n \"Personio often exports first and last name as separate columns — add a combined full-name column in the export or in your spreadsheet before uploading.\",\n },\n {\n id: \"gusto\",\n name: \"Gusto\",\n aliases: {\n employee_id: [\"Employee ID\", \"Employee UUID\"],\n employee_name: [\"Employee name\", \"Full name\"],\n role_title: [\"Job title\", \"Title\"],\n manager_id: [\"Manager\", \"Manager ID\"],\n manager_name: [\"Manager name\"],\n department: [\"Department\"],\n location: [\"Work address\", \"Work location\"],\n country: [\"Country\"],\n employment_type: [\"Employment type\", \"Employee type\"],\n salary: [\"Compensation rate\", \"Annual salary\"],\n total_cost: [\"Total compensation\"],\n status: [\"Employment status\", \"Status\"],\n },\n exportInstructions: [\n \"Open the reports area (typically Reports in the main navigation).\",\n \"Create a custom employee report including: Employee ID, Employee name, Job title, Manager, Department, Work address, Employment type and Compensation rate.\",\n \"Filter to active employees if you only want the current organization.\",\n \"Download the report as CSV and upload the file here.\",\n ],\n notes:\n \"Gusto's Manager column usually contains a name, not an ID — if so, ensure manager names exactly match employee names, or add a manager-ID column before uploading.\",\n },\n];\n\n/** Look up a template by its stable id. */\nexport function getHrisTemplate(id: string): HrisTemplate | undefined {\n return HRIS_TEMPLATES.find((t) => t.id === id);\n}\n"]}
|