@feedmepos/mf-hrm-portal 2.3.0-dev.7 → 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 (88) hide show
  1. package/dist/{ApprovalCodeList-J-NC4Z5M.js → ApprovalCodeList-BDpxEJpC.js} +5 -5
  2. package/dist/{AuditLogList-B1Sb8HDk.js → AuditLogList-Dgwj1gz8.js} +4 -4
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-BlXgJvsO.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-BBK2gl7r.js} +2 -2
  4. package/dist/{EmployeeList-DprCwGC9.js → EmployeeList-C8cbVcmY.js} +6 -6
  5. package/dist/{GrantUserList-BWeZAzUC.js → GrantUserList-zul0_Dlm.js} +6 -6
  6. package/dist/{Main-Dna6CkrV.js → Main-5TsFTFpc.js} +8 -8
  7. package/dist/{Main-BZCIlbf3.js → Main-Cjo4FMZZ.js} +5 -5
  8. package/dist/{Main-CGlnX97k.js → Main-DSr9KbjT.js} +11 -11
  9. package/dist/{PermissionSetList-DuJjihft.js → PermissionSetList-CDhiiu37.js} +7 -7
  10. package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-RI8tMDoe.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DoK944l0.js} +971 -971
  11. package/dist/{PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-fe-Rdwn4.js → PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-BVz6q3HE.js} +1 -1
  12. package/dist/{RoleList-Jn8EeYqo.js → RoleList-DEbOPQD_.js} +9 -9
  13. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-Cx9jFgBS.js +492 -0
  14. package/dist/ScheduleGeneralPage-B8PWNsc2.js +776 -0
  15. package/dist/{ScheduleModal.vue_vue_type_script_setup_true_lang-DLpFG65j.js → ScheduleModal.vue_vue_type_script_setup_true_lang-V1sZ_xhO.js} +858 -793
  16. package/dist/SchedulePage-ndLByVBl.js +17785 -0
  17. package/dist/{SchedulePositionPage-B7S3G8gO.js → SchedulePositionPage-Cuv4ydOK.js} +18 -18
  18. package/dist/{TeamMemberList-Bx_I5hO6.js → TeamMemberList-DpCGqHCk.js} +10 -10
  19. package/dist/{TimesheetList-DjDoOqih.js → TimesheetList-B7HAC5zS.js} +7 -7
  20. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-pRgaW5ro.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-BGD6m5M-.js} +3 -3
  21. package/dist/{app-uVAVK4Qd.js → app-Lh0cqgHy.js} +20 -20
  22. package/dist/app.js +1 -1
  23. package/dist/{approval-code-C9DmR4Md.js → approval-code-DHsUgc4K.js} +1 -1
  24. package/dist/{dayjs.min-CdEA8bsz.js → dayjs.min-joq4stsa.js} +1 -1
  25. package/dist/{employee-mq8mZRLE.js → employee-BPmp9c6i.js} +4 -4
  26. package/dist/{grant-user-Bv-pJ9Wt.js → grant-user-qzKHFTro.js} +1 -1
  27. package/dist/{iteration-B5TN8t9O.js → iteration-jvdTHQUx.js} +1 -1
  28. package/dist/{lodash-DxYGKySa.js → lodash-CIAEpr9s.js} +1 -1
  29. package/dist/{restaurant-D7PEQjPY.js → restaurant-BbYRA_IT.js} +4 -3
  30. package/dist/{role-DiyMdYM9.js → role-Dd1TUMhn.js} +2 -2
  31. package/dist/{rule-BGlU-EJ_.js → rule-DmxI7qEY.js} +3 -3
  32. package/dist/src/api/schedule/index.d.ts +4 -1
  33. package/dist/src/types/schedule.d.ts +3 -4
  34. package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +0 -8
  35. package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +0 -5
  36. package/dist/src/views/scheduling/components/ScheduleBoardEditOverlays.vue.d.ts +0 -2
  37. package/dist/src/views/scheduling/components/ScheduleBoardEmployeeRows.vue.d.ts +0 -7
  38. package/dist/src/views/scheduling/components/ScheduleBoardInteractionOverlays.vue.d.ts +0 -6
  39. package/dist/src/views/scheduling/components/ScheduleContextMenu.vue.d.ts +1 -5
  40. package/dist/src/views/scheduling/components/{ScheduleAssignEmployeePopover.vue.d.ts → ScheduleOnboardingAssignPositionModal.vue.d.ts} +2 -2
  41. package/dist/src/views/scheduling/components/SchedulePublishShareArt.vue.d.ts +2 -0
  42. package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +10 -0
  43. package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +0 -10
  44. package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +12 -8
  45. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +21 -9
  46. package/dist/src/views/scheduling/composables/useScheduleAreaBoard.d.ts +0 -13
  47. package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +2 -8
  48. package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +3 -0
  49. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +29 -4
  50. package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +0 -3
  51. package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +3 -5
  52. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +6 -3
  53. package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +7 -2
  54. package/dist/src/views/scheduling/composables/useScheduleEmployeeAvailability.d.ts +1 -1
  55. package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +1 -0
  56. package/dist/src/views/scheduling/composables/useScheduleEmployeePersistence.d.ts +4 -0
  57. package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +2 -0
  58. package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +2 -0
  59. package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +21 -3
  60. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +223 -21
  61. package/dist/src/views/scheduling/composables/useSchedulePageOverlays.d.ts +0 -4
  62. package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +1 -0
  63. package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +1 -1
  64. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +2 -0
  65. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +24 -4
  66. package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +7 -2
  67. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +12 -2
  68. package/dist/src/views/scheduling/composables/useScheduleShiftDraft.d.ts +1 -0
  69. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +15 -3
  70. package/dist/src/views/scheduling/country-rules/index.d.ts +4 -4
  71. package/dist/src/views/scheduling/data.d.ts +5 -1
  72. package/dist/src/views/scheduling/schedule-state.d.ts +76 -12
  73. package/dist/src/views/scheduling/schedule-store.d.ts +13 -5
  74. package/dist/src/views/scheduling/types.d.ts +22 -5
  75. package/dist/style.css +1 -1
  76. package/dist/tsconfig.app.tsbuildinfo +1 -1
  77. package/dist/{useAppStore-d_nHyK5u.js → useAppStore-BoLkvkE2.js} +1 -1
  78. package/dist/{useLoading-JFoghhRz.js → useLoading-Ch1AUYT1.js} +1 -1
  79. package/dist/{useReportPermissions-CV0b4SBk.js → useReportPermissions-DM3GOFCC.js} +3 -3
  80. package/package.json +1 -1
  81. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-CV0DRK1L.js +0 -470
  82. package/dist/ScheduleGeneralPage-DMMqTMQs.js +0 -666
  83. package/dist/SchedulePage-3MWnazgL.js +0 -18251
  84. package/dist/src/views/scheduling/components/ScheduleAllShiftsRow.vue.d.ts +0 -22
  85. package/dist/src/views/scheduling/components/ScheduleStackPopover.vue.d.ts +0 -14
  86. package/dist/src/views/scheduling/composables/useScheduleAllShiftsRow.d.ts +0 -77
  87. package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +0 -124
  88. package/dist/src/views/scheduling/composables/useScheduleOpenShiftCard.d.ts +0 -23
