@feedmepos/mf-hrm-portal 2.3.0-dev.8 → 2.3.0-dev.9

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.
Files changed (81) hide show
  1. package/dist/{ApprovalCodeList-D5E_FN3f.js → ApprovalCodeList-BDpxEJpC.js} +2 -2
  2. package/dist/{AuditLogList-CqqiS2xW.js → AuditLogList-Dgwj1gz8.js} +3 -3
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-DC_oQTsP.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-BBK2gl7r.js} +2 -2
  4. package/dist/{EmployeeList-ChMlGxmu.js → EmployeeList-C8cbVcmY.js} +4 -4
  5. package/dist/{GrantUserList-DA26W3K3.js → GrantUserList-zul0_Dlm.js} +3 -3
  6. package/dist/{Main-B27Qx8R2.js → Main-5TsFTFpc.js} +5 -5
  7. package/dist/{Main-C0gVAR92.js → Main-Cjo4FMZZ.js} +2 -2
  8. package/dist/{Main-m39gMG-a.js → Main-DSr9KbjT.js} +9 -9
  9. package/dist/{PermissionSetList-mdA65jmw.js → PermissionSetList-CDhiiu37.js} +5 -5
  10. package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Dp6bdEZp.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DoK944l0.js} +1034 -1034
  11. package/dist/{RoleList-BPayuLxA.js → RoleList-DEbOPQD_.js} +7 -7
  12. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-Cx9jFgBS.js +492 -0
  13. package/dist/ScheduleGeneralPage-B8PWNsc2.js +776 -0
  14. package/dist/{ScheduleModal.vue_vue_type_script_setup_true_lang-ABipaQiR.js → ScheduleModal.vue_vue_type_script_setup_true_lang-V1sZ_xhO.js} +765 -717
  15. package/dist/SchedulePage-ndLByVBl.js +17785 -0
  16. package/dist/{SchedulePositionPage-BUQy-Itg.js → SchedulePositionPage-Cuv4ydOK.js} +22 -22
  17. package/dist/{TeamMemberList-CIlvRlf8.js → TeamMemberList-DpCGqHCk.js} +6 -6
  18. package/dist/{TimesheetList-DFAfhWYG.js → TimesheetList-B7HAC5zS.js} +5 -5
  19. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-QGzHuY7V.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-BGD6m5M-.js} +2 -2
  20. package/dist/{app-C_EW9DFr.js → app-Lh0cqgHy.js} +8 -8
  21. package/dist/app.js +1 -1
  22. package/dist/{dayjs.min-ibysRBBa.js → dayjs.min-joq4stsa.js} +1 -1
  23. package/dist/{employee-B1BQc4gB.js → employee-BPmp9c6i.js} +3 -3
  24. package/dist/{iteration-DQVB-iz0.js → iteration-jvdTHQUx.js} +1 -1
  25. package/dist/{lodash-DOj41a0A.js → lodash-CIAEpr9s.js} +1 -1
  26. package/dist/{role-B9MSLu4B.js → role-Dd1TUMhn.js} +1 -1
  27. package/dist/{rule-e6okoXK6.js → rule-DmxI7qEY.js} +2 -2
  28. package/dist/src/api/schedule/index.d.ts +2 -1
  29. package/dist/src/types/schedule.d.ts +3 -4
  30. package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +0 -8
  31. package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +0 -5
  32. package/dist/src/views/scheduling/components/ScheduleBoardEditOverlays.vue.d.ts +0 -2
  33. package/dist/src/views/scheduling/components/ScheduleBoardEmployeeRows.vue.d.ts +0 -7
  34. package/dist/src/views/scheduling/components/ScheduleBoardInteractionOverlays.vue.d.ts +0 -6
  35. package/dist/src/views/scheduling/components/ScheduleContextMenu.vue.d.ts +1 -5
  36. package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +10 -0
  37. package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +0 -10
  38. package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +12 -8
  39. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +21 -9
  40. package/dist/src/views/scheduling/composables/useScheduleAreaBoard.d.ts +0 -13
  41. package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +2 -8
  42. package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +3 -0
  43. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +29 -4
  44. package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +0 -3
  45. package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +3 -5
  46. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +11 -3
  47. package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +7 -2
  48. package/dist/src/views/scheduling/composables/useScheduleEmployeeAvailability.d.ts +1 -1
  49. package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +1 -0
  50. package/dist/src/views/scheduling/composables/useScheduleEmployeePersistence.d.ts +4 -0
  51. package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +2 -0
  52. package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +2 -0
  53. package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +21 -3
  54. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +99 -22
  55. package/dist/src/views/scheduling/composables/useSchedulePageOverlays.d.ts +0 -4
  56. package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +1 -0
  57. package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +1 -1
  58. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +2 -0
  59. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +24 -4
  60. package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +7 -2
  61. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +12 -2
  62. package/dist/src/views/scheduling/composables/useScheduleShiftDraft.d.ts +1 -0
  63. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +15 -3
  64. package/dist/src/views/scheduling/country-rules/index.d.ts +4 -4
  65. package/dist/src/views/scheduling/data.d.ts +5 -1
  66. package/dist/src/views/scheduling/schedule-state.d.ts +76 -12
  67. package/dist/src/views/scheduling/schedule-store.d.ts +12 -5
  68. package/dist/src/views/scheduling/types.d.ts +22 -5
  69. package/dist/style.css +1 -1
  70. package/dist/tsconfig.app.tsbuildinfo +1 -1
  71. package/dist/{useReportPermissions-CJ9ey1bN.js → useReportPermissions-DM3GOFCC.js} +3 -3
  72. package/package.json +1 -1
  73. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-C_EQivMd.js +0 -470
  74. package/dist/ScheduleGeneralPage-sAqR1-hf.js +0 -666
  75. package/dist/SchedulePage-DhbtCR8U.js +0 -18546
  76. package/dist/src/views/scheduling/components/ScheduleAllShiftsRow.vue.d.ts +0 -22
  77. package/dist/src/views/scheduling/components/ScheduleAssignEmployeePopover.vue.d.ts +0 -6
  78. package/dist/src/views/scheduling/components/ScheduleStackPopover.vue.d.ts +0 -14
  79. package/dist/src/views/scheduling/composables/useScheduleAllShiftsRow.d.ts +0 -77
  80. package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +0 -124
  81. package/dist/src/views/scheduling/composables/useScheduleOpenShiftCard.d.ts +0 -23
