tin-spa 20.14.99 → 20.14.113
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/core/index.d.ts +3033 -0
- package/fesm2022/tin-spa-accounting.module-Cg4vWaJE.mjs +2231 -0
- package/fesm2022/tin-spa-accounting.module-Cg4vWaJE.mjs.map +1 -0
- package/fesm2022/tin-spa-agent-page.component-DJvMPjCQ.mjs +39 -0
- package/fesm2022/tin-spa-agent-page.component-DJvMPjCQ.mjs.map +1 -0
- package/fesm2022/tin-spa-agent.component-D0CGGnGZ.mjs +1379 -0
- package/fesm2022/tin-spa-agent.component-D0CGGnGZ.mjs.map +1 -0
- package/fesm2022/tin-spa-assets.module-qIWNwJ2E.mjs +167 -0
- package/fesm2022/tin-spa-assets.module-qIWNwJ2E.mjs.map +1 -0
- package/fesm2022/tin-spa-core.mjs +13628 -0
- package/fesm2022/tin-spa-core.mjs.map +1 -0
- package/fesm2022/tin-spa-general-erp.module-CoYxceLj.mjs +138 -0
- package/fesm2022/tin-spa-general-erp.module-CoYxceLj.mjs.map +1 -0
- package/fesm2022/tin-spa-hr.module-CKPZ9ZOj.mjs +134 -0
- package/fesm2022/tin-spa-hr.module-CKPZ9ZOj.mjs.map +1 -0
- package/fesm2022/tin-spa-http.mjs +117 -0
- package/fesm2022/tin-spa-http.mjs.map +1 -0
- package/fesm2022/tin-spa-inventory.module-DRKAcNau.mjs +338 -0
- package/fesm2022/tin-spa-inventory.module-DRKAcNau.mjs.map +1 -0
- package/fesm2022/tin-spa-keys.mjs +14 -0
- package/fesm2022/tin-spa-keys.mjs.map +1 -0
- package/fesm2022/tin-spa-landing.mjs +189 -0
- package/fesm2022/tin-spa-landing.mjs.map +1 -0
- package/fesm2022/tin-spa-loans.module-BTDmgrWo.mjs +115 -0
- package/fesm2022/tin-spa-loans.module-BTDmgrWo.mjs.map +1 -0
- package/fesm2022/tin-spa-login.mjs +719 -0
- package/fesm2022/tin-spa-login.mjs.map +1 -0
- package/fesm2022/tin-spa-manufacturing.module-CHta6oV_.mjs +96 -0
- package/fesm2022/tin-spa-manufacturing.module-CHta6oV_.mjs.map +1 -0
- package/fesm2022/tin-spa-map.mjs +750 -0
- package/fesm2022/tin-spa-map.mjs.map +1 -0
- package/fesm2022/tin-spa-payroll.module-CZ_GO1jF.mjs +847 -0
- package/fesm2022/tin-spa-payroll.module-CZ_GO1jF.mjs.map +1 -0
- package/fesm2022/tin-spa-purchasing.module-NCdwquaF.mjs +161 -0
- package/fesm2022/tin-spa-purchasing.module-NCdwquaF.mjs.map +1 -0
- package/fesm2022/tin-spa-sales.module-D0uEGJW7.mjs +1346 -0
- package/fesm2022/tin-spa-sales.module-D0uEGJW7.mjs.map +1 -0
- package/fesm2022/tin-spa-tenancy-erp.module-GwIv8Wbc.mjs +932 -0
- package/fesm2022/tin-spa-tenancy-erp.module-GwIv8Wbc.mjs.map +1 -0
- package/fesm2022/tin-spa-tin-spa-Cqe5hYTr.mjs +22576 -0
- package/fesm2022/tin-spa-tin-spa-Cqe5hYTr.mjs.map +1 -0
- package/fesm2022/tin-spa.mjs +2 -42079
- package/fesm2022/tin-spa.mjs.map +1 -1
- package/http/index.d.ts +16 -0
- package/index.d.ts +588 -4687
- package/keys/index.d.ts +4 -0
- package/landing/index.d.ts +175 -0
- package/login/index.d.ts +141 -0
- package/map/index.d.ts +148 -0
- package/package.json +25 -1
- package/src/tin-styles.css +81 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tin-spa-core.mjs","sources":["../../../projects/tin-spa/core/src/lib/classes/DateBounds.ts","../../../projects/tin-spa/core/src/lib/classes/TinCore.ts","../../../projects/tin-spa/core/src/lib/classes/LibClasses.ts","../../../projects/tin-spa/core/src/lib/classes/Classes.ts","../../../projects/tin-spa/core/src/lib/classes/DocumentClasses.ts","../../../projects/tin-spa/core/src/lib/services/http.service.ts","../../../projects/tin-spa/core/src/lib/services/message.service.ts","../../../projects/tin-spa/core/src/lib/modules/spa-mat.module.ts","../../../projects/tin-spa/core/src/lib/pages/accounting/receipts/receipt-dialog.component.ts","../../../projects/tin-spa/core/src/lib/runtime/appsettings.ts","../../../projects/tin-spa/core/src/lib/runtime/tinspa-runtime.ts","../../../projects/tin-spa/core/src/lib/services/storage.service.ts","../../../projects/tin-spa/core/src/lib/services/log-redact.ts","../../../projects/tin-spa/core/src/lib/services/api-error.service.ts","../../../projects/tin-spa/core/src/lib/services/signalr.service.ts","../../../projects/tin-spa/core/src/lib/services/offline.service.ts","../../../projects/tin-spa/core/src/lib/services/config.service.ts","../../../projects/tin-spa/core/src/lib/services/log.service.ts","../../../projects/tin-spa/core/src/lib/services/auth.service.ts","../../../projects/tin-spa/core/src/lib/services/general.service.ts","../../../projects/tin-spa/core/src/lib/services/inventory.service.ts","../../../projects/tin-spa/core/src/lib/services/accounting.service.ts","../../../projects/tin-spa/core/src/lib/services/sales.service.ts","../../../projects/tin-spa/core/src/lib/services/purchasing.service.ts","../../../projects/tin-spa/core/src/lib/services/production.service.ts","../../../projects/tin-spa/core/src/lib/services/payroll.service.ts","../../../projects/tin-spa/core/src/lib/services/loans.service.ts","../../../projects/tin-spa/core/src/lib/runtime/silent-request.ts","../../../projects/tin-spa/core/src/lib/runtime/inline-errors.ts","../../../projects/tin-spa/core/src/lib/services/datalib.service.ts","../../../projects/tin-spa/core/src/lib/components/message/messageDialog.component.ts","../../../projects/tin-spa/core/src/lib/components/message/messageDialog.component.html","../../../projects/tin-spa/core/src/lib/components/privacy-dialog/privacy-dialog.component.ts","../../../projects/tin-spa/core/src/lib/components/privacy-dialog/privacy-dialog.component.html","../../../projects/tin-spa/core/src/lib/components/suffix/suffix.component.ts","../../../projects/tin-spa/core/src/lib/components/suffix/suffix.component.html","../../../projects/tin-spa/core/src/lib/components/terms-dialog/terms-dialog.component.ts","../../../projects/tin-spa/core/src/lib/components/terms-dialog/terms-dialog.component.html","../../../projects/tin-spa/core/src/lib/runtime/field-placeholder.ts","../../../projects/tin-spa/core/src/lib/components/text-mask/text-mask.component.ts","../../../projects/tin-spa/core/src/lib/components/text-mask/text-mask.component.html","../../../projects/tin-spa/core/src/lib/components/text/text.component.ts","../../../projects/tin-spa/core/src/lib/components/text/text.component.html","../../../projects/tin-spa/core/src/lib/runtime/login-tier-http.ts","../../../projects/tin-spa/core/src/lib/services/last-route.service.ts","../../../projects/tin-spa/core/src/lib/services/setup.service.ts","../../../projects/tin-spa/core/src/lib/services/subscription.service.ts","../../../projects/tin-spa/core/src/lib/services/menu-source.service.ts","../../../projects/tin-spa/core/src/lib/services/notifications.service.ts","../../../projects/tin-spa/core/src/lib/services/preferences.service.ts","../../../projects/tin-spa/core/src/lib/modules/spa-core.module.ts","../../../projects/tin-spa/core/src/public-api.ts","../../../projects/tin-spa/core/src/tin-spa-core.ts"],"sourcesContent":["// Added (NFD-1): resolves a Field.min / Field.max bound that is expressed as a DYNAMIC TOKEN rather than a\n// literal date, so a config can say `max: 'today'` and mean \"today at the moment the control is rendered\",\n// never the day the bundle was built. Lives in its own file deliberately: Classes.ts, TinCore.ts and\n// form.component are all held by concurrent workers, and nothing here needs any of them.\n//\n// Accepted forms for a bound:\n// 'today' — the local calendar day\n// 'today-7' — 7 local days before today (offsets in whole days, + or -)\n// 'today+30' — 30 local days after today\n// 'now' — the current instant (matches the existing defaultValue: 'now' token, TinCore.ts:535)\n// () => Date|string — a function, called at resolve time; its result is resolved again by these same rules\n// anything else — passed to `new Date()` unchanged, which is the pre-existing behaviour\n//\n// TIMEZONE: every token resolves against the USER'S LOCAL calendar via getFullYear/getMonth/getDate. It\n// deliberately does NOT go through Core.getFormatedDate/nowDate, which add a hard-coded two hours and then\n// call toISOString — that pair shifts the calendar day for anyone not on UTC+2 and would let \"today\" mean\n// tomorrow for part of the evening.\nexport class DateBounds {\n\n private static readonly TODAY = /^today\\s*([+-]\\s*\\d+)?$/i;\n\n // `edge` decides which end of the resolved DAY is returned. A max bound must be the END of today or the\n // picker greys today out along with tomorrow; a min bound must be the START of it.\n // Changed (SBD-1): returns Date | null, and a FUNCTION bound now receives a `context` argument. That pair is what\n // lets a config say `min: (row) => ...` and have the bound RE-EVALUATED against the live row every time the picker\n // opens, instead of being written once as a value that nothing ever re-reads.\n // 🔴 A null/undefined/empty/unparseable bound now resolves to NULL — \"no bound\" — where it used to produce an\n // Invalid Date. matDatepicker discards an Invalid Date silently, which made \"this field has no lower bound\" and\n // \"this field kept the PREVIOUS field's lower bound\" look identical from the outside. That ambiguity is the whole\n // reason a stage switch could leave a stale window behind (see date.component.refreshBounds).\n public static resolve(bound: any, edge: 'start' | 'end', context?: any): Date | null {\n if (bound === null || bound === undefined || bound === '') return null; // Added (SBD-1): an absent bound is \"no bound\", stated explicitly rather than left to Invalid Date\n\n if (typeof bound === 'function') return this.resolve(bound(context), edge, context); // Changed (SBD-1): the row context reaches the function, and its result is re-resolved by these same rules\n\n if (typeof bound === 'string') {\n const token = bound.trim();\n\n if (token.toLowerCase() === 'now') return new Date();\n\n const match = this.TODAY.exec(token);\n if (match) {\n const offset = match[1] ? parseInt(match[1].replace(/\\s+/g, ''), 10) : 0;\n const d = new Date();\n d.setDate(d.getDate() + offset); // local-calendar arithmetic; rolls month/year and survives DST\n return edge === 'end' ? this.endOfDay(d) : this.startOfDay(d);\n }\n }\n\n const literal = new Date(bound); // literal '2026-01-01', a Date, a number — unchanged from before\n return isNaN(literal.getTime()) ? null : literal; // Changed (SBD-1): an unparseable bound is \"no bound\", never an Invalid Date handed to the picker\n }\n\n // Returns true when the bound is a token this class resolves dynamically, i.e. it must be re-read rather\n // than snapshotted for the lifetime of a dialog. Callers use it to decide whether to refresh on open.\n public static isDynamic(bound: any): boolean {\n if (typeof bound === 'function') return true;\n if (typeof bound !== 'string') return false;\n const token = bound.trim();\n return token.toLowerCase() === 'now' || this.TODAY.test(token);\n }\n\n // Formats a resolved bound for a native <input type=\"datetime-local\">, whose min/max attributes require\n // LOCAL 'YYYY-MM-DDTHH:mm'. toISOString() cannot be used here: it converts to UTC and would move the bound\n // by the offset, which is the whole bug this class exists to avoid.\n public static toLocalInput(d: Date): string {\n const p = (n: number) => `${n}`.padStart(2, '0');\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}T${p(d.getHours())}:${p(d.getMinutes())}`;\n }\n\n // Added (DVT-1): the DATE-ONLY sibling of toLocalInput, for a `type:'date'` control whose value format is\n // 'YYYY-MM-DD'. Same reason toLocalInput exists and toISOString is refused here: toISOString converts to UTC\n // and can move the value onto the PREVIOUS calendar day for anyone east of Greenwich, which for a midnight-\n // anchored 'today' default is not a rounding error but the wrong day.\n public static toLocalDate(d: Date): string {\n const p = (n: number) => `${n}`.padStart(2, '0');\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n }\n\n private static startOfDay(d: Date): Date {\n const c = new Date(d);\n c.setHours(0, 0, 0, 0);\n return c;\n }\n\n private static endOfDay(d: Date): Date {\n const c = new Date(d);\n c.setHours(23, 59, 59, 999);\n return c;\n }\n}\n","import { Action, DetailsDialogConfig, DetailsSource, Field, FormConfig, NoAccessInfo, RoleAccess, SecurityConfig, VisibilityValue } from \"./Classes\"; // Changed: import VisibilityValue for unified visibility resolver; Changed: NoAccessInfo for describeFormAccess\nimport { DateBounds } from \"./DateBounds\"; // Added (DVT-1): one shared token vocabulary — the same class that resolves a 'today' min/max bound now resolves a 'today' defaultValue, so the two cannot drift. DateBounds imports nothing, so this adds no cycle.\n\nexport class Core {\n\n\n public static deepClone(obj) {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n const arrCopy = [];\n obj.forEach((item, index) => {\n arrCopy[index] = this.deepClone(item);\n });\n return arrCopy;\n }\n\n const objCopy = {};\n Object.keys(obj).forEach(key => {\n objCopy[key] = this.deepClone(obj[key]);\n });\n return objCopy;\n }\n\n public static deepClone2(obj: any): any {\n // Create new WeakMap for each clone operation\n const cloneVisited = new WeakMap();\n\n // Inner function that has access to the cloneVisited map\n const clone = (value: any): any => {\n // Handle null, undefined and primitives\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check if object was already cloned\n if (cloneVisited.has(value)) {\n return cloneVisited.get(value);\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n const arrCopy = [];\n cloneVisited.set(value, arrCopy);\n value.forEach((item, index) => {\n arrCopy[index] = clone(item);\n });\n return arrCopy;\n }\n\n // Handle dates\n if (value instanceof Date) {\n return new Date(value);\n }\n\n // Handle regular objects\n const objCopy = Object.create(Object.getPrototypeOf(value));\n cloneVisited.set(value, objCopy);\n\n Object.entries(value).forEach(([key, val]) => {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n objCopy[key] = clone(val);\n }\n });\n\n return objCopy;\n };\n\n // Start the clone operation with a fresh WeakMap\n return clone(obj);\n }\n\n\n\n public static camelToWords(value: string): string {\n if (!value) return value;\n\n if (typeof value !== 'string') return value;\n\n if (value.length == 0) return value;\n\n let v = value.charAt(0).toUpperCase() + value.substring(1)\n // Changed: only split at a REAL camelCase boundary — an alphanumeric immediately followed by Capital+lowercase.\n // The old /([A-Z]+)*([A-Z][a-z])/g inserted a space before EVERY TitleCase run regardless of what preceded it,\n // so it also fired at position 0 and straight after a space, hyphen or bracket. Every call site is\n // `field.alias ?? field.name | camelToWords`, which Angular parses as `(alias ?? name) | camelToWords` — so\n // explicit aliases were being run through the camelCase splitter too. A leading/doubled space is invisible\n // (HTML collapses whitespace), which is why this went unnoticed, but a space inserted after a non-space\n // character does NOT collapse: alias 'Check-In Inspection' rendered as 'Check- In Inspection', and\n // 'Year-To-Date (Net)' as 'Year- To- Date ( Net)'. The lookahead does not consume the preceding character,\n // so consecutive boundaries still match ('serviceByDate' -> 'Service By Date'; a consuming capture group\n // yields 'Service ByDate'). Verified against every field name in the config forms: output is identical to\n // the old behaviour for camelCase names, and only the spurious spaces are gone.\n return v.replace(/([a-zA-Z0-9])(?=[A-Z][a-z])/g, \"$1 \");\n }\n\n public static generateObject(fields: Field[]) {\n\n let data = {};\n fields.forEach(field => {\n\n if (field.type != 'section' && field.type != 'blank' && field.hideOnCreate != true) {\n data[field.name] = this.getInitialValue(field);\n }\n\n });\n\n // console.log(data)\n\n return data;\n }\n\n public static resetObject(fields: Field[], data) {\n\n fields.forEach(field => {\n if (field.type != 'section' && field.type != 'blank') {\n data[field.name] = this.getInitialValue(field);\n }\n });\n\n }\n\n public static checkSecurity(security: SecurityConfig, currentRole: any): boolean {\n if (!security) {\n return true;\n }\n\n if (security.deny?.some(role => currentRole[role.name])) {\n return false;\n }\n\n if (!security.allow || security.allow.length === 0) {\n return true;\n }\n\n return security.allow.some(role => currentRole[role.name]);\n }\n\n public static hasFormAccess(formConfig: FormConfig, currentRole: any): boolean {\n return this.getFormAccess(formConfig, currentRole) > RoleAccess.None;\n }\n\n public static getFormAccess(formConfig: FormConfig, currentRole: any): RoleAccess {\n if (!formConfig?.security?.allow) {\n return RoleAccess.Full; // Full access if no restrictions\n }\n\n // Check deny first\n if (formConfig.security.deny?.some(role => this.getRoleAccess(currentRole, role.name) > RoleAccess.None)) {\n return RoleAccess.None;\n }\n\n // Get highest level of access from allowed capabilities\n let maxAccess = RoleAccess.None;\n formConfig.security.allow.forEach(role => {\n const access = this.getRoleAccess(currentRole, role.name);\n if (access > maxAccess) {\n maxAccess = access;\n }\n });\n\n return maxAccess;\n }\n\n // Added: the refusal, NAMED. A denied grid said only \"Access Restricted\", which names neither the page nor the\n // permission, so a user could not repeat it to an administrator and a support engineer could not act on it.\n // The information was already in the config — security.allow is a CapItem[] and every CapItem carries name and\n // display — so nothing is fetched, plumbed or stored to produce it.\n // Returns null whenever access is NOT refused, INCLUDING the unsecured case, so a caller cannot build a banner\n // for a config that declares nothing even by mistake. That null is the Arbiter's binding constraint enforced\n // at the source rather than at the template.\n public static describeFormAccess(formConfig: FormConfig, currentRole: any): NoAccessInfo | null {\n if (!formConfig?.security?.allow?.length) return null; // nothing declared = nothing missing = never a banner\n if (this.hasFormAccess(formConfig, currentRole)) return null; // granted = never a banner\n\n const allow = formConfig.security.allow;\n const wanted = allow[0];\n // Several allowed caps means any ONE of them opens the page, so offering only the first would send the user\n // to ask for a permission that is not the only answer. They are listed instead of arbitrarily chosen.\n const displays = allow.map(c => c?.display).filter(d => !!d);\n const capDisplay = displays.length > 1 ? displays.slice(0, -1).join(', ') + ' or ' + displays[displays.length - 1] : (displays[0] ?? 'this data');\n\n return { entity: formConfig.title || 'this data', capDisplay, capName: wanted?.name ?? '' };\n }\n\n // Added (Phase 4): the refusal SENTENCES, in one place. There are now two tiers that refuse — the grid\n // (table.component.html) and the route (the no-access page behind capabilityGuard) — and if each restated the\n // wording they would drift apart the first time someone edited one of them, leaving a user who followed a deep\n // link and a user who opened a tab reading two different accounts of the same denial.\n // Both take the DISPLAY, never the raw capN key: the key belongs in the log line, the display is what a user\n // repeats to an administrator.\n public static noAccessTitle(entity?: string | null): string {\n return `You do not have access to ${entity || 'this data'}`;\n }\n\n public static noAccessHint(capDisplay?: string | null): string {\n return capDisplay ? `Ask your administrator for the “${capDisplay}” permission.` : 'Ask your administrator for access to this page.';\n }\n\n private static getRoleAccess(role: any, capName: string): RoleAccess {\n if (!role || !capName) return RoleAccess.None;\n return role[capName] ?? RoleAccess.None;\n }\n\n // Changed: central resolver for the unified visible/hidden properties (boolean | condition)\n public static resolveVisibility(v: VisibilityValue | undefined, data: any): boolean | undefined {\n if (v === undefined || v === null) return undefined;\n // Changed: never hand a consumer predicate an undefined record. A details dialog renders its tabs, fields and\n // buttons on the first change-detection pass, BEFORE loadAction has returned the record, so `data` is genuinely\n // undefined there. Every app config written as `hidden: x => !x.vehicleID` (the natural form) then threw a\n // TypeError out of this call and killed whatever lifecycle hook was running — in spa-tabs that was ngOnInit,\n // which aborted before it could seed counts, so no tab badge was ever requested for the life of the dialog.\n // An empty object reads every property as undefined, which is exactly what \"the record has not arrived\" means,\n // and is what a `x?.`-guarded predicate already saw. Same defence steps.component.ts already applies locally.\n return typeof v === 'function' ? !!v(data ?? {}) : v;\n }\n\n // Changed: single visibility rule — hidden wins over visible on collision; undefined defaults to visible\n public static isItemVisible(item: { visible?: VisibilityValue, hidden?: VisibilityValue }, data: any): boolean {\n if (!item) return true;\n if (this.resolveVisibility(item.hidden, data) === true) return false;\n return this.resolveVisibility(item.visible, data) !== false;\n }\n\n public static testVisible(config: FormConfig, data, field: Field, currentRole: any): boolean {\n\n // First check form level security if exists\n if (config.security && !this.hasFormAccess(config, currentRole)) {\n return false;\n }\n\n if (field.section) {\n const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);\n if (sectionField) {\n // Inherit section's conditions\n if (!this.checkSecurity(sectionField.securityConfig, currentRole)) {\n return false;\n }\n if (sectionField.hideOnCreate && config.mode == 'create') return false;\n if (sectionField.hideOnExists && config.mode != 'create') return false;\n // Changed: members inherit ONLY the section's condition functions (legacy hiddenCondition behavior).\n // A static hidden:true hides just the section header — members stay rendered so field types that\n // produce values on render (e.g. select defaultFirstValue) still populate the submitted object.\n if (typeof sectionField.hidden === 'function' && sectionField.hidden(data)) return false;\n if (typeof sectionField.visible === 'function' && !sectionField.visible(data)) return false;\n }\n }\n\n // Then check field level security if exists\n if (!this.checkSecurity(field.securityConfig, currentRole)) {\n return false;\n }\n\n if (config.mode == 'create' && field.hideOnCreate) {\n return false;\n }\n\n\n if (config.mode != 'create' && field.hideOnExists) {\n return false;\n }\n\n return this.isItemVisible(field, data); // Changed: unified visible/hidden replaces hidden + hiddenCondition\n }\n\n // Added (C60): NARROW test — is this field out of sight because a PREDICATE says so right now?\n // True only when a FUNCTION-VALUED hidden/visible, on the field or on its section, resolves to hidden.\n // Deliberately NOT testVisible, and this is the whole point of a separate helper:\n // - testVisible also folds in static hidden:true, hideOnCreate/hideOnExists and security gating, and\n // :207-209 above documents a static hidden:true on a SECTION as a VALUE-CARRYING pattern (members stay\n // rendered so a select's defaultFirstValue still populates the submitted object). Stripping those keys\n // from the payload would delete values the config deliberately produces.\n // - testVisible is also AND-ed with \"not under a collapsed section\" by the form's getVisibleFields(), and\n // collapsing a section must never touch a value the user typed.\n // Only a predicate can flip mid-form on sibling data the user just changed, which is the defect (C60).\n public static isPredicateHidden(config: FormConfig, data, field: Field): boolean {\n if (!field) return false;\n\n // Section-level predicates first — a member of a predicate-hidden section is just as invisible\n if (field.section && config?.fields) {\n const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);\n if (sectionField) {\n if (typeof sectionField.hidden === 'function' && sectionField.hidden(data ?? {})) return true;\n if (typeof sectionField.visible === 'function' && !sectionField.visible(data ?? {})) return true;\n }\n }\n\n // `data ?? {}` for the same reason resolveVisibility does it — a predicate can run before the record lands\n if (typeof field.hidden === 'function' && field.hidden(data ?? {})) return true;\n if (typeof field.visible === 'function' && !field.visible(data ?? {})) return true;\n\n return false;\n }\n\n // Added (C60): build the OUTGOING payload — a shallow COPY of the bound model with every PREDICATE-HIDDEN\n // field's key OMITTED. Shared deliberately: there are TWO independent submit paths in this library\n // (form.component.processCall and detailsDialog.performApiCall) and each had its own copy of\n // \"post the whole model wholesale\". Fixing one and not the other is how the defect got two homes; a single\n // helper is the only way they stay fixed together.\n //\n // The defect: a value that lands in a field while it is VISIBLE was still posted, and persisted, once a\n // predicate hid the field. Runtime-proven on pulse-spa Quick Sale — `paymentMethod` and the user-TYPED\n // `paymentReference` both carry `hidden: x => x.timing === 1`, and a Deferred (credit) sale saved holding\n // PaymentMethod = Cash and a payment reference the operator could not see. Validation is filtered to VISIBLE\n // fields, so nothing inspected them.\n //\n // Three decisions worth the reader's time:\n // 1. A COPY, never a mutation of the bound model. Clearing on hide would destroy the user's typed value on\n // an accidental toggle (flip to Deferred and back and the reference is silently gone). The form keeps\n // its state; only the WRITE is corrected, at the boundary where the defect actually is.\n // 2. OMIT the key rather than send null. A null into a non-nullable backend enum/int is refused at model\n // binding with an HTTP 400 that logs nothing, and seeding 0 is equally unsafe — paymentMethod's\n // legitimate Cash IS 0. Absence is the one signal with no false reading, and TinWeb's present-set\n // honours only the keys that arrive.\n // 3. isPredicateHidden, never testVisible and never the form's visibleFields — see that helper's comment.\n // Keying off visibleFields would wipe data the instant a user COLLAPSED a section.\n //\n // Opt out per field with Field.preserveOnHide, or form-wide with FormConfig.preserveHiddenValues.\n public static buildSubmitPayload(config: FormConfig, data: any): any {\n if (!data || config?.preserveHiddenValues || !config?.fields) return data;\n\n const payload = { ...data }; // shallow — the model is the plain JSON object the projection/loadAction returned\n\n const omit = (field: Field, forced: boolean) => {\n if (!field?.name || field.type === 'section' || field.type === 'blank') return; // layout-only fields own no key\n if (field.serverOwned) { delete payload[field.name]; return; } // Added (CFW-1): UNCONDITIONAL — the server computes this key, so it must never ride the wire. Ahead of preserveOnHide deliberately: that escape hatch is about PREDICATES, and a server-owned value is not something the operator authored under any predicate. Absence, not null, for the C60 reason and one more — TinWeb's present-set (PresentPropertiesFilter) skips absent keys on edit, so omission lands on exactly the same stored value as the server's own [ServerOwned] exclusion, and on create the server clears it to the CLR default regardless\n if (field.preserveOnHide) return;\n if (!forced && !this.isPredicateHidden(config, data, field)) return;\n delete payload[field.name];\n };\n\n config.fields.forEach(field => {\n const parentHidden = this.isPredicateHidden(config, data, field);\n omit(field, false);\n // A composite's subfields carry their OWN keys on the model and their own predicates — getVisibleSubfields\n // runs testVisible per subfield — so a hidden subfield is the same defect one level down. A hidden PARENT\n // takes its whole set with it, since none of them were on screen either.\n field.subfields?.forEach(subfield => omit(subfield, parentHidden));\n });\n\n return payload;\n }\n\n public static testReadOnly(config: FormConfig, data, field: Field): boolean {\n // Added (CFW-1): serverOwned outranks EVERY mode, create included. `readonly` cannot express this — the\n // create branch below returns false for every field, so a readonly server-owned figure was fully editable\n // on a create form while the server cleared it to the CLR default the moment it arrived. Offering an\n // operator a box whose value is discarded is UI dishonesty; this is the honesty half of the flag.\n if (field.serverOwned) {\n return true;\n }\n\n // Added (readonly-always-1, ARBITER-RULED 2026-08-22 option A): the SECOND instance of the serverOwned\n // override pattern above, and it sits here for the same structural reason — ahead of the create branch,\n // which returns false for every field and is what made `readonly` unusable as a display lock on a create\n // form. Nine sites across shift and piglet had to stay `type: 'label'` because of that, each carrying a\n // note saying so. This is a DISPLAY lock only: unlike serverOwned it does NOT touch buildSubmitPayload,\n // so the value still posts — which is what a valueCalculation-fed reference or a picker-computed readout\n // needs. Required-validation is untouched either way.\n if (field.readonlyAlways) {\n return true;\n }\n\n // Default readonly conditions\n if (config.mode == 'create') {\n return false;\n }\n\n if (field.readonly) {\n return true;\n }\n\n if (config.mode == 'view') {\n return true;\n }\n\n // Check section readonly condition first\n if (field.section) {\n const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);\n if (sectionField?.readonlyCondition && sectionField.readonlyCondition(data)) {\n return true;\n }\n }\n\n // Check field level readonly condition last\n if (field.readonlyCondition) {\n return field.readonlyCondition(data);\n }\n\n return false;\n }\n\n // Added (button-display-fn): the ONE guard every Button.display reader goes through now that display may be a\n // function. Returns undefined when nothing is set, so the callers' existing `?? fallback` is unchanged; a plain\n // string is returned verbatim, so no existing render moves. Without this a function-valued display would print\n // its own SOURCE TEXT into a table cell or a chip. Non-allocating for the string case, safe in a template.\n public static buttonDisplay(button: { display?: string | ((data: any) => string) } | null | undefined, item?: any): string | undefined {\n const display = button?.display;\n return typeof display === 'function' ? display(item ?? {}) : display;\n }\n\n public static testVisibleHeaderButton(data, btn): boolean {\n return this.isItemVisible(btn, data); // Changed: unified visible/hidden replaces hiddenCondition\n }\n\n public static getVisibleSubfields(config: FormConfig, data, field: Field, currentRole: any ): Field[] {\n return field.subfields?.filter(subfield => Core.testVisible(config, data, subfield,currentRole )) || [];\n }\n\n // Changed: onInvalid reports WHICH field failed, so a host can bring it back into view — a required field\n // inside a collapsed section would otherwise be rejected with no way to see what is being complained about\n public static validateObject(fields: Field[], data, onInvalid?: (field: Field) => void): string {\n\n // TS-21: removed per-submit console.log(\"Validations\")\n\n for (let field of fields) {\n\n const message = this.validateField(field, data);\n\n if (message) {\n onInvalid?.(field);\n return message;\n }\n\n };\n\n return '';\n }\n\n // Changed: the per-field checks, lifted out of validateObject unchanged so the loop can report the failing field\n private static validateField(field: Field, data): string {\n\n if (field.type == 'file' || field.type == 'file-view' || field.type == 'blank' || field.type == 'section' ) return ''\n\n\n\n let name = field.alias ?? this.camelToWords(field.name);\n let d = data[field.name];\n\n let isRequired = field.required;\n\n if (!isRequired && field.requiredCondition) {\n isRequired = field.requiredCondition(data);\n }\n\n // TS-21: removed per-field console.log of every submitted value\n\n if (isRequired){\n\n if (d == undefined || d == null) return `${name} is required`;\n\n if (field.type == 'text'){\n\n if (d == '') return `Please enter ${name}`;\n\n if (field.min && d.length < field.min) return `Minimum ${name} length is ${field.min}`\n\n if (field.max && d.length > field.max) return `Maximum ${name} length is ${field.max}`\n\n }\n else if (field.type == 'number' || field.type == 'money' || field.type == 'date'){\n\n // Added: the null/undefined guard above is the ONLY emptiness check a date ever got, and an empty date\n // can arrive here as '' — which equals neither. That is not hypothetical: 5a520aa gave four date fields\n // `defaultValue: ''` to stop TinCore pre-filling them with TODAY, so a required Date of Birth now opens\n // holding '' and sailed straight through this function. The POST went out, the API refused the '' at\n // model binding with a 400, and the user was shown the generic \"Something went wrong ... a technical\n // problem in the app\" panel with no mention of Date of Birth — told the software had broken when they\n // had simply left a box empty. Same shape, same function and same fix as 2fc917f did for text-area,\n // select-multi and text-multi. Scoped to date/datetime deliberately: number and money emit null rather\n // than '' on both their clear paths (datetime.component.ts:26-36 measured all four), so widening this\n // to them would change nothing but is not this chunk's to prove.\n if ((field.type == 'date') && d === '') return `Please select ${name}`;\n\n if (field.min && d < field.min) return `Minimum ${name} is ${field.min}`\n\n if (field.max && d > field.max) return `Maximum ${name} is ${field.max}`\n\n }\n else if (field.type == 'datetime'){\n\n if (d === '') return `Please select ${name}`; // Added: datetime had no branch in this switch at all, so it had the identical '' gap\n }\n else if (field.type == 'select') {\n\n if (typeof(d) == 'string' && d == '') return `Please select ${name}`;\n }\n // Added: these three controls CLEAR TO '' rather than to null (select-multi/text-multi join their\n // values with ';' so an empty list is ''; text-area follows the house `text` convention). The guard\n // above only catches null/undefined, and the '' refusal existed for 'text' and 'select' only — so a\n // REQUIRED field of one of these types could be emptied with the suffix clear button and submitted,\n // and the empty value was written to the database with no error and nothing on screen. Observed\n // 2026-08-15 on all three (test-spa products edit): the POST was sent and the column was overwritten.\n // Deliberately checks '' ONLY — it does not change what any control emits, so no payload shape moves\n // and non-nullable string columns keep receiving '' rather than a null they cannot store.\n else if (field.type == 'text-area') {\n\n if (d == '') return `Please enter ${name}`;\n }\n else if (field.type == 'select-multi') {\n\n if (d == '') return `Please select ${name}`;\n }\n else if (field.type == 'text-multi') {\n\n if (d == '') return `Please enter ${name}`;\n }\n\n }\n\n\n\n if (field.type == 'text' && field.regex && d && d.toString().trim() !== '') {\n const regexPattern = new RegExp(field.regex.pattern);\n if (!regexPattern.test(d)) {\n return field.regex.message;\n }\n }\n\n return '';\n }\n\n public static testRequired(config: FormConfig, data, field: Field): boolean {\n if (field.required) {\n return true;\n }\n \n if (field.requiredCondition) {\n return field.requiredCondition(data);\n }\n \n return false;\n }\n\n public static getInitialValue(field: Field) {\n\n // Added (A-0830-21): `noDefault: true` — an OPT-IN that suppresses the type default and seeds the field blank.\n // Type-agnostic and placed first deliberately. The motivating case is a date: `case 'date'` below returns\n // nowDate(), so EVERY date field on a create form opens pre-filled with today. For an open-ended \"Until\" on a\n // rate card that is not a convenience but a wrong answer — it silently expires the card the day it is created,\n // and the hint promising \"Blank means it stays on the card\" describes a blank the user never saw.\n //\n // Opt-in, never global: the date default is right for the great majority of fields (an invoice date, a\n // transaction date) and flipping it estate-wide would be a far larger blast radius than the defect. A config\n // that says nothing keeps today, exactly as before; only a field that explicitly asks for blank gets blank.\n //\n // It wins over `defaultValue` by sitting above that check, which is the only coherent reading of the two\n // together: a field declaring both is contradictory, and honouring the explicit \"no default\" over a default is\n // the less surprising resolution. No config in ng-space or any consumer app used the name `noDefault` for\n // anything before this (grepped), so nothing is being overloaded.\n if (field.noDefault === true) return null;\n\n // Changed (E21): was `if (field.defaultValue)` — a TRUTHINESS test, so a deliberately falsy default\n // (0, false, '') was silently ignored and the field fell through to the type default below. For most\n // types that is harmless, because the fallthrough happens to land on the same value anyway (number -> 0,\n // checkbox -> false, text -> ''). For a SELECT it is not: the fallthrough is `return null`, and a null\n // posted into a non-nullable backend enum is rejected at model binding with an HTTP 400 that the user\n // sees as the generic \"Something went wrong ... a technical problem in the app\" panel\n // (api-error.service.ts:138-144). Nothing is logged server-side, because a binding failure is not an\n // exception — which is exactly why this stayed hidden through a 124k-line API log.\n //\n // Measured before changing it: across ng-space and all four consumer apps exactly 11 fields declare a\n // falsy defaultValue. Seven are number/money/checkbox and are unaffected, their fallthrough already\n // producing the same value. The other four are selects that asked for 0 and were silently getting null:\n // accounting.service.ts:152 itemType, :574 kind, assets.service.ts:25 defaultDepreciationMethod and\n // :115 disposalType — three of them required, so users were being made to re-pick a value the config had\n // already chosen for them. This is therefore behaviour-neutral everywhere except where it repairs a bug.\n if (field.defaultValue !== undefined && field.defaultValue !== null){\n\n if ((field.type == 'date' || field.type == 'datetime') && field.defaultValue == 'now') return this.nowDate(true);\n\n // Added (DVT-1): the 'today' token — and its offsets 'today-7' / 'today+30' — as a DEFAULT VALUE. It was\n // already the documented vocabulary for a min/max BOUND (DateBounds, Classes.ts:185-196) and a config\n // author has no way to tell from the outside that the same word means nothing here: it fell through to\n // `return field.defaultValue` below and handed the control the literal STRING 'today'. A spa-date discards\n // that as an unparseable date and opens BLANK, so on a required field the user is asked to supply a value\n // the config had already chosen — the same class of defect E21 fixed for falsy select defaults above, and\n // measured in single-spa (single.service.ts:148, which had to document the gap in a comment rather than\n // use the token).\n //\n // 🔑 'today' is deliberately the START of the local day, NOT the current instant. That is the distinction\n // DateBounds already draws and it is the only thing that makes this token worth having: 'now' (the line\n // above) is the instant, so a 'today' that also carried the wall-clock time would be a second spelling of\n // 'now' and no new capability. Anchored at midnight it is the token that means \"the calendar day\", which is\n // what a date field stores anyway and what a datetime field wants when it is recording a DAY that happens\n // to be typed into a datetime column.\n //\n // Resolution goes through DateBounds so there is ONE token vocabulary rather than two that drift: any form\n // DateBounds learns to parse becomes available here for free, and 'today+1' cannot mean one thing to a\n // ceiling and another to a default. The 'start' edge is what pins it to midnight.\n // Formatted locally, never via nowDate/getFormatedDate — those add two hours before toISOString() and that\n // skew moves a midnight-anchored value onto the wrong day outside UTC+2 (the same trap DateBounds exists\n // to avoid). A token that fails to resolve falls through to the return below, unchanged.\n // 🔴 The `typeof === 'string'` guard is load-bearing and is NOT redundant with isDynamic: isDynamic also\n // returns true for a FUNCTION bound, and a function is a legitimate — if unusual — thing to already be\n // sitting in defaultValue, where today it is returned untouched. Without this guard that function would\n // start being CALLED, which is a behaviour change nobody asked for and one that would reach the untracked\n // consumers. Only a STRING token is claimed here; everything else keeps falling through exactly as before.\n if ((field.type == 'date' || field.type == 'datetime') && typeof field.defaultValue === 'string' && DateBounds.isDynamic(field.defaultValue) && field.defaultValue.trim().toLowerCase() != 'now') {\n const resolved = DateBounds.resolve(field.defaultValue, 'start');\n if (resolved) return field.type == 'datetime' ? DateBounds.toLocalInput(resolved) : DateBounds.toLocalDate(resolved);\n }\n\n // Added: 'yearStart' — 1 January of the CURRENT year, the sibling token to 'now'. Introduced for\n // booksOpenFrom (datalib.service.ts configSectionFinancial), whose server-side creation path stamps\n // exactly this value (AppConfigurationControllerBase.cs:49 `new DateTime(DateTime.Now.Year, 1, 1)`)\n // while the form showed nothing at all. It is a TOKEN rather than a date computed in the field config\n // because every config object that declares a field is a `providedIn:'root'` service property, i.e.\n // evaluated ONCE at app bootstrap — a computed date would freeze the year there and an app left open\n // across New Year would silently default to the wrong year. Resolving here makes it render-time.\n // Built as a string, not via nowDate/getFormatedDate, because those add two hours before calling\n // toISOString() and that skew can move a midnight-anchored date onto the wrong day outside UTC+2.\n if ((field.type == 'date' || field.type == 'datetime') && field.defaultValue == 'yearStart') return `${new Date().getFullYear()}-01-01`;\n\n return field.defaultValue;\n }\n\n // Changed: a select that will NOT be rendered never produces a value, so this has to supply one its column can\n // accept — and the test now recognises `visible: false` as well as `hidden: true`. The visibility unification\n // widened both properties to `boolean | ((data)=>boolean)` (Classes.ts:178-179) and gave `visible` the inverted\n // sense, but only `hidden === true` was ever checked here, so `visible: false` — the same statement in the other\n // spelling — fell through to `case 'select': return null` at the bottom of this method. Per the comment above, a\n // null posted into a non-nullable backend enum/int is refused at model binding with an HTTP 400 that logs NOTHING\n // server-side, so the two spellings disagreeing is a real defect and not a cosmetic one.\n //\n // 🔴 A FUNCTION-VALUED `hidden`/`visible` IS DELIBERATELY OUT OF SCOPE and still falls through to null. It is\n // tempting to route this through Core.isItemVisible and catch all four spellings at once; that was written,\n // measured and REJECTED, because a predicate has to be evaluated against a record that does not exist yet, and\n // most predicates in this codebase read \"hidden while the form is empty, visible once the user fills it in\"\n // (e.g. `hidden: x => x.category !== 0` is TRUE against {}). Such a field would be seeded 0 and then SHOWN. The\n // value is computed once and never revisited when visibility flips, and validateField (:291-310) has no `select`\n // branch — its `d == undefined || d == null` test is the only emptiness check a select gets, so a seeded 0\n // PASSES `required`. Meanwhile select-common.component.ts:167 renders a non-nullable 0 as blank. The user would\n // therefore see an empty required box, submit it successfully, and post a value they never chose: a silent wrong\n // value in place of a loud 400. Widening to predicates is safe only once a select's value FOLLOWS its visibility.\n //\n // The 0-vs-null choice is NOT invented here: select-common.component.ts:164-167 already defines a select's blank\n // as `0` when the field is non-nullable and as `null` when it declares `nullable: true`. Honouring field.nullable\n // is therefore reading an opt-in the consumer explicitly declared, not flipping a default on one that declared\n // nothing. Measured blast radius — exactly three fields move from 0 to null, and all three are optional FK links\n // whose backend column is `int?`, so 0 was a latent insert against a non-existent row 0:\n // accounting.service.ts:1481 invoiceID (CreditNote.InvoiceID), payroll.service.ts:364 customerID and :365\n // serviceItemID (CommissionConfig.CustomerID/.ServiceItemID). payroll.service.ts:380 metricType is `hidden: true`\n // but also carries defaultValue:1, so it returns above and is untouched.\n if (field.type == 'select' && (field.hideOnCreate || field.hidden === true || field.visible === false)) return field.nullable === true ? null : 0;\n\n switch (field.type) {\n case 'text':\n return '';\n case 'text-area': // Changed: Added text-area to return empty string\n return '';\n case 'text-single': // Changed: Added text-single to return empty string\n return null;\n case 'text-multi': // Changed: Added text-multi to return empty string\n return '';\n case 'text-mask': // Changed: Added text-mask to return empty string\n return '';\n case 'money':\n return 0;\n case 'number':\n return 0;\n case 'date':\n return this.nowDate(true);\n case 'checkbox':\n return false;\n case 'select':\n return null;\n default:\n return null;\n }\n }\n\n\n\n public static getClone(x) {\n return this.deepClone2(x);\n }\n\n public static getNumber(value: string) {\n\n if (value == null || value == \"\") {\n return 0;\n }\n\n const onlyNumbers = value.replace(/[^\\d.-]/g, '');\n return onlyNumbers\n }\n\n // Added: THE multi-value contract — the one place that knows how a multi-select value is shaped.\n // spa-select-multi and spa-text-multi publish their selection as a ';'-delimited string (updateValue does\n // selectedValues.join(';')), and every consumer that needs the parts back — a button's onClick converting to\n // a List<int> DTO, a component re-reading its own bound value — used to re-implement the split inline. That\n // drifted, expensively: piglet's two sale buttons split on ',' instead of ';', so \"12;13\" parsed to [NaN] →\n // JSON [null] → a 400 from model binding, and NO sale row was ever written. A single selection contains no\n // delimiter, so the one-pig case worked and hid the bug from every test anyone thought to run. Written once.\n //\n // Accepts all three shapes that legitimately reach a consumer:\n // 'a;b' the documented wire shape\n // 12 a bare scalar — one selection that was never stringified\n // [1, 2] an array — any form whose DTO takes a List<int> rewrites the bound property in place, and that\n // array flows straight back down [(value)] on the next change-detection pass\n // Every part is trimmed and empties are dropped, so 'a; ;b' and ' a ;b ' both give ['a','b'].\n // null/undefined/''/0 give [] — the established falsy-means-nothing-selected rule, preserved deliberately.\n // ⚠️ A value CONTAINING ';' is not representable: join(';') is lossy and no escape is defined. The shape is\n // for ids and codes, never free text the operator can type a semicolon into.\n public static parseMultiValue(raw: any): string[] {\n if (Array.isArray(raw)) return raw.filter(v => v !== null && v !== undefined && String(v).trim() !== '').map(v => String(v).trim());\n if (!raw) return [];\n return String(raw).split(';').filter(v => v.trim() !== '').map(v => v.trim()); // String() first, so a bare scalar never throws \"split is not a function\"\n }\n\n public static getFirstDayOfMonth() {\n const date = new Date();\n return new Date(date.getFullYear(), date.getMonth(), 1);\n }\n\n public static emailIsValid(email) {\n // return /\\S+@\\S+\\.\\S+/.test(email)\n return false;\n }\n\n public static isValidUNCPath(path: string) {\n // return /\\\\\\\\([a-zA-Z0-9_.$●-]+)\\\\([a-zA-Z0-9_.$●-]+).*/.test(path)\n return false;\n }\n\n public static isValidDate(date) {\n\n var parsedDate = Date.parse(date);\n\n\n if (isNaN(date) && !isNaN(parsedDate)) {\n return true;\n } else {\n return false;\n }\n\n }\n\n public static isValidEmailList(list: string) {\n // Changed: was an inline split(\";\") behind an includes(\";\") branch — parseMultiValue is the one owner of the\n // delimiter now, and because it TRIMS, \"a@b.com; c@d.com\" no longer fails on the space after the semicolon\n // (the previous code validated \" c@d.com\" verbatim, which no email pattern accepts — a real false negative).\n const emails = this.parseMultiValue(list);\n if (!emails.length) return this.emailIsValid(list); // preserves the old behaviour for ''/null — an empty list is not silently \"valid\"\n return emails.every(email => this.emailIsValid(email));\n }\n\n public static nullDate = \"01 Jan 1969\"\n\n public static isNumber(value: string | number): boolean {\n return ((value != null) &&\n (value !== '') &&\n !isNaN(Number(value.toString())));\n }\n\n public static getDiff(startDate, endDate = Date()) {\n\n var eventStartTime = new Date(startDate);\n var eventEndTime = new Date(endDate);\n var milliseconds = eventEndTime.valueOf() - eventStartTime.valueOf();\n\n function numberEnding(number: number) {\n\n if (number.toFixed() == '1') {\n return ''\n } else {\n return 's';\n }\n\n }\n\n var minutes = (milliseconds / (1000 * 60));\n\n var hours: number = (milliseconds / (1000 * 60 * 60));\n\n var days = (milliseconds / (1000 * 60 * 60 * 24));\n\n var weeks: number = (milliseconds / (1000 * 60 * 60 * 24 * 7));\n\n var months = (milliseconds / (1000 * 60 * 60 * 24 * 7 * 4));\n\n var years = (milliseconds / (1000 * 60 * 60 * 24 * 365));\n\n\n if (years >= 1) {\n\n return years.toFixed() + ' year' + numberEnding(years);\n\n } else if (months >= 1) {\n\n return months.toFixed() + ' month' + numberEnding(months);\n\n } else if (weeks >= 1) {\n\n return weeks.toFixed() + ' week' + numberEnding(weeks);\n\n } else if (days >= 1) {\n\n return days.toFixed() + ' day' + numberEnding(days);\n\n } else if (hours >= 1) {\n\n return hours.toFixed() + ' hour' + numberEnding(hours);\n\n } else if (minutes >= 1) {\n\n return minutes.toFixed() + ' minute' + numberEnding(minutes);\n\n } else if (milliseconds >= (-1000 * 60)) {\n\n return 'a minute';\n\n } else {\n\n return 'N/A';\n }\n\n }\n\n\n public static nowDate(NoTime: boolean = false) {\n\n if (NoTime) {\n return this.getFormatedDate(Date(), true);\n } else {\n return this.getFormatedDate(Date());\n }\n }\n\n public static getFormatedDate(dateString: string, NoTime: boolean = false) {\n\n let d: Date = new Date(dateString);\n d.setHours(d.getHours() + 2);\n\n if (NoTime == true) {\n return d.toISOString().split('T')[0];\n } else {\n return d.toISOString().split('.')[0];\n }\n\n }\n\n public static getFormatedDate2(d : Date, NoTime: boolean = false) {\n\n\n d.setHours(d.getHours() + 2);\n\n if (NoTime == true) {\n return d.toISOString().split('T')[0];\n } else {\n return d.toISOString().split('.')[0];\n }\n\n }\n\n public static getBusinessDatesCount(startDate: string, endDate: string) {\n var count = 0;\n var _startDate = new Date(startDate);\n var _endDate = new Date(endDate);\n\n var curDate = _startDate;\n\n while (curDate < _endDate) {\n var dayOfWeek = curDate.getDay();\n if (!(dayOfWeek == 6 || dayOfWeek == 0)) count++;\n curDate.setDate(curDate.getDate() + 1);\n }\n\n return count;\n }\n // Added (section summaries): resolve a select field's stored VALUE to the label the user actually sees. A\n // section summary states the setting in force (\"USD · January\"), and the row holds an ID — so every summary\n // over a select needs this same lookup. Written once here rather than per section, and reads the option list\n // off the LIVE field (spa-form writes field.options back after its loadAction resolves), so a summary over a\n // server-loaded list fills in as soon as the list arrives instead of printing an ID forever.\n // The ?? defaults match form.component.html exactly — 'name'/'value' — so a field that declares neither\n // resolves here the same way it renders.\n static optionLabel(fields: Field[] | undefined, name: string, value: any): string {\n if (value === undefined || value === null || value === '') return '';\n const field = (fields || []).find(x => x.name === name);\n const option = (field?.options || []).find((o: any) => o?.[field!.optionValue ?? 'value'] == value); // == deliberately: a select's stored value is routinely a number against string options, and a strict test would silently return the raw ID\n return option ? (option[field!.optionDisplay ?? 'name'] ?? '') : '';\n }\n\n\n}\n\n\nexport class DetailsDialogProcessor {\n\n public static processDetailsConfig(detailsConfig: DetailsDialogConfig, row: any): DetailsDialogConfig {\n\n const updatedDetailsConfig: DetailsDialogConfig = Core.getClone(detailsConfig); //{...detailsConfig}\n updatedDetailsConfig.details = row;\n\n\n //Form Config\n updatedDetailsConfig.formConfig.mode = updatedDetailsConfig.mode ?? \"view\";\n\n\n\n if (updatedDetailsConfig.heroField && row) {\n updatedDetailsConfig.heroValue = row[updatedDetailsConfig.heroField];\n }\n\n\n //Table configs\n if (updatedDetailsConfig.tableConfig) {\n updateTableConfig(updatedDetailsConfig.tableConfig);\n }\n\n if (updatedDetailsConfig.tableConfigs) {\n updatedDetailsConfig.tableConfigs.forEach(updateTableConfig);\n }\n\n function updateTableConfig(tableConfig) {\n tableConfig.heroField = updatedDetailsConfig?.heroField;\n tableConfig.heroValue = updatedDetailsConfig?.heroValue;\n // tableConfig.setHero = updatedDetailsConfig.setHero;\n tableConfig.searchConfig = null;\n tableConfig.tileConfig = null;\n tableConfig.parentData = updatedDetailsConfig.details;\n tableConfig.elevation = 'none';\n }\n\n\n\n //URL\n if (updatedDetailsConfig.tableConfig) {\n transformLoadUrl(updatedDetailsConfig.tableConfig);\n }\n\n if (updatedDetailsConfig.tableConfigs) {\n updatedDetailsConfig.tableConfigs.forEach(transformLoadUrl);\n }\n\n if (updatedDetailsConfig.stepConfig?.loadAction) {\n transformStepUrl(updatedDetailsConfig.stepConfig);\n }\n\n function transformLoadUrl(tableConfig) {\n if (!tableConfig.loadAction) return;\n\n if (tableConfig.loadCriteria && tableConfig.loadIDField) {\n const idValue = updatedDetailsConfig.details?.[tableConfig.loadIDField]; // Changed: Null guard for header buttons with no row data\n tableConfig.loadAction.url = `${tableConfig.loadAction.url.split('/')[0]}/${tableConfig.loadCriteria}/${idValue ?? 'x'}`;\n }\n }\n\n function transformStepUrl(stepConfig) {\n if (stepConfig.loadAction && stepConfig.loadIDField ) {\n stepConfig.loadAction.url = `${stepConfig.loadAction.url.replace('{id}', updatedDetailsConfig.details[stepConfig.loadIDField])}`;\n }\n }\n\n\n\n return updatedDetailsConfig;\n }\n\n\n static initializeConfigs(detailsConfig: DetailsDialogConfig) {\n const tableConfig = detailsConfig.tableConfig;\n const tableConfigs = detailsConfig.tableConfigs;\n const formConfig = detailsConfig.formConfig;\n const stepConfig = detailsConfig.stepConfig;\n const statusConfig = detailsConfig.statusConfig;\n const buttons = detailsConfig.buttons;\n formConfig.mode = formConfig.mode ?? \"view\";\n return { tableConfig, tableConfigs, formConfig, stepConfig, statusConfig, buttons };\n }\n\n static setHeroValue(detailsConfig: DetailsDialogConfig, details: any) {\n\n\n if ((detailsConfig.formConfig.mode == \"create\" ) && detailsConfig.heroField && detailsConfig.heroValue) {\n details[detailsConfig.heroField] = detailsConfig.heroValue;\n\n // Ensure hero values are set in form config\n detailsConfig.formConfig.heroField = detailsConfig.heroField;\n detailsConfig.formConfig.heroValue = detailsConfig.heroValue;\n\n return;\n }\n\n\n }\n\n static handleFormMode(detailsConfig: DetailsDialogConfig, formConfig: FormConfig,) {\n let details;\n let action;\n let loadByAction = false;\n\n if (formConfig.mode === \"create\") {\n\n details = Core.generateObject(formConfig.fields);\n // Changed: merge row data into create form if available (e.g. pre-populating sowID from pig row)\n if (detailsConfig.details) {\n Object.keys(detailsConfig.details).forEach(key => {\n if (detailsConfig.details[key] !== null && detailsConfig.details[key] !== undefined) {\n details[key] = detailsConfig.details[key];\n }\n });\n }\n\n } else {\n let resp = this.loadDetailsData(detailsConfig, formConfig);\n details = resp.details;\n\n action = resp.action;\n loadByAction = resp.loadByAction;\n }\n\n // Changed: resolve {placeholder} in field loadAction URLs using row data (works for both create and edit modes)\n if (detailsConfig.details) {\n formConfig.fields?.forEach(field => {\n if (field.loadAction?.url && field.loadAction.url.includes('{')) {\n // Changed (treat-5): an UNRESOLVABLE token used to become '' unconditionally, producing a url that LOOKS\n // complete — 'pigs/list/bypen-{penID}' -> 'pigs/list/bypen-', which the server answers 200 to with the whole\n // UNFILTERED list. Every downstream guard keys off a remaining '{' (spa-select-common and spa-select-multi\n // both return early on one), so stripping the brace here silently disarmed all of them.\n // This is now byte-identical to the sibling resolver for the same syntax, FormComponent.resolveLoadAction\n // (form.component.ts:223-227), including its two asymmetries: '' counts as UNRESOLVED alongside\n // null/undefined (a placeholder cleared back to blank is exactly as unready as one never set), and a\n // resolved value is String()-coerced. Two resolvers for one placeholder syntax disagreeing is the drift\n // this defect was made of, so the gate is taken whole rather than approximated with `??`.\n // 🔑 Gated on refetchOnChange DELIBERATELY (Arbiter ruling, 2026-08-20): keeping the token is a semantic\n // change for any config that relies on '', and tin-spa ships by tarball to UNTRACKED consumers outside this\n // workspace that no enumeration here can reach. House rule is never flip a default, add an opt-in — so this\n // branch is unreachable unless the field opts in, and no existing non-opted-in url changes by one character.\n field.loadAction = { ...field.loadAction, url: field.loadAction.url.replace(/\\{(\\w+)\\}/g, (m, key) => { const v = detailsConfig.details[key]; return (v !== undefined && v !== null && v !== '') ? String(v) : (field.refetchOnChange ? m : ''); }) };\n }\n });\n }\n\n return { details, loadByAction, action };\n }\n\n private static loadDetailsData(detailsConfig: DetailsDialogConfig, formConfig: FormConfig) {\n\n let details;\n let action;\n let loadByAction = false;\n\n\n //Choose source\n if (detailsConfig.detailsSource == DetailsSource.Row) {\n\n // console.log(\"Data from Details - Row option\")\n details = detailsConfig.details;\n\n } else if (detailsConfig.detailsSource == DetailsSource.Url) {\n // console.log(\"Data from Url option\")\n action = this.loadDetailsFromUrl(detailsConfig, formConfig);\n loadByAction = true;\n\n } else {\n\n //new logic\n if (formConfig.loadAction){\n // console.log(\"Data from Url - Guessed\");\n action = this.loadDetailsFromUrl(detailsConfig, formConfig);\n loadByAction = true;\n\n }else{\n // console.log(\"Data from Details - Guessed\");\n details = detailsConfig.details;\n }\n\n }\n\n return { details, loadByAction, action };\n }\n\n private static loadDetailsFromUrl(detailsConfig: DetailsDialogConfig, formConfig: FormConfig) {\n let action : Action;\n\n if (formConfig.loadAction) {\n\n if (formConfig.heroField && detailsConfig.details) { // Changed: prioritize formConfig.heroField - the form's own identity field takes precedence over parent's heroField\n\n // console.log(\"FormConfig Hero ID Field \" + formConfig.heroField);\n action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[formConfig.heroField]}` };\n\n } else if (detailsConfig.heroField && detailsConfig.details) { // Changed: fallback to detailsConfig.heroField when formConfig doesn't define one\n\n // console.log(\"DetailsConfig Hero ID Field \" + detailsConfig.heroField);\n action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[detailsConfig.heroField]}` };\n\n } else if (detailsConfig.heroValue) {\n\n // console.log(\"Defined Hero Value \" + detailsConfig.heroValue);\n action = { url: `${formConfig.loadAction.url}/${detailsConfig.heroValue}` };\n\n }\n else{\n console.log(\"url source failed : setup hero field or hero value\");\n }\n\n action.cacheDurationMinutes = formConfig.loadAction.cacheDurationMinutes ?? 0;\n action.skipCache = formConfig.loadAction.skipCache ?? false;\n action.successMessage = formConfig.loadAction.successMessage ?? null;\n\n }else{\n console.log(\"No load action set\");\n }\n\n return action;\n }\n\n\n static setFileField(formConfig: FormConfig) {\n return formConfig.fields.find(x => x.type === 'file');\n }\n\n\n static setupButtons(buttons: any) {\n let extraButtons, createButton, editButton, deleteButton;\n\n if (buttons) {\n extraButtons = buttons.filter(x => x.name !== \"create\" && x.name !== \"edit\" && x.name !== \"delete\" && x.name !== \"view\" && x.inDialog);\n createButton = buttons.find(x => x.name === \"create\");\n editButton = buttons.find(x => x.name === \"edit\");\n deleteButton = buttons.find(x => x.name === \"delete\");\n }\n return { extraButtons, createButton, editButton, deleteButton };\n }\n\n\n\n\n}\n\n\n","import { Core } from \"./TinCore\";\n\n\nexport enum InvoiceStatus {\n Draft, Submitted, Paid, Discarded, Paying, WrittenOff // Changed: Added WrittenOff terminal status for bad-debt write-offs\n}\n\n// Changed: Credit note status enum - mirrors backend CreditNoteStatus (B6)\nexport enum CreditNoteStatus {\n Draft, Submitted, Applied, Discarded\n}\n\n// Changed: Fiscal period status enum - mirrors backend FiscalPeriodStatus (C2)\nexport enum FiscalPeriodStatus {\n Open, Closed, Locked\n}\n\n// Changed: Quote status enum - mirrors backend QuoteStatus (C10)\nexport enum QuoteStatus {\n Draft, Sent, Accepted, Rejected, Expired, Converted\n}\n\n// Added: Invoice item type enum - mirrors backend InvoiceItemType\nexport enum InvoiceItemType {\n General = 0,\n Product = 1,\n Service = 2\n}\n\n// Fixed asset status enum - mirrors backend AssetStatus\nexport enum AssetStatus { Draft = 0, Active = 1, FullyDepreciated = 2, Disposed = 3 }\n\n// Transaction timing enum - separates WHEN payment occurs from HOW\nexport enum TransactionTiming {\n Immediate = 0, // Payment occurs now - no AR/AP created\n Deferred = 1 // Payment occurs later - creates AR/AP\n}\n\n// Changed: Renamed from InventoryReceiptStatus to PurchaseStatus\nexport enum PurchaseStatus {\n Draft,\n Confirmed, // Changed: Receiving → Confirmed (same int=1)\n Completed\n}\n\n// Added: Receipt status for goods confirmation tracking\nexport enum ReceiptStatus {\n Draft,\n Completed\n}\n\n// Unit of measure enum - mirrors backend\nexport enum UnitOfMeasure {\n Piece,\n Box,\n Case,\n Carton,\n Pallet,\n Kilogram,\n Gram,\n Litre,\n Millilitre,\n Meter,\n Pack,\n Set,\n Dozen\n}\n\nexport class loginConfig {\n\n constructor() {\n this.appName = \"\";\n this.selfService = false;\n this.logo = \"\";\n this.logoSize = \"normal\";\n }\n\n appName: string;\n selfService: boolean;\n logo: string;\n logoSize: string;\n}\n\n\nexport class Account {\n user: User;\n profile: Profile;\n}\n\nexport class User {\n\n constructor() {\n\n\n this.userName = \"\";\n this.password = \"\";\n this.tries = \"0\";\n this.locked = \"0\";\n this.logged = \"0\";\n this.disabled = \"0\";\n this.changepassword = \"0\";\n this.dateCreated = Core.nowDate();\n this.dateUpdated = Core.nowDate();\n this.token = \"\";\n this.dateExpire = Core.nowDate();\n this.tokenExpire = Core.nowDate();\n this.authType = \"\";\n this.rememberMe = false; // Changed: Added for \"Keep me signed in\" feature\n }\n\n userName: string;\n password: string;\n tries: string;\n locked: string;\n logged: string;\n disabled: string;\n changepassword: string;\n dateCreated: string;\n dateUpdated: string;\n dateExpire: string;\n token: string;\n tokenExpire: string;\n\n authType: string;\n rememberMe: boolean; // Changed: Added for \"Keep me signed in\" feature\n}\n\nexport class ChangeUserPassword {\n\n constructor() {\n this.userName = \"\";\n this.currentPassword = \"\";\n this.newPassword = \"\";\n this.confirmPassword = \"\";\n }\n userName: string;\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n\nexport class Register {\n\n constructor() {\n this.userName = \"\";\n this.roleID = 1;\n this.firstName = \"\";\n this.lastName = \"\";\n this.email = \"\";\n this.authType = \"local\";\n this.password = \"\";\n }\n\n userName: string;\n roleID: number;\n firstName: string;\n lastName: string;\n email: string;\n authType: string;\n password: string;\n}\n\nexport class Profile {\n\n constructor() {\n this.profileID = \"\";\n this.userName = \"\";\n this.roleID = 1;\n this.firstName = \"\";\n this.lastName = \"\";\n this.email = \"\";\n this.empID = \"\";\n this.arID = \"0\";\n this.authType = \"\";\n this.password = \"\";\n this.role = new Role();\n this.code = \"\";\n }\n\n profileID: string;\n userName: string;\n roleID: number;\n firstName: string;\n lastName: string;\n email: string;\n empID: string;\n arID: string;\n authType: string;\n password: string;\n role: Role\n code : string;\n}\n\n\n\nexport class Role {\n\n constructor() {\n this.roleID = 0;\n this.roleName = \"New Role\";\n this.cap1 = false;\n this.cap2 = false;\n this.cap3 = false;\n this.cap4 = false;\n this.cap5 = false;\n this.cap6 = false;\n this.cap7 = false;\n this.cap8 = false;\n this.cap9 = false;\n this.cap10 = false;\n this.cap11 = false;\n this.cap12 = false;\n this.cap13 = false;\n this.cap14 = false;\n this.cap15 = false;\n this.cap16 = false;\n this.cap17 = false;\n this.cap18 = false;\n this.cap19 = false;\n this.cap20 = false;\n this.cap21 = false;\n this.cap22 = false;\n this.cap23 = false;\n this.cap24 = false;\n this.cap25 = false;\n this.cap26 = false;\n this.cap27 = false;\n this.cap28 = false;\n this.cap29 = false;\n this.cap30 = false;\n this.cap31 = false;\n this.cap32 = false;\n this.cap33 = false;\n this.cap34 = false;\n this.cap35 = false;\n this.cap36 = false;\n this.cap37 = false;\n this.cap38 = false;\n this.cap39 = false;\n this.cap40 = false;\n this.cap41 = false;\n this.cap42 = false;\n this.cap43 = false;\n this.cap44 = false;\n this.cap45 = false;\n this.cap46 = false;\n this.cap47 = false;\n this.cap48 = false;\n this.cap49 = false;\n this.cap50 = false;\n this.cap51 = false;\n this.cap52 = false;\n this.cap53 = false;\n this.cap54 = false;\n this.cap55 = false;\n this.cap56 = false;\n this.cap57 = false;\n this.cap58 = false;\n this.cap59 = false;\n this.cap60 = false;\n this.cap61 = false;\n this.cap62 = false;\n this.cap63 = false;\n this.cap64 = false;\n this.cap65 = false;\n this.cap66 = false;\n this.cap67 = false;\n this.cap68 = false;\n this.cap69 = false;\n this.cap70 = false;\n this.cap71 = false;\n this.cap72 = false;\n this.cap73 = false;\n this.cap74 = false;\n this.cap75 = false;\n this.cap76 = false;\n this.cap77 = false;\n this.cap78 = false;\n this.cap79 = false;\n this.cap80 = false;\n this.cap81 = false;\n this.cap82 = false;\n this.cap83 = false;\n this.cap84 = false;\n this.cap85 = false;\n this.cap86 = false;\n this.cap87 = false;\n this.cap88 = false;\n this.cap89 = false;\n this.cap90 = false;\n this.cap91 = false;\n this.cap92 = false;\n this.cap93 = false;\n this.cap94 = false;\n this.cap95 = false;\n this.cap96 = false;\n this.cap97 = false;\n this.cap98 = false;\n this.cap99 = false;\n this.cap100 = false;\n // Changed: Extended cap101-cap200 to match backend Role model (Cap1-Cap200)\n this.cap101 = false;\n this.cap102 = false;\n this.cap103 = false;\n this.cap104 = false;\n this.cap105 = false;\n this.cap106 = false;\n this.cap107 = false;\n this.cap108 = false;\n this.cap109 = false;\n this.cap110 = false;\n this.cap111 = false;\n this.cap112 = false;\n this.cap113 = false;\n this.cap114 = false;\n this.cap115 = false;\n this.cap116 = false;\n this.cap117 = false;\n this.cap118 = false;\n this.cap119 = false;\n this.cap120 = false;\n this.cap121 = false;\n this.cap122 = false;\n this.cap123 = false;\n this.cap124 = false;\n this.cap125 = false;\n this.cap126 = false;\n this.cap127 = false;\n this.cap128 = false;\n this.cap129 = false;\n this.cap130 = false;\n this.cap131 = false;\n this.cap132 = false;\n this.cap133 = false;\n this.cap134 = false;\n this.cap135 = false;\n this.cap136 = false;\n this.cap137 = false;\n this.cap138 = false;\n this.cap139 = false;\n this.cap140 = false;\n this.cap141 = false;\n this.cap142 = false;\n this.cap143 = false;\n this.cap144 = false;\n this.cap145 = false;\n this.cap146 = false;\n this.cap147 = false;\n this.cap148 = false;\n this.cap149 = false;\n this.cap150 = false;\n this.cap151 = false;\n this.cap152 = false;\n this.cap153 = false;\n this.cap154 = false;\n this.cap155 = false;\n this.cap156 = false;\n this.cap157 = false;\n this.cap158 = false;\n this.cap159 = false;\n this.cap160 = false;\n this.cap161 = false;\n this.cap162 = false;\n this.cap163 = false;\n this.cap164 = false;\n this.cap165 = false;\n this.cap166 = false;\n this.cap167 = false;\n this.cap168 = false;\n this.cap169 = false;\n this.cap170 = false;\n this.cap171 = false;\n this.cap172 = false;\n this.cap173 = false;\n this.cap174 = false;\n this.cap175 = false;\n this.cap176 = false;\n this.cap177 = false;\n this.cap178 = false;\n this.cap179 = false;\n this.cap180 = false;\n this.cap181 = false;\n this.cap182 = false;\n this.cap183 = false;\n this.cap184 = false;\n this.cap185 = false;\n this.cap186 = false;\n this.cap187 = false;\n this.cap188 = false;\n this.cap189 = false;\n this.cap190 = false;\n this.cap191 = false;\n this.cap192 = false;\n this.cap193 = false;\n this.cap194 = false;\n this.cap195 = false;\n this.cap196 = false;\n this.cap197 = false;\n this.cap198 = false;\n this.cap199 = false;\n this.cap200 = false;\n }\n\n roleID: number;\n roleName: string;\n cap1: boolean;\n cap2: boolean;\n cap3: boolean;\n cap4: boolean;\n cap5: boolean;\n cap6: boolean;\n cap7: boolean;\n cap8: boolean;\n cap9: boolean;\n cap10: boolean;\n cap11: boolean;\n cap12: boolean;\n cap13: boolean;\n cap14: boolean;\n cap15: boolean;\n cap16: boolean;\n cap17: boolean;\n cap18: boolean;\n cap19: boolean;\n cap20: boolean;\n cap21: boolean;\n cap22: boolean;\n cap23: boolean;\n cap24: boolean;\n cap25: boolean;\n cap26: boolean;\n cap27: boolean;\n cap28: boolean;\n cap29: boolean;\n cap30: boolean;\n cap31: boolean;\n cap32: boolean;\n cap33: boolean;\n cap34: boolean;\n cap35: boolean;\n cap36: boolean;\n cap37: boolean;\n cap38: boolean;\n cap39: boolean;\n cap40: boolean;\n cap41: boolean;\n cap42: boolean;\n cap43: boolean;\n cap44: boolean;\n cap45: boolean;\n cap46: boolean;\n cap47: boolean;\n cap48: boolean;\n cap49: boolean;\n cap50: boolean;\n cap51: boolean;\n cap52: boolean;\n cap53: boolean;\n cap54: boolean;\n cap55: boolean;\n cap56: boolean;\n cap57: boolean;\n cap58: boolean;\n cap59: boolean;\n cap60: boolean;\n cap61: boolean;\n cap62: boolean;\n cap63: boolean;\n cap64: boolean;\n cap65: boolean;\n cap66: boolean;\n cap67: boolean;\n cap68: boolean;\n cap69: boolean;\n cap70: boolean;\n cap71: boolean;\n cap72: boolean;\n cap73: boolean;\n cap74: boolean;\n cap75: boolean;\n cap76: boolean;\n cap77: boolean;\n cap78: boolean;\n cap79: boolean;\n cap80: boolean;\n cap81: boolean;\n cap82: boolean;\n cap83: boolean;\n cap84: boolean;\n cap85: boolean;\n cap86: boolean;\n cap87: boolean;\n cap88: boolean;\n cap89: boolean;\n cap90: boolean;\n cap91: boolean;\n cap92: boolean;\n cap93: boolean;\n cap94: boolean;\n cap95: boolean;\n cap96: boolean;\n cap97: boolean;\n cap98: boolean;\n cap99: boolean;\n cap100: boolean;\n // Changed: Extended cap101-cap200 to match backend Role model (Cap1-Cap200)\n cap101: boolean;\n cap102: boolean;\n cap103: boolean;\n cap104: boolean;\n cap105: boolean;\n cap106: boolean;\n cap107: boolean;\n cap108: boolean;\n cap109: boolean;\n cap110: boolean;\n cap111: boolean;\n cap112: boolean;\n cap113: boolean;\n cap114: boolean;\n cap115: boolean;\n cap116: boolean;\n cap117: boolean;\n cap118: boolean;\n cap119: boolean;\n cap120: boolean;\n cap121: boolean;\n cap122: boolean;\n cap123: boolean;\n cap124: boolean;\n cap125: boolean;\n cap126: boolean;\n cap127: boolean;\n cap128: boolean;\n cap129: boolean;\n cap130: boolean;\n cap131: boolean;\n cap132: boolean;\n cap133: boolean;\n cap134: boolean;\n cap135: boolean;\n cap136: boolean;\n cap137: boolean;\n cap138: boolean;\n cap139: boolean;\n cap140: boolean;\n cap141: boolean;\n cap142: boolean;\n cap143: boolean;\n cap144: boolean;\n cap145: boolean;\n cap146: boolean;\n cap147: boolean;\n cap148: boolean;\n cap149: boolean;\n cap150: boolean;\n cap151: boolean;\n cap152: boolean;\n cap153: boolean;\n cap154: boolean;\n cap155: boolean;\n cap156: boolean;\n cap157: boolean;\n cap158: boolean;\n cap159: boolean;\n cap160: boolean;\n cap161: boolean;\n cap162: boolean;\n cap163: boolean;\n cap164: boolean;\n cap165: boolean;\n cap166: boolean;\n cap167: boolean;\n cap168: boolean;\n cap169: boolean;\n cap170: boolean;\n cap171: boolean;\n cap172: boolean;\n cap173: boolean;\n cap174: boolean;\n cap175: boolean;\n cap176: boolean;\n cap177: boolean;\n cap178: boolean;\n cap179: boolean;\n cap180: boolean;\n cap181: boolean;\n cap182: boolean;\n cap183: boolean;\n cap184: boolean;\n cap185: boolean;\n cap186: boolean;\n cap187: boolean;\n cap188: boolean;\n cap189: boolean;\n cap190: boolean;\n cap191: boolean;\n cap192: boolean;\n cap193: boolean;\n cap194: boolean;\n cap195: boolean;\n cap196: boolean;\n cap197: boolean;\n cap198: boolean;\n cap199: boolean;\n cap200: boolean;\n}\n\n\n// Added: Model for passing signup data from login redirect to signup page\nexport class SignupData {\n token: string = \"\";\n authType: string = \"\";\n firstName: string = \"\";\n lastName: string = \"\";\n email: string = \"\";\n orgName: string = \"\";\n termsAccepted: boolean = false;\n invitations: any[] = [];\n acceptedInvitationIds: number[] = [];\n}\n\nexport enum LogLevel {\n All = 0,\n Debug = 1,\n Info = 2,\n Warn = 3,\n Error = 4,\n Fatal = 5,\n Off = 6,\n}\n","import { AUTH_TOKEN_KEY, AUTH_REFRESH_TOKEN_KEY } from 'tin-spa/keys';\nimport { BehaviorSubject } from \"rxjs\";\n// 🔴 `import type`, NOT a value import. DocumentClasses.ts imports `Action` FROM this file, so a value\n// import here would close a module cycle. `import type` is erased at compile time and emits no require/\n// import at all, so the cycle never exists at runtime. Field.documentSource is the only member that needs it.\nimport type { DocumentSource } from \"./DocumentClasses\";\n\nexport interface BitwiseOption {\n name?: string;\n value: number;\n selected: boolean;\n icon?: Icon;\n}\n\nexport enum RoleAccess {\n None = 0,\n View = 1,\n Edit = 2,\n Create = 3,\n Full = 4\n}\n\n\nexport enum MovementType {\n In = 0,\n Out = 1\n}\n\nexport enum DetailsSource {Row, Url}\n\nexport class dialogOptions {\n width?: string;\n height?: string;\n}\n\nexport interface CloseOptions {\n position?: 'top' | 'bottom'; // Default: 'bottom'\n text?: string; // Default: 'Cancel' - only applies when position is 'bottom'\n}\n\nexport class DetailsDialogConfig {\n\n stepConfig? : StepConfig;\n statusConfig? : StatusConfig;\n formConfig: FormConfig;\n tableConfig?: TableConfig;\n tableConfigs?: TableConfig[];\n buttons?: Button[];\n details? : any\n heroField? : any\n heroValue?: any\n mode?: 'create' | 'edit' | 'view'\n // width?: string\n detailsSource?: DetailsSource\n options?: dialogOptions\n autoRefreshConfig?: AutoRefreshConfig;\n refreshOnClose?: boolean;\n refreshOnCloseIfActioned?: boolean; // Changed: like refreshOnClose but conditional — Close triggers a parent refresh only when a successful action (POST) happened inside the dialog (footer button, nested-tab table action, or nested dialog); pure view-then-close stays refresh-free\n causeTableRefresh?: boolean;\n closeOptions?: CloseOptions;\n initAction?: Action; // Called on dialog open to check for existing state\n hideTablesInCreateMode?: boolean; // Hide nested tables when mode is 'create'\n disableFloatingTabs?: boolean; // Added: opt OUT of the floating tab-title strip (default is ON — the strip only ever appears while the real tab strip is scrolled out of view, and it is zero-height in flow, so it cannot move anything)\n allowUserKeepOpen?: boolean; // Set by table config — shows a Keep Open checkbox in the dialog title bar; TableConfig is the single source of truth\n keepOpenBehavior?: 'reset' | 'edit'; // Set by table config — controls what happens after successful create when user has Keep Open ticked\n nestingLevel?: number; // Changed: Controls dialog nesting depth — tabs hidden when >= 2\n localMode?: boolean; // Added: one-step create — dialog validates and returns details to the caller without POSTing (rows kept in memory until the parent is created)\n quietLoading?: boolean; // Added (Quiet Loading): overrides AppConfig.quietLoading for this dialog — an explicit false opts OUT of an app-wide opt-in\n seedDefaults?: boolean; // Added: OPT-IN, default OFF. Applies each field's defaultValue AFTER the record lands on the edit path. Core.generateObject only ever ran for mode:'create', so every defaultValue on a CAPTURE dialog built as mode:'edit' (Record Payment, Dispose Asset, Record Death) was silently inert. Semantics mirror TableComponent.seedInlineDefaults exactly: seed ONLY where the current value is null/undefined/'' so real data is never overwritten, and ONLY for fields the operator can actually see — an unrendered field must never be silently seeded, because nobody can see or correct what it was seeded with. Leave it OFF for a true-edit dialog: a default is honest where a human is looking at it and can change it, not where it materialises unseen.\n createButtonContext?: any; // Added (nested-create-disabled-fix): the row the create button was INVOKED against — the parent row for a nested/header create button. Stamped by TableComponent.open() only where the dialog inherits the TABLE's own buttons (no detailsConfig of its own), because those buttons' `disabled` predicates are authored for the header context (table-header.component.ts:215 passes config.parentData) and would otherwise be re-evaluated in the dialog against the CHILD create model, which has none of the parent's fields. Left undefined everywhere else, so the dialog falls back to its own details exactly as before.\n drillIn?: boolean; // Added: set by TableComponent.columnClicked — this dialog was reached by tapping a COLUMN (chip / button / monogram), so the clicked row is NOT necessarily a row of the entity this form describes. Read by the details dialog's failed-load path, which must not adopt the clicked row as the record.\n}\n\nexport class Action{\n method?: 'get' | 'post'\n url: string;\n params? : any[]\n successMessage?: string\n isFormData?: boolean\n skipCache?: boolean\n cacheDurationMinutes?: number;\n silent?: boolean; // Added (Quiet Loading): this action never raises the global scrim. Prefer CallApi's call-time { silent } option — Actions on configs are shared singletons\n}\n\n// Centralized cache configuration for URL patterns\nexport interface CacheRule {\n pattern: string; \n durationMinutes: number;\n}\n\nexport class CacheConfig {\n rules: CacheRule[] = [];\n \n addRule(pattern: string, durationMinutes: number) {\n this.rules.push({ pattern, durationMinutes });\n }\n \n getDuration(url: string): number | null {\n for (const rule of this.rules) {\n if (this.matchesPattern(url, rule.pattern)) {\n return rule.durationMinutes;\n }\n }\n return null;\n }\n \n private matchesPattern(url: string, pattern: string): boolean {\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '\\\\?');\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(url);\n }\n}\n\n\n// Offline mode (TinSync): per-record sync state carried on rows via the _offline marker\nexport type OfflineOpStatus = 'pending' | 'syncing' | 'synced' | 'failed' | 'conflict' | 'stale';\n\n// Offline mode (TinSync): per-table opt-in configuration — absence of the property means ZERO offline machinery touches the table\nexport interface OfflineConfig {\n enabled: boolean;\n cacheRows?: number; // max rows persisted from the table loadAction list (default 500)\n cacheLookups?: boolean | string[]; // true (default) = persist all field loadAction option lists reachable from formConfig; string[] = explicit URL allowlist\n lookupMaxAgeHours?: number; // staleness threshold for cached option lists (default 72)\n queue?: { create?: boolean; edit?: boolean; delete?: boolean }; // which mutations queue offline — create/edit default true, delete default FALSE\n maxQueueAgeHours?: number; // ops older than this stop auto-replaying and flip to 'stale' (default 72)\n readOnly?: boolean; // cache reads/lookups only, queue nothing\n}\n\nexport interface SearchField extends Field {\n show?: boolean\n}\n\nexport class SearchConfig {\n fields: SearchField[]\n searchAction?: Action\n emailResults?: boolean\n tileConfig?: TileConfig\n}\n\n\n\nexport class SecurityConfig {\n allow?: CapItem[];\n deny?: CapItem[];\n}\n\n// Added: what a denied grid knows about its own refusal — computed at the gate from the config and the role,\n// never inferred from a response. Non-null ONLY when a capability was positively declared and is positively\n// lacked, which is what keeps a legitimately empty grid from ever acquiring a no-access banner.\nexport interface NoAccessInfo {\n entity: string; // 'Sales Order' — from formConfig.title, what the user calls the page\n capDisplay: string; // 'Sales Orders' — the CapItem.display an administrator would grant\n capName: string; // 'cap39' — for the log line and for support, never shown as the primary text\n}\n\nexport interface ChildField {\n childField?: string\n childValueField?: string\n}\n\nexport interface AutoRefreshConfig {\n // Time between refreshes in milliseconds (default: 5000ms = 5 seconds)\n interval?: number;\n stopCondition?: (data: any) => boolean;\n defaultOn?: boolean;\n}\n\n\n// Changed: unified visibility type — a static boolean or a data-driven condition; used by visible/hidden everywhere\nexport type VisibilityValue = boolean | ((value: any) => boolean);\n\nexport interface Field {\n securityConfig?: SecurityConfig;\n name: string;\n // Added: the control's placeholder text. The spa-form BINDING for this already shipped (67ce57f,\n // placeholder-passthrough-1), so a config placeholder works at runtime — but the property was missing from\n // this interface, so a consumer literal declaring one failed to compile with TS2353 and the feature was\n // unreachable from the only place anyone would use it. Type-only and purely additive: no default, no\n // behaviour, and a field that does not declare one is unchanged.\n placeholder?: string;\n // 🔴 'email' IS A MULTI-ADDRESS CONTROL, not a single-address text box with validation. It renders a\n // mat-chip-grid: each address becomes a removable chip, Enter and ';' both commit one, a paste is scanned for\n // every address it contains, and the value is stored as a SEMICOLON-DELIMITED STRING ('a@x.com;b@y.com') —\n // never a bare address. Its resting placeholder reads \"Enter email addresses\", plural. See\n // components/email/email.component.ts.\n // ✅ Use it for — a recipient LIST: notification targets, CC lines, \"who should be alerted\".\n // ❌ Not for — a single contact column (a person's own email, an invoice's billing address). Those get\n // one value each, and a chip control both invites a second one and stores a format the\n // column does not expect. Use `type: 'email-single'` there.\n // Changed (email-single): the single-address case now has its OWN type, `'email-single'`. It is a SEPARATE type\n // and never a flag on `'email'` — the two store different things ('a@x.com' vs 'a@x.com;b@y.com'), so one\n // control that did both would make the stored format depend on a config option, which no consumer column wants.\n // `'email-single'` renders the ORDINARY text box (spa-text, so every text affordance — placeholder, suffix,\n // copy/clear, hint, mat-error — behaves exactly as on `'text'`) with an anchored email pattern applied for\n // free. A field may still pass its own `regex` to override, and `hint` follows the usual convention below.\n // ⚠️ Existing `type: 'email'` fields are completely UNCHANGED. Nothing opts in by upgrading.\n type: 'text' | 'email-single' | 'text-area' | 'text-single' | 'text-multi' | 'text-mask' | 'date' | 'date-short' | 'datetime' | 'datetimesec' | 'checkbox' | 'select' | 'select-multi' | 'money' | 'number' | 'section' | 'blank' | 'chip' | 'file' | 'file-view' | 'icon' | 'spinner' | 'button' | 'label' | 'email' | 'composite' | 'string' | 'html' | 'editor'; // Changed: added date-short (d MMM format); added editor (rich-text/WYSIWYG)\n alias?: string;\n options?: any[];\n optionDisplay?: string\n optionValue?: string\n masterOptionValue?: string\n // A literal value, or — on a DATE or DATETIME field — one of these dynamic tokens, resolved at RENDER time by\n // Core.getInitialValue so an app left open across midnight or New Year cannot default to a stale day:\n // 'now' — the current instant, with the wall-clock time\n // 'today' — Added (DVT-1). MIDNIGHT of the local calendar day. Deliberately not the same as 'now': that\n // distinction is the only reason the token is worth having, and it matches what the identical\n // token already means as a min/max bound.\n // 'today-7' / 'today+30' — whole-day offsets, same arithmetic as the bounds below\n // 'yearStart' — 1 January of the current year\n // 🔑 The token vocabulary is SHARED with min/max (both resolve through DateBounds), so a word that works as a\n // ceiling works as a default and means the same thing in both places.\n // NOTE `defaultValue: ''` is honoured as a deliberate empty (E21) — it is NOT treated as \"no default\", which is\n // how a date field opts OUT of being pre-filled.\n defaultValue?: any\n defaultFirstValue?: boolean\n required?: boolean\n requiredCondition?: (value: any) => boolean;\n // For a number or money field these are plain numeric bounds. For a DATE or DATETIME field a bound may be:\n // a literal '2026-01-01', a Date — fixed for the life of the form\n // a dynamic token 'today', 'today-28', 'now' — re-resolved every time the picker opens\n // a function (row) => Date|string|null — Added (SBD-1); re-EVALUATED every time the picker opens,\n // with the form's live data object passed in as `row`\n // 🔑 Reach for the FUNCTION form whenever the window depends on ANOTHER FIELD. It is PULLED at open time rather\n // than pushed once, which is what makes it correct in the two cases a written value gets wrong: data that arrives\n // AFTER the user has already made their choice, and a choice the user then CHANGES again. Writing field.min from\n // an onSelectChange handler works only if every one of those pushes lands, and a push that is skipped leaves the\n // previous window in force — see date.component.refreshBounds for the measured failure that motivated this.\n min?: any\n max?: any\n rows?: number\n span?: boolean\n width?: string\n size?: string\n readonly?: boolean\n hidden?: VisibilityValue // Changed: boolean | condition — hidden wins over visible on collision\n visible?: VisibilityValue // Changed: boolean | condition — replaces the removed hiddenCondition (inverted sense)\n preserveOnHide?: boolean // Added (C60): ESCAPE HATCH, default false. By default a field whose FUNCTION-VALUED hidden/visible (its own, or its section's) resolves to hidden at submit time has its key OMITTED from the outgoing payload — the value a predicate has taken out of sight is not something the operator can see or correct, and it was being posted and persisted (a credit sale stored PaymentMethod=Cash plus a payment reference nobody could see). Set true where a predicate hides a field that must STILL be submitted — e.g. a value computed by valueCalculation and shown only while relevant. Only ever affects the payload: this.data keeps the value either way, so re-showing the field restores what the user typed.\n serverOwned?: boolean // Added (CFW-1): the SERVER computes this value — declare it only where the backing property carries [ServerOwned]. Three effects: the key is UNCONDITIONALLY omitted from the outgoing payload by Core.buildSubmitPayload (preserveOnHide is about predicates and does not apply), the field renders READ-ONLY in every mode including create and edit (Core.testReadOnly), and the value is never used to patch a grid row after a save. DEFENCE IN DEPTH ONLY — the server's [ServerOwned] exclusion is the real guarantee; nothing here may be load-bearing. Distinct from readonly, which is a UI hint testReadOnly also returns for every field in view mode and IGNORES in create mode.\n readonlyAlways?: boolean // Added (readonly-always-1, ARBITER-RULED 2026-08-22 option A): DISPLAY LOCK ONLY — the field renders read-only in EVERY mode, create included, and unlike `readonly` it is not short-circuited by the create branch of Core.testReadOnly. Deliberately NARROWER than serverOwned in exactly one respect and that difference is the whole point: the value STILL RIDES THE OUTGOING PAYLOAD (buildSubmitPayload never reads this flag), so a field filled by valueCalculation or by a picker's onSelectChange keeps being submitted. Required-validation is untouched. Declare it on a read-only READOUT the operator must not overtype on a create form — a rate carried from a template, an identity being restocked, a stock figure computed in the picker. Keep `readonly: true` alongside it for edit-mode consistency with the rest of the estate.\n strict?: boolean\n path?: string\n keyField?: string\n // Persistent helper text under the control. CONVENTION: state what the field EXPECTS, not what it is — the\n // mat-label already names it, so \"Email address\" as a hint spends the line saying nothing.\n // 🔑 Where a control accepts MORE than its label implies, the hint is where that is disclosed, because the\n // label cannot be. `type: 'email'` is the standing example: it takes a semicolon-separated LIST, which nothing\n // in a label reading \"Notify\" would tell anyone — so give it `hint: 'Separate addresses with ;'`. Same\n // obligation for a total-first amount (\"What you paid for all 8 pigs — $125.00 each\") and for any field whose\n // accepted format is narrower or wider than its name suggests.\n hint?: string\n masterField?: string\n masterValueField?: string\n masterDefaultValueField?: string\n // child?: ChildField\n children?: ChildField[]\n masterOptions?: any[]\n optionsUnavailableOffline?: boolean // Added (WS-1): RUNTIME state, not config — set by form.component.ts's loadChildMasterOptions when a dependent select's option fetch died offline, read by select-common to draw the notice. Sits beside masterOptions deliberately: that is written onto the Field by the same method, for the same field, and is the existing precedent for this channel\n nullable?: boolean\n noDefault?: boolean // Added (A-0830-21): opt-in — seed this field BLANK on create instead of its type default. Type-agnostic, honoured first in TinCore.getInitialValue (see the note there). The case it exists for is a date, since every date field otherwise opens pre-filled with today, which is wrong for an open-ended \"Until\". Absent is byte-identical to previous behaviour\n copyContent?: boolean\n clearContent?: boolean\n selectAll?: boolean // Changed: auto-select all options for select-multi\n // Added: opt-in re-fetch for a loadAction URL carrying a {placeholder}. Absent or false is byte-identical to the\n // previous behaviour — spa-select-multi fetched once in ngOnInit and never again, so a URL like\n // 'pigs/list/bypen-{penID}' resolved with an empty penID at dialog open and stayed that way after the user picked\n // a pen. The field already declares its dependency in the URL tokens, so no watched-field name is needed here.\n // Two things ride on this flag together and both are required: form.component.ts leaves an UNRESOLVED token in\n // place (rather than substituting '') so the component can decline to fetch a half-built URL, and select-multi\n // clears its options + selection on a URL change and re-applies selectAll once the new options land.\n refetchOnChange?: boolean\n format?: 'text' | 'money' | 'date' | 'datetime' | 'number'\n hideOnCreate?: boolean\n hideOnExists?: boolean\n readonlyCondition?: (value: any) => boolean;\n detailsConfig?: DetailsDialogConfig;\n loadAction?: Action\n loadIDField?: string;\n infoMessage?: string;\n suffix?: string;\n subfields?: Field[];\n optionsSubject?: BehaviorSubject<any[]>;\n section?: string;\n fileOptions?: {\n allowedExtensions?: string[];\n maxSizeMB?: number;\n compressImages?: boolean;\n };\n documentSource?: DocumentSource; // Added (Phase 6): type:'file-view' renders <spa-document> against the app's OWN authorized stream instead of the legacy <spa-viewer>, which resolved documents through ./assets/ or a PUBLIC Azure container. DocumentSource deliberately cannot express a direct storage URL — see DocumentClasses.ts. Changed (Phase 7, BREAKING): documentSource is now REQUIRED for the field to render at all — the legacy loadAction/path/keyField fallback to <spa-viewer> is deleted\n collapsed?: boolean;\n collapsedCondition?: (value: any) => boolean;\n collapseOnView?: boolean; // Added: type:'section' — open while creating (everything the user must capture is in front of them), collapsed once the record exists so a crowded dialog's tabs stay above the fold. collapsedCondition still wins where the rule is data-driven rather than mode-driven.\n maxHeight?: string;\n editorConfig?: any; // Changed: pass-through AngularEditorConfig for type:'editor' (rich-text/WYSIWYG) fields\n valueCalculation?: (value: any) => any;\n regex?: {\n\n pattern: string;\n message: string;\n };\n onSelectChange?: (value: any, data: any, option?: any, config?: any) => void; // Changed (addpig-label-leak): trailing `config` — the LIVE FormConfig the form is rendering, so a handler can rewrite a SIBLING field's alias/hint and have it repaint. See onChange below for the full reason; both hooks get it so a select and a checkbox can drive the same handler // Changed: Added option parameter to provide direct access to selected option\n icon?: Icon;\n color?: string;\n onChange?: (value: any, allValues: any, config?: any) => void; // Changed (addpig-label-leak): added the trailing `config` — the LIVE FormConfig object this form is rendering. A handler that must rewrite ANOTHER field's `alias`/`hint` (a label that depends on a sibling's value) previously had no way to reach it: it received only value + data, so app code reached for its own service-singleton config instead — and since 20.14.82 deep-clones the config per dialog open (42d665c), that write landed on an object the open dialog does not render and then leaked into the NEXT open. MEASURED on piglet :4203: after ticking a checkbox the live component's own field still read the old alias, while the next dialog opened with the mutated one. Writing the LIVE field object repaints both label and hint immediately (also measured), so handing the handler that object is the whole fix. Optional and TRAILING, so every existing 2-arg handler in the estate is untouched — JS ignores extra arguments\n}\n\nexport interface StatusState {\n condition: (data: any) => boolean;\n icon: string; \n color: string; \n}\n\nexport interface StatusItem {\n name: string;\n hidden?: VisibilityValue; // Changed: replaces hiddenCondition\n visible?: VisibilityValue; // Changed: unified visibility\n states: StatusState[];\n}\n\nexport interface StatusConfig {\n items: StatusItem[];\n sticky?: boolean;\n hidden?: VisibilityValue; // Changed: replaces hiddenCondition\n visible?: VisibilityValue; // Changed: unified visibility\n}\n\n\nexport class AlertMessage {\n type?: 'success' | 'info' | 'warn' | 'critical'\n message?: string // Changed: renamed from content to message\n messageField?: string // Changed: renamed from contentField to messageField\n hidden?: VisibilityValue; // Changed: replaces hiddenCondition\n visible?: VisibilityValue; // Changed: replaces showCondition\n}\n\nexport class AlertConfig {\n subject?: string\n compact? : boolean\n sticky?: boolean \n messages: AlertMessage[]\n}\n\nexport class NotesConfig {\n title?: string;\n loadAction?: Action;\n loadIDField?: string;\n notes?: any[];\n nameField?: string;\n dateField?: string;\n commentField?: string;\n}\n\nexport class FormConfig {\n title?: string\n fixedTitle?: boolean\n alertConfig?: AlertConfig\n fields: Field[]\n mode?: 'create' | 'edit' | 'view'\n button? : Button\n multiColumn?: boolean\n reset?: boolean\n loadAction?: Action\n heroField?: any\n heroValue?: any\n security?: SecurityConfig;\n includeAudit?: boolean\n notesConfig?: NotesConfig;\n preserveHiddenValues?: boolean // Added (C60): ESCAPE HATCH, default false — form-wide opt-out of the predicate-hidden payload filter described on Field.preserveOnHide. Set true to post this.data verbatim, exactly as every form did before C60. Prefer the per-field preserveOnHide: this one disables the protection for the whole form.\n}\n\nexport interface Confirm {\n message?: string\n func?: (data: any) => string;\n // Added: name the action being confirmed instead of answering a question. A destructive prompt reading\n // \"Keep\" / \"Delete\" states the consequence on the button the user is about to press; \"Yes\" / \"No\" makes them\n // re-read the sentence to work out which way round it is. Only the config knows the intent — the dialog is\n // handed a sentence — so the distinction can only come from here.\n // ⚠️ ALL THREE ARE UNDEFINED BY DEFAULT and must stay that way: an omitted label renders \"Yes\" / \"No\" exactly\n // as before, which is what every untracked consumer outside this workspace relies on, and what the 51 E2E\n // assertions that select these buttons expect. Opting in is per call site, never global.\n confirmLabel?: string; // Added: label for the affirmative button — 'Delete', 'Void', 'Discard'\n cancelLabel?: string; // Added: label for the dismissive button — 'Keep'\n destructive?: boolean; // Added: true colours the affirmative action as a warning (red) and the safe one as neutral\n // Added (N22): demand the user TYPE this exact phrase before the affirmative button enables. Undefined by\n // default like the three above, and the default path is untouched — a confirm without it still closes with the\n // bare 'yes' / 'no' string, which is what the 51 E2E assertions and every untracked consumer rely on.\n // 🔴 The comparison is ORDINAL and CASE-SENSITIVE, and that is not a style choice: it mirrors the server's own\n // `string.Equals(request?.Phrase, ResetPhrase, StringComparison.Ordinal)`\n // (AppConfigurationControllerBase.cs:165). A `.trim()` or `.toLowerCase()` anywhere on the client would ENABLE\n // the button on text the server then REJECTS, leaving the user a bare \"Reset not confirmed\" and nothing on\n // screen explaining why.\n // ⚠️ Setting this changes the dialog's CLOSE SHAPE to `{ response, phrase }` — the typed text has to reach the\n // server, which re-validates independently. The library call sites unwrap both shapes via\n // ButtonService.confirmAccepted / confirmPhrase; a hand-written subscriber that only tests `result === 'yes'`\n // must be updated before it sets this.\n requirePhrase?: string;\n}\n\nexport interface Button{\n name: string\n visible?: VisibilityValue; // Changed: widened to boolean | condition\n hidden?: VisibilityValue; // Changed: unified visibility — hidden wins over visible on collision\n // Changed (button-display-fn): widened to a FUNCTION form so a label can describe live data — \"Treat 5 pigs\"\n // updating as pigs are ticked. Purely additive: every existing consumer passes a string and is untouched.\n // 🔴 In a details dialog the function is resolved against `this.details` — the model the dialog is EDITING —\n // and deliberately NOT against createButtonContext, which `disabled` uses. The two questions differ: disabled\n // gates on the PARENT row (\"is this invoice still a draft?\"), display describes what is ABOUT TO BE SUBMITTED.\n // Every other read site goes through Core.buttonDisplay(button, item) so a function never prints as source.\n display?: string | ((data: any) => string);\n icon?: Icon;\n disabled?: (value: any) => boolean;\n color?: string;\n tip?: string\n dialog?: boolean\n action?: Action\n confirm?: Confirm\n inDialog?: boolean\n inHeader?: boolean\n // Added: OPT-IN — make a details-dialog FOOTER button's close emit under its OWN name. Without it, table.component\n // open() emits every success/emit close under the name of the button that OPENED the dialog, so an `inDialog: true`\n // button is a pure silent no-op at the host: shift-spa's Location button closed the dialog and the map never opened\n // because the host received actionClick('view'), never 'location' (GPS phase 6, 2026-08-19). It is opt-in and NOT\n // the default because the framework approvals buttons (Approve/Decline/Cancel) are all inDialog and have emitted\n // under the opener's name since they existed — flipping that would rewrite the event name for approvals in five\n // apps, and consumer apps outside this workspace use tin-spa too.\n emitOwnName?: boolean;\n detailsConfig?: DetailsDialogConfig\n setHeroField?: boolean;\n ignorePendingApproval?: boolean;\n keepOpen?: boolean;\n onSuccess?: (response: ApiResponse, details: any) => void;\n onClick?: (details: any, reload?: () => void) => void; // Changed: SECOND ARGUMENT `reload` — a pure onClick is terminal (the host returns the moment it comes back), so a handler that runs its own multi-call job had no way to say \"the list I just changed is stale, fetch it again\" and two apps reached for window.location.reload(). Call reload() when the work settles. Purely additive: a one-parameter handler is still assignable and, calling nothing, behaves exactly as before. NOT a widened RETURN type — six live handlers are concise-body `() => router.navigate(...)`, so returning a Promise would silently start reloading after every navigation\n editOnSuccess?: boolean\n onSuccessButton?: Button\n skipValidation?: boolean\n resetMode?: 'create' | 'edit'; // Reset dialog to this mode after keepOpen success\n rowDataMap?: Record<string, string | ((data: any) => any)>; // Changed: Map row data fields — string for simple mapping, function for computed values\n capability?: CapItem | string; // Added: OPT-IN capability gate — the role column the SERVER checks for this button's action. Pass the CapItem OBJECT (`this.dataService.capTrips`), exactly as SecurityConfig.allow does, so the name resolves at CALL time: CapItem's constructor sets name = \"\" and datalib assigns \"cap53\" later, so an eagerly-read `.name` would capture \"\" and silently gate nothing. A literal string is accepted too. Omit it and the button behaves exactly as before; a CUSTOM-named button is otherwise ungated because hasRequiredAccess() maps only view/edit/create/delete\n requiredAccess?: RoleAccess; // Added: level `capability` must reach, mirroring the server. Defaults to RoleAccess.Edit — BaseController.CustomActionAccess's floor for every custom action. Use Create for `?action=create` posts and Full where the controller raises the bar\n}\n\n\nexport interface CapsuleConfig {\n displayField: string;\n leftIcons?: Icon[];\n rightIcons?: Icon[];\n // buttons?: Button[];\n loadAction?: Action;\n}\n\nexport interface CardConfig {\n imageField?: string;\n titleField: string;\n subtitleField?: string;\n contentFields: string[];\n columns?: number;\n elevation?: 'low' | 'medium' | 'high';\n}\n\n// Changed: Added tile style type for different visual modes\nexport type TileStyle = 'basic' | 'icon' | 'chart';\n\n// Changed: Added chart type for tile chart style\nexport type TileChartType = 'line' | 'bar' | 'pie' | 'doughnut';\n\n// Changed: Added chart config for tile chart style\nexport interface TileChartConfig {\n type: TileChartType; // Chart type to render\n dataField?: string; // Changed: Made optional — Field name from API response containing Chart.js data\n data?: any; // Changed: Added inline Chart.js data (alternative to dataField)\n color?: string; // Primary chart color\n colors?: string[]; // Multiple series/segment colors\n height?: number; // Chart height in px (default 120)\n gaugeValue?: number; // Doughnut gauge: percentage (0-100), auto-generates data\n gaugeColor?: string; // Doughnut gauge: fill color\n}\n\nexport interface Tile {\n\n name: string;\n alias?: string;\n value?: string;\n color?: string | ((data: any) => string); // Changed: widened to a function of the tile DATA — a figure whose colour depends on its own value (outstanding red / settled green) had no config expression before, only a static colour\n format?: 'money' | 'number'; // Added: format the tile figure. 'money' renders 1,234.50 exactly as the table's money column does; 'number' matches the number column. Absent = the raw value, which is what every existing tile keeps.\n selectedTile?: string;\n hidden?: VisibilityValue; // Changed: boolean | condition — absorbs removed hiddenCondition\n visible?: VisibilityValue; // Changed: unified visibility\n info?: string;\n prefix?: string;\n suffix?: string;\n action?: Action;\n // Changed: Added properties for icon and chart tile styles\n style?: TileStyle; // Tile visual mode: 'basic' (default), 'icon', 'chart'\n icon?: string; // Mat-icon name for icon style (e.g., 'storage', 'attach_money')\n footer?: string; // Footer text (for icon and chart styles)\n footerIcon?: string; // Footer mat-icon name\n badge?: string; // Badge field name from API response (e.g., '+18%')\n badgeColor?: string; // Badge background color\n chart?: TileChartConfig; // Chart config for chart style\n filter?: (row: any) => boolean; // Added: client-side row filter for LOCAL-data tables — a clicked tile filters the grid in memory (no loadAction swap); unclick restores all rows\n data?: any; // Added: arbitrary host payload carried on the tile (e.g. a section key the click handler resolves)\n}\n// Added: one quick-filter chip in the row that sits directly under the tiles. Deliberately shaped like Tile:\n// a chip filters EITHER by swapping the table's loadAction (`action` — the server narrows the result) OR by a\n// client predicate (`filter` — the rows already in memory are narrowed). Those are the same two paths\n// tileClicked() has always had, so a chip is not a new mechanism, only a new control surface for the old one.\nexport interface FilterChip {\n key: string; // identity of the chip; 'all' is reserved for the leading All chip\n label: string; // what the user reads on the pill\n icon?: string; // optional leading mat-icon, exactly as a Day Book lane pill carries one\n count?: number; // optional trailing count bubble\n action?: Action; // SERVER mode: replaces the table's loadAction while this chip is selected\n filter?: (row: any) => boolean; // LOCAL mode: narrows the rows already loaded, no round trip\n data?: any; // arbitrary host payload (dynamic chips carry their source row here)\n hidden?: VisibilityValue; // same visibility contract every other library item uses\n visible?: VisibilityValue;\n}\n\n// Added: the quick-filter chip row. STRICTLY OPT-IN — a TableConfig that does not declare `chipConfig` renders\n// exactly as it does today, which is the guarantee owed to the untracked external consumers of this library.\n// Two sourcing modes, both supported:\n// STATIC — `chips` are declared in the config, the way the Day Book declares its lanes.\n// DYNAMIC — `loadAction` fetches the chips from the server ({ id, name } from the base controller's list\n// projection), and `chipAction` is the per-chip template whose {value} is substituted with each\n// row's id. This is the mode Piglet's shelter chips use.\n// If both are given, the static chips are placed first and the loaded ones appended after them.\nexport class FilterChipConfig {\n chips?: FilterChip[] // STATIC mode\n loadAction?: Action // DYNAMIC mode: returns the rows the chips are built from\n chipAction?: Action // DYNAMIC mode: per-chip action template; {value} -> the row's id\n chipFilter?: (row: any, chip: FilterChip) => boolean; // DYNAMIC alternative to chipAction — filter in memory instead\n valueField?: string // field on a loaded row to use as the chip key (default 'value' — BaseController.GetList projects ListOption { Name, Value })\n labelField?: string // field on a loaded row to use as the chip label (default 'name')\n icon?: string // icon applied to every dynamically-built chip\n showAll?: boolean // default true — the leading \"All\" chip the owner asked to always be first\n allLabel?: string // default 'All'\n allIcon?: string // optional icon for the All chip\n default?: string // key selected on load (default 'all'); a configurable default, as asked\n layout?: 'wrap' | 'carousel' // default 'carousel' — one scrollable row with arrows, the Day Book feel\n remember?: string // localStorage key; when set, the chosen chip survives a reload\n // Added: opt-in drag-to-reorder of the CHIPS themselves, posting the same ReorderRequest every other orderable\n // surface posts. STRICTLY OPT-IN — a chipConfig that does not declare it renders no grips and posts nothing.\n // The leading \"All\" chip is pinned and is never draggable, because it is not an entity and has no id.\n orderable?: OrderableConfig | boolean\n}\n\nexport class TileConfig {\n tiles: Tile[]\n loadAction?: Action\n loadInit?: boolean\n clickable?: boolean\n headerPosition?: | 'top' | 'middle';\n quietLoading?: boolean; // Added (Quiet Loading): overrides AppConfig.quietLoading for these tiles — an explicit false opts OUT of an app-wide opt-in\n // Added: how a tile row behaves when there are more tiles than fit.\n // 'auto' (DEFAULT, and what every existing page gets) — the original behaviour: tiles stretch to fill the\n // row and shrink to a 150px floor, wrapping when they run out of room. Left as the default deliberately;\n // briefly making 'wrap' the default regressed every page on a phone (one tile per row).\n // 'wrap' — a grid of equal-width tracks: tiles that do not fit flow onto the next row at the SAME width.\n // 'carousel' — one row, horizontal scroll with arrows. What the Day Book uses.\n layout?: 'auto' | 'wrap' | 'carousel';\n minTileWidth?: number; // Added: px floor for one tile (default 200). 'wrap' and 'carousel' only — 'auto' keeps its original 150px\n maxPerRow?: number; // Added: 'wrap' only — hard cap on tiles per row regardless of how many would fit\n hideValueOnMobile?: boolean; // Added: drop the money badge under 700px. Opt-in, because on most pages the badge is the only place that number appears — the Day Book sets it since the figure is already on the group header\n}\n\n// Changed: Added chart type union for standalone charts component\nexport type SpaChartType = 'line' | 'bar' | 'pie' | 'doughnut';\n\n// Changed: Added individual chart definition interface\nexport interface ChartItem {\n name: string; // Unique identifier\n title?: string; // Card title\n subtitle?: string; // Card subtitle\n footer?: string; // Footer text\n footerIcon?: string; // Mat-icon name for footer\n type: SpaChartType; // Chart type\n loadAction?: Action; // URL to load Chart.js-format data\n data?: any; // Pre-loaded data (alternative to loadAction)\n colors?: string[]; // Series/segment colors\n height?: string; // Chart area height (default '300px')\n showLegend?: boolean; // Changed: Show Chart.js auto-generated legend below chart\n showPoints?: boolean; // Line chart: show data points\n tension?: number; // Line chart: curve tension (0=straight, 0.4=smooth)\n gaugeValue?: number; // Doughnut gauge: percentage (0-100), auto-generates data\n gaugeColor?: string; // Doughnut gauge: fill color\n hidden?: VisibilityValue; // Changed: boolean | condition — absorbs removed hiddenCondition\n visible?: VisibilityValue; // Changed: unified visibility\n options?: any; // Chart.js options passthrough\n}\n\n// Changed: Added chart config container class\nexport class ChartConfig {\n charts: ChartItem[]; // Array of chart definitions\n loadAction?: Action; // Single endpoint returning all chart data by name\n loadInit?: boolean; // Auto-load on component init\n columns?: number; // Fixed grid columns (default: responsive auto-fit)\n}\n\nexport class Step {\n name: string\n value?: any\n icon?: string;\n hidden?: VisibilityValue; // Changed: replaces hiddenCondition\n visible?: VisibilityValue; // Changed: unified visibility\n}\nexport class StepConfig {\n steps: Step[]\n valueField?: string\n loadAction?: Action;\n loadIDField?: string;\n sticky?: boolean \n}\n\nexport interface Icon {\n name: string\n color?: string\n tip?: string\n tipField?: string\n bannerField?: string\n condition?: (value: any) => boolean;\n}\n\nexport interface Color {\n name: string\n condition?: (value: any) => boolean;\n}\n\n\nexport interface GroupData {\n groupValue: any;\n displayName: string;\n icon?: string;\n color?: string;\n items: any[];\n order: number;\n // Added (group-orderable): the RAW server group row this GroupData was mapped from. The mapping above keeps only\n // six fixed keys, so a group-level scopeField (e.g. 'shelterID' on Piglet's pen groups) had nowhere to be read\n // from. Optional and untouched by every existing consumer.\n source?: any;\n}\n\n\nexport interface GroupConfig {\n // Server response field mapping (defaults match GroupedItemDto property names)\n groupValueField?: string; // Default: 'groupValue'\n displayNameField?: string; // Default: 'displayName'\n iconField?: string; // Default: 'icon'\n colorField?: string; // Default: 'color'\n orderField?: string; // Default: 'order'\n itemsField?: string; // Default: 'items'\n\n // Item display\n itemTextField: string;\n itemIcon?: Icon;\n itemIcons?: Icon[];\n itemAdditionalIcons?: Icon[];\n\n // Group display\n groupIcons?: Icon[];\n showGroupCount?: boolean;\n emptyGroupMessage?: string;\n showEmptyGroups?: boolean;\n\n // Actions\n headerButtons?: Button[];\n contextMenuEnabled?: boolean;\n\n // Filter\n filterEnabled?: boolean; // Changed: Show search input above groups (default: true for grouped views)\n\n // Drag and drop\n dragEnabled?: boolean;\n dropAction?: Action;\n\n // Added: opt-in drag-to-reorder of the GROUPS themselves, by dragging a card's title section. This is the THIRD\n // and outermost of three orthogonal opt-ins, and any combination of them is legal:\n // groupConfig.dragEnabled + dropAction -> MOVES an item to another group (item, cross-group)\n // TableConfig.orderable -> REORDERS items inside one group (item, within-group)\n // groupConfig.groupOrderable -> REORDERS the groups themselves (group)\n // Deliberately the SAME OrderableConfig shape as the item-level opt-in — the group list is just another ordered\n // scope, and a second vocabulary would drift from the one contract. The posted id list is the GROUP ids\n // (groupOrderable.idField off the raw server group, else GroupData.groupValue) and the scope is the value all\n // groups agree on under `scopeField`. Groups that DISAGREE self-gate the drag off with a stated reason — see\n // OrderableConfig.scopeMixedReason. A groupConfig that omits this renders zero group affordances.\n groupOrderable?: OrderableConfig | boolean;\n}\n\nexport interface Column {\n name: string;\n type?: 'text' | 'date' | 'date-short' | 'datetime' | 'datetimesec' | 'checkbox' | 'select' | 'money' | 'number' | 'chip' | 'chips' | 'icon' | 'spinner' | 'button' | 'monogram'; // Changed: added chips — an ARRAY field renders one chip per item instead of interpolating as '12,13'; each chip drills into ITS OWN record, not the row's. Changed earlier: added monogram — renders a person's name as a deterministic coloured initials circle; sorting/filtering still use the underlying value\n alias?: string;\n keyField?: string; // Changed: monogram only — row field holding the STABLE identity (e.g. 'createdBy' username) that seeds the colour; falls back to the normalized display value when absent\n listField?: string; // Added: chips only — the row field holding the array; defaults to name. Separate from name so the column can be named/sorted on one field and list another\n idField?: string; // Added: chips only — the property the CLICKED ITEM is handed to detailsConfig under, i.e. that dialog's heroField (e.g. 'rentalID' for an invoice's rentalIDs). Without it a scalar item has no identity to open, so the chip stays inert rather than opening the ROW — the drill-in must be about the item, never the record that merely references it\n maxLength?: number;\n icon?: Icon;\n color?: Color;\n colors?: Color[];\n icons?: Icon[];\n options?: any[];\n optionDisplay?: string\n optionValue?: string\n detailsConfig?: DetailsDialogConfig\n hidden?: VisibilityValue; // Changed: replaces hiddenCondition — condition receives parentData\n visible?: VisibilityValue; // Changed: unified visibility\n}\n\n\n// Added: opt-in inline row editing — edit opens the row's cells in place instead of a dialog\nexport interface InlineEditConfig {\n fields?: string[] // subset of column names editable inline; default = all columns with a matching formConfig field\n}\n\n// Added: one-step create — marks a nested tab as visible during create mode; its rows are kept in memory\n// on the parent form model under navigationProperty and submitted with the parent in a single POST\nexport interface CreateTabConfig {\n navigationProperty: string // parent model property the local rows bind to — must match the backend navigation property's JSON name (e.g. 'items')\n}\n\n// Added: opt-in server-side pagination — presence of TableConfig.pagination activates paged mode\nexport class PaginationConfig {\n pageSize?: number // server fetch chunk per request (default 20); display page size stays paginator-driven via TableConfig.pageSizes\n}\n\n// Added: opt-in drag-to-reorder rows. Pairs with the backend IOrder convention — the entity must implement\n// TinWeb's IOrder or the reorder POST is refused; nothing here can make a non-IOrder entity orderable.\n// The client posts the COMPLETE ordered id list for one scope and never posts order numbers: position IS the\n// order and the server assigns 1..N, which is what lets its set-comparison guard detect a stale page instead\n// of silently scrambling somebody else's arrangement (see TinWeb Contracts\\ReorderRequest.cs).\nexport interface OrderableConfig {\n scopeField?: string // row field holding the [OrderScope] value; omit entirely for a flat tenant-wide sequence\n scopeValue?: any // explicit scope when it is not on the rows (Pen Overview: the chosen shelter). Wins over scopeField\n action?: Action // defaults to { url: '<entity>/reorder', method: 'post' } derived from loadAction\n handle?: boolean // true = drag only by the grip handle; false/absent = the whole row is the drag target\n idField?: string // row field carrying the entity id; defaults to heroField, then the row's own ...ID key\n // Added (group-orderable): the remedy shown on the greyed grip when the rows/groups on screen span MORE THAN ONE\n // scopeField value, so no single scope could be posted. Only the group level self-gates on this today. The\n // library cannot word it — it does not know what a shelter is — so the consumer supplies the sentence\n // (e.g. 'Select a single shelter to reorder pens'); the default below is deliberately generic.\n scopeMixedReason?: string\n}\n\nexport type TableViewType = 'table' | 'capsule' | 'card' | 'grouped';\nexport class TableConfig{\n viewType?: TableViewType \n capsuleConfig?: CapsuleConfig\n cardConfig?: CardConfig\n groupConfig?: GroupConfig\n tabTitle?: string\n tabTemplate?: any // Added: TemplateRef rendered as the tab's content instead of a spa-table (assigned at runtime by the host component); count badge (countAction) + lazy loading still apply\n noDataMessage ?: string\n columns? : Column[]\n minColumns?: string[]\n // Added (clickable identity): which column names the thing a row IS — the invoice number on an invoice, the\n // trip number on a trip — as opposed to a column that merely mentions a RELATED entity (a trip’s vehicle name).\n // DECLARED, never guessed. A “first name-ish column” rule was built and measured against the 46 configs whose\n // authors had already declared an identity in code: it picked a column a human would not on 47.8% of them,\n // including hanging a work order’s identity on the VEHICLE’s name. So the library resolves a declaration; it\n // never infers one. `false` states positively that this table’s rows are not entities (aggregate, report and\n // summary grids) — which also means no locked-row cue, because there is no identity on screen to decorate.\n // Absent, the existing name -> description -> id/PK convention applies unchanged, exactly as it did before.\n identityColumn?: string | false\n showFilter?: boolean\n showFilterButton?: boolean\n holdFilterSpace?: boolean\n holdHeaderButtonSpace?: boolean\n elevation?: 'none' | 'low' | 'medium' | 'high'\n formConfig?: FormConfig\n searchConfig?: SearchConfig\n tileConfig?: TileConfig\n chipConfig?: FilterChipConfig // Added: opt-in quick-filter chip row rendered directly under the tile row. Absent = no chip row and no behaviour change whatsoever.\n stepConfig?: StepConfig\n buttons?: Button[]\n minButtons?: string[]\n loadAction?: Action\n countAction?: Action\n loadIDField ?: string\n loadCriteria?: string\n lazyLoad?: boolean\n causeFormRefresh?: boolean\n logResponse?: boolean\n flatButtons?: boolean\n greyOut?: (value: any) => boolean;\n heroField?: any\n heroValue?: any\n collapseButtons?: boolean\n parentData ? : any\n pageSizes?: number[]\n maxButtonsCount?: number\n hidden?: VisibilityValue; // Changed: replaces hideTabCondition — hides this table's tab (condition receives parent details)\n visible?: VisibilityValue; // Changed: unified visibility for the tab\n\n download?: { columns: string[], fileName?: string, hidden?: VisibilityValue, visible?: VisibilityValue } // Changed: hiddenCondition → hidden/visible\n upload?: { action: Action, messages?: AlertMessage[], hidden?: VisibilityValue, visible?: VisibilityValue } // Changed: hiddenCondition → hidden/visible\n import?: ImportConfig // Added: generic AI-assisted data import wizard (spa-import-dialog)\n realTime?: boolean // Changed: Enable real-time SignalR updates — skips refresh after CUD operations\n realTimeFallbackMs?: number // Added: how long a real-time table waits for its own write to arrive as a broadcast before falling back to a refresh (default 3000)\n entityName?: string // Changed: Entity name for SignalR subscription (defaults to URL-derived name)\n offline?: OfflineConfig | boolean // Added: TinSync offline opt-in — boolean shorthand: true === { enabled: true } with defaults\n pagination?: PaginationConfig // Added: opt-in server-side pagination — chunked fetches with true server total; disabled when offline is set (offline wins)\n // Added: opt-in drag-to-reorder. STRICTLY OPT-IN — a TableConfig that does not declare `orderable` renders\n // ZERO drag affordances and behaves exactly as it did before, which is the regression guard the spec pins.\n // `true` is shorthand for `{}`. Dragging is suppressed while the natural view is not on screen — an active\n // filter or a scope spanning more than one page — because the contract requires the COMPLETE scope.\n orderable?: OrderableConfig | boolean\n allowUserKeepOpen?: boolean; // Added: propagates to inline DetailsDialogConfig for buttons without their own detailsConfig\n keepOpenBehavior?: 'reset' | 'edit'; // Added: controls what happens after successful create when user has Keep Open ticked — 'reset' clears form for next entry (default), 'edit' switches to edit mode with new entity\n inlineEdit?: boolean | InlineEditConfig // Added: edit opens the row cells in place (submit/cancel icons) instead of a dialog\n createConfig?: CreateTabConfig // Added: one-step create — show this nested tab during create with rows kept in memory on the parent model\n quietLoading?: boolean // Added (Quiet Loading): overrides AppConfig.quietLoading for this table — an explicit false opts OUT of an app-wide opt-in\n // Added: this table renders its OWN failure panel (HTTP status + endpoint + Retry) instead of raising the\n // app-wide error modal. Set automatically on a details dialog's child tabs — see detailsDialog.component —\n // because one broken tab must not brick the dialog around it. Undefined everywhere else, so a standalone\n // page table keeps the modal exactly as it always had it; an explicit false opts a child tab back out.\n inlineErrors?: boolean\n sectionConfig?: TableSectionConfig // Added: collapsible flat section header wrapped around the table (Day Book sections)\n // Added (delivered-order-lines-ui-gate): the table's own one-line \"why this list is the way it is\", drawn in\n // the SAME <p class=\"tbl-section-caption\"> the section header already uses — reach extended from\n // sectionConfig to the table itself, no second mechanism and no new styling. It exists because a table whose\n // write buttons are HIDDEN by a `hidden` predicate otherwise says nothing at all about why they are gone.\n // May be a function so it can read config.parentData and name the remedy that actually applies (the\n // string | fn form is precedented on DayBookSection.caption). NOT the read-only annotation bar removed on\n // 2026-08-19 — that one was unconditional and told every dialog the same content-free thing; this renders\n // only when a config asks for it, and carries the remedy the server names when it refuses the write.\n caption?: string | ((parent: any) => string)\n hideColumnHeaders?: boolean // Added: suppress the column-name header row (grid-look sections)\n // Added (phone density): drop the paginator on a PHONE when every row already fits on one page. A pager\n // reading \"1 – 4 of 4\" is 56px spent navigating nothing — the single largest item in a Day Book section\n // card, which is otherwise 46px of section header + 50px of column headers around 4 rows. It stays on\n // desktop, and it stays on a phone the moment there is a second page to reach.\n // OPT-IN, and deliberately so: a library default is a contract with consumer apps that are not in this\n // workspace, so this changes nothing for a table that does not ask for it.\n hideSinglePagePaginator?: boolean\n}\n\n// Added: collapsible flat section header for spa-table — icon, title, count pill, summary chips, bulk\n// buttons, chevron. 1px-border flat styling (no elevation). Collapse state lives on the component, never\n// on this shared config; `collapsed` only seeds the initial state.\nexport interface TableSectionChip { text?: string; color?: string; hidden?: VisibilityValue; visible?: VisibilityValue; } // visibility predicates receive the table's rows\nexport interface TableSectionConfig { title: string; icon?: string; caption?: string; showCount?: boolean; chips?: TableSectionChip[]; buttons?: Button[]; collapsible?: boolean; collapsed?: boolean; hideWhenEmpty?: boolean; } // Changed: caption — the one-line \"why this list exists\", drawn under the title where it belongs (a chip is too short to carry it)\n\nexport class PageConfig {\n title?: string;\n tableConfig?: TableConfig;\n searchTableConfig?: TableConfig;\n titleActions?: Field[];\n}\n\n// Generic AI-assisted data import wizard config — enables a \"spa-import-dialog\" wizard on a table\nexport interface ImportConfig {\n entity: string; // backend endpoint key, e.g. 'equipments'\n title?: string; // dialog title, default 'Import ' + entity\n securityConfig?: SecurityConfig; // hide the Import button per capabilities\n hidden?: VisibilityValue; // Changed: replaces hiddenCondition\n visible?: VisibilityValue; // Changed: unified visibility\n onComplete?: (summary: any) => void; // called after a successful commit\n}\n\n\n\n\n//---Base---\n\nexport class ApiResponse {\n success: boolean;\n message: string;\n data;\n total?: number; // Added: true server row count — present IFF the server actually paged the response\n reason?: string; // Added: machine-readable failure class from RepoResponse (\"conflict\" | \"not_found\" | \"validation\") — \"conflict\" means the record was modified by another user and data carries the fresh server row\n rowVersion?: string; // Added: refreshed optimistic-concurrency token after a successful edit — patched back into the open record so it can be saved again without a reload\n fileMessage?: string; // Added (Phase 6): RepoResponse.FileMessage — what HandleSaveFiles made of the uploaded files (BaseController.cs:920/933/949). 🔴 It is INDEPENDENT of `success`: the record can save while every attachment is rejected, which is exactly the case that used to report a plain \"Submitted\". camelCase because that is what the wire carries, as confirmed on the live stream in Phase 3\n}\n\nexport class Constants {\n public static readonly AUTH_USER = 'a';\n public static readonly AUTH_NAME = 'b';\n public static readonly AUTH_ROLES = 'c';\n public static readonly AUTH_TOKEN = AUTH_TOKEN_KEY;\n public static readonly AUTH_TOKEN_EXPIRE = 'e';\n public static readonly AUTH_TENANT_NAME = 'f';\n public static readonly AUTH_REFRESH_TOKEN = AUTH_REFRESH_TOKEN_KEY; // Changed: Added for refresh token storage\n public static readonly AUTH_REFRESH_TOKEN_EXPIRE = 'h'; // Changed: Added for refresh token expiry\n public static readonly AUTH_REMEMBER_ME = 'r'; // Changed: Added for remember me flag\n public static readonly AUTH_TYPE = 'i'; // Added: the signed-in user's AuthType ('local' | 'AD' | 'google' | ...) — surfaces that only apply to password-backed accounts need it after a reload, not just at login\n public static readonly LAST_ROUTE = 'lr'; // Added: last visited route per user, for resumeLastRoute (persistent — survives browser close)\n}\n\nexport class ListDialogConfig {\n name: string;\n title: string;\n listName: string;\n}\n\n// Added: payload for DialogService.openTableDialog — a READ-ONLY window onto an entity list, hosted in a MatDialog.\n// config is the entity own TableConfig, spread by the caller, so the dialog reads through THAT capability-gated\n// loadAction and never through a route that is merely [Authorize]-gated. spa-table-dialog hardens whatever arrives here\n// (readOnlyTableConfig) — read-only is enforced by the dialog, never assumed of the caller.\nexport interface TableDialogConfig { title: string; subtitle?: string; config: TableConfig; } // Changed: subtitle is now UNRENDERED — its only render site was the read-only annotation bar removed on 2026-08-19. Kept, not deleted, so untracked consumers passing it still compile; it is simply ignored.\n\nexport class CapItem {\n\n constructor() {\n this.name = \"\";\n this.display = \"New Cap Item\";\n this.enabled = false;\n this.type = \"\";\n this.newLine = false;\n this.showMenu = true;\n this.ignoreSubsDisplay = false;\n this.link = \"\";\n this.icon = \"navigate_next\";\n this.color = \"black\";\n this.isBool = false;\n this.featureKey = \"\"; // Added: default empty — no feature restriction\n this.moduleKey = \"\"; // Added (Setup v2): default empty — no module restriction\n\n }\n\n name: string;\n display: string;\n enabled: boolean;\n showMenu: boolean;\n\n ignoreSubsDisplay: boolean;\n type: string;\n newLine: boolean;\n link: string;\n icon: string;\n capSubItems: CapItem[];\n color: string;\n isBool : boolean;\n featureKey: string; // Added: maps to subscription feature key for plan-based gating\n moduleKey: string; // Added (Setup v2): maps to a SetupModule key — menu hidden while that module is disabled\n\n}\n\n// Added: one cell of the mobile bottom tab bar (spa-bottom-tabs). Config-driven like CapItem so an app can\n// rename/relink/reorder its tabs without touching the library. badge names a live count stream ('notifications'\n// is the only one wired today); moduleKey reuses the Setup-module gating contract that already hides menus.\nexport class BottomTab {\n\n constructor() {\n this.name = \"\";\n this.display = \"New Tab\";\n this.icon = \"navigate_next\";\n this.link = \"\";\n this.badge = \"\"; // Added: default empty — no badge\n this.moduleKey = \"\"; // Added: default empty — no module restriction\n this.requires = undefined; // Added (DBT-1): default undefined — no SURFACE requirement, so a hand-written tab is gated exactly as it is today\n }\n\n name: string;\n display: string;\n icon: string;\n link: string;\n badge?: 'notifications' | ''; // Added: which live count decorates this tab\n moduleKey?: string; // Added: maps to a SetupModule key — tab hidden while that module is disabled\n\n // Added (DBT-1): names a library SURFACE this tab leads to, so the tab can be ABSENT when the surface does not\n // exist in this app rather than being a cell that navigates to an empty state. This is a different question\n // from moduleKey and that is why it is a separate property: moduleKey asks \"has this TENANT switched the\n // module on\", which presupposes tenancy and a Getting Started toggle, while `requires` asks \"does this APP\n // configure the surface at all\" — a build-time fact that is true or false before anyone logs in.\n // 'dayBook' resolves against AppConfig.dayBookConfig, whose absence already disables the feature (see its\n // declaration below). Undefined — the default — means no surface requirement, which is why every existing\n // hand-written tab is unaffected.\n requires?: 'dayBook';\n\n}\n\nexport class AppConfig {\n constructor() {\n this.appName = \"App Name\";\n this.logo = \"\";\n this.logoSize = \"normal\";\n this.ADAuth = true;\n this.localAuth = true;\n this.googleAuth = false;\n this.microsoftAuth = false;\n this.microsoftAuthMessage = \"Sign in with Microsoft\";\n this.selfService = false;\n this.multitenant = false;\n this.navigation = 'top';\n // Changed: progressLine removed — it was inert since 2026-08-05 and no app assigns it any more; quietLoading owns the dialog's progress line\n this.loginStyle = 'default';\n this.dialogStyle = 'default'; // Added: opt-in modern dialog styling — 'default' keeps the long-standing look for every existing app\n this.termsUrl = \"\";\n this.privacyUrl = \"\";\n this.siteUrl = \"https://alsquaretech.net/\";\n this.navWidth = '200px';\n this.navColor = 'rgba(0,0,0,0.78)'; // Changed: Default dark overlay for side-modern sidebar\n this.navImage = ''; // Changed: Default no background image for side-modern sidebar\n this.keepSignedIn = false; // Changed: Hide \"Keep me signed in\" unless explicitly enabled\n this.resumeLastRoute = false; // Added: opt-in — off by default so existing apps keep landing on their default page\n this.quietLoading = false; // Added: opt-in — off by default so existing apps keep the classic full-screen loader\n\n // Added: default bottom tabs — the mobile-only bar, so every app gets it with zero config.\n // 'home/day-book' resolves per app (shared page or the app's own), so one default link works everywhere.\n // Changed (ALERTS-1): the Notifications tab is REMOVED. It only ever existed because every nav layout hid\n // its bell behind *ngIf=\"!smallScreen\", leaving phones no other way in; the owner's directive is that\n // notifications live ONLY as the top-nav bell icon, visible at every size. That makes the tab redundant.\n // 🔑 COUPLING, now satisfied — do not remove one half without the other. This deletion is only safe because\n // nav-menu was changed in the SAME commit to show the bell at every size: side-modern dropped its\n // *ngIf=\"!smallScreen\", and top-modern gained a bar-level .tm-bar-bell for the widths where .tm-actions\n // collapses into the toggler dropdown. Reinstate either *ngIf and phones lose every route to notifications.\n this.bottomTabs = [\n { name: 'home', display: 'Home', icon: 'home', link: 'home', badge: '', moduleKey: '' },\n { name: 'daybook', display: 'Day Book', icon: 'menu_book', link: 'home/day-book', badge: '', moduleKey: '', requires: 'dayBook' }, // Changed (DBT-1): Day Book cannot exist without an app-supplied dayBookConfig, so the DEFAULT tab bar was offering a quarter of its cells to an empty state in every app that never configured one. `requires` makes the tab absent there instead of dead. moduleKey stays '' deliberately — Day Book is not a Getting Started module and gating it as one would ALSO hide it in single-tenant apps that do configure it.\n { name: 'agent', display: 'Chat', icon: 'chat_bubble', link: 'home/agent', badge: '', moduleKey: 'agent' }\n ];\n\n }\n\n appName: string;\n logo: string;\n logoSize: string;\n ADAuth: boolean;\n localAuth: boolean;\n googleAuth: boolean;\n microsoftAuth: boolean;\n microsoftAuthMessage: string;\n selfService: boolean;\n capItems: CapItem[];\n multitenant : boolean;\n // Changed: the legacy flat 'side' layout (the light-blue mat-sidenav list) is DELETED — its template block\n // and CSS are gone from nav-menu.component. Surviving modes: 'top' | 'top-modern' | 'side-modern'.\n // The setter still ACCEPTS 'side' so an untracked external consumer whose stored config says 'side' keeps\n // booting: it degrades to 'side-modern' rather than rendering a blank shell (no template branch would match).\n // Warns once per session, not per assignment — appConfig is reassigned on every config load.\n private navigationValue: 'top' | 'side-modern' | 'top-modern' = 'top';\n private static navigationWarned = false;\n\n set navigation(value: 'top' | 'side' | 'side-modern' | 'top-modern') { // Changed: write type keeps 'side' assignable for existing consumers\n if (value === 'side') {\n if (!AppConfig.navigationWarned) {\n AppConfig.navigationWarned = true;\n console.warn(\"[tin-spa] appConfig.navigation = 'side' has been REMOVED (the legacy flat side menu). Falling back to 'side-modern'. Update your app config to one of: 'top', 'top-modern', 'side-modern'.\");\n }\n this.navigationValue = 'side-modern';\n return;\n }\n this.navigationValue = value;\n }\n\n get navigation(): 'top' | 'side-modern' | 'top-modern' { // Changed: read type is the three SURVIVING modes only — 'side' can never be observed\n return this.navigationValue;\n }\n // Changed: the @deprecated progressLine flag is gone. It gated the details dialog's old indeterminate\n // mat-progress-bar, which quietLoading's perceived-progress line replaced; it had been inert since\n // 2026-08-05 and every consumer SPA has dropped its assignment, so the declaration goes too.\n // Changed (Phase 7): optional and DEPRECATED — INERT. Its only reader was viewerDialog, which built a\n // public storage URL from it; that component is deleted. Kept as an optional declaration purely so the\n // consumer apps still assigning it keep compiling. Nothing in the library reads it. Do not add a reader.\n docsBaseUrl?: string;\n loginStyle : string;\n // Added: 'modern' switches EVERY dialog (message, confirm, details, list, import, viewer) to the modern\n // treatment in one setting. Anything else — including undefined — keeps the previous look, so an app that\n // never sets it is unaffected. Mirrors how loginStyle works.\n dialogStyle : string;\n loginTitle : string;\n loginMessage : string;\n termsUrl: string;\n privacyUrl: string;\n siteUrl: string;\n navWidth: string;\n navColor: string; // Changed: Sidebar overlay color for side-modern\n navImage: string; // Changed: Sidebar background image path for side-modern\n keepSignedIn: boolean; // Changed: Toggle the \"Keep me signed in\" option on the login page (hidden when false/undefined)\n resumeLastRoute: boolean; // Added: land a resumed session on the user's last visited page instead of the default start page\n // Added (Quiet Loading): app-wide loading style. false (default) keeps the global blocking scrim for every read;\n // true lets tables, tiles and details dialogs render their own local loading state instead. Individual\n // TableConfig/TileConfig/DetailsDialogConfig can override either way. Mirrors how dialogStyle works. // Changed: dropped the progressLine reference — that flag no longer exists\n quietLoading: boolean;\n // Added: app-wide opt-in for NAMED destructive confirmations. false/undefined (the default) keeps every\n // built-in prompt reading \"Yes\" / \"No\" exactly as it does today, so an app that never sets it — including the\n // untracked consumers outside this workspace — is completely unaffected. true lets the library name the\n // action on its OWN built-in prompts (the delete/remove confirmations it generates when a button declares no\n // confirm message of its own), so \"Are you sure you want to delete Volvo?\" answers with \"Keep\" / \"Delete\".\n // NOTE: this flag gates the LABELS and the colour ONLY — never the message. The sentence itself, including the\n // record's name, is composed by ButtonService.getConfirmOptions for flagged and unflagged apps alike.\n // It does NOT gate a per-button `confirm.confirmLabel` — an explicit label is already a deliberate opt-in and\n // is always honoured. Mirrors how dialogStyle and quietLoading work.\n namedDestructiveActions: boolean;\n setupConfig: SetupConfig; // Added: Setup readiness (\"Getting Started\") config — undefined disables the feature\n dayBookConfig: DayBookConfig; // Added: Day Book config — undefined disables the feature (route renders empty state)\n appConfigurationConfig: AppConfigurationConfig; // Added: App Configuration page — app sections compose ON TOP of the library base sections, so leaving it undefined still gives a working page\n bottomTabs: BottomTab[]; // Added: mobile bottom tab bar cells — defaulted in the constructor, so an app only assigns this to override\n\n}\n\n// Added: Setup readiness (\"Getting Started\") — per-app config mapping backend step keys to frontend actions\nexport interface SetupStepAction { button?: Button; link?: string; linkDisplay?: string; import?: ImportConfig; roleTemplates?: boolean; seed?: boolean; view?: TableConfig; } // Changed (seed seam): seed opts the step into the example-data offers GET setup/seedoffers returns for it — same opt-in shape as roleTemplates, so a step that does not set it is byte-for-byte unaffected\nexport interface SetupConfig { enabled: boolean; title?: string; stepActions: { [key: string]: SetupStepAction }; demoData?: boolean; } // Changed: demoData opts the app into the library Demo Data card (seed/remove) at the foot of Getting Started — moved off the retired per-app configuration components, where seeding example records never belonged\nexport interface SetupStep { key: string; title: string; description: string; category: string; order: number; required: boolean; target: number; current: number; complete: boolean; link: string; icon: string; module?: string; } // Changed (v2): module = owning module key\nexport interface SetupStatus { steps: SetupStep[]; completed: number; total: number; percent: number; pending: number; requiredTotal?: number; requiredCompleted?: number; modules?: SetupModule[]; } // Changed (v2): modules = selectable module catalog. Changed (gs-percent-required-only): percent is now REQUIRED-steps-only while completed/total still count everything, so the hero needs requiredTotal/requiredCompleted to tell \"all done\" apart from \"all REQUIRED done, optional extras remain\". Optional so an older backend still renders\n// Added (v2): selectable onboarding module — core modules are locked on; optional ones gate steps + menus\nexport interface SetupModule { key: string; title: string; description: string; icon: string; group?: string; order: number; core: boolean; enabled: boolean; } // Changed (v3): group bands the picker (Operations, Finance, People...); optional so an older backend still renders flat\n// Added (v2): predefined role template offered on the roles step — created server-side, refined in the roles editor\nexport interface SetupRoleTemplate { key: string; name: string; description: string; icon: string; module?: string; exists: boolean; }\n// Added (seed seam): one EXAMPLE-DATA offer a step can make. Everything the row says is authored SERVER-SIDE —\n// `effect` is the plain-English \"what this creates\" sentence, `sampleNotice` is the standing \"these are examples\n// you can edit\" line, and `includes` names the prerequisites the apply will satisfy first (a vehicle cannot exist\n// without its makes and models). The UI composes NO wording of its own. `applied`, `wouldCreate` and `existing`\n// are stamped per offer at request time, so emptiness is judged AREA BY AREA rather than by one global sentinel.\nexport interface SetupSeedOffer { key: string; stepKey: string; name: string; description: string; effect: string; sampleNotice: string; icon: string; module?: string; includes: string[]; wouldCreate: number; existing: number; applied: boolean; }\n// Added (presets): the fields EVERY onboarding preset has, whatever it configures. `effect` is the plain-English\n// sentence AUTHORED SERVER-SIDE in PresetCatalog and carries a {role} placeholder marking where the picker embeds\n// its role select — the UI SPLITS that sentence and never composes one itself, so the wording stays a single\n// editable source of truth. `exists` and `roleID` are stamped by SetupController.\n// Changed (presets P4): extracted from SetupNotificationPreset so the approval picker reuses the notification\n// picker's code path instead of copy-pasting it — the picker only ever needs these shared fields.\nexport interface SetupPreset { key: string; name: string; description: string; effect: string; icon: string; group: string; module?: string; modelName: string; preferredRoleKeys: string[]; exists: boolean; roleID?: number; }\n// Added (presets): an onboarding notification rule offered on the \"Choose what you want to be told about\" step\nexport interface SetupNotificationPreset extends SetupPreset { operationType: number; }\n// Added (presets P4): an onboarding approval rule offered on the \"Choose what needs sign-off\" step. Applying one\n// creates an ApprovalConfig plus a single ApprovalLevel (named by levelName) holding the chosen role.\nexport interface SetupApprovalPreset extends SetupPreset { createApprovalRequired: boolean; editApprovalRequired: boolean; deleteApprovalRequired: boolean; levelName: string; }\n// Added (presets): one ticked preset plus the role the user chose for it — the item shape of the apply POST body\n// Changed (GS Phase 5): roleIDs carries the whole choice; roleID stays REQUIRED and carries the first of them, so a payload from this build is still understood in full by a server that predates the plural field\nexport interface SetupPresetSelection { key: string; roleID: number; roleIDs?: number[]; }\n// Added (presets): a tenant role the picker offers as a recipient — backend NameValuePair (name + role id)\nexport interface SetupPresetRole { name: string; value: number; }\n// Added (presets): payload of GET setup/notificationpresets — the presets on offer plus the roles to choose from\nexport interface SetupPresetCatalog<T> { presets: T[]; roles: SetupPresetRole[]; }\n\n// Added: Day Book (spa-day-book) — config-driven daily worklist page. The backend stays app-specific and\n// returns ONE flat object of named lists (+ optional `<name>Value` money totals); stages map counts to\n// spa-tiles (zero-count tiles HIDE) and sections render their list as a spa-table with a sectionConfig header.\n// Changed: there is now exactly ONE rendering path. The *spaDayBookSection / *spaDayBookSectionHeader template\n// hatches are gone — every consumer had taken them for every section, which reproduced the pre-library fork\n// inside the library's chrome and made the shared page invisible. Section-level (batch) actions live in\n// tableConfig.sectionConfig.buttons and page-level actions in DayBookConfig.actions, both of which are config,\n// so an app needs no component of its own to host the page.\nexport interface DayBookLane { key: string; label: string; icon?: string; valueField?: string | ((book: any) => number); hidden?: VisibilityValue; visible?: VisibilityValue; } // Changed: icon + visibility — a lane whose module is off must not offer itself; valueField — the money a COLLAPSED lane group still has to show (omit it and the group sums its own stages' instead)\nexport interface DayBookStage { key: string; lane?: string; label: string; icon?: string; countField: string; valueField?: string | ((book: any) => number); hint?: string; alert?: VisibilityValue; hidden?: VisibilityValue; visible?: VisibilityValue; } // countField may name the count OR the list itself — the page takes .length off an array; valueField may name the total OR compute it off the book (a strip total the backend never sent)\n// Changed: a section is ALWAYS a spa-table now, so tableConfig is what makes it render. `caption` is the\n// section's \"why this list exists\" line — the library feeds it into the table's own section header, so it sits\n// under the title rather than above it.\n// Added (config injection): the ONLY properties a Day Book card may restate over an injected PAGE definition.\n// The Day Book's friendlier voice (\"Book this truck onto a new trip\" where the page says \"Create\") is wanted,\n// so a per-card delta is sanctioned — but restricted to the FACE. Pick<> is what enforces it: TypeScript's\n// excess-property check refuses a behavioural key on these object literals at COMPILE time, so the rule is held\n// by the compiler rather than by review. Widening either type is the one change that silently reintroduces drift.\n// 🔴 `name` is deliberately absent and must stay absent. It is a security and routing key, not a label:\n// button.service.ts:320 gates ['create','edit','view','delete'] against tableConfig.formConfig.security BY NAME,\n// so a friendlier name drops the button out of that mapping and quietly loosens security. Friendly wording goes\n// on `display`; `name` is always inherited untouched.\nexport type DayBookPresentation = Pick<Button, 'display' | 'icon' | 'color' | 'tip'>;\n// Added: a row button injected BY NAME out of the page's TableConfig.buttons, plus its presentation delta.\nexport interface DayBookButtonView extends DayBookPresentation {\n button: string; // the page button's `name` — what is being injected\n // The single deliberate non-presentation escape, named so it is visible in review: re-aiming a page dialog at\n // a Day Book row. Maps straight onto Button.rowDataMap and is what grip already does for Record Payment. It\n // supplies CONTEXT, never behaviour.\n prefill?: Record<string, string | ((data: any) => any)>;\n}\n// Added: the column equivalent. Deliberately NOT `extends DayBookPresentation` — `display` and `tip` are Button\n// properties that do not exist on Column, and spreading them onto one would produce a silently invalid column.\nexport type DayBookColumnPresentation = Pick<Column, 'alias' | 'icon' | 'color'>;\nexport interface DayBookColumnView extends DayBookColumnPresentation { column: string; } // the page column's `name`\n// Added: the table-level escape hatch — chrome only. Nothing here can change what the table fetches, submits or gates.\nexport type DayBookTableView = Pick<TableConfig, 'minColumns' | 'elevation' | 'sectionConfig' | 'flatButtons' | 'collapseButtons' | 'maxButtonsCount' | 'showFilter' | 'showFilterButton' | 'noDataMessage' | 'identityColumn' | 'hideColumnHeaders'>;\n// Changed (config injection): a section may now be a SNIPPET OF an existing page TableConfig rather than a\n// restatement of it. columns/buttons select BY NAME out of the injected config — the definitions, their dialogs,\n// their capabilities and their conditions stay on the page and arrive here by reference, which is the whole point.\nexport interface DayBookSection { key: string; lane?: string; listField: string; collapsed?: boolean; tableConfig?: TableConfig; columns?: (string | DayBookColumnView)[]; omitColumns?: string[]; extraColumns?: Column[]; buttons?: (string | DayBookButtonView)[]; extraButtons?: Button[]; overrides?: DayBookTableView; label?: string; icon?: string; caption?: string | ((book: any) => string); tone?: 'alert' | 'quiet'; pageSize?: number; hidden?: VisibilityValue; visible?: VisibilityValue; } // caption may read the book — a threshold the section explains is a tenant setting, not a constant\n// Added: groupLanes / expandedGroups — on 'Everything' the sections are stacked into one collapsible group per\n// lane instead of one long column, because a book with 9-16 section cards overcrowds the page. A collapsed group\n// still shows its label, its total count, its money and a chip per list, so it is identifiable at a glance. Only\n// the first expandedGroups (default 1) open on a first visit; after that the operator's own choice is remembered.\n// groupLanes:false opts a book out entirely; a book with fewer than two visible lanes never groups anyway.\n// Added: `actions` — the page-level buttons in the header (Refresh, \"All trips\", \"Pen overview\"). They used to\n// arrive ONLY by content projection into [dayBookActions], which needs a consumer component to do the\n// projecting — and a config-only Day Book has no component, so every converted app silently lost them. A\n// button with no `action` and no `onClick` reloads the book, which is what Refresh has always been.\n// Changed: `stageStyle` is gone. The stage row is always spa-tiles.\n// Added: how the stage row behaves when the stages outnumber the width — 'wrap' (default) flows onto the next\n// row with every tile the same width, 'carousel' keeps one row and scrolls. maxPerRow caps the columns.\nexport interface DayBookStageTiles { layout?: 'wrap' | 'carousel'; minTileWidth?: number; maxPerRow?: number; }\nexport interface DayBookConfig { title?: string; subtitle?: string; loadAction: Action; lanes?: DayBookLane[]; stages: DayBookStage[]; sections: DayBookSection[]; actions?: Button[]; stageTiles?: DayBookStageTiles; booksFromField?: string; owedField?: string | ((book: any) => number); allClearMessage?: string; loadingMessage?: string; pageSize?: number; groupLanes?: boolean; expandedGroups?: number; } // owedField may name the total OR compute it off the book (Grip's is the sum of four lane totals the backend never adds up)\n\n// Added: App Configuration (spa-app-configuration) — the single settings page for every app, replacing the\n// retired spa-preferences and the four hand-written per-app configuration components. The library owns the\n// behaviour (load, card-per-section, collapse, toggle cascade, one save); the app supplies only\n// appConfig.appConfigurationConfig, composing its own sections after the library base sections\n// (DataServiceLib.configSectionFinancial et al). Sections reuse the ordinary `Field` type, so hints, suffixes,\n// visibility, readonlyCondition and loadAction selects all come for free.\nexport interface AppConfigSection {\n key: string;\n title: string;\n icon?: string;\n hint?: string;\n collapsible?: boolean; // default true — a section can opt out and stay permanently open\n collapsed?: boolean; // initial state only\n toggleField?: string; // a boolean config field rendered as the card header's switch; its children go readonly while it is off\n fields: Field[];\n hidden?: VisibilityValue;\n visible?: VisibilityValue;\n // Added (section summaries, 2026-08-31): the right-hand status line a section shows in its header — the same\n // affordance the organisation cards already carry (\"1 member\", \"No invitations\"). OPTIONAL and additive:\n // absent means no summary, which is every existing section in every consumer, so nothing changes for anyone\n // who does not opt in. It is handed the configuration row AND the section's LIVE fields (the ones spa-form\n // has written its loaded options back onto), so a summary can name a select's label rather than its ID —\n // Core.optionLabel does exactly that lookup. Return '' to show nothing.\n // ⚠️ It is called from the template on every change-detection pass, so it must be cheap and must NOT\n // allocate anything it returns beyond the string (the library's no-allocating-getters rule).\n summary?: (data: any, fields: Field[]) => string;\n}\nexport interface AppConfigurationConfig { title?: string; loadAction?: Action; saveAction?: Action; resetAction?: Action; security?: SecurityConfig; sections: AppConfigSection[]; } // actions default to configuration/get + configuration/update + configuration/reset; security gates SAVE only (reads are open server-side too). Changed (N22): resetAction follows the same default-and-override idiom as the other two — the endpoint is on AppConfigurationControllerBase, so all five apps inherit it and none has to configure anything\n\n// Added: flat collapsible checklist (spa-checklist) — bordered to-do items rendered directly on the host card\n// (no elevation, no panel background). Single-expand accordion semantics; actions render as library buttons.\nexport interface ChecklistAction { type?: 'create' | 'import' | 'link' | 'view' | 'seed' | 'custom'; display?: string; icon?: string; primary?: boolean; disabled?: (item: ChecklistItem) => boolean; onClick: (item: ChecklistItem) => void; } // Changed (P6): 'seed' joins the union. Additive to a string-literal union with every member optional, so no existing declaration changes meaning — and it is a TYPE only: checklist.component.html branches on 'import' alone and treats everything else as a generic secondary, so naming the seed action is for the READER and for anyone who later wants to style or order by type, not a rendering switch\nexport interface ChecklistItem { key: string; title: string; description?: string; complete?: boolean; optional?: boolean; progressText?: string; actions?: ChecklistAction[]; data?: any; hidden?: VisibilityValue; visible?: VisibilityValue; section?: string; } // Changed (v2-1): section — the OPTIONAL third collapse tier. Items carrying the same section string fold together inside the expanded checklist. Optional and additive: an item that sets none, or a list whose items all resolve to ONE section, renders exactly as before with no sub-tier at all\nexport interface ChecklistConfig { items: ChecklistItem[]; expandedKey?: string; itemTemplate?: any; } // itemTemplate: TemplateRef projected into the expanded body (assigned at runtime by the host, same idiom as tabTemplate)\n\n// Re-export from LibClasses\nexport { PurchaseStatus, ReceiptStatus } from './LibClasses'; // Changed: InventoryReceiptStatus → PurchaseStatus, added ReceiptStatus\n\n\n\n\n","// Config surface for the authorized document pipeline (viewer, fetch, type detection).\n// Deliberately declared in its own file rather than appended to Classes.ts, following the MapClasses.ts\n// precedent: Classes.ts is a very hot shared file and was locked by another worker when this landed, and a\n// self-contained contract keeps the document feature reviewable in one place.\n//\n// 🔴 THE CENTRAL DESIGN CONSTRAINT: there is deliberately NO url / blobUrl / storageUrl member anywhere in\n// this file. Every document byte is fetched from the app's OWN API through DocumentService, so the bearer\n// token, the capability gate and tenant scoping apply to all of them. Documents used to be pulled\n// browser-direct out of an Azure container marked PublicAccessType.Blob — world-readable by URL, with no\n// capability check and no audit. A direct-to-storage URL is made UNREPRESENTABLE here so that hole cannot be\n// reopened by configuration. If you find yourself wanting to add one, the answer is a streamUrl instead.\n\nimport { Action } from './Classes';\n\n// Describes where a field's documents come from. The list gives the NAMES, the stream gives the BYTES —\n// both through the app's API.\nexport interface DocumentSource {\n // Returns the file names for one parent row, e.g. { url: 'docs/files/{keyField}' }.\n listAction: Action;\n\n // The authorized per-document stream, e.g. 'docs/document/{keyField}/{fileName}'.\n // Served by BaseController.GetDocument, which returns raw bytes on success and a real 403/404 on refusal.\n streamUrl: string;\n\n // Offer \"Save a copy\" as a secondary action. Default true. This downloads the ALREADY-FETCHED blob from\n // its object URL — it never constructs a second, unauthorized route to the bytes.\n downloadable?: boolean;\n\n // Optional client-side filter on what the viewer will list/offer. Purely cosmetic: the server remains the\n // only authority on what may be read, and this must never be mistaken for a security control.\n allowedExtensions?: string[];\n}\n\n// What a document turns out to be, which decides which renderer Phase 4/5 mounts.\nexport type DocumentKind = 'pdf' | 'image' | 'word' | 'excel' | 'text' | 'unsupported';\n\n// A document that has been fetched and is ready to render.\nexport interface LoadedDocument {\n fileName: string;\n kind: DocumentKind;\n contentType: string;\n size: number;\n\n // An object URL over the fetched blob. This is what replaces the old remote iframe src, and it is the\n // reason nothing needs a public URL. 🔴 It MUST be released through DocumentService.release() /\n // releaseAll() — an unrevoked object URL pins its whole blob in memory for the life of the document.\n objectUrl: string;\n\n blob: Blob;\n}\n\n// What openDocumentViewer() is handed. Note what is NOT here: no url, no base path, no container name —\n// only a streamUrl TEMPLATE that resolves against the app's own API, for the same reason DocumentSource\n// carries none. The viewer cannot address storage directly even if a caller wanted it to.\nexport interface DocumentViewerData {\n // The file names in the set. ONE name means no picker rail is rendered at all — see the FSD's\n // \"picker rule\": with a single document the rail is absent from the DOM, not merely hidden by CSS.\n documents: string[];\n\n // Which of them opens first. Falls back to the first entry when absent or not in the set.\n fileName?: string;\n\n // The authorized per-document stream template, e.g. 'docs/document/{keyField}/{fileName}'.\n // {fileName} is substituted per document; everything else comes from `values`.\n streamUrl: string;\n\n // The placeholder bag for every token in streamUrl other than {fileName}, e.g. { keyField: 42 }.\n values?: { [key: string]: any };\n\n // Offer \"Save a copy\". Defaults to true. Saves the ALREADY-FETCHED blob out of its object URL, so it\n // never constructs a second, unauthorized route to the bytes.\n downloadable?: boolean;\n\n // Optional label for the set, shown in the toolbar beside the file name.\n title?: string;\n}\n\n// A refusal, surfaced rather than swallowed. The house bug this exists to prevent is the silent failure:\n// a viewer that renders an empty stage on a 403 tells the user nothing and looks like a broken document.\nexport interface DocumentError {\n // 🔴 The stream branches on HTTP STATUS, never on response.Success. Its success body is raw bytes, not a\n // RepoResponse, so a 200 carrying JSON would be indistinguishable from a 200 carrying a PDF.\n status: number;\n\n // 'denied' 403 · 'missing' 404 · 'unauthenticated' 401 · 'network' 0 · 'failed' anything else.\n reason: 'denied' | 'missing' | 'unauthenticated' | 'network' | 'failed';\n\n // Already phrased for a human — the viewer shows this directly.\n message: string;\n\n fileName: string;\n}\n","import { Injectable, Inject } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { HttpClient, HttpHeaders, HttpErrorResponse, HttpContext, HttpResponse, } from \"@angular/common/http\"; // Changed: HttpContext carries the Quiet Loading silent flag through to the interceptor; HttpResponse added for the document byte stream, which must be observed at the response level to branch on status\nimport { Router } from \"@angular/router\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HttpService {\n\n constructor(private httpClient: HttpClient, private router: Router) { }\n\n\n //----Set apiUrl from the data service of the project---//\n // Changed (security): apiUrl NO LONGER DEFAULTS TO A REAL EXTERNAL HOST. It used to default to a\n // long-dead legacy domain (owner 2026-09-01: \"very old url and no longer in use so delete it\"), which\n // meant ANY request issued before the consuming app's DataService had run its hostname derivation was\n // silently sent to a host this estate does not control. Not hypothetical: measured 2026-09-01, a\n // session-restore firing before DataService constructed POSTed a REFRESH TOKEN there; DNS happened to\n // fail — luck, not a control.\n // The default is now UNSET, and READING it before it is configured THROWS. A loud failure at the first\n // request is recoverable; a credential sent to a third party is not.\n private apiUrlValue: string | null = null;\n\n public get apiUrl(): string {\n if (this.apiUrlValue === null)\n throw new Error(\"tin-spa: HttpService.apiUrl has not been configured. The consuming app must set httpService.apiUrl (normally in its DataService constructor) BEFORE any request is issued — including any session restore run from a route guard.\");\n return this.apiUrlValue;\n }\n\n public set apiUrl(value: string) { this.apiUrlValue = value; }\n\n // Added: lets a caller ask whether the base URL is configured WITHOUT tripping the throw above, so\n // ordering-sensitive code (guards, early restores) can fail deliberately instead of by exception.\n public get apiUrlConfigured(): boolean { return this.apiUrlValue !== null; }\n\n\n\n //POST\n // Changed: optional context — omitted by every existing caller, so the request built is identical to before\n public Post(service: string, data: any, context?: HttpContext): Observable<any> {\n return this.httpClient.post(this.apiUrl + service, data, this.withContext(context));\n }\n\n //PUT\n public Put(service: string, data: any): Observable<any> {\n return this.httpClient.put(this.apiUrl + service, data, this.httpOptions_Legacy);\n }\n\n\n //POST RAW\n public Post_Raw(url: string, data: any): Observable<any> {\n\n return this.httpClient.post(url, data, this.httpOptions_Legacy);\n }\n\n //POST with file\n public Post_WithFile(service: string, data: any, file: File) {\n\n let formData: FormData = new FormData();\n\n if (file) {\n formData.append(\"uploadFile\", file, file.name);\n }\n\n formData.append(\"data\", JSON.stringify(data));\n\n return this.httpClient.post(this.apiUrl + service, formData, this.httpOptions_Files);\n }\n\n // //POST with files\n // Changed: optional context for parity with Post/Get\n public Post_FormData(service: string, formData: FormData, context?: HttpContext) {\n\n return this.httpClient.post(this.apiUrl + service, formData, context ? { ...this.httpOptions_Files, context } : this.httpOptions_Files);\n }\n\n //GET\n // Changed: optional context — omitted by every existing caller, so the request built is identical to before\n public Get(service: string, context?: HttpContext): Observable<any> {\n return this.httpClient.get(this.apiUrl + service, this.withContext(context));\n }\n\n //Get RAW\n public Get_Raw(url: string): Observable<any> {\n return this.httpClient.get(url, this.httpOptions_Legacy);\n }\n\n // Added: GET raw bytes from the app's own API, for the authorized document stream.\n // Returns the FULL HttpResponse rather than just the body because the document stream branches on HTTP\n // STATUS — its success body is bytes, not a RepoResponse, so `response.Success` does not exist to test.\n // Goes through this service (not a bare HttpClient) so it inherits apiUrl and, via LoaderInterceptor, the\n // bearer token — which is the entire point: no document is ever fetched from storage directly.\n // No Accept/Content-Type headers here: this is a byte stream, and declaring application/json would be a lie.\n public Get_Blob(service: string, context?: HttpContext): Observable<HttpResponse<Blob>> {\n return this.httpClient.get(this.apiUrl + service, { observe: 'response', responseType: 'blob', context });\n }\n\n //ERROR\n public Error(error: HttpErrorResponse) {\n if (error.statusText == \"Unauthorized\") {\n this.router.navigate([\"login\"]);\n return \"Unauthorized\";\n } else {\n return \"Connection failed\";\n }\n }\n\n // Changed: removed hardcoded Basic-auth credentials. Authentication is handled centrally by\n // LoaderInterceptor, which attaches the Bearer token to every request. Embedding a credential here\n // shipped it in the JS bundle where anyone could recover it.\n // Added: returns the legacy options untouched when there is no context, so the non-quiet path is unchanged\n private withContext(context?: HttpContext) {\n return context ? { ...this.httpOptions_Legacy, context } : this.httpOptions_Legacy;\n }\n\n private httpOptions_Legacy = {\n headers: new HttpHeaders({\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n }),\n responseType: \"json\" as const,\n };\n\n // No Content-Type here — the browser sets the multipart boundary for FormData uploads.\n private httpOptions_Files = {\n responseType: \"json\" as const,\n };\n}\n","import { Injectable } from \"@angular/core\";\nimport { MatSnackBar } from \"@angular/material/snack-bar\";\nimport { MatDialog } from \"@angular/material/dialog\";\nimport { messageDialog } from \"../components/message/messageDialog.component\";\nimport { Observable, of } from 'rxjs';\nimport { mergeMap } from 'rxjs/operators';\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class MessageService {\n constructor(private snackBar: MatSnackBar, public dialog: MatDialog) { }\n\n public toast(msg: string) {\n this.snackBar.open(msg, \"OK\", { duration: 5000 });\n }\n\n public info(details: string) {\n\n let type = \"info\";\n\n const dialogRef = this.dialog.open(messageDialog, {\n width: \"600px\",\n data: { type, details },\n });\n\n }\n\n public infoWithSubject(subject: string, details: string) {\n\n let type = \"info\";\n\n const dialogRef = this.dialog.open(messageDialog, {\n width: \"600px\",\n data: { type, subject, details },\n });\n\n }\n\n public error(details: string) {\n\n let type = \"error\";\n // Changed: was `let subject: \"\";` — a type annotation with no initialiser, so `subject` was always\n // undefined and the dialog rendered with no heading. Now an explicit empty string.\n let subject = \"\";\n\n // Changed: guard against an empty body. Callers used to pass `error.error.Message`, which is undefined\n // whenever the response has no JSON body (a downed backend gives a ProgressEvent), producing a dialog\n // that said nothing at all. A generic line is always better than a blank box.\n const body = details && String(details).trim() ? details : \"Something went wrong. Please try again, and contact your administrator if it keeps happening.\";\n\n const dialogRef = this.dialog.open(messageDialog, {\n width: \"600px\",\n data: { type, subject, details: body },\n });\n\n }\n\n // Added: error dialog with a heading, so a friendly title (\"No connection\") can sit above the explanation.\n // Changed: optional `reference` — the backend's correlation code for this failure, rendered as a quiet line\n // under the body rather than mixed into it. Optional and last, so every existing two-argument call is\n // unaffected and simply renders no reference line.\n public errorWithSubject(subject: string, details: string, reference?: string) {\n\n let type = \"error\";\n\n const dialogRef = this.dialog.open(messageDialog, {\n width: \"600px\",\n data: { type, subject, details, reference },\n });\n\n }\n\n // Added: warning — for something the user should look at but which is not a failure. Distinct from error so\n // a recoverable situation is not dressed up in the same red as a broken one.\n public warning(details: string, subject?: string) {\n\n let type = \"warning\";\n\n const dialogRef = this.dialog.open(messageDialog, {\n width: \"600px\",\n data: { type, subject, details },\n });\n\n }\n\n // Added: success — completes the set, so a confirmation does not have to borrow the 'info' styling.\n public success(details: string, subject?: string) {\n\n let type = \"success\";\n\n const dialogRef = this.dialog.open(messageDialog, {\n width: \"600px\",\n data: { type, subject, details },\n });\n\n }\n\n // Changed: optional `confirmLabel` / `cancelLabel`, appended last so all 23 existing call sites are unaffected\n // and keep rendering \"Yes\" / \"No\". Supply confirmLabel to name the action being confirmed — confirm('Delete this\n // shelter?', 'Delete') — so a destructive prompt stops reading identically to a harmless one. Only the caller\n // knows the intent; the dialog is handed a sentence.\n // ⚠️ Do NOT change the defaults to make every confirm read better: piglet-spa (38) and shift-spa (13) select\n // these buttons by their literal text via getByRole('button', { name: 'Yes' }), and the owner reverted a\n // hardcoded relabel on 2026-08-06. Opt in per call site.\n // Changed: optional `destructive`, appended last so every existing call — including the three-argument ones\n // added with the labels — is unaffected. It drives COLOUR only: the affirmative button turns warn-red and the\n // dismissive one goes neutral, because the classic style hardcodes green on the affirmative button and a\n // GREEN \"Delete\" beside a RED \"Keep\" tells the user precisely the opposite of the truth.\n // Added (N22 / FSD-3): optional `requirePhrase`, appended LAST so all existing call sites — including the\n // three- and four-argument ones added with the labels and the destructive flag — are untouched and keep\n // behaving identically. Supply it and the dialog grows an input, and the affirmative button stays DISABLED\n // until the typed text ordinally equals the phrase (see phraseSatisfied in messageDialog.component.ts).\n //\n // 🔴 THE RETURN SHAPE CHANGES ONLY WHEN YOU PASS A PHRASE. Without it, afterClosed still emits the bare\n // 'yes' / 'no' STRING every caller has always received. WITH a phrase, it emits { response, phrase } instead,\n // because the caller has to forward the TYPED TEXT to the server, which re-validates it independently\n // (TinWeb AppConfigurationControllerBase.cs:159) — the browser gate is UX only and any direct API caller\n // never sees it. Since only a new opt-in caller can pass a phrase, no existing `result === 'yes'` check\n // anywhere — in this repo, in the 51 E2E assertions, or in an untracked consumer app — can be affected.\n public confirm(msg: string, confirmLabel?: string, cancelLabel?: string, destructive?: boolean, requirePhrase?: string): Observable<any> {\n\n let type = \"confirm\";\n let subject = \"\";\n let details = msg\n\n const dialogRef = this.dialog.open(messageDialog, {\n width: \"400px\",\n data: { type, subject, details, confirmLabel, cancelLabel, destructive, requirePhrase },\n disableClose: !!requirePhrase, // Added: a phrase-gated confirm should not be dismissible by a stray backdrop click mid-typing; the No button is still the way out\n });\n\n return dialogRef.afterClosed().pipe(mergeMap((result) => {\n\n return of(result);\n\n }\n\n ));\n\n }\n\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatNativeDateModule, MAT_DATE_LOCALE } from '@angular/material/core';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule, MAT_DIALOG_DEFAULT_OPTIONS } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\n\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { RouterModule } from '@angular/router';\nimport { MatExpansionModule } from '@angular/material/expansion';\n\n@NgModule({\n declarations: [],\n imports: [\n\n\n ],\n exports: [\n CommonModule,FormsModule, ReactiveFormsModule,\n MatMenuModule, MatSliderModule, MatTableModule, MatPaginatorModule,\n MatCheckboxModule, MatBadgeModule, MatButtonModule, MatIconModule, MatDialogModule, MatSnackBarModule,\n MatTabsModule, MatFormFieldModule, MatInputModule, MatCardModule, MatChipsModule, MatSelectModule,\n MatNativeDateModule, MatProgressSpinnerModule, MatListModule, MatAutocompleteModule, MatTooltipModule, MatSortModule,\n MatDatepickerModule, MatStepperModule, MatRadioModule, MatProgressBarModule,\n\n MatSidenavModule,\n MatToolbarModule,\n RouterModule,\n MatExpansionModule,\n ],\n providers:[\n { provide: MAT_DIALOG_DEFAULT_OPTIONS, useValue: { disableClose: true, hasBackdrop: true } },\n { provide: MAT_DATE_LOCALE, useValue: \"en-GB\" },\n ]\n})\nexport class SpaMatModule { }\n","// Customer receipt dialog (C3) — record a payment and allocate it across open invoices; remainder goes on-account\nimport { Component, OnInit, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { HttpService } from '../../../services/http.service';\nimport { MessageService } from '../../../services/message.service';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SpaMatModule } from '../../../modules/spa-mat.module';\n\n@Component({\n selector: 'spa-receipt-dialog',\n template: `\n <h2 mat-dialog-title>{{ allocateMode ? 'Allocate Receipt ' + data.receiptNumber : 'New Receipt' }}</h2>\n <mat-dialog-content>\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap;\" *ngIf=\"!allocateMode\">\n <mat-form-field style=\"min-width: 220px;\">\n <mat-label>Customer</mat-label>\n <mat-select [(ngModel)]=\"customerID\" (ngModelChange)=\"loadOpenInvoices()\">\n <mat-option *ngFor=\"let option of customers\" [value]=\"option.value\">{{ option.name }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input matInput type=\"date\" [(ngModel)]=\"receiptDate\">\n </mat-form-field>\n <mat-form-field>\n <mat-label>Amount</mat-label>\n <input matInput type=\"number\" min=\"0\" [(ngModel)]=\"amount\">\n </mat-form-field>\n <mat-form-field>\n <mat-label>Method</mat-label>\n <mat-select [(ngModel)]=\"method\">\n <mat-option [value]=\"0\">Cash</mat-option>\n <mat-option [value]=\"1\">Bank</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field style=\"min-width: 200px;\">\n <mat-label>Reference</mat-label>\n <input matInput [(ngModel)]=\"reference\" placeholder=\"e.g. bank ref / receipt book #\">\n </mat-form-field>\n </div>\n <p *ngIf=\"allocateMode\"><b>Unallocated balance: {{ available | number:'1.2-2' }}</b></p>\n\n <table style=\"width: 100%; border-collapse: collapse;\" *ngIf=\"openInvoices.length; else noInvoices\">\n <tr style=\"text-align: left; border-bottom: 1px solid #ccc;\">\n <th style=\"padding: 4px;\">Invoice #</th>\n <th style=\"padding: 4px;\">Date</th>\n <th style=\"padding: 4px; text-align: right;\">Outstanding</th>\n <th style=\"padding: 4px; width: 160px;\">Allocate</th>\n </tr>\n <tr *ngFor=\"let invoice of openInvoices\" style=\"border-bottom: 1px solid #eee;\">\n <td style=\"padding: 4px;\">{{ invoice.invoiceNumber }}</td>\n <td style=\"padding: 4px;\">{{ invoice.invoiceDate | date:'mediumDate' }}</td>\n <td style=\"padding: 4px; text-align: right;\">{{ invoice.outstandingAmount | number:'1.2-2' }}</td>\n <td style=\"padding: 4px;\">\n <mat-form-field style=\"width: 100%;\" subscriptSizing=\"dynamic\">\n <input matInput type=\"number\" min=\"0\" [max]=\"invoice.outstandingAmount\" [(ngModel)]=\"invoice.allocation\">\n </mat-form-field>\n </td>\n </tr>\n <tr style=\"border-top: 2px solid #333;\">\n <td style=\"padding: 8px 4px;\" colspan=\"2\">\n <button mat-stroked-button (click)=\"autoAllocate()\">Auto Allocate (oldest first)</button>\n </td>\n <td style=\"padding: 8px 4px; text-align: right;\"><b>Allocated:</b></td>\n <td style=\"padding: 8px 4px;\"><b>{{ totalAllocated | number:'1.2-2' }}</b></td>\n </tr>\n </table>\n <ng-template #noInvoices><p><em>{{ customerID ? 'No open invoices — the full amount will be recorded on-account' : 'Select a customer to load open invoices' }}</em></p></ng-template>\n <p *ngIf=\"overAllocated\" style=\"color: red;\"><em>Allocations exceed the {{ allocateMode ? 'unallocated balance' : 'receipt amount' }}</em></p>\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <button mat-button (click)=\"dialogRef.close(false)\">Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"save()\" [disabled]=\"!canSave\">{{ allocateMode ? 'Allocate' : 'Record Receipt' }}</button>\n </mat-dialog-actions>\n `,\n standalone: true,\n imports: [CommonModule, FormsModule, SpaMatModule]\n})\nexport class ReceiptDialogComponent implements OnInit {\n public dialogRef = inject(MatDialogRef<ReceiptDialogComponent>);\n public data: any = inject(MAT_DIALOG_DATA, { optional: true });\n private httpService = inject(HttpService);\n private http = inject(HttpClient);\n private messageService = inject(MessageService);\n\n customerID: number | null = null;\n receiptDate = new Date().toISOString().substring(0, 10);\n amount = 0;\n method = 0;\n reference = '';\n customers: any[] = [];\n openInvoices: any[] = [];\n\n get allocateMode(): boolean { return !!this.data?.customerReceiptID; }\n get available(): number { return this.allocateMode ? this.data.unallocatedAmount : this.amount; }\n get totalAllocated(): number { return this.openInvoices.reduce((sum, invoice) => sum + (+invoice.allocation || 0), 0); }\n get overAllocated(): boolean { return this.totalAllocated > this.available + 0.005; }\n get canSave(): boolean {\n if (this.overAllocated) return false;\n if (this.allocateMode) return this.totalAllocated > 0;\n return !!this.customerID && this.amount > 0;\n }\n\n ngOnInit(): void {\n if (this.allocateMode) {\n this.customerID = this.data.customerID;\n this.loadOpenInvoices();\n } else {\n this.http.get<any>(`${this.httpService.apiUrl}customers/list/x`)\n .subscribe(res => this.customers = res?.data ?? []);\n }\n }\n\n loadOpenInvoices() {\n if (!this.customerID) { this.openInvoices = []; return; }\n this.http.get<any>(`${this.httpService.apiUrl}customerreceipts/open-invoices/${this.customerID}`)\n .subscribe(res => this.openInvoices = (res?.data ?? []).map((invoice: any) => ({ ...invoice, allocation: 0 })));\n }\n\n // Fill allocations oldest-first until the available amount is used up\n autoAllocate() {\n let remaining = this.available;\n for (const invoice of this.openInvoices) {\n invoice.allocation = Math.min(remaining, invoice.outstandingAmount);\n remaining = Math.round((remaining - invoice.allocation) * 100) / 100;\n }\n }\n\n save() {\n const allocations = this.openInvoices.filter(invoice => (+invoice.allocation || 0) > 0)\n .map(invoice => ({ invoiceID: invoice.invoiceID, amount: +invoice.allocation }));\n const dto: any = this.allocateMode\n ? { customerReceiptID: this.data.customerReceiptID, allocations }\n : { customerID: this.customerID, receiptDate: this.receiptDate, amount: this.amount, method: this.method, reference: this.reference, allocations };\n const action = this.allocateMode ? 'allocate' : 'create';\n this.http.post<any>(`${this.httpService.apiUrl}customerreceipts/dto?action=${action}`, dto)\n .subscribe(res => {\n this.messageService.toast(res?.message ?? (res?.success ? 'Saved' : 'Failed'));\n if (res?.success) this.dialogRef.close(true);\n });\n }\n}\n","// ───────────────────────────────────────────────────────────────────────────\n// tin-spa runtime app settings — assets/appsettings.json\n//\n// Mirrors ASP.NET Core configuration on the frontend: a deployed, server-editable\n// `assets/appsettings.json` is read at startup (before Angular bootstraps), and if it\n// declares an \"Environment\" (e.g. \"Production\"), `assets/appsettings.{Environment}.json`\n// is loaded on top of it — same file names, same layering as the backend. Changing a\n// value is a file edit on the server, never a rebuild: the same build artifact is\n// promoted through SIT/UAT/PROD.\n//\n// Consuming apps call the loader in main.ts, before bootstrapModule:\n//\n// loadTinSpaAppSettings().then(() =>\n// platformBrowserDynamic().bootstrapModule(AppModule).catch(err => console.error(err)));\n//\n// The loaded settings are then visible to DI factories via getTinSpaAppSettings().\n// provideTinSpaRuntime() consumes them automatically (see tinspa-runtime.ts): values in\n// the file override the code-declared runtime config. The file is OPTIONAL — apps that\n// don't ship one keep their code-declared config unchanged.\n//\n// Everything in this file is public-by-design SPA configuration (client IDs, authorities,\n// redirect URIs). Secrets never belong here — they stay in the backend's appsettings.\n// ───────────────────────────────────────────────────────────────────────────\n\n/** \"Msal\" section — PascalCase keys to match backend appsettings conventions. */\nexport interface TinSpaMsalSettings {\n ClientId?: string;\n Authority?: string;\n /** Optional — when omitted or empty, tin-spa falls back to `${window.location.origin}/login`. */\n RedirectUri?: string;\n}\n\nexport interface TinSpaAppSettings {\n /** Selects the overlay file, exactly like ASPNETCORE_ENVIRONMENT selects\n * appsettings.{Environment}.json on the backend. Set per server, e.g. \"SIT\", \"UAT\", \"Production\". */\n Environment?: string;\n /** Enable/disable Microsoft SSO per environment (overrides the code-declared runtime flag). */\n MicrosoftAuth?: boolean;\n /** Enable/disable Google sign-in per environment. */\n GoogleAuth?: boolean;\n\n /** Routing strategy per environment: true = path routing (/home), false = hash routing (/#/home).\n * Overrides the code-declared `pathRouting`. Path routing needs a server rewrite rule (IIS\n * URL Rewrite / SPA fallback) so deep links resolve to index.html — which is exactly why this\n * has to be per-environment: the same build is promoted to servers configured differently. */\n PathRouting?: boolean;\n\n /** SignalR/real-time on or off per environment (overrides the code-declared `realTime`). */\n RealTime?: boolean;\n\n /** Offline capability on or off per environment (overrides the code-declared `offline`). */\n Offline?: boolean;\n\n /** Added: app-wide per-table defaults, tunable per environment without a rebuild. A table's own\n * TableConfig value always wins over these; these only fill in what a table did not state.\n * PageSize is offered as a number because tuning it per server is the main reason to expose it —\n * e.g. a slow-link deployment dropping every unstated table to 10 rows a page. */\n TableDefaults?: {\n RealTime?: boolean;\n RealTimeFallbackMs?: number; // Added: wait before a real-time table falls back to a refresh; a slow link may want longer than the 3000 default\n Offline?: boolean;\n Pagination?: boolean;\n PageSize?: number;\n };\n\n Msal?: TinSpaMsalSettings;\n /** Same key name the backend reads for token validation — the two MUST hold the same value,\n * since the backend validates the Google id-token audience against its own GoogleClientID. */\n GoogleClientID?: string;\n /** Apps may add their own environment-specific sections. */\n [key: string]: any;\n}\n\nconst LOG = '[tin-spa appsettings]';\n\nlet loadedSettings: TinSpaAppSettings | null = null;\n\n/** The settings loaded by loadTinSpaAppSettings(), or null when no file was found / loading failed. */\nexport function getTinSpaAppSettings(): TinSpaAppSettings | null {\n return loadedSettings;\n}\n\n/** Overlay values win; plain objects merge recursively, scalars and arrays replace. */\nfunction deepMerge(base: any, overlay: any): any {\n if (overlay === undefined) return base;\n if (base === undefined) return overlay;\n const isObj = (v: any) => v !== null && typeof v === 'object' && !Array.isArray(v);\n if (!isObj(base) || !isObj(overlay)) return overlay;\n const out: any = { ...base };\n for (const key of Object.keys(overlay)) out[key] = deepMerge(base[key], overlay[key]);\n return out;\n}\n\n/** null = file absent (fine for the base file, warned for a declared overlay); throws never. */\nasync function fetchSettingsFile(file: string, required: boolean): Promise<TinSpaAppSettings | null> {\n // no-store: server admins edit these files in place — a cached copy would silently\n // keep serving the old environment's values.\n let response: Response;\n try {\n response = await fetch(`assets/${file}`, { cache: 'no-store' });\n } catch (err) {\n console.error(`${LOG} could not request assets/${file}:`, err);\n return null;\n }\n\n if (!response.ok) {\n if (required) {\n console.warn(`${LOG} assets/${file} was not found (HTTP ${response.status}) — it is declared by the \"Environment\" setting, so it should exist. Using the base file only.`);\n } else {\n console.info(`${LOG} no assets/${file} found (HTTP ${response.status}) — runtime settings come from code only.`);\n }\n return null;\n }\n\n try {\n return await response.json();\n } catch (err) {\n console.error(`${LOG} assets/${file} exists but is not valid JSON — its values are IGNORED. Fix the file syntax.`, err);\n return null;\n }\n}\n\n/**\n * Loads assets/appsettings.json (+ the appsettings.{Environment}.json overlay when the base file\n * declares an Environment) and caches the merged result for getTinSpaAppSettings().\n * Never rejects — a missing or broken file logs to the console and resolves null so the app\n * still boots with its code-declared configuration.\n */\nexport async function loadTinSpaAppSettings(): Promise<TinSpaAppSettings | null> {\n if (typeof fetch === 'undefined') return null;\n\n const base = await fetchSettingsFile('appsettings.json', false);\n if (!base) return null;\n\n let merged = base;\n const env = typeof base.Environment === 'string' ? base.Environment.trim() : '';\n if (env) {\n const overlay = await fetchSettingsFile(`appsettings.${env}.json`, true);\n if (overlay) merged = deepMerge(base, overlay);\n }\n\n loadedSettings = merged;\n console.info(\n `${LOG} loaded appsettings.json` +\n (env ? ` + appsettings.${env}.json (Environment: ${env})` : ' (no Environment overlay declared)') +\n ` — MicrosoftAuth: ${merged.MicrosoftAuth ?? 'not set'}, GoogleAuth: ${merged.GoogleAuth ?? 'not set'},` +\n ` Msal.ClientId: ${merged.Msal?.ClientId ? 'present' : 'MISSING'}, GoogleClientID: ${merged.GoogleClientID ? 'present' : 'MISSING'},` +\n // PathRouting is reported explicitly because getting it wrong produces a confusing failure: the\n // app loads fine and only breaks on refresh/deep-link. \"not set\" here means the code default is\n // in force, which is the first thing to check when an environment routes unexpectedly.\n ` PathRouting: ${merged.PathRouting ?? 'not set (code default)'}`\n );\n return merged;\n}\n","// ───────────────────────────────────────────────────────────────────────────\n// tin-spa runtime configuration\n//\n// Centralises the \"which runtime behaviours does this app want\" decisions that used to be\n// scattered across each consuming app (routing strategy, real-time/SignalR, Microsoft SSO).\n//\n// A consuming app declares intent in ONE place:\n//\n// providers: [\n// provideTinSpaRuntime({\n// pathRouting: false, // hash routing (default) vs path routing\n// realTime: false, // SignalR on/off\n// microsoftAuth: false, // MSAL on/off (also requires HTTPS)\n// msal: { clientId, authority, redirectUri }, // only if microsoftAuth is used\n// }),\n// ]\n//\n// The config is read live at startup — nothing is cached in localStorage. So when you change a\n// flag here and redeploy, every user picks up the new value on their next load.\n//\n// Changed: the code-declared config is no longer the only source. When the app ships an\n// assets/appsettings.json (loaded pre-bootstrap via loadTinSpaAppSettings(), see appsettings.ts),\n// its values OVERRIDE the code config:\n// MicrosoftAuth → microsoftAuth\n// PathRouting → pathRouting (added 20.11.15)\n// RealTime → realTime (added 20.11.15)\n// Offline → offline (added 20.11.15)\n// Msal.{ClientId,Authority,RedirectUri} → msal\n// so SSO, the routing strategy and the real-time/offline switches are all per-environment\n// server-editable — one build artifact promoted through SIT/UAT/PROD, no rebuild.\n// Precedence: DEFAULTS < provideTinSpaRuntime(config) < assets/appsettings.json.\n//\n// A key is only honoured when the file declares it as a real boolean; anything else (absent,\n// string, null) falls through to the code-declared value. So provideTinSpaRuntime() stays the\n// DEFAULT for every environment, and appsettings.json is the per-server exception — which is the\n// behaviour a deployer expects, and it means shipping no appsettings.json changes nothing.\n// ───────────────────────────────────────────────────────────────────────────\nimport {\n EnvironmentProviders, InjectionToken, Optional, Inject, makeEnvironmentProviders,\n} from '@angular/core';\nimport {\n LocationStrategy, HashLocationStrategy, PathLocationStrategy, PlatformLocation, APP_BASE_HREF,\n} from '@angular/common';\nimport { MSAL_INSTANCE, MsalService } from '@azure/msal-angular';\nimport { IPublicClientApplication, PublicClientApplication, BrowserCacheLocation } from '@azure/msal-browser';\nimport { getTinSpaAppSettings } from './appsettings';\n\nexport interface TinSpaMsalConfig {\n clientId: string;\n authority: string;\n redirectUri: string;\n}\n\n// Added: app-wide DEFAULTS for per-table behaviour. Previously every table had to opt into realTime,\n// offline and pagination individually, which meant setting the same flag on dozens of configs and made\n// \"most tables behave this way\" impossible to express. These invert that: declare the norm once for the\n// app, then a table only says something when it is an EXCEPTION.\n//\n// Precedence is component-wins: a TableConfig value ALWAYS beats the app default, including when it is\n// explicitly `false`. That is why the resolver tests `!== undefined` rather than truthiness — a table\n// must be able to opt OUT of an app-wide default, not just opt in.\nexport interface TinSpaTableDefaults {\n /** Default for TableConfig.realTime. */\n realTime?: boolean;\n /** Default for TableConfig.realTimeFallbackMs — the wait before a real-time table falls back to a refresh. Library default 3000. */\n realTimeFallbackMs?: number;\n /** Default for TableConfig.offline. `true` is shorthand for { enabled: true }. */\n offline?: any;\n /** Default for TableConfig.pagination. `true` is shorthand for the library's default page size. */\n pagination?: any;\n}\n\nexport interface TinSpaRuntimeConfig {\n /** Use path routing (/home) instead of hash routing (/#/home). Default false (hash). */\n pathRouting: boolean;\n /** Enable real-time (SignalR) features. Default false (disabled). */\n realTime: boolean;\n /** Enable offline capability (TinSync: read cache + outbox + sync tray + connectivity indicator). Default false —\n * apps that never use offline tables should leave this off so none of the offline machinery ever runs for them. */\n offline?: boolean;\n /** Enable Microsoft SSO (MSAL). Only activates in a secure context (HTTPS/localhost). Default false. */\n microsoftAuth: boolean;\n /** MSAL credentials — required only when microsoftAuth is used. */\n msal?: TinSpaMsalConfig;\n /** Added: app-wide defaults applied to every spa-table that does not state its own value. */\n tableDefaults?: TinSpaTableDefaults;\n}\n\nconst DEFAULTS: TinSpaRuntimeConfig = {\n pathRouting: false,\n realTime: false,\n offline: false,\n microsoftAuth: false,\n tableDefaults: {}, // Added: no table defaults unless the app declares them — preserves existing behaviour exactly\n};\n\nexport const TIN_SPA_RUNTIME_CONFIG = new InjectionToken<TinSpaRuntimeConfig>('TIN_SPA_RUNTIME_CONFIG', {\n factory: () => DEFAULTS, // safe fallback if an app forgets to call provideTinSpaRuntime()\n});\n\n// ── DI factories ────────────────────────────────────────────────────────────\n\nexport function tinSpaLocationStrategyFactory(\n platformLocation: PlatformLocation, baseHref: string, config: TinSpaRuntimeConfig,\n): LocationStrategy {\n return config.pathRouting\n ? new PathLocationStrategy(platformLocation, baseHref)\n : new HashLocationStrategy(platformLocation, baseHref);\n}\n\n/** Overlays assets/appsettings.json values (when the app loaded one) onto the code-declared config. */\nexport function tinSpaRuntimeConfigFactory(codeConfig: TinSpaRuntimeConfig): TinSpaRuntimeConfig {\n const settings = getTinSpaAppSettings();\n if (!settings) return codeConfig;\n\n const merged: TinSpaRuntimeConfig = { ...codeConfig };\n\n // Each flag is overridden ONLY when the file declares an actual boolean. That is why these are\n // `typeof === 'boolean'` tests rather than `??` or truthiness: an absent key must fall through to\n // the code-declared value, and a key present as `false` must still win. `settings.X ?? code.X`\n // would behave correctly for absent keys but silently accept a string \"true\" from a hand-edited\n // file as a truthy override — these files are edited by server admins, not by a compiler.\n if (typeof settings.MicrosoftAuth === 'boolean') merged.microsoftAuth = settings.MicrosoftAuth;\n\n // Routing strategy per environment. Previously code-only, which forced every environment onto the\n // same strategy and meant a server needing path routing required a rebuild — defeating the point\n // of runtime appsettings. Note the consequence of getting this wrong: path routing without a\n // server rewrite rule gives a working app that 404s on refresh and on every deep link.\n if (typeof settings.PathRouting === 'boolean') merged.pathRouting = settings.PathRouting;\n\n if (typeof settings.RealTime === 'boolean') merged.realTime = settings.RealTime;\n if (typeof settings.Offline === 'boolean') merged.offline = settings.Offline;\n\n // Added: per-environment override of the app-wide table defaults, same boolean-only discipline as above.\n // TableDefaults.Pagination is deliberately allowed to be a number as well — a server admin tuning page\n // size is the whole point of exposing it here, and \"PageSize: 15\" is what they will reach for.\n if (settings.TableDefaults) {\n const td = { ...(codeConfig.tableDefaults ?? {}) };\n if (typeof settings.TableDefaults.RealTime === 'boolean') td.realTime = settings.TableDefaults.RealTime;\n if (typeof settings.TableDefaults.RealTimeFallbackMs === 'number') td.realTimeFallbackMs = settings.TableDefaults.RealTimeFallbackMs; // Added: tunable per environment — a slow link may want a longer window than 3000\n\n if (typeof settings.TableDefaults.Offline === 'boolean') td.offline = settings.TableDefaults.Offline;\n if (typeof settings.TableDefaults.Pagination === 'boolean') td.pagination = settings.TableDefaults.Pagination;\n if (typeof settings.TableDefaults.PageSize === 'number') td.pagination = { pageSize: settings.TableDefaults.PageSize };\n merged.tableDefaults = td;\n }\n if (settings.Msal) {\n merged.msal = {\n clientId: settings.Msal.ClientId ?? codeConfig.msal?.clientId ?? '',\n authority: settings.Msal.Authority ?? codeConfig.msal?.authority ?? '',\n redirectUri: settings.Msal.RedirectUri ?? codeConfig.msal?.redirectUri ?? '',\n };\n }\n return merged;\n}\n\nexport function tinSpaMsalInstanceFactory(config: TinSpaRuntimeConfig): IPublicClientApplication {\n const wantsMsal = !!config.microsoftAuth;\n const secure = typeof window === 'undefined' || window.isSecureContext;\n\n // A credential is \"provided\" only if non-empty — appsettings.json ships empty strings as\n // placeholders, and those must trigger the same diagnostics as a missing section.\n const missing: string[] = [];\n if (!config.msal?.clientId?.trim()) missing.push('ClientId');\n if (!config.msal?.authority?.trim()) missing.push('Authority');\n\n if (wantsMsal && missing.length) {\n console.error(`[tin-spa] Microsoft SSO is enabled but its credentials are incomplete — missing: ${missing.join(', ')}. ` +\n `Provide them in assets/appsettings.json under \"Msal\" (or in provideTinSpaRuntime({ msal })). Microsoft SSO is INACTIVE.`);\n }\n if (wantsMsal && !secure) {\n console.warn('[tin-spa] microsoftAuth is enabled but the app is NOT running over HTTPS (secure context). Microsoft SSO is INACTIVE until served over HTTPS.');\n }\n\n const active = wantsMsal && !missing.length && secure;\n if (!active) {\n // Stub: MsalService's constructor calls instance.initializeWrapperLibrary(), so it must exist\n // or the app crashes at bootstrap. loginPopup rejects so callers' error handlers report it.\n return {\n initializeWrapperLibrary: () => {},\n initialize: () => Promise.resolve(),\n getAllAccounts: () => [],\n getActiveAccount: () => null,\n loginPopup: () => Promise.reject(new Error(\n !wantsMsal ? 'Microsoft login is disabled in app config.'\n : missing.length ? `Microsoft login is not configured (missing: ${missing.join(', ')}).`\n : 'Microsoft login requires HTTPS (a secure context).'\n )),\n } as unknown as IPublicClientApplication;\n }\n\n // RedirectUri rule: use the configured value when provided; otherwise fall back to\n // `${origin}/login` — correct whenever each environment's own /login URL is registered\n // on the app registration.\n const redirectUri = config.msal!.redirectUri?.trim() || `${window.location.origin}/login`;\n console.info(`[tin-spa] Microsoft SSO active — redirectUri: ${redirectUri}` +\n (config.msal!.redirectUri?.trim() ? ' (configured)' : ' (not configured — derived from window.location.origin)'));\n\n const pca = new PublicClientApplication({\n auth: { ...config.msal!, redirectUri },\n cache: { cacheLocation: BrowserCacheLocation.LocalStorage, storeAuthStateInCookie: false },\n });\n // MSAL v3 requires initialize() before any other API call. Kick it off now so it has\n // normally completed by the time the user clicks a login button; callers still await\n // initialize() themselves (it is idempotent) to close the race.\n pca.initialize().catch(e => console.error('[tin-spa] MSAL initialize failed:', e));\n return pca;\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Wires up tin-spa runtime behaviours (routing strategy, real-time, MSAL) from a single config.\n * Add the result to your AppModule (or bootstrap) providers.\n */\nexport function provideTinSpaRuntime(config: Partial<TinSpaRuntimeConfig>): EnvironmentProviders {\n const merged: TinSpaRuntimeConfig = { ...DEFAULTS, ...config };\n\n return makeEnvironmentProviders([\n // useFactory (not useValue): this function runs at module-import time, BEFORE main.ts has\n // fetched assets/appsettings.json — the factory defers reading the file until injection.\n { provide: TIN_SPA_RUNTIME_CONFIG, useFactory: () => tinSpaRuntimeConfigFactory(merged) },\n {\n provide: LocationStrategy,\n useFactory: tinSpaLocationStrategyFactory,\n deps: [PlatformLocation, [new Optional(), new Inject(APP_BASE_HREF)], TIN_SPA_RUNTIME_CONFIG],\n },\n // MSAL_INSTANCE is built lazily (when MsalService is first injected, i.e. on the login page),\n // so it reads the config token rather than running at bootstrap.\n { provide: MSAL_INSTANCE, useFactory: tinSpaMsalInstanceFactory, deps: [TIN_SPA_RUNTIME_CONFIG] },\n MsalService,\n ]);\n}\n","import { Injectable } from '@angular/core';\nimport { Constants } from '../classes/Classes'; // Changed: Import for clearSessionData key preservation\n\n@Injectable({\n providedIn: 'root'\n})\nexport class StorageService {\n\n private useSession = false; // Changed: Flag to toggle between localStorage/sessionStorage\n\n constructor() { }\n\n // Changed: Set storage mode - true for sessionStorage, false for localStorage\n setSessionMode(useSession: boolean) {\n this.useSession = useSession;\n }\n\n // Changed: Returns the active storage engine based on mode\n private getStorage(): Storage {\n return this.useSession ? sessionStorage : localStorage;\n }\n\n // Store the value in the active storage\n async store(storageKey: string, value: any) {\n const encryptedValue = btoa(escape(JSON.stringify(value)));\n await this.getStorage().setItem(storageKey, encryptedValue);\n }\n\n // Get the value from the active storage, falling back to the other storage\n async get(storageKey: string) {\n let ret = this.getStorage().getItem(storageKey);\n if (ret === null) {\n // Changed: Fallback to the other storage for backwards compatibility\n ret = (this.useSession ? localStorage : sessionStorage).getItem(storageKey);\n }\n if (ret === null) return null;\n // Changed: corrupt/legacy values must degrade to \"not stored\" instead of rejecting the auth guard promise\n try { return JSON.parse(unescape(atob(ret))); } catch { return null; }\n }\n\n // Remove from active storage\n async removeStorageItem(storageKey: string) {\n await this.getStorage().removeItem(storageKey);\n }\n\n // Clear active storage\n async clear() {\n await this.getStorage().clear();\n }\n\n // Changed: Store in localStorage always (for refresh token + remember-me flag that survive browser close)\n storePersistent(storageKey: string, value: any) {\n const encryptedValue = btoa(escape(JSON.stringify(value)));\n localStorage.setItem(storageKey, encryptedValue);\n }\n\n // Changed: Get from localStorage always\n getPersistent(storageKey: string): any {\n const ret = localStorage.getItem(storageKey);\n if (ret === null) return null;\n // Changed: corrupt/legacy values must degrade to \"not stored\" instead of throwing into auth flows\n try { return JSON.parse(unescape(atob(ret))); } catch { return null; }\n }\n\n // Changed: Remove from localStorage always\n removePersistent(storageKey: string) {\n localStorage.removeItem(storageKey);\n }\n\n // Changed: Clear both localStorage and sessionStorage\n clearAll() {\n localStorage.clear();\n sessionStorage.clear();\n }\n\n // Changed: Clear session data but preserve refresh token + remember-me for \"keep me signed in\"\n clearSessionData() {\n const keysToPreserve = [Constants.AUTH_REFRESH_TOKEN, Constants.AUTH_REFRESH_TOKEN_EXPIRE, Constants.AUTH_REMEMBER_ME];\n const preserved: { [key: string]: string | null } = {};\n\n for (const key of keysToPreserve) {\n preserved[key] = localStorage.getItem(key);\n }\n\n localStorage.clear();\n sessionStorage.clear();\n\n for (const key of keysToPreserve) {\n if (preserved[key] !== null) {\n localStorage.setItem(key, preserved[key]!);\n }\n }\n }\n\n // Changed: Check if a key exists in either storage\n hasKey(storageKey: string): boolean {\n return localStorage.getItem(storageKey) !== null || sessionStorage.getItem(storageKey) !== null;\n }\n\n}\n","// Security (owner directive, 2026-08-31): nothing this library writes to the browser console may carry a\n// token, key, credential or payload. The leak that prompted this was NOT our own code — it was the\n// @microsoft/signalr client logger printing its negotiated URL at LogLevel.Information, query string and\n// all, which on a WebSocket transport necessarily includes ?access_token=<the full JWT> (a WebSocket\n// cannot send an Authorization header, so the token has to ride the query string — that transport choice\n// stands; printing it does not).\n//\n// Everything here is pure and synchronous so it can be unit-pinned without a browser or a hub.\n\n// Query-string / form / JSON key names whose VALUE is a secret. Matched case-insensitively and only as a\n// whole key, so `tokenCount` or `keyword` are not mangled into uselessness.\nconst SECRET_KEYS = [\n 'access_token', 'accesstoken', 'id_token', 'idtoken', 'refresh_token', 'refreshtoken',\n 'token', 'authorization', 'auth', 'apikey', 'api_key', 'client_secret', 'clientsecret',\n 'secret', 'password', 'pwd', 'passwd', 'signature', 'sig', 'sas', 'session', 'sessionid', 'jwt',\n];\n\nexport const REDACTED = '[REDACTED]';\n\nconst KEY_GROUP = SECRET_KEYS.join('|');\n\n// `?access_token=eyJ...&id=7` and `&password=hunter2` — stop at the next & or # so the rest of the URL,\n// which is the part with diagnostic value, survives.\nconst QUERY_SECRET = new RegExp(`([?&#](?:${KEY_GROUP})=)([^&#\\\\s]+)`, 'gi');\n\n// `\"access_token\":\"eyJ...\"` and `'password': 'x'` inside anything already stringified.\nconst JSON_SECRET = new RegExp(`([\"']?(?:${KEY_GROUP})[\"']?\\\\s*[:=]\\\\s*[\"'])([^\"']*)([\"'])`, 'gi');\n\n// `Authorization: Bearer eyJ...` / a bare `Bearer <token>`.\nconst BEARER = /\\b(Bearer\\s+)[A-Za-z0-9\\-._~+/]+=*/gi;\n\n// A bare JWT with no key in front of it — three base64url segments separated by dots. The header segment\n// of a JWT is always `eyJ` (`{\"` base64url-encoded), which makes this specific enough not to eat ordinary\n// dotted words, and it is the last line of defence for a token logged with no label at all.\nconst BARE_JWT = /eyJ[A-Za-z0-9_-]{4,}\\.[A-Za-z0-9_-]{4,}\\.[A-Za-z0-9_-]*/g;\n\n/**\n * Strip tokens, keys and credentials out of a string that is about to be written to the console.\n *\n * It redacts VALUES and keeps structure: a URL stays recognisable (`/hubs/app?id=abc&access_token=[REDACTED]`)\n * so it is still worth logging, while the secret is gone. Non-string input is returned untouched — callers\n * must not hand this an object and assume it was cleaned; stringify first, or better, do not log the object.\n */\nexport function redactSecrets<T>(input: T): T {\n if (typeof input !== 'string') return input;\n return (input as string)\n .replace(QUERY_SECRET, (_m, key) => `${key}${REDACTED}`)\n .replace(JSON_SECRET, (_m, head, _v, tail) => `${head}${REDACTED}${tail}`)\n .replace(BEARER, (_m, head) => `${head}${REDACTED}`)\n .replace(BARE_JWT, REDACTED) as unknown as T;\n}\n\n/**\n * Reduce an error to a one-line, secret-free string. This exists because logging an HttpErrorResponse as an\n * OBJECT is the second-biggest leak shape in the library after the SignalR URL: devtools renders it\n * expandable, and `err.error` is the server's response BODY — the very data the directive says must never\n * reach the console. Status and message are the whole diagnostic value; the body is not.\n */\nexport function describeError(err: any): string {\n if (err === null || err === undefined) return String(err);\n const status = err.status !== undefined && err.status !== null ? `status=${err.status} ` : '';\n const text = err.message ?? err.statusText ?? (typeof err === 'string' ? err : describeShape(err));\n return redactSecrets(`${status}${text}`);\n}\n\n/**\n * Reduce an arbitrary value to a one-line SHAPE description that carries no field values — the safe thing\n * to log when you want to say \"a response came back and here is roughly what it was\". Used in place of the\n * `console.log(apiResponse)` dumps that used to sit behind `config.logResponse`.\n */\nexport function describeShape(value: any): string {\n if (value === null || value === undefined) return String(value);\n if (Array.isArray(value)) return `array(${value.length})`;\n const t = typeof value;\n if (t !== 'object') return t;\n try { return `object{${Object.keys(value).join(',')}}`; } catch { return 'object'; }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { MessageService } from './message.service';\nimport { redactSecrets, describeError } from './log-redact';\n\n// Added: turns an HTTP failure into ONE friendly, non-technical message, and stops a burst of failures from\n// producing a wall of dialogs.\n//\n// Three problems this exists to solve, all previously visible to end users:\n//\n// 1. BLANK DIALOGS. The interceptor showed `error.error.Message`. When the backend is unreachable there is no\n// JSON body at all — Angular puts a ProgressEvent on `error.error`, so `.Message` is undefined and the\n// dialog rendered empty. The user saw \"Error\" and nothing else, which tells them nothing about whether it\n// was their connection, their input, or a broken server.\n//\n// 2. TECHNICAL JARGON. The alternative branch showed raw server text. Statuses and stack traces are for the\n// console, not for someone trying to capture a fuel receipt at a filling station.\n//\n// 3. DIALOG STORMS. Every failed request raised its own dialog. A dashboard firing 20 calls against a downed\n// backend produced 20 dialogs — all blank, all saying the same nothing. Deduping is not cosmetic here: it\n// is the difference between an app that looks broken and one that explains itself.\n\n// Added: 'appfailure' / 'appfailure-submit' cover a FOURTH problem, invisible to everything above.\n//\n// 4. HTTP 200 FAILURES. TinWeb's base controllers report application-level failures as\n// `Ok(new RepoResponse { Success = false, Message = ... })` — status 200 with a failure body. Because the\n// status is a success status, the HTTP interceptor never fires and none of `present()` above ever runs for\n// them. Call sites handled these inline with `toast(\"Error: \" + apiResponse.message)`, so the user was NOT\n// left in silence — but what they got was a 5-second snackbar at the bottom of the screen carrying raw\n// server text like \"Error: Error processing request\" or \"Error: Invalid column name 'RequirePONumber'\".\n//\n// Two things are wrong with that, and they are different problems needing different answers:\n//\n// - The TEXT. \"Error processing request\" is the server's catch-all for an unhandled exception; \"Invalid\n// column name\" is a leaked SQL fragment. Neither tells the user anything actionable, and both look\n// alarming. These deserve the same friendly treatment the transport failures now get.\n// - The SURFACE. Measured on a 1920x945 window with a create dialog open: the snackbar renders at\n// y=891 — 569px BELOW the dialog's bottom edge — 312px wide, and lives exactly 5 seconds. It is not\n// occluded (it draws above the modal backdrop), but it is far outside the region the user is looking\n// at, and it is gone before a user who glanced at the form would ever notice it. Meanwhile the dialog\n// stays open with the form still populated, so the obvious next move is to press Create again — which\n// is how an opaque failure turns into a duplicate record.\n//\n// A deliberate, human-authored message (\"Customer not found\", \"Invoice has no items\") has NEITHER problem:\n// it is short, it is meaningful, and a non-blocking toast is the right weight for it. So this splits by\n// what the message actually IS, rather than moving everything to a dialog — see classifyMessage().\n// Changed: added 'ratelimited'. A 429 previously had no branch at all in classify(), so it fell through to\n// 'unknown' — whose copy is \"Please try again\" — which is the one instruction a 429 forbids. Giving it its own\n// kind also gives it its own suppression key, so a burst of throttled calls yields one message, not a wall.\nexport type ApiErrorKind = 'network' | 'timeout' | 'ratelimited' | 'badrequest' | 'forbidden' | 'notfound' | 'server' | 'unavailable' | 'unknown' | 'appfailure' | 'appfailure-submit';\n\n// Added: what a 200-with-success:false message turns out to be. 'opaque' earns a dialog, 'business' stays a toast.\nexport type AppFailureClass = 'opaque' | 'business';\n\n// Added: where the failure happened. Only 'submit' is special — see presentAppFailure() for why it gets its own\n// dedupe key. 'load' (a table/tile fetching rows) and 'action' (a row button) share one.\nexport type AppFailureContext = 'submit' | 'load' | 'action';\n\nexport interface ApiErrorInfo {\n kind: ApiErrorKind;\n title: string;\n message: string;\n reference?: string; // Added: correlation code off a 5xx body — TinWeb's exception middleware now mints one, and quoting it is what makes the failure traceable in Logs\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ApiErrorService {\n\n // One dialog per KIND per window. Keyed by kind rather than by URL on purpose: when the backend goes down,\n // twenty different URLs fail for one single reason, and the user needs to be told that reason once.\n private lastShownAt = new Map<ApiErrorKind, number>();\n\n /** How long a given kind stays suppressed after being shown. The user described \"the same 10 seconds or so\". */\n public suppressWindowMs = 10000;\n\n // Added: submits dedupe over a much shorter window than background reads. Long enough to swallow a\n // double-click or a duplicated emission, short enough that a user who reads the dialog, dismisses it and\n // deliberately tries again is told again rather than met with silence.\n public submitSuppressWindowMs = 1500;\n\n constructor(private messageService: MessageService) { }\n\n // Classification is by status code first, because that is the only signal that is reliable across browsers.\n // `statusText === 'Unknown Error'` is kept as a secondary network signal since some browsers report a failed\n // connection that way while still surfacing status 0.\n classify(error: HttpErrorResponse): ApiErrorInfo {\n const status = error?.status ?? 0;\n\n // status 0 means the request never reached a server: offline, DNS failure, connection refused, CORS block.\n // This is the single most common case for a field user and the one that was rendering blank.\n if (status === 0 || error?.statusText === 'Unknown Error') {\n return {\n kind: 'network',\n title: 'No connection',\n message: `We couldn't reach the server. Please check your connection and try again.\\n\\n` + // Changed: \"internet connection\" → \"connection\" — on-premise/LAN installs have no internet in the path (owner directive 2026-08-18)\n `If your connection is working, the service may be temporarily unavailable — your work is not lost, and you can try again in a moment.`,\n };\n }\n\n if (status === 408 || status === 504) {\n return {\n kind: 'timeout',\n title: 'Taking too long',\n message: `The server is taking longer than expected to respond.\\n\\nPlease wait a moment and try again.`,\n };\n }\n\n // Added: 429 Too Many Requests. Before this branch existed a 429 reached the 'unknown' fall-through at the\n // bottom of this method and told the user \"Please try again\" — inviting the exact retry the server just\n // refused. On a token-bucket or sliding-window limiter every one of those retries extends the block rather\n // than clearing it, so the friendly-sounding advice actively made the situation worse.\n //\n // Two further things this deliberately does NOT do:\n // * it does not read like the user's fault. A 429 is usually the app being chatty, or a shared office IP\n // hitting one limit for everyone — nothing the person at the keyboard did.\n // * it does not say \"contact your administrator\". This clears on its own; sending them to support for a\n // condition that resolves in under a minute wastes their time and support's.\n // The one instruction is to WAIT, with a duration when the server told us one.\n if (status === 429) {\n return {\n kind: 'ratelimited',\n title: 'Busy right now',\n message: `The server is handling more requests than it can take right now, so it has asked us to pause for a moment. Nothing was lost, and nothing is wrong with your work.\\n\\n` +\n `Please wait ${this.retryAfterText(error)} before trying that again — trying repeatedly makes the wait longer, not shorter.`,\n };\n }\n\n if (status === 503) {\n return {\n kind: 'unavailable',\n title: 'Service unavailable',\n message: `The service is temporarily unavailable, usually because it is being updated.\\n\\nPlease try again in a few minutes.`,\n };\n }\n\n // A 400 is almost never the user's doing — the app sent a payload the server rejected. Saying \"check your\n // input\" would send them hunting for a mistake they did not make, so this points at support instead.\n if (status === 400 || status === 422) {\n return {\n kind: 'badrequest',\n title: 'Something went wrong',\n message: `We couldn't complete that action because of a technical problem in the app — not anything you did wrong.\\n\\n` +\n `Please try again. If it keeps happening, contact your administrator so it can be looked into.`,\n };\n }\n\n if (status === 403) {\n return {\n kind: 'forbidden',\n title: 'Not allowed',\n message: `You don't have permission to do that.\\n\\nIf you think you should, please contact your administrator.`,\n };\n }\n\n if (status === 404) {\n return {\n kind: 'notfound',\n title: 'Not found',\n message: `We couldn't find what you were looking for. It may have been moved or deleted by someone else.\\n\\n` +\n `Try refreshing the page. If it keeps happening, contact your administrator.`,\n };\n }\n\n if (status >= 500) {\n return {\n kind: 'server',\n title: 'Something went wrong',\n message: `The server ran into a problem while handling your request.\\n\\n` +\n `Please try again shortly. If it keeps happening, contact your administrator.`,\n };\n }\n\n return {\n kind: 'unknown',\n title: 'Something went wrong',\n message: `We couldn't complete that action.\\n\\nPlease try again. If it keeps happening, contact your administrator.`,\n };\n }\n\n // Added: turns a Retry-After header into something a person can act on. RFC 9110 allows two forms — a delay\n // in seconds (\"120\") or an HTTP-date (\"Wed, 21 Oct 2026 07:28:00 GMT\") — and both are handled because which\n // one arrives depends on the proxy in front of the API, not on our own code.\n //\n // Seconds are rounded to the nearest 5 (and never below 5) rather than quoted exactly: \"wait about 30 seconds\"\n // is followed, \"wait 27 seconds\" invites someone to watch a clock and retry one second early. When the header\n // is missing or unparseable the phrasing stays deliberately vague — an honest approximation beats a precise\n // number we invented, and a limiter we cannot see the window of is exactly when not to promise one.\n private retryAfterText(error: HttpErrorResponse): string {\n const seconds = this.retryAfterSeconds(error); // Changed: parsing moved to retryAfterSeconds() so the sync layer can share it — see below\n\n if (!(seconds > 0)) return 'a minute or so';\n if (seconds <= 90) return `about ${Math.max(5, Math.round(seconds / 5) * 5)} seconds`;\n\n const minutes = Math.round(seconds / 60);\n return `about ${minutes} minute${minutes === 1 ? '' : 's'}`;\n }\n\n // Added: the RAW parse, split out of retryAfterText() and made public so OfflineService can wait exactly as\n // long as the server asked instead of guessing from an attempt count. It is deliberately ONE parser: the\n // header has two legal forms (RFC 9110 delta-seconds and HTTP-date) and a second implementation of that would\n // drift from this one the first time either is touched.\n //\n // Returns 0 — never a negative, never NaN — when the header is absent, malformed, or already in the past.\n // Callers treat 0 as \"the server said nothing\", so a stale HTTP-date can never shorten a backoff to zero.\n retryAfterSeconds(error: HttpErrorResponse): number {\n const raw = (error?.headers?.get ? error.headers.get('Retry-After') : null)?.trim() ?? '';\n\n let seconds = 0;\n if (/^\\d+$/.test(raw)) {\n seconds = parseInt(raw, 10);\n } else if (raw) {\n const at = Date.parse(raw);\n if (!isNaN(at)) seconds = Math.round((at - Date.now()) / 1000);\n }\n\n return seconds > 0 ? seconds : 0;\n }\n\n /** True when this kind was already shown inside the suppression window — i.e. the user has already been told. */\n // Changed: window is now a parameter (defaulting to the existing suppressWindowMs, so present() is unaffected)\n // because a submit failure needs a much shorter one than a burst of background reads — see presentAppFailure().\n private isSuppressed(kind: ApiErrorKind, windowMs: number = this.suppressWindowMs): boolean {\n const last = this.lastShownAt.get(kind);\n return last != null && (Date.now() - last) < windowMs;\n }\n\n // Presents at most ONE message per kind per window. The technical detail still goes to the console, where a\n // developer wants it, so nothing is lost by keeping it out of the user's message.\n //\n // Changed: this comment used to read \"at most ONE dialog per kind\", and that stopped being true the moment\n // 'ratelimited' gained its own branch below and went to a toast instead. What is uniform here is the\n // SUPPRESSION — one message per kind per window — not the surface. The SURFACE is chosen per kind, and the\n // 'ratelimited' block states the test for choosing it: a failure that is transient, self-clearing and\n // presents the user with no decision to make does not earn a modal. Read that argument before adding a\n // second exception; it is about weight, not about the specific status code.\n present(error: HttpErrorResponse): ApiErrorInfo {\n const info = this.classify(error);\n\n // Added: a 5xx from TinWeb's exception middleware now carries \"(reference X)\" in its body Message —\n // pull it out so the dialog can quote it as a footnote, exactly as presentAppFailure() does for the\n // 200-with-success:false catch-alls. Only the 'server' kind can carry one; a transport failure has no\n // body at all (error.error is a ProgressEvent), which extractReference() tolerates as null.\n if (info.kind === 'server') {\n const body: any = (error as any)?.error;\n info.reference = this.extractReference(body?.Message ?? body?.message) ?? undefined;\n }\n\n console.error(`[tin-spa] API error (${info.kind})`, { status: error?.status, url: redactSecrets((error as any)?.url), reference: info.reference, error: describeError(error) }); // Changed (security 2026-08-31): the raw HttpErrorResponse was logged whole, and its .error IS the server response body — every failing request printed its payload. Status, redacted URL, reference and the error MESSAGE are what a developer actually needs, and the reference still ties this line to the server log.\n\n if (this.isSuppressed(info.kind)) return info; // already told them — a second dialog adds nothing\n\n this.lastShownAt.set(info.kind, Date.now());\n\n // Changed: a 429 gets a TOAST, not the modal every other kind gets. It is the only kind here that is\n // guaranteed transient and self-clearing — the server has already said, in Retry-After, exactly when it\n // will stop refusing. A modal is the wrong weight for that in three specific ways:\n //\n // * It BLOCKS. The user must dismiss a dialog to get back to work they were not prevented from doing —\n // nothing was rejected except one request, and the next one may well succeed.\n // * It DEMANDS a decision for a condition with no decision to make. The only correct action is to wait,\n // and waiting is what happens if the app says nothing at all.\n // * During an OFFLINE DRAIN it is actively wrong. The sync layer leaves the op queued and retries on its\n // own backoff, so a modal saying something went wrong directly contradicts the sync indicator in the\n // toolbar, which is showing work still pending and perfectly healthy.\n //\n // The suppression above is deliberately shared and applied BEFORE this branch: a burst of throttled calls —\n // which is the normal shape of a 429, since whatever tripped the limit is usually firing repeatedly — still\n // yields exactly ONE toast per window, not a stack of them.\n //\n // The toast text is NOT info.message. That is dialog copy: three sentences over two paragraphs, written to\n // be read at leisure in a 600px box. This surface is a 5-second snackbar, so the copy is compressed to the\n // three things that are load-bearing and nothing else — that the cause is the server and not them, roughly\n // how long to leave it, and that their work survived. info.message is still returned unchanged for callers.\n if (info.kind === 'ratelimited') {\n this.messageService.toast(`The server is busy — please wait ${this.retryAfterText(error)} before trying again. Nothing was lost.`);\n return info;\n }\n\n this.messageService.errorWithSubject(info.title, info.message, info.reference); // Changed: pass the reference through so the dialog renders the quiet footnote\n return info;\n }\n\n //================ Application-level failures (HTTP 200 + success:false) ================\n\n // Added: fragments that mark a message as machine-authored rather than human-authored. Matched\n // case-insensitively against the whole message. The list is deliberately about IMPLEMENTATION LEAKS, not\n // about severity — a leaked identifier is useless to the user however serious the underlying fault is.\n private opaqueMarkers: string[] = [\n // NOTE: matched as a SUBSTRING, never by equality. TinWeb's catch-all now appends a correlation code —\n // \"Error processing request (reference K7M2QP4T)\" — so an equality test would classify every catch-all\n // failure as a business message and show the raw text, which is worse than the behaviour this replaces.\n 'error processing request', // TinWeb BaseController/BaseController2/BaseService catch-all — by far the most common\n 'invalid column name', // SQL leaking through after a schema/migration drift\n 'sqlexception',\n 'object reference not set',\n 'an error occurred while', // EF Core's standard preamble (\"...while updating the entries\")\n 'inner exception',\n 'stack trace',\n 'the underlying provider failed',\n 'index was outside the bounds',\n 'timeout expired',\n 'exception', // catches DbUpdateException, InvalidOperationException, ... by suffix\n\n // Raw SqlException text.\n //\n // Changed: this block used to say \"TinCore's BaseRepository.SetErrorResp returns ex.InnerException.Message\n // verbatim on HTTP 200 ... These never carry a correlation reference\". BOTH halves of that are now FALSE\n // and were left standing after the backend was fixed underneath them. `BaseRepository.BuildSafeMessage`\n // (`Sharp/TinCore/Repositories/BaseRepository.cs:382-400`, read 2026-08-09) now logs the real exception\n // out-of-band and returns `ClassifyFailure(ex) + \" (reference X)\"` — a friendly sentence WITH a reference.\n // So the schema leak this list was written against no longer comes from there, and the failures that\n // reach us from there do carry a code. Believing the old comment would lead the next reader to delete\n // these markers as obsolete, which is exactly the wrong conclusion — see below for why they still matter.\n //\n // These fragments are still LIVE, for two independent reasons, both verified rather than assumed:\n // 1. Other server paths still return raw exception text on HTTP 200 and never went through\n // BaseRepository at all — e.g. `TinWeb/Services/Agent/AgentApiService.cs:391` and `:480` return\n // `ex.InnerException?.Message ?? ex.Message` verbatim, which for a bad foreign key is precisely\n // \"The INSERT statement conflicted with the FOREIGN KEY constraint ...\". The accounting services\n // leak the same way but one level UP — `InvoiceService:311/347/681/1007/1108`,\n // `CreditNoteService:184`, `RevenueScheduleService:95/248` return the OUTER `ex.Message`, which for a\n // DbUpdateException is \"An error occurred while updating the entries. See the inner exception for\n // details.\" That is why BOTH shapes are covered above: 'an error occurred while' and 'inner exception'\n // catch the outer form, the SQL phrases below catch the inner one. Neither list is redundant.\n // 2. TinCore is consumed as a PACKAGE (`TinWeb.csproj` pins `TinCore 10.0.12`, the release that carries\n // this fix), so a consumer app on an older published TinCore still has the verbatim-`ex.Message`\n // behaviour. tin-spa ships to four SPAs that are not upgraded in step, and a classifier that assumes\n // the newest backend would leak schema on every one that lags. Their own APIs leak independently of\n // TinCore too — `Sharp/{Shift,Pulse,Piglet,Grip,Test}` carry ~39 hand-written `Message = ex.Message`\n // style returns that never touch BaseRepository at all.\n //\n // Two entries are kept WITHOUT a live producer, stated plainly rather than quietly: 'stack trace' and\n // 'sqlexception' only appear in a full `ex.ToString()`, and no TinWeb/TinCore path puts one in a client\n // Message today (checked 2026-08-09). They stay because a deny-list entry costs one `includes()` and the\n // failure mode of removing one is a schema dump on a user's screen. Cheap insurance, not an oversight.\n //\n // Each fragment below is SQL Server's own wording. None of them can occur in a hand-authored message like\n // \"Registration number already in use\" or \"Customer not found\", which is why they are matched as phrases\n // rather than on single words such as \"duplicate\" or \"constraint\" that a human might legitimately write.\n // Re-checked one by one against what the server produces today: none of the six friendly sentences\n // `ClassifyFailure` can now return matches any marker here, so the fix upstream does not collide with\n // this list — the good sentences stay 'business' and are shown, exactly as intended.\n 'statement conflicted with the', // \"The INSERT statement conflicted with the FOREIGN KEY constraint ...\"\n 'foreign key constraint',\n 'unique key constraint',\n 'primary key constraint',\n 'check constraint',\n 'cannot insert the value null',\n 'string or binary data would be truncated',\n 'violation of ', // \"Violation of PRIMARY KEY constraint 'PK_...'\"\n 'duplicate key', // \"Cannot insert duplicate key row in object ...\"\n\n // Added 2026-08-09, found by re-checking this list against the backend rather than against the old comment.\n // `BaseRepository.ClassifyFailure` maps six recognisable SQL failures to genuinely useful sentences (\"A\n // record with these details already exists.\", \"A required value is missing.\") — those are real business\n // messages and correctly stay toasts. Its SEVENTH return is the unrecognised fall-through, and it is a\n // different animal: \"Could not complete the operation. (reference X)\" is human-SHAPED but carries exactly\n // as much information as \"Error processing request\" — which is the first entry in this list. It was being\n // classified 'business' purely because it is grammatical.\n //\n // That misclassification cost the user the one thing that failure has going for it. `BuildSafeMessage`\n // deliberately logs the real exception and mints a reference precisely BECAUSE it could not say what went\n // wrong — so this is the case where quoting the code to support is the whole remedy. As a toast the code\n // is stripped (uncopyable in 5 seconds, see presentAppFailure) and the user is left with a shrug. As a\n // dialog it renders as the footnote the message dialog already has, which is where a reference belongs.\n // Verified unique: this exact phrase occurs nowhere else in Sharp/** or in tin-spa, so it cannot shadow a\n // hand-authored message.\n 'could not complete the operation',\n ];\n\n // Added: splits the server's message into 'opaque' (tells the user nothing, must not be shown raw) and\n // 'business' (a deliberate sentence the backend author wrote for a human, genuinely worth reading).\n //\n // Written as a deny-list rather than an allow-list on purpose: business messages are open-ended and\n // app-specific, so there is nothing to enumerate, whereas the ways a .NET exception leaks are few and stable.\n // The consequence of the default is the safe one — an unrecognised message is treated as business and shown,\n // so a real message is never swallowed; only recognisably technical text is replaced.\n classifyMessage(message: string | null | undefined): AppFailureClass {\n const text = this.stripReference(message); // Changed: classify the SENTENCE, not the sentence plus the server's appended \"(reference X)\" — see below\n\n // Changed: the reference is removed before classifying for two concrete reasons, neither cosmetic.\n // First, the length test at the bottom is a heuristic about human authorship, and a 22-character machine\n // suffix should not push a 285-character human message over it. Second, a body that is ONLY \"(reference X)\"\n // now strips to empty and falls into the line below rather than toasting a bare code at the user — which\n // would be the blank-message failure this whole service exists to kill, in a new costume.\n if (!text) return 'opaque'; // nothing to show — a blank toast is the very failure mode this service exists to kill\n\n const lower = text.toLowerCase();\n\n if (this.opaqueMarkers.some(marker => lower.includes(marker))) return 'opaque';\n\n if (/\\bsystem\\.[a-z]/i.test(text)) return 'opaque'; // a .NET namespace (\"System.NullReferenceException\")\n if (/\\bat\\s+[\\w.]+\\s*\\(/.test(text)) return 'opaque'; // a stack frame (\"at Namespace.Method(\")\n // Changed: was `text.length > 300`, and it was a silent cliff. Length alone is not evidence of a dump, and\n // this test was the ONLY marker here that can fire on text containing nothing technical whatsoever — so a\n // deliberately-composed business refusal was replaced wholesale by \"We couldn't save that because of a\n // technical problem.\" with no trace that anything had been dropped. The worst case measured on a real\n // composed server message was 291 characters: NINE characters of headroom, and the next author to add a\n // clause would have crossed it without ever seeing why.\n //\n // The four markers above are the ones that actually detect a dump, and they detect it by CONTENT: the\n // opaqueMarkers deny-list (which already carries 'exception', 'stack trace', 'inner exception',\n // 'object reference not set', 'sqlexception' and the constraint-violation family), the .NET-namespace test,\n // and the stack-frame test. A genuine .NET dump cannot avoid all four — the type name alone trips\n // 'exception' or /\\bsystem\\./ before length is ever consulted.\n //\n // Raised rather than deleted so a pathological multi-kilobyte body still has a backstop. 2000 is chosen to\n // sit far above any composed human message (7x the worst one measured) and below a typical stack dump,\n // and above 2000 characters the text is unreadable in a dialog anyway, so replacing it loses nothing.\n if (text.length > 2000) return 'opaque'; // a body this long is a payload, not a sentence — see above\n\n return 'business';\n }\n\n // Added: pulls TinWeb's correlation code out of a catch-all message. The backend writes the same code into\n // its log line as \"[ref XXXXXXXX]\", so quoting it in the dialog is what lets support jump straight to the log\n // row instead of hunting by timestamp.\n //\n // The alphabet is A-Z/2-9 with 0/O/1/I/L removed (they are misread down a phone line), and the code is 8\n // characters — but the pattern accepts 6-12 so a future length change does not silently stop matching. The\n // reference is only ever EXTRACTED here; the rest of the raw message is still discarded, never shown.\n extractReference(message: string | null | undefined): string | null {\n const match = (message ?? '').match(/\\breference\\s+([A-Z2-9]{6,12})\\b/i);\n return match ? match[1].toUpperCase() : null;\n }\n\n // Added: the sibling to extractReference() — it takes the code OUT of the sentence. Nothing is lost by this,\n // because extractReference() has already read the code off the same string and it still reaches the console\n // line in presentAppFailure() and, where the surface can hold it, the dialog footnote.\n //\n // This exists because the backend changed shape. Every failure from BaseRepository.BuildSafeMessage and from\n // TinWeb's controller catch-alls now ends in \"(reference XXXXXXXX)\", so the reference is no longer the rare\n // case it was when this service was written — it is on the majority of application-level failures, including\n // the friendly ones. In a DIALOG that code is an asset: the box stays open, it renders as a quiet footnote,\n // and the user can copy it. In a 5-second toast it is the opposite. Nobody transcribes eight random\n // characters from a snackbar before it fades, so all it does is push the words that DO matter — \"A record\n // with these details already exists\" — further from the eye and make a helpful sentence read like a fault\n // report. The rule this settles on: the reference belongs on surfaces that persist long enough to copy it.\n //\n // Deliberately requires the PARENTHESES rather than matching a bare \"reference XXXX\" anywhere in the text.\n // Every server path that appends one — BaseRepository:399, BaseController:190/688, BaseController2:175/219,\n // BaseService:112/134, ExceptionMiddleware — writes the parenthesised form, so requiring them costs nothing,\n // and it means a hand-authored sentence that legitimately says \"quote reference on the invoice\" survives.\n stripReference(message: string | null | undefined): string {\n return (message ?? '')\n .replace(/\\s*\\(\\s*reference\\s+[A-Z2-9]{6,12}\\s*\\)/gi, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n }\n\n // Added: the sibling to present() for failures that arrive as HTTP 200 with success:false.\n //\n // Opaque -> the friendly dialog, through the SAME lastShownAt suppression map present() uses, so a burst\n // (a dashboard firing twenty calls at a broken backend) still yields exactly one dialog.\n // Business -> the existing toast, unchanged in weight. Short, meaningful, non-blocking.\n //\n // Why 'submit' gets its own dedupe key rather than sharing with loads: suppression exists to collapse a BURST\n // of background calls that all failed for one reason. A create/edit submit is not part of a burst — it is one\n // deliberate action, and it is the exact case where a missed message leads the user to press the button again\n // and duplicate the record. Sharing a key would let unrelated background load failures suppress the dialog\n // for the one interaction that most needs it. Keeping a (short) window on the submit key still collapses a\n // double-click, while letting a genuine retry a few seconds later speak up again.\n presentAppFailure(response: { message?: string } | null | undefined, context: AppFailureContext = 'action', url?: string): AppFailureClass {\n const message = response?.message;\n const failureClass = this.classifyMessage(message);\n\n // Always log the raw response and URL, exactly as present() does — the developer loses nothing by the\n // dialog being friendly, because the technical detail is right here.\n const reference = this.extractReference(message); // Added: null for SqlException leaks and older backends, which never mint one\n\n console.error(`[tin-spa] API failure (${failureClass}/${context})`, { url: redactSecrets(url), message: redactSecrets(message), reference }); // Changed (security 2026-08-31): dropped `response` — the whole API response object, i.e. the payload. The message (which is what classifyMessage read and what the developer needs) stays, redacted; the reference still ties this line to the server log.\n\n if (failureClass === 'business') {\n // Changed: dropped the \"Error: \" prefix that every call site used to prepend. Verified nothing depends on\n // it — no test in ng-space or any of the four consumer apps asserts on the literal \"Error: \". The prefix\n // only ever restated what the red-tinted message already conveyed, and it pushed the useful words right.\n //\n // Changed: the toast now shows the message with \"(reference X)\" REMOVED. This is the same argument as the\n // dropped prefix, one step further. Since TinCore 10.0.12 every BaseRepository failure — including the\n // GOOD ones — arrives as `ClassifyFailure(ex) + \" (reference X)\"`, so a genuinely useful sentence now\n // reads \"A record with these details already exists. (reference K7M2QP4T)\". Twenty-two characters of\n // machine correlation sit where the eye stops, on a surface that lives five seconds and cannot be copied\n // from, and they change how the sentence is READ: a helpful instruction starts to look like a fault\n // report. The code is not lost — extractReference() has already read it off the same string and it is on\n // the console line above, where the developer who can use it is looking.\n //\n // The surface, deliberately, is MessageService.toast EXACTLY AS IT IS — no new variant, no second\n // argument, nothing added to the toast API. The toast surface belongs to WS-7 and the whole correction\n // here is which characters are handed to it.\n //\n // Safe by construction: classifyMessage() strips the same suffix and returns 'opaque' when what remains\n // is empty, so a body that was ONLY \"(reference X)\" never reaches this branch and this can never toast\n // an empty string.\n this.messageService.toast(this.stripReference(message));\n return failureClass;\n }\n\n const kind: ApiErrorKind = context === 'submit' ? 'appfailure-submit' : 'appfailure';\n\n if (this.isSuppressed(kind, context === 'submit' ? this.submitSuppressWindowMs : this.suppressWindowMs)) return failureClass;\n\n this.lastShownAt.set(kind, Date.now());\n\n // Copy matches classify() above: name the problem, absolve the user, say what to do next. The submit\n // variant adds the two things that specifically stop a duplicate — that the data is still there, and that\n // pressing the button again is not the fix.\n // Changed: the reference is passed as its own argument rather than appended to the body, so the dialog can\n // render it as a quiet footnote. It is omitted entirely when there isn't one — a SqlException leak and an\n // older backend both arrive without a reference, and neither should show a dangling \"quote reference\" line.\n if (context === 'submit') {\n this.messageService.errorWithSubject(\n 'Not saved',\n `We couldn't save that because of a technical problem — not anything you did wrong.\\n\\n` +\n `Nothing was saved, and your details are still on the form, so you can try again without re-entering them.\\n\\n` +\n `If it keeps happening, please contact your administrator rather than submitting repeatedly, as that can create duplicates.`,\n reference ?? undefined\n );\n } else {\n this.messageService.errorWithSubject(\n 'Something went wrong',\n `We couldn't complete that action because of a technical problem — not anything you did wrong.\\n\\n` +\n `Please try again. If it keeps happening, contact your administrator.`,\n reference ?? undefined\n );\n }\n\n return failureClass;\n }\n\n /** Clears suppression so the next failure speaks up again — call after a successful request or reconnect. */\n reset() {\n this.lastShownAt.clear();\n }\n}\n","import { Injectable, Optional, Inject } from '@angular/core';\n// Changed (login-route vendor lever, LV-1): `import * as signalR` became `import type * as signalR`, and the\n// runtime module is now pulled by a DYNAMIC import inside startConnection(). Measured on shift-spa's login\n// route: @microsoft/signalr contributed 56,549 B to chunk-CLFD2O2M.js (the 1.41 MB core+vendor chunk that\n// EVERY route, including the anonymous login page, downloads). Nothing on login/signup/recover-account can\n// open a hub — startConnection() is called after sign-in — so those bytes were pure dead weight there.\n//\n// 🔴 THE TYPE-ONLY IMPORT IS THE LOAD-BEARING LINE. `import type` is erased at compile time, so it creates no\n// module edge and esbuild never pulls the vendor into this chunk. Change it back to a value import — even\n// \"just for one enum\" — and all 56 kB returns to the login route with no build, test or type-check\n// complaining. That is why the two enums below are written as literals instead: see LOG_* and the\n// HubConnectionState casts.\nimport type * as signalR from '@microsoft/signalr';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { TIN_SPA_RUNTIME_CONFIG, TinSpaRuntimeConfig } from '../runtime/tinspa-runtime';\nimport { redactSecrets } from './log-redact';\n\n// Added (LV-1): the runtime module, fetched once and cached. Every caller goes through this, so a second\n// startConnection() while the first import is still in flight reuses the SAME promise rather than racing.\nlet signalRModulePromise: Promise<typeof import('@microsoft/signalr')> | null = null;\nfunction loadSignalR(): Promise<typeof import('@microsoft/signalr')> {\n if (!signalRModulePromise) signalRModulePromise = import('@microsoft/signalr');\n return signalRModulePromise;\n}\n\n// Added (LV-1): the two @microsoft/signalr enum members this file needs, restated as literals so no VALUE\n// import is required. Both are verified against the vendor's own declarations, not assumed:\n// • LogLevel is a NUMERIC enum — Trace 0, Debug 1, Information 2, Warning 3, Error 4, Critical 5, None 6\n// (node_modules/@microsoft/signalr/dist/esm/ILogger.d.ts).\n// • HubConnectionState is a STRING enum whose members equal their own names — \"Disconnected\",\n// \"Connecting\", \"Connected\", \"Disconnecting\", \"Reconnecting\"\n// (node_modules/@microsoft/signalr/dist/esm/HubConnection.js:17-25).\n// The casts keep the comparisons type-checked against the real enum type, so a vendor change to either\n// shape still fails the BUILD rather than silently comparing two things that never match.\nconst LOG_WARNING = 3 as signalR.LogLevel;\nconst LOG_ERROR = 4 as signalR.LogLevel;\nconst STATE_DISCONNECTED = 'Disconnected' as signalR.HubConnectionState;\nconst STATE_CONNECTING = 'Connecting' as signalR.HubConnectionState;\nconst STATE_CONNECTED = 'Connected' as signalR.HubConnectionState;\nconst STATE_RECONNECTING = 'Reconnecting' as signalR.HubConnectionState;\n\n// Security (owner directive, 2026-08-31): the @microsoft/signalr default logger writes its negotiated URL to\n// the console at LogLevel.Information — and on the WebSocket transport that URL carries ?access_token=<JWT>,\n// because a WebSocket handshake cannot send an Authorization header. That printed the user's full bearer\n// token into any open devtools console. Two defences, deliberately both:\n// 1. the client log level drops to Warning, so the chatty Information/Debug transport lines (the ones that\n// quote the URL) are never emitted at all;\n// 2. whatever DOES still get logged goes through redactSecrets() first, so a future signalr version that\n// moves a URL into a warning or an error cannot re-open the hole.\nexport class RedactingSignalRLogger implements signalR.ILogger {\n // Changed (LV-1): signalR.LogLevel.Warning/.Error were the only VALUE references in this class, and they\n // alone would have forced the 56 kB vendor into the login chunk. They are now the LOG_* literals declared\n // above. Public shape, behaviour and thresholds are byte-for-byte the same.\n constructor(private minimumLevel: signalR.LogLevel = LOG_WARNING) {}\n\n log(logLevel: signalR.LogLevel, message: string): void {\n if (logLevel < this.minimumLevel) return;\n const safe = `[signalr] ${redactSecrets(message)}`;\n if (logLevel >= LOG_ERROR) console.error(safe);\n else console.warn(safe);\n }\n}\n\n// Entity change event interface for real-time table updates\nexport interface EntityChangeEvent {\n entityName: string;\n data: any;\n}\n\n// Changed: Notification toast event from backend NotificationService\nexport interface NotificationEvent {\n message: string;\n category: string;\n type: string;\n sender: string;\n}\n\n// Added (GPS phase 4): the live vehicle position frame, exactly as the server broadcasts it on the\n// data_{tenantId} group. Six scalars and no entity payload — that is the whole point of it being its own\n// hub method rather than an EntityUpdated on Vehicle.\nexport interface VehiclePositionFrame {\n vehicleID: number;\n lat: number;\n lng: number;\n at: string;\n speed?: number | null;\n heading?: number | null;\n}\n\n// Changed: Consolidated SignalR service — single hub connection for both notifications and entity broadcasts\n@Injectable({ providedIn: 'root' })\nexport class SignalRService {\n private hubConnection: signalR.HubConnection | null = null;\n private notificationCount = new BehaviorSubject<number>(0);\n notificationCount$ = this.notificationCount.asObservable();\n\n private entityCreated = new Subject<EntityChangeEvent>();\n private entityUpdated = new Subject<EntityChangeEvent>();\n private entityDeleted = new Subject<EntityChangeEvent>();\n entityCreated$ = this.entityCreated.asObservable();\n entityUpdated$ = this.entityUpdated.asObservable();\n entityDeleted$ = this.entityDeleted.asObservable();\n\n // Added (GPS phase 4): the position stream. A plain Subject, so a page that is not showing a map pays\n // nothing for it, and a page that is subscribes for exactly as long as it is open.\n private vehiclePosition = new Subject<VehiclePositionFrame>();\n vehiclePosition$ = this.vehiclePosition.asObservable();\n\n // Changed: Observable for notification toast events from backend NotificationService\n private notificationReceived = new Subject<NotificationEvent>();\n notificationReceived$ = this.notificationReceived.asObservable();\n\n // Changed: Agent chat message and typing indicator streams (renamed from assistant*)\n private agentMessage = new Subject<any>();\n private agentTyping = new Subject<boolean>();\n agentMessage$ = this.agentMessage.asObservable();\n agentTyping$ = this.agentTyping.asObservable();\n\n // Callback for reconnection — notification count refresh (set by NotificationsService)\n onReconnected: (() => void) | null = null;\n // Changed: this comment used to read \"tables should reload (set by table components)\" and was WRONG in the way\n // that costs the most — it described a behaviour nobody had built. The slot has been declared since 1edd335\n // (2026-03-23) and is invoked on both reconnect paths below, but NOTHING HAS EVER ASSIGNED IT\n // (`git log --all -G\"onDataReconnected\\s*=\\s*\\(\"` is empty), so reconnect never reloaded any table and the\n // comment made that look intentional. Reconnect refresh now lives in TableComponent.setupReconnectRefresh(),\n // which subscribes to dataHubConnected$ (and OfflineService.online$) per table — a single-slot callback cannot\n // serve the N tables one page may hold, which is why it is not filled in here.\n // KEPT, not deleted: it is a public field on a published library service, so removing it is a breaking change\n // for any consumer that assigns it. It remains available as a general \"the data hub came back\" hook.\n onDataReconnected: (() => void) | null = null;\n\n // Changed: Single connection state observable — used by real-time table indicators\n private dataHubConnected = new BehaviorSubject<boolean>(false);\n dataHubConnected$ = this.dataHubConnected.asObservable();\n\n private currentToken: string = ''; // Changed: Live token reference for SignalR reconnection\n\n // Changed: real-time is now driven centrally by tin-spa runtime config (provideTinSpaRuntime).\n constructor(\n @Optional() @Inject(TIN_SPA_RUNTIME_CONFIG) private runtimeConfig: TinSpaRuntimeConfig | null,\n ) {}\n\n /** Effective real-time enablement: legacy E2E kill-switch wins, else the configured runtime flag. */\n private realTimeEnabled(): boolean {\n if (typeof localStorage !== 'undefined' && localStorage.getItem('disableRealTime') === 'true') return false; // legacy/E2E override\n return this.runtimeConfig ? !!this.runtimeConfig.realTime : false;\n }\n\n /** Public: whether SignalR is the authoritative connection signal (used by OfflineService to pick SignalR vs ping). */\n get isRealTime(): boolean { return this.realTimeEnabled(); }\n\n // Added (LV-1): guards the window between \"we decided to build a connection\" and \"the dynamically imported\n // vendor module arrived\". Before LV-1 the build was synchronous, so the `state !== Disconnected` test above\n // was sufficient to stop a second caller building a second hub. It no longer is: two calls arriving in the\n // same tick would both pass that test and both build. This restores the original at-most-one guarantee.\n private buildingConnection = false;\n // Added (LV-1): the SECOND thing the async hop breaks, and the less obvious one. stopConnection() could\n // previously never race the build, because the build was synchronous. Now a stop (sign-out is the real\n // case) can land while the vendor chunk is still downloading, and the build would then complete AFTER it\n // and leave a live hub nobody asked for — a signed-out session holding an authenticated connection. Every\n // build carries the generation it was started under; a stop bumps it, and a stale build discards itself.\n private connectionGeneration = 0;\n\n // Changed (LV-1): the gates, the token store and the at-most-one checks all still run SYNCHRONOUSLY here,\n // exactly as before — only the part that needs the vendor module moved behind the dynamic import. The\n // method still returns void and is still fire-and-forget, so no caller changes.\n startConnection(hubUrl: string, token: string) {\n // Real-time disabled (by config or override) -> do not connect.\n if (!this.realTimeEnabled()) return;\n\n this.currentToken = token; // Changed: Store token so it can be updated after refresh\n if (this.hubConnection && this.hubConnection.state !== STATE_DISCONNECTED) return;\n if (this.buildingConnection) return; // Added (LV-1): an import for this same connection is already in flight\n if (this.hubConnection) this.stopConnection();\n\n this.buildingConnection = true;\n const generation = this.connectionGeneration;\n loadSignalR()\n .then(signalR => this.buildConnection(signalR, hubUrl, generation))\n .catch(err => {\n this.dataHubConnected.next(false);\n console.error('SignalR module load failed: ' + redactSecrets(String(err?.message ?? err))); // Added (LV-1): a chunk that fails to fetch must SAY so — a silent catch here would look exactly like \"real-time is off\"\n })\n .finally(() => { this.buildingConnection = false; });\n }\n\n // Added (LV-1): everything below this line is the ORIGINAL startConnection body, moved verbatim except that\n // `signalR` is now a parameter rather than a module-scope namespace. Nothing was reordered.\n private buildConnection(signalR: typeof import('@microsoft/signalr'), hubUrl: string, generation: number) {\n if (generation !== this.connectionGeneration) return; // Added (LV-1): a stopConnection() overtook this build — see connectionGeneration\n this.hubConnection = new signalR.HubConnectionBuilder()\n .withUrl(hubUrl, { accessTokenFactory: () => this.currentToken }) // Changed: Use live reference so reconnections use the latest token\n .configureLogging(new RedactingSignalRLogger(signalR.LogLevel.Warning)) // Changed (security 2026-08-31): replaces the default Information console logger, which printed the negotiated URL including ?access_token=<JWT>\n .withAutomaticReconnect([0, 2000, 5000, 10000, 30000, 60000, 60000, 60000, 60000, 60000]) // Changed: Extended retry policy for entity broadcast reliability\n .build();\n\n // Changed: Notification count listener (previously on separate notification hub)\n this.hubConnection.on('ReceiveNotificationCount', (count: number) => {\n this.notificationCount.next(count);\n });\n\n // Changed: Notification toast listener — receives full notification from backend NotificationService\n this.hubConnection.on('ReceiveNotification', (event: NotificationEvent) => {\n this.notificationReceived.next(event);\n });\n\n // Changed: Agent chat listeners for real-time message delivery (renamed from Assistant*)\n this.hubConnection.on('ReceiveAgentMessage', (msg: any) => {\n this.agentMessage.next(msg);\n });\n\n this.hubConnection.on('AgentTyping', (typing: boolean) => {\n this.agentTyping.next(typing);\n });\n\n // Changed: Entity CRUD listeners (previously on separate data hub)\n this.hubConnection.on('EntityCreated', (entityName: string, data: any) => {\n this.entityCreated.next({ entityName, data });\n });\n\n this.hubConnection.on('EntityUpdated', (entityName: string, data: any) => {\n this.entityUpdated.next({ entityName, data });\n });\n\n this.hubConnection.on('EntityDeleted', (entityName: string, data: any) => {\n this.entityDeleted.next({ entityName, data });\n });\n\n // Added (GPS phase 4): live vehicle position frames. Deliberately a SEPARATE hub method from the\n // Entity* trio and not routed through them — a position carries six scalars and must never trigger\n // the table-reload machinery those events drive. The frame is emitted verbatim; mapping it to the\n // map's MapPositionUpdate shape is the consumer's job, so this service stays free of map types.\n this.hubConnection.on('VehiclePosition', (frame: VehiclePositionFrame) => {\n this.vehiclePosition.next(frame);\n });\n\n // Changed: Single reconnect handler covers both notification refresh and table reload\n this.hubConnection.onreconnected(() => {\n this.dataHubConnected.next(true);\n if (this.onReconnected) this.onReconnected();\n if (this.onDataReconnected) this.onDataReconnected();\n });\n\n // Changed: Track disconnection state for connection indicator\n this.hubConnection.onclose(() => {\n this.dataHubConnected.next(false);\n setTimeout(() => {\n if (this.hubConnection?.state === signalR.HubConnectionState.Disconnected) {\n this.hubConnection.start()\n .then(() => this.dataHubConnected.next(true))\n .catch(() => this.dataHubConnected.next(false));\n }\n }, 60000);\n });\n this.hubConnection.onreconnecting(() => this.dataHubConnected.next(false));\n\n this.hubConnection.start()\n .then(() => this.dataHubConnected.next(true))\n .catch(err => {\n this.dataHubConnected.next(false);\n console.error('SignalR connection error: ' + redactSecrets(String(err?.message ?? err))); // Changed (security 2026-08-31): the raw err was logged as an OBJECT, expandable in devtools and routinely carrying the negotiated URL (token and all). Message only, redacted.\n });\n }\n\n // Changed: Update the token used for SignalR reconnection (called after silent refresh)\n updateToken(token: string) {\n this.currentToken = token;\n }\n\n private forcingReconnect = false;\n\n /**\n * Reconnect the hub NOW if real-time is enabled and the connection isn't up. Driven by OfflineService\n * connectivity (the ping heartbeat) so the real-time indicator recovers on the SAME signal that flips the\n * offline indicator back to online — they stay married \"hand in glove\". Handles both states the built-in\n * auto-reconnect leaves us in: Reconnecting (stuck waiting on a long backoff interval → interrupt and connect\n * now) and Disconnected (auto-reconnect exhausted after a long outage → start fresh). Safe to call repeatedly.\n */\n reconnectIfNeeded() {\n if (!this.realTimeEnabled()) return;\n if (!this.hubConnection) return; // never started (pre-login) — startConnection() will build it\n // Changed (LV-1): was `const State = signalR.HubConnectionState` — a VALUE read of the vendor namespace,\n // which would have defeated the type-only import. The STATE_* literals are the same five strings.\n const state = this.hubConnection.state;\n if (state === STATE_CONNECTED || state === STATE_CONNECTING) return; // already good / initial connect in flight\n if (this.forcingReconnect) return; // a forced reconnect is already underway\n\n this.forcingReconnect = true;\n const start = () => this.hubConnection!.start()\n .then(() => {\n this.dataHubConnected.next(true);\n if (this.onReconnected) this.onReconnected();\n if (this.onDataReconnected) this.onDataReconnected();\n })\n .catch(() => this.dataHubConnected.next(false))\n .finally(() => { this.forcingReconnect = false; });\n\n if (state === STATE_RECONNECTING) { // Changed (LV-1): same literal substitution as the two states above\n this.hubConnection.stop().finally(start); // interrupt the backoff wait, then connect immediately\n } else {\n start(); // Disconnected\n }\n }\n\n stopConnection() {\n this.connectionGeneration++; // Added (LV-1): invalidates any build still waiting on the vendor chunk — see connectionGeneration\n if (this.hubConnection) {\n this.hubConnection.stop();\n this.hubConnection = null;\n this.dataHubConnected.next(false); // Changed: Mark disconnected on stop\n }\n }\n}\n","import { Injectable, NgZone, Optional, Inject } from '@angular/core';\n// Changed (L2): `import type` — ERASED at compile time, so it creates no module edge and dexie's 97 kB no longer\n// lands in tin-spa's eager core chunk. Every VALUE from dexie (the Dexie constructor, Dexie.delete, liveQuery) now\n// comes from the cached dynamic import in loadDexie() below.\nimport type Dexie from 'dexie';\nimport type { Table } from 'dexie';\nimport { BehaviorSubject, defer, from, Observable, of, Subject, firstValueFrom, timeout, throwError } from 'rxjs'; // Changed: defer — the liveQuery streams now open the store lazily, per subscription\nimport { catchError, map, switchMap, tap } from 'rxjs/operators'; // Changed: switchMap — chain the async open in front of liveQuery\nimport { Action, ApiResponse, Button, Constants, FormConfig, OfflineConfig, OfflineOpStatus, TableConfig } from '../classes/Classes'; // Changed: Button — registerLookups now walks a button's detailsConfig form (two-step create)\nimport { HttpService } from './http.service';\nimport { AuthService } from './auth.service';\nimport { StorageService } from './storage.service';\nimport { MessageService } from './message.service';\nimport { ApiErrorService } from './api-error.service'; // Added: for its Retry-After parser — the drain must wait as long as the SERVER asked, not as long as it guessed\nimport { SignalRService } from './signalr.service';\nimport { TIN_SPA_RUNTIME_CONFIG, TinSpaRuntimeConfig } from '../runtime/tinspa-runtime';\n\n// TinSync — the single offline subsystem service. Merges the read cache, outbox store, connectivity\n// detection, and sync engine into one cohesive unit so the whole feature reads top-to-bottom.\n// Everything is inert until a TableConfig with `offline` registers: no IndexedDB is opened and no\n// connectivity work runs (except the toolbar indicator, which starts connectivity to show a status light).\n\n//---------------- Internal types ----------------\n\ninterface ResolvedOfflineConfig {\n enabled: boolean;\n cacheRows: number;\n cacheLookups: boolean | string[];\n lookupMaxAgeHours: number;\n queue: { create: boolean; edit: boolean; delete: boolean };\n maxQueueAgeHours: number;\n readOnly: boolean;\n}\n\nexport interface OfflineEntry {\n entity: string; // URL entity segment, e.g. 'categories' — the cache/queue namespace\n entityName: string; // display/SignalR name, e.g. 'Category'\n idField: string; // entity id property on rows, e.g. 'categoryID'\n config: ResolvedOfflineConfig;\n}\n\nexport interface OutboxOp {\n seq?: number; // Dexie auto-increment — the strict FIFO order\n opId: string; // stable per-op UUID, generated at enqueue\n entity: string;\n entityName: string;\n url: string; // e.g. 'categories?action=create'\n opAction: 'create' | 'edit' | 'delete';\n payload: any;\n clientRef?: string; // creates only — server-side idempotency key\n targetId?: any; // edits/deletes of server rows\n targetClientRef?: string; // edits/deletes of still-pending offline creates\n refMap?: { [field: string]: string }; // FK field -> parent clientRef (server resolves via ClientRefs)\n status: OfflineOpStatus;\n attempts: number;\n lastError?: string;\n serverRecord?: any; // current server row, parked on conflict\n maxAgeHours: number;\n userId: string;\n enqueuedAt: number;\n syncedAt?: number;\n}\n\ninterface CachedRead {\n url: string; // relative URL — same key CallApi's in-memory cache uses\n entity: string;\n data: any;\n savedAt: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OfflineService {\n\n //================ Connectivity (public) ================\n online$ = new BehaviorSubject<boolean>(typeof navigator === 'undefined' ? true : navigator.onLine);\n // Entities whose ops synced in the last drain — tables listen to refetch (push-then-pull)\n drained$ = new Subject<string[]>();\n\n //---------------- Dexie ----------------\n private db: Dexie | null = null;\n private reads!: Table<CachedRead, string>;\n private outbox!: Table<OutboxOp, number>;\n private meta!: Table<{ key: string, value: any }, string>;\n // Added (L2): the dynamically imported dexie namespace, cached after the first load, and the in-flight open so\n // concurrent callers share ONE open rather than racing to construct two Dexie instances for the same name.\n private dexie: typeof import('dexie') | null = null;\n private opening: Promise<Dexie> | null = null;\n\n //---------------- Registry ----------------\n private entries = new Map<string, OfflineEntry>();\n private readUrls = new Map<string, OfflineEntry>();\n private readPrefixes: { prefix: string, entry: OfflineEntry }[] = [];\n registered$ = new BehaviorSubject<boolean>(false);\n\n //---------------- Runtime flags ----------------\n private connectivityStarted = false;\n private syncStarted = false;\n private draining = false;\n private backoffTimer: any = null;\n // Added: how long the SERVER asked us to wait, in ms, from the Retry-After on the failure that just halted the\n // drain — or null when it said nothing. Written by sendOp(), read once by drainLoop() on the very next line\n // after it returns, so it is never stale: sendOp() clears it on entry, before any I/O.\n private serverRetryAfterMs: number | null = null;\n // Added: epoch ms before which no AUTOMATIC drain may send, set only when the SERVER stated a Retry-After.\n // Never set from the guessed attempt-count backoff — a reconnect drain jumping a guess is harmless and useful;\n // jumping an instruction is not.\n private retryNotBefore = 0;\n private periodicTimer: any = null;\n private recoveryTimer: any = null;\n\n constructor(\n private httpService: HttpService,\n private authService: AuthService,\n private storage: StorageService,\n private messageService: MessageService,\n private apiErrorService: ApiErrorService, // Added: shares ONE Retry-After parser with the dialog/toast path\n private signalR: SignalRService,\n private zone: NgZone,\n @Optional() @Inject(TIN_SPA_RUNTIME_CONFIG) private runtimeConfig: TinSpaRuntimeConfig | null,\n ) { }\n\n /** App-level gate: offline capability only runs when the app opts in via provideTinSpaRuntime({ offline: true }).\n * When off, register()/ensureConnectivity() no-op, so a consumer that never uses offline runs none of this. */\n get enabled(): boolean { return !!this.runtimeConfig?.offline; }\n\n get hasAny(): boolean { return this.entries.size > 0; }\n get online(): boolean { return this.online$.value; }\n\n // Added: \"this app is actively tracking connectivity AND currently believes it is offline.\"\n //\n // Deliberately NOT the same as `!online`. online$ is seeded from navigator.onLine at construction, and in an\n // app that never opts into offline capability ensureConnectivity() returns early, so that seed is never\n // corrected by a ping. A consumer whose page happened to load while navigator.onLine was false would then\n // report `!online === true` FOREVER. Requiring connectivityStarted means this can only be true when a live\n // ping heartbeat is the thing asserting it — i.e. when the offline indicator is genuinely up and the recovery\n // poll is genuinely running, which is the state the interceptor's suppression is entitled to reason about.\n get knownOffline(): boolean { return this.connectivityStarted && !this.online$.value; }\n\n //================ Sync page view ================\n // Live, display-ready outbox rows (summary + status label projected on) for the sync page's spa-table.\n outboxView$(): Observable<any[]> {\n return this.activeOps$().pipe(\n map(ops => ops.map(op => ({ ...op, summary: this.summarize(op), statusLabel: this.statusLabel(op) })))\n );\n }\n\n private summarize(op: OutboxOp): string {\n const p = op.payload ?? {};\n if (typeof p.name === 'string' && p.name) return p.name;\n const firstString = Object.keys(p).map(k => p[k]).find(v => typeof v === 'string' && v.length > 0 && v.length < 60);\n return firstString ?? (op.targetId != null ? `#${op.targetId}` : 'new record');\n }\n\n private statusLabel(op: OutboxOp): string {\n switch (op.status) {\n case 'failed': return 'Failed';\n case 'conflict': return 'Conflict';\n case 'stale': return 'Held';\n case 'syncing': return 'Sending';\n default: return 'Pending';\n }\n }\n\n //================ Registry ================\n\n // Called from TableComponent when a config with `offline` initializes; ONE entry per entity, but the\n // entity's READ SURFACE is additive — see registerReads\n register(config: TableConfig): OfflineEntry | null {\n if (!this.enabled) return null; // app-level gate: ignore per-table offline flags when the app didn't opt in\n const resolved = this.resolveConfig(config.offline);\n if (!resolved || !config.loadAction?.url) return null;\n\n const entity = config.loadAction.url.split('/')[0].split('?')[0];\n const existing = this.entries.get(entity);\n // Changed: a second table on an already-registered entity used to return here WITHOUT contributing its own\n // url, so a nested detail tab (`receipts/purchase/5`) and a sibling grid (`invoices/customer-all/x`) could\n // never enter the read seam at all — nothing cached, nothing served, and the Connection Error toast not\n // suppressed either. It now registers its read surface against the existing entry. The ENTRY itself\n // (idField, resolved offline config, outbox behaviour) still belongs to whichever table registered first,\n // deliberately: two tables on one entity share one outbox, and a second, DIFFERING `offline` block on the\n // same entity is a config smell to surface rather than something to merge silently.\n // Changed: the second table now also contributes its LOOKUPS, not only its reads. Registering reads here\n // (above) but not lookups left the same defect one level up, and it is decided by RENDER ORDER, which no\n // config can control: whichever table claims the entity first is the only one whose form and button-dialog\n // selects ever enter the read seam. The live shape, verified in shift-spa: `driver.service.ts:39` spreads\n // `tripsTableConfig` onto `trips/driver/x` and FILTERS the buttons down to checkout/checkin/view, dropping\n // the trip-create button whose `detailsConfig.formConfig` is the sole declarer of `allocTemplates/list/x`\n // and `triptemplates/list/x`. Open a driver before the Trips grid and those two urls are never registered,\n // never cached, and the offline create dialog opens with two EMPTY required selects — exactly the gap\n // `registerButtonLookups` was added to close, defeated by the order the user happened to navigate in.\n // `driverLoadsTableConfig:57` filters loads' buttons the same way.\n //\n // Safe by the same construction registerReads already relies on: registerLookups() dedupes on\n // `readUrls.has(url)` so re-registering costs nothing, and it filters through `existing.config.cacheLookups`\n // — the FIRST config's allowlist, deliberately, because the ENTRY (and therefore the offline contract for\n // this entity) still belongs to whoever registered first. Additive only: a url can be gained here, never\n // lost, and registration alone writes no storage — a cache entry appears only when the url is fetched\n // online (handleOfflineRead).\n if (existing) {\n this.registerReads(config, existing);\n this.registerLookups(config.formConfig, existing);\n this.registerButtonLookups(config.buttons, existing);\n this.startSync();\n return existing;\n }\n\n const entry: OfflineEntry = {\n entity,\n entityName: config.entityName ?? entity,\n idField: (config.formConfig?.heroField ?? config.heroField ?? entity.replace(/s$/, '') + 'ID') as string,\n config: resolved,\n };\n\n this.entries.set(entity, entry);\n if (!this.registered$.value) this.registered$.next(true);\n this.registerReads(config, entry);\n this.registerLookups(config.formConfig, entry);\n this.registerButtonLookups(config.buttons, entry); // Added: the two-step-create dialog's form lives on a BUTTON, not on config.formConfig — see below\n\n this.startSync();\n return entry;\n }\n\n // Added: one table's whole read surface, registered against `entry`. Runs for the first table to claim an\n // entity AND for every later one, which is what makes nested tabs and sibling grids addressable.\n //\n // ⚠️ MATCHING is by PREFIX; CACHE KEYING stays by full url. Conflating the two is the version of this change\n // that looks correct and quietly corrupts the cache — the same failure P2 hit with paged chunks, one level\n // up. `receipts/purchase/5` and `receipts/purchase/7` are DIFFERENT RESOURCES (different rows), unlike\n // `?skip=&take=`, which is a window over ONE resource; a tile url is likewise a filtered subset of the grid.\n // So a prefix lets them all MATCH, while each keeps its own cache entry — parent 7's tab can never be served\n // parent 5's receipts, and a tile view can never be written over the full list's accumulated window.\n // `cacheKey()` therefore still strips paging params and NOTHING ELSE; do not \"tidy\" it to strip the id\n // segment. Key-space growth is bounded per parent visited (not per scroll gesture, which is why P2 rejected\n // full-url keying for paging) and is capped again by pruneDynamicReads().\n private registerReads(config: TableConfig, entry: OfflineEntry) {\n // A child tab's url is rewritten per parent BEFORE this runs (`<entity>/<loadCriteria>/<id>` — TinCore.ts\n // transformLoadUrl, detailsDialog.component.ts) and rewritten again after a keep-open create. So the id we\n // happen to see is worthless; `loadCriteria` is the config-declared, stable stem, and covers the\n // placeholder form (`.../x`) the table may have registered with before the parent resolved.\n if (config.loadCriteria) this.addReadPrefix(`${entry.entity}/${config.loadCriteria}/`, entry);\n if (config.formConfig?.loadAction?.url) this.addReadPrefix(config.formConfig.loadAction.url + '/', entry);\n\n if (config.loadAction?.url) this.addReadUrl(config.loadAction.url, entry);\n if (config.countAction?.url) this.addReadUrl(config.countAction.url, entry);\n // Tile clicks REPLACE config.loadAction wholesale (TableComponent.tileClicked) with a url the registry was\n // never handed, so a tile view on an offline table silently left the seam. Tile urls are declared in the\n // config, so register them exactly — no wildcard needed. Same-entity guard because a tile may point at\n // another endpoint entirely. tileConfig.loadAction (the COUNTS/summary call) is deliberately NOT\n // registered: a cached aggregate is a stale number with nothing to say it is stale, which is the reason\n // the Phase 2 sweep skipped every report grid.\n config.tileConfig?.tiles?.forEach(t => {\n const url = t.action?.url;\n if (url && url.split('/')[0].split('?')[0] === entry.entity) this.addReadUrl(url, entry);\n });\n }\n\n private addReadPrefix(prefix: string, entry: OfflineEntry) {\n if (!this.readPrefixes.some(p => p.prefix === prefix && p.entry === entry)) this.readPrefixes.push({ prefix, entry });\n }\n\n // Skips a url one of this entry's own prefixes already covers, so revisiting parent after parent cannot grow\n // the map — the per-parent url is matched by the stem, never accumulated.\n private addReadUrl(url: string, entry: OfflineEntry) {\n if (this.readUrls.has(url)) return;\n if (this.readPrefixes.some(p => p.entry === entry && url.startsWith(p.prefix))) return;\n this.readUrls.set(url, entry);\n }\n\n private registerLookups(formConfig: FormConfig | undefined, entry: OfflineEntry, depth: number = 0) {\n if (!formConfig?.fields || depth > 1) return;\n const allow = entry.config.cacheLookups;\n if (allow === false) return;\n formConfig.fields.forEach((field: any) => {\n const url = field.loadAction?.url;\n if (url && (allow === true || (Array.isArray(allow) && allow.includes(url)))) {\n if (!this.readUrls.has(url)) this.readUrls.set(url, entry);\n }\n if (field.detailsConfig?.formConfig) this.registerLookups(field.detailsConfig.formConfig, entry, depth + 1);\n });\n }\n\n // Added: the TWO-STEP CREATE gap. CLAUDE.md's documented pattern (Invoice, Sales/Purchase Order, Requisition,\n // Production Recipe/Order, Trip, Rental, Bundle/Check Template, Checklist, Alloc Template — 12 entities) puts the\n // real create form on `button.detailsConfig.formConfig`, NOT on `tableConfig.formConfig`. registerLookups only ever\n // walked the latter, so those forms' selects were never in the read seam: the urls were fetched online and thrown\n // away, and offline the dialog opened with every dropdown empty. Where a select is `required` that is not a\n // degraded form, it is an UNSUBMITTABLE one — the write queue behind it was unreachable from the UI.\n // (Observed, WS-1 trips/loads: opening Shift's trip-create dialog ONLINE cached vehicles/trailers/drivers — the\n // three the TABLE form declares — and not triptemplates or allocTemplates, which only the BUTTON form declares.)\n //\n // ⚠️ BOUNDED DELIBERATELY, and the boundary is not arbitrary — it is \"does anything else already register this?\":\n // • BUTTON detailsConfig forms ARE walked. A dialog form is not a spa-table; nothing else ever registers it, so\n // if this does not, nothing does.\n // • detailsConfig.tableConfigs are NOT walked. A nested tab renders through <spa-table> (tabs.component.html),\n // so its TableComponent calls offline.register() itself and registers its own reads AND its own lookups under\n // its OWN entity, cacheLookups allowlist and cacheRows. Walking them here would re-register another entity's\n // lookups under THIS entity's allowlist — duplicate work, filtered by the wrong config.\n // • detailsConfig.buttons are NOT walked, and neither are column detailsConfigs: one level of button is what the\n // documented pattern needs, and each extra level multiplies the walk for configs that share dialogs anyway.\n // Depth inside each form is unchanged — a button form enters registerLookups at depth 0, exactly like the table's\n // own form, so its fields' quick-add (\"Add New\") forms still register and nothing deeper does.\n // VOLUME: this only makes a url MATCHABLE; a cache entry is written solely when that url is actually fetched while\n // online (handleOfflineRead), so a registered-but-never-opened dialog costs one Map entry and no storage. Buttons\n // per table are single digits, and cacheLookups === false / an explicit allowlist still filter every url here.\n private registerButtonLookups(buttons: Button[] | undefined, entry: OfflineEntry) {\n buttons?.forEach(b => { if (b.detailsConfig?.formConfig) this.registerLookups(b.detailsConfig.formConfig, entry); });\n }\n\n // Added: CACHE KEY DECISION — a paged read is cached under its BASE url, i.e. with `skip`/`take` stripped,\n // NOT under the full url. The paging window is a view parameter over one resource, not a different resource:\n // keying by the full url would mint an unbounded number of IndexedDB entries (take varies per fetch — see\n // TableComponent.fetchChunk), whose contents would drift apart from one another, and the entry the table\n // asks for on a cold offline start (skip=0&take=<fetchSize>) is not guaranteed to be one that was ever\n // written. One base-url entry holds the accumulated front-anchored window, capped at `cacheRows`, and is\n // overwritten as the user pages — bounded storage and never self-inconsistent.\n cacheKey(url: string): string {\n const q = url.indexOf('?');\n if (q < 0) return url;\n const kept = url.substring(q + 1).split('&').filter(p => !/^(skip|take)=/.test(p));\n return kept.length ? url.substring(0, q) + '?' + kept.join('&') : url.substring(0, q);\n }\n\n // Added: true when a read carries paging params — such a response is ONE CHUNK, not the whole window\n isPagedRead(url: string): boolean {\n return /[?&](skip|take)=/.test(url);\n }\n\n matchRead(url: string): OfflineEntry | null {\n if (!this.hasAny) return null;\n const exact = this.readUrls.get(url);\n if (exact) return exact;\n const prefixed = this.readPrefixes.find(p => url.startsWith(p.prefix));\n if (prefixed) return prefixed.entry;\n\n // Changed: registration stores the un-paged url (`customers/all/x`) but a paged table requests\n // `customers/all/x?skip=0&take=25`, so the exact lookup above could never match and a paginated+offline\n // table never entered the offline read seam at all — nothing was cached, nothing was served, and the\n // Connection Error toast was not suppressed either (suppressesUrl routes through here). Retry on the base url.\n const base = this.cacheKey(url);\n if (base === url) return null;\n const baseExact = this.readUrls.get(base);\n if (baseExact) return baseExact;\n const basePrefixed = this.readPrefixes.find(p => base.startsWith(p.prefix));\n return basePrefixed ? basePrefixed.entry : null;\n }\n\n // Changed (O1): the grammar now accepts path segments before `?action=` — `transactions/dto?action=create`\n // was failing the old `[^?/]+` on the slash alone, which made the WRITE half of the library's own\n // offline-enabled transactions grid a silent no-op (accounting.service.ts:762 promises queueing it never did).\n // The entity is the FIRST path segment, the same convention register() derives it from loadAction.url, so a\n // bare `customers?action=create` resolves exactly as before. This deliberately does NOT admit the other\n // grammar casualties: `checkactions?action=yes|no` (verbs stay create|edit|delete — mapping yes/no onto queue\n // semantics is a design decision, not a parse), `pigmovements/move` / `pigtransactions/*` (no action grammar\n // at all — queueing them needs a config surface declaring each custom endpoint's CRUD semantics), and the\n // `<entity>/form?action=` family, which is refused one level up (CallApi's isFormData guard) because file\n // uploads cannot queue. For those, a match here only ever yields the explicit 'File uploads require a\n // connection' message instead of a raw connection error — nothing queues.\n matchMutation(url: string): OfflineEntry | null {\n if (!this.hasAny) return null;\n const match = url.match(/^([^?]+)\\?action=(create|edit|delete)$/); // Changed: [^?/]+ -> [^?]+ — allow slashes in the path\n if (!match) return null;\n const entry = this.entries.get(match[1].split('/')[0]); // Changed: entity = first path segment (unchanged for slash-free urls)\n if (!entry) return null;\n return entry.config.queue[match[2] as 'create' | 'edit' | 'delete'] ? entry : null;\n }\n\n // Interceptor seam: suppress the 'Connection Error' toast for URLs the offline layer handles (plus the heartbeat)\n suppressesUrl(absoluteUrl: string): boolean {\n const relative = absoluteUrl.startsWith(this.httpService.apiUrl) ? absoluteUrl.substring(this.httpService.apiUrl.length) : absoluteUrl;\n if (relative === 'ping') return true;\n if (!this.hasAny) return false;\n return !!(this.matchRead(relative) || this.matchMutation(relative));\n }\n\n private resolveConfig(offline: OfflineConfig | boolean | undefined): ResolvedOfflineConfig | null {\n if (!offline) return null;\n const cfg: OfflineConfig = offline === true ? { enabled: true } : offline;\n if (!cfg.enabled) return null;\n return {\n enabled: true,\n cacheRows: cfg.cacheRows ?? 500,\n cacheLookups: cfg.cacheLookups ?? true,\n lookupMaxAgeHours: cfg.lookupMaxAgeHours ?? 72,\n queue: cfg.readOnly\n ? { create: false, edit: false, delete: false }\n : { create: cfg.queue?.create ?? true, edit: cfg.queue?.edit ?? true, delete: cfg.queue?.delete ?? false },\n maxQueueAgeHours: cfg.maxQueueAgeHours ?? 72,\n readOnly: cfg.readOnly ?? false,\n };\n }\n\n //================ Store (Dexie) ================\n\n // Added: how many changes this user has captured but not yet synced. Drives the sign-out warning — we never\n // let someone walk away from unsynced work without telling them.\n async pendingCount(): Promise<number> {\n if (!this.enabled) return 0;\n try {\n return await (await this.ensureOpen()).table('outbox').filter((op: any) => op.status !== 'synced').count(); // Changed: ensureOpen is async now\n } catch { return 0; }\n }\n\n // Added: what LOGOUT should call. Clears the cached reads (a shared device must not retain the previous\n // user's records) but KEEPS the outbox: those are changes the user made and has not synced yet — possibly a\n // whole day in the field — and they must outlive the session. The IndexedDB name is already per-user, so the\n // queue stays invisible to anyone else and drains when its owner signs back in.\n async clearCacheKeepOutbox(): Promise<void> {\n if (!this.enabled) return;\n try {\n await (await this.ensureOpen()).table('reads').clear(); // Changed: ensureOpen is async now\n } catch (e) {\n console.warn('Offline cache clear failed', e);\n }\n }\n\n // Destroys the outbox too — only for an explicit \"discard my unsynced changes\", never for a plain sign-out.\n async deleteLocalData(): Promise<void> {\n try {\n if (this.db) {\n const db = this.db;\n this.db = null;\n db.close();\n await db.delete();\n return;\n }\n // Not currently open — best-effort delete by recomputing this user's db name.\n const tenant = this.storage.getPersistent(Constants.AUTH_TENANT_NAME) || 'default';\n const user = this.authService.currentUser || 'anon';\n const name = `tinspa_offline_${this.hash(this.httpService.apiUrl)}_${this.sanitize(tenant)}_${this.sanitize(user)}`;\n await (await this.loadDexie()).default.delete(name); // Changed: Dexie is a dynamic import now, so the static class reference is gone\n } catch (e) {\n console.warn('Offline data wipe failed', e);\n }\n }\n\n // Added (L2): the ONE place dexie is actually fetched. Cached after the first call, so the network/parse cost is\n // paid once per session and only by an app that genuinely opens the offline store — which is the entire point of\n // the deferral. Kept separate from ensureOpen() because deleteLocalData() needs the namespace (Dexie.delete)\n // without opening a store.\n private async loadDexie(): Promise<typeof import('dexie')> {\n return this.dexie ??= await import('dexie');\n }\n\n // Changed (L2): SYNCHRONOUS -> async. It has to be: the dexie module is now fetched on demand, and there is no\n // honest synchronous way to wait for a dynamic import. The alternative considered and rejected — keep this\n // signature sync and \"preload\" dexie at the entry points — is worse, not cheaper: it turns a compile error into a\n // runtime throw on whichever path someone later reaches without having preloaded.\n //\n // 🔑 `opening` is load-bearing, not tidiness. Every caller now awaits, so two callers can be in flight across the\n // same await; without a shared in-flight promise both would find `this.db` null and each construct a Dexie for\n // the SAME database name — two connections, two `meta` sentinel writes, and a version-change war on the next\n // delete. Sharing the promise restores the \"exactly one store\" invariant the synchronous version had for free.\n // It is cleared on settle so a FAILED open can be retried rather than being cached as a permanent failure.\n private ensureOpen(): Promise<Dexie> {\n if (this.db) return Promise.resolve(this.db);\n if (this.opening) return this.opening;\n this.opening = this.openStore();\n this.opening.catch(() => { }).then(() => { this.opening = null; }); // settle-clear, without swallowing the caller's rejection\n return this.opening;\n }\n\n private async openStore(): Promise<Dexie> {\n const DexieCtor = (await this.loadDexie()).default;\n // Re-check after the await: another caller may have completed an open while this one was loading the module.\n if (this.db) return this.db;\n\n const tenant = this.storage.getPersistent(Constants.AUTH_TENANT_NAME) || 'default';\n const user = this.authService.currentUser || 'anon';\n const name = `tinspa_offline_${this.hash(this.httpService.apiUrl)}_${this.sanitize(tenant)}_${this.sanitize(user)}`;\n\n const db = new DexieCtor(name);\n db.version(1).stores({ reads: '&url, entity', outbox: '++seq, opId, entity, status, clientRef', meta: '&key' });\n this.db = db;\n this.reads = db.table('reads');\n this.outbox = db.table('outbox');\n this.meta = db.table('meta');\n try { navigator.storage?.persist?.(); } catch { }\n this.meta.put({ key: 'sentinel', value: Date.now() }).catch(() => { });\n return db;\n }\n\n // Added: never write an entry that can never be read back. matchRead() is the SOLE read path\n // (datalib.service.ts CallApi), so a url it does not match is unreachable the moment it is stored — the write\n // silently succeeds, consumes the origin's storage quota, and leaves the store LOOKING populated while the UI\n // refuses the view. That is worse than not caching it: it lies to the next person who dumps the store.\n // How it happened (observed on Shift's Loads grid, WS-1): tileClicked REPLACES config.loadAction wholesale, and\n // TableComponent.cachePagedWindow() then writes under the swapped url stamped with the TABLE's entity. Three of\n // the four Loads tiles are same-entity so registerReads registered them; the fourth is `invoices/outstanding/x`,\n // a FOREIGN entity the same-entity guard deliberately skips — so it was written and could never be served, seen\n // offline as the blocking 'No connection' modal sitting on top of its own unreachable cached rows.\n // The fix is the SMALL one on purpose: making it matchable instead would mean this table registering an entity it\n // does not own, under another entity's cacheLookups/cacheRows and with none of that entity's queue semantics —\n // a cross-entity read-caching feature, not a bug fix, and the same crossing registerReads' guard already declined.\n // Guard, not silent tidy: every legitimate writer still passes. handleOfflineRead only calls this after matchRead\n // matched (and cacheKey() only strips paging, which matchRead's own base-url fallback already tolerates);\n // cachePagedWindow/applyRealTimeData write the table's registered url, or a per-parent/tile url a prefix covers.\n // Changed (L2): `async`, because opening the store now awaits a dynamic import. The SIGNATURE is unchanged —\n // it returned a Promise before and returns one now — so both call sites (table.component.ts:1091, :2131, both\n // fire-and-forget) are untouched.\n async putRead(url: string, entity: string, data: any, maxRows: number): Promise<any> {\n if (!this.matchRead(url)) return null;\n await this.ensureOpen();\n let stored = data;\n if (Array.isArray(data)) stored = data.slice(0, url.includes('/list/') ? 1000 : maxRows);\n return this.reads.put({ url, entity, data: stored, savedAt: Date.now() })\n .then(r => { this.pruneDynamicReads(url); return r; }) // Added: keep prefix-matched urls bounded — see below\n .catch(err => console.warn('Offline cache write failed', err));\n }\n\n // Added: a PREFIX-matched url is one of many — one per parent row opened, one per tile view — and nothing\n // evicts the reads table before logout, so keep only the most recent few under each prefix. Explicitly\n // registered urls (the top-level grid, its counts, cached lookups) are never candidates for eviction, and\n // eviction is best-effort: it must never be able to fail a write. Storage per entry is already capped at\n // cacheRows by putRead above, so this bounds the COUNT of entries, which prefix matching is what introduces.\n private static readonly DYNAMIC_READS_PER_PREFIX = 20;\n private async pruneDynamicReads(url: string) {\n try {\n if (this.readUrls.has(url)) return;\n const p = this.readPrefixes.find(x => url.startsWith(x.prefix));\n if (!p) return;\n const rows = await this.reads.where('entity').equals(p.entry.entity).toArray();\n const dynamic = rows\n .filter(r => r.url.startsWith(p.prefix) && !this.readUrls.has(r.url))\n .sort((a, b) => b.savedAt - a.savedAt);\n const stale = dynamic.slice(OfflineService.DYNAMIC_READS_PER_PREFIX);\n if (stale.length) await this.reads.bulkDelete(stale.map(r => r.url));\n } catch { /* eviction is a nicety; a failure here must not surface as a failed cache write */ }\n }\n\n private async getRead(url: string): Promise<CachedRead | undefined> {\n await this.ensureOpen(); // Changed: ensureOpen is async now\n try { return await this.reads.get(url).catch(() => undefined); } catch { return undefined; }\n }\n\n //================ CallApi seam helpers (called by DataServiceLib) ================\n\n // Reads: network-first with write-through; on verified-offline or network failure serve the cached copy.\n handleOfflineRead(action: Action, entry: OfflineEntry, networkCall: () => Observable<ApiResponse>): Observable<ApiResponse> {\n const key = this.cacheKey(action.url); // Changed: paged reads share the base url's single cache entry — see cacheKey\n const paged = this.isPagedRead(action.url);\n\n const serveCache = (): Observable<ApiResponse> => from(this.serveCachedRead(key)).pipe(\n map(result => result\n ? { success: true, message: 'success', data: result }\n : { success: false, message: 'No offline data available yet for this view', data: null })\n );\n if (!this.online) return serveCache();\n return networkCall().pipe(\n tap((response: ApiResponse) => {\n // Changed: a paged response is one CHUNK. An 'append' fetch returns only rows N..N+take, so writing it\n // under the base key would replace the whole cached window with a mid-list slice. TableComponent writes\n // the ACCUMULATED window instead (cachePagedWindow), which is what an offline reader actually needs.\n if (paged) return;\n if (response.success && response?.data) this.putRead(key, entry.entity, response.data, entry.config.cacheRows);\n }),\n catchError((err: any) => {\n if (err?.status === 0) { this.reportNetworkFailure(); return serveCache(); }\n return throwError(() => err);\n })\n );\n }\n\n // For '/list/' lookups, append pending offline creates as selectable 'cref:' options so offline forms can reference not-yet-synced parents\n private async serveCachedRead(url: string): Promise<any | null> {\n const saved = await this.getRead(url);\n let data = saved?.data ?? null;\n const listMatch = url.match(/^([^?/]+)\\/list\\//);\n if (listMatch) {\n const creates = await this.pendingCreates(listMatch[1]);\n if (creates.length) {\n const opts = creates.map(op => ({ name: `${op.payload?.name ?? 'New'} (pending)`, value: 'cref:' + op.clientRef }));\n data = Array.isArray(data) ? [...opts, ...data] : opts;\n }\n }\n return data;\n }\n\n // Persists a mutation and synthesizes a success ApiResponse so the existing dialog/refresh machinery works unchanged\n enqueueOffline(action: Action, data: any, entry: OfflineEntry): Observable<ApiResponse> {\n return from(this.enqueueMutation(action, data, entry)).pipe(\n map(op => ({\n success: true,\n message: 'Saved offline — will be sent when connection is restored',\n data: op ? { ...op.payload, _offline: { status: op.status, opId: op.opId, clientRef: op.clientRef ?? op.targetClientRef } } : data,\n })),\n catchError((err: any) => of({ success: false, message: 'Could not save offline: ' + (err?.message ?? 'storage error'), data: null }))\n );\n }\n\n //================ Outbox writes ================\n\n private async enqueueMutation(action: Action, data: any, entry: OfflineEntry): Promise<OutboxOp | null> {\n await this.ensureOpen(); // Changed: ensureOpen is async now\n const opAction = this.parseAction(action.url);\n if (!opAction) throw new Error('Unsupported offline mutation: ' + action.url);\n\n const payload = { ...data };\n const marker = payload._offline;\n delete payload._offline;\n\n const refMap: { [field: string]: string } = {};\n Object.keys(payload).forEach(k => {\n if (typeof payload[k] === 'string' && payload[k].startsWith('cref:')) { refMap[k] = payload[k].substring(5); payload[k] = 0; }\n });\n\n const userId = this.authService.currentUser || 'anon';\n\n if (opAction === 'edit' && marker?.clientRef) {\n const createOp = await this.outbox.where('clientRef').equals(marker.clientRef).first();\n if (createOp && createOp.status !== 'synced') {\n createOp.payload = { ...createOp.payload, ...payload, clientRef: createOp.clientRef };\n createOp.refMap = { ...createOp.refMap, ...refMap };\n await this.outbox.put(createOp);\n return createOp;\n }\n }\n if (opAction === 'delete' && marker?.clientRef) {\n const createOp = await this.outbox.where('clientRef').equals(marker.clientRef).first();\n if (createOp && createOp.status !== 'synced') { await this.outbox.delete(createOp.seq!); return null; }\n }\n\n const targetId = opAction === 'create' ? undefined : payload[entry.idField];\n if (opAction === 'edit' && targetId !== undefined) {\n const existing = await this.outbox.where('entity').equals(entry.entity)\n .and(op => op.opAction === 'edit' && op.targetId === targetId && (op.status === 'pending' || op.status === 'failed')).first();\n if (existing) {\n existing.payload = payload; existing.refMap = { ...existing.refMap, ...refMap }; existing.status = 'pending';\n await this.outbox.put(existing);\n return existing;\n }\n }\n\n const op: OutboxOp = {\n opId: crypto.randomUUID(), entity: entry.entity, entityName: entry.entityName, url: action.url, opAction, payload, targetId,\n targetClientRef: marker?.clientRef, refMap: Object.keys(refMap).length ? refMap : undefined,\n status: 'pending', attempts: 0, maxAgeHours: entry.config.maxQueueAgeHours, userId, enqueuedAt: Date.now(),\n };\n if (opAction === 'create') { op.clientRef = crypto.randomUUID(); op.payload = { ...payload, clientRef: op.clientRef }; }\n await this.outbox.add(op);\n return op;\n }\n\n //================ Live streams (cross-tab reactive) ================\n\n // Changed (L2): the two liveQuery streams are the only callers that could not simply `await` — they must hand\n // back an Observable synchronously. `defer` moves the open to SUBSCRIPTION time (it used to happen at call time,\n // which for every existing caller is the same instant), and `switchMap` chains the liveQuery behind it.\n // `liveQuery` is itself a VALUE from dexie, so it is read off the loaded namespace rather than a static import;\n // once ensureOpen() has resolved, `this.dexie` is guaranteed non-null.\n pendingOpsFor$(entity: string): Observable<OutboxOp[]> {\n return defer(() => this.ensureOpen()).pipe(\n switchMap(() => from(this.dexie!.liveQuery(() => this.outbox.where('entity').equals(entity).and(op => op.status !== 'synced').sortBy('seq'))))\n );\n }\n\n activeOps$(): Observable<OutboxOp[]> {\n return defer(() => this.ensureOpen()).pipe(\n switchMap(() => from(this.dexie!.liveQuery(() => this.outbox.filter(op => op.status !== 'synced').sortBy('seq'))))\n );\n }\n\n private async pendingCreates(entity: string): Promise<OutboxOp[]> {\n await this.ensureOpen(); // Changed: ensureOpen is async now\n return this.outbox.where('entity').equals(entity).and(op => op.opAction === 'create' && op.status !== 'synced').sortBy('seq');\n }\n\n private async hasPending(): Promise<boolean> {\n await this.ensureOpen(); // Changed: ensureOpen is async now\n return this.outbox.where('status').equals('pending').count().then(c => c > 0);\n }\n\n //================ Connectivity ================\n\n // Started by the sync engine (offline table registered) OR by the toolbar indicator (to show a status light).\n // Uses SignalR's hub connection as the instant online signal when real-time is enabled; ping is the fallback/source of truth.\n ensureConnectivity(): void {\n if (!this.enabled) return; // app-level gate: no pinging/SignalR-watching when offline capability is off\n if (this.connectivityStarted) return;\n this.connectivityStarted = true;\n\n if (typeof window !== 'undefined') {\n window.addEventListener('offline', () => this.zone.run(() => this.setOffline()));\n window.addEventListener('online', () => this.zone.run(() => this.verify()));\n }\n\n // SignalR hub state: connected => instantly online (+drain); disconnected => confirm via ping before declaring offline.\n // When real-time is disabled the hub never connects, so this stays false and ping fully drives connectivity.\n this.signalR.dataHubConnected$.subscribe(connected => this.zone.run(() => connected ? this.setOnline() : this.verify()));\n\n this.verify();\n }\n\n reportNetworkFailure(): void { if (this.connectivityStarted) this.setOffline(); }\n\n // Added: the statuses that mean \"an EDGE answered, but it could not reach the origin\". They are the exact\n // shape of a device resuming from sleep: the gateway/CDN in front of the API is warm and replies instantly,\n // while the origin (or the path to it) is not yet reachable. Treating these as proof of connectivity is what\n // produced the owner's 2026-08-20 report — see verify() below.\n private static readonly GATEWAY_UNREACHABLE_STATUSES = [408, 502, 503, 504];\n\n // Changed: `err.status > 0` no longer means \"we are online\".\n //\n // The old heuristic was `if (err?.status > 0) this.setOnline()`, encoding \"we reached A server, therefore we\n // have connectivity\". That is correct for 401/403/404/500 — an origin that answers at all is an origin that is\n // alive, and the failure is about the request, not the network. It is FALSE for 408/502/503/504, which are\n // precisely what a gateway returns when it CANNOT reach the origin. Those statuses prove the opposite of what\n // the heuristic concluded from them.\n //\n // The cost of that one line was the whole defect. On unlocking a phone, the `online` event fires before the\n // radio genuinely carries traffic; the ping hits the warm edge, gets 504, and the app declared itself ONLINE.\n // setOnline() flips online$, which arms-and-fires TableComponent.setupReconnectRefresh() on every table on the\n // page (table.component.ts:1659-1684) — non-silent GETs, hence the loader the user sees flash — and each of\n // those hits the same unreachable origin, 504s, and raises the \"Taking too long\" modal on the FIRST failure.\n //\n // Worse, it left the page STALE as well as alarmed: the table consumes its arm before fetching\n // (table.component.ts:1667-1668), and because online$ never returned to false nothing ever re-armed, so no\n // second refresh could happen. Keeping online$ HONEST fixes that staleness here, with no change to\n // table.component.ts at all — the arm simply survives until connectivity is genuinely proven.\n //\n // Note the rxjs TimeoutError from timeout(5000) needs no branch: it carries no `status`, so it already failed\n // the `> 0` test and already called setOffline(). Only the gateway statuses were missing.\n private verify(): void {\n this.httpService.Get('ping').pipe(timeout(5000)).subscribe({\n next: () => this.setOnline(),\n error: (err: any) => {\n const status = err?.status ?? 0;\n const reachable = status > 0 && !OfflineService.GATEWAY_UNREACHABLE_STATUSES.includes(status); // Changed: a gateway timeout is NOT connectivity\n if (reachable) this.setOnline(); else this.setOffline();\n },\n });\n }\n\n private setOnline(): void {\n this.stopRecoveryPolling();\n if (!this.online$.value) {\n this.zone.run(() => this.online$.next(true)); // TS-20: re-enter Angular zone only on actual state flip (timer ticks run outside the zone)\n if (this.syncStarted) setTimeout(() => this.zone.run(() => this.drain(true)), Math.floor(Math.random() * 5000)); // TS-20: drain (toasts/emissions) must run in-zone even when triggered from an out-of-zone timer path; jittered so a reconnecting fleet doesn't stampede. Changed: auto=true — a reconnect must not jump a server-stated Retry-After\n }\n // Marry the two: whenever ping confirms we're reachable, revive SignalR if its own auto-reconnect gave up.\n // No-op when the hub is already connected, so this is safe to call on every online confirmation.\n this.signalR.reconnectIfNeeded();\n }\n\n private setOffline(): void {\n if (this.online$.value) this.zone.run(() => this.online$.next(false)); // TS-20: re-enter zone only on actual state flip\n this.startRecoveryPolling();\n }\n\n // Added: the recovery schedule. Was a flat setInterval(verify, 30000).\n //\n // A flat 30s is the wrong shape for the case that actually dominates: a phone waking from sleep, whose radio\n // settles in ONE TO FIVE SECONDS. Under the old timer a user who unlocked their device sat on stale content\n // for up to half a minute after connectivity had genuinely returned — and once verify() started correctly\n // reporting a resume 504 as offline (see above), that half-minute would have become the NEW visible symptom:\n // no false modal, but a Day Book that stubbornly refused to refresh. Fixing verify() without this would have\n // traded one complaint for another.\n //\n // The early steps cover the radio wake; the tail settles back on the original 30s so a genuinely long outage\n // costs exactly what it always did. Deliberately capped rather than growing unboundedly — 30s remains the\n // safety net it always was, and SignalR's own reconnect usually beats it when real-time is on.\n private static readonly RECOVERY_BACKOFF_MS = [1000, 2000, 4000, 8000, 15000, 30000];\n private recoveryStep = 0;\n\n // Changed: a self-rescheduling setTimeout chain rather than setInterval, because the delay now varies per tick.\n // stopRecoveryPolling() clears it identically, and the re-entrancy guard (`if (this.recoveryTimer)`) is kept so\n // repeated setOffline() calls still cannot stack two chains.\n private startRecoveryPolling(): void {\n if (this.recoveryTimer || !this.connectivityStarted) return;\n this.recoveryStep = 0; // a fresh outage always starts fast, however long the previous one ran\n // TS-20: tick outside Angular zone so the recovery ping doesn't trigger a CD cycle every tick; verify()→setOnline/setOffline re-enter the zone only when online state flips\n this.zone.runOutsideAngular(() => this.scheduleRecoveryTick());\n }\n\n private scheduleRecoveryTick(): void {\n const backoff = OfflineService.RECOVERY_BACKOFF_MS;\n const delay = backoff[Math.min(this.recoveryStep, backoff.length - 1)];\n this.recoveryStep++;\n\n // The handle is deliberately LEFT SET across the verify() call below, and that is load-bearing rather than\n // untidy. verify()'s error path calls setOffline() → startRecoveryPolling(), whose only re-entrancy guard is\n // `if (this.recoveryTimer) return`. Clearing the handle first therefore let that call start a SECOND chain\n // (with the backoff step reset to 0), so every failed tick doubled the number of live chains and the ping\n // rate ran away. Caught by resume-reconnect-grace.spec.ts — \"second retry lands ~2s after the first\" saw 4\n // pings where it expected 2. Holding the handle keeps this chain the single owner of recovery polling.\n this.recoveryTimer = setTimeout(() => {\n this.verify();\n // Re-arm only while still offline. A successful verify() calls setOnline() → stopRecoveryPolling(), which\n // clears the handle and resets the step, so the chain ends there rather than resurrecting itself.\n if (!this.online$.value) this.zone.runOutsideAngular(() => this.scheduleRecoveryTick());\n }, delay);\n }\n\n private stopRecoveryPolling(): void {\n if (this.recoveryTimer) { clearTimeout(this.recoveryTimer); this.recoveryTimer = null; } // Changed: clearTimeout — the chain is setTimeout-based now\n this.recoveryStep = 0;\n }\n\n //================ Sync engine ================\n\n private startSync(): void {\n if (this.syncStarted) return;\n this.syncStarted = true;\n this.ensureConnectivity();\n this.resetOrphans().catch(() => { });\n // TS-20: tick outside Angular zone so an idle 60s outbox check doesn't trigger CD; only re-enter (zone.run(drain)) when there is actually pending work to apply\n this.zone.runOutsideAngular(() => {\n this.periodicTimer = setInterval(() => { if (this.online) this.hasPending().then(has => { if (has) this.zone.run(() => this.drain(true)); }); }, 60000); // Changed: auto=true — the 60s sweep must not jump a server-stated Retry-After\n });\n if (this.online) this.drain(true); // Changed: auto=true — sync starting up is the app's decision, not the user's\n }\n\n // Added: reclaim work parked by a previous session. The sync engine otherwise only starts when a page happens\n // to register an offline table, so changes captured before a sign-out sat there until the user wandered back\n // onto the right screen. Called on sign-in: if this user has anything pending, start syncing immediately.\n async resumeQueue(): Promise<void> {\n if (!this.enabled) return;\n try {\n await this.ensureOpen(); // Changed: ensureOpen is async now. The outbox is per-user, so this resolves THIS user's parked work and nobody else's\n if (await this.hasPending()) this.startSync();\n } catch { /* nothing parked, or the store isn't available */ }\n }\n\n // Changed: `auto` marks a drain the APP decided to run (reconnect, the 60s sweep, sync start) as opposed to one\n // the USER asked for. Only automatic drains are held back by a server-stated Retry-After — see retryNotBefore.\n // It defaults to false so every EXTERNAL caller keeps today's behaviour untouched: the sync tray's \"Sync Now\"\n // button (`sync.component.ts:29`) is a deliberate human action, and silently doing nothing when someone presses\n // a button is precisely the quiet-failure shape this codebase keeps getting bitten by.\n async drain(auto: boolean = false): Promise<void> {\n if (this.draining || !this.online) return;\n\n // Added: honouring Retry-After ONLY inside scheduleBackoff was not enough, and a 32-op drain proved it — the\n // retry arrived 9.5s after a 429 that said 20. The backoff timer was armed correctly, but a connectivity flip\n // (SignalR dropping and reconnecting is routine, and each flip schedules its own drain within 5s of coming\n // back) simply ran a drain in front of it. The wait has to bind every automatic entry point, not just the one\n // timer, or the app still hammers a server that told it exactly when to come back.\n //\n // Deliberately fail-open: this is in-memory only, so a reload forgets it — and that is correct, because a\n // reload also forgets the backoff timer, and a gate that outlived its own timer could strand the queue.\n if (auto && Date.now() < this.retryNotBefore) return;\n\n this.draining = true;\n const runner = () => this.drainLoop().finally(() => { this.draining = false; });\n const locks: any = (navigator as any).locks;\n if (locks?.request) {\n try {\n await locks.request('tinspa-outbox-drain', { ifAvailable: true }, async (lock: any) => { if (lock) await runner(); else this.draining = false; });\n } catch { await runner(); }\n } else { await runner(); }\n }\n\n private async drainLoop(): Promise<void> {\n await this.ensureOpen(); // Added (L2): the loop writes this.outbox directly; nextAutoOp opens it anyway, this makes the dependency explicit rather than incidental\n const syncedEntities = new Set<string>();\n while (true) {\n const op = await this.nextAutoOp();\n if (!op) break;\n\n op.status = 'syncing';\n await this.outbox.put(op); // persisted BEFORE network I/O — crash recovery reverts to pending\n\n const outcome = await this.sendOp(op);\n if (outcome === 'transient') {\n op.status = 'pending'; op.attempts++;\n await this.outbox.put(op);\n this.scheduleBackoff(op.attempts, this.serverRetryAfterMs); // Changed: pass the server's own Retry-After, which overrides the attempt-count guess when present\n break; // strict FIFO: a transient failure halts the drain until backoff/reconnect\n }\n if (outcome === 'synced') syncedEntities.add(op.entity);\n if (outcome === 'failed') {\n this.messageService.toast(`Sync failed: ${op.entityName} ${op.opAction} — open the sync tray to review`);\n if (op.clientRef) await this.cascadeFailure(op.clientRef, `${op.entityName} ${op.opAction} failed`);\n }\n if (outcome === 'conflict') this.messageService.toast(`Sync conflict: ${op.entityName} changed on the server — review in the sync tray`);\n }\n if (syncedEntities.size > 0) {\n this.drained$.next(Array.from(syncedEntities));\n this.messageService.toast('Offline changes synced');\n }\n }\n\n private async sendOp(op: OutboxOp): Promise<'transient' | 'synced' | 'failed' | 'conflict'> {\n const payload = { ...op.payload };\n if (op.refMap && Object.keys(op.refMap).length) payload.clientRefs = JSON.stringify(op.refMap); // server resolves parent ClientRef -> real int FK\n\n this.serverRetryAfterMs = null; // Added: cleared BEFORE the I/O, so a wait from a previous op can never leak into this one's backoff\n\n let response: ApiResponse;\n try {\n response = await firstValueFrom(this.httpService.Post(op.url, payload));\n } catch (err: any) {\n const status = err?.status ?? 0;\n if (status === 0 || status === 408 || status === 429 || status >= 500) {\n if (status === 0) this.reportNetworkFailure();\n // Added: the response headers were being thrown away here, and with them the one authoritative number in\n // the whole exchange. A 429 (and a 503) may carry Retry-After — TinWeb's limiter always sends it, computed\n // from the real window, and exposes it cross-origin — which is the server stating when it will stop\n // refusing. Guessing from an attempt count instead means we either come back too early, get refused again\n // and extend the block on a sliding window, or sit idle far longer than we needed to.\n // Parsed by ApiErrorService so there is exactly ONE implementation of the two legal header forms.\n const seconds = this.apiErrorService.retryAfterSeconds(err);\n this.serverRetryAfterMs = seconds > 0 ? seconds * 1000 : null;\n return 'transient';\n }\n return this.finishOp(op, 'failed', err?.message ?? `HTTP ${status}`);\n }\n\n if (response.success) return this.finishOp(op, 'synced');\n\n const reason = response.reason ?? ''; // Changed: reason is now a typed ApiResponse field (shared IConcurrency conflict contract)\n const notFound = reason === 'not_found' || response.message?.includes('not found');\n if (reason === 'conflict') { op.serverRecord = response.data ?? null; return this.finishOp(op, 'conflict', response.message); }\n if (notFound && op.opAction === 'delete') return this.finishOp(op, 'synced'); // delete of already-deleted row — outcome achieved\n if (notFound && op.opAction === 'edit') return this.finishOp(op, 'conflict', 'This record was deleted on the server');\n return this.finishOp(op, 'failed', response.message); // validation/business failure — permanent\n }\n\n private async finishOp(op: OutboxOp, status: 'synced' | 'failed' | 'conflict', error?: string): Promise<'synced' | 'failed' | 'conflict'> {\n op.status = status; op.lastError = error;\n if (status === 'synced') op.syncedAt = Date.now();\n await this.outbox.put(op);\n return status;\n }\n\n private async nextAutoOp(): Promise<OutboxOp | undefined> {\n await this.ensureOpen(); // Changed: ensureOpen is async now\n const ops = await this.outbox.orderBy('seq').filter(op => op.status === 'pending').toArray();\n for (const op of ops) {\n if (Date.now() - op.enqueuedAt > op.maxAgeHours * 3600 * 1000) {\n op.status = 'stale'; op.lastError = 'Held — too old to send automatically';\n await this.outbox.put(op);\n continue;\n }\n return op;\n }\n return undefined;\n }\n\n private async resetOrphans(): Promise<void> {\n await this.ensureOpen(); // Changed: ensureOpen is async now\n const orphans = await this.outbox.where('status').equals('syncing').toArray();\n for (const op of orphans) { op.status = 'pending'; await this.outbox.put(op); } // safe: opId/ClientRef idempotency makes resend collide, not duplicate\n const cutoff = Date.now() - 24 * 3600 * 1000;\n await this.outbox.where('status').equals('synced').and(op => (op.syncedAt ?? 0) < cutoff).delete();\n }\n\n private async cascadeFailure(clientRef: string, reason: string): Promise<void> {\n await this.ensureOpen(); // Changed: ensureOpen is async now\n const dependents = await this.outbox.filter(op => op.status === 'pending' && !!op.refMap && Object.values(op.refMap).includes(clientRef)).toArray();\n for (const op of dependents) { op.status = 'failed'; op.lastError = 'Blocked: ' + reason; await this.outbox.put(op); }\n }\n\n // Changed: takes the server's stated Retry-After (ms, null when it said nothing) and OVERRIDES the computed\n // backoff with it. Full jitter is right when we are guessing — it spreads a thundering herd across a window we\n // invented — but it is wrong once the server has told us the answer, because `random * cap` can return almost\n // zero and send us straight back into a limiter that has not reset. When Retry-After is present we wait the\n // whole of it, and jitter only the ADDITIONAL second, which keeps clients from returning in lockstep without\n // ever returning early.\n //\n // Clamped to an hour to match the clamp TinWeb applies to the header it sends, so a broken proxy inventing a\n // Retry-After of a year cannot strand the outbox. A stated wait LONGER than the old 5-minute cap is honoured\n // rather than capped at 5 minutes: coming back before the server said to only earns another refusal.\n private scheduleBackoff(attempts: number, serverRetryAfterMs: number | null = null): void {\n if (this.backoffTimer) clearTimeout(this.backoffTimer);\n\n let delay: number;\n if (serverRetryAfterMs && serverRetryAfterMs > 0) {\n delay = Math.min(serverRetryAfterMs, 3600000) + Math.floor(Math.random() * 1000); // obey the server, plus <=1s of de-sync jitter\n this.retryNotBefore = Date.now() + delay; // Added: binds the reconnect and periodic drains too, not just this timer\n } else {\n const cap = Math.min(5000 * Math.pow(2, attempts), 300000); // exponential 5s·2^n capped 5min, full jitter\n delay = Math.floor(Math.random() * cap);\n this.retryNotBefore = 0; // a guessed backoff never blocks another trigger — only a server instruction does\n }\n\n // This timer IS the scheduled resume, so it lifts its own gate rather than being held by it — a millisecond of\n // timer skew must not turn the wait into a permanent stall.\n this.backoffTimer = setTimeout(() => { this.retryNotBefore = 0; this.drain(); }, delay);\n }\n\n //================ Sync-tray actions ================\n\n async retryOp(opId: string): Promise<void> {\n const op = await this.getOp(opId);\n if (!op) return;\n op.status = 'pending'; op.attempts = 0; op.enqueuedAt = Date.now(); this.retryNotBefore = 0; // Added: a deliberate user retry clears any server-stated wait, exactly as it clears attempts\n await this.outbox.put(op);\n this.drain();\n }\n\n async discardOp(opId: string): Promise<any> { await this.ensureOpen(); return this.outbox.where('opId').equals(opId).delete(); } // Changed: async — the Promise<any> signature is unchanged for sync.component.ts:57\n\n // keepMine re-arms the op with the fresh server RowVersion (explicit, informed overwrite); keepServer discards\n async resolveConflict(opId: string, choice: 'keepServer' | 'keepMine'): Promise<void> {\n const op = await this.getOp(opId);\n if (!op) return;\n if (choice === 'keepServer') { await this.discardOp(opId); return; }\n if (op.serverRecord?.rowVersion) op.payload = { ...op.payload, rowVersion: op.serverRecord.rowVersion };\n else delete op.payload.rowVersion;\n op.status = 'pending'; op.attempts = 0; op.enqueuedAt = Date.now(); this.retryNotBefore = 0; // Added: same as retryOp — an informed, explicit choice is not an automatic drain\n await this.outbox.put(op);\n this.drain();\n }\n\n private async getOp(opId: string): Promise<OutboxOp | undefined> { await this.ensureOpen(); return this.outbox.where('opId').equals(opId).first(); } // Changed: ensureOpen is async now\n\n //================ helpers ================\n\n private parseAction(url: string): 'create' | 'edit' | 'delete' | null {\n if (url.includes('?action=create')) return 'create';\n if (url.includes('?action=edit')) return 'edit';\n if (url.includes('?action=delete')) return 'delete';\n return null;\n }\n private hash(v: string): string { let h = 0; for (let i = 0; i < v.length; i++) h = ((h << 5) - h + v.charCodeAt(i)) | 0; return Math.abs(h).toString(36); }\n private sanitize(v: string): string { return v.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase(); }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { DataServiceLib } from './datalib.service';\nimport { ApiResponse } from '../classes/Classes';\n\n// Added: the app-wide App Configuration record, loaded once and shared. Apps used to each solve this\n// themselves — Shift kept a copy in localStorage that went stale the moment anyone saved on another\n// device, and Grip had no frontend access to its own config at all. Anything that needs a config flag\n// (nav gating, unit suffixes, module-dependent columns) subscribes to config$; spa-app-configuration\n// refreshes it after every save, so a saved change reaches those subscribers immediately.\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfigService {\n\n private config = new BehaviorSubject<any>({});\n config$ = this.config.asObservable();\n\n get value(): any {\n return this.config.value;\n }\n\n private loaded = false;\n\n // Added: one attempt at a time. Two callers racing on login used to be harmless only because the latch below\n // swallowed the second; with the latch corrected they would both hit the wire, so dedupe explicitly instead.\n private inFlight = false;\n\n // Added: the bound. Retrying is CALLER-DRIVEN — there is no timer and no resubscribe here, so a retry only\n // ever happens because something asked again. This cap stops a chatty caller (a component that loads on every\n // navigation) from turning a genuinely down API into one request per navigation, forever.\n private failedAttempts = 0;\n private static readonly maxFailedAttempts = 3;\n\n constructor(private dataService: DataServiceLib) { }\n\n // Called on login/bootstrap — the backend creates the row on first read, so this never comes back empty\n load(force = false) {\n // Changed: `loaded` was set HERE, before the request, and every failure was swallowed — so the FIRST attempt\n // won the session outright. shift-spa fired one on the login screen (AuthService seeds currentRoleSource with\n // a truthy `new Role`, and a BehaviorSubject replays its seed synchronously), it 401'd with an empty bearer\n // token, and every later authenticated caller returned early forever. The app then ran on an empty config —\n // every flag false, ~70 call sites — while the database said otherwise. Only a page reload masked it, which\n // is why it survived: silent-restore replays the 401'd request, a fresh interactive login does not.\n if (force) this.failedAttempts = 0; // an explicit refresh is a deliberate act (the App Configuration page just saved), so it is allowed past the cap\n if (this.loaded && !force) return;\n if (this.inFlight && !force) return;\n if (this.failedAttempts >= ConfigService.maxFailedAttempts && !force) return;\n this.inFlight = true;\n this.dataService.CallApi({ url: 'configuration/get', skipCache: true }).subscribe({\n next: (apiResponse: ApiResponse) => {\n this.inFlight = false;\n // DELIBERATELY SILENT (WS-6 Phase 4 triage). This runs on login/bootstrap, before the user has asked\n // for anything, and greeting someone with an error dialog the instant they sign in, for an app that then\n // works, is a worse lie than saying nothing. The error callback below absorbs the transport case likewise.\n // Changed: the old comment claimed everything downstream FAILS OPEN. It does not. Config flags are read as\n // `!!config.enableX` and the database defaults are TRUE, so an empty config reads FALSE and HIDES things —\n // fail-CLOSED. Staying silent is still right; latching the failure was not. Retry stays possible instead.\n if (apiResponse.success) {\n this.loaded = true; // Changed: only a response that actually carried a config counts as loaded\n this.failedAttempts = 0;\n this.config.next(apiResponse.data || {});\n }\n else this.failedAttempts++; // Added: a refusal (401/403 shaped as success:false) is a failure, not a loaded config\n },\n error: () => {\n // an app without a ConfigurationController simply keeps the empty object — and after maxFailedAttempts\n // stops asking, so the 404 costs three requests a session rather than one, and never more\n this.inFlight = false;\n this.failedAttempts++;\n }\n });\n }\n\n refresh() {\n this.load(true);\n }\n\n // Added: the session-end reset. The record this service holds is TENANT-SCOPED (configuration/get returns the\n // signed-in tenant's App Configuration row) and the service is a root singleton, so without this the `loaded`\n // latch survived logout and the NEXT user in the same shell — a different tenant on a shared device — read\n // tenant A's flags: unit suffixes, module gating, the ~70 `dataService.configuration.x` call sites in shift-spa.\n // Nothing logged-out reads this service (every consumer is a post-auth surface, and shift-spa deliberately gates\n // the fetch on `role?.roleID > 0`), so clearing at the session boundary costs nothing and there is no logged-out\n // need to preserve. `failedAttempts` is reset too: three failures at the end of a dying session must not carry\n // over and suppress the next user's genuine fetch. Called from AuthService.clearSession — see the guard spec.\n clear() {\n this.loaded = false;\n this.inFlight = false;\n this.failedAttempts = 0;\n this.config.next({});\n }\n}\n","// import { Core } from 'tin-core';\nimport { Injectable } from \"@angular/core\";\nimport { Core } from '../classes/TinCore';\nimport { LogLevel } from \"../classes/LibClasses\";\nimport { redactSecrets } from \"./log-redact\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class LogService {\n constructor() { }\n\n level: LogLevel = LogLevel.All;\n\n logToConsole: boolean = true;\n\n logToApi: boolean = false;\n\n debug(msg: string, ...optionalParams: any[]) {\n this.writeToLog(msg, LogLevel.Debug, optionalParams);\n }\n\n info(msg: string, ...optionalParams: any[]) {\n this.writeToLog(msg, LogLevel.Info, optionalParams);\n }\n\n warn(msg: string, ...optionalParams: any[]) {\n this.writeToLog(msg, LogLevel.Warn, optionalParams);\n }\n\n error(msg: string, ...optionalParams: any[]) {\n this.writeToLog(msg, LogLevel.Error, optionalParams);\n }\n\n fatal(msg: string, ...optionalParams: any[]) {\n this.writeToLog(msg, LogLevel.Fatal, optionalParams);\n }\n\n log(msg: string, ...optionalParams: any[]) {\n this.writeToLog(msg, LogLevel.All, optionalParams);\n\n }\n\n private writeToLog(msg: string, level: LogLevel, params: any[]) {\n\n if (this.shouldLog(level)) {\n\n // Build log string\n let value: string = Core.getFormatedDate(Date(), false).replace(\"T\", \" \");\n // value += \" - Type: \" + LogLevel[this.level];\n value += \" - Message: \" + msg;\n\n\n if (params.length) {\n value += \" - Extra Info: \" + this.formatParams(params);\n }\n\n // Log the value\n if (this.logToConsole) {\n console.log(redactSecrets(value)); // Changed (security 2026-08-31): this is the library's general-purpose logger and callers pass arbitrary params, which formatParams() JSON-stringifies into the line. Redacted before it reaches the console.\n }\n\n if (this.logToApi) {\n //Call API post\n }\n\n }\n }\n\n private formatParams(params: any[]): string {\n\n let ret: string = params.join(\",\");\n // Is there at least one object in the array?\n if (params.some((p) => typeof p == \"object\")) {\n ret = \"\";\n // Build comma-delimited string\n for (let item of params) {\n ret += JSON.stringify(item) + \",\";\n }\n }\n return ret;\n }\n\n private shouldLog(level: LogLevel): boolean {\n\n let ret: boolean = false;\n\n if (\n (level >= this.level && level !== LogLevel.Off) ||\n this.level === LogLevel.All\n ) {\n ret = true;\n }\n\n return ret;\n }\n}\n\n\n\n","import { MessageService } from './message.service';\nimport { Injectable, Injector } from '@angular/core';\nimport { OfflineService } from './offline.service'; // Changed: type-only use via lazy Injector to clear cached data on logout (avoids circular DI)\nimport { DataServiceLib } from './datalib.service'; // Added: type-only use via lazy Injector to clear the list cache on session end (avoids circular DI)\nimport { ConfigService } from './config.service'; // Added: type-only use via lazy Injector to clear the tenant-scoped app config on session end (avoids circular DI)\n\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\nimport { StorageService } from './storage.service';\nimport { LogService } from './log.service';\nimport { Constants } from '../classes/Classes';\nimport { HttpService } from './http.service';\nimport { SocialAuthService, SocialUser } from '@abacritt/angularx-social-login';\nimport { Role } from '../classes/LibClasses';\n\n// Changed: FOUR-state refresh outcome — 'rejected' means the server explicitly refused the token (safe to clear),\n// 'network' means the request never got an answer (token may still be valid — keep it and retry later)\n// Changed: 'absent' added — there was no token to send, so no request was made and NOTHING was learned about the\n// session. It was previously reported as 'rejected', which claims the server revoked the token; that claim ended\n// sessions the server had never said a word about. Same bug class the 'network' state exists for, one state short.\nexport type RefreshResult = 'success' | 'rejected' | 'network' | 'absent';\nimport { SignalRService } from './signalr.service'; // Changed: Added for stopping SignalR connection on logout\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class AuthService {\n\n private googleAuthInitialized = false;\n private refreshPromise: Promise<RefreshResult> | null = null; // Changed: shared in-flight refresh — concurrent callers await the same result instead of getting a false failure\n private refreshTimer: any = null; // Changed: Proactive token refresh timer\n\n private socialUserSource = new BehaviorSubject<SocialUser | null>(null);\n public socialUserObserv = this.socialUserSource.asObservable();\n\n constructor(private _route: ActivatedRoute, private socialService: SocialAuthService, private storage: StorageService, public router: Router, private httpService: HttpService, private messageService: MessageService, private logService: LogService, private signalRService: SignalRService, private injector: Injector) { // Changed: Added SignalRService + Injector (Injector used to lazily reach OfflineService without circular DI)\n\n this.initializeGoogleAuth();\n this.initVisibilityRefresh(); // Changed: Refresh token when tab becomes visible after being hidden\n }\n\n\n private initializeGoogleAuth() {\n if (this.googleAuthInitialized) {\n return;\n }\n this.googleAuthInitialized = true;\n\n\n this.socialService.authState.subscribe({\n next: (socialUser: SocialUser) => {\n this.socialUserSource.next(socialUser);\n },\n error: (error) => {\n\n console.debug('Google Sign-In initialization error (expected if not using Google auth):', error?.message);\n }\n });\n }\n\n // Changed: Enhanced clearSession with optional server-side revocation\n clearSession(revokeOnServer: boolean = false) {\n if (revokeOnServer) {\n // Changed: Revoke only this device's refresh token — other devices keep their sessions\n const refreshToken = this.storage.getPersistent(Constants.AUTH_REFRESH_TOKEN);\n if (refreshToken) {\n this.httpService.Post('User/revoke', { refreshToken }).subscribe({\n error: () => {} // Silently ignore errors during logout\n });\n }\n\n // Changed: on explicit logout, wipe the offline CACHE so a shared device retains no prior-user records —\n // but keep the outbox. Those are the user's own unsynced changes; deleting them here destroyed work\n // (potentially a full day offline) with no warning. The IndexedDB is per-user, so the queue is invisible\n // to anyone else and drains when its owner signs back in.\n // Resolved lazily to avoid a circular dependency with OfflineService.\n try { this.injector.get(OfflineService).clearCacheKeepOutbox(); } catch { /* offline layer not in use */ }\n }\n\n if (this.refreshTimer) { clearTimeout(this.refreshTimer); this.refreshTimer = null; } // Changed: Cancel proactive refresh timer\n this.signalRService.stopConnection(); // Changed: Stop consolidated SignalR connection before clearing session\n this.Updateloggedin(false);\n this.UpdateAutoLogin(false);\n this.UpdateRole(new Role());\n this.UpdateToken(''); // Changed: Clear in-memory token\n // Added: drop the DataService */list/* response cache on EVERY session end, not just explicit logout.\n // The cache has a 5-minute life and survives a session boundary, so user #2 signing into the same shell\n // could be served user #1's lists with no HTTP call at all. sessionExpired() is the same cross-user path\n // as logoff(), so this is deliberately OUTSIDE the revokeOnServer branch.\n // Resolved lazily to avoid a circular dependency — DataServiceLib injects AuthService.\n try { this.injector.get(DataServiceLib).ClearCache(); } catch { /* data layer not in use */ }\n // Added: drop the shared App Configuration record on EVERY session end, for the same reason and on the same\n // path as the list cache above. ConfigService is a root singleton holding a TENANT-SCOPED record behind a\n // `loaded` latch, so user #2 signing into the same shell was handed user #1's tenant's flags and never issued\n // a fetch at all. Nothing logged-out reads it, so there is no state worth preserving across the boundary.\n // Resolved lazily to avoid a circular dependency — ConfigService injects DataServiceLib, which injects this.\n try { this.injector.get(ConfigService).clear(); } catch { /* config layer not in use */ }\n this.UpdateTokenExpire(''); // Changed: Clear in-memory token expiry\n this.UpdateAuthType(''); // Added: back to UNKNOWN, so the next user on a shared device is never gated by the previous user's auth type. Storage is wiped by the clearAll/clearSessionData below\n\n if (revokeOnServer) {\n this.storage.clearAll(); // Changed: Full logout clears everything including refresh token\n } else {\n this.storage.clearSessionData(); // Changed: Session expired — preserve refresh token for \"remember me\"\n }\n\n this.socialService.signOut();\n\n }\n\n sessionExpired(){\n\n this.clearSession(false) // Changed: Don't revoke on server, token just expired\n\n // Changed: the path came from url.hash, which is EMPTY under HTML5 routing — every current app runs\n // HTML5 routing, so the redirect target was always blank and the sign-back-in landed on the default page\n // instead of the page the user was on. router.url is the in-app path under either routing mode.\n let path = this.router.url.startsWith('/') ? this.router.url.substring(1) : this.router.url;\n if (path.startsWith('login')) path = ''; // never bounce back into the login page itself\n\n this.router.navigate([\"login\"], {\n relativeTo: this._route,\n queryParams: path ? { redirectTo: path } : {}, // Changed: an empty redirectTo must be ABSENT, not present-and-blank — a blank param overrides the saved last-route with nothing\n queryParamsHandling: 'merge',\n skipLocationChange: false\n });\n\n }\n\n logoff() {\n this.clearSession(true) // Changed: Revoke refresh tokens on explicit logout\n\n this.router.navigate([\"login\"]);\n }\n\n //Logged in\n private loggedin: boolean = false;\n private loggedinSource = new BehaviorSubject(this.loggedin);\n public loggedinObserv = this.loggedinSource.asObservable();\n Updateloggedin(loggedin: boolean) {\n this.loggedinSource.next(loggedin);\n this.loggedin = loggedin;\n }\n\n //autoLogin\n private autoLogin: boolean = false;\n private autoLoginSource = new BehaviorSubject(this.autoLogin);\n public autoLoginObserv = this.autoLoginSource.asObservable();\n UpdateAutoLogin(autoLogin: boolean) {\n this.autoLoginSource.next(autoLogin);\n this.autoLogin = autoLogin;\n }\n\n\n //Token\n private token: string = \"\";\n public tokenSource = new BehaviorSubject(this.token);\n public tokenObserv = this.tokenSource.asObservable();\n UpdateToken(newToken: string) {\n this.tokenSource.next(newToken);\n\n }\n\n //TokenExpire\n private tokenExpire: string = \"\";\n public tokenExpireSource = new BehaviorSubject(this.tokenExpire);\n public tokenExpireObserv = this.tokenExpireSource.asObservable();\n UpdateTokenExpire(newTokenExpire: string) {\n this.tokenExpireSource.next(newTokenExpire);\n\n }\n\n //Current User\n public currentUser: string = \"tnyagato\";\n private currentUserSource = new BehaviorSubject(this.currentUser);\n public currentUserObserv = this.currentUserSource.asObservable();\n UpdateCurrentUser(newUser: string) {\n this.currentUserSource.next(newUser.toLocaleLowerCase());\n this.currentUser = newUser.toLocaleLowerCase();\n }\n\n //Line Manager\n private islineManager: boolean = false;\n private isLineManagerSource = new BehaviorSubject(this.islineManager);\n public isLineManagerObserv = this.isLineManagerSource.asObservable();\n UpdateIsLineManager(manager: boolean) {\n this.isLineManagerSource.next(manager);\n }\n\n //Roles\n private currentRole = new Role;\n public currentRoleSource = new BehaviorSubject(this.currentRole);\n public myRoleObserv = this.currentRoleSource.asObservable();\n UpdateRole(role) {\n this.currentRoleSource.next(role);\n }\n\n //Logged in display name — \"First Last\" where a surname exists, otherwise the first name alone (was first-name-only before the surname reached the payload)\n private loggedUserSource = new BehaviorSubject(\"tnyagato\");\n public loggedUserFullName = this.loggedUserSource.asObservable();\n updateLoggedUserFullName(userName: string) {\n this.loggedUserSource.next(userName);\n }\n\n //TenantName\n private tenantNameSource = new BehaviorSubject(\"Tenant Name\");\n public tenantNameObserv = this.tenantNameSource.asObservable();\n updateTenantName(tenantName: string) {\n this.tenantNameSource.next(tenantName);\n }\n\n // Added: AuthType of the signed-in user. The server already returns it on login, social login AND refresh\n // (UserController.cs:622, 780, 1026) — it was simply discarded. Empty string means UNKNOWN, which is not the\n // same as non-local: see isLocalAuth below.\n public currentAuthType: string = \"\";\n private authTypeSource = new BehaviorSubject(this.currentAuthType);\n public authTypeObserv = this.authTypeSource.asObservable();\n UpdateAuthType(authType: string) {\n this.currentAuthType = authType ?? \"\";\n this.authTypeSource.next(this.currentAuthType);\n }\n\n // Added: FAILS OPEN, and that direction is deliberate. This gates surfaces that are only meaningful for\n // password-backed accounts, so the two possible mistakes are not symmetric: showing password rules to an AD\n // user is cosmetic, while HIDING them from a local user who must invent a password that will then be refused\n // is a real block. So only a POSITIVELY KNOWN non-local type suppresses anything — an unknown type (a session\n // restored from storage written before this key existed, or a server that omits the field) still shows.\n // Compared case-insensitively because UserService.CanonicalAuthType (UserService.cs:52) only normalises the\n // spelling on WRITE; rows stored before it landed can still read \"Local\".\n isLocalAuth(): boolean {\n return !this.currentAuthType || this.currentAuthType.toLowerCase() === 'local';\n }\n\n\n //Authorisation\n isAuthorised(capName: string): boolean {\n\n if (!this.currentRoleSource.value[capName]) {\n // this.logService.info(`authorise: ${this.currentRoleSource.value.roleName} not authorised for ${capName}`);\n this.router.navigate([\"home\"]);\n this.messageService.toast(`Unauthorised: ${capName}`);\n\n return false;\n } else {\n return true;\n }\n\n }\n\n // Changed: Pure validation — no side effects. Callers handle refresh/redirect.\n isValidToken(): boolean {\n let tokenExpire: Date = new Date(this.tokenExpireSource.value);\n let nowDate: Date = new Date();\n return tokenExpire > nowDate;\n }\n\n // Changed: Centralized handler for storing all auth data from login/refresh response\n applyLoginResponse(data: any, rememberMe: boolean) {\n // Set storage mode: sessionStorage when not remembered, localStorage when remembered\n this.storage.setSessionMode(!rememberMe);\n\n // Store remember-me flag persistently (survives browser close)\n this.storage.storePersistent(Constants.AUTH_REMEMBER_ME, rememberMe);\n\n // Update in-memory state\n this.Updateloggedin(true);\n this.UpdateToken(data.token);\n this.UpdateTokenExpire(data.expiration);\n this.signalRService.updateToken(data.token); // Changed: Keep SignalR reconnection token in sync\n\n // Added: a session becoming active reclaims any work this user parked before signing out, without waiting\n // for them to open a page that registers an offline table. Lazy injection avoids a circular dependency.\n try { this.injector.get(OfflineService).resumeQueue(); } catch { /* offline layer not in use */ }\n if (data.role) this.UpdateRole(data.role); // Changed: guarded like userName/authType below — the change-password re-issue payload carries ONLY the token pair, and an unguarded write would blank the live role\n // Added: the login/signup/refresh payloads now carry lastName, so the stored display name is a REAL full name.\n // The monogram derives initial+surname from it (JS), matching the audit/table columns; a payload with no\n // surname still yields the first name alone, which is exactly the previous behaviour.\n const displayName = data.lastName ? `${data.firstName} ${data.lastName}`.trim() : data.firstName;\n if (data.firstName) this.updateLoggedUserFullName(displayName); // Changed: same reason — a payload that omits the field must leave the known value alone\n if (data.tenantName) this.updateTenantName(data.tenantName); // Changed: same reason\n if (data.userName) this.UpdateCurrentUser(data.userName); // Changed: Restore username after silent refresh\n if (data.authType) this.UpdateAuthType(data.authType); // Added: this method is the ONLY place login and silentRefresh both land, so persisting here covers both paths at once. Guarded like userName above — a response that omits the field must leave the known value alone, never overwrite it with empty\n\n // Store session data in active storage\n this.storage.store(Constants.AUTH_TOKEN, data.token);\n this.storage.store(Constants.AUTH_TOKEN_EXPIRE, data.expiration);\n if (data.role) this.storage.store(Constants.AUTH_ROLES, JSON.stringify(data.role)); // Changed: guarded — never persist an absent role over a good one\n if (data.firstName) this.storage.store(Constants.AUTH_NAME, displayName); // Changed: persists the same full display name the in-memory subject now carries, so a reload keeps the two-initial monogram\n if (data.tenantName) this.storage.store(Constants.AUTH_TENANT_NAME, data.tenantName); // Changed: guarded\n if (data.userName) this.storage.store(Constants.AUTH_USER, data.userName); // Changed: Persist username so checkAuthentication finds AUTH_USER after app restart\n if (data.authType) this.storage.store(Constants.AUTH_TYPE, data.authType); // Added: survives a reload, so a direct-URL landing on a password surface knows the auth type before any request goes out\n\n // Store refresh token persistently if provided (always in localStorage)\n if (data.refreshToken) {\n this.storage.storePersistent(Constants.AUTH_REFRESH_TOKEN, data.refreshToken);\n this.storage.storePersistent(Constants.AUTH_REFRESH_TOKEN_EXPIRE, data.refreshTokenExpiry);\n }\n\n this.scheduleTokenRefresh(data.expiration); // Changed: Schedule proactive refresh before token expires\n }\n\n // Changed: Schedule a silent refresh 5 minutes before the access token expires\n private scheduleTokenRefresh(expiration: string) {\n if (this.refreshTimer) clearTimeout(this.refreshTimer); // Clear any existing timer\n\n const expiresAt = new Date(expiration).getTime();\n const now = Date.now();\n const refreshIn = expiresAt - now - (5 * 60 * 1000); // 5 minutes before expiry\n\n if (refreshIn <= 0) return; // Token already expired or about to — reactive refresh will handle it\n\n this.refreshTimer = setTimeout(() => {\n this.silentRefresh().then(result => {\n // Changed: only a server rejection ends the session; a network blip retries in 2 minutes\n if (result === 'rejected') this.sessionExpired();\n else if (result === 'network') this.scheduleRetry();\n });\n }, refreshIn);\n }\n\n // Changed: retry a failed proactive refresh after a network error, while the access token may still be alive\n private scheduleRetry() {\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n this.refreshTimer = setTimeout(() => {\n this.silentRefresh().then(result => {\n if (result === 'rejected') this.sessionExpired();\n else if (result === 'network') this.scheduleRetry();\n });\n }, 2 * 60 * 1000);\n }\n\n // Changed: When tab becomes visible, check if token needs immediate refresh\n private initVisibilityRefresh() {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState !== 'visible') return;\n if (!this.loggedin) return;\n\n const expire = this.tokenExpireSource.value;\n if (!expire) return;\n\n const expiresAt = new Date(expire).getTime();\n const now = Date.now();\n const minutesLeft = (expiresAt - now) / 60000;\n\n // If token expires in less than 10 minutes or is already expired, refresh immediately\n if (minutesLeft < 10 && this.hasRefreshToken()) {\n this.silentRefresh().then(result => {\n // Changed: quiet redirect only on explicit server rejection — network errors keep the session and retry\n if (result === 'rejected') this.sessionExpired();\n else if (result === 'network') this.scheduleRetry();\n });\n }\n });\n }\n\n // Changed: Non-destructive check — only returns true if token is genuinely valid (not expired)\n hasValidSession(): boolean {\n // Check in-memory state first\n if (this.loggedin && this.tokenExpireSource.value) {\n const tokenExpire = new Date(this.tokenExpireSource.value);\n if (tokenExpire > new Date()) return true;\n }\n\n // Changed: Check localStorage for non-expired token (not just existence)\n const localExpiry = localStorage.getItem(Constants.AUTH_TOKEN_EXPIRE);\n if (localExpiry) {\n try {\n const expiry = new Date(JSON.parse(unescape(atob(localExpiry))));\n if (expiry > new Date()) return true;\n } catch { /* ignore parse errors */ }\n }\n\n // Changed: Check sessionStorage for non-expired token\n const sessionExpiry = sessionStorage.getItem(Constants.AUTH_TOKEN_EXPIRE);\n if (sessionExpiry) {\n try {\n const expiry = new Date(JSON.parse(unescape(atob(sessionExpiry))));\n if (expiry > new Date()) return true;\n } catch { /* ignore parse errors */ }\n }\n\n // Changed: Refresh token alone does NOT count as valid session — caller must handle refresh separately\n return false;\n }\n\n // Changed: Check if a refresh token exists (for login page to attempt silent refresh)\n hasRefreshToken(): boolean {\n const refreshToken = this.storage.getPersistent(Constants.AUTH_REFRESH_TOKEN);\n return refreshToken !== null;\n }\n\n // Shared entry point for any page that needs to auto-redirect authenticated users\n // Returns true if session is active or was successfully restored via silent refresh\n async tryRestoreSession(): Promise<boolean> {\n if (this.hasValidSession()) return true;\n if (this.hasRefreshToken()) return (await this.silentRefresh()) === 'success'; // Changed: silentRefresh now returns a tri-state result\n return false;\n }\n\n // Changed: Silently refresh the JWT using the stored refresh token.\n // Returns a shared promise — concurrent callers await the SAME in-flight refresh instead of\n // being told it failed (the old boolean guard caused spurious logouts when guard/visibility/timer overlapped).\n silentRefresh(): Promise<RefreshResult> {\n if (this.refreshPromise) return this.refreshPromise;\n\n const refreshToken = this.storage.getPersistent(Constants.AUTH_REFRESH_TOKEN);\n // Changed: was `return Promise.resolve('rejected')`. No request goes out on this path, so the server has\n // asserted nothing — reporting the interceptor's \"the refresh endpoint answered success:false\" outcome for it\n // made a purely LOCAL absence end a session. 'absent' says exactly what happened and nothing more. The token\n // is not cleared (there is none) and, unlike 'network', there is nothing to retry.\n if (!refreshToken) return Promise.resolve('absent');\n\n // Added (security): refuse to POST the refresh token before the app has configured its API base URL.\n // Reading httpService.apiUrl unconfigured now throws, and that throw would surface here as an unhandled\n // navigation error; more importantly, this is the exact seam where a credential could be sent to the\n // wrong host. 'network' is the correct tri-state: the token is NOT cleared, so a correctly-ordered\n // retry still works. The console.error is deliberate — this is a wiring bug and must not be silent.\n if (!this.httpService.apiUrlConfigured) {\n console.error(\"tin-spa: silent refresh SKIPPED — HttpService.apiUrl is not configured yet. The refresh token was NOT sent. The app must configure apiUrl before any session restore runs.\");\n return Promise.resolve('network');\n }\n\n this.refreshPromise = new Promise<RefreshResult>((resolve) => {\n this.httpService.Post('User/refresh', { refreshToken }).subscribe({\n next: (response: any) => {\n if (response.success) {\n const rememberMe = this.storage.getPersistent(Constants.AUTH_REMEMBER_ME) ?? true;\n this.applyLoginResponse(response.data, rememberMe);\n resolve('success');\n } else {\n // Changed: Server explicitly rejected the token (revoked/expired) — safe to clear\n const currentToken = this.storage.getPersistent(Constants.AUTH_REFRESH_TOKEN);\n if (currentToken === refreshToken) {\n this.storage.removePersistent(Constants.AUTH_REFRESH_TOKEN);\n this.storage.removePersistent(Constants.AUTH_REFRESH_TOKEN_EXPIRE);\n this.storage.removePersistent(Constants.AUTH_REMEMBER_ME);\n }\n resolve('rejected');\n }\n },\n error: () => {\n // Changed: Network error (device waking up, backend briefly down) — do NOT clear the refresh token.\n // The token may still be valid; next visibility change or 401 interceptor will retry.\n resolve('network');\n }\n });\n }).finally(() => { this.refreshPromise = null; }) as Promise<RefreshResult>;\n\n return this.refreshPromise;\n }\n\n\n // Changed: Returns Promise<boolean> to properly await refresh instead of optimistically returning true\n checkAuthentication(): Promise<boolean> {\n\n if (this.loggedin && this.isValidToken()) {\n return Promise.resolve(true);\n }\n\n // Changed: Restore storage mode from persistent remember-me flag\n const rememberMe = this.storage.getPersistent(Constants.AUTH_REMEMBER_ME);\n if (rememberMe !== null) {\n this.storage.setSessionMode(!rememberMe);\n }\n\n if (this.storage.hasKey(Constants.AUTH_USER)) {\n\n this.Updateloggedin(true);\n\n this.storage.get(Constants.AUTH_USER).then((resp: any) => {\n this.UpdateCurrentUser(resp);\n // Added: only now is the username known, and the offline store is keyed by it — so this is the earliest\n // point a restored session can reclaim its own parked work. Doing it before this resolves would open the\n // wrong (placeholder-named) store and silently find nothing to sync.\n try { this.injector.get(OfflineService).resumeQueue(); } catch { /* offline layer not in use */ }\n });\n\n this.storage.get(Constants.AUTH_NAME).then((resp: any) => {\n this.updateLoggedUserFullName(resp);\n });\n\n this.storage.get(Constants.AUTH_ROLES).then((resp) => {\n let ret = JSON.parse(resp);\n\n this.UpdateRole(ret);\n });\n\n this.storage.get(Constants.AUTH_TENANT_NAME).then((resp: any) => {\n this.updateTenantName(resp);\n });\n\n // Added: restore the auth type on a cold start. This is the case the whole change exists for — reaching\n // a password surface by typing its URL never replays login, so without this the flag is empty until the\n // next silent refresh, which may be nearly an hour away.\n this.storage.get(Constants.AUTH_TYPE).then((resp: any) => {\n if (resp) this.UpdateAuthType(resp);\n });\n\n // Changed: Load token and check validity — if expired, await silentRefresh before allowing navigation\n return this.storage.get(Constants.AUTH_TOKEN).then((token: any) => {\n this.UpdateToken(token);\n return this.storage.get(Constants.AUTH_TOKEN_EXPIRE);\n }).then((expire: any) => {\n this.UpdateTokenExpire(expire);\n\n const tokenExpire = new Date(expire);\n if (tokenExpire > new Date()) {\n return true; // Token still valid\n }\n\n // Token expired — attempt silent refresh and wait for result\n const refreshToken = this.storage.getPersistent(Constants.AUTH_REFRESH_TOKEN);\n if (refreshToken) {\n // Changed: tri-state — anything but success sends the user quietly to the login page.\n // On 'network' the refresh token is preserved, so the login page can retry the restore.\n return this.silentRefresh().then((result) => {\n if (result !== 'success') {\n this.sessionExpired();\n }\n return result === 'success';\n });\n }\n\n this.sessionExpired();\n return false;\n });\n }\n\n // Changed: Check for persistent refresh token when no session data exists\n const refreshToken = this.storage.getPersistent(Constants.AUTH_REFRESH_TOKEN);\n if (refreshToken) {\n // Changed: Wait for refresh to complete before deciding (tri-state result)\n return this.silentRefresh().then((result) => {\n if (result !== 'success') {\n this.sessionExpired();\n }\n return result === 'success';\n });\n }\n\n this.sessionExpired();\n return Promise.resolve(false);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormConfig, TableConfig, DetailsDialogConfig, Button } from '../classes/Classes';\nimport { DataServiceLib } from './datalib.service';\n\n// Service for generic entities: Categories, SubCategories, Brands, and ListItems\n@Injectable({\n providedIn: 'root'\n})\nexport class GeneralService {\n\n private dataService = inject(DataServiceLib);\n\n //--------------------------Categories-------------------------\n\n categoryFormConfig: FormConfig = {\n security: { allow: [this.dataService.capCategories] }, // Added: gate category form by categories cap\n title: 'Category',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, alias: 'Name' },\n { name: 'description', type: 'text', alias: 'Description' }\n ],\n loadAction: { url: 'categories/id' },\n heroField: 'categoryID'\n }\n\n categoryCreateButton: Button = { name: 'create', display: 'Create Category', dialog: true, action: { url: 'categories?action=create', method: 'post' } }\n categoryEditButton: Button = { name: 'edit', dialog: true, action: { url: 'categories?action=edit', method: 'post' } }\n categoryDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'categories?action=delete', method: 'post' } }\n\n categoryDetailsConfig: DetailsDialogConfig = {\n formConfig: this.categoryFormConfig,\n heroField: 'categoryID',\n buttons: [this.categoryCreateButton, this.categoryEditButton, this.categoryDeleteButton]\n }\n\n categoriesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'description'],\n columns: [\n { name: 'name', type: 'text', alias: 'Name' },\n { name: 'description', type: 'text', alias: 'Description' }\n ],\n buttons: [\n this.categoryCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.categoryDetailsConfig },\n this.categoryEditButton,\n this.categoryDeleteButton\n ],\n loadAction: { url: 'categories/all/x' },\n formConfig: this.categoryFormConfig,\n realTime: true,\n entityName: 'Category',\n inlineEdit: { fields: ['name', 'description'] }, // Added: edit rows in the grid — the edit button swaps the row into editable cells instead of opening a dialog\n offline: { enabled: true, queue: { create: true, edit: true, delete: true } } // Changed: TinSync offline-enabled (delete on for these reference-data test entities)\n }\n\n //--------------------------SubCategories-------------------------\n\n subCategoryFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSubCategories] }, // Added: gate sub category form by sub categories cap\n title: 'Sub Category',\n fixedTitle: true,\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, alias: 'Name' },\n { name: 'categoryID', type: 'select', required: true, alias: 'Category', loadAction: { url: 'categories/list/x' }, detailsConfig: this.categoryDetailsConfig }, // Changed: dropdown quick-add\n { name: 'description', type: 'text', alias: 'Description' }\n ],\n loadAction: { url: 'subcategories/id' },\n heroField: 'subCategoryID'\n }\n\n subCategoryCreateButton: Button = { name: 'create', display: 'Create Sub Category', dialog: true, action: { url: 'subcategories?action=create', method: 'post' } }\n subCategoryEditButton: Button = { name: 'edit', dialog: true, action: { url: 'subcategories?action=edit', method: 'post' } }\n subCategoryDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'subcategories?action=delete', method: 'post' } }\n\n subCategoryDetailsConfig: DetailsDialogConfig = {\n formConfig: this.subCategoryFormConfig,\n heroField: 'subCategoryID',\n buttons: [this.subCategoryCreateButton, this.subCategoryEditButton, this.subCategoryDeleteButton]\n }\n\n subCategoriesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'categoryName', 'description'],\n columns: [\n { name: 'name', type: 'text', alias: 'Name' },\n { name: 'categoryName', type: 'text', alias: 'Category' },\n { name: 'description', type: 'text', alias: 'Description' }\n ],\n buttons: [\n this.subCategoryCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.subCategoryDetailsConfig },\n this.subCategoryEditButton,\n this.subCategoryDeleteButton\n ],\n loadAction: { url: 'subcategories/all/x' },\n formConfig: this.subCategoryFormConfig,\n realTime: true,\n entityName: 'SubCategory',\n inlineEdit: { fields: ['name', 'description'] }, // Added: inline edit. Category is omitted deliberately — the grid shows categoryName (display) while the form field is categoryID, and getInlineField matches on column name, so an FK column cannot be inline-edited today\n offline: { enabled: true, queue: { create: true, edit: true, delete: true } } // Changed: TinSync offline-enabled (delete on for these reference-data test entities)\n }\n\n //--------------------------Brands-------------------------\n\n brandFormConfig: FormConfig = {\n security: { allow: [this.dataService.capBrands] }, // Added: gate brand form by brands cap\n title: 'Brand',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, alias: 'Name' },\n { name: 'description', type: 'text', alias: 'Description' }\n ],\n loadAction: { url: 'brands/id' },\n heroField: 'brandID'\n }\n\n brandCreateButton: Button = { name: 'create', display: 'Create Brand', dialog: true, action: { url: 'brands?action=create', method: 'post' } }\n brandEditButton: Button = { name: 'edit', dialog: true, action: { url: 'brands?action=edit', method: 'post' } }\n brandDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'brands?action=delete', method: 'post' } }\n\n brandDetailsConfig: DetailsDialogConfig = {\n formConfig: this.brandFormConfig,\n heroField: 'brandID',\n buttons: [this.brandCreateButton, this.brandEditButton, this.brandDeleteButton]\n }\n\n brandsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'description'],\n columns: [\n { name: 'name', type: 'text', alias: 'Name' },\n { name: 'description', type: 'text', alias: 'Description' }\n ],\n buttons: [\n this.brandCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.brandDetailsConfig },\n this.brandEditButton,\n this.brandDeleteButton\n ],\n loadAction: { url: 'brands/all/x' },\n formConfig: this.brandFormConfig,\n realTime: true,\n entityName: 'Brand',\n inlineEdit: { fields: ['name', 'description'] }, // Added: edit rows in the grid instead of a dialog\n offline: { enabled: true, queue: { create: true, edit: true, delete: true } } // Added: TinSync offline-enabled to match categories/subcategories\n }\n\n //--------------------------ListItems-------------------------\n\n listItemFormConfig: FormConfig = {\n title: 'List Item',\n includeAudit: true,\n fields: [\n { name: 'listName', type: 'text', required: true, alias: 'List Name', readonly: true },\n { name: 'name', type: 'text', required: true, alias: 'Name' }\n ],\n loadAction: { url: 'listitems/id' },\n heroField: 'listItemID'\n }\n\n listItemCreateButton: Button = { name: 'create', display: 'Create Item', dialog: true, action: { url: 'listitems?action=create', method: 'post' } }\n listItemEditButton: Button = { name: 'edit', dialog: true, action: { url: 'listitems?action=edit', method: 'post' } }\n listItemDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'listitems?action=delete', method: 'post' } }\n\n listItemDetailsConfig: DetailsDialogConfig = {\n formConfig: this.listItemFormConfig,\n heroField: 'listItemID',\n buttons: [this.listItemCreateButton, this.listItemEditButton, this.listItemDeleteButton]\n }\n\n listItemsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['listName', 'name'],\n columns: [\n { name: 'listName', type: 'text', alias: 'List Name' },\n { name: 'name', type: 'text', alias: 'Name' }\n ],\n buttons: [\n this.listItemCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.listItemDetailsConfig },\n this.listItemEditButton,\n this.listItemDeleteButton\n ],\n loadAction: { url: 'listitems/all/x' },\n formConfig: this.listItemFormConfig,\n realTime: true,\n entityName: 'ListItem'\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormConfig, TableConfig, DetailsDialogConfig, Button, TileConfig } from '../classes/Classes'; // Changed: Removed StepConfig, InventoryReceiptStatus — moved to PurchasingService\nimport { DataServiceLib } from './datalib.service';\nimport { GeneralService } from './general.service';\n\n// Service to centralize all inventory-related table and form configurations\n@Injectable({\n providedIn: 'root'\n})\nexport class InventoryService {\n\n private dataService = inject(DataServiceLib);\n private generalService = inject(GeneralService);\n\n\n productDetailsConfig!: DetailsDialogConfig;\n\n\n constructor() {\n \n\n this.productDetailsConfig = {\n formConfig: this.productFormConfig,\n tableConfigs: [this.productComponentsTableConfig], // Added: Show components for bundle products\n heroField: 'productID',\n buttons: [this.productCreateButton, this.productEditButton, this.productDeleteButton]\n };\n\n // Changed: dropdown quick-add — productDetailsConfig is built above (field initializers run before this constructor body), so wire the product selects here to avoid capturing undefined\n this.inventoryAdjustmentFormConfig.fields.find(f => f.name === 'productID').detailsConfig = this.productDetailsConfig;\n this.inventoryReturnItemFormConfig.fields.find(f => f.name === 'productID').detailsConfig = this.productDetailsConfig;\n }\n\n //--------------------------Products-------------------------\n\n productFormConfig: FormConfig = {\n security: { allow: [this.dataService.capProducts] },\n title: 'Product',\n fixedTitle: true, // Changed: Use fixedTitle to avoid title duplication\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'productInfo', type: 'section', alias: 'Product Information' },\n { name: 'name', type: 'text', required: true, alias: 'Product Name', section: 'productInfo', infoMessage: 'The unique name of the product' },\n { name: 'sku', type: 'text', alias: 'SKU (optional)', section: 'productInfo', infoMessage: 'Stock Keeping Unit for inventory tracking (optional)' }, // Changed: Removed required flag\n { name: 'description', type: 'text', alias: 'Description', span: true, section: 'productInfo', infoMessage: 'Detailed description of the product' },\n { name: 'isBundle', type: 'checkbox', alias: 'Bundle Product', span: true, section: 'productInfo', infoMessage: 'Check if this is a bundle/combo product made up of other products' }, // Added: Bundle product flag\n \n { name: 'pricingInfo', type: 'section', alias: 'Pricing' },\n { name: 'sellingPrice', type: 'money', required: true, alias: 'Selling Price', section: 'pricingInfo', infoMessage: 'Default selling price per unit' },\n { name: 'taxRateID', type: 'select', alias: 'Tax Rate', nullable: true, section: 'pricingInfo', loadAction: { url: 'products/list/tax-rates' }, infoMessage: 'VAT rate applied to this product' }, // Changed: Tax rate selector\n { name: 'isTaxInclusive', type: 'checkbox', alias: 'Price includes Tax', section: 'pricingInfo', infoMessage: 'If checked, the selling price already includes tax' }, // Changed: Tax-inclusive flag\n\n { name: 'inventoryInfo', type: 'section', alias: 'Inventory Settings', collapsedCondition: x => x.productID }, \n { name: 'isSerialized', type: 'checkbox', alias: 'Serialized Product', span: true, section: 'inventoryInfo', infoMessage: 'Track individual items by serial number', hidden: x => x.isBundle }, // Changed: Hide for bundles\n { name: 'baseUnit', type: 'select', required: true, alias: 'Base Unit', section: 'inventoryInfo', loadAction: { url: 'products/list/base-unit' }, defaultFirstValue: true, infoMessage: 'Unit of measure for inventory tracking' }, // Changed: Added defaultFirstValue flag\n { name: 'minimumInventoryLevel', type: 'number', required: true, alias: 'Minimum Inventory Level', section: 'inventoryInfo', infoMessage: 'Alert threshold for low stock', hidden: x => x.isBundle }, // Changed: Hide for bundles\n\n { name: 'categoryInfo', type: 'section', alias: 'Categorization', collapseOnView: true },\n { name: 'categoryID', type: 'select', alias: 'Category', nullable: true, section: 'categoryInfo', loadAction: { url: 'categories/list/x' }, detailsConfig: this.generalService.categoryDetailsConfig, infoMessage: 'The main product category' }, // Changed: Added nullable flag\n { name: 'subCategoryID', type: 'select', alias: 'Sub Category', section: 'categoryInfo', loadAction: { url: 'subcategories/list/x' }, detailsConfig: this.generalService.subCategoryDetailsConfig, infoMessage: 'More specific product classification' },\n { name: 'brandID', type: 'select', alias: 'Brand', nullable: true, section: 'categoryInfo', loadAction: { url: 'brands/list/x' }, detailsConfig: this.generalService.brandDetailsConfig, infoMessage: 'Product brand or manufacturer' }, // Changed: Added nullable flag\n \n\n \n\n ],\n loadAction: { url: 'products/id' },\n heroField: 'productID'\n }\n\n productViewButton : Button = { name: 'view', dialog: true, detailsConfig: this.productDetailsConfig }\n productCreateButton: Button = { name: 'create', display: 'Create Product', dialog: true, action: { url: 'products?action=create', method: 'post' } }\n productEditButton: Button = { name: 'edit', dialog: true, action: { url: 'products?action=edit', method: 'post' } }\n productDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'products?action=delete', method: 'post' } }\n\n\n\n\n productsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'sku', 'categoryName'],\n columns: [\n { name: 'name', type: 'text', alias: 'Product Name' },\n { name: 'sku', type: 'text', alias: 'SKU' },\n { name: 'categoryName', type: 'text', alias: 'Category' },\n { name: 'brandName', type: 'text', alias: 'Brand' },\n { name: 'currentInventoryLevel', type: 'number', alias: 'Current Stock', icon: { name: 'warning', color: 'orange', condition: (x: any) => x.isLowInventory } }, // Changed: Removed separate columns, added low stock icon to current stock\n { name: 'minimumInventoryLevel', type: 'number', alias: 'Min Stock' },\n { name: 'sellingPrice', type: 'money' },\n { name: 'taxRateName', type: 'text', alias: 'Tax Rate' }, // Changed: Tax rate display with N/A fallback\n { name: 'priceExclTax', type: 'text', alias: 'Price (Excl)' }, // Changed: Computed price excluding tax\n { name: 'priceInclTax', type: 'text', alias: 'Price (Incl)' }, // Changed: Computed price including tax\n ],\n buttons: [\n this.productCreateButton,\n this.productViewButton,\n this.productEditButton,\n this.productDeleteButton,\n ],\n loadAction: { url: 'products/all/x' },\n formConfig: this.productFormConfig,\n realTime: true,\n pagination: { pageSize: 25 }, // Added: server-side pagination — the product catalogue is the longest reference list in the suite\n offline: { enabled: true, readOnly: true }, // Added: offline reads only — the catalogue must resolve inside forms with no network; nothing is captured here so nothing queues\n entityName: 'Product',\n }\n\n //--------------------------Product Components (Bundle Configuration)-------------------------\n\n // Product component form for adding/editing bundle components\n productComponentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capProducts] }, // Added: gate bundle component form by products cap (parent entity)\n title: 'Bundle Component',\n fixedTitle: true,\n fields: [\n { name: 'productComponentID', type: 'number', alias: 'ID', hidden: true },\n { name: 'productID', type: 'number', alias: 'Bundle Product ID', hidden: true },\n { name: 'componentProductID', type: 'select', alias: 'Component Product', required: true, detailsConfig: this.productDetailsConfig, \n loadAction: { url: 'products/list/components' }, \n infoMessage: 'Select a non-bundle product to include in this bundle' \n },\n { name: 'quantity', type: 'number', alias: 'Quantity', required: true, defaultValue: 1 , infoMessage: 'Number of units required per bundle' }\n ],\n loadAction: { url: 'productcomponents/id' },\n heroField: 'productComponentID'\n }\n\n // Product components table for bundle details\n productComponentsTableConfig: TableConfig = {\n tabTitle: 'Components',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n causeFormRefresh: true,\n minColumns: ['componentProductName', 'quantity', 'estimatedCost'],\n columns: [\n { name: 'componentProductName', type: 'text', alias: 'Component' },\n { name: 'quantity', type: 'number', alias: 'Quantity per Bundle' },\n { name: 'componentCurrentStock', type: 'number', alias: 'Available Stock' },\n { name: 'estimatedCost', type: 'money', alias: 'Est. Cost' }\n ],\n buttons: [\n { name: 'create', display: 'Add Component', dialog: true, action: { url: 'productcomponents?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'productcomponents?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'productcomponents?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'productcomponents/x/x' }, loadCriteria: 'bundle', loadIDField: 'productID',\n formConfig: this.productComponentFormConfig\n }\n\n // Bundle product form configuration\n bundleProductFormConfig: FormConfig = {\n security: { allow: [this.dataService.capProducts] },\n title: 'Bundle Product',\n fixedTitle: true,\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'productInfo', type: 'section', alias: 'Bundle Information' },\n { name: 'name', type: 'text', required: true, alias: 'Bundle Name', section: 'productInfo', infoMessage: 'Name for this product bundle' },\n { name: 'sku', type: 'text', alias: 'SKU (optional)', section: 'productInfo', infoMessage: 'Stock Keeping Unit for bundle tracking' },\n { name: 'description', type: 'text', alias: 'Description', span: true, section: 'productInfo', infoMessage: 'Description of what is included in this bundle' },\n { name: 'isBundle', type: 'checkbox', alias: 'Is Bundle', hidden: true, defaultValue: true },\n \n { name: 'pricingInfo', type: 'section', alias: 'Pricing' },\n { name: 'sellingPrice', type: 'money', required: true, alias: 'Bundle Price', section: 'pricingInfo', infoMessage: 'Selling price for the complete bundle' },\n { name: 'bundleEstimatedCost', type: 'money', alias: 'Estimated Cost', section: 'pricingInfo', readonly: true, hideOnCreate: true, infoMessage: 'Total estimated cost based on component costs' },\n\n { name: 'inventoryInfo', type: 'section', alias: 'Inventory Settings', collapsedCondition: x => x.productID }, \n { name: 'baseUnit', type: 'select', required: true, alias: 'Base Unit', section: 'inventoryInfo', loadAction: { url: 'products/list/base-unit' }, defaultFirstValue: true, infoMessage: 'Unit of measure for bundle' },\n { name: 'bundleAvailableQuantity', type: 'number', alias: 'Available to Sell', section: 'inventoryInfo', readonly: true, hideOnCreate: true, infoMessage: 'Number of bundles that can be assembled from current component stock' },\n\n\n ],\n loadAction: { url: 'products/id' },\n heroField: 'productID'\n }\n\n bundleProductDetailsConfig: DetailsDialogConfig = {\n formConfig: this.bundleProductFormConfig,\n tableConfigs: [this.productComponentsTableConfig],\n heroField: 'productID',\n buttons: [\n { name: 'create', display: 'Create Bundle', dialog: true, action: { url: 'products?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'products?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'products?action=delete', method: 'post' } }\n ]\n }\n\n bundleProductViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.bundleProductDetailsConfig }\n bundleProductCreateButton: Button = { name: 'create', display: 'Create Bundle', dialog: true, action: { url: 'products?action=create', method: 'post' } }\n\n // Table configuration for bundle products\n bundleProductsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'sku', 'bundleAvailableQuantity'],\n columns: [\n { name: 'name', type: 'text', alias: 'Bundle Name' },\n { name: 'sku', type: 'text', alias: 'SKU' },\n { name: 'bundleAvailableQuantity', type: 'number', alias: 'Available', icon: { name: 'info', color: '#2196F3', condition: (x: any) => x.bundleAvailableQuantity > 0 } }, // Changed: Removed infoMessage as it's not valid for columns\n { name: 'bundleEstimatedCost', type: 'money', alias: 'Est. Cost' },\n { name: 'sellingPrice', type: 'money', alias: 'Selling Price' },\n { name: 'categoryName', type: 'text', alias: 'Category' }\n ],\n buttons: [\n this.bundleProductCreateButton,\n this.bundleProductViewButton,\n { name: 'edit', dialog: true, action: { url: 'products?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'products?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'products/bundles/x' },\n formConfig: this.bundleProductFormConfig,\n realTime: true,\n entityName: 'Product'\n }\n\n //--------------------------ServiceItems-------------------------\n\n // ServiceItem form configuration - follows Product pattern\n serviceItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capServiceItems] }, // Added: gate service item form by service items cap\n title: 'Service',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, alias: 'Service Name' },\n { name: 'isActive', type: 'checkbox', alias: 'Active', defaultValue: true },\n { name: 'description', type: 'text', alias: 'Description' },\n { name: 'unitPrice', type: 'money', required: true, alias: 'Unit Price' },\n { name: 'taxRateID', type: 'select', alias: 'Tax Rate', nullable: true, loadAction: { url: 'serviceitems/list/tax-rates' }, infoMessage: 'VAT rate applied to this service' }, // Changed: Tax rate selector\n { name: 'isTaxInclusive', type: 'checkbox', alias: 'Price includes Tax', infoMessage: 'If checked, the unit price already includes tax' }, // Changed: Tax-inclusive flag\n ],\n loadAction: { url: 'serviceitems/id' },\n heroField: 'serviceItemID'\n }\n\n serviceItemCreateButton: Button = { name: 'create', display: 'Create Service', dialog: true, action: { url: 'serviceitems?action=create', method: 'post' } }\n serviceItemEditButton: Button = { name: 'edit', dialog: true, action: { url: 'serviceitems?action=edit', method: 'post' } }\n serviceItemDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'serviceitems?action=delete', method: 'post' } }\n\n serviceItemDetailsConfig: DetailsDialogConfig = {\n formConfig: this.serviceItemFormConfig,\n heroField: 'serviceItemID',\n buttons: [this.serviceItemCreateButton, this.serviceItemEditButton, this.serviceItemDeleteButton]\n }\n\n serviceItemsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'unitPrice', 'statusName'],\n columns: [\n { name: 'name', type: 'text', alias: 'Service Name' },\n { name: 'description', type: 'text', alias: 'Description' },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price' },\n { name: 'taxRateName', type: 'text', alias: 'Tax Rate' }, // Changed: Tax rate display with N/A fallback\n { name: 'priceExclTax', type: 'text', alias: 'Price (Excl)' }, // Changed: Computed price excluding tax\n { name: 'priceInclTax', type: 'text', alias: 'Price (Incl)' }, // Changed: Computed price including tax\n { name: 'statusName', type: 'text', alias: 'Status' }\n ],\n buttons: [\n this.serviceItemCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.serviceItemDetailsConfig },\n this.serviceItemEditButton,\n this.serviceItemDeleteButton\n ],\n loadAction: { url: 'serviceitems/all/x' },\n formConfig: this.serviceItemFormConfig,\n realTime: true,\n entityName: 'ServiceItem'\n }\n\n //--------------------------Requisitions-------------------------\n\n requisitionItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capRequisitions] }, // Added: gate requisition item form by requisitions cap (parent entity)\n title: 'Requisition Item',\n fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'Add Item' button\n fields: [\n { name: 'productID', type: 'select', alias: 'Product', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.productDetailsConfig },\n { name: 'requestedQuantity', type: 'number', alias: 'Requested Qty', required: true },\n { name: 'issuedQuantity', type: 'number', alias: 'Issued Qty', readonly: true },\n { name: 'inventoryItemID', type: 'select', alias: 'Serial Number', loadAction: { url: 'inventoryitems/list/x' } }\n ],\n loadAction: { url: 'requisitionitems/id' }\n }\n\n requisitionItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n // showInModes: ['edit'],\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'requestedQuantity', type: 'number', alias: 'Requested Qty' },\n { name: 'issuedQuantity', type: 'number', alias: 'Issued Qty' },\n { name: 'serialNumber', type: 'text', alias: 'Serial Number' }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'requisitionitems?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'requisitionitems?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'requisitionitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'requisitionitems/x/x' }, loadCriteria: 'requisition', loadIDField: 'requisitionID',\n formConfig: this.requisitionItemFormConfig\n }\n\n requisitionFormConfig: FormConfig = {\n security: { allow: [this.dataService.capRequisitions] },\n title: 'Requisition',\n fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'New Requisition' button\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'reqInfo', type: 'section', alias: 'Requisition Information' },\n { name: 'requisitionNumber', type: 'text', alias: 'Requisition #', readonly: true, section: 'reqInfo' },\n { name: 'requestedBy', type: 'text', alias: 'Requested By', readonly: true, section: 'reqInfo' },\n { name: 'departmentID', type: 'select', alias: 'Department', section: 'reqInfo', loadAction: { url: 'departments/list/x' } },\n { name: 'requestDate', type: 'date', alias: 'Request Date', readonly: true, section: 'reqInfo' },\n { name: 'issuedDate', type: 'date', alias: 'Issued Date', readonly: true, section: 'reqInfo' },\n { name: 'status', type: 'select', alias: 'Status', readonly: true, serverOwned: true, hideOnCreate: true, section: 'reqInfo', loadAction: { url: 'requisitions/list/status' } }, // Changed (CFW-1): Requisition.Status carries [ServerOwned] // Changed: hideOnCreate so getInitialValue seeds status 0 on create (was omitted → create 400)\n \n { name: 'purposeInfo', type: 'section', alias: 'Purpose & Notes', collapseOnView: true },\n { name: 'purpose', type: 'text', required: true, alias: 'Purpose', span: true, section: 'purposeInfo' },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'purposeInfo' }\n ],\n loadAction: { url: 'requisitions/id' },\n heroField: 'requisitionID'\n }\n\n requisitionEditButton: Button = { name: 'edit', dialog: true, action: { url: 'requisitions?action=edit', method: 'post' } }\n // Changed: `inDialog: true` added. This button lives ONLY in requisitionDetailsConfig.buttons and is absent\n // from the table's own buttons, and Core.setupButtons filters a details dialog's extraButtons on exactly that\n // flag — so it rendered NOWHERE. Its two siblings below both carry it. Colour changed from the Material palette\n // name 'primary', which ButtonService.getButtonColor puts verbatim into [style.color] where it computes to the\n // inherited grey, to the house CSS keyword 'blue'.\n requisitionSubmitButton: Button = { name: 'submit', display: 'Submit Requisition', icon: { name: 'send', color: 'blue' }, inDialog : true, action: { url: 'requisitions?action=submit', method: 'post', successMessage: 'Requisition Submitted' }, confirm: { message: 'Submit this requisition for approval?' }, visible: (row) => row.status === 0 }\n requisitionIssueButton: Button = { name: 'issue', display: 'Issue Items', icon: { name: 'check', color: 'green' }, inDialog : true, action: { url: 'requisitions?action=issue', method: 'post', successMessage: 'Items Issued' }, confirm: { message: 'Issue items for this requisition?' }, visible: (row) => row.pendingApproval === false && row.status === 0 }\n requisitionCancelButton: Button = { name: 'cancel', display: 'Cancel Request', icon: { name: 'close', color: 'red' }, inDialog : true, action: { url: 'requisitions?action=cancel', method: 'post', successMessage: 'Requisition Cancelled' }, confirm: { message: 'Cancel this requisition?' }, visible: (row) => row.status === 0 }\n\n requisitionDetailsConfig: DetailsDialogConfig = {\n formConfig: this.requisitionFormConfig,\n tableConfigs: [this.requisitionItemsTableConfig],\n heroField: 'requisitionID',\n buttons: [ this.requisitionEditButton, this.requisitionSubmitButton, this.requisitionIssueButton, this.requisitionCancelButton]\n }\n\n requisitionViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.requisitionDetailsConfig }\n\n requisitionsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['requisitionNumber', 'requesterName', 'requestDate'],\n columns: [\n { name: 'requisitionNumber', type: 'text', alias: 'Requisition #' },\n { name: 'requesterName', type: 'monogram', alias: 'Requested By' }, // Changed: monogram — the row still carries the full name, so filter/sort are untouched\n { name: 'departmentName', type: 'text', alias: 'Department' },\n { name: 'requestDate', type: 'date', alias: 'Request Date' },\n { name: 'issuedDate', type: 'date', alias: 'Issued Date' },\n { name: 'status', type: 'text', alias: 'Status' },\n { name: 'purpose', type: 'text', alias: 'Purpose', maxLength: 100 },\n { name: 'pendingApproval', type: 'checkbox', alias: 'Pending' }\n ],\n buttons: [\n { name: 'create', display: 'New Requisition', dialog: true, action: { url: 'requisitions?action=create', method: 'post' }, onSuccessButton: this.requisitionViewButton },\n { name: 'view', dialog: true, detailsConfig: this.requisitionDetailsConfig },\n { name: 'edit', dialog: true, detailsConfig: this.requisitionDetailsConfig },\n { name: 'delete', dialog: true, action: { url: 'requisitions?action=delete', method: 'post' } },\n this.requisitionIssueButton,\n this.requisitionCancelButton\n ],\n loadAction: { url: 'requisitions/all/x' },\n formConfig: this.requisitionFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — requisitions append continuously\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — requisitions are raised at the point of need, often away from the desk\n entityName: 'Requisition',\n }\n\n // Removed: Purchase Orders configs moved to PurchasingService\n // Removed: Inventory Receipts configs moved to PurchasingService\n\n //--------------------------Inventory Items-------------------------\n\n inventoryItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryItems] },\n title: 'Inventory Item',\n includeAudit: true,\n fields: [\n { name: 'productName', type: 'text', alias: 'Product', readonly: true },\n { name: 'serialNumber', type: 'text', alias: 'Serial Number', readonly: true },\n { name: 'quantity', type: 'number', alias: 'Quantity', readonly: true },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost', readonly: true },\n { name: 'totalValue', type: 'money', alias: 'Total Value', readonly: true },\n { name: 'status', type: 'text', alias: 'Status', readonly: true },\n { name: 'receivedDate', type: 'date', alias: 'Received Date', readonly: true }\n ],\n loadAction: { url: 'inventoryitems/id' },\n heroField: 'inventoryItemID'\n }\n\n inventoryItemDetailsConfig: DetailsDialogConfig = {\n formConfig: this.inventoryItemFormConfig,\n heroField: 'inventoryItemID',\n buttons: []\n }\n\n // Added (WS-1 sweep): paginated but deliberately NOT offline — InventoryItem does not implement ISync, so a queued write has no RowVersion/ClientRef to sync or dedupe on. Adding it is a migration, not a config change. A read-only cache for stock lookups on the floor belongs to the CACHE phase.\n inventoryItemsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['productName', 'serialNumber', 'quantity'],\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'serialNumber', type: 'text', alias: 'Serial Number' }, // Changed: Backend should return N/A for non-serialized products\n { name: 'quantity', type: 'number', alias: 'Quantity' },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost' },\n { name: 'totalValue', type: 'money', alias: 'Total Value' },\n { name: 'statusName', type: 'text', alias: 'Status' }, // Changed: Use statusName instead of status to show status name\n { name: 'receivedDate', type: 'date', alias: 'Received Date' }\n ],\n \n buttons: [\n // this.inventoryQuickPurchaseButton,\n { name: 'view', dialog: true, detailsConfig: this.inventoryItemDetailsConfig }\n ],\n loadAction: { url: 'inventoryitems/all/x' },\n formConfig: this.inventoryItemFormConfig,\n realTime: true,\n pagination: { pageSize: 20 }, // Added: server-side pagination — one row per stock record — the largest table in inventory\n entityName: 'InventoryItem',\n }\n\n \n\n //--------------------------Inventory Adjustments-------------------------\n\n // Updated: Changed form from all-readonly to editable fields for create/edit\n inventoryAdjustmentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryAdjustments] },\n title: 'Inventory Adjustment',\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'adjustmentInfo', type: 'section', alias: 'Adjustment Information' },\n { name: 'adjustmentNumber', type: 'text', alias: 'Adjustment #', readonly: true, section: 'adjustmentInfo' },\n { name: 'productID', type: 'select', required: true, alias: 'Product', section: 'adjustmentInfo', loadAction: { url: 'products/list/x' } },\n { name: 'reason', type: 'select', required: true, alias: 'Reason', section: 'adjustmentInfo', loadAction: { url: 'inventoryadjustments/list/reason' } },\n { name: 'adjustmentQuantity', type: 'number', required: true, alias: 'Quantity (+/-)', section: 'adjustmentInfo' },\n { name: 'adjustmentDate', type: 'date', alias: 'Date', readonly: true, section: 'adjustmentInfo' },\n { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapseOnView: true },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo' },\n { name: 'pendingApproval', type: 'checkbox', alias: 'Pending Approval', readonly: true, section: 'additionalInfo' }\n ],\n loadAction: { url: 'inventoryadjustments/id' },\n heroField: 'inventoryAdjustmentID'\n }\n\n // Added: CRUD buttons for adjustments\n inventoryAdjustmentCreateButton: Button = { name: 'create', display: 'Create Adjustment', dialog: true, action: { url: 'inventoryadjustments?action=create', method: 'post' } }\n inventoryAdjustmentEditButton: Button = { name: 'edit', dialog: true, action: { url: 'inventoryadjustments?action=edit', method: 'post' } }\n inventoryAdjustmentDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'inventoryadjustments?action=delete', method: 'post' } }\n\n // Updated: Added edit/delete buttons to details dialog\n inventoryAdjustmentDetailsConfig: DetailsDialogConfig = {\n formConfig: this.inventoryAdjustmentFormConfig,\n heroField: 'inventoryAdjustmentID',\n buttons: [this.inventoryAdjustmentEditButton, this.inventoryAdjustmentDeleteButton]\n }\n\n // Updated: Added create/edit/delete buttons to table\n inventoryAdjustmentsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['adjustmentNumber', 'productName', 'reason'],\n columns: [\n { name: 'adjustmentNumber', type: 'text', alias: 'Adjustment #' },\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'reason', type: 'text', alias: 'Reason' },\n { name: 'adjustmentQuantity', type: 'number', alias: 'Quantity' },\n { name: 'adjustmentDate', type: 'date', alias: 'Date' },\n { name: 'pendingApproval', type: 'checkbox', alias: 'Pending' }\n ],\n buttons: [\n this.inventoryAdjustmentCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.inventoryAdjustmentDetailsConfig },\n this.inventoryAdjustmentEditButton,\n this.inventoryAdjustmentDeleteButton\n ],\n loadAction: { url: 'inventoryadjustments/all/x' },\n formConfig: this.inventoryAdjustmentFormConfig,\n realTime: true,\n pagination: { pageSize: 20 }, // Added: server-side pagination — adjustments append with every stock count\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — adjustments are captured on the warehouse floor\n entityName: 'InventoryAdjustment',\n }\n\n //--------------------------Inventory Returns-------------------------\n\n // Added: Return item form config with conditional fields based on return type\n inventoryReturnItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReturns] },\n title: 'Return Item',\n fields: [\n { name: 'productID', type: 'select', required: true, alias: 'Product', loadAction: { url: 'products/list/x' } },\n { name: 'quantity', type: 'number', required: true, alias: 'Quantity' },\n { name: 'unitValue', type: 'money', required: true, alias: 'Unit Value' },\n { name: 'lineTotal', type: 'money', alias: 'Line Total', readonly: true },\n { name: 'restockApproved', type: 'checkbox', alias: 'Restock', hidden: (x: any) => x._parentReturnType === 2 },\n { name: 'isGoodCondition', type: 'checkbox', alias: 'Good Condition', hidden: (x: any) => x._parentReturnType !== 2 },\n { name: 'conditionNotes', type: 'text', alias: 'Condition Notes', span: true, hidden: (x: any) => x._parentReturnType !== 2 }\n ],\n loadAction: { url: 'inventoryreturnitems/id' },\n heroField: 'inventoryReturnItemID'\n }\n\n // Added: Return items table for details dialog\n inventoryReturnItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'quantity', type: 'number', alias: 'Quantity' },\n { name: 'unitValue', type: 'money', alias: 'Unit Value' },\n { name: 'lineTotal', type: 'money', alias: 'Line Total' },\n { name: 'restockApproved', type: 'checkbox', alias: 'Restock' },\n { name: 'isGoodCondition', type: 'checkbox', alias: 'Good Condition' },\n { name: 'conditionNotes', type: 'text', alias: 'Notes' }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'inventoryreturnitems?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'inventoryreturnitems?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'inventoryreturnitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'inventoryreturnitems/x/x' }, loadCriteria: 'return', loadIDField: 'inventoryReturnID',\n formConfig: this.inventoryReturnItemFormConfig\n }\n\n // Added: Return form config with conditional source fields based on return type\n inventoryReturnFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReturns] },\n title: 'Inventory Return',\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'returnInfo', type: 'section', alias: 'Return Information' },\n { name: 'returnNumber', type: 'text', alias: 'Return #', readonly: true, section: 'returnInfo' },\n { name: 'returnType', type: 'select', required: true, alias: 'Return Type', section: 'returnInfo', loadAction: { url: 'inventoryreturns/list/return-type' } },\n { name: 'returnDate', type: 'date', alias: 'Return Date', readonly: true, section: 'returnInfo' },\n { name: 'status', type: 'select', alias: 'Status', readonly: true, serverOwned: true, hideOnCreate: true, section: 'returnInfo', loadAction: { url: 'inventoryreturns/list/status' } }, // Changed (CFW-1): InventoryReturn.Status carries [ServerOwned] // Changed: hideOnCreate so getInitialValue seeds status 0 on create (was omitted → create 400)\n { name: 'sourceInfo', type: 'section', alias: 'Source Details', collapseOnView: true },\n { name: 'customerID', type: 'select', alias: 'Customer', section: 'sourceInfo', loadAction: { url: 'customers/list/x' }, hidden: (x: any) => x.returnType !== 0, detailsConfig: this.dataService.customerDetailsConfig }, // Changed: dropdown quick-add\n { name: 'saleID', type: 'select', alias: 'Sale', section: 'sourceInfo', loadAction: { url: 'sales/list/x' }, hidden: (x: any) => x.returnType !== 0 },\n { name: 'supplierID', type: 'select', alias: 'Supplier', section: 'sourceInfo', loadAction: { url: 'suppliers/list/x' }, hidden: (x: any) => x.returnType !== 1, detailsConfig: this.dataService.supplierDetailsConfig }, // Changed: dropdown quick-add\n { name: 'purchaseID', type: 'select', alias: 'Purchase', section: 'sourceInfo', loadAction: { url: 'purchases/list/x' }, hidden: (x: any) => x.returnType !== 1 }, // Changed: inventoryReceiptID → purchaseID, inventoryreceipts → purchases\n { name: 'requisitionID', type: 'select', alias: 'Requisition', section: 'sourceInfo', loadAction: { url: 'requisitions/list/x' }, hidden: (x: any) => x.returnType !== 2 },\n { name: 'details', type: 'section', alias: 'Details', collapseOnView: true },\n { name: 'reason', type: 'text', required: true, alias: 'Reason', span: true, section: 'details' },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'details' },\n { name: 'totals', type: 'section', alias: 'Totals', collapseOnView: true },\n { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, serverOwned: true, section: 'totals' } // Changed (CFW-1): InventoryReturn.TotalAmount carries [ServerOwned] — the Phase 4/5 before-and-after row, forged to 555 and now held at the recomputed figure\n ],\n loadAction: { url: 'inventoryreturns/id' },\n heroField: 'inventoryReturnID'\n }\n\n // Added: CRUD + action buttons for returns\n inventoryReturnEditButton: Button = { name: 'edit', dialog: true, action: { url: 'inventoryreturns?action=edit', method: 'post' } }\n inventoryReturnDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'inventoryreturns?action=delete', method: 'post' } }\n inventoryReturnRejectButton: Button = { name: 'reject', display: 'Reject', icon: { name: 'cancel', color: 'red' }, inDialog: true, action: { url: 'inventoryreturns?action=reject', method: 'post', successMessage: 'Return rejected' }, confirm: { message: 'Reject this return?' }, visible: (x: any) => x.status === 0 }\n\n // Added: Details dialog with items table\n inventoryReturnDetailsConfig: DetailsDialogConfig = {\n formConfig: this.inventoryReturnFormConfig,\n tableConfigs: [this.inventoryReturnItemsTableConfig],\n heroField: 'inventoryReturnID',\n buttons: [this.inventoryReturnEditButton, this.inventoryReturnDeleteButton, this.inventoryReturnRejectButton]\n }\n\n inventoryReturnViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.inventoryReturnDetailsConfig }\n\n // Changed: moved below detailsConfig/viewButton and given onSuccessButton so a new return auto-opens its details dialog for item entry (two-step create pattern, as per requisitions). Defining it above viewButton left the reference undefined at field-initializer time\n inventoryReturnCreateButton: Button = { name: 'create', display: 'Create Return', dialog: true, action: { url: 'inventoryreturns?action=create', method: 'post' }, onSuccessButton: this.inventoryReturnViewButton }\n\n // Added: Main returns table config\n inventoryReturnsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['returnNumber', 'entityName', 'returnDate'],\n columns: [\n { name: 'returnNumber', type: 'text', alias: 'Return #' },\n { name: 'returnType', type: 'text', alias: 'Type' },\n { name: 'entityName', type: 'text', alias: 'Source' },\n { name: 'returnDate', type: 'date', alias: 'Date' },\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'status', type: 'text', alias: 'Status' },\n { name: 'pendingApproval', type: 'checkbox', alias: 'Pending' }\n ],\n buttons: [\n this.inventoryReturnCreateButton,\n this.inventoryReturnViewButton,\n this.inventoryReturnEditButton,\n this.inventoryReturnDeleteButton,\n this.inventoryReturnRejectButton\n ],\n loadAction: { url: 'inventoryreturns/all/x' },\n formConfig: this.inventoryReturnFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — returns append continuously\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — returns are captured at the counter as goods come back\n entityName: 'InventoryReturn',\n }\n\n //--------------------------Inventory Transactions-------------------------\n\n inventoryTransactionFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryTransactions] },\n title: 'Inventory Transaction',\n includeAudit: true,\n fields: [\n { name: 'productName', type: 'text', alias: 'Product', readonly: true },\n { name: 'transactionType', type: 'text', alias: 'Type', readonly: true },\n { name: 'quantity', type: 'number', alias: 'Quantity', readonly: true },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost', readonly: true },\n { name: 'totalValue', type: 'money', alias: 'Total Value', readonly: true },\n { name: 'transactionDate', type: 'date', alias: 'Date', readonly: true },\n { name: 'referenceType', type: 'text', alias: 'Reference', readonly: true }\n ],\n loadAction: { url: 'inventorytransactions/id' },\n heroField: 'inventoryTransactionID'\n }\n\n inventoryTransactionDetailsConfig: DetailsDialogConfig = {\n formConfig: this.inventoryTransactionFormConfig,\n heroField: 'inventoryTransactionID',\n buttons: []\n }\n\n inventoryTransactionsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['productName', 'transactionTypeName', 'quantity'],\n columns: [\n { name: 'transactionDate', type: 'date', alias: 'Date' },\n { name: 'transactionTypeName', type: 'text', alias: 'Type' },\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'quantity', type: 'number', alias: 'Quantity' },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost' },\n { name: 'totalValue', type: 'money', alias: 'Total Value' },\n { name: 'referenceType', type: 'text', alias: 'Reference' }\n ],\n buttons: [\n { name: 'view', dialog: true, detailsConfig: this.inventoryTransactionDetailsConfig }\n ],\n loadAction: { url: 'inventorytransactions/all/x' },\n formConfig: this.inventoryTransactionFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — the stock movement ledger grows with every transaction\n offline: { enabled: true, readOnly: true }, // Added: offline reads only — read-only ledger (view is the only button) so there is nothing to queue — cache the reads instead\n entityName: 'InventoryTransaction',\n }\n\n //--------------------------Inventory Stock (Grouped by Product)-------------------------\n\n // Changed: Reuse existing inventoryItemsTableConfig with product criteria filter\n inventoryStockItemsTableConfig: TableConfig = {\n ...this.inventoryItemsTableConfig,\n tabTitle: 'Stock Items',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n buttons: [],\n loadAction: { url: 'inventoryitems/stock/x' }, loadCriteria: 'product', loadIDField: 'productID'\n }\n\n // Changed: Reuse product form config, filter to show only Product Information section fields\n inventoryStockProductFormConfig: FormConfig = {\n ...this.productFormConfig,\n security: { allow: [this.dataService.capInventoryStock] },\n fields: this.productFormConfig.fields.filter(f => f.section === 'productInfo' || f.name === 'productInfo').map(f => ({ ...f, readonly: true })),\n loadAction: { url: 'products/id' }\n }\n\n // Changed: Details config reuses simplified product form and inventory items table\n inventoryStockDetailsConfig: DetailsDialogConfig = {\n formConfig: this.inventoryStockProductFormConfig,\n tableConfigs: [this.inventoryStockItemsTableConfig],\n heroField: 'productID',\n buttons: []\n }\n\n // Inventory stock summary tiles\n inventoryStockTileConfig: TileConfig = {\n clickable: true,\n headerPosition: 'top',\n tiles: [\n { name: 'totalProducts', alias: 'Total Products', color: '#2196F3', icon: 'category', info: 'Total number of products in inventory', action: { url: 'inventoryitems/stock/all' } }, // Changed: Added icon\n { name: 'lowStockProducts', alias: 'Low Stock', color: '#FFC107', icon: 'warning', info: 'Products below minimum quantity', action: { url: 'inventoryitems/stock/lowstock' } }, // Changed: Added icon\n { name: 'outOfStockProducts', alias: 'Out of Stock', color: '#F44336', icon: 'remove_shopping_cart', info: 'Products with zero quantity', action: { url: 'inventoryitems/stock/outofstock' } }, // Changed: Added icon\n { name: 'serializedProducts', alias: 'Serialized Products', color: '#9C27B0', icon: 'qr_code_2', info: 'Number of products with serial tracking', action: { url: 'inventoryitems/stock/serialized' } }, // Changed: Added icon\n ],\n loadAction: { url: 'inventoryitems/stock/summary' }\n }\n\n // Changed: Table config for inventory stock grouped by product\n inventoryStockTableConfig: TableConfig = {\n showFilter: true,\n holdHeaderButtonSpace: true,\n flatButtons: true,\n minColumns: ['productName', 'totalQuantity'],\n columns: [\n { name: 'productName', type: 'button', alias: 'Product', detailsConfig: this.inventoryStockDetailsConfig },\n { name: 'totalQuantity', type: 'number', alias: 'Total Stock', icon: { name: 'warning', color: 'orange', condition: (x: any) => x.isLowInventory } }\n ],\n buttons: [\n { name: 'view', dialog: true, detailsConfig: this.inventoryStockDetailsConfig, },\n\n ],\n loadAction: { url: 'inventoryitems/stock/all' },\n formConfig: this.productFormConfig,\n tileConfig: this.inventoryStockTileConfig\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http'; // Added: the PDF button downloads its blob from the SERVICE now, same reason as the dialog below — a page-owned handler is dead in every other consumer\nimport { BehaviorSubject } from 'rxjs'; // Added (journal-account-names): the journal Account column mirrors the account field's existing options channel\nimport { distinctUntilChanged } from 'rxjs/operators'; // Added (accounts-prefetch-401): the prefetch fires on the first NON-EMPTY token, not on loggedin — see loadJournalAccounts' caller below // Changed (logout-account-cache): `filter` dropped — the empty-token emission IS the logout signal now, so it must reach the subscriber instead of being filtered out\nimport { MatDialog } from '@angular/material/dialog'; // Added: the allocate button opens its dialog from the SERVICE now, so it works in every consumer and not just on the receipts page\nimport { ReceiptDialogComponent } from '../pages/accounting/receipts/receipt-dialog.component'; // Added: no import cycle — this dialog injects only HttpService/MessageService and never reaches back into AccountingService\nimport { FormConfig, TableConfig, DetailsDialogConfig, Button, TileConfig, Column, RoleAccess, ApiResponse } from '../classes/Classes'; // Changed (journal-account-names): ApiResponse — the journal accounts prefetch reads the standard envelope // Changed: RoleAccess — the invoice lifecycle buttons now demand the level InvoicesController demands\nimport { DataServiceLib } from './datalib.service';\nimport { AuthService } from './auth.service'; // Added (journal-account-names): loggedinObserv is the shell-level event the journal accounts prefetch hangs off, the same hook SetupService.loadCount is driven by\nimport { HttpService } from './http.service'; // Added: supplies apiUrl for the receipt PDF download — the same source ReceiptsComponent used, so the URL is unchanged\nimport { InventoryService } from './inventory.service'; // Changed: dropdown quick-add — product/service configs for invoice item selects\nimport { InvoiceStatus, CreditNoteStatus, FiscalPeriodStatus, QuoteStatus } from '../classes/LibClasses'; // Changed: Added QuoteStatus for quotations (C10)\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AccountingService {\n\n private dataService = inject(DataServiceLib);\n private inventoryService = inject(InventoryService); // Changed: dropdown quick-add — product/service configs for invoice item selects\n private dialog = inject(MatDialog); // Added: declared ABOVE receiptAllocateButton deliberately — that button is a field initialiser and its handler closes over this\n private httpService = inject(HttpService); // Added: same field-initialiser ordering reason — receiptPdfButton's handler closes over this\n private authService = inject(AuthService); // Added (journal-account-names): see the constructor — the accounts list must be in place before the journal dialog is cloned\n private http = inject(HttpClient); // Added: a bare HttpClient exactly as ReceiptsComponent used, so the bearer token still comes from LoaderInterceptor; HttpService has no POST-blob helper and adding one would touch a file this chunk does not own\n\n //--------------------------Accounts Base-------------------------\n accountFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccounts] },\n title: 'Financial Account',\n includeAudit: true,\n // Changed: split into what you need every time you open an account, and what you set once. Balance was\n // buried among the reporting toggles despite being the thing people open an account to see, while the\n // account code, the cash/bank total toggles and the IAS 7 classification are configuration — set at\n // creation and rarely looked at again. Those now live in a collapsed section.\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'type', type: 'select', required: true, loadAction: { url: 'accounts/list/accountTypes' } },\n { name: 'currencyID', type: 'select', alias: 'Currency', loadAction: { url: 'currencies/list/x' } }, // Changed: Added currency select for multi-currency support\n { name: 'balanceDisplay', alias: 'Balance', type: 'text', readonly: true, hideOnCreate: true }, // Changed: promoted — this is the reason the dialog gets opened // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n { name: 'classification', type: 'section', alias: 'Classification & Reporting', collapseOnView: true }, // Added: collapsed by default; these are set-once settings\n { name: 'code', type: 'text', alias: 'Account Code', section: 'classification', infoMessage: 'Chart of accounts code (1xxx assets, 2xxx liabilities, 3xxx equity, 4xxx revenue, 5xxx expenses)' }, // Changed: COA code (B1); moved into the collapsed section\n { name: 'includeInCashTotal', type: 'checkbox', alias: 'Include in Cash Total', section: 'classification', hidden: (data: any) => data.type !== 0 }, // Changed: Only visible for Asset accounts (type 0)\n { name: 'includeInBankTotal', type: 'checkbox', alias: 'Include in Bank Total', section: 'classification', hidden: (data: any) => data.type !== 0 }, // Changed: Only visible for Asset accounts (type 0)\n // Changed (E21): defaultValue added. An untouched select initialises to null (TinCore.getInitialValue\n // `case 'select': return null`), and Account.CashFlow is a NON-NULLABLE CashFlowCategory, so creating an\n // account without opening this collapsed section posted cashFlow:null and was rejected at model binding\n // with a 400 — surfaced to the user as \"Something went wrong ... a technical problem in the app\" and\n // logged nowhere. 0 is Operating, which is the model's own C# default (Account.cs:69), so this makes the\n // form agree with the entity rather than inventing a value.\n { name: 'cashFlow', type: 'select', alias: 'Cash Flow Section', section: 'classification', defaultValue: 0, infoMessage: 'IAS 7 cash flow statement classification', // Changed: C5 cash flow category\n options: [\n { name: 'Operating', value: 0 },\n { name: 'Investing', value: 1 },\n { name: 'Financing', value: 2 },\n { name: 'Cash Equivalent', value: 3 }\n ]\n },\n ],\n loadAction: { url: 'accounts/id' },\n heroField: 'accountID',\n }\n\n accountCreateButton: Button = { name: 'create', display: 'Create Account', dialog: true, action: { url: 'accounts?action=create', method: 'post' } }\n finAccounEditButton: Button = { name: 'edit', dialog: true, action: { url: 'accounts?action=edit', method: 'post' } }\n\n\n\n accountBaseDetailsConfig : DetailsDialogConfig = {\n formConfig: this.accountFormConfig,\n tableConfigs: [],\n heroField: 'accountID',\n buttons: [this.accountCreateButton, this.finAccounEditButton]\n };\n\n //--------------------------Invoices-------------------------\n\n // Added: Invoice payment form configuration\n invoicePaymentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Record Payment',\n fixedTitle : true,\n fields: [\n { name: 'invoiceID', type: 'number', hidden : true},\n { name: 'paymentDate', type: 'date', alias: 'Payment Date', required: true }, // Changed (NFD-2, Arbiter 2026-08-19): max: 'today' REMOVED — deliberately uncapped. A payment may legitimately carry a future date (post-dated cheque), so the future IS a valid answer here. Not method-conditioned: uncapped for every payment method.\n { name: 'method', type: 'select', alias: 'Payment Method', required: true, defaultValue : 1, loadAction: { url: 'invoicepayments/list/methods' } },\n { name: 'currencyID', type: 'select', alias: 'Currency', loadAction: { url: 'currencies/list/x' }, defaultFirstValue: true, infoMessage: 'Currency for this payment (defaults to base currency)' }, // Changed: Added currency select for multi-currency payments\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding', readonly: true}, // Changed (A-0901-09): read-only text -> money. A currency figure rendered as plain text showed an unformatted raw number; type money is what actually renders it as currency (format: 'money' is inert on spa-text, which uses format only for the caption). Payload is unaffected: the dialog seeds outstandingAmount from the invoice row as a populated number, so getInitialValue's ''-vs-0 difference never fires — pinned by predicate-hidden-payload.spec.ts.\n { name: 'amount', type: 'money', alias: 'Amount', required: true, span : true },\n \n { name: 'reference', type: 'text', alias: 'Reference', span : true }\n ],\n }\n\n invoicePaymentCreateButton : Button = { name : 'edit', action: { url: 'invoicepayments?action=create', method: 'post', successMessage: 'Payment Recorded' }};\n\n invoicePaymentsCreateDetailsDialogConfig: DetailsDialogConfig = {\n formConfig: this.invoicePaymentFormConfig, \n heroField: 'invoiceID',\n mode: 'edit',\n seedDefaults: true, // Added: CAPTURE dialog wearing mode:'edit' (it posts invoicepayments?action=create), so generateObject never ran for it. VERIFIED NO-OP TODAY, and deliberately kept: InvoicesController.cs:122 already projects Method = InvoicePaymentMethod.Bank onto the invoice row, so `method` arrives POPULATED and the only-empty guard correctly leaves it alone. The flag is the declared fallback if that projection ever stops supplying it — it is not what fills the field today.\n buttons: [\n this.invoicePaymentCreateButton\n ]\n }\n\n\n // Added: Invoice payments table for history tracking\n invoicePaymentsTableConfig: TableConfig = {\n tabTitle: 'Payment History',\n showFilter: false,\n minColumns: ['paymentDate', 'amount', 'methodName'],\n columns: [\n { name: 'paymentDate', type: 'date', alias: 'Date' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'methodName', type: 'text', alias: 'Method' },\n { name: 'reference', type: 'text', alias: 'Reference' }\n ],\n buttons: [\n // Changed: Removed dead 'Migrate Legacy Payments' button — backend invoicepayments/migrate endpoint is decommissioned\n { name: 'edit', dialog: true, action: { url: 'invoicepayments?action=edit', method: 'post' }, visible: x => x.status != InvoiceStatus.Paid }, // Changed: Added edit button, hide on Paid invoices\n { name: 'delete', inDialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'invoicepayments?action=delete', method: 'post', successMessage: 'Payment deleted' }, confirm: { message: 'Delete this payment? The linked financial transaction will be reversed.' }, visible: x => x.status != InvoiceStatus.Paid } // Changed: Added delete button with reversal warning, hide on Paid invoices\n ],\n loadAction: { url: 'invoicepayments/x/x' }, loadCriteria: 'invoice', loadIDField: 'invoiceID',\n formConfig: { // Changed: Added form for editing payments\n title: 'Edit Payment',\n fields: [\n { name: 'paymentDate', type: 'date', alias: 'Payment Date', required: true }, // Changed (NFD-2, Arbiter 2026-08-19): max: 'today' REMOVED — deliberately uncapped. A payment may legitimately carry a future date (post-dated cheque), so the future IS a valid answer here. Not method-conditioned: uncapped for every payment method.\n { name: 'method', type: 'select', alias: 'Payment Method', required: true, loadAction: { url: 'invoicepayments/list/methods' } },\n { name: 'amount', type: 'money', alias: 'Amount', required: true },\n { name: 'reference', type: 'text', alias: 'Reference' }\n ],\n loadAction: { url: 'invoicepayments/id' }\n }\n }\n\n // Invoice form configuration with customer and status fields\n invoiceFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Invoice',\n includeAudit: true,\n // Changed: sectioned — who owes what stays on top, the paperwork and the sub-totals fold away so the items\n // and payments tabs sit directly under the headline figures\n fields: [\n { name: 'customerID', alias: 'Customer', type: 'select', required: true, loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig },\n { name: 'status', type: 'select', hideOnCreate: true, readonly: true, serverOwned: true, loadAction: { url: 'invoices/list/statuses' } }, // Changed (CFW-1): Invoice.Status carries [ServerOwned] — a create body carrying status:2 stored an invoice born PAID with no items and no payments\n { name: 'totalDisplay', type: 'text', alias: 'Total', format: 'text', readonly: true, hideOnCreate: true }, // NOT converted (A-0901-09): stays text. Invoice.TotalDisplay (TinErp Models/Accounting/Invoice.cs:105) is `public string TotalDisplay => TotalAmount.FormatMoney()` — a server-PRE-FORMATTED STRING, not a number. type:'money' renders a masked numeric input, so the mask cannot parse \"$1,234.56\" and the field renders BLANK. MEASURED 2026-09-01 at 1920x1080: Total went empty while the numeric Outstanding beside it showed 1,234.56 correctly.\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding', readonly: true, hideOnCreate: true }, // Changed (A-0901-09): read-only text -> money. hideOnCreate keeps it out of the create body entirely, so the getInitialValue hazard cannot apply here.\n\n { name: 'invoiceInfo', type: 'section', alias: 'Invoice Details', collapseOnView: true },\n { name: 'invoiceDate', type: 'date', max: 'today', required: true, section: 'invoiceInfo' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'invoiceNumber', type: 'text', alias: 'Invoice #', section: 'invoiceInfo' }, // Changed: Made editable on create for optional manual numbering\n { name: 'paymentTerms', type: 'select', alias: 'Payment Terms', required: true, defaultValue : 30, loadAction: { url: 'invoices/list/payment-terms' }, section: 'invoiceInfo' },\n { name: 'dueDate', type: 'date', alias: 'Due Date', readonly: true, hideOnCreate: true, section: 'invoiceInfo' },\n\n { name: 'amounts', type: 'section', alias: 'Amount Breakdown', hideOnCreate: true, collapseOnView: true },\n { name: 'subTotal', type: 'money', alias: 'Sub Total', readonly: true, hideOnCreate: true, section: 'amounts' }, // Changed: Show SubTotal (before tax)\n { name: 'taxTotal', type: 'money', alias: 'VAT', readonly: true, hideOnCreate: true, section: 'amounts' }, // Changed: Show TaxTotal (VAT amount)\n { name: 'paidAmount', type: 'money', alias: 'Paid', readonly: true, hideOnCreate: true, section: 'amounts' } // Changed (A-0901-09): read-only text -> money, matching subTotal and taxTotal directly above it — the three now render as one consistent currency column instead of two formatted and one raw.\n ],\n loadAction: { url: 'invoices/id' },\n heroField: 'invoiceID',\n }\n\n // Invoice items form configuration\n invoiceItemsFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] }, // Added: gate invoice item form by invoices cap (parent entity)\n title: 'Invoice Item',\n fields: [\n { name: 'itemType', type: 'select', required: true, alias: 'Item Type', loadAction: { url: 'invoiceitems/list/item-types' }, defaultValue: 0 }, // Added: Item type selector\n { name: 'productID', type: 'select', alias: 'Product', loadAction: { url: 'products/list/invoice-items' }, detailsConfig: this.inventoryService.productDetailsConfig, // Changed: dropdown quick-add\n hidden: x => x.itemType !== 1, // Added: Product selector - visible only when itemType = Product (1)\n onSelectChange: (selectedId: number, formData: any, option?: any) => { // Changed: Auto-populate description and unitPrice when product is selected\n if (option) {\n formData.description = option.description || option.name;\n formData.unitPrice = option.unitPrice;\n }\n }\n },\n { name: 'serviceItemID', type: 'select', alias: 'Service', loadAction: { url: 'serviceitems/list/active' }, detailsConfig: this.inventoryService.serviceItemDetailsConfig, // Changed: dropdown quick-add\n hidden: x => x.itemType !== 2, // Added: Service selector - visible only when itemType = Service (2)\n onSelectChange: (selectedId: number, formData: any, option?: any) => { // Changed: Auto-populate description and unitPrice when service is selected\n if (option) {\n formData.description = option.description || option.name;\n formData.unitPrice = option.unitPrice;\n }\n }\n },\n { name: 'description', type: 'text', required: true, alias: 'Description', span: true }, // Changed: Description field (backend will populate for Product/Service)\n { name: 'quantity', type: 'number', required: true, defaultValue : 1 },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price', required: true }, // Changed: Unit price field (backend will populate for Product/Service)\n\n // Changed: sectioned — what is being billed stays up top; the VAT treatment and the PO reference are set\n // once and rarely re-read, so they fold away on an existing line\n { name: 'lineOptions', type: 'section', alias: 'Tax & Reference', collapseOnView: true },\n { name: 'taxRateID', type: 'select', alias: 'Tax Rate', nullable: true, loadAction: { url: 'products/list/tax-rates' }, hidden: x => x.itemType !== 0, infoMessage: 'VAT rate for this line — Product/Service lines use their own tax setting', section: 'lineOptions' }, // Changed: manual (General) lines can now carry VAT\n { name: 'isTaxInclusive', type: 'checkbox', alias: 'Price includes Tax', hidden: x => x.itemType !== 0, infoMessage: 'If checked, the unit price already includes tax', section: 'lineOptions' }, // Changed: tax-inclusive flag for manual lines\n { name: 'poNumber', type: 'text', alias: 'PO Number', section: 'lineOptions' }, // Added: PO Number for invoice bundling\n ],\n loadAction: { url: 'invoiceitems/id' }, // Fixed: removed placeholder - TinCore appends ID automatically\n heroField: 'invoiceItemID',\n }\n\n invoiceItemEditButton: Button = { name: 'edit', dialog: true, action: { url: 'invoiceitems?action=edit', method: 'post' }, disabled: x => x.status != InvoiceStatus.Draft }\n\n // Invoice item details dialog config\n invoiceItemDetailsConfig: DetailsDialogConfig = {\n formConfig: this.invoiceItemsFormConfig,\n heroField: 'invoiceItemID',\n buttons: [\n this.invoiceItemEditButton\n ]\n }\n\n // Added: Move item form configuration - select destination invoice\n invoiceMoveItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] }, // Added: gate move-item form by invoices cap (parent entity)\n title: 'Move Item',\n fixedTitle: true,\n fields: [\n { name: 'invoiceItemID', type: 'number', hidden: true },\n { name: 'description', type: 'text', alias: 'Item', readonly: true, span: true }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n { name: 'invoiceID', type: 'select', alias: 'Move to Invoice', required: true, span: true, loadAction: { url: 'invoiceitems/list/draft-invoices' } }\n ],\n loadAction: { url: 'invoiceitems/id' }, // Fixed: removed placeholder - TinCore appends ID automatically\n heroField: 'invoiceItemID'\n }\n\n // Added: Move item details dialog config\n invoiceMoveItemDetailsConfig: DetailsDialogConfig = {\n formConfig: this.invoiceMoveItemFormConfig,\n heroField: 'invoiceItemID',\n mode: 'edit',\n buttons: [\n { name: 'move', display: 'Move Item', icon: { name: 'swap_horiz', color: 'blue' }, inDialog: true, action: { url: 'invoiceitems?action=move', method: 'post', successMessage: 'Item moved successfully' } }\n ]\n }\n\n // Invoice items table for manual line item entry\n invoiceItemsTableConfig: TableConfig = {\n tabTitle: 'Invoice Items',\n showFilter: false,\n minColumns: ['description', 'quantity', 'amount'],\n causeFormRefresh: true,\n columns: [\n { name: 'invoiceItemID', type: 'number', alias: 'ID', hidden: () => true },\n { name: 'description', type: 'chip', alias: 'Description', detailsConfig: this.invoiceItemDetailsConfig },\n { name: 'poNumber', type: 'text', alias: 'PO#' }, // Added: Purchase Order Number column\n { name: 'quantity', type: 'number', alias: 'Qty' },\n { name: 'netUnitPrice', type: 'money', alias: 'Unit Price' }, // Changed (inclusive-line-render): was unitPrice, which on a TAX-INCLUSIVE line is the gross rate the operator typed while Amount is stored net — so the row did not multiply (1 x 600.00 rendering an Amount of 521.74). NetUnitPrice is projected by InvoiceItemsController (TinWeb 23f5a0a) as Amount / Quantity, so Qty x Unit Price = Amount always reconciles; the typed gross is still kept on the record as unitPrice\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'taxAmount', type: 'money', alias: 'Tax' }, // Changed: Show per-item tax amount\n { name: 'lineTotal', type: 'money', alias: 'Total' } // Changed: Computed line total (amount + tax)\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'invoiceitems?action=create', method: 'post' }, disabled: x => x.status != InvoiceStatus.Draft },\n this.invoiceItemEditButton,\n { name: 'move', display: 'Move', dialog: true, icon: { name: 'swap_horiz' }, detailsConfig: this.invoiceMoveItemDetailsConfig, disabled: x => x.status != InvoiceStatus.Draft }, // Added: Move item button\n { name: 'delete', inDialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'invoiceitems?action=delete', method: 'post', successMessage: 'Deleted' }, confirm: { message: 'Delete this item?' }, disabled: x => x.status != InvoiceStatus.Draft },\n ],\n loadAction: { url: 'invoiceitems/x/x' }, loadCriteria: 'invoice', loadIDField: 'invoiceID',\n formConfig: this.invoiceItemsFormConfig // Changed: Reference extracted form config\n }\n\n // Invoice action buttons\n\n // Changed: the hand-rolled cap53 gate is now declared, not written. Every custom action is floored at Edit on\n // the controller's own capability (BaseController.CustomActionAccess), and InvoicesController raises\n // return/discard/write-off/provision to Full (InvoicesController.cs:540-546). capAccountingInvoices IS cap53,\n // which is BOTH InvoicesController.CapabilityName and InvoicePaymentsController's — so these read the same\n // column the server reads. `visible` is back to being about the ROW; the capability is about the ROLE.\n // Changed: `record-payment` opens a create dialog posting to invoicepayments?action=create, and BaseController\n // demands RoleAccess.Create for \"create\" (BaseController.cs:751) — NOT the Edit floor. It was wholly ungated:\n // a cap53 Edit holder was offered it and refused by the server.\n invoiceRecordPaymentButton: Button = { name: 'record-payment', display: 'Record Payment', dialog: true, icon: { name: 'payment', color: 'blue' }, capability: this.dataService.capAccountingInvoices, requiredAccess: RoleAccess.Create,\n detailsConfig : this.invoicePaymentsCreateDetailsDialogConfig,\n visible: x => (x.status == InvoiceStatus.Submitted || x.status == InvoiceStatus.Paying) && x.outstandingAmount > 0 // Changed: Allow on both Submitted and Paying\n } // Changed: Use detailsConfig to open payment form dialog\n\n invoiceDiscardButton: Button = { name: 'discard', inDialog: true, display: 'Discard', icon: { name: 'close', color: 'red' }, capability: this.dataService.capAccountingInvoices, requiredAccess: RoleAccess.Full,\n action: { url: 'invoices?action=discard', method: 'post', successMessage: 'Discarded' },\n confirm: { message: 'Invoice will be marked as cancelled?' },\n visible: x => x.status == InvoiceStatus.Draft // Changed: `discard` is one of the four actions InvoicesController raises to Full — now declared above\n }\n\n // Changed: Return button — reverts submitted invoice back to draft, reverses accounting transactions\n invoiceReturnButton: Button = { name: 'return', inDialog: true, display: 'Return', icon: { name: 'undo', color: 'orange' }, capability: this.dataService.capAccountingInvoices, requiredAccess: RoleAccess.Full,\n action: { url: 'invoices?action=return', method: 'post', successMessage: 'Returned to Draft' },\n confirm: { message: 'Return invoice to draft? This will reverse the receivable and VAT transactions.' },\n visible: x => x.status == InvoiceStatus.Submitted // Changed: `return` requires Full at the server — now declared above\n }\n\n // Changed: Write-off button — expenses outstanding balance as bad debt and closes the invoice (terminal WrittenOff status)\n invoiceWriteOffButton: Button = { name: 'write-off', inDialog: true, display: 'Write Off', icon: { name: 'money_off', color: 'red' }, capability: this.dataService.capAccountingInvoices, requiredAccess: RoleAccess.Full,\n action: { url: 'invoices?action=write-off', method: 'post' },\n confirm: { message: 'Outstanding balance will be expensed as bad debt and the invoice closed. This posts a GL journal.' },\n visible: x => (x.status == InvoiceStatus.Submitted || x.status == InvoiceStatus.Paying) // Changed: `write-off` requires Full at the server — now declared above\n }\n\n invoiceSubmitButton: Button = { name: 'submit', inDialog: true, display: 'Submit', icon: { name: 'send', }, capability: this.dataService.capAccountingInvoices, requiredAccess: RoleAccess.Edit,\n action: { url: 'invoices?action=submit', method: 'post', successMessage: 'Submitted' },\n confirm: { message: 'Submit invoice? This will record revenue and create an accounts receivable entry.' },\n visible: x => x.status == InvoiceStatus.Draft, // Changed: `submit` keeps the Edit floor — the comment on InvoicesController.CustomActionAccess says so explicitly\n disabled: x => x.totalAmount == 0\n }\n\n invoiceEditButton: Button = { name: 'edit', display: 'Save', dialog: true, action: { url: 'invoices?action=edit', method: 'post', },\n confirm: { message: 'Proceed ?' },\n visible: x => x.status == InvoiceStatus.Draft // Changed: Draft only\n }\n\n invoiceDownloadButton: Button = { name: 'pdf', display: 'Download PDF', inDialog: true, icon: { name: 'picture_as_pdf', color: 'red' } }\n\n // Invoice details dialog with items, payments history, and action buttons\n invoiceDetailsDialogConfig: DetailsDialogConfig = {\n formConfig: this.invoiceFormConfig,\n tableConfigs: [this.invoiceItemsTableConfig, this.invoicePaymentsTableConfig],\n heroField: 'invoiceID',\n buttons: [\n this.invoiceSubmitButton,\n this.invoiceRecordPaymentButton,\n this.invoiceReturnButton, // Changed: Return submitted invoice to draft\n this.invoiceWriteOffButton, // Changed: Write off outstanding balance as bad debt\n this.invoiceDiscardButton,\n this.invoiceEditButton,\n this.invoiceDownloadButton // Changed: Restored PDF download button in details dialog\n ]\n }\n\n invoiceViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.invoiceDetailsDialogConfig }\n\n // Invoice summary tiles\n invoicesTileConfig: TileConfig = {\n clickable: true,\n tiles: [\n { name: 'drafts', alias: 'Draft Invoices', color: '#FFC107', icon: 'edit_note', info: 'Invoices in draft stage', action: { url: 'invoices/drafts/x' } }, // Changed: Added icon\n { name: 'submitted', alias: 'Pending Payment', color: '#2196F3', icon: 'send', info: 'Submitted invoices awaiting payment', action: { url: 'invoices/submitted/x' } }, // Changed: Added icon\n { name: 'pendingPayments', alias: 'Outstanding', color: '#F44336', icon: 'payments', info: 'Total amount pending payment' } // Changed: Added icon\n ],\n loadAction: { url: 'invoices/summary/x' }\n }\n\n // Main invoices table configuration\n invoicesTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['invoiceNumber', 'customerName', 'statusName'],\n minButtons: ['view', 'pdf'],\n flatButtons: true,\n collapseButtons: true,\n greyOut: x => x.status == InvoiceStatus.Paid || x.status == InvoiceStatus.Discarded || x.status == InvoiceStatus.WrittenOff, // Changed: Grey out terminal statuses incl. WrittenOff\n columns: [\n { name: 'invoiceNumber', type: 'button', alias: 'Invoice #', detailsConfig : this.invoiceDetailsDialogConfig},\n { name: 'poNumbers', type: 'text', alias: 'PO #' }, // Changed: Added PO numbers as second column\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'invoiceDate', type: 'date' },\n { name: 'dueDate', type: 'date', alias: 'Due Date' },\n { name: 'daysOverdue', type: 'number', alias: 'Days Overdue',},\n { name: 'statusName', type: 'chip', alias: 'Status', detailsConfig : this.invoiceDetailsDialogConfig,\n colors: [\n { name: '#FFCC80', condition: x => x.status == InvoiceStatus.Draft }, \n { name: '#90CAF9', condition: x => x.status == InvoiceStatus.Submitted }, \n { name: '#FFD54F', condition: x => x.status == InvoiceStatus.Paying }, // Changed: Added Paying status color (amber/yellow)\n { name: '#A5D6A7', condition: x => x.status == InvoiceStatus.Paid },\n { name: '#EF9A9A', condition: x => x.status == InvoiceStatus.Discarded },\n { name: '#9E9E9E', condition: x => x.status == InvoiceStatus.WrittenOff } // Changed: Grey chip for written-off invoices\n ]\n },\n { name: 'itemCount', type: 'number', alias: 'Items', icon: { name: 'info', color: '#1976D2', condition: x => x.itemCount > 0, tipField: 'itemDescriptions' } }, // Changed: Info icon with item descriptions tooltip\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'paidAmount', type: 'money', alias: 'Paid' },\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding' }\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, onSuccessButton : this.invoiceViewButton,\n action: { url: 'invoices?action=create', method: 'post' } \n },\n // { name: 'view', dialog: true, detailsConfig: this.invoiceDetailsDialogConfig },\n this.invoiceSubmitButton,\n this.invoiceRecordPaymentButton,\n this.invoiceReturnButton, // Changed: Return submitted invoice to draft\n this.invoiceWriteOffButton, // Changed: Write off outstanding balance as bad debt\n // this.invoicePayButton,\n this.invoiceDiscardButton,\n // this.invoiceEditButton,\n this.invoiceDownloadButton, // Changed: Restored PDF button — minButtons references 'pdf' and InvoicesComponent handles the actionClick\n ],\n loadAction: { url: 'invoices/all/x' },\n formConfig: this.invoiceFormConfig,\n tileConfig: this.invoicesTileConfig,\n pagination: { pageSize: 15 }, // Added: server-side pagination — invoices are the widest, highest-volume grid in the suite (customer join + line totals + payments)\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — invoices are raised on site; create/edit queue to the outbox and drain on reconnect (delete stays off — voiding is a server-side reversal)\n entityName: 'Invoice',\n }\n\n //--------------------------Aging Report-------------------------\n\n // Added: Aging report summary tiles\n agingTileConfig: TileConfig = {\n // clickable: true,\n tiles: [\n { name: 'current', alias: 'Current', color: '#4CAF50', icon: 'check_circle', info: 'Not yet due' }, // Changed: Added icon\n { name: 'days30', alias: '1-30 Days', color: '#FFC107', icon: 'schedule', info: '1-30 days overdue' }, // Changed: Added icon\n { name: 'days60', alias: '31-60 Days', color: '#FF9800', icon: 'warning', info: '31-60 days overdue' }, // Changed: Added icon\n { name: 'days90', alias: '61-90 Days', color: '#F44336', icon: 'error', info: '61-90 days overdue' }, // Changed: Added icon\n { name: 'days90Plus', alias: '90+ Days', color: '#B71C1C', icon: 'dangerous', info: 'Over 90 days overdue' }, // Changed: Added icon\n { name: 'total', alias: 'Total Outstanding', color: '#9E9E9E', icon: 'account_balance_wallet', info: 'Total outstanding amount' } // Changed: Added icon\n ],\n // loadAction: { url: 'invoices/aging-summary/x' }\n }\n\n // Added: Base aging table configuration with common properties\n agingBaseTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['invoiceNumber', 'customerName', 'outstandingAmount'],\n columns: [\n { name: 'invoiceNumber', type: 'text', alias: 'Invoice #', detailsConfig : this.invoiceDetailsDialogConfig},\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'invoiceDate', type: 'date', alias: 'Invoice Date' },\n { name: 'dueDate', type: 'date', alias: 'Due Date' },\n { name: 'daysOverdue', type: 'number', alias: 'Days Overdue' },\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'paidAmount', type: 'money', alias: 'Paid' },\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding' }\n ],\n buttons: [\n { name: 'view', dialog: true, detailsConfig: this.invoiceDetailsDialogConfig },\n this.invoiceRecordPaymentButton,\n ]\n }\n\n //--------------------------Customer Invoices-------------------------\n\n // Customer invoice form without customerID field\n customerInvoiceFormConfig: FormConfig = {\n ...this.invoiceFormConfig,\n fields: this.invoiceFormConfig.fields.filter(x => ['customerID'].includes(x.name) == false),\n loadAction: { url: 'invoices/customer-id' }\n }\n\n // Customer invoice items table (read-only view)\n customerInvoiceItemsTableConfig: TableConfig = {\n ...this.invoiceItemsTableConfig,\n loadCriteria: 'customer-invoice',\n buttons: []\n }\n\n // Added: Customer invoice payments table (read-only)\n customerInvoicePaymentsTableConfig: TableConfig = {\n ...this.invoicePaymentsTableConfig,\n loadCriteria: 'customer-invoice'\n }\n\n // Customer invoice details dialog (read-only)\n customerInvoiceDetailsDialogConfig: DetailsDialogConfig = {\n formConfig: this.customerInvoiceFormConfig,\n tableConfigs: [this.customerInvoiceItemsTableConfig, this.customerInvoicePaymentsTableConfig],\n heroField: 'invoiceID',\n buttons: []\n }\n\n // Customer invoices table configuration\n // (WS-1) the spread inherits invoicesTableConfig's pagination AND offline, and the loadAction below is a second url on the same 'invoices' entity. Both urls now register: OfflineService.register() no longer early-returns on the second table claiming an entity, it adds that table's read urls to the existing entry. The entity's offline SETTINGS still come from whichever registered first — identical here, since this config spreads them.\n customerInvoicesTableConfig: TableConfig = {\n ...this.invoicesTableConfig,\n minColumns: ['invoiceNumber', 'totalDisplay'],\n minButtons: ['view', 'pdf'],\n columns: [...this.invoicesTableConfig.columns.filter(x => ['invoiceNumber', 'invoiceDate', 'dueDate', 'statusName', 'itemCount', 'totalAmount', 'paidAmount', 'outstandingAmount'].includes(x.name))],\n buttons: [{ name: 'view', dialog: true, detailsConfig: this.customerInvoiceDetailsDialogConfig }, this.invoiceDownloadButton],\n loadAction: { url: 'invoices/customer-all/x' }\n }\n\n //--------------------------Statement-------------------------\n\n // Changed: Statement form configuration (replaces Outstanding Invoices)\n statementFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingOutstandingInvoices] },\n title: 'Statement',\n fields: []\n }\n\n // Changed: Statement table configuration — default view with smart date filtering\n statementTableConfig: TableConfig = {\n holdHeaderButtonSpace: true,\n showFilter: true,\n minColumns: ['invoiceNumber', 'customerName', 'statusName'],\n flatButtons: true,\n columns: [\n { name: 'invoiceNumber', type: 'button', alias: 'Invoice #', detailsConfig: this.invoiceDetailsDialogConfig }, // Changed: Clickable to open invoice dialog\n { name: 'poNumbers', type: 'text', alias: 'PO #' }, // Changed: Moved to second column\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'invoiceDate', type: 'date', alias: 'Date' },\n { name: 'itemDescriptions', type: 'text', alias: 'Description', maxLength: 100 }, // Changed: Enforce max display length of 100 characters\n { name: 'totalAmount', type: 'money', alias: 'Amount' },\n { name: 'statusName', type: 'chip', alias: 'Status', detailsConfig: this.invoiceDetailsDialogConfig, // Changed: Clickable to open invoice dialog\n colors: [\n { name: '#90CAF9', condition: x => x.status == InvoiceStatus.Submitted },\n { name: '#FFD54F', condition: x => x.status == InvoiceStatus.Paying },\n { name: '#A5D6A7', condition: x => x.status == InvoiceStatus.Paid },\n { name: '#9E9E9E', condition: x => x.status == InvoiceStatus.WrittenOff } // Changed: Grey chip for written-off invoices on statement\n ]\n },\n ],\n buttons: [],\n loadAction: { url: 'invoices/statement/x' },\n formConfig: this.statementFormConfig\n }\n\n // Changed: Statement search table configuration — search mode with filters\n statementSearchTableConfig: TableConfig = {\n ...this.statementTableConfig,\n searchConfig: {\n fields: [\n { name: 'customerID', type: 'select', alias: 'Customer', show: true, loadAction: { url: 'customers/list/x' } },\n { name: 'dateFrom', type: 'date', alias: 'From Date', show: true },\n { name: 'dateTo', type: 'date', alias: 'To Date', show: true },\n { name: 'status', type: 'select', alias: 'Status', show: true,\n options: [\n { name: 'All', value: '' },\n { name: 'Submitted', value: InvoiceStatus.Submitted },\n { name: 'Paying', value: InvoiceStatus.Paying },\n { name: 'Paid', value: InvoiceStatus.Paid }\n ]\n }\n ],\n searchAction: { url: 'invoices/search?action=statement-search', method: 'post' }\n }\n }\n\n //--------------------------Open-item statement (customer / supplier)-------------------------\n // Added: the open-item statement was hand-written markup on the page (its own flex row of totals and its own\n // <table>). These configs move it onto spa-tiles + spa-table so it looks and behaves like every other page.\n // The figures the API returns are unrounded sums, hence format: 'money' on every tile.\n\n // Added: headline figures for the customer open-item statement\n customerStatementTileConfig: TileConfig = {\n tiles: [\n { name: 'totalInvoiced', alias: 'Total Invoiced', icon: 'receipt_long', color: '#2196f3', format: 'money', info: 'Everything invoiced in the period' },\n { name: 'totalPaid', alias: 'Total Paid', icon: 'payments', color: '#4CAF50', format: 'money', info: 'Receipts allocated against those invoices' },\n { name: 'totalCredited', alias: 'Total Credited', icon: 'undo', color: '#FF9800', format: 'money', info: 'Credit notes raised in the period' },\n { name: 'totalOutstanding', alias: 'Total Outstanding', icon: 'account_balance_wallet', format: 'money', color: x => (x?.totalOutstanding > 0 ? '#F44336' : '#4CAF50'), info: 'What the customer still owes' } // red while owing, green once settled — the colour the old hand-written card carried\n ]\n }\n\n // Added: headline figures for the supplier open-item statement (no credit notes on the purchase side)\n supplierStatementTileConfig: TileConfig = {\n tiles: [\n { name: 'totalPurchased', alias: 'Total Purchased', icon: 'shopping_cart', color: '#2196f3', format: 'money', info: 'Everything purchased on credit in the period' },\n { name: 'totalPaid', alias: 'Total Paid', icon: 'payments', color: '#4CAF50', format: 'money', info: 'Payments made against those purchases' },\n { name: 'totalOutstanding', alias: 'Total Outstanding', icon: 'account_balance_wallet', format: 'money', color: x => (x?.totalOutstanding > 0 ? '#F44336' : '#4CAF50'), info: 'What is still owed to the supplier' }\n ]\n }\n\n // Added: the statement lines themselves. Customer and supplier lines have the SAME shape, so one config serves\n // both — the page clones it per tab so the two grids never share mutable state.\n statementLinesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n noDataMessage: 'No open items for the selected period',\n minColumns: ['date', 'reference', 'outstanding'],\n columns: [\n { name: 'date', type: 'date', alias: 'Date' },\n { name: 'reference', type: 'text', alias: 'Reference' },\n { name: 'type', type: 'text', alias: 'Type' },\n { name: 'total', type: 'money', alias: 'Total' },\n { name: 'paid', type: 'money', alias: 'Paid' },\n { name: 'outstanding', type: 'money', alias: 'Outstanding' },\n { name: 'status', type: 'chip', alias: 'Status', // Changed: a chip, NOT type 'select' — a select column renders an editable dropdown, and a statement is read-only\n colors: [\n { name: '#A5D6A7', condition: x => x.status == 'Paid' },\n { name: '#FFD54F', condition: x => x.status == 'Paying' },\n { name: '#90CAF9', condition: x => x.status == 'Submitted' },\n { name: '#CE93D8', condition: x => x.status == 'Applied' },\n { name: '#9E9E9E', condition: x => x.status == 'Written Off' }\n ]\n },\n { name: 'agingBucket', type: 'text', alias: 'Aging' }\n ],\n buttons: []\n }\n\n //--------------------------Tax Rates-------------------------\n\n // Changed: Tax Rate form configuration for VAT management\n taxRateFormConfig: FormConfig = {\n security: { allow: [this.dataService.capTaxRates] }, // Added: gate tax rate form by tax rates cap\n title: 'Tax Rate',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, alias: 'Name' },\n { name: 'rate', type: 'number', required: true, alias: 'Rate (%)' },\n { name: 'kind', type: 'select', alias: 'Kind', defaultValue: 0, // Added: Phase 2 compliance — VAT kind classification\n options: [\n { name: 'Standard', value: 0 },\n { name: 'Zero Rated', value: 1 },\n { name: 'Exempt', value: 2 }\n ], optionDisplay: 'name', optionValue: 'value'\n },\n { name: 'isDefault', type: 'checkbox', alias: 'Default Rate' },\n { name: 'isActive', type: 'checkbox', alias: 'Active', defaultValue: true }\n ],\n loadAction: { url: 'taxrates/id' },\n heroField: 'taxRateID'\n }\n\n taxRateCreateButton: Button = { name: 'create', display: 'Create Tax Rate', dialog: true, action: { url: 'taxrates?action=create', method: 'post' } }\n taxRateEditButton: Button = { name: 'edit', dialog: true, action: { url: 'taxrates?action=edit', method: 'post' } }\n taxRateDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'taxrates?action=delete', method: 'post' } }\n\n taxRateDetailsConfig: DetailsDialogConfig = {\n formConfig: this.taxRateFormConfig,\n heroField: 'taxRateID',\n buttons: [this.taxRateCreateButton, this.taxRateEditButton, this.taxRateDeleteButton]\n }\n\n taxRatesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'rate', 'isActive'],\n columns: [\n { name: 'name', type: 'text', alias: 'Name' },\n { name: 'rate', type: 'number', alias: 'Rate (%)' },\n { name: 'kindName', type: 'text', alias: 'Kind' }, // Added: Phase 2 compliance — VAT kind (Standard/Zero Rated/Exempt)\n { name: 'isDefault', type: 'checkbox', alias: 'Default' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' }\n ],\n buttons: [\n this.taxRateCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.taxRateDetailsConfig },\n this.taxRateEditButton,\n this.taxRateDeleteButton\n ],\n loadAction: { url: 'taxrates/all/x' },\n formConfig: this.taxRateFormConfig,\n realTime: true,\n entityName: 'TaxRate'\n }\n\n //--------------------------Currencies-------------------------\n\n // Changed: Currency form configuration for multi-currency management\n currencyFormConfig: FormConfig = {\n security: { allow: [this.dataService.capCurrencies] }, // Added: gate currency form by currencies cap\n title: 'Currency',\n includeAudit: true,\n fields: [\n { name: 'code', type: 'text', required: true, alias: 'Code' },\n { name: 'name', type: 'text', required: true, alias: 'Name' },\n { name: 'symbol', type: 'text', required: true, alias: 'Symbol' },\n { name: 'exchangeRate', type: 'number', required: true, alias: 'Exchange Rate' },\n { name: 'isBase', type: 'checkbox', alias: 'Base Currency',\n readonlyCondition: (x: any) => x.isBase // Changed: Prevent unchecking base currency\n }\n ],\n loadAction: { url: 'currencies/id' },\n heroField: 'currencyID'\n }\n\n currencyCreateButton: Button = { name: 'create', display: 'Create Currency', dialog: true, action: { url: 'currencies?action=create', method: 'post' } }\n currencyEditButton: Button = { name: 'edit', dialog: true, action: { url: 'currencies?action=edit', method: 'post' } }\n currencyDeleteButton: Button = { name: 'delete', dialog: true, action: { url: 'currencies?action=delete', method: 'post' } }\n\n currencyDetailsConfig: DetailsDialogConfig = {\n formConfig: this.currencyFormConfig,\n heroField: 'currencyID',\n buttons: [this.currencyCreateButton, this.currencyEditButton, this.currencyDeleteButton]\n }\n\n currenciesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['code', 'name', 'exchangeRate'],\n columns: [\n { name: 'code', type: 'text', alias: 'Code' },\n { name: 'name', type: 'text', alias: 'Currency' },\n { name: 'symbol', type: 'text', alias: 'Symbol' },\n { name: 'exchangeRate', type: 'number', alias: 'Rate' },\n { name: 'isBase', type: 'checkbox', alias: 'Base' }\n ],\n buttons: [\n this.currencyCreateButton,\n { name: 'revalue', display: 'Run Revaluation', inHeader: true, icon: { name: 'currency_exchange' }, action: { url: 'currencies/revalue/x' }, confirm: { message: 'Revalue all foreign currency accounts at current rates? Unrealized gains/losses will be posted to the ledger.' } }, // Changed: C6 forex revaluation run\n { name: 'view', dialog: true, detailsConfig: this.currencyDetailsConfig },\n this.currencyEditButton,\n this.currencyDeleteButton\n ],\n loadAction: { url: 'currencies/all/x' },\n formConfig: this.currencyFormConfig,\n realTime: true,\n entityName: 'Currency'\n }\n\n //--------------------------Transaction Types-------------------------\n\n transactionTypeFormConfig: FormConfig = {\n security: { allow: [this.dataService.capTransactionTypes] },\n title: 'Financial Transaction Type',\n fields: [\n { name: 'name', type: 'text', required: true, span: true },\n { name: 'debitAccountType', type: 'select', alias: 'Debit Account Type', required: true, \n loadAction: { url: 'accounts/list/accountTypes' } \n },\n { name: 'creditAccountType', type: 'select', alias: 'Credit Account Type', required: true, \n loadAction: { url: 'accounts/list/accountTypes' } \n },\n { name: 'defaultDebitAccountID', type: 'select', alias: 'Default Debit Account', nullable: true, masterField: 'debitAccountType', masterOptionValue: 'type', \n loadAction: { url: 'accounts/list/x' }, \n detailsConfig: this.accountBaseDetailsConfig \n },\n { name: 'defaultCreditAccountID', type: 'select', alias: 'Default Credit Account', nullable: true, masterField: 'creditAccountType', masterOptionValue: 'type', \n loadAction: { url: 'accounts/list/x' }, \n detailsConfig: this.accountBaseDetailsConfig \n },\n ],\n loadAction: { url: 'transactiontypes/id' },\n heroField: 'transactionTypeID',\n }\n\n transactionTypeCreateButton: Button = { name: 'create', display: 'Create', dialog: true, action: { url: 'transactiontypes?action=create', method: 'post' } }\n transactionTypeEditButton: Button = { name: 'edit', dialog: true, action: { url: 'transactiontypes?action=edit', method: 'post' } }\n\n transactionTypeDetailsConfig: DetailsDialogConfig = {\n formConfig: this.transactionTypeFormConfig,\n heroField: 'transactionTypeID',\n buttons: [\n this.transactionTypeCreateButton, this.transactionTypeEditButton\n ]\n }\n\n transactionTypesTableConfig: TableConfig = {\n\n showFilter: true,\n minColumns: ['name', 'debitAccountName', 'creditAccountName'],\n flatButtons: true,\n columns: [\n { name: 'transactionTypeID', type: 'text', alias: 'ID' },\n { name: 'name', type: 'text' },\n { name: 'debitAccountTypeName', type: 'text', alias: 'Debit Type' },\n { name: 'creditAccountTypeName', type: 'text', alias: 'Credit Type' },\n { name: 'defaultDebitAccountName', type: 'text', alias: 'Default Debit Account' },\n { name: 'defaultCreditAccountName', type: 'text', alias: 'Default Credit Account' }\n ],\n buttons: [\n this.transactionTypeCreateButton,\n { name: 'seed', display: 'Seed Financial Data', inHeader: true, icon: { name : 'add_circle' }, action: { url: 'transactiontypes/seed/x' }, confirm: { message: 'Seed generic financial accounts and transaction types?' } }, // Changed: Use GET endpoint via criteria\n { name: 'view', dialog: true },\n this.transactionTypeEditButton,\n { name: 'delete', dialog: true, action: { url: 'transactiontypes?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'transactiontypes/all/x' },\n formConfig: this.transactionTypeFormConfig,\n entityName: 'TransactionType'\n }\n\n //--------------------------Transactions-------------------------\n\n transactionFormConfig: FormConfig = {\n security: { allow: [this.dataService.capTransactions] },\n title: 'Financial Transaction',\n fixedTitle : true,\n fields: [\n { name: 'transactionTypeID', type: 'text-single', alias: 'Transaction Type', required: true, detailsConfig: this.transactionTypeDetailsConfig, \n loadAction: { url: 'transactionTypes/list/x' },\n },\n { name: 'date', type: 'date', max: 'today', required: true }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n\n { name: 'debitAccountID', type: 'select', alias: 'Debit Account', required: true,\n masterField: 'transactionTypeID', masterValueField: 'debitAccountType', masterDefaultValueField: 'defaultDebitAccountID', masterOptionValue: 'type', \n loadAction: { url: 'accounts/list/x' }, \n detailsConfig: this.accountBaseDetailsConfig \n },\n { name: 'creditAccountID', type: 'select', alias: 'Credit Account', required: true,\n masterField: 'transactionTypeID', masterValueField: 'creditAccountType', masterDefaultValueField: 'defaultCreditAccountID', masterOptionValue: 'type', \n loadAction: { url: 'accounts/list/x' }, \n detailsConfig: this.accountBaseDetailsConfig \n },\n \n { name: 'description', type: 'text', required: true, span: true },\n { name: 'amount', type: 'money', required: true, span: true },\n // Changed: Removed currencyID and foreignAmount fields — backend auto-detects currency from accounts\n ],\n\n }\n\n\n transactionEditButton: Button = { name: 'edit', dialog: true, \n action: { url: 'transactions/dto?action=edit', method: 'post' },\n visible: x => x.canEdit && !x.isReversal\n }\n\n\n transactionVoidButton: Button = { name: 'void', display: 'Void', icon : { name: 'undo', color: 'red' },\n confirm: { message: 'Are you sure you want to void this transaction? This cannot be undone.' },\n action: { url: 'transactions?action=void', method: 'post' },\n visible: x => x.canVoid\n }\n\n transactionDetailsConfig: DetailsDialogConfig = {\n formConfig: this.transactionFormConfig,\n heroField: 'transactionID',\n buttons: [\n this.transactionEditButton,\n ]\n }\n\n\n // Added (journal-dialog-conform): the multi-line journal, rebuilt from library pieces. It replaces a hand-rolled\n // MatDialog (JournalEntryDialogComponent) that drew its own header fields, its own Account/Debit/Credit grid and its\n // own footer, so it inherited none of the house dialog styling. Nothing here is bespoke: it is the standard details\n // dialog (form + nested tab) plus the one-step-create path, exactly as customerDetailsConfig captures contacts.\n //\n // WHY IT EXISTS AT ALL, since Create Transaction posts to the SAME endpoint and the SAME DTO: transactionFormConfig\n // above has exactly ONE debitAccountID and ONE creditAccountID, so it can only produce a two-line pair. A journal is\n // the N-line general case. TransactionDto.Entries is an optional extra on the same DTO — when it carries >= 2 balanced\n // lines the engine posts all of them as one transaction and ignores Amount/DebitAccountID/CreditAccountID.\n // Added (journal-dialog-conform, Arbiter ruling 4122): the balance invariant, read off the lines the dialog is\n // holding in memory. AccountingService.CreateJournalTransaction (Sharp\\TinWeb\\Services\\Accounting\\AccountingService.cs:515)\n // refuses a journal unless debits EXACTLY equal credits; until now that refusal arrived at the end of the flow,\n // after the operator had typed everything. This is the same rule, stated inline while they type.\n // A line whose Dr/Cr has not been answered yet counts as NEITHER — it is not evidence of a credit.\n private journalTotals(parent: any): { debits: number, credits: number, difference: number, count: number, hasDebit: boolean, hasCredit: boolean } {\n const lines: any[] = Array.isArray(parent?.entries) ? parent.entries : [];\n let debits = 0, credits = 0, hasDebit = false, hasCredit = false;\n for (const line of lines) {\n const amount = Number(line?.amount) || 0;\n const isDebit = line?.isDebit;\n if (isDebit === true || isDebit === 'true') { debits += amount; hasDebit = true; }\n else if (isDebit === false || isDebit === 'false') { credits += amount; hasCredit = true; }\n }\n return { debits, credits, difference: debits - credits, count: lines.length, hasDebit, hasCredit };\n }\n\n // Minor units, so a difference of exactly zero is decidable — 0.1 + 0.2 - 0.3 is not 0 in doubles and this\n // predicate gates a button, so \"nearly balanced\" has to be a definite answer\n private journalOutBy(parent: any): number { return Math.round(this.journalTotals(parent).difference * 100); }\n\n private journalMoney(value: number): string { return (value || 0).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }\n\n // Added (journal-account-names): the ONE array instance the Account COLUMN holds. It is filled IN PLACE (never\n // reassigned) from the accounts the Account FIELD below already fetches, because the column's options are handed to\n // spa-select-lite as a plain [options] input — a replaced reference would be a new input the cell never re-reads,\n // while a mutated one is picked up by the panel's own ngFor differ on the next change-detection pass.\n private journalAccountOptions: any[] = [];\n\n // Added (journal-account-names): pre-created deliberately. select-common.component.ts:375 only CREATES an\n // optionsSubject when the field has none, and form.component.ts:80 does the same — so a subject placed here is the\n // one both of them reuse, and `next()` on a successful accounts/list/x read lands in the constructor subscription\n // below. This keeps the column in step when the operator adds an account from inside the line dialog (the field's\n // quick-add refetches and re-emits here); it CANNOT be the only source — see loadJournalAccounts.\n private journalAccountOptionsSubject = new BehaviorSubject<any[]>([]);\n\n // Added (journal-account-names): the array MUST already be filled before the journal dialog is opened, and this is\n // the non-obvious part of the whole fix. dialog.service.ts:137 deep-clones the whole detailsConfig on the click\n // (`Core.getClone(button.detailsConfig)`, the treat-5 isolation fix), so the dialog's table gets a COPY of this\n // array, not this array. Anything that lands here after that click — including the line dialog's own accounts read\n // — lands on an object the open dialog is no longer looking at, and the cell renders BLANK, which is worse than the\n // raw id it replaced. Measured, not theorised: with only the optionsSubject mirror the cell's mat-select had 0\n // options while this array held 40. So the list is fetched ONCE per session, off login, ahead of any click.\n private journalAccountsLoaded = false;\n\n journalLineFormConfig: FormConfig = {\n title: 'Journal Line',\n fixedTitle: true, // the header renders \"{titleAction} {title}\" and titleAction is the create button's display, so without this the dialog read \"Add Line Journal Line\"\n fields: [\n { name: 'accountID', type: 'select', alias: 'Account', required: true, loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountBaseDetailsConfig, optionsSubject: this.journalAccountOptionsSubject },\n { name: 'isDebit', type: 'select', alias: 'Dr / Cr', required: true, options: [{ name: 'Debit', value: true }, { name: 'Credit', value: false }] },\n { name: 'amount', type: 'money', required: true },\n ]\n }\n\n // The field names are TransactionEntryDto's own (accountID / isDebit / amount) because local rows are POSTed to the\n // server verbatim as the parent's `entries` array — a friendlier debit/credit column pair would not deserialize.\n journalLinesTableConfig: TableConfig = {\n tabTitle: 'Journal Lines',\n showFilter: false,\n minColumns: ['accountID', 'isDebit', 'amount'],\n columns: [\n // Changed (journal-account-names): was `type: 'number'`, which rendered the raw foreign key — a posted line read\n // \"18\", not \"Bank\". These rows are held in memory by the one-step-create path and POSTed verbatim, so unlike a\n // server-loaded grid there is no projected accountName on the row to show instead. A 'select' column with\n // options/optionDisplay/optionValue is the library's existing answer (Classes.ts:681-711) and the sibling\n // Dr / Cr column below already proves that render path in this exact table.\n { name: 'accountID', type: 'select', alias: 'Account', options: this.journalAccountOptions, optionDisplay: 'name', optionValue: 'value' },\n { name: 'isDebit', type: 'select', alias: 'Dr / Cr', options: [{ name: 'Debit', value: true }, { name: 'Credit', value: false }], optionDisplay: 'name', optionValue: 'value' },\n { name: 'amount', type: 'money' },\n ],\n buttons: [\n { name: 'create', display: 'Add Line', dialog: true },\n { name: 'edit', icon: { name: 'edit' } },\n { name: 'delete', icon: { name: 'delete', color: 'red' }, confirm: { message: 'Remove this journal line?' } },\n ],\n inlineEdit: { fields: ['accountID', 'isDebit', 'amount'] }, // edit a line in place; every editable field has a column, which is what canEditInline() requires\n createConfig: { navigationProperty: 'entries' }, // one-step capture — lines live on the parent model and POST with it as TransactionDto.Entries\n // Added (Arbiter 4122): the running Debits · Credits · Difference readout. It rebuilds at the table's ONE\n // row choke point (the dataSource setter calls buildSectionHeader), and refreshLocalData reassigns dataSource\n // on every local add / inline edit / delete — so it is live without a single template-bound getter.\n // It names the REMEDY, not just the gap: an operator who is out by 50 wants to know which side to add it to.\n caption: (parent: any) => {\n const totals = this.journalTotals(parent);\n if (!totals.count) return 'A journal needs at least two lines, and its debits must equal its credits exactly.';\n const head = `Debits ${this.journalMoney(totals.debits)} · Credits ${this.journalMoney(totals.credits)} · Difference ${this.journalMoney(Math.abs(totals.difference))}`;\n if (Math.round(totals.difference * 100) !== 0) return `${head} — add ${this.journalMoney(Math.abs(totals.difference))} of ${totals.difference > 0 ? 'credits' : 'debits'} to balance.`;\n if (totals.count < 2) return `${head} — balanced, but a journal needs at least two lines.`;\n if (!totals.hasDebit || !totals.hasCredit) return `${head} — every line needs a Dr / Cr answer.`;\n return `${head} — balanced and ready to post.`;\n },\n formConfig: this.journalLineFormConfig,\n entityName: 'Journal Line'\n }\n\n journalFormConfig: FormConfig = {\n security: { allow: [this.dataService.capTransactions] },\n title: 'Journal Entry',\n fixedTitle: true,\n fields: [\n { name: 'transactionTypeID', type: 'text-single', alias: 'Journal Type', required: true, loadAction: { url: 'transactionTypes/list/x' }, detailsConfig: this.transactionTypeDetailsConfig },\n { name: 'date', type: 'date', max: 'today', required: true, defaultValue: 'now' }, // same bound as a transaction — a journal records what has already happened\n { name: 'description', type: 'text', required: true, span: true },\n ]\n }\n\n // Named 'create' because the local-rows path pushes only on that name, and because it is the dialog's submit action\n // Added (Arbiter 4122): `disabled` turns the server's end-of-flow refusal into an inline invariant — the button\n // simply cannot be pressed while the journal does not balance. Mirrors CreateJournalTransaction's own gates\n // (AccountingService.cs:485-530): at least two lines, at least one debit AND one credit, debits === credits.\n // detailsDialog.component now evaluates this live (createDisabled()); `tip` renders as the tooltip that explains\n // the block, so a greyed-out button is never a dead end.\n journalPostButton: Button = { name: 'create', display: 'Post Journal', tip: 'A journal can only be posted once its debits equal its credits exactly, over at least two lines.',\n disabled: x => { const totals = this.journalTotals(x); return totals.count < 2 || !totals.hasDebit || !totals.hasCredit || this.journalOutBy(x) !== 0 },\n action: { url: 'transactions/dto?action=create', method: 'post' }\n }\n\n journalDetailsConfig: DetailsDialogConfig = {\n formConfig: this.journalFormConfig,\n mode: 'create', // load-bearing: this is what puts the dialog (and therefore its nested lines tab) on the one-step create path, since the opening button cannot be named 'create' — transactionsTableConfig already has one and tables resolve that button by name\n tableConfigs: [this.journalLinesTableConfig],\n buttons: [this.journalPostButton]\n }\n\n // inHeader puts it in line with Create Transaction in the table header — never floating on the app shell\n // Changed (Arbiter 4122): \"New Journal\" alone did not say what it was FOR next to \"Create Transaction\", and the\n // two were indistinguishable at a glance. The label now carries the one thing that separates them — line count.\n journalCreateButton: Button = { name: 'journal', display: 'New Journal (Multi-Line)', tip: 'Three or more lines, or several debits and credits, entered together and balanced', icon: { name: 'library_books' }, inHeader: true, dialog: true, detailsConfig: this.journalDetailsConfig, capability: this.dataService.capTransactions, requiredAccess: RoleAccess.Create }\n\n transactionsTableConfig: TableConfig = {\n showFilter: true,\n greyOut: x => x.isReversal || x.status == 1,\n minColumns: ['date', 'description', 'amountDisplay'],\n flatButtons: true,\n columns: [\n { name: 'date', type: 'date' },\n { name: 'description', type: 'text',\n colors: [\n { name: 'purple', condition: x => x.isReversal },\n { name: 'red', condition: x => x.status == 1 },\n ],\n },\n\n { name: 'typeName', type: 'text', alias: 'Type' },\n { name: 'debitAccountName', type: 'text', alias: 'Debit Account' },\n { name: 'creditAccountName', type: 'text', alias: 'Credit Account' },\n { name: 'amountDisplay', type: 'text', alias: 'Amount', // Changed: Single formatted column replacing CCY, Amount, Foreign Amount\n color: { name: 'red', condition: x => x.reducesBalance && !x.isAggregate },\n },\n ],\n buttons: [\n // Changed (Arbiter 4122): relabelled from \"Create Transaction\" so the pair reads as a choice. This form has\n // exactly one debit slot and one credit slot, which is the whole difference from the journal beside it.\n { name: 'create', display: 'New Transaction (1 Dr / 1 Cr)', tip: 'One debit and one credit — the everyday two-line entry', dialog: true, action: { url: 'transactions/dto?action=create', method: 'post' } },\n this.journalCreateButton, // Added (journal-dialog-conform): sits in the table header beside Create Transaction — was a floating button on the app shell\n { name: 'view', dialog: true, detailsConfig: this.transactionDetailsConfig },\n this.transactionEditButton,\n this.transactionVoidButton,\n ],\n loadAction: { url: 'transactions/all/x' },\n formConfig: this.transactionFormConfig,\n import: { entity: 'transactions', title: 'Import Transactions', securityConfig: { allow: [this.dataService.capTransactions] } }, // Changed (4b): the generic import wizard replaces the bespoke transaction-import dialog/controller/service\n realTime: true,\n entityName: 'Transaction',\n pagination: { pageSize: 15 }, // Added: tier A — the heaviest grid in accounting, and unbounded. Safe now that TransactionsController overrides GetAllPaged; before that, paging would have bypassed FormatAmountDisplay and shipped unformatted amounts\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: transactions are captured in the field (expenses on the road), so creates/edits queue and sync on reconnect\n allowUserKeepOpen: true, // Added: shows Keep Open checkbox on transaction dialogs\n keepOpenBehavior: 'reset', // Added: reset form after create so user can capture next transaction\n }\n\n\n // Changed: Search mode config for transactions — date range, description contains, account filter\n transactionSearchTableConfig: TableConfig = {\n ...this.transactionsTableConfig,\n searchConfig: {\n fields: [\n { name: 'dateFrom', type: 'date', alias: 'From Date', show: true },\n { name: 'dateTo', type: 'date', alias: 'To Date', show: true },\n { name: 'description', type: 'text', alias: 'Description', show: true },\n { name: 'accountID', type: 'select', alias: 'Account', show: true, loadAction: { url: 'accounts/list/x' } },\n { name: 'typeName', type: 'text-single', alias: 'Transaction Type', show: true, loadAction: { url: 'transactiontypes/list/x' } }, // Changed: text-single for type-to-search autocomplete\n ],\n searchAction: { url: 'transactions/search', method: 'post' }\n }\n }\n\n // (WS-1) this spread inherits transactionsTableConfig's pagination AND offline, and the url below is rewritten per account. That used to leave it outside the offline read registry; it no longer does — OfflineService.registerReads() registers the prefix 'transactions/account/' off loadCriteria, so EVERY account's tab matches, each cached under its own url. No change needed here.\n accountTransactionsTableConfig: TableConfig = {\n ...this.transactionsTableConfig,\n causeFormRefresh: true,\n minColumns: ['date', 'description', 'amountDisplay', 'runningBalance'], // Changed: Use amountDisplay instead of amount\n tabTitle: 'Account Transactions',\n loadAction: { url: 'transactions/account/x' }, loadCriteria: 'account', loadIDField: 'accountID',\n columns: [\n ...this.transactionsTableConfig.columns!,\n { name: 'runningBalance', type: 'money', alias: 'Balance' }\n ],\n };\n\n //--------------------------Transaction Templates-------------------------\n\n // Template form configuration (accountID hidden - auto-populated from context)\n transactionTemplateFormConfig: FormConfig = {\n security: { allow: [this.dataService.capTransactions] },\n title: 'Transaction Template',\n includeAudit: true,\n // Changed: sectioned — the template's identity stays visible, the values it pre-fills group under one\n // heading (the 'blank' spacer is no longer needed, the section header breaks the row)\n fields: [\n { name: 'name', type: 'text', required: true, span: true },\n { name: 'accountID', type: 'number', hidden: true }, // Auto-populated from Account Details context\n { name: 'transactionTypeID', type: 'select', alias: 'Transaction Type', required: true, detailsConfig: this.transactionTypeDetailsConfig, loadAction: { url: 'transactionTypes/list/x' } },\n\n { name: 'defaults', type: 'section', alias: 'Default Values', collapseOnView: true },\n { name: 'debitAccountID', type: 'select', alias: 'Default Debit Account', nullable: true, masterField: 'transactionTypeID', masterValueField: 'debitAccountType', masterDefaultValueField: 'defaultDebitAccountID', masterOptionValue: 'type', loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountBaseDetailsConfig, section: 'defaults' },\n { name: 'creditAccountID', type: 'select', alias: 'Default Credit Account', nullable: true, masterField: 'transactionTypeID', masterValueField: 'creditAccountType', masterDefaultValueField: 'defaultCreditAccountID', masterOptionValue: 'type', loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountBaseDetailsConfig, section: 'defaults' },\n { name: 'description', type: 'text', alias: 'Default Description', span: true, section: 'defaults' },\n { name: 'defaultAmount', type: 'money', alias: 'Default Amount', span: true, section: 'defaults' },\n ],\n loadAction: { url: 'transactiontemplates/id' },\n heroField: 'transactionTemplateID',\n }\n\n // Process form configuration (convert template to transaction)\n transactionTemplateProcessFormConfig: FormConfig = {\n security: { allow: [this.dataService.capTransactions] }, // Added: gate transaction template process form by transactions cap\n title: 'Create Transaction from Template',\n fixedTitle: true,\n fields: [\n { name: 'transactionTemplateID', type: 'number', hidden: true },\n { name: 'name', type: 'text', alias: 'Template', readonly: true, span : true }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n { name: 'transactionTypeID', type: 'select', alias: 'Transaction Type', required: true, detailsConfig: this.transactionTypeDetailsConfig, loadAction: { url: 'transactionTypes/list/x' } },\n { name: 'date', type: 'date', max: 'today', required: true, defaultValue: 'now' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'debitAccountID', type: 'select', alias: 'Debit Account', required: true, masterField: 'transactionTypeID', masterValueField: 'debitAccountType', masterOptionValue: 'type', loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountBaseDetailsConfig },\n { name: 'creditAccountID', type: 'select', alias: 'Credit Account', required: true, masterField: 'transactionTypeID', masterValueField: 'creditAccountType', masterOptionValue: 'type', loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountBaseDetailsConfig },\n { name: 'description', type: 'text', required: true, span: true },\n { name: 'amount', type: 'money', required: true, span: true },\n ],\n }\n\n // Template action buttons\n transactionTemplateCreateButton: Button = { name: 'create', display: 'Create Template', dialog: true, action: { url: 'transactiontemplates?action=create', method: 'post' } }\n transactionTemplateEditButton: Button = { name: 'edit', dialog: true, action: { url: 'transactiontemplates?action=edit', method: 'post' } }\n\n // Template details config (for view/edit)\n transactionTemplateDetailsConfig: DetailsDialogConfig = {\n formConfig: this.transactionTemplateFormConfig,\n heroField: 'transactionTemplateID',\n buttons: [this.transactionTemplateCreateButton, this.transactionTemplateEditButton]\n }\n\n // Process details config (for processing template)\n transactionTemplateProcessDetailsConfig: DetailsDialogConfig = {\n formConfig: this.transactionTemplateProcessFormConfig,\n heroField: 'transactionTemplateID',\n mode : 'edit',\n buttons: [\n { name: 'process', display: 'Create Transaction', icon: { name: 'play_arrow', color: 'green' }, inDialog: true,\n action: { url: 'transactiontemplates/dto?action=process', method: 'post', \n successMessage: 'Transaction created from template' } \n }\n ]\n }\n\n // Templates table configuration (3rd tab in Account Details)\n transactionTemplatesTableConfig: TableConfig = {\n tabTitle: 'Transaction Templates',\n showFilter: true,\n minColumns: ['name', 'transactionTypeName', 'defaultAmountDisplay'],\n flatButtons: true,\n columns: [\n { name: 'name', type: 'button', detailsConfig: this.transactionTemplateProcessDetailsConfig },\n { name: 'transactionTypeName', type: 'text', alias: 'Type' },\n { name: 'debitAccountName', type: 'text', alias: 'Debit Account' },\n { name: 'creditAccountName', type: 'text', alias: 'Credit Account' },\n { name: 'defaultAmountDisplay', type: 'text', alias: 'Default Amount' },\n ],\n buttons: [\n this.transactionTemplateCreateButton,\n { name: 'process', display: 'Create Transaction', icon: { name: 'play_arrow', color: 'green' }, dialog: true, detailsConfig: this.transactionTemplateProcessDetailsConfig },\n { name: 'view', dialog: true, detailsConfig: this.transactionTemplateDetailsConfig },\n { name: 'edit', dialog: true, action: { url: 'transactiontemplates?action=edit', method: 'post' }, detailsConfig: this.transactionTemplateDetailsConfig }, // Changed: Inline edit button with both action and detailsConfig\n { name: 'delete', inDialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'transactiontemplates?action=delete', method: 'post', successMessage: 'Template deleted' }, confirm: { message: 'Delete this template?' } },\n ],\n loadAction: { url: 'transactiontemplates/account/x' }, loadCriteria: 'account', loadIDField: 'accountID',\n formConfig: this.transactionTemplateFormConfig\n }\n\n //--------------------------Standing Orders-------------------------\n\n // Standing order form configuration — schedule recurring transactions linked to templates\n standingOrderFormConfig: FormConfig = {\n security: { allow: [this.dataService.capStandingOrders] }, // Changed: Use cap64 (standing orders) to match backend StandingOrdersController gate\n title: 'Standing Order',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, span: true, alias: 'Name' },\n { name: 'transactionTemplateID', type: 'select', required: true, alias: 'Transaction Template', loadAction: { url: 'transactiontemplates/list/x' }, detailsConfig: this.transactionTemplateDetailsConfig }, // Changed: dropdown quick-add\n { name: 'frequency', type: 'select', required: true, alias: 'Frequency',\n options: [\n { name: 'Daily', value: 1 },\n { name: 'Weekly', value: 2 },\n { name: 'Monthly', value: 3 }\n ]\n },\n { name: 'dayOfMonth', type: 'number', alias: 'Day of Month (1-28)', min: 1, max: 28, nullable: true,\n hidden: (x: any) => x.frequency !== 3 },\n { name: 'dayOfWeek', type: 'select', alias: 'Day of Week', nullable: true,\n hidden: (x: any) => x.frequency !== 2,\n options: [\n { name: 'Sunday', value: 0 }, { name: 'Monday', value: 1 },\n { name: 'Tuesday', value: 2 }, { name: 'Wednesday', value: 3 },\n { name: 'Thursday', value: 4 }, { name: 'Friday', value: 5 },\n { name: 'Saturday', value: 6 }\n ]\n },\n { name: 'isActive', type: 'checkbox', alias: 'Active', defaultValue: true },\n\n // Changed: sectioned — what runs and how often stays up top; the window it runs in and the amount\n // override are set once, so they fold away and leave the execution-history tab in view\n { name: 'schedule', type: 'section', alias: 'Schedule & Amount', collapseOnView: true },\n { name: 'startDate', type: 'date', required: true, alias: 'Start Date', section: 'schedule' },\n { name: 'endDate', type: 'date', alias: 'End Date', nullable: true, section: 'schedule' },\n { name: 'amount', type: 'money', alias: 'Amount (leave blank to use template default)', nullable: true, span: true, section: 'schedule' }\n ],\n loadAction: { url: 'standingorders/id' },\n heroField: 'standingOrderID'\n }\n\n // Execution history child table — shows all execution attempts for a standing order\n standingOrderExecutionsTableConfig: TableConfig = {\n tabTitle: 'Execution History',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n minColumns: ['executionDate', 'success', 'message'],\n columns: [\n { name: 'executionDate', type: 'date', alias: 'Date' },\n { name: 'executedAt', type: 'datetime', alias: 'Executed At' },\n { name: 'success', type: 'checkbox', alias: 'Success' },\n { name: 'isManual', type: 'checkbox', alias: 'Manual' },\n { name: 'message', type: 'text', alias: 'Result' },\n { name: 'transactionID', type: 'number', alias: 'Transaction ID' }\n ],\n buttons: [],\n loadAction: { url: 'standingorderexecutions/order/x' }, loadCriteria: 'order', loadIDField: 'standingOrderID'\n }\n\n // Standing order action buttons\n standingOrderCreateButton: Button = { name: 'create', display: 'Create Standing Order', dialog: true, action: { url: 'standingorders?action=create', method: 'post' } }\n standingOrderEditButton: Button = { name: 'edit', dialog: true, action: { url: 'standingorders?action=edit', method: 'post' } }\n standingOrderDeleteButton: Button = { name: 'delete', inDialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'standingorders?action=delete', method: 'post', successMessage: 'Standing order deleted' }, confirm: { message: 'Delete this standing order?' } }\n standingOrderExecuteButton: Button = { name: 'execute', display: 'Run Now', icon: { name: 'play_arrow', color: 'green' }, inDialog: true, action: { url: 'standingorders?action=execute', method: 'post', successMessage: 'Standing order executed' }, confirm: { message: 'Manually trigger this standing order now?' }, visible: (x: any) => x.isActive }\n standingOrderPauseButton: Button = { name: 'toggle', display: 'Pause', inDialog: true, icon: { name: 'pause', color: 'orange' }, action: { url: 'standingorders?action=toggle', method: 'post', successMessage: 'Standing order paused' }, visible: (x: any) => x.isActive }\n standingOrderResumeButton: Button = { name: 'toggle', display: 'Resume', inDialog: true, icon: { name: 'play_arrow', color: 'green' }, action: { url: 'standingorders?action=toggle', method: 'post', successMessage: 'Standing order activated' }, visible: (x: any) => !x.isActive }\n\n // Details config for standing order — includes execution history child table\n standingOrderDetailsConfig: DetailsDialogConfig = {\n formConfig: this.standingOrderFormConfig,\n heroField: 'standingOrderID',\n tableConfigs: [this.standingOrderExecutionsTableConfig],\n buttons: [this.standingOrderCreateButton, this.standingOrderEditButton, this.standingOrderExecuteButton, this.standingOrderDeleteButton]\n }\n\n // Standing orders management table — main page\n standingOrdersTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name', 'templateName', 'scheduleDisplay'],\n flatButtons: true,\n columns: [\n { name: 'name', type: 'button', detailsConfig: this.standingOrderDetailsConfig },\n { name: 'templateName', type: 'text', alias: 'Template' },\n { name: 'scheduleDisplay', type: 'text', alias: 'Schedule' },\n { name: 'amountDisplay', type: 'text', alias: 'Amount' },\n { name: 'startDate', type: 'date', alias: 'Start Date' },\n { name: 'endDate', type: 'date', alias: 'End Date' },\n { name: 'lastRunDisplay', type: 'text', alias: 'Last Run' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' }\n ],\n buttons: [\n this.standingOrderCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.standingOrderDetailsConfig },\n this.standingOrderEditButton,\n this.standingOrderPauseButton,\n this.standingOrderResumeButton,\n this.standingOrderExecuteButton,\n this.standingOrderDeleteButton\n ],\n loadAction: { url: 'standingorders/all/x' },\n formConfig: this.standingOrderFormConfig,\n entityName: 'StandingOrder'\n }\n\n //--------------------------Accounts-------------------------\n\n accountDetailsConfig : DetailsDialogConfig = {\n ...this.accountBaseDetailsConfig,\n tableConfigs: [\n { ...this.accountTransactionsTableConfig },\n {\n ...this.transactionTypesTableConfig,\n tabTitle: 'Transaction Types',\n buttons: [],\n loadAction: { url: 'transactionTypes/account/x' }, loadCriteria: 'account', loadIDField: 'accountID'\n },\n { ...this.transactionTemplatesTableConfig }, // Changed: Added 3rd tab for transaction templates\n ]\n };\n\n\n // Added (WS-1 sweep): deliberately NOT paginated and NOT offline. Account IS ISync, but the chart of accounts is a bounded setup screen an accountant maintains at a desk — nobody opens it in the field, and its balance columns are live server aggregates that a cache would misreport.\n accountsTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [5 ,10, 25, 50],\n minColumns: ['name', 'typeName', 'balanceDisplay'],\n flatButtons: true,\n columns: [\n { name: 'code', type: 'text', alias: 'Code' }, // Changed: COA code column (B1)\n { name: 'name', type: 'button', detailsConfig: this.accountDetailsConfig },\n { name: 'typeName', type: 'text', alias: 'Type',\n icons: [\n { name: 'payments', color: '#4CAF50', condition: (x: any) => x.includeInCashTotal, tip: 'Included in Cash Total' },\n { name: 'account_balance', color: '#2196F3', condition: (x: any) => x.includeInBankTotal, tip: 'Included in Bank Total' },\n ]\n },\n { name: 'balanceDisplay', type: 'text', alias: 'Balance' }, // Changed: Pre-formatted with currency prefix (e.g. \"USD 1,964.21\")\n ],\n buttons: [\n this.accountCreateButton,\n { name: 'view', dialog: true, detailsConfig: this.accountDetailsConfig },\n this.finAccounEditButton,\n { name: 'delete', dialog: true, action: { url: 'accounts?action=delete', method: 'post' } },\n // { name: 'revalue', display: 'Revalue Forex', inHeader: true, icon: { name: 'currency_exchange', color: 'blue' }, // Changed: Commented out — forex revaluation deferred\n // action: { url: 'accounts?action=revalue', method: 'post', successMessage: 'Forex revaluation complete' },\n // confirm: { message: 'Revalue all forex accounts at current exchange rates?' }\n // },\n ],\n loadAction: { url: 'accounts/all/x' },\n formConfig: this.accountFormConfig,\n realTime: true,\n entityName: 'Account'\n }\n\n //--------------------------Financial Reports-------------------------\n\n // Trial Balance table config — shows all accounts with debit/credit totals\n trialBalanceTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [25, 50, 100],\n minColumns: ['accountName', 'totalDebits', 'totalCredits'],\n flatButtons: true,\n columns: [\n { name: 'accountCode', type: 'text', alias: 'Code' }, // Changed: COA code column (B1)\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'accountType', type: 'text', alias: 'Type' },\n { name: 'totalDebits', type: 'money', alias: 'Debits' },\n { name: 'totalCredits', type: 'money', alias: 'Credits' },\n { name: 'closingBalance', type: 'money', alias: 'Balance',\n colors: [\n { name: 'green', condition: (x: any) => x.closingBalance > 0 },\n { name: 'red', condition: (x: any) => x.closingBalance < 0 }\n ]\n }\n ],\n loadAction: { url: 'accounts/reports/trialbalance' }\n }\n\n // Profit & Loss table config — shows revenue and expense accounts with section\n pnlTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [25, 50, 100],\n minColumns: ['accountName', 'section', 'amount'],\n flatButtons: true,\n columns: [\n { name: 'accountCode', type: 'text', alias: 'Code' }, // Changed: COA code column (B1)\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'section', type: 'text', alias: 'Section' },\n { name: 'amount', type: 'money', alias: 'Amount',\n colors: [\n { name: 'green', condition: (x: any) => x.amount > 0 },\n { name: 'red', condition: (x: any) => x.amount < 0 }\n ]\n }\n ],\n loadAction: { url: 'accounts/reports/pnl' }\n }\n\n // Balance Sheet report table config — shows asset, liability, equity accounts with section\n balanceSheetReportTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [25, 50, 100],\n minColumns: ['accountName', 'section', 'balance'],\n flatButtons: true,\n columns: [\n { name: 'accountCode', type: 'text', alias: 'Code' }, // Changed: COA code column (B1)\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'section', type: 'text', alias: 'Section' },\n { name: 'balance', type: 'money', alias: 'Balance',\n colors: [\n { name: 'green', condition: (x: any) => x.balance > 0 },\n { name: 'red', condition: (x: any) => x.balance < 0 }\n ]\n }\n ],\n loadAction: { url: 'accounts/reports/balancesheet' }\n }\n\n //--------------------------Aggregates-------------------------\n\n // Monthly aggregates table showing Assets, Liabilities, Income, Expenses, Profit, and Equity by month\n aggregatesTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [12, 24, 36],\n minColumns: ['month', 'assets', 'liabilities', 'income'],\n flatButtons: true,\n columns: [\n { name: 'month', type: 'text', alias: 'Month' },\n { name: 'assets', type: 'money', alias: 'Assets' },\n { name: 'liabilities', type: 'money', alias: 'Liabilities' },\n { name: 'income', type: 'money', alias: 'Income' },\n { name: 'expenses', type: 'money', alias: 'Expenses' },\n { name: 'profit', type: 'money', alias: 'Profit', colors: [{ name: 'green', condition: x => x.profit > 0 }, { name: 'red', condition: x => x.profit < 0 }] },\n { name: 'equity', type: 'money', alias: 'Equity' }\n ],\n loadAction: { url: 'accounts/aggregates/monthly' }\n }\n\n // Cumulative aggregates table showing running totals over time\n cumulativeAggregatesTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [12, 24, 36],\n minColumns: ['month', 'totalAssets', 'totalLiabilities', 'netAssets'],\n flatButtons: true,\n columns: [\n { name: 'month', type: 'text', alias: 'Month' },\n { name: 'totalAssets', type: 'money', alias: 'Total Assets' },\n { name: 'totalLiabilities', type: 'money', alias: 'Total Liabilities' },\n { name: 'netAssets', type: 'money', alias: 'Net Assets' },\n { name: 'totalEquity', type: 'money', alias: 'Total Equity' },\n { name: 'incomeYTD', type: 'money', alias: 'Income YTD' },\n { name: 'expensesYTD', type: 'money', alias: 'Expenses YTD' },\n { name: 'profitYTD', type: 'money', alias: 'Profit YTD', colors: [{ name: 'green', condition: x => x.profitYTD > 0 }, { name: 'red', condition: x => x.profitYTD < 0 }] }\n ],\n loadAction: { url: 'accounts/aggregates/cumulative' }\n }\n\n // Cash flow aggregates table showing inflows, outflows and running balance\n cashFlowAggregatesTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [12, 24, 36],\n minColumns: ['month', 'cashInflows', 'cashOutflows', 'netCashFlow'],\n flatButtons: true,\n columns: [\n { name: 'month', type: 'text', alias: 'Month' },\n { name: 'cashInflows', type: 'money', alias: 'Cash Inflows' },\n { name: 'cashOutflows', type: 'money', alias: 'Cash Outflows' },\n { name: 'netCashFlow', type: 'money', alias: 'Net Cash Flow', colors: [{ name: 'green', condition: x => x.netCashFlow > 0 }, { name: 'red', condition: x => x.netCashFlow < 0 }] },\n { name: 'runningBalance', type: 'money', alias: 'Running Balance', colors: [{ name: 'green', condition: x => x.runningBalance > 0 }, { name: 'red', condition: x => x.runningBalance < 0 }] }\n ],\n loadAction: { url: 'accounts/aggregates/cashflow' }\n }\n\n // Balance sheet aggregates table showing Assets, Liabilities, and Equity by month\n balanceSheetAggregatesTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [12, 24, 36],\n minColumns: ['month', 'totalAssets', 'totalLiabilities', 'totalEquity'],\n flatButtons: true,\n columns: [\n { name: 'month', type: 'text', alias: 'Month' },\n { name: 'totalAssets', type: 'money', alias: 'Total Assets' },\n { name: 'totalLiabilities', type: 'money', alias: 'Total Liabilities' },\n { name: 'totalEquity', type: 'money', alias: 'Total Equity' },\n { name: 'netWorth', type: 'money', alias: 'Net Worth', colors: [{ name: 'green', condition: x => x.netWorth > 0 }, { name: 'red', condition: x => x.netWorth < 0 }] }\n ],\n loadAction: { url: 'accounts/aggregates/balancesheet' }\n }\n\n // Changed: Fixed Assets configs moved to AssetsService (assets.service.ts)\n\n //--------------------------Budgets-------------------------\n\n // Budget form configuration\n budgetFormConfig: FormConfig = {\n security: { allow: [this.dataService.capBudgets] }, // Added: capability gate — Budgets (cap85)\n title: 'Budget',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, alias: 'Budget Name' },\n { name: 'fiscalYear', type: 'number', required: true, alias: 'Fiscal Year', defaultValue: new Date().getFullYear() },\n { name: 'description', type: 'text', span: true },\n { name: 'statusName', type: 'text', alias: 'Status', readonly: true, hideOnCreate: true }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n { name: 'isActive', type: 'checkbox', alias: 'Active', readonly: true, hideOnCreate: true },\n { name: 'totalBudgetedDisplay', type: 'text', alias: 'Total Budgeted', readonly: true, hideOnCreate: true } // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n ],\n loadAction: { url: 'budgets/id' },\n heroField: 'budgetID'\n }\n\n // Budget line form configuration\n budgetLineFormConfig: FormConfig = {\n security: { allow: [this.dataService.capBudgets] }, // Added: capability gate — Budgets (cap85, parent)\n title: 'Budget Line',\n fields: [\n { name: 'budgetID', type: 'number', hidden: true },\n { name: 'accountID', type: 'select', alias: 'Account', required: true, loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountBaseDetailsConfig }, // Changed: dropdown quick-add\n { name: 'departmentID', type: 'select', alias: 'Department', nullable: true, loadAction: { url: 'departments/list/x' } },\n { name: 'period', type: 'date', required: true, alias: 'Period (1st of Month)' },\n { name: 'budgetedAmount', type: 'money', required: true, alias: 'Budgeted Amount' }\n ],\n loadAction: { url: 'budgetlines/id' },\n heroField: 'budgetLineID'\n }\n\n // Budget lines child table\n budgetLinesTableConfig: TableConfig = {\n tabTitle: 'Budget Lines',\n showFilter: true,\n minColumns: ['periodLabel', 'accountName', 'budgetedAmountDisplay'],\n columns: [\n { name: 'periodLabel', type: 'text', alias: 'Period' },\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'accountTypeName', type: 'text', alias: 'Type' },\n { name: 'departmentName', type: 'text', alias: 'Department' },\n { name: 'budgetedAmount', type: 'money', alias: 'Amount' }\n ],\n buttons: [\n { name: 'create', display: 'Add Line', dialog: true, action: { url: 'budgetlines?action=create', method: 'post' }, disabled: (x: any) => x.status == 2 },\n { name: 'edit', dialog: true, action: { url: 'budgetlines?action=edit', method: 'post' }, disabled: (x: any) => x.budgetStatus == 2 },\n { name: 'delete', inDialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'budgetlines?action=delete', method: 'post', successMessage: 'Line deleted' }, confirm: { message: 'Delete this budget line?' }, disabled: (x: any) => x.budgetStatus == 2 }\n ],\n loadAction: { url: 'budgetlines/x/x' }, loadCriteria: 'budget', loadIDField: 'budgetID',\n formConfig: this.budgetLineFormConfig\n }\n\n // Budget action buttons\n budgetPublishButton: Button = { name: 'publish', display: 'Publish', inDialog: true, icon: { name: 'publish', color: 'green' }, action: { url: 'budgets?action=publish', method: 'post', successMessage: 'Budget published' }, confirm: { message: 'Publish this budget? Lines will be locked for editing.' }, visible: (x: any) => x.status == 1 }\n budgetSetActiveButton: Button = { name: 'setactive', display: 'Set Active', inDialog: true, icon: { name: 'star', color: 'blue' }, action: { url: 'budgets?action=setactive', method: 'post', successMessage: 'Budget set as active' }, confirm: { message: 'Set this budget as the active budget for its fiscal year?' }, visible: (x: any) => x.status == 2 && !x.isActive }\n budgetCopyButton: Button = { name: 'copy', display: 'Copy to Next Year', inDialog: true, icon: { name: 'content_copy', color: 'purple' }, action: { url: 'budgets?action=copy', method: 'post', successMessage: 'Budget copied' }, confirm: { message: 'Copy this budget to the next fiscal year?' } }\n budgetEditButton: Button = { name: 'edit', dialog: true, action: { url: 'budgets?action=edit', method: 'post' }, visible: (x: any) => x.status == 1 }\n\n // Budget details dialog with lines table and action buttons\n budgetDetailsConfig: DetailsDialogConfig = {\n formConfig: this.budgetFormConfig,\n tableConfigs: [this.budgetLinesTableConfig],\n heroField: 'budgetID',\n buttons: [\n this.budgetPublishButton,\n this.budgetSetActiveButton,\n this.budgetCopyButton,\n this.budgetEditButton\n ]\n }\n\n // Main budgets table configuration\n budgetsTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name', 'fiscalYear', 'statusName'],\n flatButtons: true,\n columns: [\n { name: 'name', type: 'button', detailsConfig: this.budgetDetailsConfig },\n { name: 'fiscalYear', type: 'number', alias: 'Fiscal Year' },\n { name: 'statusName', type: 'chip', alias: 'Status',\n colors: [\n { name: '#FFCC80', condition: (x: any) => x.status == 1 },\n { name: '#A5D6A7', condition: (x: any) => x.status == 2 }\n ]\n },\n { name: 'isActive', type: 'checkbox', alias: 'Active' },\n { name: 'lineCount', type: 'number', alias: 'Lines' },\n { name: 'totalBudgetedDisplay', type: 'text', alias: 'Total Budgeted' }\n ],\n buttons: [\n { name: 'create', display: 'Create Budget', dialog: true, action: { url: 'budgets?action=create', method: 'post' } },\n this.budgetPublishButton,\n this.budgetSetActiveButton,\n this.budgetCopyButton,\n { name: 'delete', inDialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'budgets?action=delete', method: 'post', successMessage: 'Budget deleted' }, confirm: { message: 'Delete this budget?' }, visible: (x: any) => x.status == 1 }\n ],\n loadAction: { url: 'budgets/all/x' },\n formConfig: this.budgetFormConfig,\n entityName: 'Budget'\n }\n\n //--------------------------Budget vs Actual Report-------------------------\n\n // Budget vs Actual - By Period detail table\n budgetVsActualByPeriodTableConfig: TableConfig = {\n tabTitle: 'By Period',\n showFilter: true,\n pageSizes: [25, 50, 100],\n minColumns: ['periodLabel', 'accountName', 'budgetedDisplay'],\n flatButtons: true,\n columns: [\n { name: 'periodLabel', type: 'text', alias: 'Period' },\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'accountType', type: 'text', alias: 'Type' },\n { name: 'departmentName', type: 'text', alias: 'Department' },\n { name: 'budgetedDisplay', type: 'text', alias: 'Budgeted' },\n { name: 'actualDisplay', type: 'text', alias: 'Actual' },\n { name: 'varianceDisplay', type: 'text', alias: 'Variance',\n colors: [\n { name: 'green', condition: (x: any) => !x.isOverBudget },\n { name: 'red', condition: (x: any) => x.isOverBudget }\n ]\n },\n { name: 'variancePercent', type: 'number', alias: 'Variance %' }\n ]\n }\n\n // Budget vs Actual - By Account summary table\n budgetVsActualByAccountTableConfig: TableConfig = {\n tabTitle: 'By Account',\n showFilter: true,\n pageSizes: [25, 50, 100],\n minColumns: ['accountName', 'totalBudgetedDisplay', 'totalActualDisplay'],\n flatButtons: true,\n columns: [\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'accountType', type: 'text', alias: 'Type' },\n { name: 'totalBudgetedDisplay', type: 'text', alias: 'Total Budgeted' },\n { name: 'totalActualDisplay', type: 'text', alias: 'Total Actual' },\n { name: 'varianceDisplay', type: 'text', alias: 'Variance',\n colors: [\n { name: 'green', condition: (x: any) => !x.isOverBudget },\n { name: 'red', condition: (x: any) => x.isOverBudget }\n ]\n },\n { name: 'variancePercent', type: 'number', alias: 'Variance %' }\n ]\n }\n\n // Budget summary tiles for report page\n budgetSummaryTileConfig: TileConfig = {\n tiles: [\n { name: 'totalBudgeted', alias: 'Total Budgeted', color: '#2196F3', icon: 'request_quote', info: 'Sum of all budget line amounts' }, // Changed: Added icon\n { name: 'totalActual', alias: 'Total Actual', color: '#4CAF50', icon: 'receipt', info: 'Sum of actual amounts from ledger' }, // Changed: Added icon\n { name: 'totalVariance', alias: 'Total Variance', color: '#FF9800', icon: 'compare_arrows', info: 'Difference between budgeted and actual' }, // Changed: Added icon\n { name: 'overBudgetLines', alias: 'Over Budget', color: '#F44336', icon: 'warning', info: 'Number of lines over budget' } // Changed: Added icon\n ]\n }\n\n //--------------------------General Ledger Report (B5)-------------------------\n\n // General Ledger detail report — every posting line with per-account running balance\n generalLedgerTableConfig: TableConfig = {\n showFilter: true,\n pageSizes: [25, 50, 100],\n minColumns: ['date', 'accountName', 'debit'],\n flatButtons: true,\n columns: [\n { name: 'date', type: 'date', alias: 'Date' },\n { name: 'accountCode', type: 'text', alias: 'Code' },\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'transactionType', type: 'text', alias: 'Type' },\n { name: 'description', type: 'text', alias: 'Description', maxLength: 80 },\n { name: 'debit', type: 'money', alias: 'Debit' },\n { name: 'credit', type: 'money', alias: 'Credit' },\n { name: 'balance', type: 'money', alias: 'Balance' }\n ],\n loadAction: { url: 'reports/gl' }\n }\n\n //--------------------------Credit Notes (B6)-------------------------\n\n // Credit note item form — lines editable while parent credit note is a draft\n creditNoteItemsFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Credit Note Item',\n fields: [\n { name: 'creditNoteID', type: 'number', hidden: true },\n { name: 'description', type: 'text', required: true, alias: 'Description', span: true },\n { name: 'quantity', type: 'number', required: true, defaultValue: 1 },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price', required: true },\n { name: 'taxRateID', type: 'select', alias: 'Tax Rate', nullable: true, loadAction: { url: 'products/list/tax-rates' }, detailsConfig: this.taxRateDetailsConfig, infoMessage: 'VAT rate reversed by this line' } // Changed: dropdown quick-add\n ],\n loadAction: { url: 'creditnoteitems/id' },\n heroField: 'creditNoteItemID'\n }\n\n creditNoteItemEditButton: Button = { name: 'edit', dialog: true, action: { url: 'creditnoteitems?action=edit', method: 'post' }, disabled: x => x.status != CreditNoteStatus.Draft }\n\n // Credit note items nested table\n creditNoteItemsTableConfig: TableConfig = {\n tabTitle: 'Credit Note Items',\n showFilter: false,\n causeFormRefresh: true,\n minColumns: ['description', 'quantity', 'amount'],\n columns: [\n { name: 'description', type: 'text', alias: 'Description' },\n { name: 'quantity', type: 'number', alias: 'Qty' },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'taxAmount', type: 'money', alias: 'Tax' },\n { name: 'lineTotal', type: 'money', alias: 'Total' }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'creditnoteitems?action=create', method: 'post' }, disabled: x => x.status != CreditNoteStatus.Draft },\n this.creditNoteItemEditButton,\n { name: 'delete', inDialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'creditnoteitems?action=delete', method: 'post', successMessage: 'Deleted' }, confirm: { message: 'Delete this item?' }, disabled: x => x.status != CreditNoteStatus.Draft }\n ],\n loadAction: { url: 'creditnoteitems/x/x' }, loadCriteria: 'creditnote', loadIDField: 'creditNoteID',\n formConfig: this.creditNoteItemsFormConfig\n }\n\n // Credit note header form\n creditNoteFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Credit Note',\n includeAudit: true,\n // Changed: sectioned — customer, status and total answer \"what is this credit\"; the paperwork and the\n // sub-totals fold away so the items tab is reachable without scrolling\n fields: [\n { name: 'customerID', alias: 'Customer', type: 'select', required: true, loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig }, // Changed: dropdown quick-add\n { name: 'status', type: 'select', hideOnCreate: true, readonly: true, serverOwned: true, loadAction: { url: 'creditnotes/list/statuses' } }, // Changed (CFW-1): CreditNote.Status carries [ServerOwned]\n { name: 'totalDisplay', type: 'text', alias: 'Total', readonly: true, hideOnCreate: true }, // NOT converted (A-0901-09): stays text. CreditNote.TotalDisplay (TinErp Models/Accounting/CreditNote.cs:54) is a server-PRE-FORMATTED STRING via FormatMoney(), same shape as Invoice's — type:'money' would render it BLANK, as measured on the invoice dialog.\n { name: 'reason', type: 'text', alias: 'Reason', span: true },\n { name: 'invoiceID', type: 'select', alias: 'Invoice', nullable: true, loadAction: { url: 'invoiceitems/list/draft-invoices' }, hidden: true }, // Hidden generic select — invoice linkage set via create-from-invoice\n\n { name: 'creditNoteInfo', type: 'section', alias: 'Credit Note Details', collapseOnView: true },\n { name: 'creditNoteDate', type: 'date', max: 'today', required: true, alias: 'Date', section: 'creditNoteInfo' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'creditNoteNumber', type: 'text', alias: 'Credit Note #', readonly: true, hideOnCreate: true, section: 'creditNoteInfo' },\n { name: 'invoiceNumber', type: 'text', alias: 'Invoice #', readonly: true, hideOnCreate: true, section: 'creditNoteInfo' }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n\n { name: 'amounts', type: 'section', alias: 'Amount Breakdown', hideOnCreate: true, collapseOnView: true },\n { name: 'subTotal', type: 'money', alias: 'Sub Total', readonly: true, hideOnCreate: true, section: 'amounts' },\n { name: 'taxTotal', type: 'money', alias: 'VAT', readonly: true, hideOnCreate: true, section: 'amounts' }\n ],\n loadAction: { url: 'creditnotes/id' },\n heroField: 'creditNoteID'\n }\n\n // Credit note action buttons\n // Changed: issuing now also settles the linked invoice in the same step, so the message says so —\n // it used to leave the ledger crediting AR while the invoice still showed the full balance.\n creditNoteSubmitButton: Button = { name: 'submit', inDialog: true, display: 'Issue', icon: { name: 'send' },\n action: { url: 'creditnotes?action=submit', method: 'post', successMessage: 'Credit note issued' },\n confirm: { message: 'Issue this credit note? It reverses revenue and VAT in the ledger and credits the linked invoice.' },\n visible: x => x.status == CreditNoteStatus.Draft,\n disabled: x => x.totalAmount == 0\n }\n\n // Changed: only needed now for a credit raised against an invoice that had no balance left at the\n // time (a return after payment) and is later netted off. The normal path applies on issue.\n creditNoteApplyButton: Button = { name: 'apply', inDialog: true, display: 'Apply to Invoice', icon: { name: 'link', color: 'blue' },\n action: { url: 'creditnotes?action=apply', method: 'post', successMessage: 'Credit applied to invoice' },\n confirm: { message: 'Apply this credit against the linked invoice balance?' },\n visible: x => x.status == CreditNoteStatus.Submitted && !!x.invoiceID\n }\n\n creditNoteReturnButton: Button = { name: 'return', inDialog: true, display: 'Return', icon: { name: 'undo', color: 'orange' },\n action: { url: 'creditnotes?action=return', method: 'post', successMessage: 'Returned to Draft' },\n confirm: { message: 'Return credit note to draft? Ledger reversals will be voided.' },\n visible: x => x.status == CreditNoteStatus.Submitted\n }\n\n creditNoteDiscardButton: Button = { name: 'discard', inDialog: true, display: 'Discard', icon: { name: 'close', color: 'red' },\n action: { url: 'creditnotes?action=discard', method: 'post', successMessage: 'Discarded' },\n confirm: { message: 'Discard this credit note?' },\n visible: x => x.status == CreditNoteStatus.Draft\n }\n\n creditNoteEditButton: Button = { name: 'edit', display: 'Save', dialog: true, action: { url: 'creditnotes?action=edit', method: 'post' }, visible: x => x.status == CreditNoteStatus.Draft }\n\n // Credit note details dialog — two-step create pattern (header first, then items)\n creditNoteDetailsDialogConfig: DetailsDialogConfig = {\n formConfig: this.creditNoteFormConfig,\n tableConfigs: [this.creditNoteItemsTableConfig],\n heroField: 'creditNoteID',\n buttons: [\n this.creditNoteSubmitButton,\n this.creditNoteApplyButton,\n this.creditNoteReturnButton,\n this.creditNoteDiscardButton,\n this.creditNoteEditButton\n ]\n }\n\n creditNoteViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.creditNoteDetailsDialogConfig }\n creditNoteCreateButton: Button = { name: 'create', display: 'Create', dialog: true, onSuccessButton: this.creditNoteViewButton, action: { url: 'creditnotes?action=create', method: 'post' } }\n\n // Raise a full credit note from an invoice (pre-populated lines)\n invoiceCreditNoteButton: Button = { name: 'create-from-invoice', display: 'Credit Note', inDialog: true, icon: { name: 'assignment_return', color: 'purple' },\n action: { url: 'creditnotes?action=create-from-invoice', method: 'post', successMessage: 'Draft credit note created' },\n confirm: { message: 'Create a draft credit note for the full value of this invoice?' },\n visible: x => x.status == InvoiceStatus.Submitted || x.status == InvoiceStatus.Paying || x.status == InvoiceStatus.Paid\n }\n\n // Main credit notes table\n creditNotesTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['creditNoteNumber', 'customerName', 'statusName'],\n flatButtons: true,\n collapseButtons: true,\n greyOut: x => x.status == CreditNoteStatus.Applied || x.status == CreditNoteStatus.Discarded,\n columns: [\n { name: 'creditNoteNumber', type: 'button', alias: 'Credit Note #', detailsConfig: this.creditNoteDetailsDialogConfig },\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'invoiceNumber', type: 'text', alias: 'Invoice #' },\n { name: 'creditNoteDate', type: 'date', alias: 'Date' },\n { name: 'reason', type: 'text', alias: 'Reason', maxLength: 60 },\n { name: 'statusName', type: 'chip', alias: 'Status', detailsConfig: this.creditNoteDetailsDialogConfig,\n colors: [\n { name: '#FFCC80', condition: x => x.status == CreditNoteStatus.Draft },\n { name: '#90CAF9', condition: x => x.status == CreditNoteStatus.Submitted },\n { name: '#A5D6A7', condition: x => x.status == CreditNoteStatus.Applied },\n { name: '#EF9A9A', condition: x => x.status == CreditNoteStatus.Discarded }\n ]\n },\n { name: 'itemCount', type: 'number', alias: 'Items' },\n { name: 'totalAmount', type: 'money', alias: 'Total' }\n ],\n buttons: [\n this.creditNoteCreateButton,\n this.creditNoteSubmitButton,\n this.creditNoteApplyButton,\n this.creditNoteReturnButton,\n this.creditNoteDiscardButton\n ],\n loadAction: { url: 'creditnotes/all/x' },\n formConfig: this.creditNoteFormConfig,\n pagination: { pageSize: 15 }, // Added: server-side pagination — credit notes carry the same customer join and money columns as invoices\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — a credit is raised where the goods come back (CreditNote : ISync says so explicitly); create/edit queue and drain on reconnect. Issue/apply/return/discard are workflow actions, not create/edit, so they stay online-only — the field act is capturing the Draft\n entityName: 'CreditNote',\n }\n\n //--------------------------Customer Receipts (C3)-------------------------\n\n // Changed: the allocate button now carries its OWN handler instead of being a no-op that ReceiptsComponent\n // wired in its constructor. That wiring made the button work on exactly one page and left it DEAD for every\n // other consumer — which is the sole reason shift's and grip's Day Book allocate lanes were router\n // navigations rather than in-place actions (the last two row navigators in the estate).\n // Changed: `tip` added — the button used to be labelled for a journey (\"...on the Receipts page\"); it now\n // does the job where it is clicked, and the tip has to stop promising a page.\n // Changed: the visible gate accepts EITHER field name. The receipts page projects `unallocatedAmount`\n // (CustomerReceiptsController.SelectFields) but both Day Book providers project `unallocated`\n // (ShiftDayBookProvider.DayBookReceipt / GripDayBookProvider's anonymous row), so the old gate would have\n // hidden this button on every Day Book row — a live button that never appears. Widening only: nothing that\n // was visible before is hidden now.\n receiptAllocateButton: Button = { name: 'allocate', display: 'Allocate', icon: { name: 'call_split', color: 'blue' }, tip: 'Match this money to open invoices',\n onClick: (row: any, reload?: () => void) => this.openReceiptAllocation(row, reload),\n visible: x => this.receiptUnallocated(x) > 0.005\n }\n\n // Added: the one place that knows a receipt row's unallocated balance, whichever surface the row came from.\n receiptUnallocated(row: any): number { return row?.unallocatedAmount ?? row?.unallocated ?? 0; }\n\n // Added: opens the allocation dialog for a receipt row from ANY table — the receipts page, a Day Book\n // section, or an untracked consumer. `reload` is the second argument table.component hands every\n // Button.onClick (:1207); calling it refreshes a table that owns a loadAction AND emits actionSuccess, which\n // is what reloads a Day Book section that has no loadAction of its own. That is why this needs no page ref.\n // The row is normalised to the field name ReceiptDialogComponent reads, so a Day Book row allocates too.\n openReceiptAllocation(row: any, reload?: () => void) {\n const receipt = { ...row, unallocatedAmount: this.receiptUnallocated(row) };\n this.dialog.open(ReceiptDialogComponent, { width: '860px', maxWidth: '95vw', data: receipt, panelClass: this.dataService?.dialogPanelClass ?? [] })\n .afterClosed().subscribe(saved => { if (saved) reload?.(); });\n }\n\n // C8: PDF download — onClick is wired by ReceiptsComponent (blob download)\n // Changed: the PDF button now carries its OWN handler instead of being a no-op that ReceiptsComponent wired\n // in its constructor. That wiring made it work on exactly one page and left it DEAD for every other consumer\n // — the identical defect fixed for receiptAllocateButton in 3a681d6, and the last of that pair.\n // Changed: `tip` added — the button does its job wherever it is clicked, so nothing should promise a page.\n // NOTE: unlike the allocate button there is NO `visible` gate here, so there was no field-name trap to widen;\n // a PDF is printable for any receipt row regardless of its unallocated balance.\n receiptPdfButton: Button = { name: 'pdf', display: 'Download PDF', icon: { name: 'picture_as_pdf', color: 'red' }, tip: 'Download this receipt as a PDF',\n onClick: (row: any) => this.downloadReceiptPdf(row)\n }\n\n // Added: downloads a receipt PDF for a row from ANY table — the receipts page, a Day Book section, or an\n // untracked consumer. No `reload` argument is used: a download changes no data, so there is nothing to refresh.\n // The body is built EXPLICITLY rather than by spreading the row, so an arbitrary consumer's row shape cannot\n // leak junk fields into the POST. CustomerReceiptsController.DownloadPdf binds [FromBody] CustomerReceipt and\n // reads ONLY CustomerReceiptID, so the ID is the only field that actually matters.\n // MEASURED, not assumed: a lean body and a Day-Book-shaped body missing receiptNumber/reference BOTH return\n // 200 with byte-identical PDFs, so [ApiController]'s implicit-Required rule does NOT bite on this model —\n // the defaults below are tidiness, not a fix for a live failure. Do not \"simplify\" them into a bare ID\n // either: the model binds a CustomerReceipt, and keeping the shape honest costs nothing.\n downloadReceiptPdf(row: any) {\n const body = { customerReceiptID: row?.customerReceiptID ?? 0, receiptNumber: row?.receiptNumber ?? '', customerID: row?.customerID ?? 0, receiptDate: row?.receiptDate ?? null, amount: row?.amount ?? 0, reference: row?.reference ?? '' };\n this.http.post(`${this.httpService.apiUrl}customerreceipts/pdf?action=x`, body, { responseType: 'blob' })\n .subscribe((response: Blob) => {\n const blob = new Blob([response], { type: 'application/pdf' });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `Receipt_${body.customerReceiptID}.pdf`;\n link.click();\n window.URL.revokeObjectURL(url);\n });\n }\n\n customerReceiptsTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['receiptNumber', 'customerName', 'amount'],\n flatButtons: true,\n columns: [\n { name: 'receiptNumber', type: 'text', alias: 'Receipt #' },\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'receiptDate', type: 'date', alias: 'Date' },\n { name: 'methodName', type: 'text', alias: 'Method' },\n { name: 'reference', type: 'text', alias: 'Reference' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'allocatedAmount', type: 'money', alias: 'Allocated' },\n { name: 'unallocatedAmount', type: 'money', alias: 'On Account' }\n ],\n buttons: [\n this.receiptAllocateButton,\n this.receiptPdfButton // C8: wired by ReceiptsComponent\n ],\n loadAction: { url: 'customerreceipts/all/x' },\n pagination: { pageSize: 15 }, // Added: server-side pagination — receipts append continuously and each row carries allocation totals\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — receipts are captured wherever the customer pays; create/edit queue offline\n entityName: 'CustomerReceipt',\n }\n\n //--------------------------Quotations (C10)-------------------------\n\n quoteItemsFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Quote Item',\n fields: [\n { name: 'quoteID', type: 'number', hidden: true },\n { name: 'description', type: 'text', required: true, alias: 'Description', span: true },\n { name: 'quantity', type: 'number', required: true, alias: 'Quantity', defaultValue: 1 },\n { name: 'unitPrice', type: 'money', required: true, alias: 'Unit Price' },\n { name: 'taxRateID', type: 'select', alias: 'Tax Rate', nullable: true, loadAction: { url: 'taxrates/list/x' }, detailsConfig: this.taxRateDetailsConfig }, // Changed: dropdown quick-add\n { name: 'isTaxInclusive', type: 'checkbox', alias: 'Price Includes Tax' }\n ],\n loadAction: { url: 'quoteitems/id' },\n heroField: 'quoteItemID'\n }\n\n quoteItemEditButton: Button = { name: 'edit', dialog: true, action: { url: 'quoteitems?action=edit', method: 'post' }, disabled: x => x.status != QuoteStatus.Draft }\n\n quoteItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n minColumns: ['description', 'lineTotal'],\n columns: [\n { name: 'description', type: 'text', alias: 'Description' },\n { name: 'quantity', type: 'number', alias: 'Qty' },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price' },\n { name: 'amount', type: 'money', alias: 'Net' },\n { name: 'taxAmount', type: 'money', alias: 'VAT' },\n { name: 'lineTotal', type: 'money', alias: 'Total' }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'quoteitems?action=create', method: 'post' } },\n this.quoteItemEditButton,\n { name: 'delete', dialog: true, action: { url: 'quoteitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'quoteitems/x/x' }, loadCriteria: 'quote', loadIDField: 'quoteID',\n formConfig: this.quoteItemsFormConfig\n }\n\n quoteFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Quotation',\n includeAudit: true,\n // Changed: sectioned — customer, status, total and validity are the quote at a glance; numbering and the\n // tax breakdown fold away so the items tab sits under the headline\n fields: [\n { name: 'customerID', alias: 'Customer', type: 'select', required: true, loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig }, // Changed: dropdown quick-add\n { name: 'status', type: 'select', hideOnCreate: true, readonly: true, serverOwned: true, loadAction: { url: 'quotes/list/statuses' } }, // Changed (CFW-1): Quote.Status carries [ServerOwned] — the flagship, MEASURED moving 0 -> 2 from an edit body in Phase 1\n { name: 'totalDisplay', type: 'text', alias: 'Total', readonly: true, hideOnCreate: true }, // NOT converted (A-0901-09): stays text. Quote.TotalDisplay (TinErp Models/Accounting/Quote.cs:49) is a server-PRE-FORMATTED STRING via FormatMoney(), same shape as Invoice's — type:'money' would render it BLANK, as measured on the invoice dialog.\n { name: 'expiryDate', type: 'date', alias: 'Valid Until', nullable: true, defaultValue: '' }, // Changed: defaultValue '' stops TinCore pre-filling TODAY — a quote whose validity expires the day it is raised is valid for zero days, and nullable:true already says the intended default is EMPTY\n\n { name: 'quoteInfo', type: 'section', alias: 'Quote Details', collapseOnView: true },\n { name: 'quoteDate', type: 'date', max: 'today', required: true, alias: 'Date', section: 'quoteInfo' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'quoteNumber', type: 'text', alias: 'Quote #', readonly: true, hideOnCreate: true, section: 'quoteInfo' },\n { name: 'convertedInvoiceNumber', type: 'text', alias: 'Invoice #', readonly: true, hideOnCreate: true, section: 'quoteInfo' }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'quoteInfo' },\n\n { name: 'amounts', type: 'section', alias: 'Amount Breakdown', hideOnCreate: true, collapseOnView: true },\n { name: 'subTotal', type: 'money', alias: 'Sub Total', readonly: true, hideOnCreate: true, section: 'amounts' },\n { name: 'taxTotal', type: 'money', alias: 'VAT', readonly: true, hideOnCreate: true, section: 'amounts' }\n ],\n loadAction: { url: 'quotes/id' },\n heroField: 'quoteID'\n }\n\n // Quote action buttons\n quoteSendButton: Button = { name: 'send', inDialog: true, display: 'Send', icon: { name: 'send' },\n action: { url: 'quotes?action=send', method: 'post', successMessage: 'Quote sent' },\n confirm: { message: 'Mark this quote as sent to the customer?' },\n visible: x => x.status == QuoteStatus.Draft,\n disabled: x => x.totalAmount == 0\n }\n\n quoteAcceptButton: Button = { name: 'accept', inDialog: true, display: 'Accept', icon: { name: 'check_circle', color: 'green' },\n action: { url: 'quotes?action=accept', method: 'post', successMessage: 'Quote accepted' },\n visible: x => x.status == QuoteStatus.Sent\n }\n\n quoteRejectButton: Button = { name: 'reject', inDialog: true, display: 'Reject', icon: { name: 'cancel', color: 'red' },\n action: { url: 'quotes?action=reject', method: 'post', successMessage: 'Quote rejected' },\n confirm: { message: 'Mark this quote as rejected by the customer?' },\n visible: x => x.status == QuoteStatus.Sent\n }\n\n quoteConvertButton: Button = { name: 'convert', inDialog: true, display: 'Convert to Invoice', icon: { name: 'receipt_long', color: 'blue' },\n action: { url: 'quotes?action=convert', method: 'post', successMessage: 'Draft invoice created' },\n confirm: { message: 'Convert this quote to a draft invoice?' },\n visible: x => x.status == QuoteStatus.Accepted\n }\n\n quoteEditButton: Button = { name: 'edit', display: 'Save', dialog: true, action: { url: 'quotes?action=edit', method: 'post' }, visible: x => x.status == QuoteStatus.Draft }\n\n // C8: PDF download — QuotesComponent handles the actionClick blob download (mirrors invoice PDF button)\n quoteDownloadButton: Button = { name: 'pdf', display: 'Download PDF', inDialog: true, icon: { name: 'picture_as_pdf', color: 'red' } }\n\n // Quote details dialog — two-step create pattern (header first, then items)\n quoteDetailsDialogConfig: DetailsDialogConfig = {\n formConfig: this.quoteFormConfig,\n tableConfigs: [this.quoteItemsTableConfig],\n heroField: 'quoteID',\n buttons: [\n this.quoteSendButton,\n this.quoteAcceptButton,\n this.quoteRejectButton,\n this.quoteConvertButton,\n this.quoteDownloadButton, // C8: PDF from the details dialog\n this.quoteEditButton\n ]\n }\n\n quoteViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.quoteDetailsDialogConfig }\n quoteCreateButton: Button = { name: 'create', display: 'Create', dialog: true, onSuccessButton: this.quoteViewButton, action: { url: 'quotes?action=create', method: 'post' } }\n\n quotesTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['quoteNumber', 'customerName', 'statusName'],\n flatButtons: true,\n collapseButtons: true,\n greyOut: x => x.status == QuoteStatus.Rejected || x.status == QuoteStatus.Expired || x.status == QuoteStatus.Converted,\n columns: [\n { name: 'quoteNumber', type: 'button', alias: 'Quote #', detailsConfig: this.quoteDetailsDialogConfig },\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'quoteDate', type: 'date', alias: 'Date' },\n { name: 'expiryDate', type: 'date', alias: 'Valid Until' },\n { name: 'statusName', type: 'chip', alias: 'Status', detailsConfig: this.quoteDetailsDialogConfig,\n colors: [\n { name: '#FFCC80', condition: x => x.status == QuoteStatus.Draft },\n { name: '#90CAF9', condition: x => x.status == QuoteStatus.Sent },\n { name: '#A5D6A7', condition: x => x.status == QuoteStatus.Accepted || x.status == QuoteStatus.Converted },\n { name: '#EF9A9A', condition: x => x.status == QuoteStatus.Rejected || x.status == QuoteStatus.Expired }\n ]\n },\n { name: 'itemCount', type: 'number', alias: 'Items' },\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'convertedInvoiceNumber', type: 'text', alias: 'Invoice #' }\n ],\n buttons: [\n this.quoteCreateButton,\n this.quoteSendButton,\n this.quoteAcceptButton,\n this.quoteRejectButton,\n this.quoteConvertButton,\n this.quoteDownloadButton // C8: PDF from the row menu\n ],\n loadAction: { url: 'quotes/all/x' },\n formConfig: this.quoteFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — quotes append steadily and are rarely purged\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — quotes are written up in front of the customer; create/edit queue offline\n entityName: 'Quote',\n }\n\n //--------------------------Quotation Rate Card (quotations-suite Phase 7)-------------------------\n\n // Added (quotations-suite, rate-card admin page): the LIBRARY's management screen for QuotableService /\n // QuotableServiceRate (TinWeb Phase 1). It sits here beside the quotations configs, is routed by\n // AccountingRoutingModule at home/accounting/rate-card, and is therefore inherited by every consumer app\n // exactly the way the Quotations page is — which is the whole point. Grip and Piglet each grew their own\n // app-local copy of this screen during Phases 5/6 because the library did not have one yet; Shift never\n // did, and until now its card was API-EDITABLE ONLY. This is the one screen that gap needed.\n //\n // 🔑 THE WORDING HERE IS DELIBERATELY GENERIC — \"Service\", \"Variant\", \"Unit\". Unlike the guided BUILDER,\n // which takes every operator-facing string from an app-supplied QuoteBuilderConfig, this is an\n // administrator's screen: the person on it is defining what the tenant's own words are going to BE\n // (\"Truck Size\", \"Kilometres\", \"Stage\", \"Equipment Class\"). It cannot be labelled in the tenant's\n // vocabulary because it is where that vocabulary is entered.\n //\n // 🔴 A rate card is a PRE-SALE, NON-BINDING price list. It is not a billing ladder and must never become\n // one — Arbiter ruling A-0830-9 keeps QuotableService (what a quotation estimates) apart from whatever an\n // app charges a CONFIRMED job (Grip's RateBand, Shift's tariffs). Nothing here reads or writes either.\n\n // One variant row — a truck size, a pig stage, an equipment class. It may override BOTH the parent's rate\n // and its pricing model, which is what lets \"$2/km for a 10-ton\" and \"$10 flat for a 3-ton\" live under a\n // single catalogue entry (QuotableServiceRate.cs — the RateBand.cs:15-16 override precedence).\n quotableServiceRateFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Rate', // Changed (A-0830-18): the dialog header renders \"{{titleAction}} {{title}}\", so 'Variant Rate' under an 'Add Variant' button printed \"Add Variant Variant Rate\". The title is the entity noun only; the verb comes from the button\n\n includeAudit: true,\n fields: [\n { name: 'variantDisplay', type: 'text', required: true, span: true, alias: 'Variant', hint: 'What the operator picks on the quote builder — \"10 Ton Truck\", \"Sow\", \"7 Ton Excavator\"' },\n { name: 'variantKey', type: 'text', required: true, alias: 'Code', hint: 'Short stable code stored on the quotation line — \"10t\". Quotations already raised keep the text they were priced with' },\n { name: 'order', type: 'number', alias: 'Order', defaultValue: 0 },\n { name: 'pricingModel', type: 'select', required: true, alias: 'Priced', loadAction: { url: 'quotableservicerates/list/pricingmodels' }, defaultValue: 1, hint: 'Overrides the service. Per Unit multiplies by the quantity quoted; Fixed Price ignores it entirely' },\n { name: 'rate', type: 'money', required: true, alias: 'Rate', hint: 'Per unit of the service — or the whole price when this variant is Fixed' },\n { name: 'minimumCharge', type: 'money', alias: 'Minimum Charge', hint: 'Optional floor. A smaller job is quoted at this figure instead, and the quotation line says which figure it replaced' },\n { name: 'effectiveFrom', type: 'date', alias: 'From' },\n { name: 'effectiveTo', type: 'date', nullable: true, noDefault: true, alias: 'Until', hint: 'Blank means it stays on the card. A quotation is always priced at the card in force ON ITS OWN DATE, never today\\'s' }\n ],\n loadAction: { url: 'quotableservicerates/id' },\n heroField: 'quotableServiceRateID'\n }\n\n quotableServiceRateCreateButton: Button = { name: 'create', display: 'New', dialog: true, action: { url: 'quotableservicerates?action=create', method: 'post' } } // Changed (A-0830-18): verb only. detailsDialog composes the header as verb + title, so a display carrying its own noun duplicated it. 'New' + 'Rate' reads \"New Rate\" on create and \"Edit Rate\" on edit, under the tab already titled Rates\n quotableServiceRateEditButton: Button = { name: 'edit', dialog: true, action: { url: 'quotableservicerates?action=edit', method: 'post' } }\n\n // The service's own variant list — STEP TWO of the two-step create. The nested table carries\n // heroField/heroValue down from the service dialog, so a variant added here is posted with\n // quotableServiceID already set (TinCore.ts:672). loadCriteria/loadIDField, not a {placeholder} in\n // loadAction — substitution is not resolved in loadAction URLs (the killsheetdeductions precedent).\n quotableServiceRatesTableConfig: TableConfig = {\n tabTitle: 'Rates',\n flatButtons: true,\n minColumns: ['variantDisplay', 'rate'],\n columns: [\n { name: 'variantDisplay', type: 'chip', alias: 'Variant' },\n { name: 'variantKey', type: 'text', alias: 'Code' },\n { name: 'rate', type: 'money', alias: 'Rate' },\n { name: 'pricingModelName', type: 'text', alias: 'Priced' },\n { name: 'minimumCharge', type: 'money', alias: 'Minimum' },\n { name: 'effectiveTo', type: 'date', alias: 'Until' }\n ],\n buttons: [\n this.quotableServiceRateCreateButton,\n this.quotableServiceRateEditButton,\n { name: 'delete', dialog: true, action: { url: 'quotableservicerates?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'quotableservicerates/service/x' },\n loadCriteria: 'service',\n loadIDField: 'quotableServiceID',\n formConfig: this.quotableServiceRateFormConfig\n }\n\n quotableServiceFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccountingInvoices] },\n title: 'Service', // Changed (A-0830-18): same header composition as the rate form — 'Quotable Service' under 'Add Service' printed \"Add Service Quotable Service\". \"Quotable\" is the model's word, never the operator's\n\n includeAudit: true,\n // Sectioned so the CREATE step is the short one. Identity and Pricing are what a new service actually\n // needs; the variant dimension, the VAT basis and the effective dates are each a decision of their own\n // and fold away on view.\n fields: [\n { name: 'identity', type: 'section', alias: 'Service' },\n { name: 'name', type: 'text', required: true, span: true, section: 'identity', hint: 'What the operator picks on the quote builder — \"Local Transport (per km)\"' },\n { name: 'description', type: 'text', span: true, section: 'identity' },\n { name: 'order', type: 'number', alias: 'Order', defaultValue: 0, section: 'identity', hint: 'Lowest first in the builder\\'s service list' },\n\n { name: 'pricing', type: 'section', alias: 'Pricing' },\n { name: 'pricingModel', type: 'select', required: true, alias: 'Priced', loadAction: { url: 'quotableservices/list/pricingmodels' }, defaultValue: 1, section: 'pricing', hint: 'Per Unit multiplies the rate by the quantity quoted. Fixed Price is the whole job whatever the quantity — the builder hides its quantity box entirely' },\n { name: 'unitName', type: 'text', alias: 'Charged In', section: 'pricing', hint: 'Kilometres, Days, Pigs — this word LABELS the quantity box on the quote builder and prints on the quotation, so write it as the customer would say it. Required for a per-unit service' },\n { name: 'basePrice', type: 'money', required: true, alias: 'Base Rate', section: 'pricing', hint: 'The rate when no variant is chosen, or the flat price when this service is Fixed' },\n { name: 'minimumCharge', type: 'money', alias: 'Minimum Charge', section: 'pricing', hint: 'Optional floor. A smaller job is quoted at this figure instead of the calculated one' },\n\n { name: 'variants', type: 'section', alias: 'Rates', collapseOnView: true }, // Changed (A-0830-18): one concept, one word. The section, the tab, the dialog title and the button all say Rates now; 'Variants' was a fourth name for the same thing\n { name: 'variantDimensionName', type: 'text', alias: 'Varies By', section: 'variants', hint: 'Blank means one rate for everyone. \"Truck Size\", \"Stage\" or \"Equipment Class\" turns on a second dropdown on the builder and LABELS it — the rates themselves are added on the Rates tab' }, // Changed (A-0830-18): alias matches the list column 'Varies By' exactly, so the same field is not called two things on two screens\n\n { name: 'tax', type: 'section', alias: 'VAT', collapseOnView: true },\n { name: 'taxRateID', type: 'select', alias: 'Tax Rate', nullable: true, loadAction: { url: 'taxrates/list/x' }, detailsConfig: this.taxRateDetailsConfig, section: 'tax', infoMessage: 'Which VAT rate this supply attracts. Blank means \"not declared\" and the quotation falls back to the tenant default' },\n { name: 'isTaxInclusive', type: 'checkbox', alias: 'Rate includes VAT', section: 'tax', infoMessage: 'Checked: the rate above already contains the VAT and the quotation splits it out. Unchecked: VAT is added on top. Either way the quotation stores net and tax beside each other' },\n\n { name: 'availability', type: 'section', alias: 'Availability', collapseOnView: true },\n { name: 'isActive', type: 'checkbox', alias: 'On the card', defaultValue: true, section: 'availability', hint: 'Off takes it out of the builder\\'s list without deleting it or disturbing quotations already priced from it' },\n { name: 'effectiveFrom', type: 'date', alias: 'From', section: 'availability' },\n { name: 'effectiveTo', type: 'date', nullable: true, noDefault: true, alias: 'Until', section: 'availability', hint: 'Blank means it stays on the card. A quotation is priced at the card in force on the QUOTATION\\'S own date, so a sent quote is never repriced' }\n ],\n loadAction: { url: 'quotableservices/id' },\n heroField: 'quotableServiceID'\n }\n\n // Two-step create, in the mandated declaration order: edit -> detailsConfig -> view -> create. The service\n // header is step one; its variant rates are added on the Rates tab of the dialog that opens straight after.\n quotableServiceEditButton: Button = { name: 'edit', display: 'Save', dialog: true, action: { url: 'quotableservices?action=edit', method: 'post' } }\n\n quotableServiceDetailsConfig: DetailsDialogConfig = {\n formConfig: this.quotableServiceFormConfig,\n heroField: 'quotableServiceID',\n tableConfigs: [this.quotableServiceRatesTableConfig],\n buttons: [this.quotableServiceEditButton]\n }\n\n quotableServiceViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.quotableServiceDetailsConfig }\n quotableServiceCreateButton: Button = { name: 'create', display: 'New', dialog: true, onSuccessButton: this.quotableServiceViewButton, action: { url: 'quotableservices?action=create', method: 'post' } } // Changed (A-0830-18): verb only, the CLAUDE.md two-step create convention — reads \"New Service\" in the dialog header instead of \"Add Service Quotable Service\"\n\n quotableServicesTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name', 'basePrice', 'statusName'],\n flatButtons: true,\n collapseButtons: true,\n greyOut: x => !x.isActive,\n columns: [\n { name: 'name', type: 'button', alias: 'Service', detailsConfig: this.quotableServiceDetailsConfig },\n { name: 'basePrice', type: 'money', alias: 'Base Rate' },\n { name: 'unitName', type: 'text', alias: 'Charged In' },\n { name: 'pricingModelName', type: 'text', alias: 'Priced' },\n { name: 'variantDimensionName', type: 'text', alias: 'Varies By' },\n { name: 'rateCount', type: 'chip', alias: 'Rates' },\n { name: 'taxRateName', type: 'text', alias: 'VAT' },\n { name: 'statusName', type: 'chip', alias: 'Status', detailsConfig: this.quotableServiceDetailsConfig,\n colors: [\n { name: '#A5D6A7', condition: x => x.isActive },\n { name: '#E0E0E0', condition: x => !x.isActive }\n ]\n }\n ],\n buttons: [\n this.quotableServiceCreateButton,\n this.quotableServiceViewButton,\n this.quotableServiceEditButton,\n { name: 'delete', dialog: true, action: { url: 'quotableservices?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'quotableservices/all/x' },\n formConfig: this.quotableServiceFormConfig,\n entityName: 'Service' // Changed (A-0830-18): entityName reaches the operator in delete confirmations and empty states — \"Quotable Service\" is the model's name, not the page's word\n\n }\n\n //--------------------------Revenue Schedules (C7)-------------------------\n\n // Added (WS-1 sweep): paginated but deliberately NOT offline — RevenueSchedule does not implement ISync, and deferred-revenue recognition is a period-end back-office run, never a field capture\n revenueSchedulesTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['invoiceNumber', 'customerName', 'statusName'],\n flatButtons: true,\n columns: [\n { name: 'invoiceNumber', type: 'text', alias: 'Invoice #' },\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'startDate', type: 'date', alias: 'Start' },\n { name: 'endDate', type: 'date', alias: 'End' },\n { name: 'totalAmount', type: 'money', alias: 'Deferred' },\n { name: 'recognizedAmount', type: 'money', alias: 'Recognized' },\n { name: 'deferredBalance', type: 'money', alias: 'Balance' },\n { name: 'statusName', type: 'chip', alias: 'Status',\n colors: [\n { name: '#90CAF9', condition: x => x.status == 0 },\n { name: '#A5D6A7', condition: x => x.status == 1 },\n { name: '#EF9A9A', condition: x => x.status == 2 }\n ]\n }\n ],\n buttons: [\n { name: 'recognize-due', display: 'Recognize Due Periods', inHeader: true, icon: { name: 'task_alt' }, action: { url: 'revenueschedules/recognize-due/x' }, confirm: { message: 'Recognize all revenue periods that have ended?' } },\n { name: 'cancel', display: 'Cancel', icon: { name: 'close', color: 'red' }, action: { url: 'revenueschedules?action=cancel', method: 'post', successMessage: 'Schedule cancelled' }, confirm: { message: 'Cancel this schedule? The deferral journal will be voided.' }, visible: x => x.status == 0 && x.recognizedCount == 0 }\n ],\n loadAction: { url: 'revenueschedules/all/x' },\n pagination: { pageSize: 20 }, // Added: server-side pagination — one row per recognition period, so the table grows without bound\n entityName: 'RevenueSchedule',\n }\n\n //--------------------------Cash Flow / Equity (C5)-------------------------\n\n cashFlowTableConfig: TableConfig = {\n minColumns: ['label', 'amount'],\n columns: [\n { name: 'section', type: 'text', alias: 'Section' },\n { name: 'label', type: 'text', alias: 'Item' },\n { name: 'amount', type: 'money', alias: 'Amount' }\n ],\n buttons: [],\n loadAction: { url: 'reports/cash-flow' }\n }\n\n equityChangesTableConfig: TableConfig = {\n minColumns: ['account', 'closing'],\n columns: [\n { name: 'account', type: 'text', alias: 'Equity Account' },\n { name: 'opening', type: 'money', alias: 'Opening' },\n { name: 'movements', type: 'money', alias: 'Movements' },\n { name: 'closing', type: 'money', alias: 'Closing' }\n ],\n buttons: [],\n loadAction: { url: 'reports/equity-changes' }\n }\n\n //--------------------------Bank Reconciliation (C4)-------------------------\n\n // Reconcile button — onClick is wired by BankReconciliationComponent (opens the match screen)\n bankReconcileButton: Button = { name: 'reconcile', display: 'Reconcile', icon: { name: 'rule', color: 'blue' },\n onClick: () => {}\n }\n\n bankStatementImportsTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name', 'accountName', 'statusName'],\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text', alias: 'Statement' },\n { name: 'accountName', type: 'text', alias: 'Account' },\n { name: 'statementFrom', type: 'date', alias: 'From' },\n { name: 'statementTo', type: 'date', alias: 'To' },\n { name: 'closingBalance', type: 'money', alias: 'Statement Balance' },\n { name: 'matchedCount', type: 'number', alias: 'Matched' },\n { name: 'lineCount', type: 'number', alias: 'Lines' },\n { name: 'statusName', type: 'chip', alias: 'Status',\n colors: [\n { name: '#FFD54F', condition: x => x.status == 0 },\n { name: '#A5D6A7', condition: x => x.status == 1 }\n ]\n }\n ],\n buttons: [this.bankReconcileButton],\n loadAction: { url: 'bankstatementimports/all/x' },\n entityName: 'BankStatementImport'\n }\n\n //--------------------------Fiscal Periods (C2)-------------------------\n\n fiscalPeriodFormConfig: FormConfig = {\n security: { allow: [this.dataService.capAccounts] },\n title: 'Fiscal Period',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', required: true, alias: 'Name' },\n { name: 'startDate', type: 'date', required: true, alias: 'Start Date' },\n { name: 'endDate', type: 'date', required: true, alias: 'End Date' },\n { name: 'isYearEnd', type: 'checkbox', alias: 'Year-End Period' },\n { name: 'statusName', type: 'text', alias: 'Status', readonly: true, hideOnCreate: true } // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n ],\n loadAction: { url: 'fiscalperiods/id' },\n heroField: 'fiscalPeriodID'\n }\n\n fiscalPeriodCloseButton: Button = { name: 'close', display: 'Close', icon: { name: 'lock_clock' },\n action: { url: 'fiscalperiods?action=close', method: 'post', successMessage: 'Period closed' },\n confirm: { message: 'Close this period? Postings and voids dated inside it will be blocked. Year-end periods post a closing journal to Retained Earnings.' },\n visible: x => x.status == FiscalPeriodStatus.Open\n }\n\n fiscalPeriodReopenButton: Button = { name: 'reopen', display: 'Reopen', icon: { name: 'lock_open', color: 'orange' },\n action: { url: 'fiscalperiods?action=reopen', method: 'post', successMessage: 'Period reopened' },\n confirm: { message: 'Reopen this period? Any year-end closing journal will be voided.' },\n visible: x => x.status == FiscalPeriodStatus.Closed\n }\n\n fiscalPeriodLockButton: Button = { name: 'lock', display: 'Lock', icon: { name: 'lock', color: 'red' },\n action: { url: 'fiscalperiods?action=lock', method: 'post', successMessage: 'Period locked' },\n confirm: { message: 'Lock this period permanently? Locked periods cannot be reopened.' },\n visible: x => x.status == FiscalPeriodStatus.Closed\n }\n\n fiscalPeriodsTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name', 'statusName'],\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text', alias: 'Period' },\n { name: 'startDate', type: 'date', alias: 'Start' },\n { name: 'endDate', type: 'date', alias: 'End' },\n { name: 'isYearEnd', type: 'checkbox', alias: 'Year-End' },\n { name: 'statusName', type: 'chip', alias: 'Status',\n colors: [\n { name: '#A5D6A7', condition: x => x.status == FiscalPeriodStatus.Open },\n { name: '#FFD54F', condition: x => x.status == FiscalPeriodStatus.Closed },\n { name: '#EF9A9A', condition: x => x.status == FiscalPeriodStatus.Locked }\n ]\n }\n ],\n buttons: [\n { name: 'create', display: 'Create Period', dialog: true, action: { url: 'fiscalperiods?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'fiscalperiods?action=edit', method: 'post' }, visible: x => x.status == FiscalPeriodStatus.Open },\n this.fiscalPeriodCloseButton,\n this.fiscalPeriodReopenButton,\n this.fiscalPeriodLockButton\n ],\n loadAction: { url: 'fiscalperiods/all/x' },\n formConfig: this.fiscalPeriodFormConfig,\n entityName: 'FiscalPeriod'\n }\n\n constructor() {\n // Wire the Credit Note button into the invoice dialog after both configs exist (avoids forward reference)\n this.invoiceDetailsDialogConfig.buttons!.push(this.invoiceCreditNoteButton);\n // Changed: dropdown quick-add — currencyDetailsConfig is declared later in the file, so wire these selects here (avoids forward reference)\n this.accountFormConfig.fields.find(f => f.name === 'currencyID').detailsConfig = this.currencyDetailsConfig;\n this.invoicePaymentFormConfig.fields.find(f => f.name === 'currencyID').detailsConfig = this.currencyDetailsConfig;\n // Changed: dropdown quick-add — taxRateDetailsConfig is declared after invoiceItemsFormConfig, so wire this select here too\n this.invoiceItemsFormConfig.fields.find(f => f.name === 'taxRateID').detailsConfig = this.taxRateDetailsConfig;\n\n // Added (journal-account-names): mirror the accounts list onto the journal lines table's Account column. Kept to a\n // length-0 + push so the array IDENTITY the column config handed the table never changes.\n this.journalAccountOptionsSubject.subscribe(options => this.setJournalAccountOptions(options));\n\n // Added (journal-account-names): fetch the list once, off login, so it is in place BEFORE any journal dialog is\n // opened and cloned. Same shape as SetupService.loadCount — fired from a shell-level event and DELIBERATELY\n // SILENT on failure, because accounts/list/x is capability-gated (AccountsController cap52) and a user without\n // that capability must not be met with an error dialog for a list they were never going to be shown. Failing\n // leaves the Account column showing nothing it did not already show, which is a legible degradation.\n // Changed (accounts-prefetch-401): was loggedinObserv, which fires TOO EARLY to carry a token and so answered 401\n // every time. Updateloggedin(true) runs BEFORE the token is in tokenSource on BOTH auth paths — synchronously ahead\n // of UpdateToken in applyLoginResponse (auth.service.ts:250 then :251), and a whole storage round-trip ahead of it on\n // the restore path (auth.service.ts:434 vs the storage.get(AUTH_TOKEN).then at :466). LoaderInterceptor.addToken\n // (:56) reads tokenSource.value, so the request went out as a bare \"Bearer \". Measured on 4200: a fresh admin login\n // sent accounts/list/x -> 401 while setup/count -> 200 on the very same page load, because nav-menu already fires\n // ITS two calls off the token (nav-menu.component.ts:69, the F3 fix for exactly this bug). It only ever recovered\n // when an unrelated silent refresh happened to emit loggedin a second time with the token by then present — which\n // is nothing a session can rely on. Same hook as nav-menu now: the first non-empty token, distinctUntilChanged so a\n // logout/login in the same shell re-fires. The silent-fail contract in loadJournalAccounts is untouched.\n // Changed (logout-account-cache): the filter moved OFF the pipe and INTO the handler, so the empty emission that\n // clearSession produces is no longer discarded — it is the logout signal. auth.service.ts:81 calls UpdateToken('')\n // inside clearSession, which both logoff() (:115) and sessionExpired() (:97) go through, so every way out of a\n // session lands here. Previously filter(!!token) dropped that '' and journalAccountsLoaded stayed TRUE, so user #2\n // signing into the same shell re-entered loadJournalAccounts and was turned away at its own guard (:2175) —\n // keeping user #1's accounts in the journal Account column and in the line dialog's select. Cross-tenant staleness.\n // distinctUntilChanged now sits on the RAW token, which is what makes the reset reachable: tokenA -> '' -> tokenB\n // is three distinct values, where the old pipe saw only tokenA -> tokenB. The 401 fix from accounts-prefetch-401 is\n // intact — loadJournalAccounts is still only ever called on a NON-EMPTY token, i.e. after LoaderInterceptor\n // (:56) can read one out of tokenSource.value.\n this.authService.tokenObserv.pipe(distinctUntilChanged()).subscribe(token => token ? this.loadJournalAccounts() : this.clearJournalAccounts());\n }\n\n // Added (logout-account-cache): drop the previous user's accounts AND re-arm the once-per-session guard. Both halves\n // are needed and they feed different consumers: journalAccountOptions is the array the journal lines COLUMN was handed\n // (:883, mutated never reassigned — see the note at :840), while journalAccountOptionsSubject is the one the line\n // dialog's Account SELECT reuses (:865). Emitting [] on the subject is deliberately NOT routed through\n // setJournalAccountOptions, which early-returns on an empty array by design (:2169) — that guard exists to stop a\n // BehaviorSubject's pre-fetch [] blanking a good list, and it must not stop a real logout from blanking a stale one.\n // Safe to run more than once and safe on the BehaviorSubject's own initial '' at construction: it is idempotent.\n private clearJournalAccounts() {\n this.journalAccountsLoaded = false;\n this.journalAccountOptions.length = 0;\n this.journalAccountOptionsSubject.next([]);\n }\n\n // Added (journal-account-names): an EMPTY emission is the pre-fetch state of the field's BehaviorSubject, not a real\n // \"this tenant has no accounts\" answer — honouring it would blank a list that is already correct.\n private setJournalAccountOptions(options: any) {\n if (!Array.isArray(options) || !options.length) return;\n this.journalAccountOptions.length = 0;\n this.journalAccountOptions.push(...options);\n }\n\n private loadJournalAccounts() {\n if (this.journalAccountsLoaded) return;\n this.journalAccountsLoaded = true;\n this.dataService.CallApi({ url: 'accounts/list/x' }).subscribe({\n next: (apiResponse: ApiResponse) => { if (apiResponse.success) this.setJournalAccountOptions(apiResponse.data); },\n error: () => { this.journalAccountsLoaded = false; } // let a later login retry rather than latching the failure for the session\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormConfig, TableConfig, DetailsDialogConfig, Button, StepConfig } from '../classes/Classes';\nimport { DataServiceLib } from './datalib.service';\nimport { InventoryService } from './inventory.service'; // Changed: Import for product detailsConfig reference\nimport { AccountingService } from './accounting.service'; // Changed: dropdown quick-add — currency config for currency selects\n\n// Changed: Sales service extracted from inventory.service.ts for Sales module\n@Injectable({\n providedIn: 'root'\n})\nexport class SalesService {\n\n private dataService = inject(DataServiceLib);\n private inventoryService = inject(InventoryService); // Changed: Reference for product detailsConfig\n private accountingService = inject(AccountingService); // Changed: dropdown quick-add — currency config for currency selects\n\n //--------------------------Sales Order Items-------------------------\n\n salesOrderItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSalesOrders] }, // Added: gate sales order item form by sales orders cap (parent entity)\n title: 'Sales Order Item',\n fixedTitle: true,\n fields: [\n { name: 'productID', type: 'select', alias: 'Product', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.inventoryService.productDetailsConfig },\n { name: 'quantity', type: 'number', alias: 'Quantity', required: true },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price', required: true },\n { name: 'discount', type: 'money', alias: 'Discount' },\n { name: 'lineTotal', type: 'money', alias: 'Line Total', readonly: true },\n { name: 'inventoryItemID', type: 'select', alias: 'Serial Number', loadAction: { url: 'inventoryitems/list/x' } }\n ],\n loadAction: { url: 'salesorderitems/id' }\n }\n\n salesOrderItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n // Added (delivered-order-lines-ui-gate): the three line buttons below are HIDDEN on a Delivered(2)/Cancelled(3) order, which on its own leaves the user staring at an uneditable list with nothing saying why or what to do instead. This is the same predicate as those buttons, reading config.parentData (the parent order), and the wording is the server's own from SalesOrderItemsController.CheckParentOrderOpen (lines 128 and 131) minus its \"record of account\" clause — same remedies, named in the same words, so the caption and a refusal toast can never contradict each other. The lines themselves stay listed and readable; only the writes are gone.\n caption: (o) => o?.status === 2 ? 'Cannot change lines on a delivered order — void the sale, raise a credit note against its invoice, then capture a new order.' : o?.status === 3 ? 'Cannot change lines on a cancelled order. Capture a new order instead.' : '',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'quantity', type: 'number', alias: 'Quantity' },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price' },\n { name: 'discount', type: 'money', alias: 'Discount' },\n { name: 'lineTotal', type: 'money', alias: 'Line Total' },\n { name: 'serialNumber', type: 'text', alias: 'Serial Number' }\n ],\n buttons: [\n // Added (delivered-order-lines-ui-gate): mirror the server refusal in SalesOrderItemsController.CheckParentOrderOpen. Boundary is Delivered(2)/Cancelled(3) ONLY — Confirmed(1) stays editable because SalesOrdersController.OwnsSubTotal keeps that window open. 'create' renders in the table header and its predicate receives config.parentData (the parent order, so .status); 'edit'/'delete' render in the row and receive the line, which now carries orderStatus from the controller projection. Optional chaining is required — the predicate is called before the record arrives.\n { name: 'create', display: 'Add Item', dialog: true, hidden: (o) => o?.status === 2 || o?.status === 3, action: { url: 'salesorderitems?action=create', method: 'post' } },\n { name: 'edit', dialog: true, hidden: (r) => r?.orderStatus === 2 || r?.orderStatus === 3, action: { url: 'salesorderitems?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, hidden: (r) => r?.orderStatus === 2 || r?.orderStatus === 3, action: { url: 'salesorderitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'salesorderitems/x/x' }, loadCriteria: 'order', loadIDField: 'salesOrderID',\n formConfig: this.salesOrderItemFormConfig\n }\n\n //--------------------------Sales Orders-------------------------\n\n salesOrderFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSalesOrders] },\n title: 'Sales Order',\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'orderInfo', type: 'section', alias: 'Order Information' },\n { name: 'orderNumber', type: 'text', alias: 'Order #', readonly: true, section: 'orderInfo' },\n { name: 'customerID', type: 'select', required: true, alias: 'Customer', section: 'orderInfo', loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig },\n { name: 'orderDate', type: 'date', max: 'today', required: true, alias: 'Order Date', section: 'orderInfo' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'requiredDate', type: 'date', alias: 'Required Date', section: 'orderInfo' },\n { name: 'quickProcess', type: 'section', alias: 'Quick Processing' },\n { name: 'quickDelivery', type: 'checkbox', alias: 'Quick Delivery (Skip to Delivered)', section: 'quickProcess' },\n { name: 'deliveredDate', type: 'date', max: 'today', alias: 'Delivery Date', section: 'quickProcess' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'paymentInfo', type: 'section', alias: 'Payment (For Delivery)', collapseOnView: true },\n { name: 'paymentMethod', type: 'select', alias: 'Payment Method', section: 'paymentInfo', options: [{ name: 'Cash', value: 0 }, { name: 'Bank Transfer', value: 1 }, { name: 'Mobile Money', value: 2 }, { name: 'Card', value: 3 }, { name: 'Credit', value: 4 }, { name: 'Complementary', value: 5 }] },\n { name: 'paymentReference', type: 'text', alias: 'Payment Reference', section: 'paymentInfo' },\n { name: 'status', type: 'select', alias: 'Status', readonly: true, serverOwned: true, hideOnCreate: true, loadAction: { url: 'salesorders/list/status' } }, // Changed (CFW-1): SalesOrder.Status carries [ServerOwned]; serverOwned omits the key on create too — Draft is 0, exactly what the server's create-bind reset writes, and the create POST was re-driven to confirm no 400 (hideOnCreate had previously been added because an omitted status DID 400)\n { name: 'totals', type: 'section', alias: 'Totals', collapseOnView: true },\n { name: 'subTotal', type: 'money', alias: 'Sub Total', readonly: true, section: 'totals' },\n { name: 'discount', type: 'money', alias: 'Discount', section: 'totals' },\n { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals' },\n { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapseOnView: true },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo' }\n ],\n loadAction: { url: 'salesorders/id' },\n heroField: 'salesOrderID'\n }\n\n salesOrderEditButton: Button = { name: 'edit', dialog: true, action: { url: 'salesorders?action=edit', method: 'post' } }\n // Changed: colour was the Material palette name 'primary', which getButtonColor puts verbatim into\n // [style.color] and which therefore computed to the inherited grey. 'blue' is the house CSS keyword, and it\n // keeps 'green' meaning the terminal step (Mark Delivered, below).\n salesOrderConfirmButton: Button = { name: 'confirm', display: 'Confirm Order', icon: { name: 'check_circle', color: 'blue' }, inDialog : true, action: { url: 'salesorders?action=confirm', method: 'post', successMessage: 'Order Confirmed' }, confirm: { message: 'Confirm this order?' }, visible: (row) => row.status === 0 }\n salesOrderDeliverButton: Button = { name: 'deliver', display: 'Mark Delivered', icon: { name: 'local_shipping', color: 'green' }, inDialog : true, action: { url: 'salesorders?action=deliver', method: 'post', successMessage: 'Order Delivered' }, confirm: { message: 'Mark this order as delivered?' }, visible: (row) => row.status === 1 }\n\n salesOrderDetailsConfig: DetailsDialogConfig = {\n formConfig: this.salesOrderFormConfig,\n tableConfigs: [this.salesOrderItemsTableConfig],\n heroField: 'salesOrderID',\n buttons: [ this.salesOrderEditButton, this.salesOrderConfirmButton, this.salesOrderDeliverButton]\n }\n\n salesOrderViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.salesOrderDetailsConfig }\n\n salesOrdersTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['orderNumber', 'displayCustomerName', 'orderDate'],\n columns: [\n { name: 'orderNumber', type: 'text', alias: 'Order #' },\n { name: 'displayCustomerName', type: 'text', alias: 'Customer' },\n { name: 'orderDate', type: 'date', alias: 'Order Date' },\n { name: 'requiredDate', type: 'date', alias: 'Required Date' },\n { name: 'deliveredDate', type: 'date', alias: 'Delivered Date' },\n { name: 'status', type: 'text', alias: 'Status' },\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'pendingApproval', type: 'checkbox', alias: 'Pending' }\n ],\n buttons: [\n { name: 'create', display: 'New Order', dialog: true, action: { url: 'salesorders?action=create', method: 'post' }, onSuccessButton: this.salesOrderViewButton},\n { name: 'view', dialog: true, detailsConfig: this.salesOrderDetailsConfig },\n { name: 'edit', dialog: true, detailsConfig: this.salesOrderDetailsConfig },\n { name: 'delete', dialog: true, action: { url: 'salesorders?action=delete', method: 'post' } },\n this.salesOrderConfirmButton,\n this.salesOrderDeliverButton\n ],\n loadAction: { url: 'salesorders/all/x' },\n formConfig: this.salesOrderFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — sales orders append continuously\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — orders are taken in front of the customer; create/edit queue offline\n entityName: 'SalesOrder',\n }\n\n //--------------------------Sale Items-------------------------\n\n saleItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSales] },\n title: 'Sale Item',\n fixedTitle: true,\n fields: [\n { name: 'productID', type: 'select', required: true, alias: 'Product', span: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.inventoryService.productDetailsConfig, // Changed: dropdown quick-add\n onSelectChange: (selectedProductId: number, formData: any, option?: any) => {\n if (option && option.sellingPrice) {\n formData.unitPrice = option.sellingPrice;\n }\n }\n },\n { name: 'quantity', type: 'number', required: true, alias: 'Quantity' },\n { name: 'unitPrice', type: 'money', required: true, alias: 'Unit Price' },\n { name: 'discount', type: 'money', alias: 'Discount', hideOnCreate: true },\n { name: 'inventoryItemID', type: 'select', alias: 'Serial Number', loadAction: { url: 'inventoryitems/list/serialized' } }\n ],\n loadAction: { url: 'saleitems/id' }\n }\n\n saleItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'quantity', type: 'number', alias: 'Quantity' },\n { name: 'unitPrice', type: 'money', alias: 'Unit Price' },\n { name: 'discount', type: 'money', alias: 'Discount' },\n { name: 'lineTotal', type: 'money', alias: 'Line Total' },\n { name: 'serialNumber', type: 'text', alias: 'Serial Number' }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'saleitems?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'saleitems?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'saleitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'saleitems/x/x' }, loadCriteria: 'sale', loadIDField: 'saleID',\n formConfig: this.saleItemFormConfig\n }\n\n //--------------------------Sales-------------------------\n\n saleFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSales] },\n title: 'Sale',\n fixedTitle: true,\n alertConfig: {\n compact: true,\n sticky : true,\n messages: [\n { message: 'Please add sale items and click complete to finalise the sale', type: 'success',\n visible: (x: any) => x.paymentStatus === 0\n }\n ]\n },\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'saleInfo', type: 'section', alias: 'Sale Information' },\n { name: 'saleDate', type: 'date', max: 'today', required: true, alias: 'Sale Date', section: 'saleInfo', infoMessage: 'Date when the sale was completed' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'customerID', type: 'select', required: true, alias: 'Customer', section: 'saleInfo', loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig },\n { name: 'timing', type: 'select', required: true, alias: 'Transaction Type', section: 'saleInfo', loadAction: { url: 'sales/list/timing' }, defaultFirstValue : true, infoMessage: 'Cash Sale (pay now) or Credit Sale (pay later)' },\n { name: 'currencyID', type: 'select', alias: 'Currency', section: 'saleInfo', loadAction: { url: 'currencies/list/x' }, defaultFirstValue: true, detailsConfig: this.accountingService.currencyDetailsConfig, infoMessage: 'Currency for this sale (defaults to base currency)' }, // Changed: dropdown quick-add\n { name: 'paymentMethod', type: 'select', required: true, alias: 'Payment Method', section: 'saleInfo', defaultFirstValue: true, infoMessage: 'Method of payment used for this sale', requiredCondition: x => x.timing === 0, hidden: x => x.timing === 1,\n options: [\n { name: 'Cash', value: 0 },\n { name: 'Bank Transfer', value: 1 },\n { name: 'Mobile Money', value: 2 },\n { name: 'Card', value: 3 },\n { name: 'Complementary', value: 5 }\n ],\n },\n { name: 'multipleProducts', type: 'checkbox', alias: 'Multiple Products', defaultValue: false, hideOnExists: true, infoMessage: 'Check this box if you want to add multiple products to this sale' },\n { name: 'saleType', type: 'select', required: true, alias: 'Sale Type', section: 'saleInfo', options: [{ name: 'Quick Sale', value: 0 }, { name: 'From Order', value: 1 }], defaultFirstValue: true, hideOnCreate: true, infoMessage: 'Select if this is a quick sale or created from an order' },\n { name: 'quickSaleItem', type: 'section', alias: 'Quick Sale Item', hidden: x => x.multipleProducts === true || x.saleID },\n { name: 'productID', type: 'select', required: true, alias: 'Product', section: 'quickSaleItem', span: true, loadAction: { url: 'products/list/x' }, hidden: x => x.multipleProducts === true, detailsConfig: this.inventoryService.productDetailsConfig, // Changed: dropdown quick-add\n onSelectChange: (selectedProductId: number, formData: any, option?: any) => {\n if (option && option.sellingPrice) {\n formData.unitPrice = option.sellingPrice;\n }\n }\n },\n { name: 'quantity', type: 'number', required: true, alias: 'Quantity', section: 'quickSaleItem', defaultValue: 1, hidden: x => x.multipleProducts === true, infoMessage: 'Quantity of the product' },\n { name: 'unitPrice', type: 'money', required: true, alias: 'Unit Price', section: 'quickSaleItem', hidden: x => x.multipleProducts === true, infoMessage: 'Price per unit' },\n { name: 'totals', type: 'section', alias: 'Totals', collapseOnView: true, hideOnCreate: true },\n { name: 'subTotal', type: 'money', alias: 'Sub Total', readonly: true, section: 'totals', infoMessage: 'Total before tax and discounts' },\n { name: 'taxAmount', type: 'money', alias: 'Tax Amount', section: 'totals', infoMessage: 'Tax amount applied to the sale' },\n { name: 'discount', type: 'money', alias: 'Discount', section: 'totals', infoMessage: 'Discount amount applied to the sale' },\n { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals', infoMessage: 'Final amount after tax and discounts' },\n { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapseOnView: true },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo', infoMessage: 'Additional notes or comments about this sale' },\n { name: 'paymentReference', type: 'text', alias: 'Payment Reference', section: 'additionalInfo', infoMessage: 'Transaction reference number or payment receipt', hidden: x => x.timing === 1 },\n ],\n loadAction: { url: 'sales/id' },\n heroField: 'saleID'\n }\n\n saleStepConfig: StepConfig = {\n valueField: 'paymentStatus',\n sticky: true,\n steps: [\n { name: 'Unpaid', value: 0, icon: 'hourglass_empty' },\n { name: 'Paid', value: 1, icon: 'check_circle' },\n { name: 'Partial', value: 2, icon: 'payment' }\n ]\n }\n\n salePaymentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSales] },\n title: 'Record Payment',\n fixedTitle: true,\n fields: [\n { name: 'saleID', type: 'number', hidden: true },\n { name: 'paymentDate', type: 'date', alias: 'Payment Date', required: true }, // Changed (NFD-3): max: 'today' REMOVED — a post-dated payment instrument is ordinary business, so a future payment date is a valid answer; verified the server (InvoiceService.RecordPayment) does not reject one either. Pinned by payment-date-uncapped-guard.spec.ts.\n { name: 'method', type: 'select', alias: 'Payment Method', required: true, defaultValue: 1, loadAction: { url: 'invoicepayments/list/methods' } },\n { name: 'currencyID', type: 'select', alias: 'Currency', loadAction: { url: 'currencies/list/x' }, defaultFirstValue: true, detailsConfig: this.accountingService.currencyDetailsConfig, infoMessage: 'Currency for this payment (defaults to base currency)' }, // Changed: dropdown quick-add\n { name: 'totalAmount', type: 'text', alias: 'Total Amount', readonly: true }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n { name: 'amount', type: 'money', alias: 'Amount', required: true, span: true },\n { name: 'paymentReferenceTemp', type: 'text', alias: 'Reference', span: true }\n ],\n }\n\n salePaymentCreateButton: Button = { name: 'edit', action: { url: 'sales?action=record-payment', method: 'post', successMessage: 'Payment recorded successfully' } };\n\n salePaymentDetailsConfig: DetailsDialogConfig = {\n formConfig: this.salePaymentFormConfig,\n heroField: 'saleID',\n mode: 'edit',\n seedDefaults: true, // Added: CAPTURE dialog on mode:'edit' (posts sales?action=record-payment). VERIFIED NO-OP TODAY, same reason as the invoice dialog: SalesController.cs:98 projects Method = InvoicePaymentMethod.Bank onto the sale row, so `method` arrives populated and the only-empty guard skips it. Kept as the declared fallback\n buttons: [this.salePaymentCreateButton]\n }\n\n saleRecordPaymentButton: Button = { name: 'record-payment', display: 'Record Payment', inDialog: true, dialog: true, icon: { name: 'payment', color: 'blue' }, detailsConfig: this.salePaymentDetailsConfig, visible: x => x.timing === 1 && x.paymentStatus !== 1 }\n\n salePaymentsTableConfig: TableConfig = {\n tabTitle: 'Payment History',\n showFilter: false,\n minColumns: ['paymentDate', 'amount', 'methodName'],\n columns: [\n { name: 'paymentDate', type: 'date', alias: 'Date' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'methodName', type: 'text', alias: 'Method' },\n { name: 'reference', type: 'text', alias: 'Reference' }\n ],\n loadAction: { url: 'invoicepayments/x/x' }, loadCriteria: 'invoice', loadIDField: 'invoiceID',\n hidden: (x: any) => x.timing !== 1\n }\n\n saleDetailsConfig: DetailsDialogConfig = {\n formConfig: this.saleFormConfig,\n tableConfigs: [this.saleItemsTableConfig, this.salePaymentsTableConfig],\n heroField: 'saleID',\n stepConfig: this.saleStepConfig,\n buttons: [\n { name: 'complete', display: 'Complete Sale', color: 'green', inDialog: true, action: { url: 'sales?action=complete', method: 'post' }, confirm: { message: 'Complete this sale? This will reduce inventory and create accounting entries.' }, visible: x => x.timing === 0 && x.paymentStatus !== 1 },\n this.saleRecordPaymentButton\n ]\n }\n\n saleViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.saleDetailsConfig }\n saleCreateButton: Button = { name: 'create', display: 'Quick Sale', dialog: true, action: { url: 'sales?action=create', method: 'post' } };\n saleVoidButton: Button = { name: 'void', display: 'Void', icon: { name: 'undo', color: 'red' }, confirm: { message: 'Caution: Voiding this sale will reverse all inventory transactions and void accounting entries. This action cannot be undone.' }, action: { url: 'sales?action=void', method: 'post', successMessage: 'Sale voided successfully' }, visible: (row) => !row.deleted };\n\n salesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['saleNumber', 'displayCustomerName', 'totalAmount'],\n columns: [\n { name: 'saleDate', type: 'date', alias: 'Date' },\n { name: 'displayCustomerName', type: 'text', alias: 'Customer' },\n { name: 'detailsDisplay', type: 'text', alias: 'Details' }, // Changed: Renamed from productsDisplay/Products\n { name: 'timingName', type: 'text', alias: 'Payment' },\n { name: 'paymentStatus', type: 'icon', alias: 'Status', detailsConfig: this.saleDetailsConfig,\n icons: [\n { name: 'article', color: '#9E9E9E', condition: (x: any) => x.paymentStatus === 0, tip: 'Unpaid' },\n { name: 'inventory_2', color: '#2196F3', condition: (x: any) => x.paymentStatus === 2, tip: 'Partial' },\n { name: 'check_circle', color: '#4CAF50', condition: (x: any) => x.paymentStatus === 1, tip: 'Paid' }\n ]\n },\n { name: 'subTotal', type: 'money', alias: 'Sub Total' },\n { name: 'taxAmount', type: 'money', alias: 'Tax' },\n { name: 'totalAmount', type: 'money', alias: 'Total' }\n ],\n buttons: [\n this.saleViewButton,\n this.saleRecordPaymentButton,\n this.saleCreateButton,\n this.saleVoidButton\n ],\n loadAction: { url: 'sales/all/x' },\n formConfig: this.saleFormConfig,\n pagination: { pageSize: 15 }, // Added: server-side pagination — sales are wide money rows (customer join, line totals, payment state) and the highest-volume grid in sales\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — sales are captured at the point of sale, where the connection is least reliable\n entityName: 'Sale',\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormConfig, TableConfig, DetailsDialogConfig, Button, StepConfig, PurchaseStatus, TileConfig } from '../classes/Classes'; // Changed: InventoryReceiptStatus → PurchaseStatus\nimport { DataServiceLib } from './datalib.service';\nimport { InventoryService } from './inventory.service';\nimport { AccountingService } from './accounting.service'; // Changed: dropdown quick-add — currency config for currency selects\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PurchasingService {\n\n private dataService = inject(DataServiceLib);\n private inventoryService = inject(InventoryService);\n private accountingService = inject(AccountingService); // Changed: dropdown quick-add — currency config for currency selects\n\n // Changed: Updated references from inventoryReceiptDetailsConfig to purchaseDetailsConfig\n constructor() {\n this.purchaseDetailsConfig.tableConfigs!.push(this.receiptsTableConfig); // Added: Receipts tab in purchase details\n this.purchaseDetailsConfig.tableConfigs!.push(this.supplierPaymentsTableConfig);\n this.purchaseDetailsConfig.buttons!.push(this.supplierRecordPaymentButton);\n }\n\n //--------------------------Purchase Orders-------------------------\n\n private paymentTypeOptions = [\n { value: 0, name: 'Cash' },\n { value: 1, name: 'Bank' }\n ];\n\n supplierPurchaseOrderItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSupplierPurchaseOrders] }, // Changed (menucap-1 M2): cap38 -> cap47. SupplierPurchaseOrderItemsController.cs:16 gates this data on cap47, and the menu entry is drawn on cap47 (datalib.service.ts:586-588) — this form was the only side saying cap38, so a cap47 holder the API would serve was refused by the front end\n title: 'PO Item',\n fixedTitle: true,\n fields: [\n { name: 'productID', type: 'select', alias: 'Product', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.inventoryService.productDetailsConfig },\n { name: 'orderedQuantity', type: 'number', alias: 'Quantity', required: true },\n { name: 'estimatedUnitCost', type: 'money', alias: 'Est. Unit Cost', required: true },\n { name: 'lineTotal', type: 'money', alias: 'Line Total', readonly: true, hideOnCreate: true }\n ],\n loadAction: { url: 'supplierpurchaseorderitems/id' }\n }\n\n supplierPurchaseOrderItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'orderedQuantity', type: 'number', alias: 'Ordered' },\n { name: 'receivedQuantity', type: 'number', alias: 'Received' },\n { name: 'remainingQuantity', type: 'number', alias: 'Remaining' },\n { name: 'estimatedUnitCost', type: 'money', alias: 'Est. Cost' },\n { name: 'lineTotal', type: 'money', alias: 'Line Total' },\n { name: 'isFullyReceived', type: 'checkbox', alias: 'Complete', icon: { name: 'check_circle', color: 'green' } }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'supplierpurchaseorderitems?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'supplierpurchaseorderitems?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'supplierpurchaseorderitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'supplierpurchaseorderitems/x/x' },\n loadCriteria: 'po',\n loadIDField: 'supplierPurchaseOrderID',\n formConfig: this.supplierPurchaseOrderItemFormConfig\n }\n\n supplierPurchaseOrderFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSupplierPurchaseOrders] }, // Changed (menucap-1 M2): cap38 -> cap47, matching SupplierPurchaseOrdersController.cs:17 and the cap47 menu entry. The other six capInventoryReceipts gates in this file are purchases/receipts/payments and correctly match their own cap38 controllers\n title: 'Purchase Order',\n fixedTitle: true,\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'poInfo', type: 'section', alias: 'Purchase Order Information' },\n { name: 'poNumber', type: 'text', alias: 'PO Number', readonly: true, hideOnCreate: true, section: 'poInfo' },\n { name: 'supplierID', type: 'select', required: true, alias: 'Supplier', section: 'poInfo', loadAction: { url: 'suppliers/list/x' }, detailsConfig: this.dataService.supplierDetailsConfig },\n { name: 'orderDate', type: 'date', max: 'today', required: true, alias: 'Order Date', section: 'poInfo' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'expectedDeliveryDate', type: 'date', alias: 'Expected Delivery', section: 'poInfo' },\n { name: 'totals', type: 'section', alias: 'Totals', hideOnCreate: true, collapseOnView: true },\n { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals' },\n { name: 'totalReceivedAmount', type: 'money', alias: 'Received Amount', readonly: true, section: 'totals' },\n { name: 'remainingAmount', type: 'money', alias: 'Remaining', readonly: true, section: 'totals' },\n { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapseOnView: true },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo' }\n ],\n loadAction: { url: 'supplierpurchaseorders/id' },\n heroField: 'supplierPurchaseOrderID'\n }\n\n receiveGoodsFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReceipts] }, // Added: gate receive goods form by purchasing cap\n title: 'Receive Goods',\n multiColumn: true,\n fields: [\n { name: 'supplierPurchaseOrderID', type: 'number', alias: 'PO ID', readonly: true, hidden: true },\n { name: 'poNumber', type: 'text', alias: 'PO Number', readonly: true },\n { name: 'supplierID', type: 'number', alias: 'Supplier ID', readonly: true, hidden: true },\n { name: 'supplierName', type: 'text', alias: 'Supplier', readonly: true },\n { name: 'purchaseDate', type: 'date', max: 'today', required: true, alias: 'Purchase Date' }, // Changed: receiptDate → purchaseDate // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'paymentType', type: 'select', required: true, alias: 'Payment Type', options: this.paymentTypeOptions },\n { name: 'supplierInvoiceNumber', type: 'text', alias: 'Supplier Invoice #' },\n { name: 'notes', type: 'text', alias: 'Notes', span: true }\n ]\n }\n\n receiveGoodsDetailsConfig: DetailsDialogConfig = {\n formConfig: this.receiveGoodsFormConfig,\n buttons: []\n }\n\n supplierPurchaseOrderEditButton: Button = { name: 'edit', dialog: true, action: { url: 'supplierpurchaseorders?action=edit', method: 'post' } }\n supplierPurchaseOrderConfirmButton: Button = { name: 'confirm', display: 'Confirm PO', inDialog: true, icon: { name: 'check_circle', color: 'blue' }, action: { url: 'supplierpurchaseorders?action=confirm', method: 'post', successMessage: 'PO Confirmed' }, confirm: { message: 'Confirm this purchase order? Items will be locked.' }, visible: (po: any) => po.statusName === 'Draft' }\n supplierPurchaseOrderCancelButton: Button = { name: 'cancel', display: 'Cancel PO', inDialog: true, icon: { name: 'cancel', color: 'red' }, action: { url: 'supplierpurchaseorders?action=cancel', method: 'post', successMessage: 'PO Cancelled' }, confirm: { message: 'Cancel this purchase order?' }, visible: (po: any) => po.statusName !== 'FullyReceived' && po.statusName !== 'PartiallyReceived' }\n\n supplierPurchaseOrderReceiveButton: Button = {\n name: 'receive',\n display: 'Receive Goods',\n inDialog: true,\n icon: { name: 'inventory_2', color: 'green' },\n dialog: true,\n detailsConfig: this.receiveGoodsDetailsConfig,\n action: { url: 'purchases?action=create', method: 'post' }, // Changed: inventoryreceipts → purchases\n visible: (po: any) => po.statusName === 'Confirmed' || po.statusName === 'PartiallyReceived'\n }\n\n supplierPurchaseOrderDetailsConfig: DetailsDialogConfig = {\n formConfig: this.supplierPurchaseOrderFormConfig,\n tableConfigs: [this.supplierPurchaseOrderItemsTableConfig],\n heroField: 'supplierPurchaseOrderID',\n buttons: [this.supplierPurchaseOrderEditButton, this.supplierPurchaseOrderConfirmButton, this.supplierPurchaseOrderReceiveButton, this.supplierPurchaseOrderCancelButton]\n }\n\n supplierPurchaseOrderViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.supplierPurchaseOrderDetailsConfig }\n\n supplierPurchaseOrdersTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['poNumber', 'supplierName', 'orderDate'],\n columns: [\n { name: 'poNumber', type: 'text', alias: 'PO #' },\n { name: 'supplierName', type: 'text', alias: 'Supplier' },\n { name: 'orderDate', type: 'date', alias: 'Order Date' },\n { name: 'expectedDeliveryDate', type: 'date', alias: 'Expected Delivery' },\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'totalReceivedAmount', type: 'money', alias: 'Received' },\n { name: 'remainingAmount', type: 'money', alias: 'Remaining' },\n { name: 'statusName', type: 'chip', alias: 'Status', colors: [{ name: '#E0E0E0', condition: x => x.statusName == 'Draft' }, { name: '#BBDEFB', condition: x => x.statusName == 'Confirmed' }, { name: '#FFE0B2', condition: x => x.statusName == 'PartiallyReceived' }, { name: '#C8E6C9', condition: x => x.statusName == 'FullyReceived' }, { name: '#FFCDD2', condition: x => x.statusName == 'Cancelled' }] }\n ],\n buttons: [\n { name: 'create', display: 'New Purchase Order', dialog: true, action: { url: 'supplierpurchaseorders?action=create', method: 'post' }, onSuccessButton: this.supplierPurchaseOrderViewButton },\n { name: 'view', dialog: true, detailsConfig: this.supplierPurchaseOrderDetailsConfig },\n { name: 'delete', dialog: true, action: { url: 'supplierpurchaseorders?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'supplierpurchaseorders/all/x' },\n formConfig: this.supplierPurchaseOrderFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — purchase orders append continuously\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — POs are raised on supplier visits as well as at the desk\n entityName: 'SupplierPurchaseOrder',\n }\n\n //--------------------------Purchases (renamed from Inventory Receipts)-------------------------\n\n // Changed: Renamed from inventoryReceiptItemFormConfig to purchaseItemFormConfig\n purchaseItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReceipts] }, // Added: gate purchase item form by purchasing cap (parent)\n title: 'Purchase Item', // Changed: \"Receipt Item\" → \"Purchase Item\"\n fixedTitle: true,\n fields: [\n { name: 'productID', type: 'select', alias: 'Product', required: true, span: true,\n loadAction: { url: 'products/list/x' },\n detailsConfig: this.inventoryService.productDetailsConfig, infoMessage: 'Product being received'\n },\n { name: 'quantity', type: 'number', alias: 'Quantity', required: true, infoMessage: 'Number of units received' },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost', required: true, infoMessage: 'Cost per unit' },\n { name: 'taxRateID', type: 'select', alias: 'Tax Rate', nullable: true, loadAction: { url: 'products/list/tax-rates' }, detailsConfig: this.accountingService.taxRateDetailsConfig, infoMessage: 'VAT rate on this purchase line — claimable input VAT (B3)' }, // Changed: dropdown quick-add\n { name: 'isTaxInclusive', type: 'checkbox', alias: 'Cost includes Tax', infoMessage: 'If checked, the unit cost already includes VAT' }, // Changed: Tax-inclusive flag\n { name: 'serialNumbers', type: 'text', alias: 'Serial Numbers (comma-separated)', infoMessage: 'Comma-separated list of serial numbers for tracked items' }\n ],\n loadAction: { url: 'purchaseitems/id' } // Changed: inventoryreceiptitems → purchaseitems\n }\n\n // Changed: Renamed from inventoryReceiptItemsTableConfig to purchaseItemsTableConfig\n purchaseItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'quantity', type: 'number', alias: 'Quantity' },\n { name: 'unitName', type: 'text', alias: 'Unit' },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost' },\n { name: 'taxAmount', type: 'money', alias: 'VAT' }, // Changed: Input VAT column (B3)\n { name: 'lineTotal', type: 'money', alias: 'Line Total' }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'purchaseitems?action=create', method: 'post' } }, // Changed: inventoryreceiptitems → purchaseitems\n { name: 'edit', dialog: true, action: { url: 'purchaseitems?action=edit', method: 'post' } }, // Changed: inventoryreceiptitems → purchaseitems\n { name: 'delete', dialog: true, action: { url: 'purchaseitems?action=delete', method: 'post' } } // Changed: inventoryreceiptitems → purchaseitems\n ],\n loadAction: { url: 'purchaseitems/x/x' }, loadCriteria: 'purchase', loadIDField: 'purchaseID', // Changed: inventoryreceiptitems → purchaseitems, receipt → purchase, inventoryReceiptID → purchaseID\n formConfig: this.purchaseItemFormConfig // Changed: inventoryReceiptItemFormConfig → purchaseItemFormConfig\n }\n\n // Changed: Renamed from inventoryReceiptFormConfig to purchaseFormConfig\n purchaseFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReceipts] },\n title: 'Purchase', // Changed: \"Inventory Receipt\" → \"Purchase\"\n alertConfig: {\n compact: true,\n messages: [\n { message: 'Please capture the products purchased and click complete to proceed', type: 'success',\n visible: (x: any) => x.status === PurchaseStatus.Draft || x.status === PurchaseStatus.Confirmed // Changed: InventoryReceiptStatus → PurchaseStatus, Receiving → Confirmed\n }]\n },\n fixedTitle: true,\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'purchaseInfo', type: 'section', alias: 'Purchase Information' }, // Changed: receiptInfo → purchaseInfo\n\n { name: 'purchaseDate', type: 'date', max: 'today', required: true, alias: 'Purchase Date', section: 'purchaseInfo', infoMessage: 'Date goods were purchased' }, // Changed: receiptDate → purchaseDate, receiptInfo → purchaseInfo // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'supplierID', type: 'select', required: true, alias: 'Supplier', section: 'purchaseInfo', // Changed: receiptInfo → purchaseInfo\n loadAction: { url: 'suppliers/list/x' }, detailsConfig: this.dataService.supplierDetailsConfig, infoMessage: 'Supplier providing the goods'\n },\n { name: 'timing', type: 'select', required: true, alias: 'Transaction Type', section: 'purchaseInfo', // Changed: receiptInfo → purchaseInfo\n loadAction: { url: 'purchases/list/timing' }, defaultFirstValue: true, // Changed: inventoryreceipts → purchases\n infoMessage: 'Cash Purchase (pay now) or Credit Purchase (pay later)'\n },\n { name: 'currencyID', type: 'select', alias: 'Currency', section: 'purchaseInfo', loadAction: { url: 'currencies/list/x' }, defaultFirstValue: true, detailsConfig: this.accountingService.currencyDetailsConfig, infoMessage: 'Currency for this purchase (defaults to base currency)' }, // Changed: dropdown quick-add\n\n { name: 'paymentType', type: 'select', required: true, alias: 'Payment Method', section: 'purchaseInfo', defaultFirstValue: true, // Changed: receiptInfo → purchaseInfo\n options: this.paymentTypeOptions, infoMessage: 'Payment method used for this purchase',\n hidden: x => x.timing === 1,\n requiredCondition: x => x.timing === 0\n },\n\n { name: 'purchaseNumber', type: 'text', alias: 'Purchase Number', readonly: true, hideOnCreate: true, section: 'purchaseInfo', infoMessage: 'Auto-generated unique purchase identifier' }, // Changed: receiptNumber → purchaseNumber\n { name: 'poNumber', type: 'text', alias: 'PO Number', hideOnCreate: true, section: 'purchaseInfo', infoMessage: 'Linked purchase order if receiving against a PO', // Changed: receiptInfo → purchaseInfo\n hidden: (row) => !row.supplierPurchaseOrderID,\n },\n { name: 'multipleProducts', type: 'checkbox', alias: 'Multiple Products', defaultValue: false, hideOnExists: true, infoMessage: 'Check this box if you want to add multiple products to this purchase' }, // Changed: receipt → purchase\n\n { name: 'quickPurchaseItem', type: 'section', alias: 'Quick Purchase Item',\n hidden: x => x.multipleProducts === true || x.purchaseID // Changed: inventoryReceiptID → purchaseID\n },\n { name: 'productID', type: 'select', required: true, alias: 'Product', section: 'quickPurchaseItem', span: true,\n loadAction: { url: 'products/list/x' },\n hidden: x => x.multipleProducts === true,\n onSelectChange: (selectedProductId: number, formData: any, option?: any) => {\n if (option && option.costPrice) {\n formData.unitCost = option.costPrice;\n }\n },\n detailsConfig: this.inventoryService.productDetailsConfig, infoMessage: 'Product being purchased'\n },\n { name: 'quantity', type: 'number', required: true, alias: 'Quantity', section: 'quickPurchaseItem',\n hidden: x => x.multipleProducts === true, infoMessage: 'Number of units purchased'\n },\n { name: 'unitCost', type: 'money', required: true, alias: 'Unit Cost', section: 'quickPurchaseItem',\n hidden: x => x.multipleProducts === true, infoMessage: 'Cost per unit'\n },\n\n { name: 'totals', type: 'section', alias: 'Totals', hideOnCreate: true, collapseOnView: true },\n { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, serverOwned: true, section: 'totals', infoMessage: 'Total value of all items' }, // Changed (CFW-1): Purchase.TotalAmount carries [ServerOwned] and is recomputed by PurchasesController.CalculateTotalAmount on both write paths\n { name: 'dueDate', type: 'date', alias: 'Due Date', readonly: true, section: 'totals', hidden: (x: any) => x.timing !== 1, infoMessage: 'Payment due date (auto-set to purchase date + 30 days)' }, // Changed: receipt date → purchase date\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding', readonly: true, section: 'totals', hidden: (x: any) => x.timing !== 1, infoMessage: 'Amount still owed to supplier' },\n\n { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapseOnView: true },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo', infoMessage: 'Additional notes about this purchase' }, // Changed: receipt → purchase\n { name: 'supplierInvoiceNumber', type: 'text', alias: 'Supplier Invoice #', section: 'additionalInfo', infoMessage: 'Invoice number from supplier' },\n { name: 'supplierFiscalInvoiceNumber', type: 'text', alias: 'Fiscal Invoice #', section: 'additionalInfo', infoMessage: 'Fiscal (tax) invoice number — required as input-VAT evidence' }, // Added: Phase 2 compliance\n { name: 'supplierFiscalInvoiceDate', type: 'date', max: 'today', alias: 'Fiscal Invoice Date', section: 'additionalInfo', infoMessage: 'Date on the supplier fiscal invoice' }, // Added: Phase 2 compliance // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n ],\n loadAction: { url: 'purchases/id' }, // Changed: inventoryreceipts → purchases\n heroField: 'purchaseID' // Changed: inventoryReceiptID → purchaseID\n }\n\n\n // Changed: Renamed from inventoryReceiptEditButton to purchaseEditButton\n purchaseEditButton: Button =\n { name: 'edit', dialog: true,\n action: { url: 'purchases?action=edit', method: 'post' }, // Changed: inventoryreceipts → purchases\n visible: (x: any) => x.status !== PurchaseStatus.Completed // Changed: InventoryReceiptStatus → PurchaseStatus\n }\n\n // Changed: Renamed from inventoryReceiptCompleteButton to purchaseCompleteButton\n purchaseCompleteButton: Button =\n { name: 'complete', display: 'Complete Purchase', inDialog: true, // Changed: \"Complete Receipt\" → \"Complete Purchase\"\n icon: { name: 'check_circle', color: 'green' },\n action: { url: 'purchases?action=complete', method: 'post', successMessage: 'Purchase Completed' }, // Changed: inventoryreceipts → purchases, \"Receipt Completed\" → \"Purchase Completed\"\n confirm: { message: 'Complete this purchase? Inventory will be updated and purchase will become read-only.' }, // Changed: receipt → purchase\n visible: (x: any) => x.status !== PurchaseStatus.Completed // Changed: InventoryReceiptStatus → PurchaseStatus\n }\n\n // Changed: Renamed from inventoryReceiptStepConfig to purchaseStepConfig\n purchaseStepConfig: StepConfig = {\n valueField: 'status',\n sticky: true,\n steps: [\n { name: 'Draft', value: PurchaseStatus.Draft, icon: 'article' }, // Changed: InventoryReceiptStatus → PurchaseStatus\n { name: 'Confirmed', value: PurchaseStatus.Confirmed, icon: 'inventory_2' }, // Changed: \"Receiving\" → \"Confirmed\"\n { name: 'Completed', value: PurchaseStatus.Completed, icon: 'check_circle' } // Changed: InventoryReceiptStatus → PurchaseStatus\n ]\n }\n\n // Changed: Renamed from inventoryReceiptDetailsConfig to purchaseDetailsConfig\n purchaseDetailsConfig: DetailsDialogConfig = {\n formConfig: this.purchaseFormConfig, // Changed: inventoryReceiptFormConfig → purchaseFormConfig\n tableConfigs: [this.purchaseItemsTableConfig], // Changed: inventoryReceiptItemsTableConfig → purchaseItemsTableConfig\n heroField: 'purchaseID', // Changed: inventoryReceiptID → purchaseID\n stepConfig: this.purchaseStepConfig, // Changed: inventoryReceiptStepConfig → purchaseStepConfig\n buttons: [this.purchaseEditButton, this.purchaseCompleteButton] // Changed: inventoryReceiptEditButton → purchaseEditButton, etc.\n }\n\n // Changed: Renamed from inventoryReceiptViewButton to purchaseViewButton\n purchaseViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.purchaseDetailsConfig }\n // Changed: Renamed from inventoryQuickPurchaseButton\n quickPurchaseButton: Button = { name: 'create', display: 'Quick Purchase', dialog: true, action: { url: 'purchases?action=create', method: 'post' } }; // Changed: inventoryreceipts → purchases\n\n // Changed: Renamed from inventoryReceiptsTableConfig to purchasesTableConfig\n purchasesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['purchaseNumber', 'supplierName', 'purchaseDate'], // Changed: receiptNumber → purchaseNumber, receiptDate → purchaseDate\n columns: [\n { name: 'purchaseDate', type: 'date', alias: 'Date' }, // Changed: receiptDate → purchaseDate\n { name: 'supplierName', type: 'text', alias: 'Supplier' },\n { name: 'detailsDisplay', type: 'text', alias: 'Details' }, // Changed: Renamed from productsDisplay/Products\n { name: 'timingName', type: 'text', alias: 'Payment' },\n { name: 'status', type: 'icon', alias: 'Status', detailsConfig: this.purchaseDetailsConfig, // Changed: inventoryReceiptDetailsConfig → purchaseDetailsConfig\n icons: [\n { name: 'article', color: '#9E9E9E', condition: (x: any) => x.status === PurchaseStatus.Draft, tip: 'Draft' }, // Changed: InventoryReceiptStatus → PurchaseStatus\n { name: 'inventory_2', color: '#2196F3', condition: (x: any) => x.status === PurchaseStatus.Confirmed, tip: 'Confirmed' }, // Changed: Receiving → Confirmed\n { name: 'check_circle', color: '#4CAF50', condition: (x: any) => x.status === PurchaseStatus.Completed, tip: 'Completed' } // Changed: InventoryReceiptStatus → PurchaseStatus\n ]\n },\n\n { name: 'totalAmount', type: 'money', alias: 'Total Value' },\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding', hidden: (x: any) => x?.timing !== 1 }\n ],\n buttons: [\n { name: 'view', icon: { name: 'launch' }, dialog: true, detailsConfig: this.purchaseDetailsConfig }, // Changed: inventoryReceiptDetailsConfig → purchaseDetailsConfig\n this.quickPurchaseButton, // Changed: inventoryQuickPurchaseButton → quickPurchaseButton\n { name: 'delete', dialog: true, icon: { name: 'delete_forever', color: 'red' }, action: { url: 'purchases?action=delete', method: 'post' }, confirm: { message: 'CAUTION: Deleting this purchase will reverse all inventory additions, any sales of this inventory, and all related accounting transactions. This action cannot be undone. Are you sure you want to proceed?' } }, // Changed: inventoryreceipts → purchases, \"receipt\" → \"purchase\"\n ],\n loadAction: { url: 'purchases/all/x' }, // Changed: inventoryreceipts → purchases\n formConfig: this.purchaseFormConfig, // Changed: inventoryReceiptFormConfig → purchaseFormConfig\n pagination: { pageSize: 15 }, // Added: server-side pagination — purchases are wide money rows (supplier join, line totals, payments)\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added: offline capture — purchases are captured as goods arrive, often at the gate\n entityName: 'Purchase', // Changed: \"InventoryReceipt\" → \"Purchase\"\n }\n\n //--------------------------Receipts (Goods Confirmation)-------------------------\n\n // Added: Receipt item form for goods received\n receiptItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReceipts] }, // Added: gate receipt item form by purchasing cap (parent)\n title: 'Receipt Item',\n fixedTitle: true,\n fields: [\n { name: 'purchaseItemID', type: 'select', alias: 'Purchase Item', required: true, loadAction: { url: 'purchaseitems/list/x' } },\n { name: 'productID', type: 'select', alias: 'Product', required: true, span: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.inventoryService.productDetailsConfig },\n { name: 'receivedQuantity', type: 'number', alias: 'Received Qty', required: true },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost', required: true },\n { name: 'serialNumbers', type: 'text', alias: 'Serial Numbers (comma-separated)' }\n ],\n loadAction: { url: 'receiptitems/id' }\n }\n\n // Added: Receipt items table — shows what was physically received\n receiptItemsTableConfig: TableConfig = {\n tabTitle: 'Items',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'receivedQuantity', type: 'number', alias: 'Received' },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost' },\n { name: 'lineTotal', type: 'money', alias: 'Line Total' }\n ],\n buttons: [\n { name: 'create', display: 'Add Item', dialog: true, action: { url: 'receiptitems?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'receiptitems?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'receiptitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'receiptitems/x/x' }, loadCriteria: 'receipt', loadIDField: 'receiptID',\n formConfig: this.receiptItemFormConfig\n }\n\n // Added: Receipt form for goods confirmation\n receiptFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReceipts] }, // Added: gate receipt form by purchasing cap\n title: 'Receipt',\n fixedTitle: true,\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'receiptInfo', type: 'section', alias: 'Receipt Information' },\n { name: 'purchaseID', type: 'number', hidden: true },\n { name: 'receiptNumber', type: 'text', alias: 'Receipt #', readonly: true, hideOnCreate: true, section: 'receiptInfo' },\n { name: 'purchaseNumber', type: 'text', alias: 'Purchase #', readonly: true, section: 'receiptInfo' },\n { name: 'supplierName', type: 'text', alias: 'Supplier', readonly: true, section: 'receiptInfo' },\n { name: 'receivedDate', type: 'date', max: 'today', required: true, alias: 'Received Date', section: 'receiptInfo' }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'statusName', type: 'text', alias: 'Status', readonly: true, hideOnCreate: true, section: 'receiptInfo' },\n { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'receiptInfo' }\n ],\n loadAction: { url: 'receipts/id' },\n heroField: 'receiptID'\n }\n\n // Added: Receipt complete button\n receiptCompleteButton: Button = { name: 'complete', display: 'Complete Receipt', inDialog: true, icon: { name: 'check_circle', color: 'green' }, action: { url: 'receipts?action=complete', method: 'post', successMessage: 'Receipt Completed — Inventory Updated' }, confirm: { message: 'Complete this receipt? Inventory will be increased.' }, visible: (x: any) => x.statusName === 'Draft' }\n\n // Added: Receipt edit button\n receiptEditButton: Button = { name: 'edit', dialog: true, action: { url: 'receipts?action=edit', method: 'post' }, visible: (x: any) => x.statusName === 'Draft' }\n\n // Added: Receipt details dialog with items table and complete button\n receiptDetailsConfig: DetailsDialogConfig = {\n formConfig: this.receiptFormConfig,\n tableConfigs: [this.receiptItemsTableConfig],\n heroField: 'receiptID',\n buttons: [this.receiptEditButton, this.receiptCompleteButton]\n }\n\n // Added: Receipt view button\n receiptViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.receiptDetailsConfig }\n\n // Added: Receipts table — shows goods receipts for a purchase (tab in purchase details)\n // Changed (WS-1 sweep 2): now OFFLINE. The earlier skip here blamed the read registry — one url per entity, so only the first purchase opened in a session could match. That gap is closed (read PREFIXes, ng-space 1e04b17): `loadCriteria: 'purchase'` registers the stem `receipts/purchase/`, so every parent matches and each keeps its own cache entry. Receipting is a receiving-bay act away from a desk and Receipt IS ISync, so it qualifies on merit now the mechanism exists.\n // Still NOT paginated, and that is separate from offline: one purchase carries a handful of receipts, so paging would cost a round trip and buy nothing.\n receiptsTableConfig: TableConfig = {\n tabTitle: 'Receipts',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'receiptNumber', type: 'text', alias: 'Receipt #' },\n { name: 'receivedDate', type: 'date', alias: 'Received' },\n { name: 'statusName', type: 'chip', alias: 'Status', colors: [{ name: '#E0E0E0', condition: x => x.statusName === 'Draft' }, { name: '#C8E6C9', condition: x => x.statusName === 'Completed' }] },\n { name: 'detailsDisplay', type: 'text', alias: 'Details' } // Changed: Renamed from productsDisplay/Products\n ],\n buttons: [\n { name: 'create', display: 'New Receipt', dialog: true, action: { url: 'receipts?action=create', method: 'post' } },\n { name: 'view', dialog: true, detailsConfig: this.receiptDetailsConfig },\n { name: 'delete', dialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'receipts?action=delete', method: 'post' }, confirm: { message: 'Delete this receipt? Inventory changes will be reversed.' } }\n ],\n loadAction: { url: 'receipts/x/x' }, loadCriteria: 'purchase', loadIDField: 'purchaseID',\n offline: { enabled: true, queue: { create: true, edit: true } }, // Added (WS-1 sweep 2): create/edit queue to the outbox; delete stays false (library default) because deleting a receipt reverses inventory server-side. `Complete` is a workflow action (`receipts?action=complete`) and matchMutation only parses create|edit|delete, so completing a receipt stays online-only\n formConfig: this.receiptFormConfig\n }\n\n //--------------------------Supplier Payments-------------------------\n\n supplierPaymentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capInventoryReceipts] },\n title: 'Record Payment',\n fixedTitle: true,\n fields: [\n { name: 'purchaseID', type: 'number', hidden: true }, // Changed: inventoryReceiptID → purchaseID\n { name: 'paymentDate', type: 'date', alias: 'Payment Date', required: true }, // Changed (NFD-2, Arbiter 2026-08-19): max: 'today' REMOVED — deliberately uncapped. A payment may legitimately carry a future date (post-dated cheque), so the future IS a valid answer here. Not method-conditioned: uncapped for every payment method.\n { name: 'method', type: 'select', alias: 'Payment Method', required: true, defaultValue: 2, loadAction: { url: 'supplierpayments/list/methods' } },\n { name: 'currencyID', type: 'select', alias: 'Currency', loadAction: { url: 'currencies/list/x' }, defaultFirstValue: true, detailsConfig: this.accountingService.currencyDetailsConfig, infoMessage: 'Currency for this payment (defaults to base currency)' }, // Changed: dropdown quick-add\n { name: 'outstandingAmount', type: 'text', alias: 'Outstanding', readonly: true }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text. spa-label rendered this through its DEFAULT branch (no format/suffix/size declared), which is {{value}} plain — identical to what spa-text shows — so the on-screen value is unchanged and only the field style differs.\n { name: 'amount', type: 'money', alias: 'Amount', required: true, span: true },\n { name: 'reference', type: 'text', alias: 'Reference', span: true }\n ],\n }\n\n supplierPaymentCreateButton: Button = { name: 'edit', action: { url: 'supplierpayments?action=create', method: 'post', successMessage: 'Payment Recorded' } }\n\n supplierPaymentCreateDetailsConfig: DetailsDialogConfig = {\n formConfig: this.supplierPaymentFormConfig,\n heroField: 'purchaseID', // Changed: inventoryReceiptID → purchaseID\n mode: 'edit',\n seedDefaults: true, // Added: CAPTURE dialog on mode:'edit' (posts supplierpayments?action=create). This is the one payment dialog where the flag actually DOES something: unlike Invoices and Sales, PurchasesController projects no payment defaults (only PaymentType), so `method` genuinely arrives empty and defaultValue:2 finally renders\n buttons: [this.supplierPaymentCreateButton]\n }\n\n supplierRecordPaymentButton: Button = { name: 'record-payment', display: 'Record Payment', dialog: true, icon: { name: 'payment', color: 'blue' },\n detailsConfig: this.supplierPaymentCreateDetailsConfig,\n visible: (x: any) => x.timing === 1 && x.status === PurchaseStatus.Completed && x.outstandingAmount > 0 // Changed: InventoryReceiptStatus → PurchaseStatus\n }\n\n // Changed (WS-1 sweep 2): still NOT offline and still NOT paginated, but the read-registry gap is no longer the reason — that is closed. It is skipped now because this table has NOTHING TO QUEUE: its only button is a void, which is a server-side ledger reversal, and payments are recorded from the parent purchase row (supplierRecordPaymentButton), not from here. Paging is omitted separately: a purchase carries only a few payments.\n supplierPaymentsTableConfig: TableConfig = {\n tabTitle: 'Payments',\n hidden: (x: any) => x.timing !== 1, // Changed: Hide Payments tab for Immediate purchases (only show for Deferred/Credit)\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'paymentDate', type: 'date', alias: 'Date' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'methodName', type: 'text', alias: 'Method' },\n { name: 'reference', type: 'text', alias: 'Reference' }\n ],\n buttons: [\n { name: 'delete', dialog: true, icon: { name: 'delete', color: 'red' }, action: { url: 'supplierpayments?action=delete', method: 'post' }, confirm: { message: 'Void this payment? The accounting transaction will be reversed.' } }\n ],\n loadAction: { url: 'supplierpayments/x/x' }, loadCriteria: 'purchase', loadIDField: 'purchaseID', // Changed: receipt → purchase, inventoryReceiptID → purchaseID\n formConfig: this.supplierPaymentFormConfig\n }\n\n //--------------------------AP Aging Report-------------------------\n\n apAgingTileConfig: TileConfig = {\n tiles: [\n { name: 'current', alias: 'Current', color: '#4CAF50', icon: 'check_circle', info: 'Not yet due' },\n { name: 'days30', alias: '1-30 Days', color: '#FFC107', icon: 'schedule', info: '1-30 days overdue' },\n { name: 'days60', alias: '31-60 Days', color: '#FF9800', icon: 'warning', info: '31-60 days overdue' },\n { name: 'days90', alias: '61-90 Days', color: '#F44336', icon: 'error', info: '61-90 days overdue' },\n { name: 'days90Plus', alias: '90+ Days', color: '#B71C1C', icon: 'dangerous', info: 'Over 90 days overdue' },\n { name: 'total', alias: 'Total Outstanding', color: '#9E9E9E', icon: 'account_balance_wallet', info: 'Total outstanding amount' }\n ],\n }\n\n apAgingBaseTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['purchaseNumber', 'supplierName', 'outstandingAmount'], // Changed: receiptNumber → purchaseNumber\n columns: [\n { name: 'purchaseNumber', type: 'text', alias: 'Purchase #', detailsConfig: this.purchaseDetailsConfig }, // Changed: receiptNumber → purchaseNumber, inventoryReceiptDetailsConfig → purchaseDetailsConfig\n { name: 'supplierName', type: 'text', alias: 'Supplier' },\n { name: 'purchaseDate', type: 'date', alias: 'Purchase Date' }, // Changed: receiptDate → purchaseDate\n { name: 'dueDate', type: 'date', alias: 'Due Date' },\n { name: 'daysOverdue', type: 'number', alias: 'Days Overdue' },\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'paidAmount', type: 'money', alias: 'Paid' },\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding' }\n ],\n buttons: [\n { name: 'view', dialog: true, detailsConfig: this.purchaseDetailsConfig }, // Changed: inventoryReceiptDetailsConfig → purchaseDetailsConfig\n this.supplierRecordPaymentButton,\n ]\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormConfig, DetailsDialogConfig, Button, TableConfig } from '../classes/Classes';\nimport { DataServiceLib } from './datalib.service';\nimport { InventoryService } from './inventory.service';\n\n// Service for managing production/manufacturing configurations\n@Injectable({\n providedIn: 'root'\n})\nexport class ProductionService {\n\n private dataService = inject(DataServiceLib);\n private inventoryService = inject(InventoryService);\n\n // ==================== PRODUCTION RECIPES ====================\n\n recipeItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capProductionRecipes] }, // Added: gate recipe item form by production recipes cap (parent entity)\n title: 'Recipe Item',\n fixedTitle: true,\n fields: [\n { name: 'productionRecipeItemID', type: 'number', alias: 'ID', hidden: true },\n { name: 'productionRecipeID', type: 'number', alias: 'Recipe ID', hidden: true },\n { name: 'rawMaterialProductID', type: 'select', alias: 'Raw Material', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.inventoryService.productDetailsConfig },\n { name: 'requiredQuantity', type: 'number', alias: 'Required Quantity', required: true }\n ],\n loadAction: { url: 'productionrecipeitems/id' },\n heroField: 'productionRecipeItemID'\n }\n\n recipeItemsTableConfig: TableConfig = {\n tabTitle: 'Materials',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n minColumns: ['rawMaterialName', 'requiredQuantity', 'estimatedCost'],\n columns: [\n { name: 'rawMaterialName', type: 'text', alias: 'Raw Material' },\n { name: 'requiredQuantity', type: 'number', alias: 'Quantity' },\n { name: 'estimatedCost', type: 'money', alias: 'Est. Cost' }\n ],\n buttons: [\n { name: 'create', display: 'Add Material', dialog: true, action: { url: 'productionrecipeitems?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'productionrecipeitems?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'productionrecipeitems?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'productionrecipeitems/x/x' }, loadCriteria: 'recipe', loadIDField: 'productionRecipeID',\n formConfig: this.recipeItemFormConfig\n }\n\n recipeFormConfig: FormConfig = {\n security: { allow: [this.dataService.capProductionRecipes] },\n title: 'Production Recipe',\n fixedTitle: true,\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'productionRecipeID', type: 'number', alias: 'Recipe ID', hidden: true },\n { name: 'recipeInfo', type: 'section', alias: 'Recipe Information' },\n { name: 'finishedProductID', type: 'select', alias: 'Finished Product', required: true, section: 'recipeInfo', loadAction: { url: 'products/list/x' }, detailsConfig: this.inventoryService.productDetailsConfig },\n { name: 'recipeName', type: 'text', alias: 'Recipe Name', required: true, section: 'recipeInfo' },\n { name: 'yieldQuantity', type: 'number', alias: 'Yield Quantity', required: true, section: 'recipeInfo' },\n { name: 'isActive', type: 'checkbox', alias: 'Active', section: 'recipeInfo' },\n { name: 'notes', type: 'text', alias: 'Notes', nullable: true, span: true, section: 'recipeInfo' },\n { name: 'costInfo', type: 'section', alias: 'Cost Information', collapsed: true, hideOnCreate: true },\n { name: 'estimatedCost', type: 'money', alias: 'Total Cost', readonly: true, section: 'costInfo' },\n { name: 'estimatedCostPerUnit', type: 'money', alias: 'Cost Per Unit', readonly: true, section: 'costInfo' }\n ],\n loadAction: { url: 'productionrecipes/id' },\n heroField: 'productionRecipeID'\n }\n\n recipeDetailsConfig: DetailsDialogConfig = {\n formConfig: this.recipeFormConfig,\n heroField: 'productionRecipeID',\n tableConfigs: [this.recipeItemsTableConfig],\n buttons: [\n { name: 'edit', dialog: true, action: { url: 'productionrecipes?action=edit', method: 'post' } }\n ]\n }\n\n recipeViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.recipeDetailsConfig }\n recipeCreateButton: Button = { name: 'create', display: 'Create Recipe', dialog: true, \n action: { url: 'productionrecipes?action=create', method: 'post' },\n onSuccessButton: this.recipeViewButton\n }\n\n recipesTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['recipeName', 'finishedProductName', 'yieldQuantity'],\n flatButtons: true,\n columns: [\n { name: 'productionRecipeID', type: 'number', alias: 'ID' },\n { name: 'recipeName', type: 'text', alias: 'Recipe Name' },\n { name: 'finishedProductName', type: 'text', alias: 'Finished Product' },\n { name: 'yieldQuantity', type: 'number', alias: 'Yield' },\n { name: 'estimatedCost', type: 'money', alias: 'Est. Cost' },\n { name: 'estimatedCostPerUnit', type: 'money', alias: 'Cost/Unit' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' }\n ],\n buttons: [\n this.recipeCreateButton,\n this.recipeViewButton,\n { name: 'delete', dialog: true, action: { url: 'productionrecipes?action=delete', method: 'post' } }\n ],\n loadAction: { url: 'productionrecipes/all/x' },\n formConfig: this.recipeFormConfig,\n realTime: true,\n entityName: 'ProductionRecipe'\n }\n\n // ==================== PRODUCTION ORDERS ====================\n\n orderItemFormConfig: FormConfig = {\n security: { allow: [this.dataService.capProductionOrders] }, // Added: gate order item form by production orders cap (parent entity)\n title: 'Order Item',\n fixedTitle: true,\n fields: [\n { name: 'productionOrderItemID', type: 'number', alias: 'ID', hidden: true },\n { name: 'productionOrderID', type: 'number', alias: 'Order ID', hidden: true },\n { name: 'rawMaterialProductID', type: 'number', alias: 'Raw Material ID', hidden: true },\n { name: 'rawMaterialName', type: 'text', alias: 'Raw Material', readonly: true },\n { name: 'requiredQuantity', type: 'number', alias: 'Required', readonly: true },\n { name: 'allocatedQuantity', type: 'number', alias: 'Allocated', readonly: true },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost', readonly: true },\n { name: 'totalCost', type: 'money', alias: 'Total Cost', readonly: true }\n ],\n loadAction: { url: 'productionorderitems/id' },\n heroField: 'productionOrderItemID'\n }\n\n orderItemsTableConfig: TableConfig = {\n tabTitle: 'Materials Used',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n minColumns: ['rawMaterialName', 'allocatedQuantity', 'totalCost'],\n columns: [\n { name: 'rawMaterialName', type: 'text', alias: 'Raw Material' },\n { name: 'requiredQuantity', type: 'number', alias: 'Required' },\n { name: 'allocatedQuantity', type: 'number', alias: 'Allocated' },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost' },\n { name: 'totalCost', type: 'money', alias: 'Total Cost' }\n ],\n buttons: [\n { name: 'view', dialog: true }\n ],\n loadAction: { url: 'productionorderitems/x/x' }, loadCriteria: 'order', loadIDField: 'productionOrderID',\n formConfig: this.orderItemFormConfig\n }\n\n orderFormConfig: FormConfig = {\n security: { allow: [this.dataService.capProductionOrders] },\n title: 'Production Order',\n fixedTitle: true,\n alertConfig: {\n compact: true,\n sticky: true,\n messages: [\n { message: 'Click Complete to process production and consume materials', type: 'success', // Changed: content to message\n visible: (x: any) => x.statusName === 'Draft'\n }\n ]\n },\n multiColumn: true,\n includeAudit: true,\n fields: [\n { name: 'productionOrderID', type: 'number', alias: 'Order ID', hidden: true },\n { name: 'orderInfo', type: 'section', alias: 'Order Information' },\n { name: 'productionOrderNumber', type: 'text', alias: 'Order Number', readonly: true, section: 'orderInfo', hideOnCreate: true },\n { name: 'productionRecipeID', type: 'select', alias: 'Recipe', required: true, section: 'orderInfo', loadAction: { url: 'productionrecipes/list/x' }, detailsConfig: this.recipeDetailsConfig },\n { name: 'plannedQuantity', type: 'number', alias: 'Planned Quantity', required: true, section: 'orderInfo' },\n { name: 'productionDate', type: 'date', alias: 'Production Date', required: true, section: 'orderInfo' },\n { name: 'notes', type: 'text', alias: 'Notes', nullable: true, span: true, section: 'orderInfo' },\n { name: 'statusInfo', type: 'section', alias: 'Status', collapsed: true, hideOnCreate: true },\n { name: 'statusName', type: 'text', alias: 'Status', readonly: true, section: 'statusInfo' },\n { name: 'actualQuantity', type: 'number', alias: 'Actual Quantity', readonly: true, section: 'statusInfo' },\n { name: 'totalCost', type: 'money', alias: 'Total Cost', readonly: true, section: 'statusInfo' }\n ],\n loadAction: { url: 'productionorders/id' },\n heroField: 'productionOrderID'\n }\n\n orderDetailsConfig: DetailsDialogConfig = {\n formConfig: this.orderFormConfig,\n heroField: 'productionOrderID',\n tableConfigs: [this.orderItemsTableConfig],\n buttons: [\n { name: 'edit', dialog: true, action: { url: 'productionorders?action=edit', method: 'post' }, visible: (x: any) => x.statusName === 'Draft' },\n { name: 'complete', display: 'Complete', icon: { name: 'check', color: 'green' }, inDialog: true, dialog: true, \n action: { url: 'productionorders?action=complete', method: 'post', successMessage: 'Production order completed successfully' }, \n confirm: { message: 'Complete this production order? Materials will be consumed and finished goods will be added to inventory.' },\n visible: (x: any) => x.statusName === 'Draft' \n },\n { name: 'cancel', display: 'Cancel', icon: { name: 'close', color: 'red' }, inDialog: true, dialog: true, \n action: { url: 'productionorders?action=cancel', method: 'post', successMessage: 'Production order cancelled' }, \n confirm: { message: 'Cancel this production order?' },\n visible: (x: any) => x.statusName === 'Draft' \n }\n ]\n }\n\n orderViewButton: Button = { name: 'view', dialog: true, detailsConfig: this.orderDetailsConfig }\n orderCreateButton: Button = { name: 'create', display: 'Create Order', dialog: true, \n action: { url: 'productionorders?action=create', method: 'post' },\n onSuccessButton: this.orderViewButton\n }\n\n // Added (WS-1 sweep 2): paginated but deliberately NOT offline — ProductionOrder does not implement ISync, so a queued write has no sync tokens. A shop-floor offline case is arguable, but enabling it needs a migration in the owning context, not a config line. Same for recipes and both item tabs in this file.\n ordersTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['productionOrderNumber', 'finishedProductName', 'plannedQuantity'],\n flatButtons: true,\n columns: [\n { name: 'productionOrderID', type: 'number', alias: 'ID' },\n { name: 'productionOrderNumber', type: 'text', alias: 'Order #' },\n { name: 'recipeName', type: 'text', alias: 'Recipe' },\n { name: 'finishedProductName', type: 'text', alias: 'Product' },\n { name: 'plannedQuantity', type: 'number', alias: 'Planned' },\n { name: 'actualQuantity', type: 'number', alias: 'Actual' },\n { name: 'productionDate', type: 'date', alias: 'Date' },\n { name: 'totalCost', type: 'money', alias: 'Total Cost' },\n { name: 'unitCost', type: 'money', alias: 'Unit Cost' },\n { name: 'statusName', type: 'icon', alias: 'Status', \n icons: [\n { name: 'edit', color: 'primary', condition: (x: any) => x.statusName === 'Draft', tip: 'Draft' }, \n { name: 'check_circle', color: 'green', condition: (x: any) => x.statusName === 'Completed', tip: 'Completed' }, \n { name: 'cancel', color: 'red', condition: (x: any) => x.statusName === 'Cancelled', tip: 'Cancelled' }\n ] \n }\n ],\n buttons: [\n this.orderCreateButton,\n this.orderViewButton,\n { name: 'delete', dialog: true, action: { url: 'productionorders?action=delete', method: 'post' }, visible: (x: any) => x.statusName === 'Draft' }\n ],\n loadAction: { url: 'productionorders/all/x' },\n formConfig: this.orderFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — production orders append continuously\n entityName: 'ProductionOrder',\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormConfig, TableConfig, Button, DetailsDialogConfig } from '../classes/Classes';\nimport { DataServiceLib } from './datalib.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PayrollService {\n\n private dataService = inject(DataServiceLib);\n\n //--------------------------Salary Components (child of SalaryStructure)-------------------------\n\n salaryComponentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSalaryStructures] }, // Added: gate salary component form by salary structures cap (parent module)\n title: 'Salary Component',\n fixedTitle: true,\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'componentType', alias: 'Type', type: 'select', loadAction: { url: 'salarycomponents/list/component-type' }, required: true },\n { name: 'calculationMethod', alias: 'Calculation', type: 'select', loadAction: { url: 'salarycomponents/list/calculation-method' }, required: true },\n { name: 'sortOrder', alias: 'Sort Order', type: 'number', defaultValue: 0 },\n { name: 'isActive', type: 'checkbox', alias: 'Active', defaultValue: true },\n ],\n loadAction: { url: 'salarycomponents/id' },\n heroField: 'salaryComponentID',\n }\n\n salaryComponentsTableConfig: TableConfig = {\n tabTitle: 'Components',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text' },\n { name: 'componentTypeName', type: 'text', alias: 'Type' },\n { name: 'calculationMethodName', type: 'text', alias: 'Calculation' },\n { name: 'sortOrder', type: 'text', alias: 'Order' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'salarycomponents?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'salarycomponents?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'salarycomponents?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'salarycomponents/x/x' }, loadCriteria: 'structure', loadIDField: 'salaryStructureID',\n formConfig: this.salaryComponentFormConfig,\n }\n\n //--------------------------Salary Structures-------------------------\n\n editSalaryStructureButton: Button = { name: 'edit', dialog: true, inDialog: true, action: { url: 'salarystructures?action=edit', method: 'post' } };\n\n salaryStructureFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSalaryStructures] }, // Added: gate salary structure form by salary structures cap\n title: 'Salary Structure',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'description', type: 'text-area', rows: 2, span: true },\n { name: 'isActive', type: 'checkbox', alias: 'Active', defaultValue: true },\n ],\n loadAction: { url: 'salarystructures/id' },\n heroField: 'salaryStructureID',\n includeAudit: true,\n }\n\n salaryStructuresTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'componentCount', 'employeeCount'],\n columns: [\n { name: 'name', type: 'text' },\n { name: 'description', type: 'text' },\n { name: 'componentCount', type: 'text', alias: 'Components' },\n { name: 'employeeCount', type: 'text', alias: 'Employees' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'salarystructures?action=create', method: 'post' } },\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.salaryStructureFormConfig,\n heroField: 'salaryStructureID',\n buttons: [this.editSalaryStructureButton],\n tableConfigs: [this.salaryComponentsTableConfig],\n }\n },\n { name: 'edit', dialog: true, action: { url: 'salarystructures?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'salarystructures?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'salarystructures/all/x' },\n formConfig: this.salaryStructureFormConfig,\n realTime: true,\n entityName: 'SalaryStructure'\n }\n\n //--------------------------Statutory Deduction Bands (child of StatutoryDeductionType)-------------------------\n\n statutoryDeductionBandFormConfig: FormConfig = {\n security: { allow: [this.dataService.capStatutoryDeductions] }, // Added: gate statutory deduction band form by statutory deductions cap (parent)\n title: 'Tax Band',\n fixedTitle: true,\n fields: [\n { name: 'validFrom', type: 'date', alias: 'Valid From', required: true },\n { name: 'bandMin', type: 'money', alias: 'Minimum', required: true },\n { name: 'bandMax', type: 'money', alias: 'Maximum' },\n { name: 'rate', type: 'number', alias: 'Rate %', required: true },\n { name: 'fixedAmount', type: 'money', alias: 'Fixed Amount' },\n ],\n loadAction: { url: 'statutorydeductionbands/id' },\n heroField: 'statutoryDeductionBandID',\n }\n\n statutoryDeductionBandsTableConfig: TableConfig = {\n tabTitle: 'Tax Bands',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'validFrom', type: 'date', alias: 'Valid From' },\n { name: 'bandMin', type: 'money', alias: 'Min' },\n { name: 'bandMax', type: 'money', alias: 'Max' },\n { name: 'rate', type: 'text', alias: 'Rate %' },\n { name: 'fixedAmount', type: 'money', alias: 'Fixed Amount' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'statutorydeductionbands?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'statutorydeductionbands?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'statutorydeductionbands?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'statutorydeductionbands/x/x' }, loadCriteria: 'type', loadIDField: 'statutoryDeductionTypeID',\n formConfig: this.statutoryDeductionBandFormConfig,\n }\n\n //--------------------------Statutory Deduction Types-------------------------\n\n editStatutoryDeductionTypeButton: Button = { name: 'edit', dialog: true, inDialog: true, action: { url: 'statutorydeductiontypes?action=edit', method: 'post' } };\n\n statutoryDeductionTypeFormConfig: FormConfig = {\n security: { allow: [this.dataService.capStatutoryDeductions] }, // Added: gate statutory deduction type form by statutory deductions cap\n title: 'Statutory Deduction Type',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'category', type: 'select', loadAction: { url: 'statutorydeductiontypes/list/deduction-category' }, required: true },\n { name: 'referencedDeductionTypeID', alias: 'Referenced Deduction', type: 'select', loadAction: { url: 'statutorydeductiontypes/list/x' }, nullable: true, infoMessage: 'For levies calculated as % of another deduction' },\n { name: 'isActive', type: 'checkbox', alias: 'Active', defaultValue: true },\n ],\n loadAction: { url: 'statutorydeductiontypes/id' },\n heroField: 'statutoryDeductionTypeID',\n includeAudit: true,\n }\n\n statutoryDeductionTypesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['name', 'categoryName', 'bandCount'],\n columns: [\n { name: 'name', type: 'text' },\n { name: 'categoryName', type: 'text', alias: 'Category' },\n { name: 'referencedDeductionTypeName', type: 'text', alias: 'Referenced Deduction' },\n { name: 'bandCount', type: 'text', alias: 'Bands' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'statutorydeductiontypes?action=create', method: 'post' } },\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.statutoryDeductionTypeFormConfig,\n heroField: 'statutoryDeductionTypeID',\n buttons: [this.editStatutoryDeductionTypeButton],\n tableConfigs: [this.statutoryDeductionBandsTableConfig],\n }\n },\n { name: 'edit', dialog: true, action: { url: 'statutorydeductiontypes?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'statutorydeductiontypes?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'statutorydeductiontypes/all/x' },\n formConfig: this.statutoryDeductionTypeFormConfig,\n realTime: true,\n entityName: 'StatutoryDeductionType'\n }\n\n //--------------------------Payslip Lines (child of Payslip)-------------------------\n\n payslipLineFormConfig: FormConfig = {\n security: { allow: [this.dataService.capPayrollRuns] }, // Added: gate payslip line form by payroll runs cap (parent)\n title: 'Payslip Line',\n fixedTitle: true,\n fields: [\n { name: 'componentName', type: 'text', alias: 'Component', required: true },\n { name: 'componentType', alias: 'Type', type: 'select', loadAction: { url: 'salarycomponents/list/component-type' }, required: true },\n { name: 'amount', type: 'money', alias: 'Amount', required: true },\n { name: 'isStatutory', type: 'checkbox', alias: 'Statutory' },\n { name: 'sortOrder', alias: 'Sort Order', type: 'number', defaultValue: 0 },\n ],\n loadAction: { url: 'paysliplines/id' },\n heroField: 'payslipLineID',\n }\n\n payslipLinesTableConfig: TableConfig = {\n tabTitle: 'Payslip Lines',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'componentName', type: 'text', alias: 'Component' },\n { name: 'componentTypeName', type: 'text', alias: 'Type' },\n { name: 'isStatutory', type: 'checkbox', alias: 'Statutory' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'sortOrder', type: 'text', alias: 'Order' },\n ],\n buttons: [\n { name: 'create', display: 'Add Line', dialog: true, action: { url: 'paysliplines?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'paysliplines?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'paysliplines?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'paysliplines/x/x' }, loadCriteria: 'payslip', loadIDField: 'payslipID',\n formConfig: this.payslipLineFormConfig,\n }\n\n //--------------------------Payslips (child of PayrollRun, also used in employee details)-------------------------\n\n payslipFormConfig: FormConfig = {\n security: { allow: [this.dataService.capPayrollRuns] }, // Added: gate payslip form by payroll runs cap (parent)\n title: 'Payslip',\n fixedTitle: true,\n fields: [\n { name: 'employeeName', alias: 'Employee', type: 'text', readonly: true },\n { name: 'grossPay', alias: 'Gross Pay', type: 'money', readonly: true, serverOwned: true }, // Changed (CFW-1): Payslip.GrossPay carries [ServerOwned] — PayrollService.RecalculatePayslipTotals owns all three\n { name: 'totalDeductions', alias: 'Deductions', type: 'money', readonly: true, serverOwned: true }, // Changed (CFW-1): [ServerOwned]\n { name: 'netPay', alias: 'Net Pay', type: 'money', readonly: true, serverOwned: true }, // Changed (CFW-1): [ServerOwned]\n { name: 'statusName', alias: 'Status', type: 'text', readonly: true },\n ],\n loadAction: { url: 'payslips/id' },\n heroField: 'payslipID',\n }\n\n payslipsChildTableConfig: TableConfig = {\n tabTitle: 'Payslips',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'employeeName', type: 'text', alias: 'Employee' },\n { name: 'grossPay', type: 'money', alias: 'Gross Pay' },\n { name: 'totalDeductions', type: 'money', alias: 'Deductions' },\n { name: 'netPay', type: 'money', alias: 'Net Pay' },\n { name: 'statusName', type: 'text', alias: 'Status' },\n ],\n buttons: [\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.payslipFormConfig,\n heroField: 'payslipID',\n tableConfigs: [this.payslipLinesTableConfig],\n }\n },\n ],\n loadAction: { url: 'payslips/x/x' }, loadCriteria: 'run', loadIDField: 'payrollRunID',\n formConfig: this.payslipFormConfig,\n }\n\n // Employee Payslip History (child table in Employee details)\n employeePayslipHistoryTableConfig: TableConfig = {\n tabTitle: 'Payslip History',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'grossPay', type: 'money', alias: 'Gross Pay' },\n { name: 'totalDeductions', type: 'money', alias: 'Deductions' },\n { name: 'netPay', type: 'money', alias: 'Net Pay' },\n { name: 'statusName', type: 'text', alias: 'Status' },\n ],\n buttons: [\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.payslipFormConfig,\n heroField: 'payslipID',\n tableConfigs: [this.payslipLinesTableConfig],\n }\n },\n ],\n loadAction: { url: 'payslips/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: this.payslipFormConfig,\n }\n\n //--------------------------Employee Salary Components (child of Employee)-------------------------\n\n employeeSalaryComponentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSalaryStructures] }, // Changed: was capEmployees (cap18), which CONTRADICTED the backend — EmployeeSalaryComponentsController.cs:19 gates cap73. A user holding Employees but not Salary Structures was shown this form as permitted, buttons live, and the API then refused: the same defect this initiative exists to remove, in the opposite direction. cap73 also matches salaryComponentFormConfig above (:15) and every controller in the salary-structures domain\n title: 'Salary Component',\n fixedTitle: true,\n fields: [\n { name: 'salaryComponentID', alias: 'Component', type: 'select', loadAction: { url: 'salarycomponents/list/x' }, required: true },\n { name: 'value', type: 'money', alias: 'Value', required: true },\n ],\n loadAction: { url: 'employeesalarycomponents/id' },\n heroField: 'employeeSalaryComponentID',\n }\n\n employeeSalaryComponentsTableConfig: TableConfig = {\n tabTitle: 'Salary Components',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'componentName', type: 'text', alias: 'Component' },\n { name: 'componentType', type: 'text', alias: 'Type' },\n { name: 'calculationMethod', type: 'text', alias: 'Calculation' },\n { name: 'value', type: 'money', alias: 'Value' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'employeesalarycomponents?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'employeesalarycomponents?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'employeesalarycomponents?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'employeesalarycomponents/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: this.employeeSalaryComponentFormConfig,\n }\n\n //--------------------------Commission Configs-------------------------\n\n // Added (Phase 5): a commission rule is a parent with tier children, which is the two-step create shape —\n // the create dialog captures the rule itself, then the details dialog opens with the Tiers tab. Extracted\n // before detailsConfig so it can be referenced without a forward reference.\n editCommissionConfigButton: Button = { name: 'edit', dialog: true, inDialog: true, action: { url: 'commissionconfigs?action=edit', method: 'post' } };\n\n commissionConfigFormConfig: FormConfig = {\n security: { allow: [this.dataService.capCommissionConfigs] }, // Added: gate commission config form by commission configs cap\n title: 'Commission Config',\n // Added (Phase 5): the two rules that make a config silently earn nothing, said out loud rather than left to\n // be discovered when a period pays 0.00. Both mirror refusals CommissionRuleEvaluator already makes.\n alertConfig: {\n compact: true,\n messages: [\n { message: 'This rule is scoped to nobody — set an employee, a position, or tick Applies To All Employees, or it can never resolve', type: 'critical',\n visible: (x: any) => !!x.commissionConfigID && !x.employeeID && !x.positionID && !x.appliesToAllEmployees\n },\n { message: 'Per-distance rates read trip mileage, which is only captured when Tyre Management is enabled — this rule will compute 0.00 until it is', type: 'warn',\n visible: (x: any) => x.basis === 4\n },\n ]\n },\n fields: [\n { name: 'name', type: 'text', required: true, hint: 'How this arrangement is referred to, e.g. \"Drivers 5% of load value\"' },\n { name: 'isActive', type: 'checkbox', alias: 'Active', defaultValue: true },\n\n // Changed (Phase 5): who the rule resolves to. ResolveRules is a ladder — employee rules win, then position\n // rules, then the tenant-wide rule — and the levels do NOT stack, so only one level is offered at a time.\n { name: 'scope', type: 'section', alias: 'Scope', collapseOnView: true },\n { name: 'employeeID', type: 'select', alias: 'Employee', section: 'scope', nullable: true, loadAction: { url: 'employees/list/x' }, requiredCondition: (x: any) => !x.positionID && !x.appliesToAllEmployees, hint: 'Leave empty to scope by position or across the whole company' },\n { name: 'positionID', type: 'select', alias: 'Position', section: 'scope', nullable: true, loadAction: { url: 'positions/list/x' }, hidden: (x: any) => x.employeeID > 0, hint: 'Everyone holding this position, e.g. every Driver' },\n { name: 'appliesToAllEmployees', type: 'checkbox', alias: 'Applies To All Employees', section: 'scope', hidden: (x: any) => x.employeeID > 0 || x.positionID > 0 },\n { name: 'priority', type: 'number', alias: 'Priority', section: 'scope', defaultValue: 0, hint: 'Higher wins when two rules resolve at the same level' },\n { name: 'customerID', type: 'select', alias: 'Only For Customer', section: 'scope', nullable: true, loadAction: { url: 'customers/list/x' }, hideOnCreate: true },\n { name: 'serviceItemID', type: 'select', alias: 'Only For Service', section: 'scope', nullable: true, loadAction: { url: 'serviceitems/list/x' }, hideOnCreate: true },\n { name: 'selfSourcedOnly', type: 'checkbox', alias: 'Self Sourced Loads Only', section: 'scope', hidden: (x: any) => x.basis === 1 || x.basis === 4, infoMessage: 'Pays the person recorded as Sourced By on the load rather than the driver who carried it. Load-level bases only — a trip has no sourcer.' }, // Changed (Phase 6, browser pass): the hyphen is gone on purpose — every alias is piped through Core.camelToWords, which inserts a space before each capital, so \"Self-Sourced\" rendered as \"Self- Sourced\" on screen\n\n // Changed (Phase 5): Basis is what the engine actually measures. MetricType below is the superseded column,\n // kept in step so old rows stay coherent, but nothing computes from it any more.\n { name: 'rateAndTiers', type: 'section', alias: 'Rate & Tiers' },\n { name: 'basis', type: 'select', alias: 'Basis', section: 'rateAndTiers', required: true, defaultValue: 1, loadAction: { url: 'commissionconfigs/list/basis' },\n onSelectChange: (value: any, data: any) => {\n data.metricType = (value === 2 || value === 5) ? 2 : 1; // keep the superseded MetricType consistent with Basis\n if (value === 1 || value === 4) { data.earnEvent = 1; data.selfSourcedOnly = false; } // trip-level bases: the engine skips any other earn event, and has no sourcer to pay\n }\n },\n { name: 'rateType', alias: 'Rate Type', type: 'select', section: 'rateAndTiers', loadAction: { url: 'commissionconfigs/list/rate-type' }, required: true },\n { name: 'rate', type: 'number', alias: 'Rate', section: 'rateAndTiers', required: true, suffix: '%', hidden: (x: any) => x.rateType !== 2, hint: 'Percentage of the measured value. Used for any part of the metric no tier band covers.' },\n { name: 'rate', type: 'number', alias: 'Rate', section: 'rateAndTiers', required: true, hidden: (x: any) => x.rateType === 2, hint: 'Amount per unit measured. Used for any part of the metric no tier band covers.' },\n { name: 'metricType', type: 'select', hidden: true, defaultValue: 1 }, // superseded by Basis; posted only so existing rows keep a valid legacy value\n\n // Changed (Phase 5): hidden on create because a money input cannot post \"empty\" — it posts 0, and a Maximum\n // of 0 caps every period to nothing. Set deliberately on the saved rule instead of by accident on a new one.\n { name: 'limits', type: 'section', alias: 'Limits', collapseOnView: true, hideOnCreate: true },\n { name: 'minimumAmount', type: 'money', alias: 'Minimum Per Period', section: 'limits', hideOnCreate: true, clearContent: true, hint: 'Guaranteed floor. Leave empty for none.' },\n { name: 'maximumAmount', type: 'money', alias: 'Maximum Per Period', section: 'limits', hideOnCreate: true, clearContent: true, hint: 'Cap. Leave empty for uncapped — a cap of 0 pays nothing.' },\n\n // Changed (Phase 5): same reason — a date input posts today, and an Effective From of today silently drops\n // every load earned earlier in the same month.\n { name: 'timing', type: 'section', alias: 'Timing', collapseOnView: true },\n { name: 'earnEvent', alias: 'Earned When', type: 'select', section: 'timing', required: true, defaultValue: 1, loadAction: { url: 'commissionconfigs/list/earn-event' }, readonlyCondition: (x: any) => x.basis === 1 || x.basis === 4, hint: 'Trip-level bases earn on completion only' },\n { name: 'effectiveFrom', type: 'date', alias: 'Effective From', section: 'timing', hideOnCreate: true, clearContent: true, hint: 'Empty means the rule has always applied. Work before this date is excluded.' },\n { name: 'effectiveTo', type: 'date', alias: 'Effective To', section: 'timing', hideOnCreate: true, clearContent: true, hint: 'Empty means the rule is open-ended' },\n ],\n loadAction: { url: 'commissionconfigs/id' },\n heroField: 'commissionConfigID',\n includeAudit: true,\n }\n\n //--------------------------Commission Config Tiers (child of CommissionConfig)-------------------------\n\n commissionConfigTierFormConfig: FormConfig = {\n security: { allow: [this.dataService.capCommissionConfigs] }, // Added: a tier is gated by its parent rule's cap\n title: 'Tier Band',\n fixedTitle: true,\n fields: [\n { name: 'thresholdFrom', alias: 'From', type: 'number', required: true, defaultValue: 0, hint: 'Metric value where this band starts' },\n { name: 'thresholdTo', alias: 'To', type: 'number', hint: 'Leave as 0 for the top, open-ended band' },\n { name: 'rate', type: 'number', alias: 'Rate', required: true, hint: 'Applied only to the portion of the metric inside this band' },\n ],\n loadAction: { url: 'commissionconfigtiers/id' },\n heroField: 'commissionConfigTierID',\n }\n\n commissionConfigTiersTableConfig: TableConfig = {\n tabTitle: 'Tiers',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n noDataMessage: 'No bands — the flat rate on the rule applies to the whole metric',\n columns: [\n { name: 'thresholdFrom', type: 'number', alias: 'From' },\n { name: 'thresholdTo', type: 'number', alias: 'To',\n icons: [{ name: 'all_inclusive', color: 'grey', tip: 'Open-ended top band', condition: (row: any) => row?.isOpenEnded }]\n },\n { name: 'rate', type: 'number', alias: 'Rate' },\n ],\n buttons: [\n { name: 'create', display: 'Add Band', dialog: true, action: { url: 'commissionconfigtiers?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'commissionconfigtiers?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'commissionconfigtiers?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'commissionconfigtiers/x/x' }, loadCriteria: 'config', loadIDField: 'commissionConfigID',\n formConfig: this.commissionConfigTierFormConfig,\n }\n\n // Added (Phase 5): defined AFTER the tiers table and BEFORE the view/create buttons, per the two-step create pattern\n commissionConfigDetailsConfig: DetailsDialogConfig = {\n formConfig: this.commissionConfigFormConfig,\n heroField: 'commissionConfigID',\n buttons: [this.editCommissionConfigButton],\n tableConfigs: [this.commissionConfigTiersTableConfig],\n }\n\n viewCommissionConfigButton: Button = { name: 'view', dialog: true, detailsConfig: this.commissionConfigDetailsConfig };\n createCommissionConfigButton: Button = { name: 'create', display: 'Create', dialog: true, onSuccessButton: this.viewCommissionConfigButton, action: { url: 'commissionconfigs?action=create', method: 'post' } };\n\n commissionConfigsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['scopeName', 'name', 'rate'],\n columns: [\n { name: 'scopeName', type: 'text', alias: 'Applies To', // Changed (Phase 5): employeeName is blank on a position or company-wide rule, which read as an unassigned rule\n colors: [{ name: 'red', condition: (row: any) => !row?.employeeID && !row?.positionID && !row?.appliesToAllEmployees }]\n },\n { name: 'name', type: 'text' },\n { name: 'basisName', type: 'text', alias: 'Basis' }, // Changed (Phase 5): Basis replaced MetricType as what the engine measures\n { name: 'rateTypeName', type: 'text', alias: 'Rate Type' },\n { name: 'rate', type: 'text', alias: 'Rate' },\n { name: 'tierCount', type: 'text', alias: 'Tiers' },\n { name: 'earnEventName', type: 'text', alias: 'Earned When' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' },\n ],\n buttons: [\n this.createCommissionConfigButton,\n this.viewCommissionConfigButton,\n { name: 'edit', dialog: true, action: { url: 'commissionconfigs?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'commissionconfigs?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'commissionconfigs/all/x' },\n formConfig: this.commissionConfigFormConfig,\n realTime: true,\n entityName: 'CommissionConfig'\n }\n\n // Employee commission configs child table\n employeeCommissionConfigsTableConfig: TableConfig = {\n tabTitle: 'Commission Configs',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text' },\n { name: 'basisName', type: 'text', alias: 'Basis' }, // Changed (Phase 5): matches the main list\n { name: 'rateTypeName', type: 'text', alias: 'Rate Type' },\n { name: 'rate', type: 'text', alias: 'Rate' },\n { name: 'tierCount', type: 'text', alias: 'Tiers' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, onSuccessButton: this.viewCommissionConfigButton, action: { url: 'commissionconfigs?action=create', method: 'post' } }, // Changed (Phase 5): the tiers tab is only reachable through the details dialog, so a rule created here opens into it too\n this.viewCommissionConfigButton,\n { name: 'edit', dialog: true, action: { url: 'commissionconfigs?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'commissionconfigs?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'commissionconfigs/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: this.commissionConfigFormConfig,\n }\n\n //--------------------------Commission Entries-------------------------\n\n // Added (Phase 5): the approval gate, bound to the status CommissionEntriesController exposes\n // (1=Draft, 2=Approved, 3=Paid, 4=Reversed). Only Approved entries are payable — Draft is a proposal and\n // Paid is settled — and the server refuses BOTH transitions on an entry that has reached a payslip line,\n // so isPaid is tested here too rather than trusting status alone.\n // Changed (Phase 6, browser pass): the colours were 'primary' and 'warn' — Angular Material PALETTE names.\n // ButtonService.getButtonColor returns button.icon.color verbatim into [style.color], which needs a CSS colour,\n // so both computed to the inherited grey rgb(68,71,78) while edit rendered rgb(64,80,181) and delete rgb(244,67,54).\n // The button that authorises money was visually indistinguishable from every other icon in the row.\n // Added (Phase 6): `inDialog` is what puts a button in the details dialog's footer — Core.setupButtons filters\n // extraButtons on it, so without it the two gates existed on the row and vanished the moment the entry was\n // opened to read its breakdown. It is ignored by the row renderer, so one object serves both places and the\n // gate cannot drift between them.\n approveCommissionEntryButton: Button = { name: 'approve', display: 'Approve', inDialog: true, icon: { name: 'check_circle', color: 'green' }, action: { url: 'commissionentries?action=approve', method: 'post', successMessage: 'Approved' }, confirm: { message: 'Approve this commission entry so it can be paid on a payslip?' }, visible: (row: any) => row?.status === 1 && !row?.isPaid };\n returnCommissionEntryButton: Button = { name: 'return', display: 'Return to Draft', inDialog: true, icon: { name: 'undo', color: 'orange' }, action: { url: 'commissionentries?action=return', method: 'post', successMessage: 'Returned to Draft' }, confirm: { message: 'Return this entry to Draft? It will not be picked up by a payroll run until it is approved again.' }, visible: (row: any) => row?.status === 2 && !row?.isPaid };\n\n commissionEntryFormConfig: FormConfig = {\n security: { allow: [this.dataService.capCommissionEntries] }, // Added: gate commission entry form by commission entries cap\n title: 'Commission Entry',\n fields: [\n { name: 'employeeID', type: 'select', alias: 'Employee', loadAction: { url: 'employees/list/x' }, required: true, readonlyCondition: (x: any) => x.isPaid },\n { name: 'periodYear', alias: 'Year', type: 'number', required: true, readonlyCondition: (x: any) => x.isPaid },\n { name: 'periodMonth', alias: 'Month', type: 'number', required: true, readonlyCondition: (x: any) => x.isPaid },\n { name: 'metricValue', alias: 'Metric Value', type: 'number', required: true, readonlyCondition: (x: any) => x.isPaid },\n { name: 'commissionAmount', alias: 'Commission Amount', type: 'money', required: true, readonlyCondition: (x: any) => x.isPaid }, // Changed (Phase 5): a settled figure is history — the payslip line it paid is already out\n { name: 'statusName', alias: 'Status', type: 'text', readonly: true, hideOnCreate: true }, // Added (Phase 5): the gate itself, so an entry that pays nothing reads as Draft rather than as a bug\n\n // Changed: sectioned — who earned what for which period is the entry; where it came from is provenance,\n // read only when a figure is being queried\n { name: 'source', type: 'section', alias: 'Source & Description', collapseOnView: true },\n { name: 'description', type: 'text', span: true, section: 'source' },\n { name: 'sourceType', alias: 'Source Type', type: 'text', section: 'source' },\n { name: 'sourceReference', alias: 'Source Reference', type: 'text', section: 'source' },\n ],\n loadAction: { url: 'commissionentries/id' },\n heroField: 'commissionEntryID',\n includeAudit: true,\n }\n\n //--------------------------Commission Entry Lines (child of CommissionEntry)-------------------------\n\n // Added (Phase 6): the breakdown that makes a total explainable. Deliberately has NO buttons — a line is\n // generated evidence and the header amount is the sum of these rows, so hand-editing one would make the\n // breakdown disagree with what payroll actually paid. CommissionEntryLinesController refuses the writes\n // server-side too; this is the same refusal said in the UI rather than only when a POST comes back.\n commissionEntryLinesTableConfig: TableConfig = {\n tabTitle: 'Lines',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n noDataMessage: 'No breakdown — this entry was entered by hand rather than generated from trips',\n columns: [\n { name: 'eventDate', type: 'date', alias: 'Earned On' },\n { name: 'sourceDescription', type: 'text', alias: 'Source', // Changed (Phase 6): an adjustment line is the floor/cap correction, not a trip — it has no source to open\n icons: [{ name: 'tune', color: 'grey', tip: 'Adjustment — the rule\\'s minimum or maximum moved the total, this is the difference', condition: (row: any) => row?.isAdjustment }]\n },\n { name: 'sourceType', type: 'text', alias: 'Type' },\n { name: 'metricValue', type: 'text', alias: 'Measured' },\n { name: 'rateApplied', type: 'text', alias: 'Rate' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n ],\n buttons: [],\n loadAction: { url: 'commissionentrylines/x/x' }, loadCriteria: 'entry', loadIDField: 'commissionEntryID',\n }\n\n // Added (Phase 6): defined AFTER the lines table and BEFORE the view button, per the two-step create pattern.\n // The approve/return buttons are the SAME objects the table row uses, so the gate cannot drift between the\n // two places it is offered — both read status and isPaid, and the server refuses both on a settled entry.\n commissionEntryDetailsConfig: DetailsDialogConfig = {\n formConfig: this.commissionEntryFormConfig,\n heroField: 'commissionEntryID',\n buttons: [this.approveCommissionEntryButton, this.returnCommissionEntryButton],\n tableConfigs: [this.commissionEntryLinesTableConfig],\n }\n\n viewCommissionEntryButton: Button = { name: 'view', dialog: true, detailsConfig: this.commissionEntryDetailsConfig };\n\n commissionEntriesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['employeeName', 'commissionAmount', 'statusName'],\n columns: [\n { name: 'employeeName', type: 'text', alias: 'Employee' },\n { name: 'periodYear', type: 'text', alias: 'Year' },\n { name: 'periodMonth', type: 'text', alias: 'Month' },\n { name: 'metricValue', type: 'text', alias: 'Metric Value' },\n { name: 'commissionAmount', type: 'money', alias: 'Amount', // Changed (Phase 5): a 0.00 entry is legitimate (per-km with mileage off, or a clawback netting out) but it must never sit silently\n icons: [{ name: 'error_outline', color: 'orange', tip: 'This entry computed to nothing. Per-distance rules read trip mileage, which needs Tyre Management enabled; a credit-settled invoice is also not treated as paid.', condition: (row: any) => row?.commissionAmount === 0 }]\n },\n { name: 'statusName', type: 'text', alias: 'Status', // Changed (Phase 5): the approval gate — a Draft entry is invisible to payroll, which otherwise reads as commission being ignored\n colors: [\n { name: 'grey', condition: (row: any) => row?.status === 1 },\n { name: 'green', condition: (row: any) => row?.status === 2 },\n { name: 'red', condition: (row: any) => row?.status === 4 },\n ]\n },\n { name: 'isPaid', type: 'checkbox', alias: 'Paid' }, // Changed (Phase 5): settled on a payslip line and no longer changeable, by either side\n { name: 'description', type: 'text' },\n { name: 'sourceType', type: 'text', alias: 'Source' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'commissionentries?action=create', method: 'post' } },\n this.viewCommissionEntryButton, // Added (Phase 6): the only way to the breakdown — a figure with no reachable explanation is what this phase exists to remove\n this.approveCommissionEntryButton,\n this.returnCommissionEntryButton,\n { name: 'edit', dialog: true, action: { url: 'commissionentries?action=edit', method: 'post' }, visible: (row: any) => !row?.isPaid }, // Changed (Phase 5): mirrors the SalaryAdvance guard — a settled entry is not editable\n { name: 'delete', dialog: true, action: { url: 'commissionentries?action=delete', method: 'post' }, visible: (row: any) => !row?.isPaid }, // Changed (Phase 5): deleting a paid entry would orphan the payslip line that settled it\n ],\n loadAction: { url: 'commissionentries/all/x' },\n formConfig: this.commissionEntryFormConfig,\n realTime: true,\n pagination: { pageSize: 20 }, // Added: server-side pagination — one row per commission event — append-only and never purged\n entityName: 'CommissionEntry',\n }\n\n // Employee commission entries child table\n employeeCommissionEntriesTableConfig: TableConfig = {\n tabTitle: 'Commission History',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'periodYear', type: 'text', alias: 'Year' },\n { name: 'periodMonth', type: 'text', alias: 'Month' },\n { name: 'metricValue', type: 'text', alias: 'Metric Value' },\n { name: 'commissionAmount', type: 'money', alias: 'Amount',\n icons: [{ name: 'error_outline', color: 'orange', tip: 'This entry computed to nothing — see the entry for why', condition: (row: any) => row?.commissionAmount === 0 }]\n },\n { name: 'statusName', type: 'text', alias: 'Status' }, // Changed (Phase 5): same gate as the main list — Draft never reaches a payslip\n { name: 'isPaid', type: 'checkbox', alias: 'Paid' },\n { name: 'description', type: 'text' },\n { name: 'sourceType', type: 'text', alias: 'Source' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'commissionentries?action=create', method: 'post' } },\n this.viewCommissionEntryButton, // Added (Phase 6): same breakdown, reached from the employee's own history\n this.approveCommissionEntryButton,\n this.returnCommissionEntryButton,\n { name: 'edit', dialog: true, action: { url: 'commissionentries?action=edit', method: 'post' }, visible: (row: any) => !row?.isPaid }, // Changed (Phase 5): mirrors the main list's settled guard\n { name: 'delete', dialog: true, action: { url: 'commissionentries?action=delete', method: 'post' }, visible: (row: any) => !row?.isPaid },\n ],\n loadAction: { url: 'commissionentries/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: this.commissionEntryFormConfig,\n }\n\n //--------------------------Salary Advances-------------------------\n\n salaryAdvanceFormConfig: FormConfig = {\n security: { allow: [this.dataService.capSalaryAdvances] }, // Added: gate salary advance form by salary advances cap\n title: 'Salary Advance',\n fields: [\n { name: 'employeeID', type: 'select', alias: 'Employee', loadAction: { url: 'employees/list/x' }, required: true },\n { name: 'amount', type: 'money', required: true },\n { name: 'advanceDate', alias: 'Advance Date', type: 'date', required: true },\n { name: 'reason', type: 'text' },\n ],\n loadAction: { url: 'salaryadvances/id' },\n heroField: 'salaryAdvanceID',\n includeAudit: true,\n }\n\n salaryAdvancesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['employeeName', 'amount', 'statusDisplay'],\n columns: [\n { name: 'employeeName', type: 'text', alias: 'Employee' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'advanceDate', type: 'date', alias: 'Date' },\n { name: 'reason', type: 'text' },\n { name: 'statusDisplay', type: 'text', alias: 'Status' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'salaryadvances?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'salaryadvances?action=edit', method: 'post' }, visible: (row: any) => !row?.isDeducted },\n { name: 'delete', dialog: true, action: { url: 'salaryadvances?action=delete', method: 'post' }, visible: (row: any) => !row?.isDeducted },\n ],\n loadAction: { url: 'salaryadvances/all/x' },\n formConfig: this.salaryAdvanceFormConfig,\n realTime: true,\n pagination: { pageSize: 20 }, // Added: server-side pagination — advances append every pay cycle\n entityName: 'SalaryAdvance',\n }\n\n // Employee salary advances child table\n employeeSalaryAdvancesTableConfig: TableConfig = {\n tabTitle: 'Salary Advances',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'advanceDate', type: 'date', alias: 'Date' },\n { name: 'reason', type: 'text' },\n { name: 'statusDisplay', type: 'text', alias: 'Status' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'salaryadvances?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'salaryadvances?action=edit', method: 'post' }, visible: (row: any) => !row?.isDeducted },\n { name: 'delete', dialog: true, action: { url: 'salaryadvances?action=delete', method: 'post' }, visible: (row: any) => !row?.isDeducted },\n ],\n loadAction: { url: 'salaryadvances/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: this.salaryAdvanceFormConfig,\n }\n\n //--------------------------Overtime Entries-------------------------\n\n overtimeEntryFormConfig: FormConfig = {\n security: { allow: [this.dataService.capOvertimeEntries] }, // Added: gate overtime entry form by overtime entries cap\n title: 'Overtime Entry',\n fields: [\n { name: 'employeeID', type: 'select', alias: 'Employee', loadAction: { url: 'employees/list/x' }, required: true },\n { name: 'overtimeDate', alias: 'Date', type: 'date', required: true },\n { name: 'hours', type: 'number', required: true },\n { name: 'overtimeType', alias: 'Overtime Type', type: 'select', loadAction: { url: 'overtimeentries/list/overtime-type' }, required: true },\n { name: 'hourlyRate', alias: 'Hourly Rate', type: 'money', required: true },\n { name: 'amount', type: 'money', alias: 'Amount', readonly: true, serverOwned: true }, // Changed (CFW-1): OvertimeEntry.Amount carries [ServerOwned] — MEASURED storing a forged 77777 before Phase 4\n ],\n loadAction: { url: 'overtimeentries/id' },\n heroField: 'overtimeEntryID',\n includeAudit: true,\n }\n\n overtimeEntriesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['employeeName', 'hours', 'amount'],\n columns: [\n { name: 'employeeName', type: 'text', alias: 'Employee' },\n { name: 'overtimeDate', type: 'date', alias: 'Date' },\n { name: 'hours', type: 'text', alias: 'Hours' },\n { name: 'overtimeTypeName', type: 'text', alias: 'Type' },\n { name: 'hourlyRate', type: 'money', alias: 'Hourly Rate' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'overtimeentries?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'overtimeentries?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'overtimeentries?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'overtimeentries/all/x' },\n formConfig: this.overtimeEntryFormConfig,\n realTime: true,\n pagination: { pageSize: 20 }, // Added: server-side pagination — overtime entries append every pay cycle\n entityName: 'OvertimeEntry',\n }\n\n // Employee overtime entries child table\n employeeOvertimeHistoryTableConfig: TableConfig = {\n tabTitle: 'Overtime History',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'overtimeDate', type: 'date', alias: 'Date' },\n { name: 'hours', type: 'text', alias: 'Hours' },\n { name: 'overtimeTypeName', type: 'text', alias: 'Type' },\n { name: 'hourlyRate', type: 'money', alias: 'Hourly Rate' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'overtimeentries?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'overtimeentries?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'overtimeentries?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'overtimeentries/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: this.overtimeEntryFormConfig,\n }\n\n //--------------------------Payroll Runs-------------------------\n\n // Action buttons with status-based visibility\n submitPayrollButton: Button = { name: 'submit', display: 'Submit', inDialog: true, action: { url: 'payrollruns?action=submit', method: 'post' }, visible: (row: any) => row?.status === 1 }; // Changed: null-check row to prevent TypeError when dialog renders before row data loads\n postPayrollButton: Button = { name: 'post', display: 'Post', inDialog: true, action: { url: 'payrollruns?action=post', method: 'post' }, visible: (row: any) => row?.status === 2 }; // Changed: null-check row\n markPaidButton: Button = { name: 'paid', display: 'Mark Paid', inDialog: true, action: { url: 'payrollruns?action=paid', method: 'post' }, visible: (row: any) => row?.status === 3 }; // Changed: null-check row\n // Added (Phase 5): recalculate is how a late commission approval or a corrected salary structure reaches an\n // open run. DRAFT ONLY — the server refuses it at Submitted, Posted and Paid, and a button that exists and\n // always fails teaches people the product is broken. It discards and rebuilds the run's payslips, hence the confirm.\n recalculatePayrollButton: Button = { name: 'recalculate', display: 'Recalculate', inDialog: true, action: { url: 'payrollruns?action=recalculate', method: 'post', successMessage: 'Payslips rebuilt' }, confirm: { message: 'Rebuild this run\\'s payslips from current salary structures and approved commission? The existing payslips are discarded.' }, visible: (row: any) => row?.status === 1 };\n\n payrollRunFormConfig: FormConfig = {\n security: { allow: [this.dataService.capPayrollRuns] }, // Added: gate payroll run form by payroll runs cap\n title: 'Payroll Run',\n fields: [\n { name: 'periodYear', alias: 'Year', type: 'number', required: true },\n { name: 'periodMonth', alias: 'Month', type: 'number', required: true },\n { name: 'payDate', alias: 'Pay Date', type: 'date', required: true },\n { name: 'description', type: 'text-area', rows: 2, span: true },\n ],\n loadAction: { url: 'payrollruns/id' },\n heroField: 'payrollRunID',\n includeAudit: true,\n }\n\n // Added (WS-1 sweep 2): payroll is deliberately OUT of the offline sweep in full — no payroll entity implements ISync (a queued write would carry no RowVersion/ClientRef), and a payroll run is a month-end back-office act at a desk, never a field capture. The same reasoning covers every config in this file, which is why it is stated once here rather than nineteen times.\n payrollRunsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['periodYear', 'totalGrossPay', 'statusName'],\n columns: [\n { name: 'periodYear', type: 'text', alias: 'Year' },\n { name: 'periodMonth', type: 'text', alias: 'Month' },\n { name: 'payDate', type: 'date', alias: 'Pay Date' },\n { name: 'payslipCount', type: 'text', alias: 'Payslips' },\n { name: 'totalGrossPay', type: 'money', alias: 'Gross Pay' },\n { name: 'totalNetPay', type: 'money', alias: 'Net Pay' },\n { name: 'statusName', type: 'text', alias: 'Status' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'payrollruns?action=create', method: 'post' } },\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.payrollRunFormConfig,\n heroField: 'payrollRunID',\n buttons: [this.recalculatePayrollButton, this.submitPayrollButton, this.postPayrollButton, this.markPaidButton],\n tableConfigs: [this.payslipsChildTableConfig],\n }\n },\n { name: 'edit', dialog: true, action: { url: 'payrollruns?action=edit', method: 'post' }, visible: (row: any) => row?.status === 1 }, // Changed: null-check row\n { name: 'delete', dialog: true, action: { url: 'payrollruns?action=delete', method: 'post' }, visible: (row: any) => row?.status === 1 }, // Changed: null-check row\n ],\n loadAction: { url: 'payrollruns/all/x' },\n formConfig: this.payrollRunFormConfig,\n entityName: 'PayrollRun'\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormConfig, TableConfig, Button, DetailsDialogConfig } from '../classes/Classes';\nimport { DataServiceLib } from './datalib.service'; // Added: for capability references\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LoansService {\n\n private dataService = inject(DataServiceLib); // Added: for capability references\n\n // ========== LOAN PRODUCTS BUTTONS ==========\n \n loanProductCreateButton: Button = { name: 'create', display: 'Create Product', dialog: true, action: { url: 'loanproducts?action=create', method: 'post' } };\n loanProductEditButton: Button = { name: 'edit', dialog: true, action: { url: 'loanproducts?action=edit', method: 'post' } };\n loanProductDeleteButton: Button = { name: 'delete', action: { url: 'loanproducts?action=delete', method: 'post' } };\n\n // ========== LOAN PRODUCTS ==========\n \n // Loan Product Form Configuration\n loanProductFormConfig: FormConfig = {\n security: { allow: [this.dataService.capLoanProducts] }, // Added: gate loan product form by loan products cap\n title: 'Loan Product',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'description', type: 'text', alias: 'Description', span : true },\n { name: 'interestMethod', type: 'select', alias: 'Interest Calculation Method', required: true, options: [{ name: 'Flat Rate', value: 0 }, { name: 'Reducing Balance', value: 1 }] },\n\n // Changed: sectioned — the product's name and interest method identify it; the five bounds are set once\n // when the product is designed and only re-read when it is being changed\n { name: 'bounds', type: 'section', alias: 'Amount, Rate & Term Limits', collapseOnView: true },\n { name: 'minAmount', type: 'money', alias: 'Minimum Amount', required: true, section: 'bounds' },\n { name: 'maxAmount', type: 'money', alias: 'Maximum Amount', required: true, section: 'bounds' },\n { name: 'defaultInterestRate', type: 'number', alias: 'Interest Rate (%)', required: true, min: 0, max: 100, section: 'bounds' },\n { name: 'minTermMonths', type: 'number', alias: 'Minimum Term (Months)', required: true, min: 1, section: 'bounds' },\n { name: 'maxTermMonths', type: 'number', alias: 'Maximum Term (Months)', required: true, min: 1, section: 'bounds' },\n ],\n loadAction: { url: 'loanproducts/id' },\n heroField: 'loanProductID'\n };\n\n loanProductTableConfig: TableConfig = {\n showFilter: true,\n columns: [\n { name: 'name', alias: 'Product Name' },\n { name: 'interestMethodName', alias: 'Interest Method' },\n { name: 'minAmount', type: 'money', alias: 'Min Amount' },\n { name: 'maxAmount', type: 'money', alias: 'Max Amount' },\n\n { name: 'minInterestRate', alias: 'Min Rate (%)' },\n { name: 'maxInterestRate', alias: 'Max Rate (%)' },\n { name: 'minTermMonths', alias: 'Min Term' },\n { name: 'maxTermMonths', alias: 'Max Term' },\n { name: 'loanCount', alias: 'Active Loans' },\n ],\n loadAction: { url: 'loanproducts/all' },\n formConfig: this.loanProductFormConfig,\n buttons: [this.loanProductCreateButton, this.loanProductEditButton, this.loanProductDeleteButton],\n realTime: true,\n entityName: 'LoanProduct'\n };\n\n // ========== LOANS BUTTONS ==========\n\n loanCreateButton: Button = { name: 'create', display: 'New Loan', dialog: true, action: { url: 'loans?action=create', method: 'post' } };\n loanEditButton: Button = { name: 'edit', dialog: true, action: { url: 'loans?action=edit', method: 'post' } };\n loanDisburseButton: Button = { name: 'disburse', display: 'Disburse', action: { url: 'loans?action=disburse', method: 'post' }, confirm: { message: 'Are you sure you want to disburse this loan?' }, visible: (x: any) => x.canDisburse };\n\n // ========== LOANS ==========\n\n // Loan Application Form Configuration\n loanFormConfig: FormConfig = {\n security: { allow: [this.dataService.capLoansMain] }, // Added: gate loan application form by loans cap\n title: 'Loan Application',\n fields: [\n { name: 'loanType', type: 'select', alias: 'Loan Type', required: true, defaultFirstValue: true,\n options: [\n { name: 'Customer Loan', value: 0 }, \n { name: 'Employee Loan', value: 1 }\n ] \n },\n { name: 'customerID', type: 'select', alias: 'Customer', required: true, detailsConfig: this.dataService.customerDetailsConfig, // Changed: dropdown quick-add\n loadAction: { url: 'customers/list/x' },\n hidden: (x: any) => x.loanType == 1\n },\n { name: 'employeeID', type: 'select', alias: 'Employee', required: true, \n loadAction: { url: 'employees/list/x' }, \n hidden: (x: any) => x.loanType == 0 \n },\n { name: 'loanProductID', type: 'select', alias: 'Loan Product', loadAction: { url: 'loanproducts/list/x' } },\n { name: 'principalAmount', type: 'money', alias: 'Principal Amount', required: true },\n\n // Changed: sectioned — who is borrowing how much stays up top, the rate/term mechanics group together\n { name: 'terms', type: 'section', alias: 'Interest & Term', collapseOnView: true },\n { name: 'interestRate', type: 'number', alias: 'Annual Interest Rate (%)', required: true, min: 0, max: 100, section: 'terms' },\n { name: 'monthlyInterestRate', type: 'number', alias: 'Monthly Interest Rate (%)', required: true, min: 0, max: 100, section: 'terms' },\n { name: 'termMonths', type: 'number', alias: 'Term (Months)', required: true, min: 1, max: 120, section: 'terms' },\n { name: 'disbursementDate', type: 'date', alias: 'Disbursement Date', required: true, section: 'terms' },\n ],\n loadAction: { url: 'loans/id' },\n heroField: 'loanID'\n };\n\n // ========== LOAN SCHEDULES ==========\n\n // Loan Schedule Table Configuration (for display within loan details)\n loanScheduleTableConfig: TableConfig = {\n columns: [\n { name: 'installmentNumber', alias: '#' },\n { name: 'dueDate', type: 'date', alias: 'Due Date' },\n { name: 'principalAmount', type: 'money', alias: 'Principal' },\n { name: 'interestAmount', type: 'money', alias: 'Interest' },\n { name: 'totalAmount', type: 'money', alias: 'Total' },\n { name: 'paidAmount', type: 'money', alias: 'Paid' },\n { name: 'outstandingAmount', type: 'money', alias: 'Outstanding' },\n { name: 'statusName', alias: 'Status', colors: [{ name: 'green', condition: (x: any) => x.status == 3 }, { name: 'red', condition: (x: any) => x.status == 2 }] },\n ],\n loadAction: { url: 'loanschedules/loan' },\n minColumns: ['installmentNumber', 'dueDate', 'totalAmount', 'statusName']\n };\n\n // Loan Details Configuration\n loanDetailsConfig: DetailsDialogConfig = {\n formConfig: {\n title: 'Loan Details',\n security: { allow: [this.dataService.capLoansMain] }, // Added: same cap as the loan surface that opens this dialog. The inheritance was positional only — nothing carried the parent's cap here, so a refused dialog drew an empty grid instead of the named banner\n // Changed: sectioned — sixteen read-only fields buried the schedule and payment tabs. Who/what/how much\n // is still owed stays on screen; the terms, the totals and the progress counters fold away.\n fields: [\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'productName', type: 'text', alias: 'Product' },\n { name: 'statusName', type: 'text', alias: 'Status' },\n { name: 'outstandingBalance', type: 'money', alias: 'Outstanding Balance' },\n\n { name: 'terms', type: 'section', alias: 'Loan Terms', collapseOnView: true },\n { name: 'principalAmount', type: 'money', alias: 'Principal Amount', section: 'terms' },\n { name: 'interestRate', type: 'number', alias: 'Annual Interest Rate (%)', required: true, min: 0, max: 100, section: 'terms' },\n { name: 'monthlyInterestRate', type: 'number', alias: 'Monthly Interest Rate (%)', required: true, min: 0, max: 100, section: 'terms' },\n { name: 'termMonths', type: 'number', alias: 'Term (Months)', section: 'terms' },\n { name: 'disbursementDate', type: 'date', alias: 'Disbursement Date', section: 'terms' },\n { name: 'maturityDate', type: 'date', alias: 'Maturity Date', section: 'terms' },\n\n { name: 'balances', type: 'section', alias: 'Balances', collapseOnView: true },\n { name: 'totalAmountDue', type: 'money', alias: 'Total Amount Due', section: 'balances' },\n { name: 'totalPaidAmount', type: 'money', alias: 'Total Paid', section: 'balances' },\n { name: 'totalInterest', type: 'money', alias: 'Total Interest', section: 'balances' },\n\n { name: 'progress', type: 'section', alias: 'Repayment Progress', collapseOnView: true },\n { name: 'scheduleCount', type: 'number', alias: 'Total Installments', section: 'progress' },\n { name: 'paymentCount', type: 'number', alias: 'Payments Made', section: 'progress' },\n { name: 'overdueCount', type: 'number', alias: 'Overdue Installments', section: 'progress' },\n ],\n loadAction: { url: 'loans/id' }\n },\n heroField: 'loanID',\n tableConfigs: [\n {\n ...this.loanScheduleTableConfig,\n tabTitle: 'Payment Schedule',\n loadAction: { url: 'loanschedules/loan/x' },\n loadCriteria: 'loan',\n loadIDField: 'loanID'\n },\n {\n tabTitle: 'Payment History',\n showFilter: true,\n columns: [\n { name: 'paymentDate', type: 'date', alias: 'Date' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'principalPaid', type: 'money', alias: 'Principal' },\n { name: 'interestPaid', type: 'money', alias: 'Interest' },\n { name: 'methodName', alias: 'Method' },\n { name: 'reference', alias: 'Reference' },\n ],\n loadAction: { url: 'loanpayments/loan/x' },\n loadCriteria: 'loan',\n loadIDField: 'loanID',\n minColumns: ['paymentDate', 'amount']\n }\n ]\n };\n\n loanViewButton: Button = { name: 'view', display: 'View', dialog: true, detailsConfig: this.loanDetailsConfig };\n\n // Loans Table Configuration\n // Added (WS-1 sweep 2): paginated but deliberately NOT offline — Loan does not implement ISync, and loan origination and repayment capture are desk-bound back-office acts. Covers the whole file.\n loanTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n columns: [\n { name: 'borrowerType', alias: 'Type', colors: [{ name: 'blue', condition: (x: any) => x.employeeID > 0 }, { name: 'green', condition: (x: any) => x.customerID > 0 }] },\n { name: 'borrowerName', alias: 'Borrower' },\n { name: 'productName', alias: 'Product' },\n { name: 'interestMethodName', alias: 'Method' },\n { name: 'principalAmount', type: 'money', alias: 'Principal' },\n { name: 'displayRate', alias: 'Rate (%)' },\n { name: 'termMonths', alias: 'Term' },\n { name: 'disbursementDate', type: 'date', alias: 'Disbursed' },\n { name: 'outstandingBalance', type: 'money', alias: 'Outstanding' },\n { name: 'statusName', alias: 'Status', colors: [{ name: 'green', condition: (x: any) => x.status == 2 }, { name: 'red', condition: (x: any) => x.status == 3 }, { name: 'orange', condition: (x: any) => x.status == 1 }] },\n ],\n loadAction: { url: 'loans/all/x' },\n minColumns: ['borrowerName', 'principalAmount', 'statusName'],\n formConfig: this.loanFormConfig,\n buttons: [this.loanViewButton, this.loanCreateButton, this.loanEditButton, this.loanDisburseButton ],\n pagination: { pageSize: 20 }, // Added: server-side pagination — the loan book only grows\n entityName: 'Loan',\n };\n\n // ========== LOAN PAYMENTS BUTTONS ==========\n\n loanPaymentCreateButton: Button = { name: 'create', display: 'Record Payment', dialog: true, action: { url: 'loanpayments?action=create', method: 'post' } };\n\n // ========== LOAN PAYMENTS ==========\n\n // Loan Payment Form Configuration\n loanPaymentFormConfig: FormConfig = {\n security: { allow: [this.dataService.capLoanPayments] }, // Added: gate loan payment form by loan payments cap\n title: 'Loan Payment',\n fields: [\n { name: 'loanID', type: 'select', alias: 'Loan', required: true, loadAction: { url: 'loans/list/x' } },\n { name: 'amount', type: 'money', alias: 'Payment Amount', required: true },\n { name: 'paymentDate', type: 'date', alias: 'Payment Date', required: true }, // Changed (NFD-2, Arbiter 2026-08-19): max: 'today' REMOVED — deliberately uncapped. A payment may legitimately carry a future date (post-dated cheque), so the future IS a valid answer here. Not method-conditioned: uncapped for every payment method.\n { name: 'method', type: 'select', alias: 'Payment Method', required: true, options: [{ name: 'Cash', value: 0 }, { name: 'Bank Transfer', value: 1 }, { name: 'Mobile Money', value: 2 }, { name: 'Cheque', value: 3 }, { name: 'Card', value: 4 }] },\n { name: 'reference', type: 'text', alias: 'Reference Number' },\n ],\n heroField: 'loanPaymentID'\n };\n\n loanPaymentTableConfig: TableConfig = {\n showFilter: true,\n columns: [\n { name: 'paymentDate', type: 'date', alias: 'Date' },\n { name: 'customerName', alias: 'Customer' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'principalPaid', type: 'money', alias: 'Principal' },\n { name: 'interestPaid', type: 'money', alias: 'Interest' },\n { name: 'methodName', alias: 'Method' },\n { name: 'reference', alias: 'Reference' },\n ],\n loadAction: { url: 'loanpayments/all/x' },\n minColumns: ['paymentDate', 'customerName', 'amount'],\n formConfig: this.loanPaymentFormConfig,\n buttons: [this.loanPaymentCreateButton],\n pagination: { pageSize: 20 }, // Added: server-side pagination — one row per repayment across every loan — the largest table in the module\n entityName: 'LoanPayment',\n };\n}\n","// Quiet Loading — silent-request plumbing.\n// A request carrying TIN_SILENT_REQUEST is skipped by LoaderInterceptor's in-flight bookkeeping, so it never\n// raises the global scrim. Everything else about the request (bearer token, 401 refresh, error dialogs) is\n// untouched — this is deliberately NOT the interceptor's URL whitelist, which also bypasses error handling.\nimport { HttpContext, HttpContextToken } from '@angular/common/http';\n\nexport const TIN_SILENT_REQUEST = new HttpContextToken<boolean>(() => false);\n\n// Returns a context carrying the silent flag; returns the caller's context (or undefined) untouched when the\n// request is not silent, so non-quiet callers build byte-for-byte the same request they always did.\nexport function silentContext(silent?: boolean, context?: HttpContext): HttpContext | undefined {\n if (!silent) {\n return context;\n }\n return (context ?? new HttpContext()).set(TIN_SILENT_REQUEST, true);\n}\n\n// True when the request was marked silent by silentContext().\nexport function isSilentRequest(context: HttpContext | undefined | null): boolean {\n return !!context?.get(TIN_SILENT_REQUEST);\n}\n","// Inline error plumbing — the per-request OPT-OUT from the global error modal.\n//\n// The problem this exists to solve: a details dialog renders its child tables as TABS. One tab whose load\n// fails raises ApiErrorService's global modal, and that modal is app-wide and dismissable-only — so a single\n// broken child endpoint bricks the WHOLE dialog. The user cannot read the form, cannot reach the other tabs,\n// and the message they get (\"Something went wrong. Please try again.\") names neither which tab failed nor\n// what failed about it. The failure is local; the surface was global.\n//\n// A request carrying TIN_INLINE_ERRORS tells LoaderInterceptor NOT to present the modal for it. Nothing else\n// about the request changes — bearer token, 401 refresh, the scrim, offline suppression and the console line\n// all behave exactly as they always did. The failure is still SHOWN, and shown with strictly more detail than\n// the modal ever carried (HTTP status + the endpoint verbatim + a Retry) — it is just shown IN the tab that\n// owns it instead of over the whole app.\n//\n// The default is FALSE and that is load-bearing. tin-spa ships to consumer apps that are not upgraded in step\n// and to apps outside this workspace entirely; every existing caller that passes nothing builds byte-for-byte\n// the request it always did and keeps the modal. This is an opt-IN, never a flipped default.\nimport { HttpContext, HttpContextToken } from '@angular/common/http';\n\nexport const TIN_INLINE_ERRORS = new HttpContextToken<boolean>(() => false);\n\n// Re-exported from silent-request so one call can carry both flags without either file importing the other's\n// concerns. Kept as a separate token rather than folded into TIN_SILENT_REQUEST because they are independent\n// axes: silence is about the SCRIM (does a load bar appear), inline is about the FAILURE SURFACE (modal or\n// panel). A quiet load that fails still wants a modal by default, and a loud load can want an inline panel.\nimport { TIN_SILENT_REQUEST } from './silent-request';\n\n// Builds the context for a call carrying either or both flags. Returns the caller's context (or undefined)\n// completely untouched when neither flag is set, so the overwhelmingly common path allocates nothing new and\n// produces an identical request.\nexport function tinRequestContext(options?: { silent?: boolean; inlineErrors?: boolean }, context?: HttpContext): HttpContext | undefined {\n const silent = !!options?.silent;\n const inlineErrors = !!options?.inlineErrors;\n\n if (!silent && !inlineErrors) {\n return context;\n }\n\n let ctx = context ?? new HttpContext();\n if (silent) ctx = ctx.set(TIN_SILENT_REQUEST, true);\n if (inlineErrors) ctx = ctx.set(TIN_INLINE_ERRORS, true);\n return ctx;\n}\n\n// True when the request opted out of the global error modal.\nexport function isInlineErrorRequest(context: HttpContext | undefined | null): boolean {\n return !!context?.get(TIN_INLINE_ERRORS);\n}\n\n// What an inline panel renders. Deliberately carries the RAW status and the RAW endpoint rather than a\n// friendly sentence: the modal's whole failing was that it was too friendly to act on. This surface is\n// attached to the one tab that failed, so naming the endpoint is not noise — it is the only thing that tells\n// a user (or the support engineer reading their screenshot) WHICH of a dialog's six tabs is broken.\nexport interface InlineLoadError {\n status: number; // HTTP status; 200 for an application-level failure (RepoResponse success:false)\n endpoint: string; // the request URL, verbatim, exactly as the action carried it\n detail?: string; // the server's own message where there was one — already on the console line too\n}\n","\nimport { Injectable, Injector, inject } from '@angular/core'; // Changed: Injector — the library Getting Started / Day Book defaults resolve the entity services LAZILY, see below\nimport { Action, ApiResponse, AppConfig, AppConfigSection, Button, CacheConfig, CapItem, Column, DayBookColumnView, DayBookLane, DayBookSection, DayBookTableView, DetailsDialogConfig, Field, FormConfig, RoleAccess, SetupStepAction, TableConfig } from '../classes/Classes'; // Changed (section summaries): + Field — the Financial section's summary is handed the live fields to resolve its two selects // Changed: AppConfigSection for the App Configuration base sections; RoleAccess for the unlock button's Full gate // Changed (library defaults P5/P6): SetupStepAction, DayBookSection/Lane/ColumnView/TableView and Column type the two library defaults, so a wrong key or a behavioural override fails the BUILD rather than rendering blank\n// 🔴 THESE SEVEN IMPORTS ARE CIRCULAR BY CONSTRUCTION AND MUST STAY LAZY AT RUNTIME. Every one of these services\n// injects DataServiceLib itself, so a field-level `inject(AccountingService)` here would be a genuine Angular\n// circular dependency and would throw at construction. They are resolved through `injector.get(...)` INSIDE the\n// two getters instead, which runs long after both classes are constructed. The ES-module cycle is harmless for\n// the same reason — nothing at module-evaluation time touches the other module's bindings.\nimport { Core } from '../classes/TinCore'; // Added (section summaries): Core.optionLabel resolves a select's stored ID to its label. No cycle — TinCore imports only Classes and DateBounds.\nimport { AccountingService } from './accounting.service';\nimport { InventoryService } from './inventory.service';\nimport { SalesService } from './sales.service';\nimport { PurchasingService } from './purchasing.service';\nimport { ProductionService } from './production.service';\nimport { PayrollService } from './payroll.service';\nimport { LoansService } from './loans.service';\nimport { BehaviorSubject, catchError, finalize, from, map, Observable, of, share, tap, throwError, timeout } from 'rxjs'; // Changed: added catchError/from/map/throwError for TinSync offline seams\nimport { HttpService } from './http.service';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { SignupData, User } from '../classes/LibClasses'; // Changed: Added SignupData import\nimport { AuthService } from './auth.service';\nimport { OfflineService, OfflineEntry } from './offline.service'; // Added: TinSync unified offline service\nimport { tinRequestContext } from '../runtime/inline-errors'; // Added: carries the silent flag AND the inline-errors opt-out on one context\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DataServiceLib {\n\n private injector = inject(Injector); // Added (library defaults P5/P6): lazy resolution of the seven entity services — see the import block's note on why they cannot be injected directly\n\n constructor(private httpService: HttpService, public router: Router, private route: ActivatedRoute, private authService: AuthService,\n private offline: OfflineService) { // Changed: TinSync unified offline service (inert while no table registers)\n\n this.appConfig.appName = \"App-Name\";\n this.appConfig.logo = \"./assets/logo.png\"\n this.appConfig.ADAuth = true;\n\n this.appConfig.capItems = [this.capMultitenant, this.capAdmin, this.capHome];\n\n\n this.capHome.name = \"cap1\";\n this.capHome.display = \"Home\";\n this.capHome.link = \"home\";\n this.capHome.icon =\"home\";\n\n\n this.capAdmin.name = \"cap2\";\n this.capAdmin.display = \"Admin\";\n this.capAdmin.icon = \"security\"\n this.capAdmin.capSubItems = [this.capUsers, this.capRoles, this.capPasswordPolicy, this.capLogs, this.capSettings, this.capTenantReset]; // Changed (N8): Password Policy sits with Users and Roles — it is the rule those accounts' passwords are held to, and it is where an administrator goes looking for it. Changed (N22): capTenantReset joins them — it is an administrative permission and Admin is where an administrator goes to revoke it\n\n this.capUsers.name = \"cap3\";\n this.capUsers.display = \"Users\";\n this.capUsers.link = \"home/admin/users\";\n this.capUsers.icon = \"group\";\n\n this.capRoles.name = \"cap4\"\n this.capRoles.display = \"Roles\";\n this.capRoles.link = \"home/admin/roles\";\n this.capRoles.icon = \"work\";\n\n this.capLogs.name = \"cap5\"\n this.capLogs.display = \"Logs\";\n this.capLogs.link = \"home/admin/logs\";\n this.capLogs.icon = \"text_snippet\";\n\n // Added (N8): the per-tenant password policy page.\n //\n // ── HOW cap89 WAS CHOSEN, and why NOT cap88 ────────────────────────────────────────────────────────────────\n // Library capabilities live in the 1-86 range with cap87 taken by Unlock (TinWeb Contracts\\Capabilities.cs\n // records the census and the rule: take the next number ABOVE the range in use, because a number VACATED by\n // MigrationService.MigrateCapValues can still hold a stale true on some role). 88 is exactly such a number —\n // shift-spa's own comment records capTripTemplates being \"Moved from cap88 to cap154\" — so reusing it would\n // hand the Password Policy menu to whichever Shift roles still carry that old grant. A census on 2026-08-16\n // across TinWeb, tin-spa and all five consumer apps found cap89-cap100 used by nothing at all. 89 it is.\n //\n // This gates the MENU ENTRY only. The authority to change the policy is PasswordConfigController's\n // IsCurrentUserAdmin() test and stays there; whether that should become a capability instead is an open\n // question for Tinashe and is deliberately NOT answered here. The two line up in practice either way:\n // MigrateCapValues sets Cap31-Cap100 to Full for the Admin and Owner roles and None for every other role, so\n // the people who can see this page are already the people the server will accept a save from.\n this.capPasswordPolicy.name = \"cap89\"\n this.capPasswordPolicy.display = \"Password Policy\";\n this.capPasswordPolicy.link = \"home/admin/password-policy\";\n this.capPasswordPolicy.icon = \"password\";\n\n this.capSettings.name = \"cap6\"\n this.capSettings.display = \"Settings\";\n this.capSettings.link = \"home/admin/settings\";\n this.capSettings.icon =\"settings\";\n\n // Added: cap92 — gates the tenant reset (`POST appconfiguration/reset`, TinWeb eedc29c), which soft-deletes\n // every Operational row for the current tenant. Like cap87 and cap90 it is a PERMISSION, not a page: no link,\n // and showMenu = false keeps it out of every nav rendering, while the Roles screen — which does NOT filter on\n // showMenu — still renders its access level.\n // 🔴 THIS ENTRY IS THE ONLY WAY THE CAPABILITY CAN BE REVOKED. The seeded Admin and Owner roles hold every\n // CapN at Full, so they hold cap92 from day one, and MigrateCapValues re-grants it on every multi-tenant boot\n // (MigrationService.cs:275) — deny-by-default does not survive and role templates can only ever RAISE a level\n // (SetupRoleService.cs:120-124). Without this entry a destructive tenant-wide capability would be ungrantable\n // AND unrevokable from the Roles screen, repairable only by a direct database write.\n // ⚠️ The server demands RoleAccess.Full (AppConfigurationControllerBase.cs:155), not Edit — the reset button\n // sends Full too, and the two sides must not disagree.\n this.capTenantReset.name = \"cap92\"\n this.capTenantReset.display = \"Tenant Reset\";\n this.capTenantReset.showMenu = false;\n\n\n this.capMultitenant.name = \"cap7\"\n this.capMultitenant.display = \"Multitenant\";\n this.capMultitenant.icon = \"apartment\"\n this.capMultitenant.capSubItems = [this.capTenants, this.capMembership, this.capPlans, this.capFeatures, this.capPlanFeatures]; // Changed: Moved Subscription & Billing to Admin — they are tenant-specific settings\n\n this.capTenants.name = \"cap8\"\n this.capTenants.display = \"Tenants\";\n this.capTenants.link = \"home/tenancy/tenants\";\n\n this.capMembership.name = \"cap9\"\n this.capMembership.display = \"Membership\";\n this.capMembership.link = \"home/tenancy/membership\";\n\n this.capPlans.name = \"cap10\"\n this.capPlans.display = \"Plans\";\n this.capPlans.link = \"home/tenancy/plans\";\n\n // Added: Feature registry capability\n this.capFeatures.name = \"cap80\"\n this.capFeatures.display = \"Features\";\n this.capFeatures.link = \"home/tenancy/features\";\n this.capFeatures.icon = \"extension\";\n\n // Added: Plan-Feature mapping capability\n this.capPlanFeatures.name = \"cap81\"\n this.capPlanFeatures.display = \"Plan Features\";\n this.capPlanFeatures.link = \"home/tenancy/plan-features\";\n this.capPlanFeatures.icon = \"checklist\";\n\n // Added: Subscription management capability\n this.capSubscription.name = \"cap82\"\n this.capSubscription.display = \"Subscription\";\n this.capSubscription.link = \"home/tenancy/subscription\";\n this.capSubscription.icon = \"card_membership\";\n\n // Added: Billing & invoice history capability\n this.capBilling.name = \"cap83\"\n this.capBilling.display = \"Billing\";\n this.capBilling.link = \"home/tenancy/billing\";\n this.capBilling.icon = \"receipt_long\";\n\n this.capGeneral.name = \"cap11\"\n this.capGeneral.display = \"General\";\n this.capGeneral.moduleKey = \"general\"; // Added (Setup v3): library module gating, assigned once here instead of per app\n this.capGeneral.capSubItems = [\n this.capNotifications,this.capApprovals,this.capCustomers, this.capSuppliers,\n this.capCategories, this.capSubCategories, this.capBrands, this.capTasks, this.capSubscription, this.capBilling,\n this.capReferenceData // Changed (cap90): sits beside Customers and Suppliers, two of the three registers it gates\n ];\n\n // Added: cap90 — gates the `list` route of the reference-data registers (products/tax-rates, customers,\n // suppliers) via `AllowListWithoutCapability` on TinWeb's ProductsController, CustomersController and\n // SuppliersController (TinWeb 9395832). Like cap87 it is a PERMISSION, not a page: no link, and\n // showMenu = false keeps it out of every nav rendering, while the Roles screen — which does NOT filter on\n // showMenu — still renders its access level. That is the whole reason this entry exists: without it cap90\n // is invisible and ungrantable from the Roles screen, so an administrator could never repair a role that\n // the per-boot template sync permanently skips (edited/renamed/hand-created roles, and the seeded\n // \"Default\" role, which is not a template name).\n // It is placed under General rather than Inventory because two of its three registers (Customers cap12,\n // Suppliers cap14) live there, and the server checks it on the controllers, so one grant covers all three.\n // Granted `RoleAccess.View` by all 19 role templates across the four setup providers.\n this.capReferenceData.name = \"cap90\"\n this.capReferenceData.display = \"Reference Data\";\n this.capReferenceData.showMenu = false;\n\n this.capCustomers.name = \"cap12\"\n this.capCustomers.display = \"Customers\";\n this.capCustomers.link = \"home/general/customers\";\n this.capCustomers.icon = \"group\"\n\n this.capCategories.name = \"cap13\"\n this.capCategories.display = \"Categories\";\n this.capCategories.link = \"home/general/categories\";\n this.capCategories.icon = \"category\"\n\n this.capSubCategories.name = \"cap43\" // Changed: Moved from cap13 to cap43 — resolve duplicate with capCategories\n this.capSubCategories.display = \"Sub Categories\";\n this.capSubCategories.link = \"home/general/subcategories\";\n this.capSubCategories.icon = \"category\"\n\n this.capBrands.name = \"cap14\"\n this.capBrands.display = \"Brands\";\n this.capBrands.link = \"home/general/brands\";\n this.capBrands.icon = \"loyalty\"\n\n // Added: GPT Cache capability\n this.capGPTCaches.name = \"cap65\" // Changed: Moved from cap104 to cap65 — library range consolidation\n this.capGPTCaches.display = \"GPT Cache\";\n this.capGPTCaches.link = \"home/admin/gpt-caches\";\n this.capGPTCaches.icon = \"memory\"\n\n // Changed: capPreferences (cap66) is GONE — Preferences merged into each app's App Configuration page,\n // which is gated by the app's own config capability. Apps link to it with their capAppConfiguration.\n\n this.capSuppliers.name = \"cap15\"\n this.capSuppliers.display = \"Suppliers\";\n this.capSuppliers.link = \"home/general/suppliers\";\n this.capSuppliers.icon = \"groups\"\n\n this.capTasks.name = \"cap16\"\n this.capTasks.display = \"Tasks\";\n this.capTasks.moduleKey = \"tasks\"; // Added (Setup v3)\n this.capTasks.link = \"home/general/tasks\";\n this.capTasks.icon = \"check_box\"\n\n\n this.capHR.name = \"cap17\"\n this.capHR.display = \"HR\";\n this.capHR.moduleKey = \"hr\"; // Added (Setup v3)\n // Changed (menucap-1 M1): link REMOVED. cap17 is a GROUP cap and was the only group in this file carrying a link — it pointed at home/hr/employees, whose page gates on capEmployees cap18 (:907), so a role holding cap17 without cap18 saw an HR entry, clicked it, and hit no-access for a cap it was never shown. Its own child capEmployees (:218-220) already links there. Line kept as a comment: SetupModuleGuardTests.CapItemsModel:216 pins capHR's capSubItems at line 205\n this.capHR.icon = \"diversity_3\"\n this.capHR.capSubItems = [this.capDepartments, this.capPositions, this.capUnlock, this.capEmployees,] // Changed: capUnlock sits beside the two ILock entities it releases, so the grant is found where it is used\n\n // Added: cap87 — releases the ILock protection (`POST /api/{entity}?action=unlock`, TinWeb 51f30e4). It is a\n // PERMISSION, not a page: no link, and showMenu = false keeps it out of every nav rendering while the Roles\n // screen (which does not filter on showMenu) still renders its access level. It lives under HR because the\n // only two ILock entities today are Department (cap19) and Position (cap20), but the server checks it on the\n // BASE controller, so a future ILock entity anywhere is covered by this one grant rather than a new column.\n // Deliberately in NO role template — Owner/Admin hold it because they hold every cap; anyone else is granted\n // it on purpose, which is the point of gating an irreversible action.\n this.capUnlock.name = \"cap87\"\n this.capUnlock.display = \"Unlock Records\";\n this.capUnlock.showMenu = false;\n\n this.capEmployees.name = \"cap18\"\n this.capEmployees.display = \"Employees\";\n this.capEmployees.link = \"home/hr/employees\";\n this.capEmployees.icon = \"group\"\n\n this.capDepartments.name = \"cap19\"\n this.capDepartments.display = \"Departments\";\n this.capDepartments.link = \"home/hr/departments\";\n this.capDepartments.icon = \"business_center\"\n\n this.capPositions.name = \"cap20\"\n this.capPositions.display = \"Positions\";\n this.capPositions.link = \"home/hr/positions\";\n this.capPositions.icon = \"badge\" // Changed: picture_in_picture_medium has NO ligature in the Material sets, so it rendered as literal text and overflowed the grid-menu tile; badge (an ID badge = a job title) is a real ligature and sits beside its HR neighbours group/business_center without repeating them\n\n // Changed: Added Payroll module sidebar section\n this.capPayroll.name = \"cap72\" // Changed: Moved from cap110 to cap72 — library range consolidation\n this.capPayroll.display = \"Payroll\";\n this.capPayroll.moduleKey = \"payroll\"; // Added (Setup v3)\n this.capPayroll.icon = \"payments\"\n this.capPayroll.capSubItems = [this.capPayrollDashboard, this.capSalaryStructures, this.capStatutoryDeductions, this.capPayrollRuns, this.capCommissionConfigs, this.capCommissionEntries, this.capCommissionStatement, this.capSalaryAdvances, this.capOvertimeEntries] // Changed (Phase 6): commission statement sits directly under the entries it explains\n\n this.capPayrollDashboard.name = \"cap72\"; // Changed: Reuses module cap number for dashboard visibility\n this.capPayrollDashboard.display = \"Dashboard\";\n this.capPayrollDashboard.link = \"home/payroll/dashboard\";\n this.capPayrollDashboard.icon = \"dashboard\";\n\n this.capSalaryStructures.name = \"cap73\" // Changed: Moved from cap111 to cap73 — library range consolidation\n this.capSalaryStructures.display = \"Salary Structures\";\n this.capSalaryStructures.link = \"home/payroll/salary-structures\";\n this.capSalaryStructures.icon = \"account_tree\"\n\n this.capStatutoryDeductions.name = \"cap74\" // Changed: Moved from cap112 to cap74 — library range consolidation\n this.capStatutoryDeductions.display = \"Statutory Deductions\";\n this.capStatutoryDeductions.link = \"home/payroll/statutory-deductions\";\n this.capStatutoryDeductions.icon = \"gavel\"\n\n this.capPayrollRuns.name = \"cap75\" // Changed: Moved from cap113 to cap75 — library range consolidation\n this.capPayrollRuns.display = \"Payroll Runs\";\n this.capPayrollRuns.link = \"home/payroll/runs\";\n this.capPayrollRuns.icon = \"play_circle\"\n\n // Changed: Added Commission Config sidebar item\n this.capCommissionConfigs.name = \"cap76\"\n this.capCommissionConfigs.display = \"Commission Config\";\n this.capCommissionConfigs.link = \"home/payroll/commission-configs\";\n this.capCommissionConfigs.icon = \"percent\"\n\n // Changed: Added Commission Entries sidebar item\n this.capCommissionEntries.name = \"cap77\"\n this.capCommissionEntries.display = \"Commission Entries\";\n this.capCommissionEntries.link = \"home/payroll/commission-entries\";\n this.capCommissionEntries.icon = \"request_quote\"\n\n // Added (Phase 6): the Driver Commission Statement — cap86, its own capability rather than cap77's, because\n // it is the surface that GENERATES a period as well as reporting it, and because reading a whole period's\n // commission across every driver is a wider grant than working one entry. Deliberately in NO role template:\n // it is registered and reachable, and someone has to grant it on purpose.\n this.capCommissionStatement.name = \"cap86\"\n this.capCommissionStatement.display = \"Commission Statement\";\n this.capCommissionStatement.link = \"home/payroll/commission-statement\";\n this.capCommissionStatement.icon = \"receipt_long\"\n\n // Changed: Added Salary Advances sidebar item\n this.capSalaryAdvances.name = \"cap78\"\n this.capSalaryAdvances.display = \"Salary Advances\";\n this.capSalaryAdvances.link = \"home/payroll/salary-advances\";\n this.capSalaryAdvances.icon = \"money_off\"\n\n // Changed: Added Overtime sidebar item\n this.capOvertimeEntries.name = \"cap79\"\n this.capOvertimeEntries.display = \"Overtime\";\n this.capOvertimeEntries.link = \"home/payroll/overtime-entries\";\n this.capOvertimeEntries.icon = \"more_time\"\n\n this.capApprovals.name = \"cap21\"\n this.capApprovals.display = \"Approvals\";\n this.capApprovals.moduleKey = \"approvals\"; // Added (Setup v3)\n this.capApprovals.link = \"home/workflow/approvals\";\n this.capApprovals.icon = \"rule\"\n\n this.capApprovalsConfig.name = \"cap22\"\n this.capApprovalsConfig.display = \"Approvals Config\";\n this.capApprovalsConfig.link = \"home/workflow/approvals-config\";\n this.capApprovalsConfig.icon = \"published_with_changes\"\n this.capApprovalsConfig.capSubItems = [this.capSelfApproval]\n\n this.capSelfApproval.name = \"cap23\"\n this.capSelfApproval.display = \"Self Approvals\";\n this.capSelfApproval.isBool = true;\n\n this.capNotifications.name = \"cap24\"\n this.capNotifications.display = \"Notifications\";\n this.capNotifications.link = \"home/workflow/notifications\";\n this.capNotifications.icon = \"notifications\"\n\n this.capAppModels.name = \"cap25\"\n this.capAppModels.display = \"App Models\";\n this.capAppModels.link = \"home/workflow/appmodels\";\n // this.capAppModels.icon = \"notifications\"\n\n this.capNotificationsConfig.name = \"cap26\"\n this.capNotificationsConfig.display = \"Notif Config\";\n this.capNotificationsConfig.link = \"home/workflow/notifications-config\";\n\n this.capAccounting.name = \"cap27\";\n this.capAccounting.display = \"Accounting\";\n this.capAccounting.moduleKey = \"accounting\"; // Added (Setup v3)\n this.capAccounting.icon = \"account_balance\";\n this.capAccounting.capSubItems = [ this.capAccountingDashboard, this.capAccounts, this.capTransactions, this.capAggregates, this.capReports, this.capVatReturn, this.capFiscalPeriods, this.capBankReconciliation, this.capTenantTransfers, this.capBudgets, this.capBudgetVsActual, this.capTransactionTypes, this.capTaxRates, this.capCurrencies, this.capStandingOrders]; // Changed: Added Bank Reconciliation (C4) after Fiscal Periods\n\n this.capAccountingDashboard.name = \"cap27\"; // Changed: Reuses module cap number for dashboard visibility\n this.capAccountingDashboard.display = \"Dashboard\";\n this.capAccountingDashboard.link = \"home/accounting/dashboard\";\n this.capAccountingDashboard.icon = \"dashboard\";\n\n this.capAccounts.name = \"cap52\"; // Changed: Fixed conflict with capBrands (was cap14)\n this.capAccounts.display = \"Accounts\";\n this.capAccounts.link = \"home/accounting/accounts\";\n this.capAccounts.icon = \"account_balance_wallet\";\n\n this.capAggregates.name = \"cap57\"; // Added: Aggregates capability\n this.capAggregates.display = \"Aggregates\";\n this.capAggregates.link = \"home/accounting/aggregates\";\n this.capAggregates.icon = \"bar_chart\";\n\n\n this.capReports.name = \"cap48\"; // Changed: Moved from cap61 to cap48 — resolve duplicate with capSalesModule\n this.capReports.display = \"Reports\";\n this.capReports.link = \"home/accounting/reports\";\n this.capReports.icon = \"assessment\";\n\n // Changed: VAT return menu item (B2) — shares the Reports capability (cap48)\n this.capVatReturn.name = \"cap48\";\n this.capVatReturn.display = \"VAT Return\";\n this.capVatReturn.link = \"home/accounting/vat-return\";\n this.capVatReturn.icon = \"receipt_long\";\n\n // Changed: Fiscal periods menu item (C2) — shares the Accounts capability (cap52)\n this.capFiscalPeriods.name = \"cap52\";\n this.capFiscalPeriods.display = \"Fiscal Periods\";\n this.capFiscalPeriods.link = \"home/accounting/fiscal-periods\";\n this.capFiscalPeriods.icon = \"event_repeat\";\n\n // Changed: Bank reconciliation menu item (C4) — shares the Accounts capability (cap52)\n this.capBankReconciliation.name = \"cap52\";\n this.capBankReconciliation.display = \"Bank Reconciliation\";\n this.capBankReconciliation.link = \"home/accounting/bank-reconciliation\";\n this.capBankReconciliation.icon = \"rule\";\n\n // Added: Budgets capability (cap85) — gates BudgetsController, BudgetLinesController, BudgetReportController\n this.capBudgets.name = \"cap85\";\n this.capBudgets.display = \"Budgets\";\n this.capBudgets.link = \"home/accounting/budgets\";\n this.capBudgets.icon = \"account_balance_wallet\";\n\n // Added: Budget vs Actual report menu item — shares the Budgets capability (cap85, BudgetReportController)\n this.capBudgetVsActual.name = \"cap85\";\n this.capBudgetVsActual.display = \"Budget vs Actual\";\n this.capBudgetVsActual.link = \"home/accounting/budget-vs-actual\";\n this.capBudgetVsActual.icon = \"compare_arrows\";\n\n this.capTaxRates.name = \"cap46\"; // Changed: Moved from cap60 to cap46 — resolve duplicate with capManufacturing\n this.capTaxRates.display = \"Tax Rates\";\n this.capTaxRates.link = \"home/accounting/tax-rates\";\n this.capTaxRates.icon = \"percent\";\n\n // Changed: Added Currencies to Accounting menu — feature exists but was missing from nav\n this.capCurrencies.name = \"cap84\";\n this.capCurrencies.display = \"Currencies\";\n this.capCurrencies.link = \"home/accounting/currencies\";\n this.capCurrencies.icon = \"currency_exchange\";\n\n this.capStandingOrders.name = \"cap64\"; // Changed: Standing orders capability\n this.capStandingOrders.display = \"Standing Orders\";\n this.capStandingOrders.link = \"home/accounting/standing-orders\";\n this.capStandingOrders.icon = \"schedule\";\n\n // Added (N11): Organisation Transfers — cross-organisation money arrangements and transfers, shared page,\n // sits in the ACCOUNTING menu by owner directive (2026-08-17). Replaces grip-spa's app-local page and its\n // unrecorded cap111 (cap111 is in the consumer-app range and is Piglet's Treatments — the collision was\n // only survivable because roles are per-app).\n //\n // ── HOW cap91 WAS CHOSEN — same rule as cap87/cap89/cap90 (TinWeb Contracts\\Capabilities.cs census) ──\n // The census on 2026-08-17 (cap90's) found \"cap90\" and \"cap91\" used by NOTHING anywhere — backend,\n // tin-spa, consumer apps, Kotlin. cap90 took Shared Reference Data, so 91 is the next number that is both\n // free and NEVER-ASSIGNED (88 stays skipped — vacated numbers can hold stale grants). Like cap89 this\n // gates the MENU ENTRY and the dialogs' security allow-lists; the server authority remains\n // CrossTenantTransfersController's IsAdmin() test on every verb.\n this.capTenantTransfers.name = \"cap91\";\n this.capTenantTransfers.display = \"Organisation Transfers\";\n this.capTenantTransfers.link = \"home/accounting/tenant-transfers\";\n this.capTenantTransfers.icon = \"swap_horiz\";\n\n // Changed: Fixed Assets is now its own top-level module\n this.capFixedAssetsModule.name = \"cap70\";\n this.capFixedAssetsModule.display = \"Fixed Assets\";\n this.capFixedAssetsModule.moduleKey = \"fixed-assets\"; // Added (Setup v3)\n this.capFixedAssetsModule.icon = \"precision_manufacturing\";\n this.capFixedAssetsModule.capSubItems = [this.capFixedAssetsDashboard, this.capFixedAssets, this.capFixedAssetCategories];\n\n this.capFixedAssetsDashboard.name = \"cap70\"; // Reuses module cap number for dashboard visibility\n this.capFixedAssetsDashboard.display = \"Dashboard\";\n this.capFixedAssetsDashboard.link = \"home/fixed-assets/dashboard\";\n this.capFixedAssetsDashboard.icon = \"dashboard\";\n\n this.capFixedAssets.name = \"cap70\";\n this.capFixedAssets.display = \"Asset Register\";\n this.capFixedAssets.link = \"home/fixed-assets/register\"; // Changed: Updated route\n this.capFixedAssets.icon = \"precision_manufacturing\";\n\n this.capFixedAssetCategories.name = \"cap71\";\n this.capFixedAssetCategories.display = \"Depreciation Categories\"; // Changed: Renamed from Categories\n this.capFixedAssetCategories.link = \"home/fixed-assets/depreciation-categories\"; // Changed: Updated route\n this.capFixedAssetCategories.icon = \"category\";\n\n this.capTransactionTypes.name = \"cap28\";\n this.capTransactionTypes.display = \"Transaction Types\";\n this.capTransactionTypes.link = \"home/accounting/transaction-types\";\n this.capTransactionTypes.icon = \"category\";\n\n this.capTransactions.name = \"cap29\";\n this.capTransactions.display = \"Transactions\";\n this.capTransactions.link = \"home/accounting/transactions\";\n this.capTransactions.icon = \"receipt_long\";\n\n this.capInvoicing.name = \"cap53\";\n this.capInvoicing.display = \"Invoicing\";\n this.capInvoicing.moduleKey = \"invoicing\"; // Added (Setup v3)\n this.capInvoicing.icon = \"receipt_long\";\n this.capInvoicing.capSubItems = [ this.capInvoiceDashboard, this.capQuotes, this.capRateCard, this.capAccountingInvoices, this.capCreditNotes, this.capReceipts, this.capRevenueSchedules, this.capAging, this.capAccountingOutstandingInvoices ]; // Changed (quotations-under-invoicing): + capRateCard, directly after Quotations — the rate card is the pricing source those quotations are built from. Every consumer had been declaring this row for itself because the library routed the page but never offered a way to reach it // Changed: Added quotations (C10) before invoices\n\n this.capInvoiceDashboard.name = \"cap53\"; // Changed: Reuses module cap number for dashboard visibility\n this.capInvoiceDashboard.display = \"Dashboard\";\n this.capInvoiceDashboard.link = \"home/accounting/invoice-dashboard\";\n this.capInvoiceDashboard.icon = \"dashboard\";\n\n this.capAccountingInvoices.name = \"cap53\";\n this.capAccountingInvoices.display = \"Invoices\";\n this.capAccountingInvoices.link = \"home/accounting/invoices\";\n this.capAccountingInvoices.icon = \"receipt_long\";\n\n // Changed: Credit notes menu item (B6) — shares the Invoices capability (cap53)\n this.capCreditNotes.name = \"cap53\";\n this.capCreditNotes.display = \"Credit Notes\";\n this.capCreditNotes.link = \"home/accounting/credit-notes\";\n this.capCreditNotes.icon = \"assignment_return\";\n\n // Changed: Customer receipts menu item (C3) — shares the Invoices capability (cap53)\n this.capReceipts.name = \"cap53\";\n this.capReceipts.display = \"Receipts\";\n this.capReceipts.link = \"home/accounting/receipts\";\n this.capReceipts.icon = \"receipt\";\n\n // Changed: Deferred revenue menu item (C7) — shares the Invoices capability (cap53)\n this.capRevenueSchedules.name = \"cap53\";\n this.capRevenueSchedules.display = \"Revenue Schedules\";\n this.capRevenueSchedules.link = \"home/accounting/revenue-schedules\";\n this.capRevenueSchedules.icon = \"schedule_send\";\n\n // Changed: Quotations menu item (C10) — shares the Invoices capability (cap53)\n this.capQuotes.name = \"cap53\";\n this.capQuotes.display = \"Quotations\";\n this.capQuotes.link = \"home/accounting/quotes\";\n this.capQuotes.icon = \"request_quote\";\n\n // Added (quotations-under-invoicing): the rate card the guided quote builder prices from. AccountingRoutingModule\n // has routed home/accounting/rate-card since the quotations suite landed, but no menu row ever reached it, so\n // five consumer apps each declared their own identical row. This is that row, owned once, in the library.\n // It shares cap53 with Quotations — the same gate QuotableServicesController and QuotesController enforce — so\n // adding it grants nobody anything they did not already have. A consumer that wants its own wording overrides\n // `display` (grip: \"Hire Rate Card\", piglet: \"Pig Rate Card\") rather than declaring a second CapItem.\n this.capRateCard.name = \"cap53\";\n this.capRateCard.display = \"Rate Card\";\n this.capRateCard.link = \"home/accounting/rate-card\";\n this.capRateCard.icon = \"price_change\";\n this.capRateCard.moduleKey = \"invoicing\"; // MODULE MAPPING: stated explicitly so the row matches its own route (accounting-routing.module.ts:65 data.moduleKey) and the Getting Started picker's Invoicing toggle reaches it directly, not only through the parent group\n\n this.capAccountingOutstandingInvoices.name = \"cap54\";\n this.capAccountingOutstandingInvoices.display = \"Statement\"; // Changed: Renamed from \"Outstanding Invoices\" to \"Statement\"\n this.capAccountingOutstandingInvoices.link = \"home/accounting/statements\"; // Changed: Updated route path\n this.capAccountingOutstandingInvoices.icon = \"account_balance_wallet\";\n\n this.capAging.name = \"cap58\";\n this.capAging.display = \"Aging Report\";\n this.capAging.link = \"home/accounting/aging\";\n this.capAging.icon = \"schedule\";\n\n this.capLoans.name = \"cap30\";\n this.capLoans.display = \"Loans\";\n this.capLoans.moduleKey = \"loans\"; // Added (Setup v3)\n this.capLoans.icon = \"payments\";\n this.capLoans.capSubItems = [this.capLoanProducts, this.capLoansMain, this.capLoanPayments];\n\n this.capLoanProducts.name = \"cap31\";\n this.capLoanProducts.display = \"Loan Products\";\n this.capLoanProducts.link = \"home/loans/products\";\n this.capLoanProducts.icon = \"inventory\";\n\n this.capLoansMain.name = \"cap32\";\n this.capLoansMain.display = \"Loans\";\n this.capLoansMain.link = \"home/loans/loans\";\n this.capLoansMain.icon = \"account_balance\";\n\n this.capLoanPayments.name = \"cap33\";\n this.capLoanPayments.display = \"Payments\";\n this.capLoanPayments.link = \"home/loans/payments\";\n this.capLoanPayments.icon = \"payment\";\n\n // Changed: Sales module — separate menu group for sales\n this.capSalesModule.name = \"cap61\";\n this.capSalesModule.display = \"Sales\";\n this.capSalesModule.moduleKey = \"sales\"; // Added (Setup v3)\n this.capSalesModule.icon = \"point_of_sale\";\n this.capSalesModule.capSubItems = [this.capPointOfSale, this.capSalesDashboard, this.capSales, this.capSalesOrders]; // Changed (OWNER DIRECTIVE 2026-09-01): Point of Sale is back INSIDE the Sales group — it belongs under Sales, not beside it. The cap93-only top-level group of A-0831-29 is deleted; the row itself is still gated on cap93, unchanged\n\n // Added (POS phase 7): the till's menu row, and it is deliberately the FIRST entry under Sales.\n //\n // WHY FIRST: menu order here follows FREQUENCY OF USE, not hierarchy. A till operator opens exactly this one\n // page, all day, every day; Dashboard, Sales and Sales Orders are things a manager visits.\n //\n // ⚠️ OWNER DIRECTIVE 2026-09-01 — this row lived briefly in its own top-level \"Point of Sale\" group (Arbiter\n // A-0831-29) and the owner moved it back under Sales. The trade-off that ruling was solving is REAL and is\n // simply accepted: a menu GROUP is gated on the group's own cap, and the Sales group's cap is cap61, so a\n // cashier needs cap61 to open the group and thereby also sees the cap61 Sales Dashboard row. The row's own\n // cap93 gate is untouched — only the grouping changed.\n //\n // 🔑 WHY IT HAS ITS OWN CAPABILITY AND DOES NOT REUSE cap50 (capSales) OR cap61 (the module). A cashier must be\n // able to RECORD a sale without being able to BROWSE, EDIT or VOID the sales ledger — reusing cap50 would make\n // the least-privileged role in a shop one of the most privileged. cap93 is the library slot; it is declared once,\n // by name, in TinWeb's Contracts/Capabilities.cs as Capabilities.PointOfSale, and the SERVER enforces it too\n // (SalesController gates pos-sale and receipt on it), so this row is not menu decoration over a cap50 gate.\n //\n // ⚠️ IT IS SILENT BY DEFAULT AND THAT IS THE POINT. cap93 defaults to None on every role except seeded Admin and\n // Owner (who hold every CapN at Full), and NO onboarding role template grants it — an Arbiter carve-out, because\n // a template grant is irreversible once it reaches synced tenant rows. So a new money-taking surface appears for\n // nobody until an administrator grants it from the Roles screen, which renders from this very list.\n this.capPointOfSale.name = \"cap93\";\n this.capPointOfSale.display = \"Point of Sale\";\n this.capPointOfSale.link = \"home/sales/point-of-sale\";\n this.capPointOfSale.icon = \"point_of_sale\";\n\n this.capSalesDashboard.name = \"cap61\"; // Changed: Reuses module cap number for dashboard visibility\n this.capSalesDashboard.display = \"Dashboard\";\n this.capSalesDashboard.link = \"home/sales/dashboard\";\n this.capSalesDashboard.icon = \"dashboard\";\n\n // Changed: Purchasing module — separate menu group for purchasing\n this.capPurchasingModule.name = \"cap62\";\n this.capPurchasingModule.display = \"Purchasing\";\n this.capPurchasingModule.moduleKey = \"purchasing\"; // Added (Setup v3)\n this.capPurchasingModule.icon = \"shopping_cart\";\n this.capPurchasingModule.capSubItems = [this.capPurchasingDashboard, this.capInventoryReceipts, this.capSupplierPurchaseOrders, this.capSupplierAging]; // Changed: Added Dashboard to Purchasing submenu\n\n this.capPurchasingDashboard.name = \"cap62\"; // Changed: Reuses module cap number for dashboard visibility\n this.capPurchasingDashboard.display = \"Dashboard\";\n this.capPurchasingDashboard.link = \"home/purchasing/dashboard\";\n this.capPurchasingDashboard.icon = \"dashboard\";\n\n this.capInventory.name = \"cap34\";\n this.capInventory.display = \"Inventory\";\n this.capInventory.moduleKey = \"inventory\"; // Added (Setup v3)\n this.capInventory.icon = \"inventory\";\n this.capInventory.capSubItems = [this.capInventoryDashboard, this.capProducts, this.capServiceItems, // Changed: Dashboard moved to first position in sub-items\n this.capBundleProducts, this.capInventoryStock, this.capInventoryTransactions, this.capInventoryItems,\n this.capRequisitions, this.capInventoryAdjustments,\n this.capInventoryReturns,\n ];\n\n // Changed: Manufacturing module — separate menu group for production\n this.capManufacturing.name = \"cap60\";\n this.capManufacturing.display = \"Manufacturing\";\n this.capManufacturing.moduleKey = \"manufacturing\"; // Added (Setup v3)\n this.capManufacturing.icon = \"factory\";\n this.capManufacturing.capSubItems = [this.capProductionRecipes, this.capProductionOrders];\n\n this.capInventoryDashboard.name = \"cap35\";\n this.capInventoryDashboard.display = \"Dashboard\";\n this.capInventoryDashboard.link = \"home/inventory/dashboard\";\n this.capInventoryDashboard.icon = \"dashboard\";\n\n this.capInventoryStock.name = \"cap51\"; // Changed: Added inventory stock cap item configuration\n this.capInventoryStock.display = \"Inventory Stock\";\n this.capInventoryStock.link = \"home/inventory/stock\";\n this.capInventoryStock.icon = \"widgets\";\n\n this.capProducts.name = \"cap36\";\n this.capProducts.display = \"Products\";\n this.capProducts.link = \"home/inventory/products\";\n this.capProducts.icon = \"category\";\n\n this.capServiceItems.name = \"cap59\"; // Added: Service items capability\n this.capServiceItems.display = \"Services\";\n this.capServiceItems.link = \"home/inventory/service-items\";\n this.capServiceItems.icon = \"build\";\n\n // ARBITER-RULED 2026-08-19 (bundle-products-menu-authority, supersedes the menucap-1 M3 PENDING-OWNER note): cap45 is a REAL costing authority and STAYS on this entry. The ruling wanted the menu gated on cap45 AND cap36, but a CapItem carries ONE cap as a plain string (Classes.ts:772) matched by equality everywhere (no-access.component.ts:66, roles.component.ts:240) — there is no conjunction and none was invented. Renaming this to cap36 was rejected: this line is cap45's ONLY declaration and the Roles screen renders solely from appConfig.capItems, so it would orphan the owner's 2026-08-18 grant (DefaultSetupProvider.cs:385, storekeeper cap45 View) and change no user's access, since every cap45 holder already has cap36 Full (DefaultSetupProvider.cs:372). The page/server gate stays cap36 (ProductsController, products/bundles/x). The real defect is that \"View not Full\" cannot bind while cap36 governs the requests — proper fix is cap45 as a SERVER gate on the bundle routes, queued to the Arbiter\n this.capBundleProducts.name = \"cap45\"; // Changed: Moved from cap57 to cap45 — resolve duplicate with capAggregates\n this.capBundleProducts.display = \"Bundle Products\";\n this.capBundleProducts.link = \"home/inventory/bundle-products\";\n this.capBundleProducts.icon = \"inventory_2\";\n\n this.capInventoryItems.name = \"cap37\";\n this.capInventoryItems.display = \"Inventory Items\";\n this.capInventoryItems.link = \"home/inventory/items\";\n this.capInventoryItems.icon = \"inventory_2\";\n\n this.capSupplierPurchaseOrders.name = \"cap47\";\n this.capSupplierPurchaseOrders.display = \"Purchase Orders\";\n this.capSupplierPurchaseOrders.link = \"home/purchasing/orders\";\n this.capSupplierPurchaseOrders.icon = \"shopping_bag\";\n\n this.capInventoryReceipts.name = \"cap38\";\n this.capInventoryReceipts.display = \"Purchases\"; // Changed: \"Receipts\" → \"Purchases\"\n this.capInventoryReceipts.link = \"home/purchasing/purchases\"; // Changed: inventory-receipts → purchases\n this.capInventoryReceipts.icon = \"receipt_long\";\n\n this.capSupplierAging.name = \"cap63\"; // Changed: AP Aging capability\n this.capSupplierAging.display = \"AP Aging\";\n this.capSupplierAging.link = \"home/accounting/supplier-aging\";\n this.capSupplierAging.icon = \"schedule\";\n\n this.capSalesOrders.name = \"cap39\";\n this.capSalesOrders.display = \"Sales Orders\";\n this.capSalesOrders.link = \"home/sales/orders\";\n this.capSalesOrders.icon = \"shopping_cart\";\n\n\n this.capSales.name = \"cap50\";\n this.capSales.display = \"Sales\";\n this.capSales.link = \"home/sales/sales\";\n this.capSales.icon = \"point_of_sale\";\n\n this.capRequisitions.name = \"cap40\";\n this.capRequisitions.display = \"Requisitions\";\n this.capRequisitions.link = \"home/inventory/requisitions\";\n this.capRequisitions.icon = \"request_quote\";\n\n this.capInventoryAdjustments.name = \"cap41\";\n this.capInventoryAdjustments.display = \"Adjustments\";\n this.capInventoryAdjustments.link = \"home/inventory/adjustments\";\n this.capInventoryAdjustments.icon = \"tune\";\n\n this.capInventoryReturns.name = \"cap42\";\n this.capInventoryReturns.display = \"Returns\";\n this.capInventoryReturns.link = \"home/inventory/returns\";\n this.capInventoryReturns.icon = \"keyboard_return\";\n\n this.capInventoryTransactions.name = \"cap44\";\n this.capInventoryTransactions.display = \"Transactions\";\n this.capInventoryTransactions.link = \"home/inventory/transactions\";\n this.capInventoryTransactions.icon = \"swap_horiz\";\n\n this.capProductionRecipes.name = \"cap55\"; // Added: Production recipes capability\n this.capProductionRecipes.display = \"Production Recipes\";\n this.capProductionRecipes.link = \"home/manufacturing/production-recipes\";\n this.capProductionRecipes.icon = \"description\";\n\n this.capProductionOrders.name = \"cap56\"; // Added: Production orders capability\n this.capProductionOrders.display = \"Production Orders\";\n this.capProductionOrders.link = \"home/manufacturing/production-orders\";\n this.capProductionOrders.icon = \"factory\";\n\n // Default cache rule for list endpoints\n this.cacheConfig.addRule('*/list/*', 5);\n\n this.authService.myRoleObserv.subscribe((role: any) => {\n this.myRole = role;\n });\n }\n\n\n appConfig = new AppConfig();\n private appConfigSource = new BehaviorSubject(this.appConfig);\n public appConfigObserv = this.appConfigSource.asObservable();\n UpdateAppConfig(config: AppConfig) {\n this.appConfigSource.next(config);\n this.appConfig = config;\n }\n\n // Added: the single place every dialog asks \"am I modern?\". Read at dialog-open time rather than cached at\n // startup, because apps set appConfig in their own service constructor and an app could switch it at runtime.\n // Anything other than 'modern' — including the property being absent on an older app's config — is the\n // previous look, so opting in is a deliberate act and never an accident.\n get modernDialogs(): boolean {\n return this.appConfig?.dialogStyle === 'modern';\n }\n\n // Added: the single place the library asks \"may I name my own destructive prompts?\". Read at prompt time\n // rather than cached, for the same reason as modernDialogs — an app assigns appConfig in its own service\n // constructor. Absent means false, so naming is a deliberate act and never an accident: an untracked consumer\n // that has never heard of this flag keeps getting \"Yes\" / \"No\" on every built-in delete confirmation.\n get namedDestructiveActions(): boolean {\n return this.appConfig?.namedDestructiveActions === true;\n }\n\n // Added: panel class for the overlay pane. Dialogs apply this so surface-level styling (radius, shadow,\n // header band) can live in tin-styles.css, which every consumer app already loads globally — component CSS\n // cannot reach the Material surface because it is an ancestor of the component's own view.\n get dialogPanelClass(): string[] {\n return this.modernDialogs ? ['tin-dialog-modern'] : [];\n }\n\n // Centralized cache configuration\n cacheConfig = new CacheConfig();\n\n //---------- App Configuration base sections ----------\n // Added: the library half of the App Configuration page. These are singletons an app composes into its own\n // appConfigurationConfig.sections — the same idiom as capItems menu composition — so the financial calendar\n // (which used to be the whole Preferences page) is defined once and every app renders it identically.\n // An app that registers no config at all falls back to configBaseSections, so it still gets this page.\n configMonthOptions: any[] = [\n { name: \"January\", value: 1 }, { name: \"February\", value: 2 }, { name: \"March\", value: 3 }, { name: \"April\", value: 4 },\n { name: \"May\", value: 5 }, { name: \"June\", value: 6 }, { name: \"July\", value: 7 }, { name: \"August\", value: 8 },\n { name: \"September\", value: 9 }, { name: \"October\", value: 10 }, { name: \"November\", value: 11 }, { name: \"December\", value: 12 }\n ];\n configDayOptions: any[] = Array.from({ length: 28 }, (_, i) => ({ name: `${i + 1}`, value: i + 1 })); // 28 — a period start beyond that does not exist in every month\n\n configSectionFinancial: AppConfigSection = {\n key: 'financial', title: 'Financial', icon: 'account_balance', hint: 'The currency and accounting calendar every report, period and statement is built on',\n fields: [\n { name: 'baseCurrencyID', alias: 'Base Currency', type: 'select', loadAction: { url: 'currencies/list' }, hint: 'Reporting currency — everything else converts to this' },\n { name: 'firstMonthOfYear', alias: 'First Month of Year', type: 'select', options: this.configMonthOptions, hint: 'The month your financial year starts in' },\n { name: 'firstDayOfMonth', alias: 'First Day of Month', type: 'select', options: this.configDayOptions, hint: 'The day accounting periods start on' },\n { name: 'booksOpenFrom', alias: 'Books Open From', type: 'date', defaultValue: 'yearStart', hint: 'Anything before this date is a closed period' } // Changed: added defaultValue 'yearStart' so the form states the 1 January the server already falls back to, instead of rendering blank\n ],\n // Added (section summaries, 2026-08-31): the two settings this section is actually consulted for — what money\n // is reported in, and when the year turns. Both are read off the row the page has already loaded and the\n // select options the form has already fetched; nothing new is requested. Either half is dropped when it has\n // not resolved yet, so the line never prints a bare separator or a raw ID.\n summary: (data: any, fields: Field[]) => [Core.optionLabel(fields, 'baseCurrencyID', data?.baseCurrencyID), Core.optionLabel(fields, 'firstMonthOfYear', data?.firstMonthOfYear)].filter(x => !!x).join(' · ')\n };\n\n configBaseSections: AppConfigSection[] = [this.configSectionFinancial];\n\n //---------- Library defaults: Getting Started step actions (Phase 5) ----------\n // Added: the module-derived half of every app's Getting Started, authored ONCE. The server has always emitted\n // these thirteen steps from DefaultSetupProvider.LibrarySteps(); until now every app restated the ACTIONS for\n // them, which is why one app offered a create dialog on 'invoices' and another offered only a link. Precedent\n // and idiom: configBaseSections above — a library singleton an app composes into its own config.\n //\n // 🔑 WHY THIS NEEDS NO APP DI, AND IT IS THE FACT THE WHOLE PHASE RESTS ON: every config spread below belongs\n // to a tin-spa service (AccountingService, InventoryService, SalesService, PurchasingService, ProductionService,\n // PayrollService, LoansService) or to this service itself. pulse-spa's own comment states the principle —\n // \"every Pulse page is a library page, so its setup steps reuse the library's own create buttons and dialogs\".\n // A library step points at a library page by construction; app-DOMAIN steps (vehicles, pigs, equipment) are not\n // here and stay app-owned.\n //\n // 🔴 THE MERGE ORDER IS `{ ...libraryStepActions, ...appStepActions }` — THE APP WINS, PER KEY.\n // That order is the contract and it is pinned by spec (datalib-library-defaults.spec.ts). It is what makes this\n // a DEFAULT rather than a seizure: an app that needs different wording, an extra `import`, `seed: true`, or a\n // different dialog restates that ONE key after the spread and keeps everything else. Spreading the app map\n // first would make the library silently overwrite deliberate app choices, which is the opposite of the\n // directive. Per the FSD's Best Practices, an app that overrides a key must say in a comment WHY the library's\n // is wrong for it — that is a finding about the library, not a licence to fork.\n //\n // ⚠️ NO `import` HERE, DELIBERATELY. ImportConfig.entity is a per-API ImportRegistry key; an unregistered key\n // opens a wizard that then fails. Registries are audited in Phase 7; until then imports stay app-declared.\n // ⚠️ NO `seed: true` HERE either — Open Question 3 (does every app want \"Add examples\" on customers /\n // suppliers / products?) is with the owner and it touches TENANT DATA. Shipping the default without seed keys\n // is the route-and-proceed choice: an app that already offers them (test-spa) keeps them through the merge\n // order above, and answering Q3 \"yes\" later is a one-line addition here that reaches all five apps at once.\n // Answering it \"no\" costs nothing, because nothing was shipped.\n // ⚠️ 'choose-modules' (the module picker card), 'users' (an invite flow, not an entity) and 'roles' (a template\n // picker whose offer set is app-shaped) are NOT here. The first two carry no entity dialog in any app, and\n // 'roles' is a core step, not a module-derived one.\n //\n // Q2 (does the library's wording win?) raises NO conflict at this layer and that is worth stating plainly:\n // the wording below is the library's own, on library-authored defaults, and any app that wants different\n // wording keeps it by overriding the key — the merge order settles it without needing Q2 answered.\n get libraryStepActions(): { [key: string]: SetupStepAction } {\n if (this.libraryStepActionsCache) return this.libraryStepActionsCache;\n const accounting = this.injector.get(AccountingService);\n const inventory = this.injector.get(InventoryService);\n const sales = this.injector.get(SalesService);\n const purchasing = this.injector.get(PurchasingService);\n const production = this.injector.get(ProductionService);\n const payroll = this.injector.get(PayrollService);\n const loans = this.injector.get(LoansService);\n return this.libraryStepActionsCache = {\n 'accounts': { button: { ...accounting.accountCreateButton, display: 'Add Account', detailsConfig: accounting.accountDetailsConfig }, link: 'home/accounting/accounts', view: { ...accounting.accountsTableConfig, tabTitle: 'Accounts' } },\n 'base-currency': { link: 'home/app-configuration' }, // a SETTING, not an entity — no dialog exists to open and none should be invented\n 'customers': { button: { ...this.customerCreateButton, detailsConfig: this.customerDetailsConfig }, link: 'home/general/customers', view: { ...this.customersTableConfig, tabTitle: 'Customers' } },\n 'suppliers': { button: { ...this.supplierCreateButton, detailsConfig: this.supplierDetailsConfig }, link: 'home/general/suppliers', view: { ...this.suppliersTableConfig, tabTitle: 'Suppliers' } },\n 'products': { button: { ...inventory.productCreateButton, display: 'Add Product', detailsConfig: inventory.productDetailsConfig }, link: 'home/inventory/products', view: { ...inventory.productsTableConfig, tabTitle: 'Products' } },\n 'employees': { button: { name: 'create', display: 'Add Employee', dialog: true, detailsConfig: { formConfig: this.employeeFormConfig, mode: 'create', buttons: this.employeesTableConfig.buttons.filter(x => x.name == 'create') } }, link: 'home/hr/employees', view: { ...this.employeesTableConfig, tabTitle: 'Employees' } },\n 'departments': { button: { name: 'create', display: 'Add Department', dialog: true, detailsConfig: { formConfig: this.departmentFormConfig, mode: 'create', buttons: this.departmentTableConfig.buttons.filter(x => x.name == 'create') } }, link: 'home/hr/departments', view: { ...this.departmentTableConfig, tabTitle: 'Departments' } },\n 'salary-structures': { button: { name: 'create', display: 'Add Structure', dialog: true, detailsConfig: { formConfig: payroll.salaryStructureFormConfig, mode: 'create', buttons: payroll.salaryStructuresTableConfig.buttons.filter(x => x.name == 'create') } }, link: 'home/payroll/salary-structures', view: { ...payroll.salaryStructuresTableConfig, tabTitle: 'Salary Structures' } },\n 'sales': { button: { ...sales.saleCreateButton, detailsConfig: { formConfig: sales.saleFormConfig, mode: 'create', buttons: [sales.saleCreateButton] } }, link: 'home/sales/sales', view: { ...sales.salesTableConfig, tabTitle: 'Sales' } }, // salesTableConfig is the page LIST; saleDetailsConfig is a single record\n 'purchases': { button: { ...purchasing.quickPurchaseButton, detailsConfig: { formConfig: purchasing.purchaseFormConfig, mode: 'create', buttons: [purchasing.quickPurchaseButton] } }, link: 'home/purchasing/purchases', view: { ...purchasing.purchasesTableConfig, tabTitle: 'Purchases' } },\n 'recipes': { button: { ...production.recipeCreateButton, detailsConfig: { ...production.recipeDetailsConfig, mode: 'create', buttons: [production.recipeCreateButton] } }, link: 'home/manufacturing/recipes', view: { ...production.recipesTableConfig, tabTitle: 'Recipes' } }, // two-step — onSuccessButton opens the recipe items tab\n 'invoices': { button: { name: 'create', display: 'Create Invoice', dialog: true, onSuccessButton: accounting.invoiceViewButton, detailsConfig: { formConfig: accounting.invoiceFormConfig, mode: 'create', buttons: accounting.invoicesTableConfig.buttons.filter(x => x.name == 'create') } }, link: 'home/accounting/invoices', view: { ...accounting.invoicesTableConfig, tabTitle: 'Invoices' } }, // two-step — onSuccessButton opens the invoice for its lines\n 'loan-products': { button: { ...loans.loanProductCreateButton, detailsConfig: { formConfig: loans.loanProductFormConfig, mode: 'create', buttons: [loans.loanProductCreateButton] } }, link: 'home/loans/loan-products', view: { ...loans.loanProductTableConfig, tabTitle: 'Loan Products' } }\n };\n }\n private libraryStepActionsCache: { [key: string]: SetupStepAction } | null = null; // built once — every config it spreads is a singleton on a root service, so rebuilding per read would only churn objects\n\n //---------- Library defaults: Day Book lanes and sections (Phase 6) ----------\n // Added: somewhere for DefaultDayBookProvider's own rules to RENDER. The server has emitted eight module-gated\n // rules across a money, work and stock lane for some time; a Day Book page is config-driven, so a rule with no\n // section is payload and no page. That is the honest half of Piglet's refusal, and this closes it.\n //\n // Same merge order as libraryStepActions, and the same reason:\n // sections: [...this.data.libraryDayBookSections, ...this.appSections]\n // — but sections are an ARRAY, so \"the app wins\" is not automatic the way a spread over a map is. Use\n // libraryDayBookSection(key, overrides) to restate ONE library section without losing the rest, or simply\n // filter the array. Both are pinned by spec.\n //\n // 🔴 NO NEW `TableConfig` IS AUTHORED FOR THE FIVE INJECTABLE SECTIONS. The three invoice cards and the two\n // stock cards POINT AT the pages' own configs (AccountingService.invoicesTableConfig,\n // InventoryService.productsTableConfig) and select a column snippet by name — the definitions, dialogs,\n // capabilities and conditions stay on the page and arrive here by reference. That is the whole point of the\n // config-injection seam and re-declaring them would recreate the duplication that initiative removed.\n //\n // ⚠️ The three that DO carry a small TableConfig — receipts, approvals, tasks — are not an exception to that\n // rule, they are the documented REFUSALS of it, and moving them here is the de-duplication rather than a\n // breach of it. All four adopting apps recorded the same three refusals independently:\n // • unallocatedReceipts vs customerReceiptsTableConfig — `reference` exists on both sides and MEANS\n // DIFFERENT THINGS (the receipt NUMBER on the book row, a separate Reference field on the page), so\n // injection would render the right value under the wrong heading; and the page's `allocate` button gates\n // on unallocatedAmount, which the row does not project.\n // • pendingApprovals vs receivedApprovalsTableConfig — exactly ONE of its eight columns (`message`) exists\n // on DayBookApprovalRow.\n // • tasksDue — there is NOTHING to point at: the tasks table config is declared inside\n // tin-spa/src/lib/pages/tasks/tasks.component.ts, not on an injectable service, so no consumer can reach\n // it, and the names disagree anyway. 🔵 Library backlog: a page config that lives in a component cannot be\n // single-sourced by anything.\n // Three small configs written once here replace the same three written five times.\n get libraryDayBookLanes(): DayBookLane[] {\n return [\n { key: 'money', label: 'Money', icon: 'payments' },\n { key: 'work', label: 'Work', icon: 'checklist' },\n { key: 'stores', label: 'Stores', icon: 'inventory', visible: (b: any) => b?.outOfStock !== undefined } // gated on KEY PRESENCE, not on a flag: DayBookController writes book[rule.Key] only after BOTH IsModuleOn and HasAnyCapability pass, so an absent key covers the module being off AND the user lacking cap36\n ];\n }\n\n get libraryDayBookSections(): DayBookSection[] {\n if (this.libraryDayBookSectionsCache) return this.libraryDayBookSectionsCache;\n const accounting = this.injector.get(AccountingService);\n const inventory = this.injector.get(InventoryService);\n const invoiceExtras: Column[] = [{ name: 'dueDate', type: 'date-short', alias: 'Due' }, { name: 'total', type: 'money' }];\n return this.libraryDayBookSectionsCache = [\n // `buttons: []` is LOAD-BEARING on all three — omit it and the card inherits every row button of the\n // invoices page (create/edit/delete/pdf/submit/record-payment); these are read-and-open cards.\n // `invoiceNumber` is the win: the page declares it type:'button' onto invoiceDetailsDialogConfig, whose\n // heroField is invoiceID, which DayBookMoneyRow carries — so the card can open the invoice it lists.\n { key: 'draftInvoices', lane: 'money', listField: 'draftInvoices', tableConfig: accounting.invoicesTableConfig,\n columns: this.libraryDayBookInvoiceView, extraColumns: invoiceExtras,\n buttons: [],\n overrides: { ...this.libraryDayBookChrome, minColumns: ['invoiceNumber', 'customerName', 'total'], sectionConfig: { title: 'Drafts to issue', icon: 'edit_note', chips: [{ text: 'not yet sent', color: '#607d8b' }] } }\n },\n { key: 'overdueInvoices', lane: 'money', listField: 'overdueInvoices', tableConfig: accounting.invoicesTableConfig,\n columns: this.libraryDayBookInvoiceView, extraColumns: [...invoiceExtras, { name: 'daysOverdue', alias: 'Days Late' }], // daysOverdue LAST, after total — where every app already draws it\n buttons: [],\n overrides: { ...this.libraryDayBookChrome, minColumns: ['invoiceNumber', 'customerName', 'total'], sectionConfig: { title: 'Overdue — chase these', icon: 'warning_amber', chips: [{ text: 'past due', color: '#c62828' }] } }\n },\n { key: 'awaitingPayment', lane: 'money', listField: 'awaitingPayment', collapsed: true, tableConfig: accounting.invoicesTableConfig,\n columns: this.libraryDayBookInvoiceView, extraColumns: invoiceExtras,\n buttons: [],\n overrides: { ...this.libraryDayBookChrome, minColumns: ['invoiceNumber', 'customerName', 'total'], sectionConfig: { title: 'Awaiting payment', icon: 'schedule' } }\n },\n { key: 'unallocatedReceipts', lane: 'money', listField: 'unallocatedReceipts', tableConfig: this.libraryDayBookReceiptsConfig },\n { key: 'pendingApprovals', lane: 'work', listField: 'pendingApprovals', tableConfig: this.libraryDayBookApprovalsConfig },\n { key: 'tasksDue', lane: 'work', listField: 'tasksDue', tableConfig: this.libraryDayBookTasksConfig },\n // TWO stock cards, not one: a section binds ONE listField and the book carries outOfStock and lowStock as\n // separate keys with different orderings. `available` is 0 on every out-of-stock row by definition, so a\n // column of zeros is not drawn there; on low stock the three numbers ARE the point.\n { key: 'outOfStock', lane: 'stores', listField: 'outOfStock', tableConfig: inventory.productsTableConfig,\n columns: ['name', { column: 'sku', alias: 'SKU' }, 'categoryName'],\n extraColumns: [{ name: 'minimumLevel', alias: 'Minimum' }], // book-only — the page's own column is minimumInventoryLevel and would read blank here\n buttons: [{ button: 'view', display: 'Open the product', icon: { name: 'launch' }, tip: 'Opens this product without leaving the Day Book' }], // Changed (sweep-1, owner directive 2026-08-20): was inventory_2 + blue. A row VIEW is `launch` estate-wide (shift-spa, grip-spa, piglet's dayBookViewPig) and inventory_2 is ALSO this lane's own section glyph, so the action and the card it sat on wore the same icon for two different meanings. The blue is dropped with it — an action icon is not recoloured away from its siblings. test-spa was swept on 08-20; this is the library's own copy of the same demo config, missed then\n overrides: { ...this.libraryDayBookChrome, minColumns: ['name', 'categoryName', 'minimumLevel'], sectionConfig: { title: 'Out of Stock', icon: 'remove_shopping_cart', chips: [{ text: 'nothing left to sell', color: '#c62828' }] } }\n },\n { key: 'lowStock', lane: 'stores', listField: 'lowStock', tableConfig: inventory.productsTableConfig,\n columns: ['name', { column: 'sku', alias: 'SKU' }, 'categoryName'],\n extraColumns: [{ name: 'available', alias: 'In Stock' }, { name: 'minimumLevel', alias: 'Minimum' }, { name: 'shortfall', alias: 'Short By' }],\n buttons: [{ button: 'view', display: 'Open the product', icon: { name: 'launch' }, tip: 'Opens this product without leaving the Day Book' }], // Changed (sweep-1, owner directive 2026-08-20): was inventory_2 + blue. A row VIEW is `launch` estate-wide (shift-spa, grip-spa, piglet's dayBookViewPig) and inventory_2 is ALSO this lane's own section glyph, so the action and the card it sat on wore the same icon for two different meanings. The blue is dropped with it — an action icon is not recoloured away from its siblings. test-spa was swept on 08-20; this is the library's own copy of the same demo config, missed then\n overrides: { ...this.libraryDayBookChrome, minColumns: ['name', 'available', 'shortfall'], sectionConfig: { title: 'Low Stock', icon: 'inventory_2', chips: [{ text: 'below the minimum you chose to hold', color: '#ef6c00' }] } }\n }\n ];\n }\n private libraryDayBookSectionsCache: DayBookSection[] | null = null;\n\n // Added: the ONE library section an app wants on its own terms, without re-authoring it. Returns a SHALLOW COPY\n // merged with the app's delta, so the app wins per property on exactly the same principle as the step-action\n // merge order — a book whose lanes are named differently (test-spa's billing/collections) can re-lane a library\n // section instead of restating it. Returns undefined for an unknown key rather than an empty card.\n libraryDayBookSection(key: string, overrides?: Partial<DayBookSection>): DayBookSection | undefined {\n const found = this.libraryDayBookSections.find(s => s.key == key);\n return found ? { ...found, ...overrides } : undefined;\n }\n\n // The invoices PAGE filters; a Day Book section does not. Both identity columns are selected out of the page in\n // the page's own order (invoiceNumber then customerName), which is the order every app's card already used, so\n // nothing has to be re-declared to preserve it. An app whose Customer is a drill-in CHIP (pulse, grip, piglet)\n // overrides `columns` to take invoiceNumber alone and re-declares the chip as its first extra — extras APPEND,\n // so that is what keeps Customer in second place. Taking the page's plain text there would silently remove a\n // working drill-in, which is why it is an app override and not the library default.\n libraryDayBookInvoiceView: (string | DayBookColumnView)[] = [{ column: 'invoiceNumber', alias: 'Invoice' }, { column: 'customerName', alias: 'Customer' }];\n libraryDayBookChrome: DayBookTableView = { showFilter: false, showFilterButton: false };\n // 🔴 GETTERS, not field initializers, and the reason is mechanical: these three sit ABOVE customerDetailsConfig\n // in this file, and a class field initializer that reads a field declared later captures `undefined` — silently,\n // with no compile error and no runtime throw, producing a chip that never opens. Everything here is read lazily\n // out of libraryDayBookSections, which is itself a getter, so by the time any of this runs the whole class is built.\n get libraryDayBookReceiptsConfig(): TableConfig { return { columns: [{ name: 'reference', alias: 'Receipt' }, { name: 'partyName', type: 'chip' as const, alias: 'Customer', detailsConfig: this.customerDetailsConfig }, { name: 'date', alias: 'Received', type: 'date-short' as const }, { name: 'total', alias: 'Unallocated', type: 'money' as const }], minColumns: ['reference', 'partyName', 'total'], showFilter: false, showFilterButton: false, sectionConfig: { title: 'Receipts to allocate', icon: 'account_balance_wallet', chips: [{ text: 'unmatched cash', color: '#ef6c00' }] } }; }\n get libraryDayBookApprovalsConfig(): TableConfig { return { columns: [{ name: 'entity', alias: 'Record' }, { name: 'message', alias: 'Request' }, { name: 'currentLevel', alias: 'Level' }, { name: 'raised', alias: 'Raised', type: 'date-short' as const }, { name: 'daysWaiting', alias: 'Days Waiting' }], minColumns: ['entity', 'message', 'daysWaiting'], showFilter: false, showFilterButton: false, sectionConfig: { title: 'Approvals waiting on you', icon: 'fact_check', chips: [{ text: 'blocking someone else', color: '#ef6c00' }] } }; }\n get libraryDayBookTasksConfig(): TableConfig { return { columns: [{ name: 'title', alias: 'Task' }, { name: 'assignedTo', alias: 'Assigned To' }, { name: 'dueDate', alias: 'Due', type: 'date-short' as const }, { name: 'daysOverdue', alias: 'Days Late' }], minColumns: ['title', 'assignedTo', 'dueDate'], showFilter: false, showFilterButton: false, sectionConfig: { title: 'Tasks due', icon: 'task_alt' } }; }\n\n myRole;\n\n capHome = new CapItem;\n capAdmin = new CapItem;\n capUsers = new CapItem;\n capRoles = new CapItem;\n capLogs = new CapItem;\n capSettings = new CapItem;\n capPasswordPolicy = new CapItem; // Added (N8): the per-tenant password policy admin page\n capTenantReset = new CapItem; // Added: cap92 — the tenant-reset gate, checked by AppConfigurationControllerBase rather than by any one screen\n\n capMultitenant = new CapItem;\n capTenants = new CapItem;\n capMembership = new CapItem;\n capPlans = new CapItem;\n capFeatures = new CapItem; // Added: Feature registry capability property\n capPlanFeatures = new CapItem; // Added: Plan-Feature mapping capability property\n capSubscription = new CapItem; // Added: Subscription management capability property\n capBilling = new CapItem; // Added: Billing & invoice history capability property\n\n capGeneral = new CapItem;\n capCustomers = new CapItem;\n capCategories = new CapItem;\n capSubCategories = new CapItem;\n capBrands = new CapItem;\n capGPTCaches = new CapItem; // Added: GPT Cache capability property\n\n capSuppliers = new CapItem;\n capTasks = new CapItem;\n\n capHR = new CapItem;\n capEmployees = new CapItem;\n capDepartments = new CapItem;\n capPositions = new CapItem;\n capUnlock = new CapItem; // Added: cap87 — the ILock unlock gate, checked by the BASE controller rather than by any one screen\n capReferenceData = new CapItem; // Added: cap90 — the reference-data read gate, checked by the controllers rather than by any one screen\n capGrades = new CapItem;\n\n capPayroll = new CapItem; // Changed: Added Payroll module sidebar items\n capSalaryStructures = new CapItem;\n capStatutoryDeductions = new CapItem;\n capPayrollRuns = new CapItem;\n capCommissionConfigs = new CapItem; // Changed: Added for Commission module\n capCommissionEntries = new CapItem; // Changed: Added for Commission module\n capCommissionStatement = new CapItem; // Added (Phase 6): Driver Commission Statement (cap86)\n capSalaryAdvances = new CapItem; // Changed: Added for Salary Advance module\n capOvertimeEntries = new CapItem; // Changed: Added for Overtime module\n\n capApprovals = new CapItem;\n capApprovalsConfig = new CapItem;\n capNotifications = new CapItem;\n capSelfApproval = new CapItem;\n capAppModels = new CapItem;\n capNotificationsConfig = new CapItem;\n\n capAccountingOutstandingInvoices = new CapItem;\n capAccounting = new CapItem;\n capAccounts = new CapItem;\n capAggregates = new CapItem; // Added: Capability for aggregates view\n capReports = new CapItem; // Added: Capability for financial reports\n capBudgets = new CapItem; // Added: Capability for budgets management (cap85)\n capBudgetVsActual = new CapItem; // Added: Budget vs Actual report menu item (shares cap85 with budgets)\n capAging = new CapItem; // Added: Capability for aging report\n capTaxRates = new CapItem; // Changed: Capability for tax rates management\n capStandingOrders = new CapItem; // Changed: Capability for standing orders management\n capTenantTransfers = new CapItem; // Added (N11): Organisation Transfers — cross-organisation money, accounting menu\n capFixedAssetsModule = new CapItem; // Changed: Top-level Fixed Assets module\n capFixedAssetsDashboard = new CapItem; // Changed: Fixed Assets dashboard\n capFixedAssets = new CapItem; // Changed: Asset Register (renamed from Fixed Assets)\n capFixedAssetCategories = new CapItem; // Changed: Depreciation Categories\n capCurrencies = new CapItem; // Changed: Capability for currencies management\n capTransactionTypes = new CapItem;\n capTransactions = new CapItem;\n capAccountingInvoices = new CapItem;\n capCreditNotes = new CapItem; // Changed: Credit notes page (B6, shares cap53 with invoices)\n capVatReturn = new CapItem; // Changed: VAT return page (B2, shares cap48 with reports)\n capFiscalPeriods = new CapItem; // Changed: Fiscal periods page (C2, shares cap52 with accounts)\n capReceipts = new CapItem; // Changed: Customer receipts page (C3, shares cap53 with invoices)\n capBankReconciliation = new CapItem; // Changed: Bank reconciliation page (C4, shares cap52 with accounts)\n capRevenueSchedules = new CapItem; // Changed: Deferred revenue page (C7, shares cap53 with invoices)\n capQuotes = new CapItem; // Changed: Quotations page (C10, shares cap53 with invoices)\n capRateCard = new CapItem; // Added (quotations-under-invoicing): home/accounting/rate-card — library-owned menu row for the rate card page the library already routed; consumers override `display` instead of redeclaring it\n\n capInvoicing = new CapItem; // Added: Capability for invoicing view\n\n capLoans = new CapItem;\n capLoanProducts = new CapItem;\n capLoansMain = new CapItem;\n capLoanPayments = new CapItem;\n\n capInventory = new CapItem;\n capInventoryDashboard = new CapItem;\n capInventoryStock = new CapItem; // Changed: Added new cap item for inventory stock view\n capProducts = new CapItem;\n capServiceItems = new CapItem; // Added: Capability for service items\n capBundleProducts = new CapItem; // Added: Capability for bundle products\n capInventoryItems = new CapItem;\n capSupplierPurchaseOrders = new CapItem;\n capInventoryReceipts = new CapItem;\n capSalesOrders = new CapItem;\n capSales = new CapItem;\n capPointOfSale = new CapItem; // Added (POS phase 7): the till row — see the block beside capSalesModule for why it is first and why it has its own cap. Changed (OWNER DIRECTIVE 2026-09-01): capPointOfSaleModule removed — the till is a row under Sales again, not its own group\n capRequisitions = new CapItem;\n capInventoryAdjustments = new CapItem;\n capInventoryReturns = new CapItem;\n capInventoryTransactions = new CapItem;\n capProductionRecipes = new CapItem; // Added: Capability for production recipes\n capProductionOrders = new CapItem; // Added: Capability for production orders\n capManufacturing = new CapItem; // Changed: Manufacturing module menu group\n capSalesModule = new CapItem; // Changed: Sales module menu group\n capPurchasingModule = new CapItem; // Changed: Purchasing module menu group\n capAccountingDashboard = new CapItem; // Changed: Accounting dashboard menu item\n capSalesDashboard = new CapItem; // Changed: Sales dashboard menu item\n capPurchasingDashboard = new CapItem; // Changed: Purchasing dashboard menu item\n capSupplierAging = new CapItem; // Changed: AP Aging capability property\n capInvoiceDashboard = new CapItem; // Changed: Invoice dashboard menu item\n capPayrollDashboard = new CapItem; // Changed: Payroll dashboard menu item\n\n public tmpProfileuserName = \"\";\n\n\n isProcessing = false;\n\n\n //--------------------------Departmemts Form-------------------------\n departmentFormConfig: FormConfig = {\n security: { allow: [this.capDepartments] },\n title : 'Department',\n fields: [\n { name: 'name', type: 'text', required: true },\n ],\n loadAction: { url: 'departments/id' },\n heroField: 'departmentID',\n includeAudit: true,\n }\n\n editDepartmentButton: Button = { name: 'edit', dialog: true, action: { url: 'departments?action=edit', method: 'post', successMessage: 'Edited Successfully' } }\n\n // Added (N22): the tenant reset, offered at the foot of App Configuration. Like the unlock buttons the\n // capability is passed as the OBJECT, not `.name` — datalib assigns \"cap92\" in the constructor, AFTER this\n // initializer runs, so an eagerly-read name would be \"\" and gate nothing at all.\n // `requiredAccess: Full` mirrors AppConfigurationControllerBase.cs:155 exactly. The server is the authority and\n // it demands Full; a button gated any lower would render for people the endpoint then refuses.\n // `requirePhrase: 'RESET'` mirrors ResetPhrase (AppConfigurationControllerBase.cs:129) and is compared ordinally\n // and case-sensitively on both sides — see Confirm.requirePhrase on why nothing here may trim or case-fold.\n // The URL is `configuration/reset`, matching the page's own `configuration/get` default: the endpoint is\n // [HttpPost(\"reset\")] on the base and every app routes it as [Route(\"api/[controller]\")] ConfigurationController.\n resetTenantButton: Button = { name: 'reset', display: 'Reset Organisation', tip: 'Delete every operational record in this organisation', icon: { name: 'restart_alt', color: '#c62828' }, capability: this.capTenantReset, requiredAccess: RoleAccess.Full, confirm: { message: 'This deletes every operational record in this organisation — transactions, documents and the day-to-day data built on top of your settings. Your configuration, users and roles are kept.', confirmLabel: 'Reset Organisation', cancelLabel: 'Keep my data', destructive: true, requirePhrase: 'RESET' }, action: { url: 'configuration/reset', method: 'post' } }\n\n // Added: releases the lock on a locked Department row. `visible` reads the `locked` field the controller\n // projects (DepartmentsController:41), so the button exists only where it can do something. The capability is\n // passed as the OBJECT, not `.name` — datalib assigns \"cap87\" in the constructor, after this initializer runs,\n // so an eagerly-read name would be \"\" and gate nothing. Full mirrors the server's own bar exactly.\n unlockDepartmentButton: Button = { name: 'unlock', display: 'Unlock', tip: 'Unlock Record', icon: { name: 'lock_open' }, visible: x => x.locked, capability: this.capUnlock, requiredAccess: RoleAccess.Full, confirm: { message: 'Unlock this record? It will become editable and deletable.', confirmLabel: 'Unlock', cancelLabel: 'Keep locked' }, action: { url: 'departments?action=unlock', method: 'post' } }\n\n departmentDetailsConfig: DetailsDialogConfig = {\n formConfig: this.departmentFormConfig,\n heroField: 'departmentID',\n buttons: [this.editDepartmentButton],\n }\n\n\n //--------------------------Positions Form-------------------------\n positionFormConfig: FormConfig = {\n security: { allow: [this.capPositions] },\n title: 'Position',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'description', type: 'text', },\n { name: 'departmentID', alias: 'Department', type: 'select', loadAction: { url: 'departments/list/x' }, detailsConfig: this.departmentDetailsConfig },\n\n ],\n loadAction: { url: 'positions/id' },\n heroField: 'positionID',\n includeAudit: true,\n }\n\n editPositionButton: Button = { name: 'edit', dialog: true, action: { url: 'positions?action=edit', method: 'post', successMessage: 'Edited Successfully' } }\n\n // Added: the Position twin of unlockDepartmentButton — same gate, same shape, its own URL. `locked` is projected at PositionsController:42\n unlockPositionButton: Button = { name: 'unlock', display: 'Unlock', tip: 'Unlock Record', icon: { name: 'lock_open' }, visible: x => x.locked, capability: this.capUnlock, requiredAccess: RoleAccess.Full, confirm: { message: 'Unlock this record? It will become editable and deletable.', confirmLabel: 'Unlock', cancelLabel: 'Keep locked' }, action: { url: 'positions?action=unlock', method: 'post' } }\n\n positionDetailsConfig : DetailsDialogConfig = {\n formConfig : this.positionFormConfig,\n heroField : 'positionID',\n buttons: [this.editPositionButton],\n }\n\n\n\n //--------------------------Employees-------------------------\n\n genders = [\n { name: 'Male', value: 1 },\n { name: 'Female', value: 2 }\n ]\n\n // Changed: sectioned — 17 fields pushed the five child tabs below the fold on view. Who/where/what-status\n // stays ungrouped at the top; everything read only occasionally folds away once the employee exists.\n employeeFormConfig: FormConfig = {\n security : {allow : [this.capEmployees]},\n fields: [\n // Changed: required -> requiredCondition so an employee can be saved under a single name (a mononym), matching the API rule \"at least a first name or a last name\". Each name is demanded only while the other is blank, so neither can be left off together and the asterisk drops away as soon as one is typed\n { name: 'firstName', type: 'text', requiredCondition: x => !x?.lastName?.toString().trim() },\n { name: 'lastName', type: 'text', requiredCondition: x => !x?.firstName?.toString().trim() },\n { name: 'departmentID', alias: 'Department', type: 'select', loadAction : { url : 'departments/list/x'}, detailsConfig: this.departmentDetailsConfig },\n { name: 'positionID', alias: 'Position', type: 'select', loadAction: { url: 'positions/list/x' }, masterField: 'departmentID', detailsConfig: this.positionDetailsConfig },\n { name: 'employmentStatus', alias: 'Employment Status', type: 'select', loadAction: { url: 'employees/list/employment-status' } },\n { name: 'activeStatus', alias: 'Active Status', type: 'select', loadAction: { url: 'employees/list/active-status' } },\n\n { name: 'personal', type: 'section', alias: 'Personal Details', collapseOnView: true },\n { name: 'nationalID', type: 'text', alias: 'National ID', required: true, section: 'personal' },\n { name: 'gender', alias: 'Gender', type: 'select', options: this.genders, required: true, section: 'personal' },\n { name: 'dateOfBirth', type: 'date', max: 'today', alias: 'Date of Birth', required: true, defaultValue: '', section: 'personal' }, // Changed: defaultValue '' suppresses TinCore's type-default that pre-filled this with TODAY; a birth date can never be today, and required:true HID the bug because the auto-filled value already satisfied the required check // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'passportNumber', type: 'text', alias: 'Passport Number', section: 'personal' },\n { name: 'phone', type: 'text', section: 'personal' },\n { name: 'email', type: 'text', section: 'personal' },\n { name: 'address', type: 'text-area', rows: 2, span: true, section: 'personal' },\n\n { name: 'employment', type: 'section', alias: 'Employment & Payroll', collapseOnView: true },\n { name: 'employmentDate', type: 'date', alias: 'Employment Date', required: true, section: 'employment' },\n { name: 'salaryStructureID', alias: 'Salary Structure', type: 'select', loadAction: { url: 'salarystructures/list/x' }, nullable: true, section: 'employment' }, // Changed: Added for payroll salary structure assignment\n { name: 'userName', type: 'select', alias: 'User', loadAction: { url: 'user/list/x' }, optionDisplay: 'name', optionValue: 'value', nullable : true, infoMessage : 'Related user account', section: 'employment' },\n\n { name: 'notes', type: 'section', alias: 'Notes', collapseOnView: true },\n { name: 'note', type: 'text-area', rows: 2, span: true, section: 'notes' },\n ],\n loadAction: { url: 'employees/id' },\n heroField: 'employeeID',\n includeAudit : true,\n }\n\n // Changed: Added edit button for employee details dialog\n editEmployeeButton: Button = { name: 'edit', dialog: true, inDialog: true, action: { url: 'employees?action=edit', method: 'post' } };\n\n // Changed (WS-1 Phase 3, the CACHE half): the sweep-2 note below is now ACTED ON. Employee still does not implement ISync, which is exactly why this is `readOnly` and not a queue — nothing here can be captured offline, so nothing should pretend to queue. `readOnly: true` resolves to queue { create:false, edit:false, delete:false } (offline.service.ts resolveConfig) while leaving the read cache and the lookup registration on, which is the whole point: registering this config puts employeeFormConfig's six selects (departments/list/x, positions/list/x, employees/list/employment-status, employees/list/active-status, salarystructures/list/x, user/list/x) into the read seam, so the employee dialog COMPOSES with no network instead of opening six empty dropdowns. Pagination was already here.\n employeesTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name', 'departmentName', 'positionName'],\n flatButtons: true,\n logResponse : false, // TS-21: disabled shipped default response logging\n columns: [\n { name: 'name', type: 'text' },\n { name: 'genderName', type: 'text', alias: 'Gender' },\n { name: 'departmentName', type: 'text', alias: 'Department' },\n { name: 'positionName', type: 'text', alias: 'Position' },\n { name: 'salaryStructureName', type: 'text', alias: 'Salary Structure' }, // Changed: Added for payroll display\n { name: 'employmentStatusName', type: 'text', alias: 'Employment Status' },\n { name: 'activeStatusName', type: 'text', alias: 'Active Status' },\n { name: 'isLinked', type: 'checkbox', alias: 'Linked' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'employees?action=create', method: 'post' } },\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.employeeFormConfig,\n heroField: 'employeeID',\n buttons: [this.editEmployeeButton],\n tableConfigs: [\n // Changed: Employee salary components child table\n {\n tabTitle: 'Salary Components',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'componentName', type: 'text', alias: 'Component' },\n { name: 'componentType', type: 'text', alias: 'Type' },\n { name: 'calculationMethod', type: 'text', alias: 'Calculation' },\n { name: 'value', type: 'money', alias: 'Value' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'employeesalarycomponents?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'employeesalarycomponents?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'employeesalarycomponents?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'employeesalarycomponents/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: {\n title: 'Salary Component',\n security: { allow: [this.capSalaryStructures] }, // Added: payroll child (cap73) inside an employee dialog gated on cap18 — see the Commission Config note above. Matches EmployeeSalaryComponentsController.cs:19 CapabilityName \"cap73\"; the whole salary-structures domain gates cap73 (SalaryComponents/EmployeeSalaryComponents/SalaryStructures controllers all agree)\n fixedTitle: true,\n fields: [\n { name: 'salaryComponentID', alias: 'Component', type: 'select', loadAction: { url: 'salarycomponents/list/x' }, required: true },\n { name: 'value', type: 'money', alias: 'Value', required: true },\n ],\n loadAction: { url: 'employeesalarycomponents/id' },\n heroField: 'employeeSalaryComponentID',\n },\n },\n // Changed: Employee payslip history child table\n {\n tabTitle: 'Payslip History',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'grossPay', type: 'money', alias: 'Gross Pay' },\n { name: 'totalDeductions', type: 'money', alias: 'Deductions' },\n { name: 'netPay', type: 'money', alias: 'Net Pay' },\n { name: 'statusName', type: 'text', alias: 'Status' },\n ],\n buttons: [\n { name: 'view', dialog: true },\n ],\n loadAction: { url: 'payslips/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n },\n // Changed: Employee commission configs child table\n {\n tabTitle: 'Commission Configs',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text' },\n { name: 'metricTypeName', type: 'text', alias: 'Metric Type' },\n { name: 'rateTypeName', type: 'text', alias: 'Rate Type' },\n { name: 'rate', type: 'text', alias: 'Rate' },\n { name: 'isActive', type: 'checkbox', alias: 'Active' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'commissionconfigs?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'commissionconfigs?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'commissionconfigs?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'commissionconfigs/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: {\n title: 'Commission Config',\n security: { allow: [this.capCommissionConfigs] }, // Added: this child table reads PAYROLL data (cap76) while its enclosing employee dialog is gated on capEmployees (cap18) — an HR user without payroll caps was shown a silent empty grid. Matches CommissionConfigsController.cs:21 CapabilityName \"cap76\"\n fixedTitle: true,\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'metricType', alias: 'Metric Type', type: 'select', loadAction: { url: 'commissionconfigs/list/metric-type' }, required: true },\n { name: 'rateType', alias: 'Rate Type', type: 'select', loadAction: { url: 'commissionconfigs/list/rate-type' }, required: true },\n { name: 'rate', type: 'number', required: true },\n { name: 'isActive', alias: 'Active', type: 'checkbox' },\n ],\n loadAction: { url: 'commissionconfigs/id' },\n heroField: 'commissionConfigID',\n },\n },\n // Changed: Employee salary advances child table\n {\n tabTitle: 'Salary Advances',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'amount', type: 'money', alias: 'Amount' },\n { name: 'advanceDate', type: 'date', alias: 'Date' },\n { name: 'reason', type: 'text' },\n { name: 'statusDisplay', type: 'text', alias: 'Status' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'salaryadvances?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'salaryadvances?action=edit', method: 'post' }, visible: (row: any) => !row?.isDeducted },\n { name: 'delete', dialog: true, action: { url: 'salaryadvances?action=delete', method: 'post' }, visible: (row: any) => !row?.isDeducted },\n ],\n loadAction: { url: 'salaryadvances/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: {\n title: 'Salary Advance',\n security: { allow: [this.capSalaryAdvances] }, // Added: payroll child (cap78) inside an employee dialog gated on cap18 — see the Commission Config note above. Matches SalaryAdvancesController.cs:20 CapabilityName \"cap78\"\n fixedTitle: true,\n fields: [\n { name: 'amount', type: 'money', required: true },\n { name: 'advanceDate', alias: 'Advance Date', type: 'date', max: 'today', required: true }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'reason', type: 'text' },\n ],\n loadAction: { url: 'salaryadvances/id' },\n heroField: 'salaryAdvanceID',\n },\n },\n // Changed: Employee overtime history child table\n {\n tabTitle: 'Overtime History',\n showFilter: false,\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'overtimeDate', type: 'date', alias: 'Date' },\n { name: 'hours', type: 'text', alias: 'Hours' },\n { name: 'overtimeTypeName', type: 'text', alias: 'Type' },\n { name: 'hourlyRate', type: 'money', alias: 'Hourly Rate' },\n { name: 'amount', type: 'money', alias: 'Amount' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'overtimeentries?action=create', method: 'post' } },\n { name: 'edit', dialog: true, action: { url: 'overtimeentries?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'overtimeentries?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'overtimeentries/x/x' }, loadCriteria: 'employee', loadIDField: 'employeeID',\n formConfig: {\n title: 'Overtime Entry',\n security: { allow: [this.capOvertimeEntries] }, // Added: payroll child (cap79) inside an employee dialog gated on cap18 — see the Commission Config note above. Matches OvertimeEntriesController.cs:20 CapabilityName \"cap79\"\n fixedTitle: true,\n fields: [\n { name: 'overtimeDate', alias: 'Date', type: 'date', max: 'today', required: true }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'hours', type: 'number', required: true },\n { name: 'overtimeType', alias: 'Overtime Type', type: 'select', loadAction: { url: 'overtimeentries/list/overtime-type' }, required: true },\n { name: 'hourlyRate', alias: 'Hourly Rate', type: 'money', required: true },\n { name: 'amount', type: 'money', alias: 'Amount', readonly: true, serverOwned: true }, // Changed (CFW-1): OvertimeEntry.Amount carries [ServerOwned] — the employee-details copy of the overtime form, same entity, same flag\n ],\n loadAction: { url: 'overtimeentries/id' },\n heroField: 'overtimeEntryID',\n },\n },\n ],\n }\n },\n { name: 'edit', dialog: true, action: { url: 'employees?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'employees?action=delete', method: 'post' } },\n ],\n loadAction: { url: 'employees/all/x' },\n formConfig: this.employeeFormConfig,\n realTime: true,\n pagination: { pageSize: 25 }, // Added: server-side pagination — long reference list — scanned and searched rather than read end to end\n offline: { enabled: true, readOnly: true }, // Added (WS-1 Phase 3): read cache only — Employee is not ISync so nothing can queue; the value is that the grid reads and the dialog's six selects survive with no network\n entityName: 'Employee', // Changed: Match backend entity name for SignalR broadcasts\n }\n\n\n //--------------------------Positions-------------------------\n positionsTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text' },\n { name: 'description', type: 'text' },\n { name: 'departmentName', type: 'chip', detailsConfig: this.departmentDetailsConfig, alias: 'Department' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'positions?action=create', method: 'post' } },\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.positionFormConfig ,\n heroField: 'positionID',\n buttons: [this.editPositionButton],\n tableConfigs: [\n {\n ...this.employeesTableConfig,\n loadAction: { url: 'employees/x/x' }, loadCriteria: 'position', loadIDField: 'positionID',\n columns: this.employeesTableConfig.columns.filter(x => ['departmentName', 'positionName'].includes(x.name) == false),\n tabTitle: 'Employees',\n elevation: 'none',\n }\n ],\n }\n },\n this.editPositionButton,\n { name: 'delete', dialog: true, action: { url: 'positions?action=delete', method: 'post' } },\n this.unlockPositionButton, // Added: last, beside delete — hidden on every unlocked row, so the action column is unchanged for normal data\n ],\n loadAction: { url: 'positions/all/x' },\n formConfig: this.positionFormConfig,\n realTime: true,\n entityName: 'Position' // Changed: Match backend entity name for SignalR broadcasts\n }\n\n\n //--------------------------Departments-------------------------\n\n departmentTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name'],\n flatButtons: true,\n columns: [\n // { name: 'departmentID', type: 'number', alias: 'ID' },\n { name: 'name', type: 'text' },\n ],\n buttons: [\n { name: 'create', display: 'Create', dialog: true, action: { url: 'departments?action=create', method: 'post' } },\n {\n name: 'view',\n dialog: true,\n detailsConfig: {\n formConfig: this.departmentFormConfig,\n heroField: 'departmentID',\n buttons: [this.editDepartmentButton],\n tableConfigs: [\n {\n ...this.employeesTableConfig,\n loadAction: { url: 'employees/x/x' }, loadCriteria: 'department', loadIDField: 'departmentID',\n columns: this.employeesTableConfig.columns.filter(x => ['departmentName', 'positionName'].includes(x.name) == false),\n tabTitle: 'Employees',\n elevation: 'none',\n },\n {\n ...this.positionsTableConfig,\n loadAction: { url: 'positions/x/x' }, loadCriteria: 'department', loadIDField: 'departmentID',\n tabTitle: 'Positions',\n elevation: 'none',\n\n }\n ],\n }\n },\n this.editDepartmentButton,\n { name: 'delete', dialog: true, action: { url: 'departments?action=delete', method: 'post' } },\n this.unlockDepartmentButton, // Added: last, beside delete — hidden on every unlocked row, so the action column is unchanged for normal data\n ],\n loadAction: { url: 'departments/all/x' },\n formConfig: this.departmentFormConfig,\n realTime: true,\n entityName: 'Department' // Changed: Match backend entity name for SignalR broadcasts\n }\n\n\n //--------------------------Contact Persons-------------------------\n contactPersonFormConfig: FormConfig = {\n title: 'Contact Person',\n includeAudit: true,\n fields: [\n { name: 'name', type: 'text', span : true },\n { name: 'mobile', type: 'text' },\n { name: 'email', type: 'text' },\n { name: 'contactMethods', type: 'composite', span: true, subfields :[\n { name: 'canCall', type: 'checkbox', alias: 'Call' },\n { name: 'canSMS', type: 'checkbox', alias: 'SMS' },\n { name: 'canWhatsApp', type: 'checkbox', alias: 'WhatsApp' }\n ] },\n\n ],\n reset: true\n };\n\n contactPersonTableConfig: TableConfig = {\n tabTitle: 'Contacts',\n showFilter: true,\n minColumns: ['name', 'contactMethods'],\n elevation: 'none',\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text', },\n { name: 'mobile', type: 'text' },\n { name: 'email', type: 'text' },\n {\n name: 'contactMethods',\n type: 'icon',\n icons: [\n { name: 'call', color: 'green', condition: x => x.canCall, tip: 'Available for Calls' },\n { name: 'sms', color: 'green', condition: x => x.canSMS, tip: 'Available for SMS' },\n { name: 'forum', color: 'green', condition: x => x.canWhatsApp, tip: 'Available on WhatsApp' }\n ]\n }\n ],\n buttons: [\n { name: 'create', display: 'Add', dialog: true, action: { url: 'contactpersons?action=create', method: 'post' }, confirm: { message: 'Add contact person?' } },\n { name: 'edit', dialog: true, action: { url: 'contactpersons?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'contactpersons?action=delete', method: 'post' } }\n ],\n formConfig: this.contactPersonFormConfig,\n offline: { enabled: true, queue: { create: true, edit: true, delete: true } }, // Added: contacts queue offline — created before their parent exists, so this exercises the ClientRefs FK-resolution path\n realTime: true, // Added: refresh when another user changes a contact\n entityName: 'ContactPerson' // Added: matches backend typeof(ContactPerson).Name for SignalR broadcasts\n };\n\n\n //--------------------------Customers-------------------------\n customerFormConfig: FormConfig = {\n security: { allow: [this.capCustomers] },\n includeAudit: true,\n title : 'Customer',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'phone', type: 'text' },\n { name: 'contactPerson', type: 'text' },\n { name: 'email', type: 'text' },\n { name: 'address', type: 'text-area', rows: 2, span: true },\n { name: 'customerTenantID', alias: 'Customer Tenant', type: 'text-single', loadAction: { url: 'tenants/list/x' }, strict : true , nullable: true }, // Changed: no longer required — CustomerTenantID is nullable on the model (IsLinked is the optional B2B link), and a required server-loaded lookup made offline create impossible\n\n // Added: statutory and trading terms — the details that are agreed once with the customer and\n // then govern how every document to them must be raised. Grouped away from contact details\n // because nobody edits these day to day, but getting them wrong invalidates an invoice.\n { name: 'tradingTerms', type: 'section', alias: 'Statutory & Trading Terms', collapseOnView: true }, // Changed: agreed once, so it folds away on an existing customer and leaves the contacts tab in view\n { name: 'vatNumber', type: 'text', alias: 'VAT Number', hint: 'ZIMRA VAT registration — required on a tax invoice' }, // Added: Phase 2 compliance — customer VAT registration number\n { name: 'tin', type: 'text', alias: 'TIN', hint: 'Taxpayer Identification Number' }, // Added: Phase 2 compliance — taxpayer identification number\n { name: 'requirePONumber', type: 'checkbox', alias: 'Requires a PO number', hint: 'This customer rejects an invoice that does not quote their own order number' }, // Added: moved off the tenant-wide AppConfiguration — PO discipline is a term of the trading relationship\n ],\n loadAction: { url: 'customers/id' },\n heroField: 'customerID',\n\n reset: true,\n }\n\n customerCreateButton : Button = { name: 'create', display: 'Create', dialog: true, action: { url: 'customers?action=create', method: 'post' } }\n customerEditButton: Button = { name: 'edit', dialog: true, action: { url: 'customers?action=edit', method: 'post' } }\n\n customerDetailsConfig: DetailsDialogConfig = {\n formConfig : this.customerFormConfig,\n heroField : 'customerID',\n tableConfigs: [\n {\n ...this.contactPersonTableConfig,\n loadAction: { url: 'contactpersons/customer/x' },\n loadCriteria: 'customer',\n loadIDField: 'customerID',\n createConfig: { navigationProperty: 'contactPersons' } // Added: one-step create — contacts added during customer creation are held locally and POSTed with the customer in a single payload\n }\n ],\n buttons: [\n this.customerCreateButton,\n this.customerEditButton\n ]\n };\n\n // Added: one-step create button — carries detailsConfig so the Contacts tab renders inside the CREATE dialog\n // (local/in-memory rows). Declared after customerDetailsConfig to avoid a forward reference.\n customerCreateWithContactsButton: Button = { name: 'create', display: 'Create', dialog: true, detailsConfig: this.customerDetailsConfig, action: { url: 'customers?action=create', method: 'post' } }\n\n customersTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name'],\n flatButtons: true,\n logResponse: false, // TS-21: disabled shipped default response logging\n maxButtonsCount: 3,\n collapseButtons : true,\n\n columns: [\n\n { name: 'name', type: 'text' },\n { name: 'phone', type: 'text' },\n { name: 'contactPerson', type: 'text' },\n { name: 'isLinked', type: 'checkbox', alias: 'Linked' },\n\n ],\n\n buttons: [\n this.customerCreateWithContactsButton, // Changed: one-step create — Contacts tab lives in the create dialog\n { name: 'view', dialog: true, detailsConfig: this.customerDetailsConfig },\n { name: 'edit', dialog: true, detailsConfig: this.customerDetailsConfig },\n { name: 'delete', dialog: true, action: { url: 'customers?action=delete', method: 'post' } },\n ],\n\n loadAction: { url: 'customers/all/x' },\n formConfig: this.customerFormConfig,\n realTime: true,\n offline: { enabled: true, queue: { create: true, edit: true, delete: true } }, // Added: reads served from cache offline, writes queued and drained on reconnect; RowVersion catches conflicting edits\n pagination: { pageSize: 25 }, // Added: server-side pagination — long reference list — scanned and searched rather than read end to end\n entityName: 'Customer', // Changed: Match backend typeof(Customer).Name for SignalR broadcasts\n }\n\n\n //--------------------------Customer Purchase Orders-------------------------\n // Orders the CUSTOMER issues to us, against which we bill. Distinct from the supplier purchase\n // order (Purchasing), which is one WE issue when buying — hence the fully-qualified names on both\n // sides, so \"purchase order\" is never ambiguous in code or on screen.\n // Entirely optional: a cash-based customer is invoiced with no order at all. Recording one simply\n // makes \"how much of this order is still unbilled\" answerable, and lets over-billing be spotted.\n customerPurchaseOrderFormConfig: FormConfig = {\n security: { allow: [this.capCustomers] },\n includeAudit: true,\n title: 'Customer Purchase Order',\n fields: [\n { name: 'customerID', alias: 'Customer', type: 'text-single', loadAction: { url: 'customers/list/x' }, required: true, strict: true, detailsConfig: this.customerDetailsConfig }, // Changed: dropdown quick-add\n { name: 'poNumber', type: 'text', alias: 'Order Number', required: true, hint: 'Exactly as the customer wrote it — this is the field they reconcile on' },\n { name: 'poDate', type: 'date', max: 'today', alias: 'Order Date', required: true }, // Added (NFD-1): max: 'today' — this date records something that has ALREADY happened, so the future is not a valid answer; DateBounds resolves the token at render time, never at build time. Back-dating stays allowed.\n { name: 'amount', type: 'number', alias: 'Order Value (excl tax)', hint: 'Leave 0 if the order arrived without a total — billing is never blocked, it just cannot be checked against a value' },\n { name: 'status', type: 'select', options: [{ id: 0, name: 'Open' }, { id: 1, name: 'Closed' }, { id: 2, name: 'Cancelled' }] },\n\n // Changed: sectioned — who/what/how much stays up top; the customer's own paperwork references are\n // captured once and read only when a query comes back on the order\n { name: 'orderReferences', type: 'section', alias: 'References & Validity', collapseOnView: true },\n { name: 'expiryDate', type: 'date', alias: 'Expires', nullable: true, defaultValue: '', section: 'orderReferences' }, // Changed: defaultValue '' stops TinCore pre-filling TODAY — a customer order that expires the day it is captured is wrong by construction, and nullable:true already says the intended default is EMPTY\n { name: 'reference', type: 'text', alias: 'Their Reference', hint: 'Requisition, contract or job-card number. Two orders can share one — it is not unique', section: 'orderReferences' },\n { name: 'notes', type: 'text-area', rows: 2, span: true, section: 'orderReferences' },\n ],\n loadAction: { url: 'customerpurchaseorders/id' },\n heroField: 'customerPurchaseOrderID',\n reset: true,\n }\n\n customerPurchaseOrdersTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['poNumber', 'customerName', 'amountRemaining'],\n flatButtons: true,\n maxButtonsCount: 3,\n collapseButtons: true,\n\n columns: [\n { name: 'poNumber', type: 'text', alias: 'Order' },\n { name: 'customerName', type: 'text', alias: 'Customer' },\n { name: 'poDate', type: 'date', alias: 'Dated' },\n { name: 'amount', type: 'number', alias: 'Value' },\n { name: 'amountBilled', type: 'number', alias: 'Billed' },\n \n { name: 'lineCount', type: 'number', alias: 'Lines' },\n {\n name: 'amountRemaining', type: 'chip', alias: 'Left to bill',\n colors: [\n { name: '#EF9A9A', condition: x => x.isOverBilled }, // billed past what the customer authorised\n { name: '#A5D6A7', condition: x => !x.isOverBilled && x.amountRemaining > 0 },\n { name: '#E0E0E0', condition: x => !x.isOverBilled && x.amountRemaining <= 0 } // fully consumed, nothing left to bill\n ]\n },\n { name: 'status', type: 'text' },\n ],\n\n buttons: [\n { name: 'create', display: 'Record Order', dialog: true, action: { url: 'customerpurchaseorders?action=create', method: 'post' } },\n { name: 'view', dialog: true },\n { name: 'edit', dialog: true, action: { url: 'customerpurchaseorders?action=edit', method: 'post' } },\n { name: 'delete', dialog: true, action: { url: 'customerpurchaseorders?action=delete', method: 'post' } },\n ],\n\n loadAction: { url: 'customerpurchaseorders/all/x' },\n formConfig: this.customerPurchaseOrderFormConfig,\n pagination: { pageSize: 20 }, // Added: server-side pagination — customer POs append with every order received\n entityName: 'CustomerPurchaseOrder',\n }\n\n //--------------------------Suppliers-------------------------\n supplierFormConfig: FormConfig = {\n security: { allow: [this.capSuppliers] },\n includeAudit: true,\n title: 'Supplier',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'phone', type: 'text' },\n { name: 'contactPerson', type: 'text' },\n { name: 'email', type: 'text' },\n { name: 'address', type: 'text-area', rows: 2, span: true },\n\n // Changed: sectioned to mirror the customer form — the statutory registrations are captured once and\n // then only matter at payment time, so they fold away and leave the contacts tab in view\n { name: 'tradingTerms', type: 'section', alias: 'Statutory & Tax Clearance', collapseOnView: true },\n { name: 'vatNumber', type: 'text', alias: 'VAT Number', section: 'tradingTerms' }, // Added: Phase 2 compliance — supplier VAT registration number\n { name: 'tin', type: 'text', alias: 'TIN', section: 'tradingTerms' }, // Added: Phase 2 compliance — taxpayer identification number\n { name: 'taxClearanceNumber', type: 'text', alias: 'Tax Clearance # (ITF263)', infoMessage: 'Payments withhold 30% when clearance is missing or expired', section: 'tradingTerms' }, // Added: Phase 2 compliance — ITF263 clearance\n { name: 'taxClearanceExpiry', type: 'date', alias: 'Tax Clearance Expiry', defaultValue: '', infoMessage: 'Payments withhold 30% when clearance is missing or expired', section: 'tradingTerms' }, // Changed: defaultValue '' stops TinCore pre-filling TODAY — an expiry read off someone else's ITF263 certificate can never default to today, and a silent today silently marks the supplier as expiring now, which withholds 30% of their payment\n ],\n\n loadAction: { url: 'suppliers/id' },\n heroField: 'supplierID',\n }\n\n supplierCreateButton : Button = { name: 'create', display: 'Create', dialog: true, action: { url: 'suppliers?action=create', method: 'post' } }\n supplierEditButton : Button = { name: 'edit', dialog: true, action: { url: 'suppliers?action=edit', method: 'post' } }\n\n supplierDetailsConfig: DetailsDialogConfig = {\n formConfig : this.supplierFormConfig,\n heroField : 'supplierID',\n tableConfigs: [\n {\n ...this.contactPersonTableConfig,\n loadAction: { url: 'contactpersons/supplier/x' },\n loadCriteria: 'supplier',\n loadIDField: 'supplierID',\n createConfig: { navigationProperty: 'contactPersons' } // Added: one-step create — contacts POST with the supplier in a single payload\n }\n ],\n buttons : [\n this.supplierCreateButton,\n this.supplierEditButton,\n ]\n };\n\n // Added: one-step create button — carries detailsConfig so the Contacts tab renders inside the CREATE dialog\n supplierCreateWithContactsButton: Button = { name: 'create', display: 'Create', dialog: true, detailsConfig: this.supplierDetailsConfig, action: { url: 'suppliers?action=create', method: 'post' } }\n\n suppliersTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['name'],\n flatButtons: true,\n columns: [\n { name: 'name', type: 'text' },\n { name: 'phone', type: 'text' },\n { name: 'contactPerson', type: 'text' },\n ],\n\n buttons: [\n this.supplierCreateWithContactsButton, // Changed: one-step create — Contacts tab lives in the create dialog\n { name: 'view', dialog: true, detailsConfig: this.supplierDetailsConfig },\n { name: 'edit', dialog: true, detailsConfig: this.supplierDetailsConfig },\n { name: 'delete', dialog: true, action: { url: 'suppliers?action=delete', method: 'post' } },\n\n ],\n\n loadAction: { url: 'suppliers/all/x' },\n formConfig: this.supplierFormConfig,\n allowUserKeepOpen: true, // Added: for testing — propagates to Create dialog (which has no detailsConfig of its own)\n keepOpenBehavior: 'reset', // Added: for testing — reset form after create so user can capture next supplier\n realTime: true, // Changed: Enabled for SignalR testing\n offline: { enabled: true, queue: { create: true, edit: true, delete: true } }, // Added: reads served from cache offline, writes queued and drained on reconnect; RowVersion catches conflicting edits\n pagination: { pageSize: 25 }, // Added: server-side pagination — long reference list — scanned and searched rather than read end to end\n entityName: 'Supplier', // Changed: Match backend entity name for SignalR broadcasts\n }\n\n\n //--------------------------GPT Caches-------------------------\n gptCachesFormConfig: FormConfig = {\n security: { allow: [this.capGPTCaches] },\n title: 'GPT Cache',\n fields: [\n { name: 'methodName', type: 'text', required: true, alias: 'Method Name', span: true },\n { name: 'requestText', type: 'text-area', required: true, alias: 'Request Text', span: true, rows: 4 },\n { name: 'responseJson', type: 'text-area', required: true, alias: 'Response JSON', span: true, rows: 4 },\n\n // Changed: sectioned — the cached request/response is what anyone opens this for; the identifiers and\n // usage counters are diagnostics, so they fold away\n { name: 'cacheDiagnostics', type: 'section', alias: 'Identifiers & Usage', collapseOnView: true },\n { name: 'gptCacheID', type: 'number', readonly: true, alias: 'ID', section: 'cacheDiagnostics' },\n { name: 'requestHash', type: 'text', readonly: true, alias: 'Request Hash', span: true, section: 'cacheDiagnostics' },\n { name: 'matchCount', type: 'number', alias: 'Match Count', section: 'cacheDiagnostics' },\n { name: 'hitCount', type: 'number', alias: 'Hit Count', section: 'cacheDiagnostics' },\n { name: 'createdDate', type: 'datetime', readonly: true, alias: 'Created', section: 'cacheDiagnostics' },\n { name: 'updatedDate', type: 'datetime', readonly: true, alias: 'Updated', section: 'cacheDiagnostics' }\n ],\n loadAction: { url: 'gptcaches/id' },\n heroField: 'gptCacheID',\n }\n\n\n gptCachesTableConfig: TableConfig = {\n showFilter: true,\n flatButtons: true,\n minColumns: ['methodName', 'requestText', 'hitCount'],\n columns: [\n { name: 'methodName', alias: 'Method' },\n { name: 'requestText', alias: 'Request', maxLength: 100 },\n { name: 'responseJson', alias: 'Response', maxLength: 100 },\n { name: 'requestHash', alias: 'Hash', maxLength: 20 },\n { name: 'matchCount', type: 'number', alias: 'Matches', icon: { name: 'verified', color: 'green', condition: (x: any) => x.matchCount > 3 } },\n { name: 'hitCount', type: 'number', alias: 'Hits', icon: { name: 'trending_up', color: 'blue', condition: (x: any) => x.hitCount > 10 } },\n { name: 'createdDate', type: 'datetime', alias: 'Created' },\n { name: 'updatedDate', type: 'datetime', alias: 'Updated' }\n ],\n buttons: [\n { name: 'view', dialog: true, tip: 'View Cache Details' },\n { name: 'edit', dialog: true, action: { url: 'gptcaches?action=edit', method: 'post' }, tip: 'Edit Cache' },\n { name: 'delete', confirm: { message: 'Are you sure you want to delete this cache entry?' }, action: { url: 'gptcaches?action=delete', method: 'post' }, tip: 'Delete Cache' }\n ],\n loadAction: { url: 'gptcaches/all/x' },\n formConfig: this.gptCachesFormConfig\n }\n\n\n //--------------------------Notifications-------------------------\n\n notificationOptions = [\n { name: 'UI Only', value: 1 },\n { name: 'UI + Email', value: 3 },\n // { name: 'UI + Email + SMS', value: 7 },\n { name: 'UI + WhatsApp', value: 9 },\n { name: 'UI + Telegram', value: 17 },\n { name: 'UI + Telegram + WhatsApp', value: 25 },\n { name: 'UI + Push', value: 33 }, // Changed: Added Push=32 channel combination\n { name: 'UI + Email + Push', value: 35 }, // Changed: Added Email+Push combination\n { name: 'All Channels', value: 63 } // Changed: Updated from 31 to 63 to include Push=32\n ]\n\n\n\n //--------------------------Approvals-------------------------\n\n\n approvalHistoryFormConfig : FormConfig = {\n security: { allow: [this.capApprovals] }, // Added: gate approval history form by approvals cap\n title: 'Approval History',\n fields: [\n { name: 'levelName', type: 'text', readonly: true, alias: 'Level' },\n { name: 'statusName', type: 'text', readonly: true, alias: 'Status' },\n { name: 'comments', type: 'text-area', readonly: true, span: true, rows: 3, copyContent: true },\n ],\n includeAudit: true\n }\n\n //Approval History\n approvalHistoryTableConfig: TableConfig = {\n tabTitle: 'Trail',\n elevation: 'none',\n minColumns: ['createdDate', 'levelName', 'statusName'],\n flatButtons: true,\n showFilter : true,\n columns: [\n { name: 'createdDate', type: 'datetime', alias : 'Date' },\n { name: 'levelName', type: 'text', alias: 'Level' },\n {\n name: 'statusName', type: 'text', alias: 'Status',\n colors: [\n { name: '#90A4AE', condition: x => x.status === 0 },\n { name: '#66BB6A', condition: x => x.status === 1 },\n { name: '#F44336', condition: x => x.status === 2 }\n ]\n },\n { name: 'comments', type: 'text', },\n { name: 'createdByName', type: 'monogram', alias: 'By' }, // Changed: monogram — the row still carries the full name, so filter/sort are untouched\n\n ],\n buttons: [\n { name: 'view', dialog: true }\n ],\n\n formConfig : this.approvalHistoryFormConfig,\n\n loadAction: { url: 'approvalhistory/approval/x' },\n loadCriteria: 'approval',\n loadIDField: 'approvalID'\n };\n\n\n\n //approvals form\n approvalFormConfig: FormConfig = {\n security: { allow: [this.capApprovals] }, // Added: gate approval form by approvals cap\n title: 'Approval',\n fields: [\n { name: 'blank', type: 'blank', span: true },\n { name: 'statusName', type: 'text', alias: 'Status', span: true, readonly: true }, // Changed (label-ngspace-1, owner 2026-08-22): type label -> read-only text; readonly:true ADDED — spa-label was never editable, and this form is not a create form, so testReadOnly returns true here and the field stays locked.\n { name: 'message', type: 'text-area', required: true, span: true, rows: 3 },\n\n ],\n loadAction: { url: 'approvals/id' },\n heroField: 'approvalID'\n };\n\n\n\n\n // approval action dialog\n approvalActionFormConfig: FormConfig = {\n security: { allow: [this.capApprovals] }, // Added: gate approval action form by approvals cap\n title: 'Approval Action',\n fixedTitle: true,\n fields: [\n {\n name: 'comments', type: 'text-area', required: false, span: true, rows: 3,\n infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.'\n }\n ]\n };\n\n approveActionDetailsConfig: DetailsDialogConfig = {\n formConfig: {\n ...this.approvalActionFormConfig,\n fields: [\n {\n name: 'comments', type: 'text-area', required: false, span: true, rows: 3,\n infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.'\n }\n ],\n },\n mode: 'edit',\n buttons: [\n { name: 'edit', display: 'Approve', color: 'green', action: { url: 'approve', method: 'post' } } //url preconfigured to be dynamic\n ]\n };\n\n declineActionDetailsConfig: DetailsDialogConfig = {\n formConfig: {...this.approvalActionFormConfig,\n fields: [\n {\n name: 'comments', type: 'text-area', required: true, span: true, rows: 3,\n infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.',\n hint : 'Decline comment is required !'\n }\n ],\n },\n mode: 'edit',\n buttons: [\n { name: 'edit', display: 'Decline', color: 'red', action: { url: 'decline', method: 'post' } } //url preconfigured to be dynamic\n ]\n }\n\n\n\n approveButton: Button = {\n name: 'approve', tip: 'Approve Request', dialog: true, inDialog: true, icon: { name: 'done' }, color: 'green', detailsConfig: this.approveActionDetailsConfig, ignorePendingApproval: true,\n visible: x => x && x.canAction && (!x.isMyApprovalRequest || this.myRole[this.capSelfApproval.name]),\n }\n\n declineButton: Button = {\n name: 'decline', tip: 'Decline Request', dialog: true, inDialog: true, icon: { name: 'close' }, color: 'red', detailsConfig: this.declineActionDetailsConfig, ignorePendingApproval: true,\n visible: x => x && x.canAction && (!x.isMyApprovalRequest || this.myRole[this.capSelfApproval.name]),\n }\n\n cancelButton: Button = {\n name: 'cancel', tip: 'Cancel Approval', inDialog: true, icon: { name: 'cancel' }, color: 'red', action: { url: 'cancel', method: 'post', }, ignorePendingApproval: true, //url preconfigured to be dynamic\n confirm: { message: 'Cancel approval request? This will revert changes and stop the approval process.' },\n visible: x => x && x.canCancel\n }\n\n approvalDetailsConfig: DetailsDialogConfig = {\n formConfig: this.approvalFormConfig,\n heroField: 'approvalID',\n tableConfigs: [this.approvalHistoryTableConfig],\n\n stepConfig: {\n steps: [],\n loadAction: { url: `approvals/steps/{id}` },\n loadIDField: 'approvalID',\n valueField: 'currentLevel'\n },\n\n buttons : [\n this.approveButton,\n this.declineButton,\n this.cancelButton\n ]\n\n };\n\n\n viewApprovalButton: Button = {\n name: 'info', tip: 'Approval Information', dialog: true, icon: { name: 'info', }, detailsConfig: this.approvalDetailsConfig, ignorePendingApproval: true,\n visible: x => x.canAction || x.canCancel\n }\n\n\n //received approvals\n receivedApprovalsTableConfig: TableConfig = {\n showFilter: true,\n minColumns: ['message', 'statusName'],\n minButtons: ['view', 'approve', 'decline'],\n flatButtons: true,\n greyOut: (x) => x.isGreyedOut,\n // logResponse: true,\n collapseButtons: true,\n columns: [\n { name: 'createdDate', type: 'datetime', alias: 'Date' },\n { name: 'createdByName', alias: 'Request By', type: 'monogram' }, // Changed: monogram\n { name: 'message', type: 'text' },\n {\n name: 'typeName', alias: 'Type', type: 'chip',\n colors: [\n { name: '#66BB6A', condition: x => x.type === 0 },\n { name: 'orange', condition: x => x.type === 1 },\n { name: '#F44336', condition: x => x.type === 2 }\n ]\n },\n {\n name: 'statusName', alias: 'Status', type: 'chip', detailsConfig: this.approvalDetailsConfig,\n colors: [\n { name: '#90A4AE', condition: x => x.status === 0 },\n { name: '#66BB6A', condition: x => x.status === 1 },\n { name: '#F44336', condition: x => x.status === 2 }\n ]\n },\n {\n name: 'currentLevelName', type: 'text', alias: 'Current Level',\n icons: [\n { name: 'done', color: '#66BB6A', condition: x => x.status === 'Approved', tip: 'Approved' },\n { name: 'close', color: '#F44336', condition: x => x.status === 'Declined', tip: 'Declined' },\n { name: 'schedule', color: '#FFC107', condition: x => x.status === 'Pending', tip: 'Pending' }\n ]\n },\n { name: 'updatedByName', alias: 'Actioned By', type: 'monogram' }, // Changed: monogram\n { name: 'updatedDateDisplay', type: 'datetime', alias: 'Actioned Date' },\n ],\n\n buttons: [\n this.viewApprovalButton,\n this.approveButton,\n this.declineButton,\n this.cancelButton,\n ],\n\n loadAction: { url: 'approvals/all/x' }\n };\n\n\n //send approvals\n sentApprovalsTableConfig: TableConfig = {\n ...this.receivedApprovalsTableConfig,\n buttons: [\n this.viewApprovalButton,\n this.cancelButton,\n ],\n loadAction: { url: 'approvals/sent/x' }\n };\n\n\n //---------------------------Other code\n\n private listCache: { [key: string]: any } = {};\n private cacheTimestamps: { [key: string]: number } = {};\n private ongoingRequests: { [key: string]: Observable<ApiResponse> } = {};\n\n // Changed: Quiet Loading — optional call-time `options.silent` suppresses the global scrim for this ONE call.\n // It is an argument rather than a mutation of `action` on purpose: Actions live on long-lived config\n // singletons shared between the main page and every dialog clone, so writing silence into one would leak it\n // into surfaces that never opted in. `action.silent` remains available for a genuinely always-silent action.\n // Changed: `options.inlineErrors` joins `options.silent` on the SAME call-time options object, for exactly the\n // same reason silent is an argument rather than a mutation of `action`: Actions live on long-lived config\n // singletons shared between the main page and every dialog clone, so writing the opt-out into one would leak\n // it into surfaces that never asked for it. It defaults to false — omit it and the request is unchanged.\n public CallApi(action: Action, data: any = '', options?: { silent?: boolean; inlineErrors?: boolean } ) {\n\n\n if (!action?.url) {\n console.warn('Invalid action or missing URL');\n return of({ success: false, message: 'Invalid action configuration' });\n }\n\n // console.log(\"calling\", action);\n\n const silent = options?.silent !== undefined ? !!options.silent : !!action.silent; // Added: call-time flag wins over the action's own\n const inlineErrors = !!options?.inlineErrors; // Added: no action-level counterpart on purpose — this is a per-CALL surface choice, not a property of the endpoint\n\n if (!action.method || action.method === 'get') {\n // Changed: TinSync offline read seam — registered URLs persist to IndexedDB and are served from it when the network is down\n const offlineReadEntry = this.offline.hasAny ? this.offline.matchRead(action.url) : null;\n if (offlineReadEntry) {\n return this.offline.handleOfflineRead(action, offlineReadEntry, () => this.handleCachedCall(action, silent, inlineErrors)); // Changed: carry silence AND the inline-errors opt-out into the network fallback\n }\n return this.handleCachedCall(action, silent, inlineErrors); // Changed: carry silence AND the inline-errors opt-out to the HTTP layer\n } else if (action.method === 'post') {\n\n // Changed: TinSync offline write seam — registered CRUD mutations queue locally while offline instead of failing\n if (this.offline.hasAny && this.isCrudAction(action.url) && !this.offline.online) {\n const mutationEntry = this.offline.matchMutation(action.url);\n if (mutationEntry) {\n if (action.isFormData) {\n return of({ success: false, message: 'File uploads require a connection' });\n }\n return this.offline.enqueueOffline(action, data, mutationEntry);\n }\n }\n\n let request: Observable<ApiResponse>;\n\n // Changed: silent context threaded through every POST shape (undefined when not silent — request unchanged)\n if (action.isFormData) {\n request = this.httpService.Post_FormData(action.url, data, tinRequestContext({ silent, inlineErrors })) as Observable<ApiResponse>;\n } else if (action.url === 'approve' || action.url === 'decline' || action.url === 'cancel') {\n request = this.httpService.Post(`${data.endpoint}/approve?action=${action.url}`, data, tinRequestContext({ silent, inlineErrors }));\n } else {\n request = this.httpService.Post(action.url, data, tinRequestContext({ silent, inlineErrors }));\n }\n\n // Invalidate cache after successful CRUD operations\n return request.pipe(\n tap((response: ApiResponse) => {\n if (response.success && this.isCrudAction(action.url)) {\n const entityName = this.extractEntityName(action.url);\n if (entityName) {\n console.log('Invalidating cache for:', entityName);\n this.invalidateListCache(entityName);\n }\n }\n }),\n catchError(err => {\n // Changed: TinSync — a registered mutation dying mid-flight on a network error is queued instead of lost\n if (err?.status === 0 && this.offline.hasAny && !action.isFormData) {\n const entry = this.offline.matchMutation(action.url);\n if (entry) {\n this.offline.reportNetworkFailure();\n return this.offline.enqueueOffline(action, data, entry);\n }\n }\n return throwError(() => err);\n })\n );\n } else {\n return this.httpService.Post(action.url, data, tinRequestContext({ silent, inlineErrors })); // Changed: silence honoured on the fallback branch too\n }\n\n }\n\n private isCrudAction(url: string): boolean {\n return url.includes('?action=create') ||\n url.includes('?action=edit') ||\n url.includes('?action=delete');\n }\n\n private extractEntityName(url: string): string | null {\n const match = url.match(/^([^?]+)/);\n return match ? match[1] : null;\n }\n\n // Changed: `silent` decides whether the GET this method ends up issuing raises the global scrim.\n // NOTE: dedupe is by URL only, so a silent caller can legitimately join an already-in-flight NOISY request for\n // the same URL (and vice versa). The first caller's scrim behaviour wins for that shared call — acceptable,\n // because both callers are waiting on the identical response and the quiet surface still renders its own state.\n private handleCachedCall(action: Action, silent: boolean = false, inlineErrors: boolean = false): Observable<ApiResponse> {\n const cacheKey = this.generateCacheKey(action.url);\n \n // Check if we should use cache\n if (!action.skipCache && this.isCacheValid(cacheKey, action)) {\n // TS-21: removed per-cache-hit console.log('Using cache', ...)\n return of({\n success: true,\n message: 'success',\n data: this.listCache[cacheKey]\n });\n }\n\n // Check if there's an ongoing request for the same URL\n if (this.ongoingRequests[cacheKey]) {\n // TS-21: removed per-hit console.log('Using ongoing request for', ...)\n return this.ongoingRequests[cacheKey];\n }\n\n // Determine cache duration\n const cacheDuration = this.getCacheDuration(action);\n \n // Only cache if duration is specified or it's a list endpoint\n if (cacheDuration > 0) {\n // Create and store the ongoing request\n this.ongoingRequests[cacheKey] = this.httpService.Get(action.url, tinRequestContext({ silent, inlineErrors })).pipe( // Changed: silent context + inline-errors opt-out\n timeout(60000), // 1 minute timeout for waiting requests\n tap((response: ApiResponse) => {\n if (response.success && response?.data) {\n this.listCache[cacheKey] = response.data;\n this.cacheTimestamps[cacheKey] = Date.now(); // Use current time when response is received\n }\n }),\n finalize(() => {\n delete this.ongoingRequests[cacheKey];\n }),\n share() \n );\n\n return this.ongoingRequests[cacheKey];\n } else {\n // No caching - clear any existing cache for this key\n if (this.listCache[cacheKey]) {\n delete this.listCache[cacheKey];\n delete this.cacheTimestamps[cacheKey];\n }\n // Changed: TS-13 — dedupe concurrent identical GETs even when not caching. Previously every uncached GET\n // (table /all/x, form /id, tile, count) hit the network independently; register a shared in-flight request\n // so simultaneous callers share one HTTP call (result is NOT cached — cleared on completion).\n this.ongoingRequests[cacheKey] = this.httpService.Get(action.url, tinRequestContext({ silent, inlineErrors })).pipe( // Changed: silent context + inline-errors opt-out\n finalize(() => { delete this.ongoingRequests[cacheKey]; }),\n share()\n );\n return this.ongoingRequests[cacheKey];\n }\n }\n\n private generateCacheKey(url: string): string {\n return url; // URL already includes query params\n }\n\n private isCacheValid(cacheKey: string, action: Action): boolean {\n if (!this.listCache[cacheKey] || !this.cacheTimestamps[cacheKey]) {\n return false;\n }\n\n const cacheDuration = this.getCacheDuration(action);\n const currentTime = Date.now();\n const cacheAge = currentTime - this.cacheTimestamps[cacheKey];\n \n return cacheAge < (cacheDuration * 60 * 1000); \n }\n\n private getCacheDuration(action: Action): number {\n // If explicitly specified in action, use that\n if (action.cacheDurationMinutes !== undefined) {\n return action.cacheDurationMinutes;\n }\n \n // Check centralized cache config\n const configuredDuration = this.cacheConfig.getDuration(action.url);\n if (configuredDuration !== null) {\n return configuredDuration;\n }\n \n // No caching by default\n return 0;\n }\n\n public ClearCache(): void {\n this.listCache = {};\n this.cacheTimestamps = {};\n\n\n Object.keys(this.ongoingRequests).forEach(key => {\n delete this.ongoingRequests[key];\n });\n }\n\n public invalidateListCache(entityUrl: string): void {\n Object.keys(this.listCache).forEach(key => {\n if (key.includes(entityUrl)) {\n delete this.listCache[key];\n delete this.cacheTimestamps[key];\n delete this.ongoingRequests[key];\n }\n });\n }\n\n\n public CheckWelcomed(path: string = 'home/admin/welcome') {\n this.CallApi({ url: 'tenants/welcome/x' }).subscribe((x) => { // Changed: controller is TenantsController (plural) — the singular URL 404'd and LoaderInterceptor rethrows, so this next-only subscribe never ran and the welcome redirect never fired at all\n if (!x.data) {\n this.Navigate(path)\n }\n })\n }\n\n\n\n public Navigate(path: string) {\n this.router.navigate([path]);\n }\n\n public NavigateWithValue(path: string, value : string){\n this.router.navigate([path], {\n queryParams: { v: value },\n queryParamsHandling: 'merge',\n skipLocationChange: false\n });\n }\n\n public GetNavigationValue(){\n if (this.route.snapshot.queryParams[\"v\"] != undefined) {\n return this.route.snapshot.queryParams[\"v\"]\n }else{\n return \"\";\n }\n }\n\n public tmpAccountID;\n\n\n\n //Users\n public GetUser() {\n return this.httpService.Get(\"User/all/x\");\n }\n\n public RegisterAccount(u) {\n return this.httpService.Post(\"User/register\", u);\n }\n\n public GetUserByID(val: string) {\n return this.httpService.Get(`User/id/${val}`);\n }\n\n public UpdateUser(profile) {\n return this.httpService.Post(\"User/edit\", profile);\n }\n\n public UnlockUser(user) {\n return this.httpService.Post(\"User/unlock\", user);\n }\n\n public LockUser(user) {\n return this.httpService.Post(\"User/lock\", user);\n }\n\n public DeleteUser(user) {\n return this.httpService.Post(\"User/delete\", user);\n }\n\n public Login(u: User) {\n return this.httpService.Post(\"User/login\", u);\n }\n\n // Added: BehaviorSubject to pass signup data from login redirect to signup page\n private pendingSignupSource = new BehaviorSubject<SignupData | null>(null);\n public pendingSignup$ = this.pendingSignupSource.asObservable();\n\n // Added: Store pending signup data when login returns signup_required\n public SetPendingSignup(data: SignupData) {\n this.pendingSignupSource.next(data);\n }\n\n // Added: Clear pending signup data after consumption\n public ClearPendingSignup() {\n this.pendingSignupSource.next(null);\n }\n\n // Added: Submit signup to backend\n public Signup(data: SignupData) {\n return this.httpService.Post(\"User/signup\", data);\n }\n\n public ChangePassword(u) {\n return this.httpService.Post(\"User/changepassword-self\", u);\n }\n\n public ChangePasswordAdmin(u) {\n return this.httpService.Post(\"User/changepassword-admin\", u);\n }\n\n public SelfReset(u: User): Observable<any> {\n return this.httpService.Post(\"Basic/SelfReset\", u);\n }\n\n\n //Roles\n\n public PostRole(role, action: string) {\n return this.httpService.Post(`Role?action=${action}`, role);\n }\n\n public PutRole(role) {\n return this.httpService.Put(\"Role\", role);\n }\n\n public GetRole(by: string, val: string) {\n return this.httpService.Get(\"Role/all/x\");\n }\n\n\n\n //Logs\n public GetLog(by: string, val: string) {\n return this.httpService.Get(\"Log/all/x\");\n }\n\n\n //Settings\n public GetSetting(by: string, val: string) {\n return this.httpService.Get(\"Setting/all/x\");\n }\n\n public UpdateSetting(setting, action: string) {\n return this.httpService.Post(`Setting?action=${action}`, setting);\n }\n\n}\n","import { Component, OnInit, Inject, Optional } from '@angular/core';\nimport { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { DataServiceLib } from '../../services/datalib.service'; // Added: reads appConfig.dialogStyle\n\n\n// Added (N22 / FSD-3): the ONE comparison that decides whether a typed confirmation phrase counts. Exported as a\n// free function, not a method, for two reasons: it is the thing the specs must pin, and the monogram component\n// established that convention here (pure function + plain Jasmine, no TestBed), which keeps the assertions on the\n// RULE rather than on a rendered fixture.\n//\n// 🔴 ORDINAL AND CASE-SENSITIVE, DELIBERATELY, and it must stay that way. This is the browser half of the server\n// check at TinWeb/Controllers/General/AppConfigurationControllerBase.cs:159:\n// if (!string.Equals(request?.Phrase, ResetPhrase, StringComparison.Ordinal))\n// A plain === on the raw strings is exactly StringComparison.Ordinal. Anything friendlier here — .trim(), a\n// .toLowerCase(), a localeCompare — makes the button ENABLE on text the server will then REJECT, so the user\n// types something the dialog accepted and gets a flat \"Reset not confirmed\" from the API with nothing on screen\n// explaining why. The two halves must agree on what counts as confirmation or the gate is worse than none.\nexport function phraseSatisfied(typed: any, required: any): boolean {\n // An absent/blank requirement means this dialog is not phrase-gated at all — nothing to satisfy, so it passes.\n // This is what keeps the option OPT-IN: every existing caller supplies nothing and is never gated.\n if (required == null || String(required).length === 0) return true;\n return typed === required; // Ordinal, case-sensitive, no normalisation of any kind. See above.\n}\n\n@Component({\n selector: 'lib-app-message',\n templateUrl: './messageDialog.component.html',\n styleUrls: ['./messageDialog.component.css'],\n standalone: false\n})\n\nexport class messageDialog implements OnInit {\n\n // Changed: DataServiceLib is injected @Optional() so the dialog still renders (as classic) if it is ever\n // constructed outside an app that provides it — a test harness, or a consumer that opens it directly.\n // It is injected into the COMPONENT rather than into MessageService on purpose: MessageService is what opens\n // this dialog, and having it depend on DataServiceLib would risk a service-level cycle. A component is a leaf.\n constructor(private dialogRef: MatDialogRef<messageDialog>, @Inject(MAT_DIALOG_DATA) public data,\n @Optional() private dataService: DataServiceLib) { }\n\n\n ngOnInit() {\n\n this.messageType = this.data.type\n this._messageSubject = this.data.subject;\n this._messageDetails = this.data.details;\n this._messageReference = this.data.reference; // Added: optional backend correlation code for this failure\n this._confirmLabel = this.data.confirmLabel; // Added: optional caller-supplied action label for the affirmative button\n this._cancelLabel = this.data.cancelLabel; // Added: optional caller-supplied label for the dismissive button\n this._okLabel = this.data.okLabel; // Added: optional caller-supplied label for the acknowledge button\n this.destructive = this.data.destructive === true; // Added: strict true — an absent flag must never colour a prompt as dangerous\n this._requirePhrase = this.data.requirePhrase; // Added: optional caller-supplied phrase the user must type verbatim to enable the affirmative button\n\n // Added: resolve the style once, at open time. The panel class carries surface-level styling (radius,\n // shadow) that component CSS cannot reach, because the Material surface is an ancestor of this view.\n this.modern = !!this.dataService?.modernDialogs;\n if (this.modern) this.dialogRef.addPanelClass('tin-dialog-modern');\n\n }\n\n messageType;\n _messageSubject;\n _messageDetails;\n _messageReference; // Added: undefined for every caller that does not supply one\n modern = false; // Added: appConfig.dialogStyle === 'modern'; false keeps the long-standing presentation\n\n // Added: this confirmation destroys or undoes something. Drives COLOUR ONLY — never the labels, never the ids,\n // never whether the buttons exist. Default false, so a caller that says nothing renders exactly as before.\n //\n // Why colour has to key off this rather than off button position: the classic style hardcodes `color: green`\n // on the affirmative button and `color: red` on the dismissive one, an assumption that only holds while the\n // buttons read \"Yes\" and \"No\" and the affirmative answer is the harmless one. The moment the affirmative\n // button is NAMED — \"Delete\" — that mapping renders a green Delete beside a red Keep, i.e. it points the\n // user at the destructive action and warns them off the safe one. Destructiveness is a property of the\n // ACTION, so that is what the colour must follow.\n destructive = false;\n\n // Added: for a destructive confirm the icon becomes a warning rather than the neutral question mark. The\n // question mark is right for \"Switch organisation?\"; it is too quiet for \"Delete this shelter?\".\n get iconName(): string { return this.isConfirm && this.destructive ? 'warning_amber' : this.spec.icon; }\n\n // Added: per-type presentation. Kept as a lookup rather than scattered *ngIf branches so a new type is one\n // entry here instead of an edit in three places — the old template hardcoded its heading per type, which is\n // exactly how the caller-supplied subject came to be silently dropped for errors.\n private static readonly TYPES: any = {\n error: { icon: 'error_outline', title: 'Something went wrong' },\n warning: { icon: 'warning_amber', title: 'Please check this' },\n info: { icon: 'info_outline', title: 'Information' },\n success: { icon: 'check_circle_outline', title: 'Done' },\n confirm: { icon: 'help_outline', title: 'Just confirming' },\n };\n\n private get spec() { return messageDialog.TYPES[this.messageType] ?? messageDialog.TYPES.info; }\n\n // Changed: the caller's subject now wins for EVERY type. Previously the heading was hardcoded per type and\n // the subject was only rendered for 'info', so a friendly title like \"No connection\" never appeared on an\n // error — the user saw the bare word \"Error\" instead.\n get title(): string {\n return (this._messageSubject && String(this._messageSubject).trim()) ? this._messageSubject : this.spec.title;\n }\n\n // Added: splits the body into paragraphs on blank lines. The messages themselves already separate \"what\n // happened\" from \"what to do next\" that way, but the old template rendered the whole thing as one run of\n // text — which is precisely why nobody read past the first line. The first paragraph is styled as a lead,\n // the rest as supporting detail, so the eye gets somewhere to land.\n // Changed: cached — this getter feeds an *ngFor and was re-splitting the body into a NEW array on every\n // change-detection cycle. The details are set once when the dialog opens, so the cache keys off the source.\n private paragraphSource: any = undefined;\n private paragraphCache: string[] = [];\n\n get paragraphs(): string[] {\n if (this._messageDetails !== this.paragraphSource) {\n this.paragraphSource = this._messageDetails;\n const raw = this._messageDetails == null ? '' : String(this._messageDetails);\n const parts = raw.split(/\\n\\s*\\n/).map(p => p.trim()).filter(p => p.length > 0);\n this.paragraphCache = parts.length ? parts : [raw.trim()].filter(p => p.length > 0);\n }\n return this.paragraphCache;\n }\n\n // Added: the correlation code, normalised and only returned when there is genuinely one to show. Returning\n // null rather than '' matters — the template hides the whole line on falsy, so an older backend that sends no\n // reference renders exactly as before instead of leaving an empty \"quote reference\" sentence dangling.\n get reference(): string | null {\n const ref = this._messageReference == null ? '' : String(this._messageReference).trim();\n return ref.length ? ref : null;\n }\n\n get isConfirm(): boolean { return this.messageType === 'confirm'; }\n\n // Added: per-call button labels, so a caller that KNOWS what it is confirming can name the action (\"Delete\",\n // \"Discard\", \"Post\") instead of the generic \"Yes\". Only the caller has that knowledge — the dialog is handed a\n // sentence, never an intent — so this is the only place the distinction can come from.\n // ⚠️ The DEFAULTS ARE DELIBERATELY UNCHANGED (\"Yes\" / \"No\" / \"OK\") and must stay that way:\n // 1. the owner reverted a hardcoded relabel (\"Cancel\" / \"Yes, continue\") on 2026-08-06 — these are the\n // most-clicked buttons in the app and the original wording is what everybody here reads;\n // 2. 51 E2E assertions across piglet-spa (38) and shift-spa (13) select these buttons by their literal TEXT\n // via getByRole('button', { name: 'Yes' }), not by id, so a default change is a suite-wide breakage;\n // 3. untracked consumers outside this workspace adopt library changes only when they opt in.\n // Opting in is therefore per call site, never global.\n _confirmLabel; // Added: undefined for every existing caller\n _cancelLabel; // Added: undefined for every existing caller\n _okLabel; // Added: undefined for every existing caller\n\n private label(value, fallback: string): string {\n return (value && String(value).trim()) ? String(value).trim() : fallback;\n }\n\n get confirmLabel(): string { return this.label(this._confirmLabel, 'Yes'); }\n\n get cancelLabel(): string { return this.label(this._cancelLabel, 'No'); }\n\n get okLabel(): string { return this.label(this._okLabel, 'OK'); }\n\n // Added: heading for the CLASSIC branch. The original template hardcoded one word per type and only rendered\n // the caller's subject for 'info'; here the subject still wins when supplied, so the \"No connection\" fix\n // survives in classic mode too — this restores the old LOOK, not the old bug. The per-type words are the\n // originals (\"Confirm\" / \"Information\" / \"Error\"), with the two newer types given the obvious equivalents.\n private static readonly CLASSIC_HEADINGS: any = {\n error: 'Error', warning: 'Warning', info: 'Information', success: 'Success', confirm: 'Confirm',\n };\n\n get classicHeading(): string {\n if (this._messageSubject && String(this._messageSubject).trim()) return this._messageSubject;\n return messageDialog.CLASSIC_HEADINGS[this.messageType] ?? 'Information';\n }\n\n // Added (N22 / FSD-3): the phrase the caller demands, and what the user has actually typed so far.\n // ⚠️ BOTH DEFAULT TO \"no gate\": _requirePhrase is undefined for every one of the existing callers, so\n // requiresPhrase is false, no input renders, confirmDisabled is false and the dialog behaves EXACTLY as it\n // does today. That is the whole opt-in contract — untracked consumers outside this workspace adopt library\n // changes only when they ask for them, and this one is invisible until a caller passes requirePhrase.\n _requirePhrase; // Added: undefined for every existing caller\n typedPhrase = ''; // Added: the raw typed text, NEVER trimmed or case-folded — see phraseSatisfied above\n\n // Added: a phrase gate exists only for a CONFIRM carrying a non-empty phrase. Guarding on isConfirm as well\n // matters: an error or info dialog has no affirmative button to gate, so a stray requirePhrase on one of\n // those must not render an input the user cannot act on.\n get requiresPhrase(): boolean {\n return this.isConfirm && this._requirePhrase != null && String(this._requirePhrase).length > 0;\n }\n\n // Added: the phrase as a string, for the template's prompt and the input's aria-label.\n get requiredPhrase(): string { return this._requirePhrase == null ? '' : String(this._requirePhrase); }\n\n // Added: THE GATE. False whenever there is no phrase to type, so every existing caller's affirmative button\n // is enabled exactly as before; true until the typed text ordinally equals the phrase.\n get confirmDisabled(): boolean {\n return this.requiresPhrase && !phraseSatisfied(this.typedPhrase, this.requiredPhrase);\n }\n\n // Added: bound with (input) rather than [(ngModel)] on purpose — this component's module (tin-spa.module.ts)\n // imports SpaMatModule, which brings MatFormFieldModule and MatInputModule, but it does NOT import FormsModule.\n // Reaching for ngModel here would mean adding a module import for one field and risking every consumer's build.\n onPhraseInput(event: any) {\n this.typedPhrase = event?.target?.value ?? ''; // Raw value. No trim — the server does not trim either.\n }\n\n response(resp: string) {\n\n // Added: belt and braces. The template already disables the affirmative button, but a disabled button is a\n // DOM state and this method is public — anything that reaches it directly (a test, a keyboard path, a future\n // caller) must not be able to confirm a phrase-gated dialog that was never satisfied.\n if (resp === 'yes' && this.confirmDisabled) return;\n\n // Added: a phrase-gated confirm closes with the TYPED TEXT alongside the answer, because the caller has to\n // forward that text to the server, which re-validates it independently (AppConfigurationControllerBase.cs:159).\n // Sending the text the user actually typed — rather than the phrase the caller already knew — is what makes\n // the request an assertion about the user instead of about the code.\n // 🔴 The richer shape is returned ONLY when a phrase was demanded. Every existing caller passes no phrase and\n // still receives the bare 'yes' / 'no' STRING it has always received, so no existing `result === 'yes'` check\n // anywhere — including in untracked consumer apps and the 51 E2E assertions — can be broken by this change.\n if (this.requiresPhrase) {\n this.dialogRef.close({ response: resp, phrase: this.typedPhrase });\n return;\n }\n\n this.dialogRef.close(resp);\n\n }\n\n};\n","<!-- Changed: two presentations behind one component. `modern` (appConfig.dialogStyle === 'modern') renders the\n structured layout; anything else renders the long-standing look, so an app that never opts in still gets a\n familiar dialog. Changed: classic is a SUPPORTED escape hatch, not frozen legacy — it is expected to render\n the same information as modern, and its three rendering bugs were repaired on 2026-08-06. Button ids\n (btnYes / btnNo / btnOK) are identical in BOTH branches — existing E2E specs select on them and must not\n care which style is active. -->\n\n<ng-container *ngIf=\"modern; else classic\">\n\n <!-- Rebuilt from a hardcoded per-type heading plus one undifferentiated paragraph into a structured layout —\n icon chip, real title, lead paragraph, supporting detail. The type drives colour via a single class on\n the root, so adding a type is one entry in the component rather than three template branches. -->\n <!-- Changed: `tin-msg--destructive` re-points the single --tin-accent variable at the warn red. Because every\n accented part (the top rule, the icon disc, the primary button) already reads from that one variable, the\n whole dialog turns to a warning in one class instead of three overrides — and the affirmative button, which\n is the thing the user is about to press, can no longer come out purple or green on a \"Delete\". -->\n <div class=\"tin-msg\" [ngClass]=\"'tin-msg--' + messageType\" [class.tin-msg--destructive]=\"isConfirm && destructive\">\n\n <div class=\"tin-msg__head\">\n <!-- The icon carries the type at a glance. It sits in a soft tinted disc rather than on a saturated\n banner: the intent is to inform, not to alarm someone who has usually done nothing wrong. -->\n <div class=\"tin-msg__icon\">\n <mat-icon>{{ iconName }}</mat-icon>\n </div>\n <h2 class=\"tin-msg__title\">{{ title }}</h2>\n </div>\n\n <mat-dialog-content class=\"tin-msg__body\">\n <!-- First paragraph is the lead (what happened); the rest is supporting detail (what to do next).\n Splitting on blank lines is what gives the eye somewhere to land — the old single run of text is\n why nobody read past the first line. -->\n <p *ngFor=\"let p of paragraphs; let first = first\" class=\"tin-msg__p\" [class.tin-msg__p--lead]=\"first\">{{ p }}</p>\n\n <!-- The backend's correlation code. Deliberately the quietest thing in the dialog — the user does not\n need to act on it, they only need to be able to read it out if they call support, at which point it\n turns a \"something broke this morning\" report into one log row. Hidden entirely when absent. -->\n <p class=\"tin-msg__ref\" *ngIf=\"reference\">If you contact your administrator, quote reference <span class=\"tin-msg__ref-code\">{{ reference }}</span>.</p>\n\n <!-- Added (N22 / FSD-3): the typed-phrase gate. Renders ONLY when the caller passed requirePhrase, so every\n existing confirm is byte-identical to before. The instruction names the phrase in a <strong> rather than\n leaving it in the sentence, because the user has to reproduce it EXACTLY — case included — and the one\n thing they must copy should be the one thing they cannot miss. No new colour or font is introduced: the\n prompt reuses the body paragraph treatment and the field is a stock Material outline field. -->\n <div class=\"tin-msg__phrase\" *ngIf=\"requiresPhrase\">\n <p class=\"tin-msg__phrase-prompt\">To confirm, type <strong class=\"tin-msg__phrase-word\">{{ requiredPhrase }}</strong> below. This is case-sensitive.</p>\n <mat-form-field appearance=\"outline\" class=\"tin-msg__phrase-field\">\n <input id=\"txtConfirmPhrase\" matInput type=\"text\" autocomplete=\"off\" spellcheck=\"false\" autocapitalize=\"off\" autocorrect=\"off\" [attr.aria-label]=\"'Type ' + requiredPhrase + ' to confirm'\" [value]=\"typedPhrase\" (input)=\"onPhraseInput($event)\" cdkFocusInitial>\n </mat-form-field>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"tin-msg__actions\">\n <!-- Changed: labels reverted to \"No\" / \"Yes\" (owner's call, 2026-08-06). The redesign had shipped them as\n \"Cancel\" / \"Yes, continue\"; these are the most-clicked buttons in the app and the original wording is\n what everybody here reads. Text only — the ids btnNo / btnYes are untouched and identical to the\n classic branch, so every E2E selector (#btnYes) and every caller is unaffected.\n Changed: the literal text is now {{ confirmLabel }} / {{ cancelLabel }} / {{ okLabel }}, which STILL\n render \"Yes\" / \"No\" / \"OK\" unless the caller passes a label. A caller that knows it is confirming a\n destructive action can name it (\"Delete\") so it no longer reads identically to a harmless one. -->\n <!-- Changed: on a DESTRUCTIVE confirm the initial focus moves to the SAFE button. The affirmative button is\n still #btnYes in the same position with the same click handler — only the keyboard default changes, so\n hitting Enter on reflex now keeps the record instead of destroying it. Every E2E locator clicks #btnYes\n explicitly (helpers/form.helper.ts acceptConfirmIfPresent uses page.locator('#btnYes')), so none of them\n depend on which button holds focus. The colour comes from tin-msg--destructive on the root, not from\n anything here — the primary button reads --tin-accent either way. -->\n <ng-container *ngIf=\"isConfirm; else modernAcknowledge\">\n <button id=\"btnNo\" mat-button class=\"tin-msg__btn-quiet\" [class.tin-msg__btn-safe]=\"destructive\" (click)=\"response('no')\" [attr.cdkFocusInitial]=\"destructive ? '' : null\">{{ cancelLabel }}</button>\n <!-- Changed (N22 / FSD-3): [disabled] is bound to confirmDisabled, which is FALSE for every caller that\n passes no requirePhrase — so this button's enabled state is unchanged for all 23 existing call sites. -->\n <button id=\"btnYes\" mat-flat-button class=\"tin-msg__btn-primary\" [disabled]=\"confirmDisabled\" (click)=\"response('yes')\" [attr.cdkFocusInitial]=\"destructive ? null : ''\">{{ confirmLabel }}</button>\n </ng-container>\n <ng-template #modernAcknowledge>\n <button id=\"btnOK\" mat-flat-button class=\"tin-msg__btn-primary\" (click)=\"response('ok')\" cdkFocusInitial>{{ okLabel }}</button>\n </ng-template>\n </mat-dialog-actions>\n\n </div>\n\n</ng-container>\n\n\n<!-- Classic: the original LOOK, kept deliberately as the escape hatch (owner's call, 2026-08-06 — retire was\n recommended and declined). It is the original markup plus FIXES, never style changes, because reverting a\n bug alongside a look would be a regression. It renders the same INFORMATION as the modern branch, in its\n own visual language:\n 1. the caller's subject is used as the heading when one was supplied. The old template hardcoded the\n heading per type and rendered the subject for 'info' only, which is why a friendly title like\n \"No connection\" showed up as the bare word \"Error\".\n 2. 'warning' and 'success' are handled. They did not exist when this markup was written, so they would\n otherwise fall through every branch and render an empty dialog.\n 3. 'error' now has an icon; the reference line is no longer trapped in the error-only branch; and the\n body renders real paragraphs instead of one collapsed run of text.\n ⚠️ Anything added to the modern branch above has to be considered here too — that omission is exactly how\n the three bugs in 3. got here. -->\n\n<ng-template #classic>\n <div class=\"tin-msg-classic\">\n\n <h2>\n <div class=\"tin-between\">\n <mat-label>{{ classicHeading }}</mat-label>\n <!-- Added: the missing 'error' icon. Every other type had one; error — the type that most needs a cue —\n rendered its heading beside empty flex space. Colour matches the modern branch's error accent\n (#c62828) so the two presentations agree on what \"error\" looks like. -->\n <mat-icon *ngIf=\"messageType=='error'\" style=\"color: #c62828;\">error</mat-icon>\n <!-- Changed: a destructive confirm shows a red warning instead of the neutral question mark, matching the\n modern branch. Same #c62828 as the error icon beside it, so the two styles agree on what danger looks\n like. A plain confirm (\"Switch organisation?\") is unchanged. -->\n <mat-icon *ngIf=\"messageType=='confirm' && destructive\" style=\"color: #c62828;\">warning</mat-icon>\n <mat-icon *ngIf=\"messageType=='confirm' && !destructive\">question_mark</mat-icon>\n <mat-icon *ngIf=\"messageType=='info'\" style=\"color: steelblue;\">info</mat-icon>\n <mat-icon *ngIf=\"messageType=='warning'\" style=\"color: #ef6c00;\">warning</mat-icon>\n <mat-icon *ngIf=\"messageType=='success'\" style=\"color: #2e7d32;\">check_circle</mat-icon>\n </div>\n </h2>\n\n <mat-dialog-content>\n\n <!-- Changed: was `{{ _messageDetails }}` rendered raw, so the blank-line-separated paragraphs the messages\n are actually written in (api-error.service.ts) collapsed into one undifferentiated run of text. That\n collapse is the original complaint that started WS-7 and it was still live here. Now renders the same\n `paragraphs` split the modern branch uses — same information, classic's own plain markup. -->\n <div *ngIf=\"messageType=='error'\">\n <p class=\"tin-msg-classic__p\" *ngFor=\"let p of paragraphs\">{{ p }}</p>\n </div>\n\n <div *ngIf=\"messageType!='error'\" class=\"alert alert-secondary\" role=\"alert\">\n <p class=\"tin-msg-classic__p\" *ngFor=\"let p of paragraphs\">{{ p }}</p>\n </div>\n\n <!-- Changed: lifted OUT of the error-only branch above. The reference is a correlation code, not an\n error-specific field — a warning or info that carried one used to drop it silently. -->\n <div class=\"tin-msg-classic__ref\" *ngIf=\"reference\">Reference: {{ reference }}</div>\n\n <!-- Added (N22 / FSD-3): the classic branch's half of the typed-phrase gate. Added here DELIBERATELY and at\n the same time as the modern one — the comment at the top of this template records that omitting classic\n is exactly how three rendering bugs got here, and a gate that renders in one style but not the other\n would be worse than a cosmetic miss: classic would show a phrase-gated confirm with a permanently\n disabled Yes and no input to enable it, i.e. an unusable dialog. Classic's own plain markup, same\n information. -->\n <div class=\"tin-msg-classic__phrase\" *ngIf=\"requiresPhrase\">\n <p class=\"tin-msg-classic__p\">To confirm, type <strong>{{ requiredPhrase }}</strong> below. This is case-sensitive.</p>\n <mat-form-field class=\"tin-msg-classic__phrase-field\">\n <input id=\"txtConfirmPhrase\" matInput type=\"text\" autocomplete=\"off\" spellcheck=\"false\" autocapitalize=\"off\" autocorrect=\"off\" [attr.aria-label]=\"'Type ' + requiredPhrase + ' to confirm'\" [value]=\"typedPhrase\" (input)=\"onPhraseInput($event)\" cdkFocusInitial>\n </mat-form-field>\n </div>\n\n </mat-dialog-content>\n\n <mat-dialog-actions>\n\n <!-- Changed: same caller-supplied labels as the modern branch, defaulting identically to \"Yes\" / \"No\" /\n \"OK\". Classic is expected to render the same INFORMATION as modern in its own visual language, so a\n caller that names its action must be honoured here too — otherwise the next person to pass a label\n would silently get \"Yes\" on every untracked consumer still running classic. Colours and ids untouched. -->\n <!-- ⚠️ Changed: THE COLOUR NOW FOLLOWS THE ACTION, NOT THE BUTTON'S POSITION. This markup hardcoded\n `color: green` on the affirmative button and `color: red` on the dismissive one. That mapping is only\n correct while the buttons read \"Yes\" and \"No\" and the affirmative answer is the harmless one — the\n green was never saying \"this is safe\", it was saying \"this is the Yes\". Name the action and the\n assumption inverts: a confirm offering \"Keep\" / \"Delete\" rendered a GREEN Delete next to a RED Keep,\n colouring the destructive action as the go-ahead and the safe one as the danger. That is the single\n reason the labels and the colours had to ship as one change rather than two.\n Destructive: affirmative red (#c62828, the same red the error icon uses), dismissive neutral — no\n colour at all, so the red is the only thing on the dialog asking for attention.\n Non-destructive: green/red exactly as before, byte for byte, for every caller that passes nothing.\n ids btnYes / btnNo and the click handlers are untouched in both cases. -->\n <!-- Changed (N22 / FSD-3): same [disabled]=\"confirmDisabled\" as the modern branch, false unless a phrase was demanded. -->\n <!-- Changed (owner, 2026-08-18): the inline colour is dropped WHILE the button is disabled. This binding\n sets the text colour with the specificity of an inline style, which outranks Material's disabled\n treatment — so on a requirePhrase confirm the classic branch rendered a full-strength red \"Reset\n Organisation\" that looked pressable over an empty input, the same defect the modern branch had.\n Handing the colour back to null lets Material grey it natively; the moment the phrase is typed the\n red returns. Colour still follows the ACTION, never the position, exactly as the note above requires. -->\n <button id=\"btnYes\" mat-stroked-button [style.color]=\"confirmDisabled ? null : (destructive ? '#c62828' : 'green')\" *ngIf=\"isConfirm\" [disabled]=\"confirmDisabled\" (click)=\"response('yes')\" [attr.cdkFocusInitial]=\"destructive ? null : ''\">{{ confirmLabel }}</button>\n\n <button id=\"btnNo\" mat-stroked-button [style.color]=\"destructive ? null : 'red'\" *ngIf=\"isConfirm\" (click)=\"response('no')\" [attr.cdkFocusInitial]=\"destructive ? '' : null\">{{ cancelLabel }}</button>\n\n <button id=\"btnOK\" mat-stroked-button *ngIf=\"!isConfirm\" color=\"primary\" (click)=\"response('ok')\" cdkFocusInitial>{{ okLabel }}</button>\n\n </mat-dialog-actions>\n\n </div>\n</ng-template>\n","import { Component } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\n\n// Generic Privacy Policy dialog component for tin-spa library\n@Component({\n selector: 'spa-privacy-dialog',\n templateUrl: './privacy-dialog.component.html',\n styleUrls: ['./privacy-dialog.component.css'],\n standalone: false\n})\nexport class PrivacyDialogComponent {\n\n constructor(private dialogRef: MatDialogRef<PrivacyDialogComponent>) { }\n\n close() {\n this.dialogRef.close();\n }\n}\n","<h2 mat-dialog-title>Privacy Policy</h2>\n\n<mat-dialog-content class=\"privacy-content\">\n <h3>1. Information We Collect</h3>\n <p>We collect information you provide directly, such as when you create an account, use our services, or contact us for support. This may include your name, email address, and other contact information.</p>\n\n <h3>2. How We Use Your Information</h3>\n <p>We use the information we collect to provide, maintain, and improve our services, communicate with you, and ensure the security of our platform. We may also use your information to send you updates and promotional materials, subject to your preferences.</p>\n\n <h3>3. Information Sharing</h3>\n <p>We do not sell your personal information. We may share your information with third-party service providers who assist us in operating our platform, subject to confidentiality obligations. We may also disclose information when required by law or to protect our rights.</p>\n\n <h3>4. Data Security</h3>\n <p>We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the internet is completely secure.</p>\n\n <h3>5. Cookies and Tracking</h3>\n <p>We use cookies and similar tracking technologies to enhance your experience, analyze usage patterns, and deliver personalized content. You can control cookie settings through your browser preferences.</p>\n\n <h3>6. Data Retention</h3>\n <p>We retain your personal information for as long as necessary to fulfill the purposes for which it was collected, comply with legal obligations, resolve disputes, and enforce our agreements.</p>\n\n <h3>7. Your Rights</h3>\n <p>Depending on your location, you may have rights regarding your personal information, including the right to access, correct, delete, or port your data. You may also have the right to opt out of certain processing activities.</p>\n\n <h3>8. Third-Party Links</h3>\n <p>Our application may contain links to third-party websites or services. We are not responsible for the privacy practices of these third parties, and we encourage you to review their privacy policies.</p>\n\n <h3>9. Children's Privacy</h3>\n <p>Our services are not directed to children under the age of 13. We do not knowingly collect personal information from children. If you believe we have collected information from a child, please contact us immediately.</p>\n\n <h3>10. Changes to This Policy</h3>\n <p>We may update this Privacy Policy from time to time. We will notify you of any material changes by posting the new policy on this page and updating the effective date.</p>\n\n <h3>11. Contact Us</h3>\n <p>If you have any questions about this Privacy Policy or our data practices, please contact us through the application's support channels.</p>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-flat-button color=\"primary\" (click)=\"close()\">Close</button>\n</mat-dialog-actions>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { MessageService } from '../../services/message.service';\n\n@Component({\n selector: 'spa-suffix',\n templateUrl: './suffix.component.html',\n styleUrls: ['./suffix.component.css'],\n standalone: false\n})\nexport class SuffixComponent implements OnInit {\n\n constructor(private messageService: MessageService) { }\n\n ngOnInit(): void {\n }\n\n @Input() label: string;\n @Input() infoMessage: string;\n @Input() copyContent: boolean = false;\n\n @Input() isHovered: boolean = false;\n @Input() clearContent: boolean = false;\n // Added: this component had NO notion of readonly at all, so the clear X rendered and mutated on a locked\n // field in every one of the 10 field types that render it. Gated in the template AND here: the template\n // stops the click, this stops any other caller, and a write affordance that is wrong to offer is also\n // wrong to honour. Copy is untouched — it reads.\n @Input() readonly: boolean = false;\n @Input() value;\n\n @Output() infoClick = new EventEmitter<void>();\n @Output() copyClick = new EventEmitter<string>();\n @Output() clearClick = new EventEmitter<void>();\n @Output() valueChange = new EventEmitter();\n\n onInfoClick(event: MouseEvent): void {\n event.stopPropagation();\n if (this.infoMessage) {\n this.messageService.info(this.infoMessage);\n }\n this.infoClick.emit();\n }\n\n onCopyClick(event: MouseEvent): void {\n event.stopPropagation();\n if (this.value) {\n navigator.clipboard.writeText(this.value).then(() => {\n this.messageService.toast('Copied');\n });\n }\n this.copyClick.emit(this.value);\n }\n\n onClearClick(event: MouseEvent): void {\n event.stopPropagation();\n if (this.readonly) { return; } // Added: never write through a locked field, whatever route reached here\n\n // Changed: was `this.value = ''`. Every parent binds [(value)]=\"value\", so this writes straight into the\n // parent's own value BEFORE clearClick runs. For date/datetime — which had no (clearClick) at all until\n // this change — that write was the ONLY effect, and '' is not what an emptied field means: an int property\n // receiving a JSON \"\" fails model binding, and a double receiving \"\" 400s. A user-cleared control emits\n // null, never '' and never a sentinel. Parents that own a clear() still overwrite this a line later.\n this.value = null;\n this.valueChange.emit(this.value);\n this.clearClick.emit();\n }\n}\n","<label *ngIf=\"label\"> {{label}}</label>\n<button mat-icon-button *ngIf=\"copyContent && isHovered\" (click)=\"onCopyClick($event)\" matTooltip=\"Copy Content\" matTooltipPosition=\"above\" style=\"opacity: 1;\">\n <mat-icon class=\"tinyIcon\">content_copy</mat-icon>\n</button>\n<button mat-icon-button *ngIf=\"clearContent && isHovered && !readonly\" (click)=\"onClearClick($event)\" matTooltip=\"Clear Content\" matTooltipPosition=\"above\" style=\"opacity: 1;\"><!-- Changed: `&& !readonly` — the X is the one affordance here that WRITES, and it rendered and fired on a locked field, so a view-only dialog could still be emptied. Copy above is deliberately NOT gated: reading a locked value is exactly what a view dialog is for. -->\n <mat-icon class=\"tinyIcon\">close</mat-icon>\n</button>\n<button mat-icon-button *ngIf=\"infoMessage\" (click)=\"onInfoClick($event)\" [matTooltip]=\"infoMessage\" matTooltipPosition=\"above\" style=\"opacity: 1;margin-right: 2px;\">\n <mat-icon class=\"tinyIcon\" style=\"color: steelblue;\">info</mat-icon>\n</button>\n","import { Component } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\n\n// Generic Terms and Conditions dialog component for tin-spa library\n@Component({\n selector: 'spa-terms-dialog',\n templateUrl: './terms-dialog.component.html',\n styleUrls: ['./terms-dialog.component.css'],\n standalone: false\n})\nexport class TermsDialogComponent {\n\n constructor(private dialogRef: MatDialogRef<TermsDialogComponent>) { }\n\n close() {\n this.dialogRef.close();\n }\n}\n","<h2 mat-dialog-title>Terms and Conditions</h2>\n\n<mat-dialog-content class=\"terms-content\">\n <h3>1. Acceptance of Terms</h3>\n <p>By accessing and using this application, you acknowledge that you have read, understood, and agree to be bound by these Terms and Conditions. If you do not agree to these terms, please do not use this application.</p>\n\n <h3>2. Use of the Application</h3>\n <p>You agree to use this application only for lawful purposes and in accordance with these Terms. You are responsible for ensuring that your use of the application complies with all applicable laws and regulations.</p>\n\n <h3>3. User Accounts</h3>\n <p>If you create an account, you are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account. You agree to notify us immediately of any unauthorized use of your account.</p>\n\n <h3>4. Intellectual Property</h3>\n <p>All content, features, and functionality of this application, including but not limited to text, graphics, logos, and software, are the exclusive property of the application owner and are protected by copyright, trademark, and other intellectual property laws.</p>\n\n <h3>5. User Content</h3>\n <p>You retain ownership of any content you submit to the application. By submitting content, you grant us a non-exclusive, worldwide, royalty-free license to use, reproduce, and display such content in connection with the operation of the application.</p>\n\n <h3>6. Limitation of Liability</h3>\n <p>To the fullest extent permitted by law, we shall not be liable for any indirect, incidental, special, consequential, or punitive damages arising out of or related to your use of this application.</p>\n\n <h3>7. Disclaimer of Warranties</h3>\n <p>This application is provided \"as is\" without warranties of any kind, either express or implied. We do not warrant that the application will be uninterrupted, error-free, or free of harmful components.</p>\n\n <h3>8. Modifications to Terms</h3>\n <p>We reserve the right to modify these Terms at any time. Changes will be effective immediately upon posting. Your continued use of the application after any changes constitutes acceptance of the new Terms.</p>\n\n <h3>9. Termination</h3>\n <p>We may terminate or suspend your access to the application at any time, without prior notice, for any reason, including breach of these Terms.</p>\n\n <h3>10. Governing Law</h3>\n <p>These Terms shall be governed by and construed in accordance with the laws of the jurisdiction in which the application owner operates, without regard to conflict of law principles.</p>\n\n <h3>11. Contact Information</h3>\n <p>If you have any questions about these Terms and Conditions, please contact us through the application's support channels.</p>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-flat-button color=\"primary\" (click)=\"close()\">Close</button>\n</mat-dialog-actions>\n","// One mechanism for the resting placeholder of every picker-shaped field, so the affordance is derived\n// from the field's own display label per COMPONENT TYPE and no config in any consumer app has to say it.\n// The verb tells the user what the control accepts: type it, pick it from a list, or pick it from a calendar.\nexport type PlaceholderKind = 'enter' | 'enter-or-select' | 'select' | 'pick';\n\nconst VERBS: Record<PlaceholderKind, string> = {\n 'enter': 'Enter',\n 'enter-or-select': 'Enter or select',\n 'select': 'Select',\n 'pick': 'Pick'\n};\n\n// An explicit placeholder always wins — deliberate copy (\"Choose roles\") is never clobbered by the convention.\n// Only an empty/absent placeholder is derived, and a blank display yields nothing rather than a dangling verb.\n// Changed (rop-1): READ-ONLY suppresses the placeholder entirely, ahead of every other rule including an\n// explicit one. A placeholder is an INVITATION TO TYPE; on a view-only dialog there is nothing to type into,\n// so \"Enter Name\" on an empty read-only field states an affordance that does not exist and reads like data\n// that failed to load. Blank is the honest rendering: it says the field is empty and nothing can be captured.\n// The suppression is unconditional because an explicit placeholder is just as misleading as a derived one —\n// \"Choose roles\" on a locked field is no more actionable than \"Select Roles\".\nexport function derivePlaceholder(kind: PlaceholderKind, display: string, explicit?: string, readonly?: boolean): string {\n if (readonly === true) return '';\n if (explicit != null && explicit.trim() !== '') return explicit;\n const label = (display ?? '').trim();\n if (label === '') return '';\n return `${VERBS[kind]} ${label}`;\n}\n","// Password masking component\nimport { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { derivePlaceholder } from '../../runtime/field-placeholder'; // Added: one shared derivation of the resting placeholder per component type\n\n@Component({\n selector: 'spa-text-mask',\n templateUrl: './text-mask.component.html',\n styleUrls: ['./text-mask.component.css'],\n standalone: false\n})\nexport class TextMaskComponent implements OnInit, OnChanges {\n\n constructor() { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['value'] && this.control) {\n if (this.control.value !== changes['value'].currentValue) {\n this.control.setValue(changes['value'].currentValue, { emitEvent: false });\n }\n }\n \n if (changes['readonly'] && this.control) {\n this.initControl();\n }\n }\n\n // Changed: the \"Enter <display>\" freeze that lived here is gone — see computedPlaceholder below.\n ngOnInit(): void {\n }\n\n ngAfterViewInit() {\n this.initControl();\n\n if (this.value) {\n this.control.setValue(this.value, { emitEvent: false });\n }\n\n this.control.valueChanges.subscribe(val => {\n this.value = val;\n this.control.markAsDirty();\n this.valueChange.emit(val);\n });\n }\n\n hide = true; // Changed: Controls password visibility\n\n @Input() appearance: 'fill' | 'outline' = 'outline';\n @Input() readonly = false;\n @Input() hint = \"\";\n @Input() display = \"\";\n @Input() placeholder = \"\";\n // Added: derived resting placeholder. A masked field is typed into, so the verb is \"Enter\". Explicit wins.\n get computedPlaceholder(): string { return derivePlaceholder('enter', this.display, this.placeholder, this.readonly); }\n @Input() value = \"\";\n @Output() valueChange = new EventEmitter();\n\n @Output() leave = new EventEmitter();\n @Output() enterPress = new EventEmitter();\n\n @Input() width = \"100%\";\n\n @Input() required = true;\n @Input() min = 0;\n @Input() max = 9000000000000000;\n @Input() regex?: { pattern: string; message: string };\n\n @Input() infoMessage: string;\n\n initControl() {\n if (this.readonly) {\n this.control.setValidators(null);\n this.control.updateValueAndValidity();\n return;\n }\n \n const validators = [];\n \n if (this.required) {\n validators.push(Validators.required);\n }\n \n if (this.min > 0) {\n validators.push(Validators.minLength(this.min));\n }\n \n if (this.max < 9000000000000000) {\n validators.push(Validators.maxLength(this.max));\n }\n \n if (this.regex) {\n validators.push(Validators.pattern(this.regex.pattern));\n }\n \n this.control.setValidators(validators);\n this.control.updateValueAndValidity();\n }\n\n leaved() {\n this.control.markAsTouched();\n this.leave.emit();\n\n if (this.regex && this.value) {\n const regexPattern = new RegExp(this.regex.pattern);\n if (!regexPattern.test(this.value)) {\n this.control.setErrors({ 'pattern': true });\n }\n }\n }\n\n enterPressed() {\n this.enterPress.emit();\n }\n\n control = new FormControl('', this.getValidators());\n\n private getValidators() {\n const validators = [];\n \n if (this.required) {\n validators.push(Validators.required);\n }\n \n validators.push(Validators.minLength(this.min));\n validators.push(Validators.maxLength(this.max));\n \n if (this.regex) {\n validators.push(Validators.pattern(this.regex.pattern));\n }\n \n return validators;\n }\n\n validate(control: FormControl): string {\n if ((this.required || this.min > 0) && control.hasError('required')) {\n return `Required`;\n }\n\n if (control.hasError('minlength')) {\n return `Minimum length is ${this.min}`;\n }\n\n if (control.hasError('maxlength')) {\n return `Maximum length is ${this.max}`;\n }\n\n if (control.hasError('pattern')) {\n return this.regex?.message || 'Invalid Input';\n }\n\n return \"\";\n }\n}\n","<!-- Password input with visibility toggle -->\n<mat-form-field class=\"spa-password\" [class.spa-readonly]=\"readonly\" [hideRequiredMarker]=\"!required\" [hintLabel]=\"hint\" [ngStyle]=\"{'width':width ?? '100%'}\" style=\"margin-right: 5px\" [appearance]=\"appearance ?? 'fill'\" subscriptSizing=\"dynamic\">\n <mat-label>{{display}}</mat-label>\n <input matInput [type]=\"hide ? 'password' : 'text'\" (keyup.enter)=\"enterPressed()\" (blur)=\"leaved()\" autocomplete=\"off\" [placeholder]=\"computedPlaceholder\" [formControl]=\"control\" [required]=\"required\" [readonly]=\"readonly\">\n <mat-error *ngIf=\"control.invalid && (control.dirty || control.touched)\">{{validate(control)}}</mat-error>\n <button mat-icon-button matSuffix (click)=\"hide = !hide\" [attr.aria-label]=\"'Hide password'\" [attr.aria-pressed]=\"hide\">\n <mat-icon style=\"font-size: 12px;\">{{hide ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n</mat-form-field>\n","// Simple text input component - Password, textarea, and autocomplete moved to separate components\nimport { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { derivePlaceholder } from '../../runtime/field-placeholder'; // Added: one shared derivation of the resting placeholder per component type\n\n@Component({\n selector: 'spa-text',\n templateUrl: './text.component.html',\n styleUrls: ['./text.component.css'],\n standalone: false\n})\nexport class TextComponent implements OnInit, OnChanges {\n\n constructor() { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['value'] && this.control) {\n if (this.control.value !== changes['value'].currentValue) {\n this.control.setValue(changes['value'].currentValue, { emitEvent: false });\n }\n }\n \n if (changes['readonly'] && this.control) {\n this.initControl();\n }\n }\n\n // Changed: the \"Enter <display>\" freeze that lived here is gone — see computedPlaceholder below.\n ngOnInit(): void {\n }\n\n ngAfterViewInit() {\n this.initControl();\n\n if (this.value) {\n this.control.setValue(this.value, { emitEvent: false });\n }\n\n this.control.valueChanges.subscribe(val => {\n this.value = val;\n this.control.markAsDirty();\n this.valueChange.emit(val);\n });\n }\n\n @Input() appearance: 'fill' | 'outline' = 'outline';\n @Input() readonly = false;\n @Input() hint = \"\";\n @Input() display = \"\";\n @Input() placeholder = \"\";\n // Added: derived resting placeholder. A plain text box is typed into, so the verb is \"Enter\". Explicit wins.\n get computedPlaceholder(): string { return derivePlaceholder('enter', this.display, this.placeholder, this.readonly); }\n @Input() value = \"\";\n @Output() valueChange = new EventEmitter();\n @Input() format = \"text\";\n @Input() type = \"\";\n\n @Output() leave = new EventEmitter();\n @Output() enterPress = new EventEmitter();\n\n @Input() width = \"100%\";\n @Input() copyContent = false;\n @Input() clearContent = false;\n\n @Input() required = true;\n @Input() min = 0;\n @Input() max = 9000000000000000;\n @Input() regex?: { pattern: string; message: string };\n\n @Input() suffix: string;\n @Input() infoMessage: string;\n\n isHovered = false;\n onMouseEnter(): void {\n this.isHovered = true;\n }\n\n onMouseLeave(): void {\n this.isHovered = false;\n }\n\n initControl() {\n if (this.readonly) {\n this.control.setValidators(null);\n this.control.updateValueAndValidity();\n return;\n }\n \n const validators = [];\n \n if (this.required) {\n validators.push(Validators.required);\n }\n \n if (this.min > 0) {\n validators.push(Validators.minLength(this.min));\n }\n \n if (this.max < 9000000000000000) {\n validators.push(Validators.maxLength(this.max));\n }\n \n if (this.regex) {\n validators.push(Validators.pattern(this.regex.pattern));\n }\n \n this.control.setValidators(validators);\n this.control.updateValueAndValidity();\n }\n\n leaved() {\n this.control.markAsTouched();\n this.leave.emit();\n\n if (this.regex && this.value) {\n const regexPattern = new RegExp(this.regex.pattern);\n if (!regexPattern.test(this.value)) {\n this.control.setErrors({ 'pattern': true });\n }\n }\n }\n\n clear() {\n this.value = \"\";\n this.control.setValue(\"\", { emitEvent: false });\n this.control.markAsDirty();\n this.control.markAsTouched();\n this.valueChange.emit(this.value);\n }\n\n enterPressed() {\n this.enterPress.emit();\n }\n\n control = new FormControl('', this.getValidators());\n\n private getValidators() {\n const validators = [];\n \n if (this.required) {\n validators.push(Validators.required);\n }\n \n validators.push(Validators.minLength(this.min));\n validators.push(Validators.maxLength(this.max));\n \n if (this.regex) {\n validators.push(Validators.pattern(this.regex.pattern));\n }\n \n return validators;\n }\n\n validate(control: FormControl): string {\n if ((this.required || this.min > 0) && control.hasError('required')) {\n return `Required`;\n }\n\n if (control.hasError('minlength')) {\n return `Minimum length is ${this.min}`;\n }\n\n if (control.hasError('maxlength')) {\n return `Maximum length is ${this.max}`;\n }\n\n if (control.hasError('pattern')) {\n return this.regex?.message || 'Invalid Input';\n }\n\n return \"\";\n }\n}\n\n","<!-- Simple text input - Password, textarea, and autocomplete moved to separate components -->\n<mat-form-field [class.spa-readonly]=\"readonly\" [hideRequiredMarker]=\"!required\" [hintLabel]=\"hint\" [appearance]=\"appearance ?? 'fill'\" [ngStyle]=\"{'width':width ?? '100%'}\" style=\"margin-right: 5px;\" subscriptSizing=\"dynamic\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\n <mat-label *ngIf=\"format=='text'\">{{display}}</mat-label>\n <mat-label *ngIf=\"format=='date'\">{{display | date:'dd/MM/yyyy'}}</mat-label>\n <input matInput autocomplete=\"off\" (blur)=\"leaved()\" (keyup.enter)=\"enterPressed()\" [type]=\"type\" [placeholder]=\"computedPlaceholder\" [formControl]=\"control\" [required]=\"required\" [readonly]=\"readonly\"/>\n <mat-error *ngIf=\"control.invalid && (control.dirty || control.touched)\">{{validate(control)}}</mat-error>\n <div matSuffix class=\"suffix-icons\">\n <spa-suffix [label]=\"suffix\" [infoMessage]=\"infoMessage\" [copyContent]=\"copyContent\" [clearContent]=\"clearContent\" [readonly]=\"readonly\" (clearClick)=\"clear()\" [isHovered]=\"isHovered\" [(value)]=\"value\"></spa-suffix>\n </div>\n</mat-form-field>\n","// Added (token-slot, arbiter ruling A-0901-17): the login tier's minimal bearer-token attacher.\n//\n// 🔗 MAINTENANCE SEAM — this file is one half of a pair. The other half is the write-once slot\n// `setTinFallbackTokenAttacher` in `tin-spa/http` (http/src/lib/root-interceptor.ts). This is the ONLY\n// thing in the estate that fills that slot. Read that file before changing this one.\n//\n// 🔑 THE LAW OF THE PAIR, in three lines:\n// 1. THE DELEGATE ALWAYS WINS. TinRootInterceptor checks the primary's delegate FIRST; the moment the\n// primary loads, this attacher is never consulted again. It covers a window of milliseconds.\n// 2. THIS ATTACHES A HEADER AND NOTHING ELSE. No loading bar, no 401 refresh, no error dialog, no\n// offline suppression, no TIN_LOADER_RAN. It is not a small LoaderInterceptor and must never\n// become one.\n// 3. THE CORRECT FIX FOR ANYTHING MORE IS TO LOAD THE PRIMARY. If a route needs real interceptor\n// behaviour, give it the primary; do not enrich this attacher.\n//\n// WHY IT EXISTS: a landing-first app's login route deliberately holds NO reference to the tin-spa\n// primary, so `LoaderInterceptor.addToken` — the sole bearer-token attachment point in the estate —\n// is not loaded when login succeeds. Library code issues ~5 authenticated GETs in the window between\n// the login response and the shell route's injector coming up. Measured on shift-spa: 6 untokenised\n// requests and 5 x 401 on EVERY login. The app recovered and looked perfect, which is what made it\n// dangerous enough to need a ruling.\nimport { ENVIRONMENT_INITIALIZER, EnvironmentProviders, inject, makeEnvironmentProviders } from '@angular/core';\nimport { HttpRequest } from '@angular/common/http';\nimport { setTinFallbackTokenAttacher } from 'tin-spa/http';\nimport { AuthService } from '../services/auth.service';\n\n// Added: add this to the LOGIN route's providers array (alongside the rest of LOGIN_PROVIDERS). It runs\n// during route RECOGNITION — before canMatch, before any component — so it is in place well ahead of the\n// first authenticated request the login flow can produce.\nexport const TIN_LOGIN_TIER_HTTP_PROVIDERS: EnvironmentProviders = makeEnvironmentProviders([\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n const auth = inject(AuthService);\n\n setTinFallbackTokenAttacher((req: HttpRequest<any>) => {\n\n const token = auth.tokenSource.value;\n const url = req.url || '';\n\n // DELIBERATE DEVIATION 1 from LoaderInterceptor.addToken — this is CONDITIONAL on a non-empty\n // token, where addToken is not. addToken clones unconditionally and therefore sends a bare\n // \"Bearer \" when tokenSource is still empty. That is not hypothetical: it is the measured\n // accounts-prefetch-401 defect written up at length in accounting.service.ts:2308-2326, where a\n // prefetch fired off `loggedinObserv` beat the token into tokenSource and answered 401 every\n // time. This attacher lives ENTIRELY inside that same pre-token window, so it would hit the bug\n // constantly rather than occasionally. Returning the request unchanged is also what preserves\n // the fail-open guarantee for the LOGIN POST itself, which must go out anonymously.\n //\n // DELIBERATE DEVIATION 2 — the refresh/revoke exclusion is INLINE here rather than at the call\n // site. In LoaderInterceptor the same test sits in intercept() around the addToken() call\n // (loader-interceptor.service.ts, the `url.includes('User/refresh') || url.includes('User/revoke')`\n // line). There is no equivalent call site here — TinRootInterceptor's fallback branch is\n // deliberately dumb — so the rule has to travel with the attacher. Those endpoints are\n // AllowAnonymous and authenticate from the request BODY; a stale bearer on them is at best noise\n // and at worst a rejected refresh.\n if (!token || url.includes('User/refresh') || url.includes('User/revoke')) {\n return req;\n }\n\n return req.clone({ setHeaders: { Authorization: `Bearer ${token}` } });\n });\n }\n }\n]);\n\n// 🔴 MUST NOT — read this before \"finishing\" the file.\n//\n// NEVER re-implement isRefreshing / refreshResult$ here. Those two fields in LoaderInterceptor serialize\n// concurrent 401 refreshes so that N simultaneous 401s produce ONE refresh instead of N racing ones that\n// invalidate each other's session. They are security-critical and subtle, and a second independent copy\n// of that machinery — running in the same app, against the same session, with no coordination with the\n// original — is strictly worse than not having it.\n//\n// The accepted consequence, ruled explicitly: a 401 arriving inside this millisecond-wide window gets\n// NO refresh and NO retry. It 401s exactly as it does today. That is not an oversight and it is not a\n// TODO. It is the deliberate boundary of this file. Anything that needs refresh behaviour needs the\n// primary — see law 3 above.\n","import { Injectable } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { CapItem, Constants } from '../classes/Classes'; // Changed: CapItem — the saved route is validated against the menu the current role can see\nimport { DataServiceLib } from './datalib.service';\nimport { StorageService } from './storage.service';\n\n// Resume-last-route: remembers the page a user was last on and lands them back there on the next\n// login/session resume, instead of always dumping them on the default start page.\n// Opt-in per app via AppConfig.resumeLastRoute (off by default, like keepSignedIn).\n// Stored persistently (survives browser close) and keyed BY USER, so a shared device never\n// resumes one person into another person's last page.\n@Injectable({ providedIn: 'root' })\nexport class LastRouteService {\n\n private started = false;\n\n // Transient/parameterised routes must never be resumed into: a record may be gone, and\n // change-password/setup are one-shot detours, not places to live.\n private excluded = ['home/user/change-password', 'home/setup'];\n\n constructor(private router: Router, private storage: StorageService, private dataService: DataServiceLib) { }\n\n get enabled(): boolean { return !!this.dataService.appConfig?.resumeLastRoute; }\n\n // The signed-in user, read from storage rather than AuthService.currentUser — currentUser is hydrated\n // asynchronously and still holds its placeholder default during a session resume, which would key the\n // saved route under the wrong user and silently lose it.\n private async user(): Promise<string | null> {\n const name = await this.storage.get(Constants.AUTH_USER);\n return name ? String(name).toLowerCase() : null;\n }\n\n // Started once from the nav shell (which only exists while signed in) — records every completed navigation\n start(): void {\n if (!this.enabled || this.started) return;\n this.started = true;\n\n this.router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe(async (e: any) => {\n const route = this.normalize(e.urlAfterRedirects || e.url);\n if (!route) return;\n const user = await this.user();\n if (user) this.save(user, route);\n });\n }\n\n // Landing target for a resumed session: the saved route, or null to fall back to the caller's default\n async resolve(): Promise<string | null> {\n if (!this.enabled) return null;\n const user = await this.user();\n if (!user) return null;\n const map = this.storage.getPersistent(Constants.LAST_ROUTE) || {};\n const route = map[user];\n if (!this.isResumable(route)) return null;\n // Changed: a page the role can no longer open (capability revoked, menu item retired) must not be resumed —\n // drop it so the next visit goes straight to the default page instead of re-testing a dead entry\n if (!(await this.allowed(route))) { await this.clear(); return null; }\n return route;\n }\n\n // Added: single navigation entry point for callers resuming a session. Falls back to the app's default page\n // when the saved route no longer exists — without this a removed route falls through the app's wildcard\n // route (which redirects back to the landing page) and the user bounces instead of landing anywhere.\n async navigateTo(target: string, fallback: string = 'home'): Promise<void> {\n if (!target || target === fallback) { this.router.navigate([fallback]); return; }\n const ok = await this.router.navigate([target]).catch(() => false);\n const landed = this.strip(this.router.url);\n if (ok && (landed === target || landed.startsWith(target + '/'))) return;\n await this.clear(); // stale entry — never send anyone here again\n this.router.navigate([fallback]);\n }\n\n // Explicit logoff drops only this user's entry — other users on the device keep theirs\n async clear(): Promise<void> {\n const user = await this.user();\n if (!user) return;\n const map = this.storage.getPersistent(Constants.LAST_ROUTE) || {};\n delete map[user];\n this.storage.storePersistent(Constants.LAST_ROUTE, map);\n }\n\n private save(user: string, route: string): void {\n const map = this.storage.getPersistent(Constants.LAST_ROUTE) || {};\n map[user] = route;\n this.storage.storePersistent(Constants.LAST_ROUTE, map);\n }\n\n // Strip the leading slash and any query/fragment so what we store matches what router.navigate expects\n private normalize(url: string): string | null {\n const route = this.strip(url); // Changed: share the stripping with navigateTo's landed-URL check\n return this.isResumable(route) ? route : null;\n }\n\n // Added: url → bare route (no leading slash, no query, no fragment)\n private strip(url: string): string {\n return (url || '').split('?')[0].split('#')[0].replace(/^\\//, '');\n }\n\n // Only real, landable pages under home — never the bare shell, never a one-shot detour\n private isResumable(route: string): boolean {\n if (!route || !route.startsWith('home/')) return false;\n return !this.excluded.some(x => route.startsWith(x));\n }\n\n // Added: the signed-in user's capability map, read from storage for the same reason as user() —\n // AuthService.myRole is still empty this early in a session resume (the landing page has no auth guard)\n private async role(): Promise<any> {\n try { return JSON.parse(await this.storage.get(Constants.AUTH_ROLES)); } catch { return null; }\n }\n\n // Added: a route is resumable only while it still maps to a menu page this role can open. Retired pages lose\n // their cap item, revoked pages lose their role flag — both land the user on the default page instead.\n private async allowed(route: string): Promise<boolean> {\n const items = this.flatten(this.dataService.appConfig?.capItems);\n if (!items.length) return true; // no menu configured — nothing to validate against, stay permissive\n const match = items\n .filter(x => x.link && x.link.length > 'home'.length && (route === x.link || route.startsWith(x.link + '/')))\n .sort((a, b) => b.link.length - a.link.length)[0]; // longest link wins: 'home/trips' beats the bare 'home'\n if (!match) return false; // not a menu destination (removed page, or a transient detour) — do not resume\n const role = await this.role();\n return role ? !!role[match.name] : true; // unreadable role must not disable the feature — the page still guards itself\n }\n\n // Added: cap items nest (group → sub items), so flatten the whole tree before matching a link\n private flatten(items: CapItem[] | undefined): CapItem[] {\n return (items || []).reduce((all: CapItem[], x) => all.concat(x, this.flatten(x.capSubItems)), []);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, of } from 'rxjs'; // Changed (F3): of — ensureModules() answers synchronously when there is nothing to wait for\nimport { catchError, map, shareReplay, tap } from 'rxjs/operators'; // Added (F3): ensureModules() pipeline\nimport { DataServiceLib } from './datalib.service';\nimport { ApiResponse, SetupModule, SetupPresetSelection, SetupRoleTemplate, SetupStatus } from '../classes/Classes'; // Changed: SetupPresetSelection — the apply POST body item for the notification preset picker\nimport { ApiErrorService } from './api-error.service'; // Added: loadStatus is page-driven and must report; the two badge loads around it deliberately stay silent (WS-6 Phase 4)\n\n// Setup readiness (\"Getting Started\") service — NotificationsService mirror without SignalR.\n// Dormant unless appConfig.setupConfig.enabled; API failures leave count at 0 so the badge stays hidden.\n// v2 adds the module catalog (drives step + nav-menu gating) and predefined role templates.\n@Injectable({\n providedIn: 'root'\n})\nexport class SetupService {\n\n private pendingCount = new BehaviorSubject<number>(0);\n pendingCount$ = this.pendingCount.asObservable();\n\n private status = new BehaviorSubject<SetupStatus | null>(null);\n status$ = this.status.asObservable();\n\n // Added (v2): module catalog — empty means the app has no module concept (nothing is ever hidden)\n private modules = new BehaviorSubject<SetupModule[]>([]);\n modules$ = this.modules.asObservable();\n\n private modulesLoaded = false; // Added (F3): a guard must be able to tell \"the catalog is genuinely empty\" from \"it has not been fetched yet\"\n private modulesInFlight: Observable<SetupModule[]> | null = null; // Added (F3): de-dupes concurrent guard activations on a deep route\n\n constructor(private dataService: DataServiceLib, private apiErrorService: ApiErrorService) { } // Changed: injected for loadStatus only\n\n get enabled(): boolean {\n return !!this.dataService.appConfig?.setupConfig?.enabled;\n }\n\n // Lightweight badge count — called on login and nav-menu init\n loadCount() {\n if (!this.enabled) return;\n this.dataService.CallApi({ url: 'setup/count', skipCache: true }).subscribe({\n next: (apiResponse: ApiResponse) => {\n // DELIBERATELY SILENT (WS-6 Phase 4 triage). A badge count, fired from login and from nav-menu init.\n // Failing leaves the badge hidden, which is the same thing it shows when there is genuinely nothing\n // pending — and \"you have no setup left\" is a harmless thing to under-report for a moment, because\n // the Getting Started PAGE itself reports properly (see loadStatus below). A dialog on nav init would\n // fire on every shell load for every user of an app whose SetupController is having a bad day.\n if (apiResponse.success) this.pendingCount.next(apiResponse.data);\n },\n error: () => { } // Backend without SetupController — keep badge hidden\n });\n }\n\n // Full step catalog — called by the Getting Started page and after step actions\n loadStatus() {\n if (!this.enabled) return;\n this.dataService.CallApi({ url: 'setup/status', skipCache: true }).subscribe({\n next: (apiResponse: ApiResponse) => {\n // CONVERTED, unlike its two neighbours in this file, and the difference is who asked. This one has\n // exactly two callers — setup-guide.component.ts ngOnInit and refresh() from that same page — so it\n // only ever runs because someone opened Getting Started or just completed a step there. Failing left\n // the page rendering an empty checklist, which reads as \"there is nothing to set up\" to the one user\n // who is by definition new and has no way to know better. (WS-6 Phase 4 triage)\n if (!apiResponse.success) this.apiErrorService.presentAppFailure(apiResponse, 'load', 'setup/status');\n if (apiResponse.success) {\n this.status.next(apiResponse.data);\n this.pendingCount.next(apiResponse.data?.pending ?? 0);\n this.modules.next(apiResponse.data?.modules ?? []); // Added (v2): status carries the module catalog too\n this.modulesLoaded = true; // Added (F3): status carries the catalog, so a Getting Started visit satisfies ensureModules() too\n }\n },\n error: () => { }\n });\n }\n\n // Added (v2): module catalog alone — called on nav init so menu gating works without visiting the page\n loadModules() {\n if (!this.enabled) return;\n this.dataService.CallApi({ url: 'setup/modules', skipCache: true }).subscribe({\n next: (apiResponse: ApiResponse) => {\n // DELIBERATELY SILENT (WS-6 Phase 4 triage). Nav-menu init, and isModuleEnabled() below FAILS OPEN by\n // design — an empty catalog hides nothing, so a failure here makes the app MORE visible, never less.\n // There is no user-facing loss to report. It also runs on every shell init, which is precisely where\n // a dialog becomes a wall.\n if (apiResponse.success) this.modules.next(apiResponse.data ?? []);\n this.modulesLoaded = true; // Added (F3): answered either way — a failed load leaves the catalog empty, and empty means \"hide nothing\"\n },\n error: () => { this.modulesLoaded = true; } // Changed (F3): a backend without module support must not leave every later ensureModules() re-requesting\n });\n }\n\n // Added (F3): awaitable catalog for moduleGuard. Reading the BehaviorSubject at route-resolution time is not\n // enough — on a deep link or an F5 the catalog has not arrived yet, so a guard would read empty and fail open on\n // exactly the path it exists to protect. Fails open on every unhappy path (setup disabled, no SetupController,\n // 401, error) because hiding working functionality is the worse error, matching isModuleEnabled below and the\n // server's ModuleCatalog.IsEnabled. shareReplay collapses the several child activations of one deep route into\n // a single setup/modules request.\n ensureModules(): Observable<boolean> {\n if (!this.enabled || this.modulesLoaded) return of(true);\n if (!this.modulesInFlight) {\n this.modulesInFlight = this.dataService.CallApi({ url: 'setup/modules', skipCache: true }).pipe(\n map((apiResponse: ApiResponse) => (apiResponse.success ? apiResponse.data ?? [] : [])),\n tap((mods: SetupModule[]) => { this.modules.next(mods); this.modulesLoaded = true; this.modulesInFlight = null; }),\n catchError(() => { this.modulesLoaded = true; this.modulesInFlight = null; return of([] as SetupModule[]); }),\n shareReplay(1)\n ) as Observable<SetupModule[]>;\n }\n return this.modulesInFlight.pipe(map(() => true));\n }\n\n // Added (F3): the refusal toast names the module, not the key — falls back to the key for an app whose route\n // declares a key the server's catalog does not carry\n moduleTitle(key: string): string {\n return this.modules.value?.find(m => m.key === key)?.title ?? key;\n }\n\n // Added (v2): nav-menu gate — unknown keys and apps without modules always pass (fail open)\n isModuleEnabled(key: string): boolean {\n if (!key) return true;\n const mods = this.modules.value;\n if (!mods || mods.length === 0) return true;\n const mod = mods.find(m => m.key === key);\n return !mod || mod.enabled;\n }\n\n // Added (v2): toggle a module (or 'confirm' the selection) — server persists onto app configuration\n setModule(key: string, enabled: boolean): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/module', method: 'post', skipCache: true }, { key, enabled }) as Observable<ApiResponse>;\n }\n\n // Added (v2): predefined role templates for the roles step\n loadRoleTemplates(): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/roletemplates', skipCache: true }) as Observable<ApiResponse>;\n }\n\n // Added (v2): create tenant roles from the selected templates\n createRoles(keys: string[]): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/roles', method: 'post', skipCache: true }, { keys }) as Observable<ApiResponse>;\n }\n\n // Added (presets): the notification rules on offer for this tenant, plus the roles the picker chooses a\n // recipient from. skipCache like every other setup call — Exists is stamped per request and a cached\n // catalogue would re-offer rules the user just created.\n loadNotificationPresets(): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/notificationpresets', skipCache: true }) as Observable<ApiResponse>;\n }\n\n // Added (presets): create notification rules from the ticked presets. Create-only server-side — unticking a\n // rule that already exists deletes nothing, so this can never undo a deliberate user choice.\n applyNotificationPresets(items: SetupPresetSelection[], includeEmail: boolean): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/notifications', method: 'post', skipCache: true }, { items, includeEmail }) as Observable<ApiResponse>;\n }\n\n // Added (presets P4): the approval rules on offer, plus the roles that can ACTUALLY approve — the backend filters\n // that list to roles somebody is a member of, because since SEC-10 only a member of the level's role can release a\n // held record, so offering an empty role would build a config nobody could action.\n loadApprovalPresets(): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/approvalpresets', skipCache: true }) as Observable<ApiResponse>;\n }\n\n // Added (presets P4): create approval rules from the ticked presets. Create-only server-side, exactly like the\n // notification apply. No includeEmail — an approval request is always in-app (an approver who misses it leaves\n // records held), so the body deliberately carries items alone.\n applyApprovalPresets(items: SetupPresetSelection[]): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/approvals', method: 'post', skipCache: true }, { items }) as Observable<ApiResponse>;\n }\n\n // Added (seed seam): the example-data offers this tenant's steps can make. skipCache like every other setup\n // call, and here it is not optional — wouldCreate, existing and applied are stamped per REQUEST, so a cached\n // catalogue would keep offering rows the user has just created and keep the counts wrong.\n loadSeedOffers(): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/seedoffers', skipCache: true }) as Observable<ApiResponse>;\n }\n\n // Added (seed seam): apply ONE offer, plus whatever that offer declares it needs first — the server walks the\n // dependency chain, so the caller sends a single key. A POST, not a GET, and the server requires Edit: the two\n // seed buttons this replaces are both writes reachable by a View-only user, and that is not carried forward.\n applySeedOffer(key: string): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/seed', method: 'post', skipCache: true }, { key }) as Observable<ApiResponse>;\n }\n\n // Added (seed-all): fill every area that is still empty, in ONE request. The client sends no list — the server\n // loops the SAME offer catalogue, applies only the offers whose own area still has something to add, and skips\n // anything the user lacks Edit on. Deliberately NOT a client-side loop over applySeedOffer(): that would put the\n // judgement about what counts as \"empty\" in the browser, which is exactly where the demo-data card's one global\n // sentinel already went wrong, and it would produce one audit entry and one toast per area.\n applySeedAll(): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'setup/seed-all', method: 'post', skipCache: true }, {}) as Observable<ApiResponse>;\n }\n\n refresh() {\n this.loadStatus();\n }\n}\n","// Subscription feature-checking service for plan-based feature gating\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators'; // Added (features-failopen-fix): raw-token stream operator for the login hook\nimport { HttpService } from './http.service';\nimport { AuthService } from './auth.service'; // Added (features-failopen-fix): the login/logout signal this service was missing entirely\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SubscriptionService {\n\n // Enabled feature keys for the current tenant's plan\n private enabledFeaturesSource = new BehaviorSubject<string[]>([]);\n public enabledFeatures$ = this.enabledFeaturesSource.asObservable();\n\n // Whether features have been loaded from the server\n private featuresLoaded = false;\n\n constructor(private httpService: HttpService, private authService: AuthService) { // Changed (features-failopen-fix): AuthService injected — AuthService does not depend on this service, so there is no DI cycle (same shape as accounting.service.ts:2173)\n\n // Added (features-failopen-fix, ruling A-0830-16 part 2): loadFeatures' ONLY call site was the plan-change\n // success handler (subscription.component.ts:258) — nothing called it on login, despite the \"call after login\"\n // comment below, so the feature list was empty for the entire life of every normal session (runtime-confirmed:\n // an authenticated boot of test-spa issued zero subscriptions/features requests). This is the 490f65a\n // tokenObserv precedent, taken in its CORRECTED form: distinctUntilChanged sits on the RAW token and the\n // empty/non-empty test is in the HANDLER, not a filter() on the pipe. That matters for the same reason it\n // mattered for the journal accounts — auth.service.ts:81 calls UpdateToken('') inside clearSession (the path\n // both logoff() and sessionExpired() go through), so filtering '' out of the pipe would discard the only\n // logout signal and tokenA -> '' -> tokenB would be seen as two values instead of three, leaving user #1's\n // plan features in place for user #2. On the raw token it is three distinct values and clearFeatures runs.\n this.authService.tokenObserv.pipe(distinctUntilChanged()).subscribe(token => token ? this.loadFeatures() : this.clearFeatures());\n }\n\n // Fetch enabled features from backend — call after login\n loadFeatures() {\n this.httpService.Get('subscriptions/features').subscribe({\n next: (response: any) => {\n // Changed (features-failopen-fix, ruling A-0830-16 part 1): was `if (response && Array.isArray(response))`,\n // which is false for every real response. The server returns a RepoResponse ENVELOPE\n // (TinWeb SubscriptionsController.cs:84-89 -> {\"data\":[...],\"success\":true,...}) and HttpService.Get\n // (http.service.ts:60-62) does no unwrapping. So the success branch never ran and featuresLoaded stayed\n // false even on a 200. This is an oversight, not a contract: the same component reads response?.success\n // off the envelope correctly at subscription.component.ts:255, three lines before the call into here.\n if (response?.success && Array.isArray(response.data)) {\n this.enabledFeaturesSource.next(response.data);\n this.featuresLoaded = true;\n }\n },\n error: () => {\n // Changed (features-failopen-fix, ruling A-0830-16 part 3): this handler used to push [] AND set\n // featuresLoaded = true, which is fail-CLOSED — a 401 blip or a network stumble on this one request would\n // present as \"your plan does not include that\" and hide paid functionality from a paying tenant, with the\n // gate believing it held a real answer. featuresLoaded now stays FALSE on an error, which is what routes\n // the gate into the deliberate fail-open branch in isFeatureEnabled below. The list is left as-is rather\n // than cleared for the same reason: an error is not evidence that the tenant lost their entitlements.\n }\n });\n }\n\n // Check if a specific feature key is enabled for the current tenant's plan\n isFeatureEnabled(featureKey: string): boolean {\n if (!featureKey) return true; // No feature restriction\n\n // 🔴 Added (features-failopen-fix). THIS GATE FAILS OPEN, DELIBERATELY — ruling A-0830-16 part 3.\n //\n // When the feature list has not loaded — never fetched yet, request in flight, 401, network error, a backend\n // with no SubscriptionsController — this returns TRUE and the guarded thing stays visible. That is a choice,\n // not an accident, and it follows the recorded precedent at setup.service.ts:92, whose sibling gate fails open\n // on every unhappy path because \"hiding working functionality is the worse error\". The server-side\n // ModuleCatalog.IsEnabled and module.guard.ts:37 make the same call. A gate that fails closed on a transient\n // error tells a paying tenant their plan does not include something they bought, and it does so silently.\n //\n // ⚠️ THE ASSUMPTION THIS RESTS ON, stated so it can be checked rather than inherited: plan entitlement is\n // enforced SERVER-SIDE. This client gate is a UX affordance — it hides what the tenant cannot use; it is not\n // what stops them using it. The request behind any feature gated here must be refused by the API on its own\n // authority, with no reference to what the client chose to render.\n //\n // 🔴 IF THAT EVER STOPS BEING TRUE — if this client check becomes the enforcement point for a paid feature,\n // or a feature ships with no server-side entitlement check behind it — then this fail-open branch is a\n // bypass: unload the features (or induce one 401) and everything is unlocked. RULING A-0830-16 MUST BE\n // REVISITED BEFORE THAT SHIPS. Do not quietly flip this to fail-closed either; the closed mode is what part 3\n // was decided against, and the correct fix in that world is server-side enforcement, not a stricter client.\n if (!this.featuresLoaded) return true;\n\n return this.enabledFeaturesSource.value.includes(featureKey);\n }\n\n // Check if a module (by capName mapping) is enabled — used by nav-menu filtering\n isModuleEnabled(featureKey: string): boolean {\n if (!featureKey) return true; // No feature restriction on this module\n // Changed (features-failopen-fix): the same deliberate fail-open, for the same reasons — see the full note in\n // isFeatureEnabled above. This is the LIVE consumer of the two (nav-menu.component.ts:178), so leaving it\n // fail-closed while its twin failed open would have preserved the exact hazard the ruling exists to remove:\n // a menu item vanishing for the rest of the session because one request blipped.\n if (!this.featuresLoaded) return true;\n return this.enabledFeaturesSource.value.includes(featureKey);\n }\n\n // Clear features on logout\n clearFeatures() {\n // Added (features-failopen-fix): this is now LIVE — the constructor subscription calls it on the empty token\n // that clearSession emits. Both halves matter: the list is dropped so user #2 never reads user #1's plan, and\n // featuresLoaded re-arms to false so the next non-empty token's loadFeatures is not silently redundant.\n this.enabledFeaturesSource.next([]);\n this.featuresLoaded = false;\n }\n\n // Whether features have been loaded (useful for guards to wait)\n get loaded(): boolean {\n return this.featuresLoaded;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CapItem, Constants } from '../classes/Classes'; // Changed: Constants — primeRole() reads the persisted role map\nimport { AuthService } from './auth.service';\nimport { DataServiceLib } from './datalib.service';\nimport { SetupService } from './setup.service';\nimport { StorageService } from './storage.service'; // Added: primeRole() hydrates from storage before the nav shell exists\nimport { SubscriptionService } from './subscription.service';\n\n// One section of the navigation menu: a parent CapItem and the leaf items shown beneath it.\n// A parent with no sub-items (or ignoreSubsDisplay) becomes a section holding only itself, which is\n// exactly how the side nav renders it — a single navigable row rather than an expandable group.\nexport interface MenuSection {\n name: string;\n display: string;\n icon: string;\n cap: CapItem;\n standalone: boolean; // true when the section IS the destination (no children to tile)\n items: CapItem[];\n}\n\n// THE single definition of \"what does this user see in the menu\". Extracted from NavMenuComponent on\n// 2026-08-31 so the grid menu can render the SAME menu the side nav renders without restating any of the\n// rules (owner: \"without redefining the grid menu — it should take from how we render our tab items in the\n// side nav\"). NavMenuComponent now delegates to this service, so there is one place where role gating,\n// showMenu, isBool, featureKey (subscription) and moduleKey (tenant module) are decided — and a change to\n// any of them moves the side nav and the grid menu together, by construction.\n@Injectable({ providedIn: 'root' })\nexport class MenuSourceService {\n\n constructor(private authService: AuthService, private dataService: DataServiceLib,\n private setupService: SetupService, private subscriptionService: SubscriptionService,\n private storage: StorageService) { } // Changed: StorageService for primeRole()\n\n // Moved verbatim from NavMenuComponent.isFeatureAllowed — tenant module first, then subscription feature.\n // Both underlying checks FAIL OPEN on an unloaded catalog, which is deliberate there and preserved here.\n isFeatureAllowed(cap: CapItem): boolean {\n if (!cap) return false;\n if (cap.moduleKey && !this.setupService.isModuleEnabled(cap.moduleKey)) return false;\n if (!cap.featureKey) return true;\n return this.subscriptionService.isModuleEnabled(cap.featureKey);\n }\n\n // Moved from NavMenuComponent.getSubItems, cache included. The WeakMap keeps the returned array a STABLE\n // reference across change-detection cycles — three *ngFor loops in the side nav bind it directly, and\n // rebuilding the array each cycle is what this cache was added to stop. Keyed on the CapItem, because the\n // sub-item list is static config that only changes when capItems itself is replaced.\n private subItemCache = new WeakMap<CapItem, CapItem[]>();\n\n subItemsOf(capItem: CapItem): CapItem[] {\n if (!capItem || !capItem.capSubItems) return [];\n let subItems = this.subItemCache.get(capItem);\n if (!subItems) {\n // Hide pure boolean permission caps, but keep navigable isBool items (those carrying a link)\n subItems = capItem.capSubItems.filter(x => x.showMenu && (!x.isBool || (x.link && x.link.trim() !== '')));\n this.subItemCache.set(capItem, subItems);\n }\n return subItems;\n }\n\n // The role map the side nav tests as myRole[cap.name]. Read from AuthService's observable rather than a\n // snapshot so a re-login inside the same shell repaints the menu.\n private role: any = {};\n\n private roleSubscribed = false;\n\n private watchRole(): void {\n if (this.roleSubscribed) return;\n this.roleSubscribed = true;\n this.authService.myRoleObserv.subscribe(r => this.role = r || {});\n }\n\n // Added: hydrate the role map from storage when the in-memory one is still empty, for callers that must\n // decide visibility BEFORE the nav shell exists.\n //\n // 🔴 WHY THIS IS NEEDED AT ALL, and it is the whole reason the landing preference works. myRoleObserv is a\n // BehaviorSubject seeded with an EMPTY Role, and it is only filled by applyLoginResponse or by the auth\n // guard's async storage read. The session-resume seam (login.component / landing.component) runs before\n // either has necessarily landed — tryRestoreSession() returns true off hasValidSession() alone and never\n // touches the role. So visibleItems() would be EMPTY there, and every capability-filtered resolver would\n // report \"nothing is reachable\" and silently discard a perfectly valid stored preference. That failure is\n // indistinguishable from \"the user has no preference\", which is exactly the kind of bug that ships.\n //\n // 🔑 THIS CANNOT WIDEN ACCESS. It reads the SAME server-issued role map that applyLoginResponse persists\n // (rewritten on every login and every silent refresh), it only ever fills a map that is empty, and the live\n // observable overwrites it the moment it emits. LastRouteService.allowed() already trusts this exact key for\n // this exact reason — this is that precedent applied at the one other place with the same timing problem.\n async primeRole(): Promise<void> {\n this.watchRole();\n if (this.hasAnyCapability()) return; // the live role already arrived — never override it\n try {\n const stored = await this.storage.get(Constants.AUTH_ROLES);\n const role = stored ? JSON.parse(stored) : null; // double-encoded: stored as a JSON string, then stringified again by StorageService — same read LastRouteService.role() does\n if (role && !this.hasAnyCapability()) this.role = role; // re-tested: the observable may have emitted while the read was in flight, and it wins\n } catch { /* unreadable role must not break navigation — visibility simply stays as it was */ }\n }\n\n // 🔴 \"HAS THE ROLE LOADED YET\" IS NOT A KEY COUNT, and getting that wrong silently disabled the whole landing\n // preference. myRoleObserv is seeded with `new Role()`, whose constructor sets cap1..cap100 (and roleID,\n // roleName) to FALSE — so the unloaded role has about a hundred keys and every emptiness test based on\n // Object.keys().length reports \"already loaded\" from the very first frame. primeRole then returned early, the\n // menu resolved to nothing because every capability was false, and every stored preference was filtered out\n // as unreachable. It looked exactly like a user who had chosen nothing.\n //\n // The honest question is whether any capability is actually GRANTED. A user for whom this is legitimately\n // false has no menu to resolve against anyway, so the only cost of re-reading storage for them is one\n // synchronous read that returns the same ungranted map.\n //\n // 🔴 METADATA EXCLUDED, AND TRUTHY RATHER THAN === true — both halves are needed and each was a real trap.\n // The role object carries roleID, tenantID and roleName alongside the capabilities, and `roleName` is\n // \"New Role\" on the unloaded seed — truthy — so a plain \"does this object hold a truthy value\" test reports a\n // LOADED role for an empty one, and primeRole never runs. And the server sends capabilities as NUMBERS\n // (`cap1: 4`, read out of the browser's own stored role map) while `new Role()` initialises them to the\n // boolean false, so a `=== true` test never matches a real granted capability either. The nav has always\n // read these with `!!`, so truthiness is the same question the rest of the library asks.\n //\n // Excluding the three metadata fields rather than matching /^cap\\d+$/ keeps this true for any capability\n // naming a consumer uses, instead of hard-coding the shape test-spa happens to have.\n private static readonly roleMetadata = ['roleID', 'tenantID', 'roleName'];\n\n private hasAnyCapability(): boolean {\n const role = this.role;\n if (!role) return false;\n return Object.keys(role).some(k => MenuSourceService.roleMetadata.indexOf(k) < 0 && !!role[k]);\n }\n\n // Is this item allowed for the signed-in user? The exact conjunction the side nav template applies:\n // role flag AND showMenu AND isFeatureAllowed.\n isVisible(cap: CapItem): boolean {\n this.watchRole();\n if (!cap) return false;\n return !!this.role[cap.name] && !!cap.showMenu && this.isFeatureAllowed(cap);\n }\n\n // The whole visible menu, in the SAME ORDER the side nav renders it (appConfig.capItems, unreversed —\n // 'side-modern' does not reverse; only the legacy top nav does). Computed on demand and returned fresh,\n // so callers must store the result rather than bind this method in a template.\n sections(): MenuSection[] {\n this.watchRole();\n const caps = this.dataService?.appConfig?.capItems ?? [];\n const sections: MenuSection[] = [];\n\n for (const cap of caps) {\n if (!this.isVisible(cap)) continue;\n const icon = cap.icon && cap.icon !== 'navigate_next' ? cap.icon : 'dashboard';\n\n // Standalone row in the side nav: no children, or told to ignore them. It is its own destination.\n if (!cap.capSubItems || cap.ignoreSubsDisplay) {\n if (!cap.link || !cap.link.trim()) continue; // a section with nothing to open is not a tile\n sections.push({ name: cap.name, display: cap.display, icon, cap, standalone: true, items: [cap] });\n continue;\n }\n\n const items = this.subItemsOf(cap).filter(sub => this.isVisible(sub) && sub.link && sub.link.trim() !== '');\n if (!items.length) continue; // an empty group is a header with no tiles under it — drop it\n sections.push({ name: cap.name, display: cap.display, icon, cap, standalone: false, items });\n }\n\n return sections;\n }\n\n // Every visible destination, flattened — what the Recent row resolves its stored links against, so a\n // page the user can no longer open simply stops appearing among their recents.\n visibleItems(): CapItem[] {\n return this.sections().reduce((all: CapItem[], s) => all.concat(s.items), []);\n }\n\n // Longest-link-wins match of a router URL back to the menu item that owns it. Same rule\n // LastRouteService.allowed() uses, for the same reason: 'home/trips' must beat a bare 'home'.\n matchLink(route: string, items: CapItem[]): CapItem | null {\n if (!route) return null;\n const match = items\n .filter(x => x.link && x.link.length > 'home'.length && (route === x.link || route.startsWith(x.link + '/')))\n .sort((a, b) => b.link.length - a.link.length)[0];\n return match || null;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { DataServiceLib } from './datalib.service';\nimport { ApiResponse } from '../classes/Classes';\nimport { SignalRService } from './signalr.service'; // Changed: Added for real-time notification count\nimport { MessageService } from './message.service'; // Changed: Added for in-app push toast display\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationsService {\n\n private notificationCount = new BehaviorSubject<number>(0);\n notificationCount$ = this.notificationCount.asObservable();\n\n constructor(private dataService: DataServiceLib, private signalRService: SignalRService, private messageService: MessageService) {\n // Changed: Subscribe to real-time SignalR count updates\n this.signalRService.notificationCount$.subscribe(count => {\n this.notificationCount.next(count);\n });\n\n // Changed: Wire reconnection callback to refresh count via HTTP\n this.signalRService.onReconnected = () => this.loadNotifications();\n\n // Changed: Listen for push messages forwarded from service worker\n this.listenForPushMessages();\n }\n\n // Changed: Intercept push events when the app is in the foreground\n private listenForPushMessages() {\n if (!('serviceWorker' in navigator)) return;\n navigator.serviceWorker.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'PUSH_RECEIVED') {\n this.messageService.toast(event.data.body || 'New notification');\n this.refreshCount();\n }\n });\n }\n\n // Changed: Uncommented HTTP poll for initial count on login\n loadNotifications() {\n this.dataService.CallApi({ url: 'notifications/count/x' }).subscribe((apiResponse: ApiResponse) => {\n // DELIBERATELY SILENT (WS-6 Phase 4 triage). This is THE poll of the set, and the one where converting\n // would be most obviously wrong: it runs on login, on signup, on every visit to the notifications page,\n // on every push message forwarded from the service worker, and — the decisive one — from\n // signalRService.onReconnected. A flapping SignalR connection reconnects repeatedly, so a dialog here\n // would fire once per reconnect for as long as the network is unhappy. That is the dialog storm this\n // whole channel exists to prevent, arriving from the inside. A stale unread badge costs the user nothing.\n if (apiResponse.success) {\n this.notificationCount.next(apiResponse.data);\n }\n });\n }\n\n refreshCount() {\n this.loadNotifications();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, firstValueFrom, of } from 'rxjs'; // Changed: firstValueFrom — resolveLandingPage awaits the row before resolving\nimport { distinctUntilChanged, map, tap } from 'rxjs/operators';\nimport { ApiResponse, BottomTab, CapItem } from '../classes/Classes';\nimport { AuthService } from './auth.service';\nimport { DataServiceLib } from './datalib.service';\nimport { MenuSourceService } from './menu-source.service';\n\n// The PER-USER preference row, as the server stores it. Deliberately the same three fields as\n// TinWeb's UserPreference entity, with the same meanings — see that class for the full reasoning.\nexport interface UserPreferences {\n userName: string;\n mobileTabs: string; // comma-separated CapItem NAMES, in the user's chosen order. '' = use the app default\n defaultPage: string; // route to land on. '' = \"last page I was on\" (LastRouteService's existing behaviour)\n}\n\n// The grid menu as a landing target. It is NOT a menu entry — it is a page ABOUT the menu — so it cannot be\n// expressed as a CapItem name and is stored as its route instead.\n//\n// 🔴 THE VALUE IS 'home/menu' AND IT IS VERIFIED, NOT GUESSED. Chunk B registered the page at that path\n// (spa-home-routing.module.ts: `{ path: 'menu', component: GridMenuComponent }`), so this constant is read off\n// the real route rather than assumed from the feature's name — 'home/grid-menu' would have compiled, stored\n// cleanly, and silently failed to navigate. If that route ever moves, this constant moves with it, and stored\n// rows carrying the old value degrade to \"last page I was on\" via resolveDefaultPage's own filter.\nexport const GRID_MENU_ROUTE = 'home/menu';\n\n// Added (chunk C): the grid menu as a MOBILE TAB, not just as a landing page.\n//\n// The owner asked for both — \"I want a grid menu on the home page, or I want a dashboard on the home page,\n// which is the first tab\" — so it has to be selectable wherever a page is. It is not a CapItem (it is a page\n// ABOUT the menu, so it has no capability of its own), and tabs are stored as CapItem NAMES, so it is stored\n// under its ROUTE as its name. That can never collide: a capability name is 'cap1'-style and never contains a\n// slash, so 'home/menu' is unambiguous in the stored list and needs no extra field or escaping.\n//\n// Icon: 'apps' — the 3x3 dot grid. It depicts the tiles it opens rather than standing in for them, which is\n// what lets this tab read correctly with no label at a glance. Display 'Menu' is the owner's own word and the\n// one a phone user reaches for; 'Grid menu' names the implementation, not the destination.\nexport const GRID_MENU_TAB: BottomTab = { name: GRID_MENU_ROUTE, display: 'Menu', icon: 'apps', link: GRID_MENU_ROUTE, badge: '', moduleKey: '' };\n\n// Reads and writes the signed-in user's own preferences, and resolves them into the shapes the rest of the\n// library consumes. THE SINGLE DOOR to `api/preferences` — nothing else should call those endpoints.\n//\n// 🔑 SCOPE. This is the user-scoped counterpart to ConfigService, which holds the ORGANISATION's configuration.\n// Both are cached app-wide singletons; the difference is only whose settings they are, which is the whole\n// distinction the Preferences page exists to draw.\n@Injectable({ providedIn: 'root' })\nexport class PreferencesService {\n\n // Empty preferences are the correct starting value, not a placeholder: '' in both fields means \"this user has\n // not chosen\", which resolves to exactly the behaviour the estate had before this feature existed. So the\n // library behaves normally from the first frame, before any request completes, and if the read fails.\n private readonly empty: UserPreferences = { userName: '', mobileTabs: '', defaultPage: '' };\n\n private source = new BehaviorSubject<UserPreferences>(this.empty);\n\n // Emits on every load AND every successful save. Chunk C subscribes here so a changed tab set repaints\n // immediately — the owner asked that a user not have to sign in again or refresh to see their choice.\n preferences$ = this.source.asObservable();\n\n private loaded = false;\n\n constructor(private dataService: DataServiceLib, private menuSource: MenuSourceService,\n private authService: AuthService) {\n\n // Added: drop the previous user's preferences the moment a session ends, and re-arm the once-per-session\n // guard. Same hook, and for the same measured reason, as AccountingService's journal-account cache\n // (accounting.service.ts:2318): clearSession calls UpdateToken(''), so an empty emission is the logout\n // signal that both logoff() and sessionExpired() pass through. distinctUntilChanged sits on the RAW token,\n // which is what makes the reset reachable at all — tokenA -> '' -> tokenB is three distinct values where a\n // filter(!!token) pipe would see only tokenA -> tokenB.\n //\n // 🔴 WITHOUT THIS, USER #2 ON A SHARED DEVICE INHERITS USER #1's TABS. `loaded` would still be true and the\n // cached row would still be user #1's, so the tab bar and the landing page would keep obeying a person who\n // has signed out — and the read-time capability filter would NOT catch it, because it tests the pages\n // against the NEW user's role and would happily keep any tab they also have access to.\n this.authService.tokenObserv.pipe(distinctUntilChanged()).subscribe(token => { if (!token) this.reset(); });\n }\n\n // The last known value, synchronously. Safe to read at any time — it is the empty row until a load lands.\n get current(): UserPreferences { return this.source.value; }\n\n // One request per session, shared. Callers that need the value on the very first paint should subscribe to\n // preferences$ rather than waiting on this, because it emits the cached row first.\n load(force: boolean = false): Observable<UserPreferences> {\n if (this.loaded && !force) return of(this.source.value);\n\n return this.dataService.CallApi({ url: 'preferences/get' }).pipe(\n map((response: ApiResponse) => {\n // A failed read must not break the app — it degrades to \"no preferences chosen\", which is the\n // pre-feature behaviour. The page surfaces its own failure; the library just carries on.\n //\n // 🔴 Changed (chunk C): a FAILED read is no longer cached as if it were an answer. It used to set\n // `loaded = true` unconditionally, so the FIRST failure became the value for the rest of the session\n // and no later call would retry. That was not theoretical: measured on 2026-08-31, the resume seam's\n // read raced ahead of the token restore, came back 401, and cached an empty row — after which the\n // user's real preferences were unreachable until a full reload, and the landing page silently behaved\n // as though nothing had ever been chosen. `ok` distinguishes \"the server says this user has no\n // preferences\" (cache it — it is the truth) from \"we could not ask\" (do not).\n const ok = !!response?.success;\n const value = ok && response?.data ? { ...this.empty, ...response.data } as UserPreferences : this.empty;\n return { ok, value };\n }),\n tap(result => { if (result.ok) { this.loaded = true; this.source.next(result.value); } }),\n map(result => result.value)\n );\n }\n\n // Writes the row and republishes it, so every subscriber sees the new value without a reload.\n save(preferences: UserPreferences): Observable<ApiResponse> {\n return this.dataService.CallApi({ url: 'preferences/update', method: 'post' }, preferences).pipe(\n tap((response: ApiResponse) => {\n if (!response?.success) return; // a refused save must NOT publish the rejected value as if it were in force\n this.loaded = true;\n this.source.next({ ...this.source.value, ...preferences });\n })\n );\n }\n\n // Clears the cache so the next load re-reads. Called on sign-out — the next user must never inherit\n // the previous one's tabs on a shared device.\n reset(): void {\n this.loaded = false;\n this.source.next(this.empty);\n }\n\n // ---- RESOLUTION ------------------------------------------------------------------------------------\n // Everything below turns the two stored strings into what a consumer actually needs. Kept here rather than in\n // the consuming components so chunks B and C read the preference through one implementation.\n\n // The user's chosen tabs as BottomTabs, or NULL to mean \"this user has not chosen — use AppConfig.bottomTabs\".\n //\n // 🔴 NULL AND [] ARE DIFFERENT and callers must treat them so. null = no preference, fall back to the app\n // default. [] = a preference was set but NOTHING in it still resolves (every chosen page was retired, or the\n // role lost access to all of them) — which must also fall back, because an empty tab bar is indistinguishable\n // from a broken one. Both cases are handled by the caller doing `resolveMobileTabs() ?? appConfig.bottomTabs`\n // only when the array is non-empty; the helper below does exactly that so no caller has to remember.\n resolveMobileTabs(): BottomTab[] | null {\n const names = this.tabNames();\n if (!names.length) return null;\n\n // 🔴 READ-TIME CAPABILITY FILTER (owner directive, 2026-08-31), and the same rule as resolveDefaultPage above.\n // visibleItems() is the role-, feature- and module-gated menu AS IT STANDS NOW, so a name that is missing from\n // it — access revoked since the preference was saved, module switched off, page retired — resolves to nothing\n // and is dropped from the bar. The stored preference can therefore never re-surface a tab the current role is\n // not allowed to see, no matter what was saved or when. The tabs are NOT rewritten in the database on a\n // failed match: a temporary loss (a module toggled off for a week) must not permanently erase a choice the\n // user made, so the filter is applied on every read and the row is left alone.\n const items = this.menuSource.visibleItems();\n const tabs: BottomTab[] = [];\n\n for (const name of names) {\n // Added (chunk C): the grid menu is choosable as a tab, but it has no CapItem to resolve against — it is a\n // page ABOUT the menu, so it carries no capability of its own. It is EXEMPT from the filter below for the\n // same reason resolveDefaultPage exempts it and the same reason chunk B left its route ungated: a menu OF\n // the menus grants nothing, because every tile inside it is gated individually and already filtered by this\n // very service. So the exemption is not a hole — it is the one entry for which \"which capability opens\n // this\" has no answer, and gating it could only mean a user with a menu cannot reach their menu.\n if (name === GRID_MENU_ROUTE) { tabs.push(GRID_MENU_TAB); continue; }\n\n const cap = items.find(x => x.name === name);\n if (!cap || !cap.link) continue; // dropped by the read-time filter above — revoked, retired, or module off\n\n // The tab inherits the page's CURRENT label, icon and route from the menu definition, which is the whole\n // reason names are stored rather than links: a renamed or moved page follows automatically.\n tabs.push({ name: cap.name, display: cap.display, icon: cap.icon && cap.icon !== 'navigate_next' ? cap.icon : 'dashboard', link: cap.link, badge: '', moduleKey: '' });\n }\n\n // Note (chunk C): a preference resolving to the grid menu ALONE is honoured, not overridden. It looked at\n // first like a degenerate bar worth falling back from, but it is a coherent choice — one cell that opens the\n // whole menu — and the estate's standing rule is that a stored choice may be repaired, never undone. The\n // fallback below fires only when NOTHING resolved, which is a different thing entirely.\n return tabs.length ? tabs : null; // nothing survived — say \"no preference\" so the caller falls back\n }\n\n // The stored names, in order, with blanks dropped. Exposed because the Preferences page needs the raw list\n // (including names that no longer resolve, so it can drop them on the next save rather than hide them).\n tabNames(): string[] {\n return (this.current.mobileTabs || '').split(',').map(x => x.trim()).filter(x => !!x);\n }\n\n // Where a resumed session should land. '' means \"last page I was on\" — the caller keeps its existing\n // LastRouteService behaviour for that value and changes nothing.\n //\n // 🔴 READ-TIME CAPABILITY FILTER, and it is not optional (owner directive, 2026-08-31). A preference is stored\n // once and read forever, so the role that could open a page when it was CHOSEN may not be the role reading it\n // back: capabilities get revoked, a subscription lapses, a tenant module is switched off, a page is retired.\n // Filtering only at pick time would therefore land a demoted user straight onto a page they may no longer open —\n // the stored value would outrank their current role. Every read re-tests against the CURRENT menu, so a\n // preference that has gone out of reach silently degrades to \"last page I was on\" instead of navigating.\n // This mirrors LastRouteService.allowed(), which already re-tests its saved route for exactly this reason.\n resolveDefaultPage(): string {\n const stored = this.current.defaultPage || '';\n if (!stored) return '';\n if (stored === GRID_MENU_ROUTE) return stored; // the grid menu is the menu itself — it gates its own tiles, and is reachable by anyone who has a menu at all\n\n // 🔴 EXACT MATCH, NOT MenuSourceService.matchLink — and the difference is a bug this cost before it was\n // found. matchLink implements LONGEST-LINK-WINS for turning an arbitrary browser URL back into a menu entry,\n // and to do that it deliberately ignores any item whose link is no longer than 'home' (menu-source.service:\n // `x.link.length > 'home'.length`), so that a deep URL is not captured by the catch-all Home row. That rule\n // is right for its job and wrong for this one: the value here is not an arbitrary URL, it is a route the user\n // PICKED from this very list, so the question is simply \"is it still in the list\". Routed through matchLink,\n // a stored 'home' matched nothing and was silently discarded — choosing Home as your landing page appeared to\n // save and then quietly reverted to \"last page I was on\" on the next load. Caught by running the round trip\n // in the browser; every build passed and every unit test passed while it was broken.\n return this.menuSource.visibleItems().some(x => x.link === stored) ? stored : '';\n }\n\n // Added (chunk C): resolveDefaultPage() for the SESSION-RESUME seam, where neither of its two inputs can be\n // assumed to have arrived yet. Returns '' for \"no preference — keep today's last-page behaviour\".\n //\n // 🔴 THIS EXISTS BECAUSE THE SYNCHRONOUS RESOLVER SILENTLY RETURNS '' AT THAT SEAM, and the failure looks\n // exactly like \"the user chose nothing\". Two independent races, both real:\n // 1. THE PREFERENCE ROW. load() is called once from the nav shell — but the nav shell is inside `home`, and\n // the landing decision is made BEFORE anything routes there. So `current` is still the empty row and\n // defaultPage is ''. Chunk A's contract put the resolver at this seam without this await, and taken\n // literally that wiring can never fire.\n // 2. THE ROLE. resolveDefaultPage filters against visibleItems(), which needs the capability map;\n // tryRestoreSession() returns true off hasValidSession() alone and never populates it. An empty role map\n // means an empty menu, which means every stored page fails the filter and degrades to ''.\n // Awaiting both, then calling the ORDINARY resolver, fixes the timing without touching the security rule.\n //\n // 🔑 IT DOES NOT BYPASS THE FILTER — it is the reason the filter can run at all. The capability test still\n // happens in resolveDefaultPage(), the single enforcement point; this method only guarantees that method is\n // asked the question with its inputs present, instead of being asked in the dark and answering \"nothing\".\n async resolveLandingPage(): Promise<string> {\n try {\n // 🔴 HYDRATE THE SESSION FIRST, and this line is load-bearing — without it the read below goes out with no\n // token and comes back 401. MEASURED, not reasoned: on 2026-08-31 the landing seam produced\n // `GET /api/preferences/get => 401` followed by a refresh and a second, successful GET — by which time the\n // landing decision had already been made against an empty row, and the app went to 'home' while the user's\n // stored preference said otherwise. The cause is that tryRestoreSession() returns true off hasValidSession()\n // alone, which only inspects STORAGE and never restores the in-memory token the interceptor sends.\n //\n // checkAuthentication() is the app's OWN hydration routine — the one the auth guard runs on every entry to\n // `home` — so this is not new machinery, it is the existing step performed at the one seam that runs before\n // the guard does. It is idempotent (it re-reads the same storage and republishes the same values) and it\n // resolves the token, the user AND the role map, which is why primeRole below is usually already satisfied\n // and kept only as the fallback for a session shape this misses.\n await this.authService.checkAuthentication();\n await firstValueFrom(this.load());\n await this.menuSource.primeRole();\n } catch { return ''; } // a failed read must never block a sign-in — fall through to the last-page behaviour\n return this.resolveDefaultPage();\n }\n\n // Every page this user could choose, from the SAME menu definition the nav renders — role, subscription\n // feature and tenant module gating all included, because MenuSourceService applies them. Never hand-curated.\n availablePages(): CapItem[] {\n return this.menuSource.visibleItems().filter(x => x.link && x.link.trim() !== '');\n }\n}\n","// Added (login tier, Phase 1): the NgModule for the six components that live in tin-spa/core.\n//\n// WHY THIS MODULE EXISTS. An Angular component may be declared in exactly ONE NgModule, and all six of\n// these were declared in TinSpaModule. The login tier (tin-spa/login) needs them but must NOT import\n// TinSpaModule — importing it would pull the whole primary FESM back in and the tier would shed nothing\n// (the documented \"builds clean and sheds nothing\" shape). So the declarations move here, and TinSpaModule\n// imports + re-exports this module instead. Consumers that import TinSpaModule keep <spa-text>,\n// <spa-text-mask>, <spa-suffix> and the three dialogs exactly as before — the public surface is unchanged.\n//\n// Everything declared here is dependency-light and was measured before being moved: the three dialog\n// templates contain only mat-* elements (zero custom components, zero pipes), and the field components\n// reach no further than <spa-suffix> and runtime/field-placeholder. The closure terminates here, which is\n// what makes the split legal rather than merely desirable.\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { SpaMatModule } from './spa-mat.module';\nimport { TextComponent } from '../components/text/text.component';\nimport { TextMaskComponent } from '../components/text-mask/text-mask.component';\nimport { SuffixComponent } from '../components/suffix/suffix.component';\nimport { messageDialog } from '../components/message/messageDialog.component';\nimport { TermsDialogComponent } from '../components/terms-dialog/terms-dialog.component';\nimport { PrivacyDialogComponent } from '../components/privacy-dialog/privacy-dialog.component';\n\n@NgModule({\n declarations: [\n TextComponent, TextMaskComponent, SuffixComponent,\n messageDialog, TermsDialogComponent, PrivacyDialogComponent,\n ],\n imports: [CommonModule, FormsModule, ReactiveFormsModule, SpaMatModule],\n exports: [\n SpaMatModule,\n TextComponent, TextMaskComponent, SuffixComponent,\n messageDialog, TermsDialogComponent, PrivacyDialogComponent,\n ],\n})\nexport class SpaCoreModule { }\n","// tin-spa/core — the shared spine of the library.\n// Added (login tier, Phase 1): this entry point exists so the login tier (tin-spa/login) can load\n// WITHOUT dragging in the primary FESM. The primary imports it too, so nothing is duplicated:\n// core is one chunk, loaded by whichever of the two tiers the app reaches first.\n\nexport * from './lib/classes/Classes';\nexport * from './lib/classes/DateBounds';\nexport * from './lib/classes/DocumentClasses';\nexport * from './lib/classes/LibClasses';\nexport * from './lib/classes/TinCore';\nexport * from './lib/components/message/messageDialog.component';\nexport * from './lib/components/privacy-dialog/privacy-dialog.component';\nexport * from './lib/components/suffix/suffix.component';\nexport * from './lib/components/terms-dialog/terms-dialog.component';\nexport * from './lib/components/text-mask/text-mask.component';\nexport * from './lib/components/text/text.component';\nexport * from './lib/modules/spa-mat.module';\nexport * from './lib/pages/accounting/receipts/receipt-dialog.component';\nexport * from './lib/runtime/appsettings';\nexport * from './lib/runtime/field-placeholder';\nexport * from './lib/runtime/inline-errors';\nexport * from './lib/runtime/login-tier-http'; // Added (A-0901-17): TIN_LOGIN_TIER_HTTP_PROVIDERS — fills tin-spa/http's fallback token slot\nexport * from './lib/runtime/silent-request';\nexport * from './lib/runtime/tinspa-runtime';\nexport * from './lib/services/accounting.service';\nexport * from './lib/services/api-error.service';\nexport * from './lib/services/auth.service';\nexport * from './lib/services/config.service';\nexport * from './lib/services/datalib.service';\nexport * from './lib/services/general.service';\nexport * from './lib/services/http.service';\nexport * from './lib/services/inventory.service';\nexport * from './lib/services/last-route.service';\nexport * from './lib/services/loans.service';\nexport * from './lib/services/log-redact';\nexport * from './lib/services/log.service';\nexport * from './lib/services/menu-source.service';\nexport * from './lib/services/message.service';\nexport * from './lib/services/notifications.service';\nexport * from './lib/services/offline.service';\nexport * from './lib/services/payroll.service';\nexport * from './lib/services/preferences.service';\nexport * from './lib/services/production.service';\nexport * from './lib/services/purchasing.service';\nexport * from './lib/services/sales.service';\nexport * from './lib/services/setup.service';\nexport * from './lib/services/signalr.service';\nexport * from './lib/services/storage.service';\nexport * from './lib/services/subscription.service';\n\nexport * from './lib/modules/spa-core.module'; // the NgModule that declares the field + dialog components core owns\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4","i1.MessageService","i1.DataServiceLib","i3.StorageService","i4.HttpService","i5.MessageService","i6.LogService","i7.SignalRService","tap","catchError","i1.HttpService","i3.AuthService","i4.OfflineService","i2.DataServiceLib","i3","i5","i6","i7","i5.SuffixComponent","i2.StorageService","i3.DataServiceLib","i2.ApiErrorService","i2.AuthService","i1.AuthService","i3.SetupService","i4.SubscriptionService","i5.StorageService","i2.SignalRService","i3.MessageService","i2.MenuSourceService"],"mappings":"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GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;;AAEnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IA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"}
|