@@ -2,15 +2,11 @@ import type { Proposal } from '../types';
2
2
  import type { ScheduleBoardApi } from '../composables/useScheduleBoard';
3
3
  import type { ScheduleDragDropApi } from '../composables/useScheduleDragDrop';
4
4
  import type { ScheduleRosterApi } from '../composables/useScheduleRoster';
5
- import type { ScheduleOpenShiftCardApi } from '../composables/useScheduleOpenShiftCard';
6
- import type { ScheduleAllShiftsRowApi } from '../composables/useScheduleAllShiftsRow';
7
5
  import type { ScheduleDemandRowApi } from '../composables/useScheduleDemandRow';
8
6
  type __VLS_Props = {
9
7
  board: ScheduleBoardApi;
10
8
  dragDrop: ScheduleDragDropApi;
11
9
  roster: ScheduleRosterApi;
12
- openShiftCard: ScheduleOpenShiftCardApi;
13
- allShiftsRow: ScheduleAllShiftsRowApi;
14
10
  demandRow: ScheduleDemandRowApi;
15
11
  proposalAt?: (empId: number, dayIdx: number) => Proposal | undefined;
16
12
  };
@@ -23,9 +19,6 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
23
19
  toggleProposal: (id: number) => any;
24
20
  proposalDragStart: (id: number, ev: DragEvent) => any;
25
21
  proposalDragEnd: () => any;
