@kernhq/module-hr 0.2.0 → 0.3.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.
Files changed (56) hide show
  1. package/dist/contract/approvals.d.ts +281 -0
  2. package/dist/contract/approvals.d.ts.map +1 -0
  3. package/dist/contract/approvals.js +127 -0
  4. package/dist/contract/approvals.js.map +1 -0
  5. package/dist/contract/capabilities.d.ts +1 -1
  6. package/dist/contract/capabilities.d.ts.map +1 -1
  7. package/dist/contract/capabilities.js +44 -0
  8. package/dist/contract/capabilities.js.map +1 -1
  9. package/dist/contract/events.d.ts +42 -0
  10. package/dist/contract/events.d.ts.map +1 -1
  11. package/dist/contract/events.js +42 -0
  12. package/dist/contract/events.js.map +1 -1
  13. package/dist/contract/index.d.ts +2 -0
  14. package/dist/contract/index.d.ts.map +1 -1
  15. package/dist/contract/index.js +2 -0
  16. package/dist/contract/index.js.map +1 -1
  17. package/dist/contract/leave.d.ts +168 -0
  18. package/dist/contract/leave.d.ts.map +1 -0
  19. package/dist/contract/leave.js +150 -0
  20. package/dist/contract/leave.js.map +1 -0
  21. package/dist/contract/permissions.d.ts +57 -0
  22. package/dist/contract/permissions.d.ts.map +1 -1
  23. package/dist/contract/permissions.js +69 -0
  24. package/dist/contract/permissions.js.map +1 -1
  25. package/dist/contract/router.d.ts +1446 -0
  26. package/dist/contract/router.d.ts.map +1 -1
  27. package/dist/contract/router.js +235 -0
  28. package/dist/contract/router.js.map +1 -1
  29. package/dist/server/router.d.ts +1646 -58
  30. package/dist/server/router.d.ts.map +1 -1
  31. package/dist/server/router.js +812 -2
  32. package/dist/server/router.js.map +1 -1
  33. package/dist/server/schema.d.ts +2084 -1
  34. package/dist/server/schema.d.ts.map +1 -1
  35. package/dist/server/schema.js +209 -0
  36. package/dist/server/schema.js.map +1 -1
  37. package/dist/server/services/approvals.d.ts +163 -0
  38. package/dist/server/services/approvals.d.ts.map +1 -0
  39. package/dist/server/services/approvals.js +325 -0
  40. package/dist/server/services/approvals.js.map +1 -0
  41. package/dist/server/services/ledger.d.ts +135 -0
  42. package/dist/server/services/ledger.d.ts.map +1 -0
  43. package/dist/server/services/ledger.js +178 -0
  44. package/dist/server/services/ledger.js.map +1 -0
  45. package/dist/server/services/people.d.ts +3 -3
  46. package/migrations/0002_leave.sql +237 -0
  47. package/migrations/meta/0002_snapshot.json +3009 -0
  48. package/migrations/meta/_journal.json +7 -0
  49. package/package.json +1 -1
  50. package/src/contract/approvals.ts +149 -0
  51. package/src/contract/capabilities.ts +44 -0
  52. package/src/contract/events.ts +57 -0
  53. package/src/contract/index.ts +2 -0
  54. package/src/contract/leave.ts +171 -0
  55. package/src/contract/permissions.ts +71 -0
  56. package/src/contract/router.ts +285 -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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"}
