@kernhq/module-hr 0.2.0 → 0.4.0
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/contract/approvals.d.ts +281 -0
- package/dist/contract/approvals.d.ts.map +1 -0
- package/dist/contract/approvals.js +127 -0
- package/dist/contract/approvals.js.map +1 -0
- package/dist/contract/attendance.d.ts +240 -0
- package/dist/contract/attendance.d.ts.map +1 -0
- package/dist/contract/attendance.js +154 -0
- package/dist/contract/attendance.js.map +1 -0
- package/dist/contract/capabilities.d.ts +1 -1
- package/dist/contract/capabilities.d.ts.map +1 -1
- package/dist/contract/capabilities.js +80 -0
- package/dist/contract/capabilities.js.map +1 -1
- package/dist/contract/events.d.ts +60 -0
- package/dist/contract/events.d.ts.map +1 -1
- package/dist/contract/events.js +60 -0
- package/dist/contract/events.js.map +1 -1
- package/dist/contract/index.d.ts +3 -0
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +3 -0
- package/dist/contract/index.js.map +1 -1
- package/dist/contract/leave.d.ts +168 -0
- package/dist/contract/leave.d.ts.map +1 -0
- package/dist/contract/leave.js +150 -0
- package/dist/contract/leave.js.map +1 -0
- package/dist/contract/permissions.d.ts +100 -0
- package/dist/contract/permissions.d.ts.map +1 -1
- package/dist/contract/permissions.js +119 -0
- package/dist/contract/permissions.js.map +1 -1
- package/dist/contract/router.d.ts +2440 -0
- package/dist/contract/router.d.ts.map +1 -1
- package/dist/contract/router.js +393 -0
- package/dist/contract/router.js.map +1 -1
- package/dist/policy/time.d.ts +48 -0
- package/dist/policy/time.d.ts.map +1 -0
- package/dist/policy/time.js +144 -0
- package/dist/policy/time.js.map +1 -0
- package/dist/policy/working-time.d.ts +98 -0
- package/dist/policy/working-time.d.ts.map +1 -0
- package/dist/policy/working-time.js +190 -0
- package/dist/policy/working-time.js.map +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs.d.ts +16 -0
- package/dist/server/jobs.d.ts.map +1 -0
- package/dist/server/jobs.js +166 -0
- package/dist/server/jobs.js.map +1 -0
- package/dist/server/router.d.ts +2731 -58
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +1306 -3
- package/dist/server/router.js.map +1 -1
- package/dist/server/schema.d.ts +3344 -1
- package/dist/server/schema.d.ts.map +1 -1
- package/dist/server/schema.js +325 -0
- package/dist/server/schema.js.map +1 -1
- package/dist/server/services/approvals.d.ts +163 -0
- package/dist/server/services/approvals.d.ts.map +1 -0
- package/dist/server/services/approvals.js +325 -0
- package/dist/server/services/approvals.js.map +1 -0
- package/dist/server/services/attendance.d.ts +150 -0
- package/dist/server/services/attendance.d.ts.map +1 -0
- package/dist/server/services/attendance.js +239 -0
- package/dist/server/services/attendance.js.map +1 -0
- package/dist/server/services/ledger.d.ts +135 -0
- package/dist/server/services/ledger.d.ts.map +1 -0
- package/dist/server/services/ledger.js +178 -0
- package/dist/server/services/ledger.js.map +1 -0
- package/dist/server/services/people.d.ts +3 -3
- package/migrations/0002_leave.sql +237 -0
- package/migrations/0003_attendance.sql +206 -0
- package/migrations/meta/0002_snapshot.json +3009 -0
- package/migrations/meta/0003_snapshot.json +3681 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +1 -1
- package/src/contract/approvals.ts +149 -0
- package/src/contract/attendance.ts +180 -0
- package/src/contract/capabilities.ts +80 -0
- package/src/contract/events.ts +81 -0
- package/src/contract/index.ts +3 -0
- package/src/contract/leave.ts +171 -0
- package/src/contract/permissions.ts +122 -0
- package/src/contract/router.ts +481 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* One approval engine, for everything that needs signing off.
|
|
4
|
+
*
|
|
5
|
+
* Keyed by `subjectType` + `subjectId` rather than by a foreign key to leave, so regularization,
|
|
6
|
+
* overtime and timesheets attach to it later without a schema change. That seam is the reason this
|
|
7
|
+
* is not just a few columns on `leave_requests`.
|
|
8
|
+
*
|
|
9
|
+
* The chain is **snapshotted onto the request when it is raised**. Editing the workflow afterwards
|
|
10
|
+
* must not change who has to sign a request already in flight — the version of that mistake where
|
|
11
|
+
* somebody's approved leave silently needs another signature is very hard to explain.
|
|
12
|
+
*/
|
|
13
|
+
export declare const ApprovalSubjectType: z.ZodEnum<{
|
|
14
|
+
leave: "leave";
|
|
15
|
+
regularization: "regularization";
|
|
16
|
+
overtime: "overtime";
|
|
17
|
+
timesheet: "timesheet";
|
|
18
|
+
shift_swap: "shift_swap";
|
|
19
|
+
}>;
|
|
20
|
+
export type ApprovalSubjectType = z.infer<typeof ApprovalSubjectType>;
|
|
21
|
+
/**
|
|
22
|
+
* Who is being asked. Resolved to people when the request is raised, so a later reorganisation does
|
|
23
|
+
* not silently move an in-flight approval to somebody else.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ApproverSubject: z.ZodObject<{
|
|
26
|
+
kind: z.ZodEnum<{
|
|
27
|
+
person: "person";
|
|
28
|
+
manager: "manager";
|
|
29
|
+
manager_of_manager: "manager_of_manager";
|
|
30
|
+
org_unit_head: "org_unit_head";
|
|
31
|
+
office_head: "office_head";
|
|
32
|
+
permission: "permission";
|
|
33
|
+
group: "group";
|
|
34
|
+
}>;
|
|
35
|
+
id: z.ZodOptional<z.ZodString>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
export type ApproverSubject = z.infer<typeof ApproverSubject>;
|
|
38
|
+
export declare const ApprovalStepMode: z.ZodEnum<{
|
|
39
|
+
any: "any";
|
|
40
|
+
all: "all";
|
|
41
|
+
quorum: "quorum";
|
|
42
|
+
}>;
|
|
43
|
+
export declare const ApprovalStepSpec: z.ZodObject<{
|
|
44
|
+
name: z.ZodString;
|
|
45
|
+
approvers: z.ZodArray<z.ZodObject<{
|
|
46
|
+
kind: z.ZodEnum<{
|
|
47
|
+
person: "person";
|
|
48
|
+
manager: "manager";
|
|
49
|
+
manager_of_manager: "manager_of_manager";
|
|
50
|
+
org_unit_head: "org_unit_head";
|
|
51
|
+
office_head: "office_head";
|
|
52
|
+
permission: "permission";
|
|
53
|
+
group: "group";
|
|
54
|
+
}>;
|
|
55
|
+
id: z.ZodOptional<z.ZodString>;
|
|
56
|
+
}, z.core.$strip>>;
|
|
57
|
+
mode: z.ZodEnum<{
|
|
58
|
+
any: "any";
|
|
59
|
+
all: "all";
|
|
60
|
+
quorum: "quorum";
|
|
61
|
+
}>;
|
|
62
|
+
minApprovals: z.ZodNumber;
|
|
63
|
+
slaHours: z.ZodNullable<z.ZodNumber>;
|
|
64
|
+
onTimeout: z.ZodEnum<{
|
|
65
|
+
remind: "remind";
|
|
66
|
+
escalate: "escalate";
|
|
67
|
+
auto_approve: "auto_approve";
|
|
68
|
+
}>;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
export type ApprovalStepSpec = z.infer<typeof ApprovalStepSpec>;
|
|
71
|
+
/** Steps run in order; the request advances only when the current one is satisfied. */
|
|
72
|
+
export declare const ApprovalChainSpec: z.ZodObject<{
|
|
73
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
74
|
+
name: z.ZodString;
|
|
75
|
+
approvers: z.ZodArray<z.ZodObject<{
|
|
76
|
+
kind: z.ZodEnum<{
|
|
77
|
+
person: "person";
|
|
78
|
+
manager: "manager";
|
|
79
|
+
manager_of_manager: "manager_of_manager";
|
|
80
|
+
org_unit_head: "org_unit_head";
|
|
81
|
+
office_head: "office_head";
|
|
82
|
+
permission: "permission";
|
|
83
|
+
group: "group";
|
|
84
|
+
}>;
|
|
85
|
+
id: z.ZodOptional<z.ZodString>;
|
|
86
|
+
}, z.core.$strip>>;
|
|
87
|
+
mode: z.ZodEnum<{
|
|
88
|
+
any: "any";
|
|
89
|
+
all: "all";
|
|
90
|
+
quorum: "quorum";
|
|
91
|
+
}>;
|
|
92
|
+
minApprovals: z.ZodNumber;
|
|
93
|
+
slaHours: z.ZodNullable<z.ZodNumber>;
|
|
94
|
+
onTimeout: z.ZodEnum<{
|
|
95
|
+
remind: "remind";
|
|
96
|
+
escalate: "escalate";
|
|
97
|
+
auto_approve: "auto_approve";
|
|
98
|
+
}>;
|
|
99
|
+
}, z.core.$strip>>;
|
|
100
|
+
}, z.core.$strip>;
|
|
101
|
+
export type ApprovalChainSpec = z.infer<typeof ApprovalChainSpec>;
|
|
102
|
+
export declare const ApprovalChain: z.ZodObject<{
|
|
103
|
+
name: z.ZodString;
|
|
104
|
+
subjectType: z.ZodEnum<{
|
|
105
|
+
leave: "leave";
|
|
106
|
+
regularization: "regularization";
|
|
107
|
+
overtime: "overtime";
|
|
108
|
+
timesheet: "timesheet";
|
|
109
|
+
shift_swap: "shift_swap";
|
|
110
|
+
}>;
|
|
111
|
+
spec: z.ZodObject<{
|
|
112
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
113
|
+
name: z.ZodString;
|
|
114
|
+
approvers: z.ZodArray<z.ZodObject<{
|
|
115
|
+
kind: z.ZodEnum<{
|
|
116
|
+
person: "person";
|
|
117
|
+
manager: "manager";
|
|
118
|
+
manager_of_manager: "manager_of_manager";
|
|
119
|
+
org_unit_head: "org_unit_head";
|
|
120
|
+
office_head: "office_head";
|
|
121
|
+
permission: "permission";
|
|
122
|
+
group: "group";
|
|
123
|
+
}>;
|
|
124
|
+
id: z.ZodOptional<z.ZodString>;
|
|
125
|
+
}, z.core.$strip>>;
|
|
126
|
+
mode: z.ZodEnum<{
|
|
127
|
+
any: "any";
|
|
128
|
+
all: "all";
|
|
129
|
+
quorum: "quorum";
|
|
130
|
+
}>;
|
|
131
|
+
minApprovals: z.ZodNumber;
|
|
132
|
+
slaHours: z.ZodNullable<z.ZodNumber>;
|
|
133
|
+
onTimeout: z.ZodEnum<{
|
|
134
|
+
remind: "remind";
|
|
135
|
+
escalate: "escalate";
|
|
136
|
+
auto_approve: "auto_approve";
|
|
137
|
+
}>;
|
|
138
|
+
}, z.core.$strip>>;
|
|
139
|
+
}, z.core.$strip>;
|
|
140
|
+
isDefault: z.ZodBoolean;
|
|
141
|
+
archivedAt: z.ZodNullable<z.ZodISODateTime>;
|
|
142
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
143
|
+
id: z.ZodUUID;
|
|
144
|
+
}, z.core.$strip>;
|
|
145
|
+
export type ApprovalChain = z.infer<typeof ApprovalChain>;
|
|
146
|
+
export declare const ApprovalStatus: z.ZodEnum<{
|
|
147
|
+
pending: "pending";
|
|
148
|
+
approved: "approved";
|
|
149
|
+
rejected: "rejected";
|
|
150
|
+
cancelled: "cancelled";
|
|
151
|
+
}>;
|
|
152
|
+
export type ApprovalStatus = z.infer<typeof ApprovalStatus>;
|
|
153
|
+
export declare const ApprovalDecision: z.ZodObject<{
|
|
154
|
+
id: z.ZodUUID;
|
|
155
|
+
stepId: z.ZodUUID;
|
|
156
|
+
approverId: z.ZodUUID;
|
|
157
|
+
onBehalfOfId: z.ZodNullable<z.ZodUUID>;
|
|
158
|
+
decision: z.ZodEnum<{
|
|
159
|
+
approve: "approve";
|
|
160
|
+
reject: "reject";
|
|
161
|
+
}>;
|
|
162
|
+
comment: z.ZodNullable<z.ZodString>;
|
|
163
|
+
at: z.ZodISODateTime;
|
|
164
|
+
}, z.core.$strip>;
|
|
165
|
+
export type ApprovalDecision = z.infer<typeof ApprovalDecision>;
|
|
166
|
+
export declare const ApprovalStep: z.ZodObject<{
|
|
167
|
+
id: z.ZodUUID;
|
|
168
|
+
requestId: z.ZodUUID;
|
|
169
|
+
stepIndex: z.ZodNumber;
|
|
170
|
+
name: z.ZodString;
|
|
171
|
+
mode: z.ZodEnum<{
|
|
172
|
+
any: "any";
|
|
173
|
+
all: "all";
|
|
174
|
+
quorum: "quorum";
|
|
175
|
+
}>;
|
|
176
|
+
minApprovals: z.ZodNumber;
|
|
177
|
+
approverIds: z.ZodArray<z.ZodUUID>;
|
|
178
|
+
status: z.ZodEnum<{
|
|
179
|
+
pending: "pending";
|
|
180
|
+
approved: "approved";
|
|
181
|
+
rejected: "rejected";
|
|
182
|
+
cancelled: "cancelled";
|
|
183
|
+
}>;
|
|
184
|
+
dueAt: z.ZodNullable<z.ZodISODateTime>;
|
|
185
|
+
escalatedAt: z.ZodNullable<z.ZodISODateTime>;
|
|
186
|
+
decisions: z.ZodArray<z.ZodObject<{
|
|
187
|
+
id: z.ZodUUID;
|
|
188
|
+
stepId: z.ZodUUID;
|
|
189
|
+
approverId: z.ZodUUID;
|
|
190
|
+
onBehalfOfId: z.ZodNullable<z.ZodUUID>;
|
|
191
|
+
decision: z.ZodEnum<{
|
|
192
|
+
approve: "approve";
|
|
193
|
+
reject: "reject";
|
|
194
|
+
}>;
|
|
195
|
+
comment: z.ZodNullable<z.ZodString>;
|
|
196
|
+
at: z.ZodISODateTime;
|
|
197
|
+
}, z.core.$strip>>;
|
|
198
|
+
}, z.core.$strip>;
|
|
199
|
+
export type ApprovalStep = z.infer<typeof ApprovalStep>;
|
|
200
|
+
export declare const ApprovalRequest: z.ZodObject<{
|
|
201
|
+
subjectType: z.ZodEnum<{
|
|
202
|
+
leave: "leave";
|
|
203
|
+
regularization: "regularization";
|
|
204
|
+
overtime: "overtime";
|
|
205
|
+
timesheet: "timesheet";
|
|
206
|
+
shift_swap: "shift_swap";
|
|
207
|
+
}>;
|
|
208
|
+
subjectId: z.ZodUUID;
|
|
209
|
+
summary: z.ZodString;
|
|
210
|
+
status: z.ZodEnum<{
|
|
211
|
+
pending: "pending";
|
|
212
|
+
approved: "approved";
|
|
213
|
+
rejected: "rejected";
|
|
214
|
+
cancelled: "cancelled";
|
|
215
|
+
}>;
|
|
216
|
+
currentStep: z.ZodNumber;
|
|
217
|
+
requestedBy: z.ZodNullable<z.ZodUUID>;
|
|
218
|
+
requestedAt: z.ZodISODateTime;
|
|
219
|
+
decidedAt: z.ZodNullable<z.ZodISODateTime>;
|
|
220
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
221
|
+
id: z.ZodUUID;
|
|
222
|
+
requestId: z.ZodUUID;
|
|
223
|
+
stepIndex: z.ZodNumber;
|
|
224
|
+
name: z.ZodString;
|
|
225
|
+
mode: z.ZodEnum<{
|
|
226
|
+
any: "any";
|
|
227
|
+
all: "all";
|
|
228
|
+
quorum: "quorum";
|
|
229
|
+
}>;
|
|
230
|
+
minApprovals: z.ZodNumber;
|
|
231
|
+
approverIds: z.ZodArray<z.ZodUUID>;
|
|
232
|
+
status: z.ZodEnum<{
|
|
233
|
+
pending: "pending";
|
|
234
|
+
approved: "approved";
|
|
235
|
+
rejected: "rejected";
|
|
236
|
+
cancelled: "cancelled";
|
|
237
|
+
}>;
|
|
238
|
+
dueAt: z.ZodNullable<z.ZodISODateTime>;
|
|
239
|
+
escalatedAt: z.ZodNullable<z.ZodISODateTime>;
|
|
240
|
+
decisions: z.ZodArray<z.ZodObject<{
|
|
241
|
+
id: z.ZodUUID;
|
|
242
|
+
stepId: z.ZodUUID;
|
|
243
|
+
approverId: z.ZodUUID;
|
|
244
|
+
onBehalfOfId: z.ZodNullable<z.ZodUUID>;
|
|
245
|
+
decision: z.ZodEnum<{
|
|
246
|
+
approve: "approve";
|
|
247
|
+
reject: "reject";
|
|
248
|
+
}>;
|
|
249
|
+
comment: z.ZodNullable<z.ZodString>;
|
|
250
|
+
at: z.ZodISODateTime;
|
|
251
|
+
}, z.core.$strip>>;
|
|
252
|
+
}, z.core.$strip>>;
|
|
253
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
254
|
+
id: z.ZodUUID;
|
|
255
|
+
}, z.core.$strip>;
|
|
256
|
+
export type ApprovalRequest = z.infer<typeof ApprovalRequest>;
|
|
257
|
+
/**
|
|
258
|
+
* Somebody else may decide in my place while I am away.
|
|
259
|
+
*
|
|
260
|
+
* A delegation does not move the request; it lets the delegate act on it, and the decision records
|
|
261
|
+
* both people. "Who approved this" must never become ambiguous.
|
|
262
|
+
*/
|
|
263
|
+
export declare const Delegation: z.ZodObject<{
|
|
264
|
+
fromPersonId: z.ZodUUID;
|
|
265
|
+
toPersonId: z.ZodUUID;
|
|
266
|
+
subjectType: z.ZodNullable<z.ZodEnum<{
|
|
267
|
+
leave: "leave";
|
|
268
|
+
regularization: "regularization";
|
|
269
|
+
overtime: "overtime";
|
|
270
|
+
timesheet: "timesheet";
|
|
271
|
+
shift_swap: "shift_swap";
|
|
272
|
+
}>>;
|
|
273
|
+
startsOn: z.ZodISODate;
|
|
274
|
+
endsOn: z.ZodISODate;
|
|
275
|
+
reason: z.ZodNullable<z.ZodString>;
|
|
276
|
+
createdAt: z.ZodISODateTime;
|
|
277
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
278
|
+
id: z.ZodUUID;
|
|
279
|
+
}, z.core.$strip>;
|
|
280
|
+
export type Delegation = z.infer<typeof Delegation>;
|
|
281
|
+
//# sourceMappingURL=approvals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/contract/approvals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,mBAAmB;;;;;;EAA6E,CAAA;AAC7G,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAErE;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;iBAiB1B,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAE7D,eAAO,MAAM,gBAAgB;;;;EAO3B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ3B,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D,uFAAuF;AACvF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAE5B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEjE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASxB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,eAAO,MAAM,cAAc;;;;;EAA2D,CAAA;AACtF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,gBAAgB;;;;;;;;;;;iBAS3B,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAavB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAa1B,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;iBAWrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Timestamp, WorkspaceId } from '@kernhq/contracts';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { IsoDate } from './models.js';
|
|
4
|
+
const ws = { workspaceId: WorkspaceId };
|
|
5
|
+
/**
|
|
6
|
+
* One approval engine, for everything that needs signing off.
|
|
7
|
+
*
|
|
8
|
+
* Keyed by `subjectType` + `subjectId` rather than by a foreign key to leave, so regularization,
|
|
9
|
+
* overtime and timesheets attach to it later without a schema change. That seam is the reason this
|
|
10
|
+
* is not just a few columns on `leave_requests`.
|
|
11
|
+
*
|
|
12
|
+
* The chain is **snapshotted onto the request when it is raised**. Editing the workflow afterwards
|
|
13
|
+
* must not change who has to sign a request already in flight — the version of that mistake where
|
|
14
|
+
* somebody's approved leave silently needs another signature is very hard to explain.
|
|
15
|
+
*/
|
|
16
|
+
export const ApprovalSubjectType = z.enum(['leave', 'regularization', 'overtime', 'timesheet', 'shift_swap']);
|
|
17
|
+
/**
|
|
18
|
+
* Who is being asked. Resolved to people when the request is raised, so a later reorganisation does
|
|
19
|
+
* not silently move an in-flight approval to somebody else.
|
|
20
|
+
*/
|
|
21
|
+
export const ApproverSubject = z.object({
|
|
22
|
+
kind: z.enum([
|
|
23
|
+
'person',
|
|
24
|
+
/** The requester's manager on the day the request was raised. */
|
|
25
|
+
'manager',
|
|
26
|
+
/** Two levels up. Falls back to one level if there is nobody above. */
|
|
27
|
+
'manager_of_manager',
|
|
28
|
+
/** Whoever heads the requester's department. */
|
|
29
|
+
'org_unit_head',
|
|
30
|
+
/** Whoever heads the requester's primary office — the local-HR step. */
|
|
31
|
+
'office_head',
|
|
32
|
+
/** Anybody holding a permission key, workspace-wide. */
|
|
33
|
+
'permission',
|
|
34
|
+
'group',
|
|
35
|
+
]),
|
|
36
|
+
/** Person id, permission key or group id, depending on `kind`. */
|
|
37
|
+
id: z.string().max(128).optional(),
|
|
38
|
+
});
|
|
39
|
+
export const ApprovalStepMode = z.enum([
|
|
40
|
+
/** Everyone named must approve. */
|
|
41
|
+
'all',
|
|
42
|
+
/** Any one of them is enough. */
|
|
43
|
+
'any',
|
|
44
|
+
/** `minApprovals` of them. */
|
|
45
|
+
'quorum',
|
|
46
|
+
]);
|
|
47
|
+
export const ApprovalStepSpec = z.object({
|
|
48
|
+
name: z.string().max(80),
|
|
49
|
+
approvers: z.array(ApproverSubject).min(1),
|
|
50
|
+
mode: ApprovalStepMode,
|
|
51
|
+
minApprovals: z.number().int().min(1),
|
|
52
|
+
/** Hours before the step is escalated or auto-decided. Null means it waits forever. */
|
|
53
|
+
slaHours: z.number().int().min(1).nullable(),
|
|
54
|
+
onTimeout: z.enum(['remind', 'escalate', 'auto_approve']),
|
|
55
|
+
});
|
|
56
|
+
/** Steps run in order; the request advances only when the current one is satisfied. */
|
|
57
|
+
export const ApprovalChainSpec = z.object({
|
|
58
|
+
steps: z.array(ApprovalStepSpec).min(1),
|
|
59
|
+
});
|
|
60
|
+
export const ApprovalChain = z.object({
|
|
61
|
+
id: z.uuid(),
|
|
62
|
+
...ws,
|
|
63
|
+
name: z.string().min(1).max(120),
|
|
64
|
+
subjectType: ApprovalSubjectType,
|
|
65
|
+
spec: ApprovalChainSpec,
|
|
66
|
+
/** Used when nothing more specific matches. Exactly one per subject type. */
|
|
67
|
+
isDefault: z.boolean(),
|
|
68
|
+
archivedAt: Timestamp.nullable(),
|
|
69
|
+
});
|
|
70
|
+
export const ApprovalStatus = z.enum(['pending', 'approved', 'rejected', 'cancelled']);
|
|
71
|
+
export const ApprovalDecision = z.object({
|
|
72
|
+
id: z.uuid(),
|
|
73
|
+
stepId: z.uuid(),
|
|
74
|
+
approverId: z.uuid(),
|
|
75
|
+
/** Set when somebody decided in another person's place through a delegation. */
|
|
76
|
+
onBehalfOfId: z.uuid().nullable(),
|
|
77
|
+
decision: z.enum(['approve', 'reject']),
|
|
78
|
+
comment: z.string().max(1000).nullable(),
|
|
79
|
+
at: Timestamp,
|
|
80
|
+
});
|
|
81
|
+
export const ApprovalStep = z.object({
|
|
82
|
+
id: z.uuid(),
|
|
83
|
+
requestId: z.uuid(),
|
|
84
|
+
stepIndex: z.number().int(),
|
|
85
|
+
name: z.string(),
|
|
86
|
+
mode: ApprovalStepMode,
|
|
87
|
+
minApprovals: z.number().int(),
|
|
88
|
+
/** Expanded at request time; a later reorganisation does not move an in-flight approval. */
|
|
89
|
+
approverIds: z.array(z.uuid()),
|
|
90
|
+
status: ApprovalStatus,
|
|
91
|
+
dueAt: Timestamp.nullable(),
|
|
92
|
+
escalatedAt: Timestamp.nullable(),
|
|
93
|
+
decisions: z.array(ApprovalDecision),
|
|
94
|
+
});
|
|
95
|
+
export const ApprovalRequest = z.object({
|
|
96
|
+
id: z.uuid(),
|
|
97
|
+
...ws,
|
|
98
|
+
subjectType: ApprovalSubjectType,
|
|
99
|
+
subjectId: z.uuid(),
|
|
100
|
+
/** A one-line description of what is being approved, so an inbox is readable without joins. */
|
|
101
|
+
summary: z.string().max(200),
|
|
102
|
+
status: ApprovalStatus,
|
|
103
|
+
currentStep: z.number().int(),
|
|
104
|
+
requestedBy: z.uuid().nullable(),
|
|
105
|
+
requestedAt: Timestamp,
|
|
106
|
+
decidedAt: Timestamp.nullable(),
|
|
107
|
+
steps: z.array(ApprovalStep),
|
|
108
|
+
});
|
|
109
|
+
/**
|
|
110
|
+
* Somebody else may decide in my place while I am away.
|
|
111
|
+
*
|
|
112
|
+
* A delegation does not move the request; it lets the delegate act on it, and the decision records
|
|
113
|
+
* both people. "Who approved this" must never become ambiguous.
|
|
114
|
+
*/
|
|
115
|
+
export const Delegation = z.object({
|
|
116
|
+
id: z.uuid(),
|
|
117
|
+
...ws,
|
|
118
|
+
fromPersonId: z.uuid(),
|
|
119
|
+
toPersonId: z.uuid(),
|
|
120
|
+
/** Null delegates every subject type. */
|
|
121
|
+
subjectType: ApprovalSubjectType.nullable(),
|
|
122
|
+
startsOn: IsoDate,
|
|
123
|
+
endsOn: IsoDate,
|
|
124
|
+
reason: z.string().max(200).nullable(),
|
|
125
|
+
createdAt: Timestamp,
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/contract/approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Attendance: who was at work, when, and for how long.
|
|
4
|
+
*
|
|
5
|
+
* Two rules shape everything here:
|
|
6
|
+
*
|
|
7
|
+
* - **Raw punches are immutable.** A wrong punch is *voided* by a correcting row, never edited. An
|
|
8
|
+
* attendance record somebody can quietly rewrite is worth nothing in the dispute it exists for.
|
|
9
|
+
* - **The day sheet is derived.** `AttendanceDay` is a projection of punches + schedule + calendar +
|
|
10
|
+
* leave, recomputable from scratch at any time. It is never the source of truth, so a bad
|
|
11
|
+
* computation is a bug to fix and re-run rather than data to repair by hand.
|
|
12
|
+
*/
|
|
13
|
+
export declare const PunchDirection: z.ZodEnum<{
|
|
14
|
+
out: "out";
|
|
15
|
+
in: "in";
|
|
16
|
+
break_start: "break_start";
|
|
17
|
+
break_end: "break_end";
|
|
18
|
+
}>;
|
|
19
|
+
export type PunchDirection = z.infer<typeof PunchDirection>;
|
|
20
|
+
export declare const PunchMethod: z.ZodEnum<{
|
|
21
|
+
web: "web";
|
|
22
|
+
mobile: "mobile";
|
|
23
|
+
kiosk: "kiosk";
|
|
24
|
+
qr: "qr";
|
|
25
|
+
device: "device";
|
|
26
|
+
import: "import";
|
|
27
|
+
manual: "manual";
|
|
28
|
+
}>;
|
|
29
|
+
export type PunchMethod = z.infer<typeof PunchMethod>;
|
|
30
|
+
/**
|
|
31
|
+
* How much the recorded instant can be trusted.
|
|
32
|
+
*
|
|
33
|
+
* `trusted` was stamped by the server as it happened. `claimed` came from a client that was offline
|
|
34
|
+
* and is asserting when it happened — believed within a policy threshold, flagged beyond it.
|
|
35
|
+
* `disputed` is a claim somebody has to look at. Client clocks lie, sometimes by accident and
|
|
36
|
+
* sometimes not, and a system that cannot say which is which cannot defend any of its numbers.
|
|
37
|
+
*/
|
|
38
|
+
export declare const PunchTrust: z.ZodEnum<{
|
|
39
|
+
trusted: "trusted";
|
|
40
|
+
claimed: "claimed";
|
|
41
|
+
disputed: "disputed";
|
|
42
|
+
}>;
|
|
43
|
+
export type PunchTrust = z.infer<typeof PunchTrust>;
|
|
44
|
+
export declare const Punch: z.ZodObject<{
|
|
45
|
+
personId: z.ZodUUID;
|
|
46
|
+
direction: z.ZodEnum<{
|
|
47
|
+
out: "out";
|
|
48
|
+
in: "in";
|
|
49
|
+
break_start: "break_start";
|
|
50
|
+
break_end: "break_end";
|
|
51
|
+
}>;
|
|
52
|
+
at: z.ZodISODateTime;
|
|
53
|
+
clientReportedAt: z.ZodNullable<z.ZodISODateTime>;
|
|
54
|
+
skewMs: z.ZodNullable<z.ZodNumber>;
|
|
55
|
+
businessDate: z.ZodISODate;
|
|
56
|
+
timezone: z.ZodString;
|
|
57
|
+
method: z.ZodEnum<{
|
|
58
|
+
web: "web";
|
|
59
|
+
mobile: "mobile";
|
|
60
|
+
kiosk: "kiosk";
|
|
61
|
+
qr: "qr";
|
|
62
|
+
device: "device";
|
|
63
|
+
import: "import";
|
|
64
|
+
manual: "manual";
|
|
65
|
+
}>;
|
|
66
|
+
officeId: z.ZodNullable<z.ZodUUID>;
|
|
67
|
+
deviceId: z.ZodNullable<z.ZodUUID>;
|
|
68
|
+
geo: z.ZodNullable<z.ZodObject<{
|
|
69
|
+
lat: z.ZodNumber;
|
|
70
|
+
lng: z.ZodNumber;
|
|
71
|
+
accuracyM: z.ZodOptional<z.ZodNumber>;
|
|
72
|
+
}, z.core.$strip>>;
|
|
73
|
+
trust: z.ZodEnum<{
|
|
74
|
+
trusted: "trusted";
|
|
75
|
+
claimed: "claimed";
|
|
76
|
+
disputed: "disputed";
|
|
77
|
+
}>;
|
|
78
|
+
voidedByPunchId: z.ZodNullable<z.ZodUUID>;
|
|
79
|
+
note: z.ZodNullable<z.ZodString>;
|
|
80
|
+
createdAt: z.ZodISODateTime;
|
|
81
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
82
|
+
id: z.ZodUUID;
|
|
83
|
+
}, z.core.$strip>;
|
|
84
|
+
export type Punch = z.infer<typeof Punch>;
|
|
85
|
+
export declare const AttendanceStatus: z.ZodEnum<{
|
|
86
|
+
leave: "leave";
|
|
87
|
+
pending: "pending";
|
|
88
|
+
present: "present";
|
|
89
|
+
absent: "absent";
|
|
90
|
+
holiday: "holiday";
|
|
91
|
+
weekend: "weekend";
|
|
92
|
+
partial: "partial";
|
|
93
|
+
}>;
|
|
94
|
+
export type AttendanceStatus = z.infer<typeof AttendanceStatus>;
|
|
95
|
+
/**
|
|
96
|
+
* One person, one day, derived.
|
|
97
|
+
*
|
|
98
|
+
* Recomputable from punches, schedule, calendar and leave at any moment. `policyHash` records what
|
|
99
|
+
* produced it, so a recomputation can tell whether a row is stale; `locked` mirrors the period, so
|
|
100
|
+
* a closed month cannot silently move.
|
|
101
|
+
*/
|
|
102
|
+
export declare const AttendanceDay: z.ZodObject<{
|
|
103
|
+
personId: z.ZodUUID;
|
|
104
|
+
businessDate: z.ZodISODate;
|
|
105
|
+
scheduledMinutes: z.ZodNumber;
|
|
106
|
+
workedMinutes: z.ZodNumber;
|
|
107
|
+
breakMinutes: z.ZodNumber;
|
|
108
|
+
overtimeMinutes: z.ZodNumber;
|
|
109
|
+
lateMinutes: z.ZodNumber;
|
|
110
|
+
earlyLeaveMinutes: z.ZodNumber;
|
|
111
|
+
status: z.ZodEnum<{
|
|
112
|
+
leave: "leave";
|
|
113
|
+
pending: "pending";
|
|
114
|
+
present: "present";
|
|
115
|
+
absent: "absent";
|
|
116
|
+
holiday: "holiday";
|
|
117
|
+
weekend: "weekend";
|
|
118
|
+
partial: "partial";
|
|
119
|
+
}>;
|
|
120
|
+
leaveRequestId: z.ZodNullable<z.ZodUUID>;
|
|
121
|
+
anomalies: z.ZodArray<z.ZodString>;
|
|
122
|
+
firstIn: z.ZodNullable<z.ZodISODateTime>;
|
|
123
|
+
lastOut: z.ZodNullable<z.ZodISODateTime>;
|
|
124
|
+
policyHash: z.ZodNullable<z.ZodString>;
|
|
125
|
+
locked: z.ZodBoolean;
|
|
126
|
+
computedAt: z.ZodISODateTime;
|
|
127
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
128
|
+
id: z.ZodUUID;
|
|
129
|
+
}, z.core.$strip>;
|
|
130
|
+
export type AttendanceDay = z.infer<typeof AttendanceDay>;
|
|
131
|
+
/** A week of shifts, in wall-clock readings. Meaningless until a date and a zone arrive. */
|
|
132
|
+
export declare const ScheduleWeek: z.ZodRecord<z.ZodEnum<{
|
|
133
|
+
mon: "mon";
|
|
134
|
+
tue: "tue";
|
|
135
|
+
wed: "wed";
|
|
136
|
+
thu: "thu";
|
|
137
|
+
fri: "fri";
|
|
138
|
+
sat: "sat";
|
|
139
|
+
sun: "sun";
|
|
140
|
+
}>, z.ZodNullable<z.ZodObject<{
|
|
141
|
+
start: z.ZodString;
|
|
142
|
+
end: z.ZodString;
|
|
143
|
+
breakMinutes: z.ZodDefault<z.ZodNumber>;
|
|
144
|
+
}, z.core.$strip>>>;
|
|
145
|
+
export type ScheduleWeek = z.infer<typeof ScheduleWeek>;
|
|
146
|
+
export declare const Schedule: z.ZodObject<{
|
|
147
|
+
name: z.ZodString;
|
|
148
|
+
kind: z.ZodEnum<{
|
|
149
|
+
fixed: "fixed";
|
|
150
|
+
flexible: "flexible";
|
|
151
|
+
shift: "shift";
|
|
152
|
+
}>;
|
|
153
|
+
week: z.ZodRecord<z.ZodEnum<{
|
|
154
|
+
mon: "mon";
|
|
155
|
+
tue: "tue";
|
|
156
|
+
wed: "wed";
|
|
157
|
+
thu: "thu";
|
|
158
|
+
fri: "fri";
|
|
159
|
+
sat: "sat";
|
|
160
|
+
sun: "sun";
|
|
161
|
+
}>, z.ZodNullable<z.ZodObject<{
|
|
162
|
+
start: z.ZodString;
|
|
163
|
+
end: z.ZodString;
|
|
164
|
+
breakMinutes: z.ZodDefault<z.ZodNumber>;
|
|
165
|
+
}, z.core.$strip>>>;
|
|
166
|
+
tzMode: z.ZodEnum<{
|
|
167
|
+
person: "person";
|
|
168
|
+
office: "office";
|
|
169
|
+
fixed: "fixed";
|
|
170
|
+
}>;
|
|
171
|
+
tz: z.ZodNullable<z.ZodString>;
|
|
172
|
+
graceInMinutes: z.ZodNumber;
|
|
173
|
+
graceOutMinutes: z.ZodNumber;
|
|
174
|
+
roundingStepMinutes: z.ZodNumber;
|
|
175
|
+
roundingDirection: z.ZodEnum<{
|
|
176
|
+
nearest: "nearest";
|
|
177
|
+
employee: "employee";
|
|
178
|
+
employer: "employer";
|
|
179
|
+
}>;
|
|
180
|
+
autoClockOutAfterMinutes: z.ZodNullable<z.ZodNumber>;
|
|
181
|
+
archivedAt: z.ZodNullable<z.ZodISODateTime>;
|
|
182
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
183
|
+
id: z.ZodUUID;
|
|
184
|
+
}, z.core.$strip>;
|
|
185
|
+
export type Schedule = z.infer<typeof Schedule>;
|
|
186
|
+
export declare const ScheduleAssignment: z.ZodObject<{
|
|
187
|
+
personId: z.ZodUUID;
|
|
188
|
+
scheduleId: z.ZodUUID;
|
|
189
|
+
effectiveFrom: z.ZodISODate;
|
|
190
|
+
effectiveTo: z.ZodNullable<z.ZodISODate>;
|
|
191
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
192
|
+
id: z.ZodUUID;
|
|
193
|
+
}, z.core.$strip>;
|
|
194
|
+
export type ScheduleAssignment = z.infer<typeof ScheduleAssignment>;
|
|
195
|
+
/**
|
|
196
|
+
* A request to fix a wrong or missing punch.
|
|
197
|
+
*
|
|
198
|
+
* It does not edit anything. Approving it writes *new* punches that void the old ones, so the
|
|
199
|
+
* original record and the correction both survive — which is the difference between a corrected
|
|
200
|
+
* timesheet and an edited one.
|
|
201
|
+
*/
|
|
202
|
+
export declare const Regularization: z.ZodObject<{
|
|
203
|
+
personId: z.ZodUUID;
|
|
204
|
+
businessDate: z.ZodISODate;
|
|
205
|
+
punchId: z.ZodNullable<z.ZodUUID>;
|
|
206
|
+
proposed: z.ZodArray<z.ZodObject<{
|
|
207
|
+
direction: z.ZodEnum<{
|
|
208
|
+
out: "out";
|
|
209
|
+
in: "in";
|
|
210
|
+
break_start: "break_start";
|
|
211
|
+
break_end: "break_end";
|
|
212
|
+
}>;
|
|
213
|
+
at: z.ZodISODateTime;
|
|
214
|
+
}, z.core.$strip>>;
|
|
215
|
+
reason: z.ZodString;
|
|
216
|
+
status: z.ZodEnum<{
|
|
217
|
+
pending: "pending";
|
|
218
|
+
approved: "approved";
|
|
219
|
+
rejected: "rejected";
|
|
220
|
+
cancelled: "cancelled";
|
|
221
|
+
}>;
|
|
222
|
+
approvalRequestId: z.ZodNullable<z.ZodUUID>;
|
|
223
|
+
appliedAt: z.ZodNullable<z.ZodISODateTime>;
|
|
224
|
+
createdAt: z.ZodISODateTime;
|
|
225
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
226
|
+
id: z.ZodUUID;
|
|
227
|
+
}, z.core.$strip>;
|
|
228
|
+
export type Regularization = z.infer<typeof Regularization>;
|
|
229
|
+
/** The person's own live state: are they clocked in, since when, on a break? */
|
|
230
|
+
export declare const ClockState: z.ZodObject<{
|
|
231
|
+
personId: z.ZodUUID;
|
|
232
|
+
businessDate: z.ZodISODate;
|
|
233
|
+
clockedIn: z.ZodBoolean;
|
|
234
|
+
onBreak: z.ZodBoolean;
|
|
235
|
+
since: z.ZodNullable<z.ZodISODateTime>;
|
|
236
|
+
workedMinutesToday: z.ZodNumber;
|
|
237
|
+
timezone: z.ZodString;
|
|
238
|
+
}, z.core.$strip>;
|
|
239
|
+
export type ClockState = z.infer<typeof ClockState>;
|
|
240
|
+
//# sourceMappingURL=attendance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attendance.d.ts","sourceRoot":"","sources":["../../src/contract/attendance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,cAAc;;;;;EAAoD,CAAA;AAC/E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,WAAW;;;;;;;;EAAyE,CAAA;AACjG,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;;;;EAA6C,CAAA;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAA;AAEzC,eAAO,MAAM,gBAAgB;;;;;;;;EAS3B,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBxB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,4FAA4F;AAC5F,eAAO,MAAM,YAAY;;;;;;;;;;;;mBASxB,CAAA;AACD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgBnB,CAAA;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE/C,eAAO,MAAM,kBAAkB;;;;;;;iBAO7B,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;iBAazB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,gFAAgF;AAChF,eAAO,MAAM,UAAU;;;;;;;;iBAQrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
|