import type { AuthUser } from "@/auth/types"; import { getPositionKeys } from "@/lib/permissions"; /** One overview composition. Every backoffice user lands on exactly one of these. */ export type OverviewLayoutKey = | "executive" | "operation" | "occ" | "marketer" | "finance" | "clearance"; export const OVERVIEW_LAYOUT_LABEL: Record = { executive: "Executive dashboard", operation: "Operations dashboard", occ: "Control centre dashboard", marketer: "Marketing dashboard", finance: "Finance dashboard", clearance: "Clearance & logistics dashboard", }; /** * Position/role key → layout, in match priority order: a user holding several * of these keys gets the first match, so the specific operational view wins * over the broad executive one. Roles are matched alongside positions because * the IAM payload models the GL desks as positions (`ethiopian_gl`) on some * accounts and as roles (`edr_gl_ethiopia`) on others — see `getPositionKeys`. * * The `edr_freight_app/…` keys are the org's real position keys (root desks and * their sub-positions) as configured under Unit → Departments. They are typed * by hand in the Add/Edit Department form, so a new sub-position appears here * only once someone adds it — unmapped keys fall through to `executive`. */ const ROLE_LAYOUTS: Array<[key: string, layout: OverviewLayoutKey]> = [ // ── Clearance & logistics: both GL desks, root and sub-positions ────────── ["ethiopian_gl", "clearance"], ["edr_freight_app/gl_003", "clearance"], // Ethiopian GL Chief ["edr_freight_app/off_001", "clearance"], // Ethiopian GL Director ["edr_freight_app/off_0056", "clearance"], // Ethiopian GL Officer ["djibouti_gl", "clearance"], ["edr_freight_app/dj_gl_001", "clearance"], // Djibouti GL Director ["edr_freight_app/dj_gl_002", "clearance"], // Djibouti GL Chief ["edr_freight_app/dj_gl_003", "clearance"], // Djibouti GL Officer ["edr_gl_ethiopia", "clearance"], // legacy role form ["edr_gl_djibouti", "clearance"], // legacy role form // ── Control centre ─────────────────────────────────────────────────────── ["edr_freight_app/occ_001", "occ"], // OCC ["edr_freight_app/occ_005", "occ"], // OCC Director ["edr_line_staff", "occ"], // legacy role form // ── Operations: operations desk, track & machinery, rolling stock ───────── ["edr_freight_app/opn", "operation"], // Operation ["edr_freight_app/opcf", "operation"], // Operation Chief ["edr_freight_app/opdr", "operation"], // Operation Director ["edr_freight_app/opco", "operation"], // Operation Officer ["edr_freight_app/opp_005", "operation"], // Operation Dispatcher ["edr_freight_app/opp_0067", "operation"], // Gelan Operation Director ["edr_freight_app/track_001", "operation"], // Track And Machinery ["edr_freight_app/ttk_001", "operation"], // Track Director ["edr_freight_app/tto_001", "operation"], // Track Operator ["edr_freight_app/rool_001", "operation"], // Rolling Stock ["edr_freight_app/rl_003", "operation"], // Rolling Stock Director ["edr_freight_app/rl_009", "operation"], // Rolling Stock Team Lead ["edr_freight_app/rl_0090", "operation"], // Rolling Stock Dispatcher ["operation", "operation"], ["operations_chief", "operation"], ["dispatcher", "operation"], ["truck_machinery_chief", "operation"], ["edr_operations_officer", "operation"], // legacy role form // ── Marketing ──────────────────────────────────────────────────────────── ["edr_freight_app/edr_test_org_0022", "marketer"], // Commercial Marketing ["edr_freight_app/edr_test_org_00567", "marketer"], // Marketing Director ["edr_freight_app/edr_test_org_0054", "marketer"], // Marketing Chief ["edr_freight_app/edr_test_org_0013", "marketer"], // Marketing Officer ["marketer", "marketer"], ["edr_marketing", "marketer"], // legacy role form // ── Finance ────────────────────────────────────────────────────────────── ["edr_freight_app/finance", "finance"], ["edr_finance", "finance"], // legacy role form // ── Executive: org-wide desks with no operational queue of their own ────── ["ceo", "executive"], ["director", "executive"], ["chief", "executive"], ["edr_ceo", "executive"], // legacy role form ["edr_director", "executive"], // legacy role form ["edr_org_manager", "executive"], // legacy role form ]; /** Unmapped keys (superadmin, IAM admins, Safety, new positions) keep the executive layout. */ export function resolveOverviewLayout( user: AuthUser | null | undefined, ): OverviewLayoutKey { const held = new Set(getPositionKeys(user)); return ROLE_LAYOUTS.find(([key]) => held.has(key))?.[1] ?? "executive"; }