@@ -26,7 +26,7 @@ export declare const hrCapabilities: readonly {
26
26
  label: string;
27
27
  dependsOn: string[];
28
28
  defaultEnabled: boolean;
29
- level: 3 | 1 | 2;
29
+ level: 1 | 2 | 3;
30
30
  required: boolean;
31
31
  description?: string | undefined;
32
32
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,cAAc;;;;;;;;GAiDzB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAElE;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA4BpE,CAAA"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,cAAc;;;;;;;;GAqEzB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAElE;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAoDpE,CAAA"}
@@ -63,6 +63,26 @@ export const hrCapabilities = defineCapabilities([
63
63
  defaultEnabled: true,
64
64
  level: 1,
65
65
  },
66
+ {
67
+ id: 'leave',
68
+ label: 'Leave',
69
+ description: 'Time off: types, balances, requests and approvals',
70
+ dependsOn: ['core', 'calendars'],
71
+ // On by default. Leave is what most companies come to an HR system for, and a directory that
72
+ // cannot answer "who is off next week" is answering a question nobody asked.
73
+ defaultEnabled: true,
74
+ level: 1,
75
+ },
76
+ {
77
+ id: 'approvals',
78
+ label: 'Approval chains',
79
+ description: 'Named multi-step approvals with delegation, instead of a single manager',
80
+ dependsOn: ['core'],
81
+ // Off by default: at Level 1 the requester's manager approves, implicitly, and a company with
82
+ // one approver does not need a chain editor to find out that it has one.
83
+ defaultEnabled: false,
84
+ level: 2,
85
+ },
66
86
  {
67
87
  id: 'documents',
68
88
  label: 'Employee documents',
@@ -110,5 +130,29 @@ export const hrCapabilityProcedures = {
110
130
  'calendars.workingDays',
111
131
  ],
112
132
  documents: ['documents.list', 'documents.attach', 'documents.remove'],
133
+ leave: [
134
+ 'leave.types.list',
135
+ 'leave.types.create',
136
+ 'leave.types.update',
137
+ 'leave.types.archive',
138
+ 'leave.balance.get',
139
+ 'leave.ledger.list',
140
+ 'leave.adjust',
141
+ 'leave.requests.list',
142
+ 'leave.requests.get',
143
+ 'leave.requests.simulate',
144
+ 'leave.requests.create',
145
+ 'leave.requests.cancel',
146
+ 'leave.team.calendar',
147
+ ],
148
+ approvals: [
149
+ 'approvals.chains.list',
150
+ 'approvals.chains.create',
151
+ 'approvals.chains.update',
152
+ 'approvals.chains.archive',
153
+ 'approvals.delegate',
154
+ 'approvals.revokeDelegation',
155
+ 'approvals.delegations',
156
+ ],
113
157
  };
114
158
  //# sourceMappingURL=capabilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;IAC/C;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,6DAA6D;QAC1E,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,+EAA+E;QAC5F,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,iGAAiG;QACjG,+FAA+F;QAC/F,4FAA4F;QAC5F,+FAA+F;QAC/F,+BAA+B;QAC/B,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,mEAAmE;QAChF,iGAAiG;QACjG,4EAA4E;QAC5E,SAAS,EAAE,CAAC,SAAS,CAAC;QACtB,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,wDAAwD;QACrE,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,gGAAgG;QAChG,4CAA4C;QAC5C,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,iEAAiE;QAC9E,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,CAAC;KACT;CACF,CAAC,CAAA;AAIF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsC;IACvE,OAAO,EAAE;QACP,cAAc;QACd,aAAa;QACb,gBAAgB;QAChB,gBAAgB;QAChB,iBAAiB;QACjB,oBAAoB;QACpB,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;KACjB;IACD,cAAc,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;IAC3G,SAAS,EAAE;QACT,gBAAgB;QAChB,eAAe;QACf,kBAAkB;QAClB,kBAAkB;QAClB,mBAAmB;QACnB,qBAAqB;QACrB,oBAAoB;QACpB,uBAAuB;QACvB,uBAAuB;QACvB,wBAAwB;QACxB,sBAAsB;QACtB,uBAAuB;KACxB;IACD,SAAS,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC;CACtE,CAAA"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"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"}
@@ -64,6 +64,48 @@ export declare const hrEvents: {
64
64
  * sheet) is stale from here. The payload names the date range touched so a consumer can recompute
65
65
  * that window rather than everything.
66
66
  */
67
+ leaveRequested: import("@kernhq/contracts").EventDef<"hr.leave.requested", z.ZodObject<{
68
+ requestId: z.ZodUUID;
69
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
70
+ personId: z.ZodUUID;
71
+ startsOn: z.ZodISODate;
72
+ endsOn: z.ZodISODate;
73
+ }, z.core.$strip>>;
74
+ /**
75
+ * Decided either way, with the outcome in the payload.
76
+ *
77
+ * One event rather than approved/rejected pairs: every consumer so far cares that a decision
78
+ * happened and then branches, and two events means two subscriptions to keep in step.
79
+ */
80
+ leaveDecided: import("@kernhq/contracts").EventDef<"hr.leave.decided", z.ZodObject<{
81
+ requestId: z.ZodUUID;
82
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
83
+ personId: z.ZodUUID;
84
+ status: z.ZodString;
85
+ startsOn: z.ZodISODate;
86
+ endsOn: z.ZodISODate;
87
+ }, z.core.$strip>>;
88
+ /** A balance moved. Carries the delta so a consumer need not re-sum the ledger. */
89
+ leaveBalanceChanged: import("@kernhq/contracts").EventDef<"hr.leave.balance_changed", z.ZodObject<{
90
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
91
+ personId: z.ZodUUID;
92
+ leaveTypeId: z.ZodUUID;
93
+ deltaMinutes: z.ZodNumber;
94
+ }, z.core.$strip>>;
95
+ approvalRequested: import("@kernhq/contracts").EventDef<"hr.approval.requested", z.ZodObject<{
96
+ requestId: z.ZodUUID;
97
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
98
+ subjectType: z.ZodString;
99
+ subjectId: z.ZodUUID;
100
+ approverIds: z.ZodArray<z.ZodUUID>;
101
+ }, z.core.$strip>>;
102
+ approvalDecided: import("@kernhq/contracts").EventDef<"hr.approval.decided", z.ZodObject<{
103
+ requestId: z.ZodUUID;
104
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
105
+ subjectType: z.ZodString;
106
+ subjectId: z.ZodUUID;
107
+ status: z.ZodString;
108
+ }, z.core.$strip>>;
67
109
  calendarChanged: import("@kernhq/contracts").EventDef<"hr.calendar.changed", z.ZodObject<{
68
110
  calendarId: z.ZodUUID;
69
111
  workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/contract/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;IASnB;;;;;;OAMG;;;;;;;;;;;;;;IAoBH;;;;;OAKG;;;;;;;;;;;;;IAeH;;;;;;OAMG;;;;;;;CAUJ,CAAA"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/contract/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;IASnB;;;;;;OAMG;;;;;;;;;;;;;;IAoBH;;;;;OAKG;;;;;;;;;;;;;IAeH;;;;;;OAMG;;;;;;;;IAWH;;;;;OAKG;;;;;;;;;IAYH,mFAAmF;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCpF,CAAA"}
@@ -53,6 +53,48 @@ export const hrEvents = {
53
53
  * sheet) is stale from here. The payload names the date range touched so a consumer can recompute
54
54
  * that window rather than everything.
55
55
  */
56
+ leaveRequested: defineEvent('hr.leave.requested', z.object({
57
+ requestId: z.uuid(),
58
+ workspaceId: WorkspaceId,
59
+ personId: z.uuid(),
60
+ startsOn: z.iso.date(),
61
+ endsOn: z.iso.date(),
62
+ })),
63
+ /**
64
+ * Decided either way, with the outcome in the payload.
65
+ *
66
+ * One event rather than approved/rejected pairs: every consumer so far cares that a decision
67
+ * happened and then branches, and two events means two subscriptions to keep in step.
68
+ */
69
+ leaveDecided: defineEvent('hr.leave.decided', z.object({
70
+ requestId: z.uuid(),
71
+ workspaceId: WorkspaceId,
72
+ personId: z.uuid(),
73
+ status: z.string(),
74
+ startsOn: z.iso.date(),
75
+ endsOn: z.iso.date(),
76
+ })),
77
+ /** A balance moved. Carries the delta so a consumer need not re-sum the ledger. */
78
+ leaveBalanceChanged: defineEvent('hr.leave.balance_changed', z.object({
79
+ workspaceId: WorkspaceId,
80
+ personId: z.uuid(),
81
+ leaveTypeId: z.uuid(),
82
+ deltaMinutes: z.number().int(),
83
+ })),
84
+ approvalRequested: defineEvent('hr.approval.requested', z.object({
85
+ requestId: z.uuid(),
86
+ workspaceId: WorkspaceId,
87
+ subjectType: z.string(),
88
+ subjectId: z.uuid(),
89
+ approverIds: z.array(z.uuid()),
90
+ })),
91
+ approvalDecided: defineEvent('hr.approval.decided', z.object({
92
+ requestId: z.uuid(),
93
+ workspaceId: WorkspaceId,
94
+ subjectType: z.string(),
95
+ subjectId: z.uuid(),
96
+ status: z.string(),
97
+ })),
56
98
  calendarChanged: defineEvent('hr.calendar.changed', z.object({
57
99
  calendarId: z.uuid(),
58
100
  workspaceId: WorkspaceId,
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/contract/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,aAAa,EAAE,WAAW,CACxB,mBAAmB,EACnB,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CACxF;IACD,aAAa,EAAE,WAAW,CACxB,mBAAmB,EACnB,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CACxF;IACD;;;;;;OAMG;IACH,mBAAmB,EAAE,WAAW,CAC9B,0BAA0B,EAC1B,CAAC,CAAC,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KACjB,CAAC,CACH;IACD,iBAAiB,EAAE,WAAW,CAC5B,uBAAuB,EACvB,CAAC,CAAC,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,WAAW,EAAE,WAAW;QACxB,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE;QACtB,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KAC5B,CAAC,CACH;IACD;;;;;OAKG;IACH,uBAAuB,EAAE,WAAW,CAClC,8BAA8B,EAC9B,CAAC,CAAC,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;QACtB,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KAC5B,CAAC,CACH;IACD,aAAa,EAAE,WAAW,CACxB,mBAAmB,EACnB,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAChF;IACD;;;;;;OAMG;IACH,eAAe,EAAE,WAAW,CAC1B,qBAAqB,EACrB,CAAC,CAAC,MAAM,CAAC;QACP,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE;QACpB,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC7B,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC,CACH;CACF,CAAA"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/contract/events.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,10 @@
6
6
  * exists here and not in the router is a lie that compiles. `module.test.ts` checks exactly that,
7
7
  * and also that every procedure listed in `hrCapabilityProcedures` carries its capability guard.
8
8
  */
9
+ export * from './approvals.js';
9
10
  export * from './capabilities.js';
10
11
  export * from './events.js';
12
+ export * from './leave.js';
11
13
  export * from './models.js';
12
14
  export * from './permissions.js';
13
15
  export * from './router.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
@@ -6,8 +6,10 @@
6
6
  * exists here and not in the router is a lie that compiles. `module.test.ts` checks exactly that,
7
7
  * and also that every procedure listed in `hrCapabilityProcedures` carries its capability guard.
8
8
  */
9
+ export * from './approvals.js';
9
10
  export * from './capabilities.js';
10
11
  export * from './events.js';
12
+ export * from './leave.js';
11
13
  export * from './models.js';
12
14
  export * from './permissions.js';
13
15
  export * from './router.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}