26
- openAssign: (openId: number) => any;
27
- openOpenShiftMenu: (openId: number, anchor: HTMLElement) => any;
28
- addOpenShift: (dayIdx: number) => any;
29
22
  segEnter: (dayIdx: number, from: number, to: number, anchor: HTMLElement) => any;
30
23
  segLeave: () => any;
31
24
  segClick: (dayIdx: number, from: number, to: number, anchor: HTMLElement) => any;
@@ -44,9 +37,6 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
44
37
  onToggleProposal?: ((id: number) => any) | undefined;
45
38
  onProposalDragStart?: ((id: number, ev: DragEvent) => any) | undefined;
46
39
  onProposalDragEnd?: (() => any) | undefined;
47
- onOpenAssign?: ((openId: number) => any) | undefined;
48
- onOpenOpenShiftMenu?: ((openId: number, anchor: HTMLElement) => any) | undefined;
49
- onAddOpenShift?: ((dayIdx: number) => any) | undefined;
50
40
  onSegEnter?: ((dayIdx: number, from: number, to: number, anchor: HTMLElement) => any) | undefined;
51
41
  onSegLeave?: (() => any) | undefined;
52
42
  onSegClick?: ((dayIdx: number, from: number, to: number, anchor: HTMLElement) => any) | undefined;
@@ -11,12 +11,12 @@ export interface ScheduleAddEmployeeForm {
11
11
  payBasis: 'hourly' | 'monthly';
12
12
  payAmount: string;
13
13
  maxHours: string;
14
+ maxHoursPerDay: string;
14
15
  minHours: string;
15
- /** Overtime is opt-in: off is "no rule", not "zero overtime" — a 0 sitting in the fields
16
- * below by default would read as "every hour is overtime", the opposite of unset. */
17
- otEnabled: boolean;
18
- otAfterDaily: string;
19
- maxOtHours: string;
16
+ workingHoursEnabled: boolean;
17
+ overtimeEnabled: boolean;
18
+ /** Blank means no employee override; the outlet overtime setting is inherited. */
19
+ maxHoursPerMonth: string;
20
20
  /** For a part-timer: days they CAN work. For a full-timer: days they're OFF — the
21
21
  * mockup inverts the same array's meaning by employment type. */
22
22
  availDays: boolean[];
@@ -31,9 +31,13 @@ export interface ScheduleAddEmployeeForm {
31
31
  masterCode: string;
32
32
  /** Gates the fields below it — someone can be fully scheduled with this off. */
33
33
  posAccessEnabled: boolean;
34
- /** WHAT the passcode opens the till as, at this outlet — the one this person is being added
35
- * to. The outlet itself isn't a choice here: this wizard is already scoped to it. */
36
- posRoleId: string;
34
+ /** WHAT the passcode opens the till as, and WHERE — a row per outlet. Not restricted to the
35
+ * outlets picked in Work locations above: a floating manager can be rostered at one outlet
36
+ * and hold POS admin at several others. */
37
+ posRoles: {
38
+ outlet: string;
39
+ roleId: string;
40
+ }[];
37
41
  }
38
42
  /** A salaried month, for converting a monthly figure into the hourly one the cost rail
39
43
  * actually reads. Ported verbatim from the mockup's MONTH_HOURS. */
@@ -21,10 +21,11 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
21
21
  payBasis: "hourly" | "monthly";
22
22
  payAmount: string;
23
23
  maxHours: string;
24
+ maxHoursPerDay: string;
24
25
  minHours: string;
25
- otEnabled: boolean;
26
- otAfterDaily: string;
27
- maxOtHours: string;
26
+ workingHoursEnabled: boolean;
27
+ overtimeEnabled: boolean;
28
+ maxHoursPerMonth: string;
28
29
  availDays: boolean[];
29
30
  availHours: {
30
31
  from: string;
@@ -38,7 +39,10 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
38
39
  masterUser: boolean;
39
40
  masterCode: string;
40
41
  posAccessEnabled: boolean;
41
- posRoleId: string;
42
+ posRoles: {
43
+ outlet: string;
44
+ roleId: string;
45
+ }[];
42
46
  };
43
47
  sectionId: import("vue").Ref<string, string>;
44
48
  isEditing: import("vue").ComputedRef<boolean>;
@@ -50,9 +54,11 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
50
54
  dayLit: (index: number) => boolean;
51
55
  avLabel: import("vue").ComputedRef<"Weekly availability" | "Time off days">;
52
56
  avAllLabel: import("vue").ComputedRef<"Clear all" | "Select all" | "No days off" | "Every day off">;
53
- maxHoursPlaceholder: import("vue").ComputedRef<"Hours per week" | "No cap">;
54
- otAfterDailyPlaceholder: import("vue").ComputedRef<string>;
55
- toggleOt: () => void;
57
+ maxHoursPlaceholder: import("vue").ComputedRef<string>;
58
+ minHoursPlaceholder: import("vue").ComputedRef<string>;
59
+ maxHoursPerDayPlaceholder: import("vue").ComputedRef<string>;
60
+ maxHoursPerMonthPlaceholder: import("vue").ComputedRef<string>;
61
+ toggleOvertime: () => void;
56
62
  payUnit: import("vue").ComputedRef<"/month" | "/hour">;
57
63
  effectiveRate: import("vue").ComputedRef<number>;
58
64
  passcodeValue: import("vue").ComputedRef<string>;
@@ -67,6 +73,7 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
67
73
  payLine: import("vue").ComputedRef<string>;
68
74
  nameError: import("vue").ComputedRef<boolean>;
69
75
  passError: import("vue").ComputedRef<boolean>;
76
+ posRolesError: import("vue").ComputedRef<boolean>;
70
77
  availabilityError: import("vue").ComputedRef<boolean>;
71
78
  saving: import("vue").Ref<boolean, boolean>;
72
79
  saveError: import("vue").Ref<string | null, string | null>;
@@ -95,8 +102,13 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
95
102
  setPasscodeDigit: (index: number, value: string) => void;
96
103
  generatePasscode: () => void;
97
104
  togglePosAccess: () => void;
98
- setPosRole: (roleId: string) => void;
99
- posRoleOptions: import("vue").ComputedRef<import("../../../types/role").Role[]>;
105
+ addPosRoleRow: () => void;
106
+ removePosRoleRow: (index: number) => void;
107
+ isCurrentOutletRow: (index: number) => boolean;
108
+ setPosRoleOutlet: (index: number, outlet: string) => void;
109
+ setPosRoleId: (index: number, roleId: string) => void;
110
+ posRoleOptionsFor: (outlet: string) => import("../../../types/role").Role[];
111
+ posRolesHint: import("vue").ComputedRef<"" | "No outlet assigned, so their passcode will not open a till yet." | "The same outlet is listed twice — only the last role on it will apply.">;
100
112
  create: () => Promise<boolean>;
101
113
  };