@@ -57,8 +57,9 @@ export declare const scheduleState: {
57
57
  headcount: number;
58
58
  }[];
59
59
  settings: {
60
+ settingsConfigured?: boolean | undefined;
60
61
  overtime: {
61
- maxMonthlyHours: number;
62
+ maxHoursPerMonth: number | null;
62
63
  };
63
64
  payRate: {
64
65
  NORMAL: {
@@ -74,6 +75,11 @@ export declare const scheduleState: {
74
75
  };
75
76
  };
76
77
  setupCompleted: boolean;
78
+ workingHours: {
79
+ minHoursPerDay: number | null;
80
+ maxHoursPerDay: number | null;
81
+ maxHoursPerWeek: number | null;
82
+ };
77
83
  };
78
84
  restaurantProfile: {
79
85
  operatingHours: {
@@ -90,10 +96,18 @@ export declare const scheduleState: {
90
96
  name: string;
91
97
  }[];
92
98
  employees: {
99
+ overtime?: {
100
+ maxHoursPerMonth: number | null;
101
+ } | undefined;
102
+ minHoursPerDay?: number | null | undefined;
103
+ workingHours?: {
104
+ minHoursPerDay: number | null;
105
+ maxHoursPerDay: number | null;
106
+ maxHoursPerWeek: number | null;
107
+ } | undefined;
93
108
  name: string;
94
109
  employeeId: string;
95
110
  employmentType: "FULLTIME" | "PARTTIME";
96
- workingHour: number;
97
111
  wage: {
98
112
  type: "HOURLY" | "MONTHLY";
99
113
  amount: number;
@@ -184,8 +198,9 @@ export declare const scheduleState: {
184
198
  headcount: number;
185
199
  }[];
186
200
  settings: {
201
+ settingsConfigured?: boolean | undefined;
187
202
  overtime: {
188
- maxMonthlyHours: number;
203
+ maxHoursPerMonth: number | null;
189
204
  };
190
205
  payRate: {
191
206
  NORMAL: {
@@ -201,6 +216,11 @@ export declare const scheduleState: {
201
216
  };
202
217
  };
203
218
  setupCompleted: boolean;
219
+ workingHours: {
220
+ minHoursPerDay: number | null;
221
+ maxHoursPerDay: number | null;
222
+ maxHoursPerWeek: number | null;
223
+ };
204
224
  };
205
225
  restaurantProfile: {
206
226
  operatingHours: {
@@ -217,10 +237,18 @@ export declare const scheduleState: {
217
237
  name: string;
218
238
  }[];
219
239
  employees: {
240
+ overtime?: {
241
+ maxHoursPerMonth: number | null;
242
+ } | undefined;
243
+ minHoursPerDay?: number | null | undefined;
244
+ workingHours?: {
245
+ minHoursPerDay: number | null;
246
+ maxHoursPerDay: number | null;
247
+ maxHoursPerWeek: number | null;
248
+ } | undefined;
220
249
  name: string;
221
250
  employeeId: string;
222
251
  employmentType: "FULLTIME" | "PARTTIME";
223
- workingHour: number;
224
252
  wage: {
225
253
  type: "HOURLY" | "MONTHLY";
226
254
  amount: number;
@@ -344,13 +372,17 @@ export declare const scheduleState: {
344
372
  overtime: number;
345
373
  };
346
374
  };
347
- otAfterDaily: number;
348
375
  salesForecast: number;
349
376
  closedWeekdays: number[];
350
377
  labourTarget: number;
351
378
  budgetFromSales: boolean;
352
379
  budget: number;
353
- otCapHours: number;
380
+ otCapHours: number | null;
381
+ workingHours: {
382
+ minHoursPerDay: number | null;
383
+ maxHoursPerDay: number | null;
384
+ maxHoursPerWeek: number | null;
385
+ };
354
386
  otBudget: number;
355
387
  notify: {
356
388
  waConnected: boolean;
@@ -413,8 +445,9 @@ export declare const payload: import("vue").ShallowRef<{
413
445
  headcount: number;
414
446
  }[];
415
447
  settings: {
448
+ settingsConfigured?: boolean | undefined;
416
449
  overtime: {
417
- maxMonthlyHours: number;
450
+ maxHoursPerMonth: number | null;
418
451
  };
419
452
  payRate: {
420
453
  NORMAL: {
@@ -430,6 +463,11 @@ export declare const payload: import("vue").ShallowRef<{
430
463
  };
431
464
  };
432
465
  setupCompleted: boolean;
466
+ workingHours: {
467
+ minHoursPerDay: number | null;
468
+ maxHoursPerDay: number | null;
469
+ maxHoursPerWeek: number | null;
470
+ };
433
471
  };
434
472
  restaurantProfile: {
435
473
  operatingHours: {
@@ -446,10 +484,18 @@ export declare const payload: import("vue").ShallowRef<{
446
484
  name: string;
447
485
  }[];
448
486
  employees: {
487
+ overtime?: {
488
+ maxHoursPerMonth: number | null;
489
+ } | undefined;
490
+ minHoursPerDay?: number | null | undefined;
491
+ workingHours?: {
492
+ minHoursPerDay: number | null;
493
+ maxHoursPerDay: number | null;
494
+ maxHoursPerWeek: number | null;
495
+ } | undefined;
449
496
  name: string;
450
497
  employeeId: string;
451
498
  employmentType: "FULLTIME" | "PARTTIME";
452
- workingHour: number;
453
499
  wage: {
454
500
  type: "HOURLY" | "MONTHLY";
455
501
  amount: number;
@@ -540,8 +586,9 @@ export declare const payload: import("vue").ShallowRef<{
540
586
  headcount: number;
541
587
  }[];
542
588
  settings: {
589
+ settingsConfigured?: boolean | undefined;
543
590
  overtime: {
544
- maxMonthlyHours: number;
591
+ maxHoursPerMonth: number | null;
545
592
  };
546
593
  payRate: {
547
594
  NORMAL: {
@@ -557,6 +604,11 @@ export declare const payload: import("vue").ShallowRef<{
557
604
  };
558
605
  };
559
606
  setupCompleted: boolean;
607
+ workingHours: {
608
+ minHoursPerDay: number | null;
609
+ maxHoursPerDay: number | null;
610
+ maxHoursPerWeek: number | null;
611
+ };
560
612
  };
561
613
  restaurantProfile: {
562
614
  operatingHours: {
@@ -573,10 +625,18 @@ export declare const payload: import("vue").ShallowRef<{
573
625
  name: string;
574
626
  }[];
575
627
  employees: {
628
+ overtime?: {
629
+ maxHoursPerMonth: number | null;
630
+ } | undefined;
631
+ minHoursPerDay?: number | null | undefined;
632
+ workingHours?: {
633
+ minHoursPerDay: number | null;
634
+ maxHoursPerDay: number | null;
635
+ maxHoursPerWeek: number | null;
636
+ } | undefined;
576
637
  name: string;
577
638
  employeeId: string;
578
639
  employmentType: "FULLTIME" | "PARTTIME";
579
- workingHour: number;
580
640
  wage: {
581
641
  type: "HOURLY" | "MONTHLY";
582
642
  amount: number;
@@ -678,13 +738,17 @@ export declare const payload: import("vue").ShallowRef<{
678
738
  overtime: number;
679
739
  };
680
740
  };
681
- otAfterDaily: number;
682
741
  salesForecast: number;
683
742
  closedWeekdays: number[];
684
743
  labourTarget: number;
685
744
  budgetFromSales: boolean;
686
745
  budget: number;
687
- otCapHours: number;
746
+ otCapHours: number | null;
747
+ workingHours: {
748
+ minHoursPerDay: number | null;
749
+ maxHoursPerDay: number | null;
750
+ maxHoursPerWeek: number | null;
751
+ };
688
752
  otBudget: number;
689
753
  notify: {
690
754
  waConnected: boolean;
@@ -1,6 +1,6 @@
1
1
  import ScheduleAPI from '@/api/schedule';
2
2
  import type { IFdtoPosUserSummary } from '@/types/employee';
3
- import type { FdtoScheduleAssignment, FdtoScheduleAutoScheduleApplyReq, FdtoScheduleAutoScheduleApplyResult, FdtoScheduleAutoScheduleCapabilities, FdtoScheduleAutoScheduleGenerateReq, FdtoScheduleAutoScheduleResult, FdtoScheduleBulkUpdateAssignmentStatusReq, FdtoScheduleCreateEmployeeProfileReq, FdtoScheduleSaveAssignmentReq, FdtoScheduleSavePositionReq, FdtoScheduleSaveScheduleDayReq, FdtoScheduleUpdateEmployeeProfileReq, FdtoScheduleCreateTimeOffReq, FdtoScheduleTimeOff, FdtoScheduleUpdateTimeOffStatusReq, FdtoScheduleSaveEmployeeConfigsReq, ScheduleReplaceDemandReq } from '@/types/schedule';
3
+ import type { FdtoScheduleAssignment, FdtoScheduleAutoScheduleApplyReq, FdtoScheduleAutoScheduleApplyResult, FdtoScheduleAutoScheduleCapabilities, FdtoScheduleAutoScheduleGenerateReq, FdtoScheduleAutoScheduleResult, FdtoScheduleBulkUpdateAssignmentStatusReq, FdtoScheduleCreateEmployeeProfileReq, FdtoScheduleSaveAssignmentReq, FdtoScheduleSavePositionReq, FdtoScheduleSaveScheduleDayReq, FdtoScheduleUpdateEmployeeProfileReq, FdtoScheduleValidatePosAccessReq, FdtoScheduleCreateTimeOffReq, FdtoScheduleTimeOff, FdtoScheduleUpdateTimeOffStatusReq, FdtoScheduleSaveEmployeeConfigsReq, ScheduleReplaceDemandReq } from '@/types/schedule';
4
4
  import { isoDateKey } from './composables/schedule-calendar';
5
5
  export { businessEmployees, dataVersion, employeeOutletIds, loadError, loading, outletId, payload, restaurantEmployees, employeeConfigs, rosterLoading, scheduleSetupCompleted, } from './schedule-state';
6
6
  /** dayjs-free local-date key — the board's own isoDateKey, repeated here so the store does not
@@ -35,6 +35,14 @@ export declare function addEmployeeToOutlets(employeeId: string, restaurantIds:
35
35
  export declare function removeEmployeeFromOutlets(employeeId: string, restaurantIds: string[]): Promise<void>;
36
36
  /** Takes a POS user off this outlet's roster only. */
37
37
  export declare function removeEmployeeFromOutlet(employeeId: string): Promise<void>;
38
+ /** Sets the POS role each of these outlets grants a user — every other outlet on their roster
39
+ * is untouched. An empty roleId means "linked to this outlet, no role assigned" (the same thing
40
+ * `addEmployeeToOutlets`' default gives), not "remove them from it" — use
41
+ * `removeEmployeeFromOutlets` for that. A duplicate restaurantId keeps only the last entry. */
42
+ export declare function setEmployeePosRoles(employeeId: string, assignments: {
43
+ restaurantId: string;
44
+ roleId: string;
45
+ }[]): Promise<void>;
38
46
  /** The cached business roster, fetched on first use. `force` re-reads it (after a write, or to
39
47
  * refresh a list that is already on screen). Concurrent callers share one request. */
40
48
  export declare function ensureBusinessEmployees(force?: boolean): Promise<IFdtoPosUserSummary[]>;
@@ -54,6 +62,7 @@ export declare function reload(): Promise<void>;
54
62
  * Throws on failure (a duplicate profile, a network error) — the caller decides how to show
55
63
  * that, this just doesn't pretend it succeeded. */
56
64
  export declare function createEmployeeProfile(req: FdtoScheduleCreateEmployeeProfileReq): Promise<void>;
65
+ export declare function validateSchedulePosAccess(req: FdtoScheduleValidatePosAccessReq): Promise<void>;
57
66
  /** Edits a profile already on this outlet's schedule. The caller (useScheduleAddEmployee's
58
67
  * `updateExisting`) applies the form to the live `Employee` object itself for instant feedback,
59
68
  * so this does not bump `dataVersion` — nothing needs a board cache rebuild. The raw payload is
@@ -77,16 +86,14 @@ export declare function deletePosition(id: string): Promise<void>;
77
86
  * to land there for that seed to stay correct — without a `dataVersion` bump, which would
78
87
  * invalidate the per-week employee cache and risk reverting an unsaved shift. */
79
88
  export declare function saveScheduleDay(date: string, req: FdtoScheduleSaveScheduleDayReq): Promise<void>;
80
- /** Replaces one date/weekday's UI demand by expanding every period into flat ShiftDemand rows.
89
+ /** Replaces one date's UI demand by expanding every period into flat ShiftDemand rows.
81
90
  * Position-specific headcount becomes its own row; any remaining headcount becomes an
82
91
  * unpositioned row for the same time range. */
83
92
  export declare function saveDemand(req: ScheduleReplaceDemandReq): Promise<void>;
84
93
  export declare function saveDemandsBulk(requests: ScheduleReplaceDemandReq[]): Promise<void>;
85
94
  /** Copies one date's own demand rows onto another date, as that date's own rows. A date that
86
95
  * already has demand of its own is left alone (nothing is overwritten), and a source date with
87
- * none has nothing to copy: the standing weekday rule already covers the same weekday in every
88
- * week, so repeating it per date would only shadow later edits to the rule. Returns how many rows
89
- * were written. */
96
+ * no explicit rows has nothing to copy. Returns how many rows were written. */
90
97
  export declare function copyDateDemand(fromDate: string, toDate: string): Promise<number>;
91
98
  export declare function generateAutoSchedule(req: FdtoScheduleAutoScheduleGenerateReq): Promise<FdtoScheduleAutoScheduleResult>;
92
99
  export declare function getAutoScheduleCapabilities(): Promise<FdtoScheduleAutoScheduleCapabilities>;
@@ -8,6 +8,8 @@ export interface WorkSlot {
8
8
  start: string;
9
9
  end: string;
10
10
  role: string;
11
+ /** The persisted position identity, retained even when the position is soft-deleted. */
12
+ positionId?: string;
11
13
  status: ShiftStatus;
12
14
  clock?: ShiftClock;
13
15
  conflict?: boolean;
@@ -98,11 +100,13 @@ export interface Employee {
98
100
  /** Full-time-equivalent percentage, e.g. 100 for a full-timer, 60 for 0.6 FTE. */
99
101
  pct: number;
100
102
  /** Hours per week this person is contracted to, as agreed with them. Per-person rather than
101
- * a venue default: ScheduleSettings holds pay rates only, and EmployeeProfiles.workingHour
103
+ * a venue default: ScheduleSettings holds pay rates and employee-hour defaults, and EmployeeProfiles.workingHours
102
104
  * is where the figure is actually stated. Undefined means nobody has agreed one. */
103
105
  contractHours?: number;
104
106
  rate: number;
105
107
  positions: string[];
108
+ /** Position references that remain on the employee profile but are no longer active in the catalogue. */
109
+ archivedPositions?: string[];
106
110
  /** One entry per visible day of the horizon; null = day off. */
107
111
  shifts: DaySlot[];
108
112
  remarks: EmployeeRemark[];
@@ -117,11 +121,18 @@ export interface Employee {
117
121
  * hourly figure derived from this and is what the grid actually costs shifts with. */
118
122
  payAmount?: number;
119
123
  maxHours?: number;
120
- maxOtHours?: number;
121
124
  /** Shortest shift, in hours, this person will come in for. Asking for less is allowed but
122
125
  * warned about in the shift popover. */
123
126
  minHours?: number;
124
- otAfterDaily?: number;
127
+ minHoursPerDay?: number;
128
+ workingHours?: {
129
+ minHoursPerDay: number | null;
130
+ maxHoursPerDay: number | null;
131
+ maxHoursPerWeek: number | null;
132
+ };
133
+ overtime?: {
134
+ maxHoursPerMonth: number | null;
135
+ };
125
136
  preferences?: string[];
126
137
  seniority?: 'senior' | 'junior' | '';
127
138
  /** Recurring days off (full-timer) or days available (part-timer) — see
@@ -200,7 +211,6 @@ export interface ScheduleRules {
200
211
  end: string;
201
212
  }>[];
202
213
  payRate: PayRate;
203
- otAfterDaily: number;
204
214
  /** Weekly sales forecast (RM) — the stats row's editable input and the figure the
205
215
  * per-day forecast curve distributes across the week. */
206
216
  salesForecast: number;
@@ -215,7 +225,12 @@ export interface ScheduleRules {
215
225
  /** Weekly labour cap (RM), editable directly when budgetFromSales is false. */
216
226
  budget: number;
217
227
  /** Monthly OT cap (hours) — Settings page "Overtime" tab. */
218
- otCapHours: number;
228
+ otCapHours: number | null;
229
+ workingHours: {
230
+ minHoursPerDay: number | null;
231
+ maxHoursPerDay: number | null;
232
+ maxHoursPerWeek: number | null;
233
+ };
219
234
  /** Monthly OT budget (RM), advisory only. */
220
235
  otBudget: number;
221
236
  notify: {
@@ -290,6 +305,8 @@ export interface ScheduleDayNote {
290
305
  * "any position" remainder, which is derived and never stored. */
291
306
  export interface DemandRole {
292
307
  position: string;
308
+ /** Persisted position identity; the name is only the display label. */
309
+ positionId?: string;
293
310
  n: number;
294
311
  }
295
312
  /** A stretch of a day and how many people the floor needs across it. Deliberately not a shift: