@feedmepos/mf-hrm-portal 2.3.0-dev.13 → 2.3.0-dev.15
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/dist/{ApprovalCodeList-D3egZFML.js → ApprovalCodeList-CY0ox1dX.js} +4 -4
- package/dist/{AuditLogList-BzbaEsSj.js → AuditLogList-CBkA-KQT.js} +17 -18
- package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-Do52KbKm.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-B8cb8yqV.js} +2 -2
- package/dist/{EmployeeList-BiM8dRwZ.js → EmployeeList-0PrcuHPJ.js} +255 -267
- package/dist/{FormItem.vue_vue_type_script_setup_true_lang-CUnlKsxk.js → FormItem.vue_vue_type_script_setup_true_lang-rjDE1B4E.js} +6 -6
- package/dist/{GrantUserList-Dj2ms20E.js → GrantUserList-Dw923P2j.js} +5 -5
- package/dist/{Main-DmpwTPaI.js → Main-BqX7n1ik.js} +9 -9
- package/dist/{Main-C2z7Jf9A.js → Main-C0bcn2NY.js} +5 -5
- package/dist/{Main-DklZWoKj.js → Main-Dpf2KdSH.js} +2 -2
- package/dist/{PermissionSetList-C-qgCcRO.js → PermissionSetList-xrI130SW.js} +5 -5
- package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-ggZB5zWW.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-3_8qycrF.js} +465 -465
- package/dist/{RoleList-ohfin77B.js → RoleList-DPkG5dg9.js} +7 -7
- package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-DYLLW46A.js +501 -0
- package/dist/{ScheduleGeneralPage-aCljFf21.js → ScheduleGeneralPage-CISbuAff.js} +141 -143
- package/dist/{ScheduleModal.vue_vue_type_script_setup_true_lang-x_-BYkcc.js → ScheduleModal.vue_vue_type_script_setup_true_lang-BeTuMw3f.js} +989 -858
- package/dist/SchedulePage-Dn6_TiBS.js +18757 -0
- package/dist/{SchedulePositionPage-CID91orD.js → SchedulePositionPage-Cu3WRfH-.js} +79 -81
- package/dist/{SelectFilter-CG13h83-.js → SelectFilter-ssnRUIN6.js} +1 -1
- package/dist/{TeamMemberList-DJIKL4dE.js → TeamMemberList-DTqNCDJb.js} +35 -36
- package/dist/{TimesheetList-BPXWPNfT.js → TimesheetList-CA19TmKm.js} +52 -53
- package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-DVcV0knM.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-B1jnsZpD.js} +2 -2
- package/dist/{app-Bz8568j8.js → app-3xGY2Rn0.js} +2062 -1800
- package/dist/app.js +1 -1
- package/dist/{dayjs.min-DhSRKSu4.js → dayjs.min-C_c8OoEU.js} +1 -1
- package/dist/{employee-BM44u8b-.js → employee-Dt0y51t3.js} +3 -3
- package/dist/{iteration-BHDxs89d.js → iteration-C4YvbrCe.js} +1 -1
- package/dist/{lodash-DgSYLwYD.js → lodash-huRs3Cbj.js} +1 -1
- package/dist/object-Dwyg2LgX.js +16 -0
- package/dist/{role-BMJ7LEHN.js → role-fM58UmtC.js} +1 -1
- package/dist/{rule-CCo7_ckA.js → rule-CCN0QCPF.js} +2 -2
- package/dist/src/views/audit-log/locales/index.d.ts +252 -0
- package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +2 -0
- package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +1 -0
- package/dist/src/views/scheduling/components/ScheduleOnboardingSettings.vue.d.ts +6 -0
- package/dist/src/views/scheduling/composables/onboarding-types.d.ts +2 -1
- package/dist/src/views/scheduling/composables/schedule-demand-domain.d.ts +13 -1
- package/dist/src/views/scheduling/composables/schedule-error.d.ts +3 -0
- package/dist/src/views/scheduling/composables/schedule-quick-pick.d.ts +22 -0
- package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +5 -2
- package/dist/src/views/scheduling/composables/useScheduleAddPick.d.ts +3 -11
- package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +7 -0
- package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +45 -1
- package/dist/src/views/scheduling/composables/useScheduleCostRail.d.ts +13 -1
- package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +2 -2
- package/dist/src/views/scheduling/composables/useScheduleDragDrop.d.ts +1 -0
- package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +14 -6
- package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +3 -0
- package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +0 -2
- package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +25 -0
- package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +163 -4
- package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +44 -0
- package/dist/src/views/scheduling/composables/useScheduleSetupBanner.d.ts +2 -2
- package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +22 -0
- package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +26 -2
- package/dist/src/views/scheduling/country-rules/index.d.ts +8 -3
- package/dist/src/views/scheduling/data.d.ts +17 -0
- package/dist/src/views/scheduling/schedule-store.d.ts +7 -7
- package/dist/src/views/scheduling/types.d.ts +5 -0
- package/dist/style.css +1 -1
- package/dist/tsconfig.app.tsbuildinfo +1 -1
- package/dist/{useReportPermissions-C_Cd__n1.js → useReportPermissions-BlX_Mk5f.js} +3 -3
- package/package.json +1 -1
- package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-diuWysro.js +0 -492
- package/dist/SchedulePage-DdMHF6kX.js +0 -17993
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +0 -9
|
@@ -36,7 +36,7 @@ export interface ScheduleTimelineRow {
|
|
|
36
36
|
bars: ScheduleTimelineBar[];
|
|
37
37
|
minHeight?: number;
|
|
38
38
|
emptyText?: string;
|
|
39
|
-
onTrackClick?: () => void;
|
|
39
|
+
onTrackClick?: (anchor: HTMLElement) => void;
|
|
40
40
|
}
|
|
41
41
|
export interface ScheduleHourCell {
|
|
42
42
|
m: number;
|
|
@@ -48,7 +48,7 @@ export interface ScheduleHourCell {
|
|
|
48
48
|
n: number;
|
|
49
49
|
}
|
|
50
50
|
export declare function useScheduleDayTimeline(board: ScheduleBoardApi, roster: ScheduleRosterApi, areaBoard: ScheduleAreaBoardApi, demand: ScheduleDemandApi, handlers: {
|
|
51
|
-
onAddShift: (empId: number, dayIdx: number) => void;
|
|
51
|
+
onAddShift: (empId: number, dayIdx: number, anchor: HTMLElement) => void;
|
|
52
52
|
onEditShift: (empId: number, dayIdx: number) => void;
|
|
53
53
|
onEditLeave: (empId: number, dayIdx: number) => void;
|
|
54
54
|
onOpenDemand: (dayIdx: number) => void;
|
|
@@ -50,5 +50,6 @@ export declare function useScheduleDragDrop(board: ScheduleBoardApi): {
|
|
|
50
50
|
setDragHover: (empId: number, dayIdx: number, onCard: boolean, slotIndex: number | null) => void;
|
|
51
51
|
clearDragHover: (empId: number, dayIdx: number) => void;
|
|
52
52
|
dropOnCell: (targetEmpId: number, targetDayIdx: number) => void;
|
|
53
|
+
dropOnPosition: (targetDayIdx: number, targetPosition: string) => void;
|
|
53
54
|
};
|
|
54
55
|
export type ScheduleDragDropApi = ReturnType<typeof useScheduleDragDrop>;
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { type ComputedRef } from 'vue';
|
|
1
2
|
import type { Role } from '@/types/role';
|
|
2
|
-
import {
|
|
3
|
-
export declare function useScheduleEmployeeAccess(form: ScheduleAddEmployeeForm
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import type { ScheduleAddEmployeeForm } from './schedule-add-employee-form';
|
|
4
|
+
export declare function useScheduleEmployeeAccess(form: ScheduleAddEmployeeForm, options?: {
|
|
5
|
+
excludePosUserId?: ComputedRef<string | undefined>;
|
|
6
|
+
}): {
|
|
7
|
+
passcodeValue: ComputedRef<string>;
|
|
8
|
+
passcodeOk: ComputedRef<boolean>;
|
|
6
9
|
setPasscodeDigit: (index: number, value: string) => void;
|
|
7
|
-
generatePasscode: () => void
|
|
10
|
+
generatePasscode: () => Promise<void>;
|
|
11
|
+
isGeneratingPasscode: import("vue").Ref<boolean, boolean>;
|
|
8
12
|
togglePosAccess: () => void;
|
|
9
13
|
addPosRoleRow: () => void;
|
|
10
14
|
removePosRoleRow: (index: number) => void;
|
|
@@ -12,5 +16,9 @@ export declare function useScheduleEmployeeAccess(form: ScheduleAddEmployeeForm)
|
|
|
12
16
|
setPosRoleOutlet: (index: number, outlet: string) => void;
|
|
13
17
|
setPosRoleId: (index: number, roleId: string) => void;
|
|
14
18
|
posRoleOptionsFor: (outlet: string) => Role[];
|
|
15
|
-
|
|
19
|
+
isPosRoleUsable: (role: Role) => boolean;
|
|
20
|
+
setMasterUserRoleAccess: (roleIds: string[] | null | undefined) => void;
|
|
21
|
+
isPosOutletUsable: (outlet: string) => boolean;
|
|
22
|
+
setMasterUserRestaurantAccess: (restaurantIds: string[] | null | undefined) => void;
|
|
23
|
+
posRolesHint: 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.">;
|
|
16
24
|
};
|
|
@@ -14,12 +14,15 @@ interface UseScheduleEmployeeCandidatesOptions {
|
|
|
14
14
|
onPicked: (employeeId: string) => void;
|
|
15
15
|
onPrefillPasscode: (employeeId: string) => void | Promise<void>;
|
|
16
16
|
onPrefillPosRoles: (employeeId: string) => void | Promise<void>;
|
|
17
|
+
onPrefillPosRoleAccess: (roleIds: string[] | null | undefined) => void;
|
|
18
|
+
onPrefillPosRestaurantAccess: (restaurantIds: string[] | null | undefined) => void;
|
|
17
19
|
}
|
|
18
20
|
/** Directory lookup and profile prefill for the existing-employee path of the add wizard. */
|
|
19
21
|
export declare function useScheduleEmployeeCandidates(options: UseScheduleEmployeeCandidatesOptions): {
|
|
20
22
|
selectExistingOpen: import("vue").Ref<boolean, boolean>;
|
|
21
23
|
candidatesLoading: import("vue").Ref<boolean, boolean>;
|
|
22
24
|
candidatesError: import("vue").Ref<string | null, string | null>;
|
|
25
|
+
selectingExisting: import("vue").Ref<boolean, boolean>;
|
|
23
26
|
openSelectExisting: () => void;
|
|
24
27
|
closeSelectExisting: () => void;
|
|
25
28
|
pickExisting: (employeeId: string) => Promise<void>;
|
|
@@ -4,7 +4,6 @@ interface UseScheduleEmployeeValidationOptions {
|
|
|
4
4
|
form: ScheduleAddEmployeeForm;
|
|
5
5
|
submitAttempted: Ref<boolean>;
|
|
6
6
|
passcodeOk: ComputedRef<boolean>;
|
|
7
|
-
isNewUser: ComputedRef<boolean>;
|
|
8
7
|
}
|
|
9
8
|
/** Validation guards for the add/edit employee form. Keeping them together makes create and
|
|
10
9
|
* the field-level error indicators consume the same rules. */
|
|
@@ -15,6 +14,5 @@ export declare function useScheduleEmployeeValidation(options: UseScheduleEmploy
|
|
|
15
14
|
posRolesError: ComputedRef<boolean>;
|
|
16
15
|
availabilityOk: ComputedRef<boolean>;
|
|
17
16
|
availabilityError: ComputedRef<boolean>;
|
|
18
|
-
masterCodeError: ComputedRef<boolean>;
|
|
19
17
|
};
|
|
20
18
|
export {};
|
|
@@ -101,6 +101,28 @@ export declare function useScheduleOnboardingEmployees(options: ScheduleOnboardi
|
|
|
101
101
|
updatedAt?: string | undefined;
|
|
102
102
|
splitGroupId?: string | undefined;
|
|
103
103
|
}[] | null)[];
|
|
104
|
+
timeOff?: ({
|
|
105
|
+
timeOff: "approved" | "pending";
|
|
106
|
+
requestId?: string | undefined;
|
|
107
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
108
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
109
|
+
reason: string;
|
|
110
|
+
half?: boolean | undefined;
|
|
111
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
112
|
+
from?: string | undefined;
|
|
113
|
+
to?: string | undefined;
|
|
114
|
+
appliedOn?: string | undefined;
|
|
115
|
+
note?: string | undefined;
|
|
116
|
+
cert?: {
|
|
117
|
+
name: string;
|
|
118
|
+
size: string;
|
|
119
|
+
} | null | undefined;
|
|
120
|
+
bal?: {
|
|
121
|
+
type: string;
|
|
122
|
+
entitled: number;
|
|
123
|
+
used: number;
|
|
124
|
+
} | undefined;
|
|
125
|
+
} | null)[] | undefined;
|
|
104
126
|
remarks: {
|
|
105
127
|
author: string;
|
|
106
128
|
date: string;
|
|
@@ -181,7 +203,10 @@ export declare function useScheduleOnboardingEmployees(options: ScheduleOnboardi
|
|
|
181
203
|
seedEmployees: (missingOnly?: boolean) => void;
|
|
182
204
|
pickAll: (checked: boolean) => void;
|
|
183
205
|
setPosition: (empId: number, value: string) => void;
|
|
206
|
+
removePositionFromRows: (position: string) => void;
|
|
207
|
+
toggleSecond: (empId: number, position: string) => void;
|
|
184
208
|
setEmployment: (empId: number, kind: TeamEmployment) => void;
|
|
209
|
+
maxHoursFor: (employment: TeamEmployment) => number | null;
|
|
185
210
|
setHours: (empId: number, value: string) => void;
|
|
186
211
|
setRate: (empId: number, value: string) => void;
|
|
187
212
|
bulkOpen: import("vue").Ref<boolean, boolean>;
|
|
@@ -114,6 +114,28 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
114
114
|
updatedAt?: string | undefined;
|
|
115
115
|
splitGroupId?: string | undefined;
|
|
116
116
|
}[] | null)[];
|
|
117
|
+
timeOff?: ({
|
|
118
|
+
timeOff: "approved" | "pending";
|
|
119
|
+
requestId?: string | undefined;
|
|
120
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
121
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
122
|
+
reason: string;
|
|
123
|
+
half?: boolean | undefined;
|
|
124
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
125
|
+
from?: string | undefined;
|
|
126
|
+
to?: string | undefined;
|
|
127
|
+
appliedOn?: string | undefined;
|
|
128
|
+
note?: string | undefined;
|
|
129
|
+
cert?: {
|
|
130
|
+
name: string;
|
|
131
|
+
size: string;
|
|
132
|
+
} | null | undefined;
|
|
133
|
+
bal?: {
|
|
134
|
+
type: string;
|
|
135
|
+
entitled: number;
|
|
136
|
+
used: number;
|
|
137
|
+
} | undefined;
|
|
138
|
+
} | null)[] | undefined;
|
|
117
139
|
remarks: {
|
|
118
140
|
author: string;
|
|
119
141
|
date: string;
|
|
@@ -240,6 +262,28 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
240
262
|
updatedAt?: string | undefined;
|
|
241
263
|
splitGroupId?: string | undefined;
|
|
242
264
|
}[] | null)[];
|
|
265
|
+
timeOff?: ({
|
|
266
|
+
timeOff: "approved" | "pending";
|
|
267
|
+
requestId?: string | undefined;
|
|
268
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
269
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
270
|
+
reason: string;
|
|
271
|
+
half?: boolean | undefined;
|
|
272
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
273
|
+
from?: string | undefined;
|
|
274
|
+
to?: string | undefined;
|
|
275
|
+
appliedOn?: string | undefined;
|
|
276
|
+
note?: string | undefined;
|
|
277
|
+
cert?: {
|
|
278
|
+
name: string;
|
|
279
|
+
size: string;
|
|
280
|
+
} | null | undefined;
|
|
281
|
+
bal?: {
|
|
282
|
+
type: string;
|
|
283
|
+
entitled: number;
|
|
284
|
+
used: number;
|
|
285
|
+
} | undefined;
|
|
286
|
+
} | null)[] | undefined;
|
|
243
287
|
remarks: {
|
|
244
288
|
author: string;
|
|
245
289
|
date: string;
|
|
@@ -553,7 +597,7 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
553
597
|
clearEmployeeShifts: (empId: number) => {
|
|
554
598
|
shifts: number;
|
|
555
599
|
};
|
|
556
|
-
moveShift: (fromEmpId: number, fromDayIdx: number, toEmpId: number, toDayIdx: number, fromSlotIndex?: number, fromSlotCount?: number) => boolean;
|
|
600
|
+
moveShift: (fromEmpId: number, fromDayIdx: number, toEmpId: number, toDayIdx: number, fromSlotIndex?: number, fromSlotCount?: number, targetPosition?: string) => boolean;
|
|
557
601
|
swapShifts: (empIdA: number, empIdB: number, dayA: number, dayB?: number, slotIndexA?: number, slotIndexB?: number, slotCountA?: number) => boolean;
|
|
558
602
|
clearShiftsInRange: () => {
|
|
559
603
|
shifts: number;
|
|
@@ -643,8 +687,29 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
643
687
|
removeRole: (index: number, roleIndex: number) => void;
|
|
644
688
|
namedTotal: (range: import("./onboarding-types").ScheduleOnboardingRange) => number;
|
|
645
689
|
copyDay: (mode: "all" | "wk" | "we") => void;
|
|
690
|
+
settings: {
|
|
691
|
+
payRate: {
|
|
692
|
+
NORMAL: {
|
|
693
|
+
overtime: number;
|
|
694
|
+
};
|
|
695
|
+
REST_DAY: {
|
|
696
|
+
regular: number;
|
|
697
|
+
overtime: number;
|
|
698
|
+
};
|
|
699
|
+
PUBLIC_HOLIDAY: {
|
|
700
|
+
regular: number;
|
|
701
|
+
overtime: number;
|
|
702
|
+
};
|
|
703
|
+
};
|
|
704
|
+
otCapHours: number | null;
|
|
705
|
+
workingHours: {
|
|
706
|
+
minHoursPerDay: number | null;
|
|
707
|
+
maxHoursPerDay: number | null;
|
|
708
|
+
maxHoursPerWeek: number | null;
|
|
709
|
+
};
|
|
710
|
+
};
|
|
646
711
|
addPositionNamed: (name?: string) => void;
|
|
647
|
-
removePosition: (id: string) => void
|
|
712
|
+
removePosition: (id: string) => Promise<void>;
|
|
648
713
|
reviewRows: import("vue").ComputedRef<ReviewRow[]>;
|
|
649
714
|
goTo: (target: ScheduleOnboardingStep) => void;
|
|
650
715
|
avail: Record<number, import("./onboarding-types").AvailRow>;
|
|
@@ -782,6 +847,28 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
782
847
|
updatedAt?: string | undefined;
|
|
783
848
|
splitGroupId?: string | undefined;
|
|
784
849
|
}[] | null)[];
|
|
850
|
+
timeOff?: ({
|
|
851
|
+
timeOff: "approved" | "pending";
|
|
852
|
+
requestId?: string | undefined;
|
|
853
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
854
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
855
|
+
reason: string;
|
|
856
|
+
half?: boolean | undefined;
|
|
857
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
858
|
+
from?: string | undefined;
|
|
859
|
+
to?: string | undefined;
|
|
860
|
+
appliedOn?: string | undefined;
|
|
861
|
+
note?: string | undefined;
|
|
862
|
+
cert?: {
|
|
863
|
+
name: string;
|
|
864
|
+
size: string;
|
|
865
|
+
} | null | undefined;
|
|
866
|
+
bal?: {
|
|
867
|
+
type: string;
|
|
868
|
+
entitled: number;
|
|
869
|
+
used: number;
|
|
870
|
+
} | undefined;
|
|
871
|
+
} | null)[] | undefined;
|
|
785
872
|
remarks: {
|
|
786
873
|
author: string;
|
|
787
874
|
date: string;
|
|
@@ -824,7 +911,10 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
824
911
|
teamSomePicked: import("vue").ComputedRef<boolean>;
|
|
825
912
|
pickAll: (checked: boolean) => void;
|
|
826
913
|
setPosition: (empId: number, value: string) => void;
|
|
914
|
+
removePositionFromRows: (position: string) => void;
|
|
915
|
+
toggleSecond: (empId: number, position: string) => void;
|
|
827
916
|
setEmployment: (empId: number, kind: import("./onboarding-types").TeamEmployment) => void;
|
|
917
|
+
maxHoursFor: (employment: import("./onboarding-types").TeamEmployment) => number | null;
|
|
828
918
|
setHours: (empId: number, value: string) => void;
|
|
829
919
|
setRate: (empId: number, value: string) => void;
|
|
830
920
|
bulkOpen: import("vue").Ref<boolean, boolean>;
|
|
@@ -934,6 +1024,28 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
934
1024
|
updatedAt?: string | undefined;
|
|
935
1025
|
splitGroupId?: string | undefined;
|
|
936
1026
|
}[] | null)[];
|
|
1027
|
+
timeOff?: ({
|
|
1028
|
+
timeOff: "approved" | "pending";
|
|
1029
|
+
requestId?: string | undefined;
|
|
1030
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
1031
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
1032
|
+
reason: string;
|
|
1033
|
+
half?: boolean | undefined;
|
|
1034
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
1035
|
+
from?: string | undefined;
|
|
1036
|
+
to?: string | undefined;
|
|
1037
|
+
appliedOn?: string | undefined;
|
|
1038
|
+
note?: string | undefined;
|
|
1039
|
+
cert?: {
|
|
1040
|
+
name: string;
|
|
1041
|
+
size: string;
|
|
1042
|
+
} | null | undefined;
|
|
1043
|
+
bal?: {
|
|
1044
|
+
type: string;
|
|
1045
|
+
entitled: number;
|
|
1046
|
+
used: number;
|
|
1047
|
+
} | undefined;
|
|
1048
|
+
} | null)[] | undefined;
|
|
937
1049
|
remarks: {
|
|
938
1050
|
author: string;
|
|
939
1051
|
date: string;
|
|
@@ -1061,6 +1173,28 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
1061
1173
|
updatedAt?: string | undefined;
|
|
1062
1174
|
splitGroupId?: string | undefined;
|
|
1063
1175
|
}[] | null)[];
|
|
1176
|
+
timeOff?: ({
|
|
1177
|
+
timeOff: "approved" | "pending";
|
|
1178
|
+
requestId?: string | undefined;
|
|
1179
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
1180
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
1181
|
+
reason: string;
|
|
1182
|
+
half?: boolean | undefined;
|
|
1183
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
1184
|
+
from?: string | undefined;
|
|
1185
|
+
to?: string | undefined;
|
|
1186
|
+
appliedOn?: string | undefined;
|
|
1187
|
+
note?: string | undefined;
|
|
1188
|
+
cert?: {
|
|
1189
|
+
name: string;
|
|
1190
|
+
size: string;
|
|
1191
|
+
} | null | undefined;
|
|
1192
|
+
bal?: {
|
|
1193
|
+
type: string;
|
|
1194
|
+
entitled: number;
|
|
1195
|
+
used: number;
|
|
1196
|
+
} | undefined;
|
|
1197
|
+
} | null)[] | undefined;
|
|
1064
1198
|
remarks: {
|
|
1065
1199
|
author: string;
|
|
1066
1200
|
date: string;
|
|
@@ -1192,6 +1326,28 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
1192
1326
|
updatedAt?: string | undefined;
|
|
1193
1327
|
splitGroupId?: string | undefined;
|
|
1194
1328
|
}[] | null)[];
|
|
1329
|
+
timeOff?: ({
|
|
1330
|
+
timeOff: "approved" | "pending";
|
|
1331
|
+
requestId?: string | undefined;
|
|
1332
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
1333
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
1334
|
+
reason: string;
|
|
1335
|
+
half?: boolean | undefined;
|
|
1336
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
1337
|
+
from?: string | undefined;
|
|
1338
|
+
to?: string | undefined;
|
|
1339
|
+
appliedOn?: string | undefined;
|
|
1340
|
+
note?: string | undefined;
|
|
1341
|
+
cert?: {
|
|
1342
|
+
name: string;
|
|
1343
|
+
size: string;
|
|
1344
|
+
} | null | undefined;
|
|
1345
|
+
bal?: {
|
|
1346
|
+
type: string;
|
|
1347
|
+
entitled: number;
|
|
1348
|
+
used: number;
|
|
1349
|
+
} | undefined;
|
|
1350
|
+
} | null)[] | undefined;
|
|
1195
1351
|
remarks: {
|
|
1196
1352
|
author: string;
|
|
1197
1353
|
date: string;
|
|
@@ -1295,7 +1451,6 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
1295
1451
|
passcodeOk: import("vue").ComputedRef<boolean>;
|
|
1296
1452
|
currentLocationLabel: import("vue").ComputedRef<string>;
|
|
1297
1453
|
locationOptions: import("vue").Reactive<string[]>;
|
|
1298
|
-
masterCodeError: import("vue").ComputedRef<boolean>;
|
|
1299
1454
|
isNewUser: import("vue").ComputedRef<boolean>;
|
|
1300
1455
|
footerHint: import("vue").ComputedRef<"Pick who — this outlet's own pay, position and hours are still set here." | "One short form. Rest days are set on their profile afterwards.">;
|
|
1301
1456
|
primaryRoleLabel: import("vue").ComputedRef<string>;
|
|
@@ -1331,7 +1486,8 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
1331
1486
|
setAvailHour: (index: number, field: "from" | "to", value: string) => void;
|
|
1332
1487
|
copyAvailHourDown: (index: number) => void;
|
|
1333
1488
|
setPasscodeDigit: (index: number, value: string) => void;
|
|
1334
|
-
generatePasscode: () => void
|
|
1489
|
+
generatePasscode: () => Promise<void>;
|
|
1490
|
+
isGeneratingPasscode: import("vue").Ref<boolean, boolean>;
|
|
1335
1491
|
togglePosAccess: () => void;
|
|
1336
1492
|
addPosRoleRow: () => void;
|
|
1337
1493
|
removePosRoleRow: (index: number) => void;
|
|
@@ -1339,6 +1495,9 @@ export declare function useScheduleOnboardingWizard(board: ScheduleBoardApi, add
|
|
|
1339
1495
|
setPosRoleOutlet: (index: number, outlet: string) => void;
|
|
1340
1496
|
setPosRoleId: (index: number, roleId: string) => void;
|
|
1341
1497
|
posRoleOptionsFor: (outlet: string) => import("../../../types/role").Role[];
|
|
1498
|
+
isPosRoleUsable: (role: import("../../../types/role").Role) => boolean;
|
|
1499
|
+
setMasterUserRoleAccess: (roleIds: string[] | null | undefined) => void;
|
|
1500
|
+
isPosOutletUsable: (outlet: string) => boolean;
|
|
1342
1501
|
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.">;
|
|
1343
1502
|
create: () => Promise<boolean>;
|
|
1344
1503
|
};
|
|
@@ -101,6 +101,28 @@ export declare function useScheduleRoster(board: ScheduleBoardApi): {
|
|
|
101
101
|
updatedAt?: string | undefined;
|
|
102
102
|
splitGroupId?: string | undefined;
|
|
103
103
|
}[] | null)[];
|
|
104
|
+
timeOff?: ({
|
|
105
|
+
timeOff: "approved" | "pending";
|
|
106
|
+
requestId?: string | undefined;
|
|
107
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
108
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
109
|
+
reason: string;
|
|
110
|
+
half?: boolean | undefined;
|
|
111
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
112
|
+
from?: string | undefined;
|
|
113
|
+
to?: string | undefined;
|
|
114
|
+
appliedOn?: string | undefined;
|
|
115
|
+
note?: string | undefined;
|
|
116
|
+
cert?: {
|
|
117
|
+
name: string;
|
|
118
|
+
size: string;
|
|
119
|
+
} | null | undefined;
|
|
120
|
+
bal?: {
|
|
121
|
+
type: string;
|
|
122
|
+
entitled: number;
|
|
123
|
+
used: number;
|
|
124
|
+
} | undefined;
|
|
125
|
+
} | null)[] | undefined;
|
|
104
126
|
remarks: {
|
|
105
127
|
author: string;
|
|
106
128
|
date: string;
|
|
@@ -228,6 +250,28 @@ export declare function useScheduleRoster(board: ScheduleBoardApi): {
|
|
|
228
250
|
updatedAt?: string | undefined;
|
|
229
251
|
splitGroupId?: string | undefined;
|
|
230
252
|
}[] | null)[];
|
|
253
|
+
timeOff?: ({
|
|
254
|
+
timeOff: "approved" | "pending";
|
|
255
|
+
requestId?: string | undefined;
|
|
256
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
257
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
258
|
+
reason: string;
|
|
259
|
+
half?: boolean | undefined;
|
|
260
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
261
|
+
from?: string | undefined;
|
|
262
|
+
to?: string | undefined;
|
|
263
|
+
appliedOn?: string | undefined;
|
|
264
|
+
note?: string | undefined;
|
|
265
|
+
cert?: {
|
|
266
|
+
name: string;
|
|
267
|
+
size: string;
|
|
268
|
+
} | null | undefined;
|
|
269
|
+
bal?: {
|
|
270
|
+
type: string;
|
|
271
|
+
entitled: number;
|
|
272
|
+
used: number;
|
|
273
|
+
} | undefined;
|
|
274
|
+
} | null)[] | undefined;
|
|
231
275
|
remarks: {
|
|
232
276
|
author: string;
|
|
233
277
|
date: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** "Set it up" banner — shown while the outlet has not finished scheduling setup, i.e. while
|
|
2
|
-
* `scheduleSetupCompleted` (schedule-store) is false. Dismissing
|
|
3
|
-
*
|
|
2
|
+
* `scheduleSetupCompleted` (schedule-store) is false. Dismissing marks the outlet's setup complete (`setupCompleted`
|
|
3
|
+
* is persisted), so neither the banner nor the welcome dialog returns.
|
|
4
4
|
*
|
|
5
5
|
* The welcome dialog shares that same gate, plus its own session dismiss so closing it doesn't
|
|
6
6
|
* also close the banner. `scheduleSetupCompleted` lands from an async fetch and starts `false`
|
|
@@ -148,6 +148,28 @@ export declare function useScheduleShiftActions(board: ScheduleBoardApi, options
|
|
|
148
148
|
updatedAt?: string | undefined;
|
|
149
149
|
splitGroupId?: string | undefined;
|
|
150
150
|
}[] | null)[];
|
|
151
|
+
timeOff?: ({
|
|
152
|
+
timeOff: "approved" | "pending";
|
|
153
|
+
requestId?: string | undefined;
|
|
154
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
155
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
156
|
+
reason: string;
|
|
157
|
+
half?: boolean | undefined;
|
|
158
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
159
|
+
from?: string | undefined;
|
|
160
|
+
to?: string | undefined;
|
|
161
|
+
appliedOn?: string | undefined;
|
|
162
|
+
note?: string | undefined;
|
|
163
|
+
cert?: {
|
|
164
|
+
name: string;
|
|
165
|
+
size: string;
|
|
166
|
+
} | null | undefined;
|
|
167
|
+
bal?: {
|
|
168
|
+
type: string;
|
|
169
|
+
entitled: number;
|
|
170
|
+
used: number;
|
|
171
|
+
} | undefined;
|
|
172
|
+
} | null)[] | undefined;
|
|
151
173
|
remarks: {
|
|
152
174
|
author: string;
|
|
153
175
|
date: string;
|
|
@@ -19,6 +19,7 @@ export interface ScheduleWarningPart {
|
|
|
19
19
|
* record (single position, like an assigned shift's "Position needed" row). */
|
|
20
20
|
export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand: ScheduleDemandApi, options?: {
|
|
21
21
|
onToast?: (message: string, type?: 'success' | 'error' | 'info') => void;
|
|
22
|
+
onAvailabilityWarning?: (message: string, onConfirm: () => void) => void;
|
|
22
23
|
}): {
|
|
23
24
|
open: import("vue").Ref<boolean, boolean>;
|
|
24
25
|
dayIdx: import("vue").Ref<number | null, number | null>;
|
|
@@ -79,6 +80,7 @@ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand:
|
|
|
79
80
|
repeatDays: import("vue").Ref<boolean[], boolean[]>;
|
|
80
81
|
gapNote: import("vue").Ref<string | null, string | null>;
|
|
81
82
|
conflictNote: import("vue").Ref<string | null, string | null>;
|
|
83
|
+
availabilityConflictNote: import("vue").ComputedRef<string | null>;
|
|
82
84
|
grantSkill: import("vue").Ref<boolean, boolean>;
|
|
83
85
|
showGrantSkill: import("vue").ComputedRef<boolean>;
|
|
84
86
|
unassignMode: import("vue").Ref<boolean, boolean>;
|
|
@@ -175,6 +177,28 @@ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand:
|
|
|
175
177
|
updatedAt?: string | undefined;
|
|
176
178
|
splitGroupId?: string | undefined;
|
|
177
179
|
}[] | null)[];
|
|
180
|
+
timeOff?: ({
|
|
181
|
+
timeOff: "approved" | "pending";
|
|
182
|
+
requestId?: string | undefined;
|
|
183
|
+
type?: "OFF_DAY" | "LEAVE" | undefined;
|
|
184
|
+
leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
|
|
185
|
+
reason: string;
|
|
186
|
+
half?: boolean | undefined;
|
|
187
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
188
|
+
from?: string | undefined;
|
|
189
|
+
to?: string | undefined;
|
|
190
|
+
appliedOn?: string | undefined;
|
|
191
|
+
note?: string | undefined;
|
|
192
|
+
cert?: {
|
|
193
|
+
name: string;
|
|
194
|
+
size: string;
|
|
195
|
+
} | null | undefined;
|
|
196
|
+
bal?: {
|
|
197
|
+
type: string;
|
|
198
|
+
entitled: number;
|
|
199
|
+
used: number;
|
|
200
|
+
} | undefined;
|
|
201
|
+
} | null)[] | undefined;
|
|
178
202
|
remarks: {
|
|
179
203
|
author: string;
|
|
180
204
|
date: string;
|
|
@@ -218,8 +242,8 @@ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand:
|
|
|
218
242
|
totalHours: import("vue").ComputedRef<number>;
|
|
219
243
|
totalLabel: import("vue").ComputedRef<string>;
|
|
220
244
|
warnings: import("vue").ComputedRef<ScheduleWarningPart[][]>;
|
|
221
|
-
openForEmployee: (forEmpId: number, day: number, roleHint?: string, hours?: ScheduleShiftSegment, slotIndex?: number) => void;
|
|
222
|
-
openForNewOpenShift: (day: number, roleHint?: string, hours?: ScheduleShiftSegment) => void;
|
|
245
|
+
openForEmployee: (forEmpId: number, day: number, roleHint?: string, hours?: ScheduleShiftSegment, slotIndex?: number, warnAvailability?: boolean) => void;
|
|
246
|
+
openForNewOpenShift: (day: number, roleHint?: string, hours?: ScheduleShiftSegment, requireAssignment?: boolean) => void;
|
|
223
247
|
openForEditOpenShift: (openShiftId: number) => void;
|
|
224
248
|
close: () => void;
|
|
225
249
|
removeSegment: (i: number) => void;
|
|
@@ -7,9 +7,14 @@ export interface CountryScheduleRules {
|
|
|
7
7
|
maxHoursPerMonth: number | null;
|
|
8
8
|
};
|
|
9
9
|
workingHours: {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
fullTime: {
|
|
11
|
+
minHoursPerDay: number | null;
|
|
12
|
+
maxHoursPerDay: number | null;
|
|
13
|
+
maxHoursPerWeek: number | null;
|
|
14
|
+
};
|
|
15
|
+
partTime: {
|
|
16
|
+
maxHoursPerWeek: number | null;
|
|
17
|
+
};
|
|
13
18
|
};
|
|
14
19
|
recurringPublicHolidays: Array<{
|
|
15
20
|
month: number;
|
|
@@ -25,6 +25,23 @@ export declare function positionIdOf(name: string): string | undefined;
|
|
|
25
25
|
/** The selector shape every position-carrying save request wants — `undefined` for a blank
|
|
26
26
|
* name (the field itself has nothing to name), a resolved id alongside the name otherwise. */
|
|
27
27
|
export declare function positionSelectorOf(name: string | undefined, positionId?: string): FdtoSchedulePositionSelectorReq | undefined;
|
|
28
|
+
/** Position IDs are authoritative after a rename. Keep the stored name only as a fallback for
|
|
29
|
+
* archived or legacy references that cannot be resolved back to the active catalogue. */
|
|
30
|
+
export declare function positionNameOf(position: {
|
|
31
|
+
positionId?: string | null;
|
|
32
|
+
positionName: string;
|
|
33
|
+
} | null | undefined, catalogue?: readonly {
|
|
34
|
+
id: string;
|
|
35
|
+
name: string;
|
|
36
|
+
}[]): string | undefined;
|
|
37
|
+
/** Resolves a position only when it still exists in the active catalogue. */
|
|
38
|
+
export declare function activePositionNameOf(position: {
|
|
39
|
+
positionId?: string | null;
|
|
40
|
+
positionName: string;
|
|
41
|
+
} | null | undefined, catalogue?: readonly {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
}[]): string | undefined;
|
|
28
45
|
/** A saved position reference can outlive its catalogue entry after a soft delete. */
|
|
29
46
|
export declare function isArchivedPosition(name: string | undefined, positionId?: string): boolean;
|
|
30
47
|
/** Which coverage positions a station label counts toward. Positions ARE the roles in this
|
|
@@ -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, FdtoScheduleValidatePosAccessReq, FdtoScheduleCreateTimeOffReq, FdtoScheduleTimeOff, FdtoScheduleUpdateTimeOffStatusReq, FdtoScheduleSaveEmployeeConfigsReq, ScheduleReplaceDemandReq } from '@/types/schedule';
|
|
3
|
+
import type { FdtoScheduleAssignment, FdtoScheduleAutoScheduleApplyReq, FdtoScheduleAutoScheduleApplyResult, FdtoScheduleAutoScheduleCapabilities, FdtoScheduleAutoScheduleGenerateReq, FdtoScheduleAutoScheduleResult, FdtoScheduleBulkUpdateAssignmentStatusReq, FdtoScheduleCreateEmployeeProfileReq, FdtoScheduleSaveAssignmentReq, FdtoScheduleSavePositionReq, FdtoScheduleSaveScheduleDayReq, FdtoScheduleSaveSettingsReq, FdtoScheduleSettings, 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
|
|
@@ -21,6 +21,8 @@ export declare function setOutlet(restaurantId: string): boolean;
|
|
|
21
21
|
* headcounts sit nowhere near it. */
|
|
22
22
|
export declare function ensureRestaurantEmployeesLoaded(restaurantId: string): Promise<void>;
|
|
23
23
|
export declare function saveEmployeeConfigs(configs: FdtoScheduleSaveEmployeeConfigsReq['configs']): Promise<void>;
|
|
24
|
+
/** Saves outlet settings and keeps the board payload authoritative for any later cache rebuild. */
|
|
25
|
+
export declare function saveScheduleSettings(req: FdtoScheduleSaveSettingsReq): Promise<FdtoScheduleSettings>;
|
|
24
26
|
export declare function setEmployeeSchedulingEnabled(employeeId: string, enabled: boolean): Promise<void>;
|
|
25
27
|
/** Re-reads this outlet's POS roster. The roster is what the board's rows are built from and is
|
|
26
28
|
* otherwise fetched once per outlet, so any write that changes who works here (add, remove)
|
|
@@ -30,7 +32,7 @@ export declare function refreshRestaurantEmployees(): Promise<void>;
|
|
|
30
32
|
export declare function addEmployeeToOutlet(employeeId: string, roleId: string): Promise<void>;
|
|
31
33
|
/** Adds an employee to several outlets at once. Scheduling does not require a POS role, so the
|
|
32
34
|
* caller may pass an empty role id and assign the POS role later from Employee. */
|
|
33
|
-
export declare function addEmployeeToOutlets(employeeId: string, restaurantIds: string[], roleId?: string): Promise<void>;
|
|
35
|
+
export declare function addEmployeeToOutlets(employeeId: string, restaurantIds: string[], roleId?: string, enableScheduling?: boolean): Promise<void>;
|
|
34
36
|
/** Takes a POS user off the given outlets' rosters; their other outlets are untouched. */
|
|
35
37
|
export declare function removeEmployeeFromOutlets(employeeId: string, restaurantIds: string[]): Promise<void>;
|
|
36
38
|
/** Takes a POS user off this outlet's roster only. */
|
|
@@ -112,11 +114,9 @@ export declare function generateAutoSchedule(req: FdtoScheduleAutoScheduleGenera
|
|
|
112
114
|
export declare function getAutoScheduleCapabilities(): Promise<FdtoScheduleAutoScheduleCapabilities>;
|
|
113
115
|
export declare function applyAutoSchedule(req: FdtoScheduleAutoScheduleApplyReq): Promise<FdtoScheduleAutoScheduleApplyResult>;
|
|
114
116
|
/** A one-off shift assignment — someone working these hours on this date, not answering any
|
|
115
|
-
* Shift requirement.
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* discarding some OTHER unsaved shift elsewhere on the board (shifts have no write path of
|
|
119
|
-
* their own to read back from yet). */
|
|
117
|
+
* Shift requirement. Keep the raw payload in sync without bumping `dataVersion`: the current
|
|
118
|
+
* board owns the live draft, while a later roster refresh may rebuild the week cache from this
|
|
119
|
+
* payload. */
|
|
120
120
|
export declare function createAssignment(req: FdtoScheduleSaveAssignmentReq): Promise<FdtoScheduleAssignment>;
|
|
121
121
|
export declare function updateAssignment(id: string, req: FdtoScheduleSaveAssignmentReq): Promise<FdtoScheduleAssignment | null>;
|
|
122
122
|
export declare function bulkSaveAssignments(req: Parameters<typeof ScheduleAPI.bulkSaveAssignments>[1]): Promise<Awaited<ReturnType<typeof ScheduleAPI.bulkSaveAssignments>>>;
|
|
@@ -109,6 +109,9 @@ export interface Employee {
|
|
|
109
109
|
archivedPositions?: string[];
|
|
110
110
|
/** One entry per visible day of the horizon; null = day off. */
|
|
111
111
|
shifts: DaySlot[];
|
|
112
|
+
/** Dated time-off records are kept beside shifts so an off/leave card remains visible when
|
|
113
|
+
* a manager adds a shift on the same day. */
|
|
114
|
+
timeOff?: Array<LeaveSlot | null>;
|
|
112
115
|
remarks: EmployeeRemark[];
|
|
113
116
|
section: string;
|
|
114
117
|
compGroup?: string;
|
|
@@ -372,4 +375,6 @@ export interface Proposal {
|
|
|
372
375
|
weekKey?: string;
|
|
373
376
|
/** Why this person, for the card's tooltip. */
|
|
374
377
|
reason?: string;
|
|
378
|
+
/** Set when the server already knows applying this row would be refused; it starts rejected. */
|
|
379
|
+
rejectReason?: string;
|
|
375
380
|
}
|