102
114
  export type ScheduleAddEmployeeApi = ReturnType<typeof useScheduleAddEmployee>;
@@ -37,19 +37,6 @@ export declare function qualifiedFor(emp: Employee, position: string): boolean;
37
37
  export declare function useScheduleAreaBoard(board: ScheduleBoardApi): {
38
38
  positionRows: import("vue").ComputedRef<string[]>;
39
39
  assignedOn: (dayIdx: number, position: string) => ScheduleAssignedSlot[];
40
- unfilledOpenShiftsOn: (dayIdx: number, position: string) => {
41
- id: number;
42
- dayIdx: number;
43
- position: string;
44
- required: number;
45
- filledBy: number | null;
46
- sen?: "junior" | "senior" | undefined;
47
- empType?: "full" | "part" | undefined;
48
- name?: string | undefined;
49
- start: string;
50
- end: string;
51
- breakMins?: number | undefined;
52
- }[];
53
40
  poolFor: (position: string) => Employee[];
54
41
  cellMeta: (dayIdx: number, position: string) => SchedulePositionCellMeta;
55
42
  positionWeekMeta: (position: string) => {
@@ -1,12 +1,6 @@
1
1
  import type { ScheduleBoardApi } from './useScheduleBoard';
2
- import type { ScheduleAreaBoardApi } from './useScheduleAreaBoard';
3
- /** Dragging a person from the staff rail onto a position/day cell — ported from the mockup's
4
- * dropStaffOnCell(), scoped to this board's model (no "unspecialised, so ask what they can
5
- * do" grant flow, no split shifts): dropping fills an existing open shift for that position/day
6
- * if there is one, otherwise opens the shift editor pre-filled with this person, day and
7
- * position so the manager sets the hours. */
8
- export declare function useScheduleAreaDragDrop(board: ScheduleBoardApi, areaBoard: ScheduleAreaBoardApi, handlers: {
9
- onFillOpenShift: (openId: number, empId: number) => void;
2
+ /** Dragging a person from the staff rail onto a position/day cell opens a normal assigned shift. */
3
+ export declare function useScheduleAreaDragDrop(board: ScheduleBoardApi, handlers: {
10
4
  onCreateShift: (empId: number, dayIdx: number, position: string) => void;
11
5
  onNotQualified: (empName: string, position: string) => void;
12
6
  }): {
@@ -57,6 +57,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
57
57
  occupied: number;
58
58
  notQualified: number;
59
59
  weeklyCap: number;
60
+ dailyCap: number;
60
61
  rest: number;
61
62
  dayOff: number;
62
63
  dayCap: number;
@@ -121,6 +122,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
121
122
  occupied: number;
122
123
  notQualified: number;
123
124
  weeklyCap: number;
125
+ dailyCap: number;
124
126
  rest: number;
125
127
  dayOff: number;
126
128
  dayCap: number;
@@ -185,6 +187,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
185
187
  occupied: number;
186
188
  notQualified: number;
187
189
  weeklyCap: number;
190
+ dailyCap: number;
188
191
  rest: number;
189
192
  dayOff: number;
190
193
  dayCap: number;
@@ -33,10 +33,12 @@ export declare function useScheduleBoard(handlers?: {
33
33
  contractHours?: number | undefined;
34
34
  rate: number;
35
35
  positions: string[];
36
+ archivedPositions?: string[] | undefined;
36
37
  shifts: ({
37
38
  start: string;
38
39
  end: string;
39
40
  role: string;
41
+ positionId?: string | undefined;
40
42
  status: import("../types").ShiftStatus;
41
43
  clock?: {
42
44
  in: string | null;
@@ -85,6 +87,7 @@ export declare function useScheduleBoard(handlers?: {
85
87
  start: string;
86
88
  end: string;
87
89
  role: string;
90
+ positionId?: string | undefined;
88
91
  status: import("../types").ShiftStatus;
89
92
  clock?: {
90
93
  in: string | null;
@@ -123,9 +126,16 @@ export declare function useScheduleBoard(handlers?: {
123
126
  payBasis?: "hourly" | "monthly" | undefined;
124
127
  payAmount?: number | undefined;
125
128
  maxHours?: number | undefined;
126
- maxOtHours?: number | undefined;
127
129
  minHours?: number | undefined;
128
- otAfterDaily?: number | undefined;
130
+ minHoursPerDay?: number | undefined;
131
+ workingHours?: {
132
+ minHoursPerDay: number | null;
133
+ maxHoursPerDay: number | null;
134
+ maxHoursPerWeek: number | null;
135
+ } | undefined;
136
+ overtime?: {
137
+ maxHoursPerMonth: number | null;
138
+ } | undefined;
129
139
  preferences?: string[] | undefined;
130
140
  seniority?: "senior" | "junior" | "" | undefined;
131
141
  availDays?: boolean[] | undefined;
@@ -148,10 +158,12 @@ export declare function useScheduleBoard(handlers?: {
148
158
  contractHours?: number | undefined;
149
159
  rate: number;
150
160
  positions: string[];
161
+ archivedPositions?: string[] | undefined;
151
162
  shifts: ({
152
163
  start: string;
153
164
  end: string;
154
165
  role: string;
166
+ positionId?: string | undefined;
155
167
  status: import("../types").ShiftStatus;
156
168
  clock?: {
157
169
  in: string | null;
@@ -200,6 +212,7 @@ export declare function useScheduleBoard(handlers?: {
200
212
  start: string;
201
213
  end: string;
202
214
  role: string;
215
+ positionId?: string | undefined;
203
216
  status: import("../types").ShiftStatus;
204
217
  clock?: {
205
218
  in: string | null;
@@ -238,9 +251,16 @@ export declare function useScheduleBoard(handlers?: {
238
251
  payBasis?: "hourly" | "monthly" | undefined;
239
252
  payAmount?: number | undefined;
240
253
  maxHours?: number | undefined;
241
- maxOtHours?: number | undefined;
242
254
  minHours?: number | undefined;
243
- otAfterDaily?: number | undefined;
255
+ minHoursPerDay?: number | undefined;
256
+ workingHours?: {
257
+ minHoursPerDay: number | null;
258
+ maxHoursPerDay: number | null;
259
+ maxHoursPerWeek: number | null;
260
+ } | undefined;
261
+ overtime?: {
262
+ maxHoursPerMonth: number | null;
263
+ } | undefined;
244
264
  preferences?: string[] | undefined;
245
265
  seniority?: "senior" | "junior" | "" | undefined;
246
266
  availDays?: boolean[] | undefined;
@@ -329,6 +349,7 @@ export declare function useScheduleBoard(handlers?: {
329
349
  start: string;
330
350
  end: string;
331
351
  role: string;
352
+ positionId?: string | undefined;
332
353
  status: import("../types").ShiftStatus;
333
354
  clock?: {
334
355
  in: string | null;
@@ -377,6 +398,7 @@ export declare function useScheduleBoard(handlers?: {
377
398
  start: string;
378
399
  end: string;
379
400
  role: string;
401
+ positionId?: string | undefined;
380
402
  status: import("../types").ShiftStatus;
381
403
  clock?: {
382
404
  in: string | null;
@@ -417,6 +439,7 @@ export declare function useScheduleBoard(handlers?: {
417
439
  start: string;
418
440
  end: string;
419
441
  role: string;
442
+ positionId?: string | undefined;
420
443
  status: import("../types").ShiftStatus;
421
444
  clock?: {
422
445
  in: string | null;
@@ -465,6 +488,7 @@ export declare function useScheduleBoard(handlers?: {
465
488
  start: string;
466
489
  end: string;
467
490
  role: string;
491
+ positionId?: string | undefined;
468
492
  status: import("../types").ShiftStatus;
469
493
  clock?: {
470
494
  in: string | null;
@@ -510,6 +534,7 @@ export declare function useScheduleBoard(handlers?: {
510
534
  rangeLabel: import("vue").ComputedRef<string>;
511
535
  isToday: (dayIdx: number) => boolean;
512
536
  dateKey: (dayIdx: number) => string | null;
537
+ dateKeyAt: (offset: number, dayIdx: number) => string | null;
513
538
  navigate: (delta: number) => void;
514
539
  goToday: () => void;
515
540
  membersOf: (sectionId: string) => Employee[];
@@ -51,8 +51,6 @@ export declare function useScheduleDayTimeline(board: ScheduleBoardApi, roster:
51
51
  onAddShift: (empId: number, dayIdx: number) => void;
52
52
  onEditShift: (empId: number, dayIdx: number) => void;
53
53
  onEditLeave: (empId: number, dayIdx: number) => void;
54
- onOpenAssign: (openId: number) => void;
55
- onAddAreaShift: (dayIdx: number, position: string) => void;
56
54
  onOpenDemand: (dayIdx: number) => void;
57
55
  onOpenEmployeeMenu: (empId: number, anchor: HTMLElement) => void;
58
56
  onDemandSegment: (dayIdx: number, from: number, to: number, anchor: HTMLElement) => void;
@@ -68,7 +66,6 @@ export declare function useScheduleDayTimeline(board: ScheduleBoardApi, roster:
68
66
  clock: string;
69
67
  }[]>;
70
68
  isOpenHour: (m: number) => boolean;
71
- openShiftsRow: import("vue").ComputedRef<ScheduleTimelineRow | null>;
72
69
  employeeRows: import("vue").ComputedRef<ScheduleTimelineRow[]>;
73
70
  positionTimelineRows: import("vue").ComputedRef<ScheduleTimelineRow[]>;
74
71
  demandRow: import("vue").ComputedRef<{
@@ -8,12 +8,10 @@ export type { ScheduleCoverageAxis } from './schedule-demand-domain';
8
8
  *
9
9
  * Storage follows this board's dayNotes rather than the mockup's flat `di` index: the mockup
10
10
  * renders one long horizon so a day index identifies a date, but this board pages through
11
- * weeks, and demand put on this Monday must not reappear on every other Monday. So a date's
12
- * own demand is keyed by ISO date, and a standing weekday rule is keyed by weekday index.
11
+ * weeks, and demand put on this Monday must not reappear on every other Monday. Demand is
12
+ * therefore keyed by explicit ISO date.
13
13
  *
14
- * A date's own demand wins over the weekday rule it would otherwise inherit — "every Tuesday
15
- * needs eight" is a standing statement, and "this Tuesday is different" has to be able to
16
- * override it without rewriting the rule. */
14
+ * The weekday fallback remains only as a defensive read path until legacy records are removed. */
17
15
  export declare function useScheduleDemand(board: ScheduleBoardApi): {
18
16
  byDate: Record<string, DemandPeriod[]>;
19
17
  byWeekday: Record<number, DemandPeriod[]>;
@@ -14,8 +14,7 @@ export interface ScheduleDemandSheetOptions {
14
14
  onNeedPosition?: (periodIdx: number, roleIdx: number) => void;
15
15
  }
16
16
  /** The demand sheet — editing happens on a DRAFT, so Save is a real commit and closing is a
17
- * real cancel. The sheet also carries the recurrence choice, because "every Tuesday" is a
18
- * property of the statement being made rather than a second screen. */
17
+ * real cancel. Apply scopes are expanded into explicit dates in the visible week. */
19
18
  export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand: ScheduleDemandApi, opts: ScheduleDemandSheetOptions): {
20
19
  open: import("vue").Ref<boolean, boolean>;
21
20
  dayIdx: import("vue").Ref<number | null, number | null>;
@@ -25,6 +24,7 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
25
24
  n: number;
26
25
  roles?: {
27
26
  position: string;
27
+ positionId?: string | undefined;
28
28
  n: number;
29
29
  }[] | undefined;
30
30
  }[], DemandPeriod[] | {
@@ -33,6 +33,7 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
33
33
  n: number;
34
34
  roles?: {
35
35
  position: string;
36
+ positionId?: string | undefined;
36
37
  n: number;
37
38
  }[] | undefined;
38
39
  }[]>;
@@ -115,6 +116,7 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
115
116
  n: number;
116
117
  roles?: {
117
118
  position: string;
119
+ positionId?: string | undefined;
118
120
  n: number;
119
121
  }[] | undefined;
120
122
  }[];
@@ -126,6 +128,7 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
126
128
  n: number;
127
129
  roles?: {
128
130
  position: string;
131
+ positionId?: string | undefined;
129
132
  n: number;
130
133
  }[] | undefined;
131
134
  }[];
@@ -151,6 +154,6 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
151
154
  openCopy: () => void;
152
155
  closeCopy: () => void;
153
156
  confirmCopy: () => Promise<void>;
154
- setApply: (k: DemandApplyMode) => DemandApplyMode;
157
+ setApply: (mode: DemandApplyMode) => void;
155
158
  };
156
159
  export type ScheduleDemandSheetApi = ReturnType<typeof useScheduleDemandSheet>;
@@ -6,6 +6,11 @@ export declare function useScheduleEmployeeAccess(form: ScheduleAddEmployeeForm)
6
6
  setPasscodeDigit: (index: number, value: string) => void;
7
7
  generatePasscode: () => void;
8
8
  togglePosAccess: () => void;
9
- setPosRole: (roleId: string) => void;
10
- posRoleOptions: import("vue").ComputedRef<Role[]>;
9
+ addPosRoleRow: () => void;
10
+ removePosRoleRow: (index: number) => void;
11
+ isCurrentOutletRow: (index: number) => boolean;
12
+ setPosRoleOutlet: (index: number, outlet: string) => void;
13
+ setPosRoleId: (index: number, roleId: string) => void;
14
+ posRoleOptionsFor: (outlet: string) => Role[];
15
+ posRolesHint: import("vue").ComputedRef<"" | "No outlet assigned, so their passcode will not open a till yet." | "The same outlet is listed twice — only the last role on it will apply.">;
11
16
  };
@@ -4,7 +4,7 @@ export declare function useScheduleEmployeeAvailability(form: ScheduleAddEmploye
4
4
  dayLit: (index: number) => boolean;
5
5
  avLabel: ComputedRef<"Weekly availability" | "Time off days">;
6
6
  avAllLabel: ComputedRef<"Clear all" | "Select all" | "No days off" | "Every day off">;
7
- maxHoursPlaceholder: ComputedRef<"Hours per week" | "No cap">;
7
+ maxHoursPlaceholder: ComputedRef<string>;
8
8
  ensureAvailHours: (index: number) => void;
9
9
  toggleAvailDay: (index: number) => void;
10
10
  availAll: () => void;
@@ -13,6 +13,7 @@ interface UseScheduleEmployeeCandidatesOptions {
13
13
  };
14
14
  onPicked: (employeeId: string) => void;
15
15
  onPrefillPasscode: (employeeId: string) => void;
16
+ onPrefillPosRoles: (employeeId: string) => void;
16
17
  }
17
18
  /** Directory lookup and profile prefill for the existing-employee path of the add wizard. */
18
19
  export declare function useScheduleEmployeeCandidates(options: UseScheduleEmployeeCandidatesOptions): {
@@ -12,6 +12,10 @@ interface UseScheduleEmployeePersistenceOptions {
12
12
  board: ScheduleBoardApi;
13
13
  editingEmployeeId: Ref<number | null>;
14
14
  originalLocations: Ref<string[]>;
15
+ originalPosRoles: Ref<{
16
+ outlet: string;
17
+ roleId: string;
18
+ }[]>;
15
19
  effectiveRate: ComputedRef<number>;
16
20
  passcodeValue: ComputedRef<string>;
17
21
  notify?: (message: string, type?: 'success' | 'error' | 'info') => void;
@@ -11,6 +11,8 @@ interface UseScheduleEmployeeValidationOptions {
11
11
  export declare function useScheduleEmployeeValidation(options: UseScheduleEmployeeValidationOptions): {
12
12
  nameError: ComputedRef<boolean>;
13
13
  passError: ComputedRef<boolean>;
14
+ posRolesOk: ComputedRef<boolean>;
15
+ posRolesError: ComputedRef<boolean>;
14
16
  availabilityOk: ComputedRef<boolean>;
15
17
  availabilityError: ComputedRef<boolean>;
16
18
  masterCodeError: ComputedRef<boolean>;
@@ -21,6 +21,7 @@ export declare function useScheduleGapPopover(board: ScheduleBoardApi, demand: S
21
21
  over: number;
22
22
  roles: {
23
23
  position: string;
24
+ positionId?: string | undefined;
24
25
  n: number;
25
26
  required: number;
26
27
  got: number;
@@ -41,6 +42,7 @@ export declare function useScheduleGapPopover(board: ScheduleBoardApi, demand: S
41
42
  over: number;
42
43
  roles: {
43
44
  position: string;
45
+ positionId?: string | undefined;
44
46
  n: number;
45
47
  required: number;
46
48
  got: number;
@@ -22,10 +22,12 @@ export declare function useScheduleOnboardingEmployees(options: ScheduleOnboardi
22
22
  contractHours?: number | undefined;
23
23
  rate: number;
24
24
  positions: string[];
25
+ archivedPositions?: string[] | undefined;
25
26
  shifts: ({
26
27
  start: string;
27
28
  end: string;
28
29
  role: string;
30
+ positionId?: string | undefined;
29
31
  status: import("../types").ShiftStatus;
30
32
  clock?: {
31
33
  in: string | null;
@@ -74,6 +76,7 @@ export declare function useScheduleOnboardingEmployees(options: ScheduleOnboardi
74
76
  start: string;
75
77
  end: string;
76
78
  role: string;
79
+ positionId?: string | undefined;
77
80
  status: import("../types").ShiftStatus;
78
81
  clock?: {
79
82
  in: string | null;
@@ -112,9 +115,16 @@ export declare function useScheduleOnboardingEmployees(options: ScheduleOnboardi
112
115
  payBasis?: "hourly" | "monthly" | undefined;
113
116
  payAmount?: number | undefined;
114
117
  maxHours?: number | undefined;
115
- maxOtHours?: number | undefined;
116
118
  minHours?: number | undefined;
117
- otAfterDaily?: number | undefined;
119
+ minHoursPerDay?: number | undefined;
120
+ workingHours?: {
121
+ minHoursPerDay: number | null;
122
+ maxHoursPerDay: number | null;
123
+ maxHoursPerWeek: number | null;
124
+ } | undefined;
125
+ overtime?: {
126
+ maxHoursPerMonth: number | null;
127
+ } | undefined;
118
128
  preferences?: string[] | undefined;
119
129
  seniority?: "senior" | "junior" | "" | undefined;
120
130
  availDays?: boolean[] | undefined;
@@ -137,10 +147,18 @@ export declare function useScheduleOnboardingEmployees(options: ScheduleOnboardi
137
147
  end: string;
138
148
  }[]>;
139
149
  rawEmployee: (empId: number) => {
150
+ overtime?: {
151
+ maxHoursPerMonth: number | null;
152
+ } | undefined;
153
+ minHoursPerDay?: number | null | undefined;
154
+ workingHours?: {
155
+ minHoursPerDay: number | null;
156
+ maxHoursPerDay: number | null;
157
+ maxHoursPerWeek: number | null;
158
+ } | undefined;
140
159
  name: string;
141
160
  employeeId: string;
142
161
  employmentType: "FULLTIME" | "PARTTIME";
143
- workingHour: number;
144
162
  wage: {
145
163
  type: "HOURLY" | "MONTHLY";
146
164
  amount: number;