@kernhq/module-hr 0.7.0 → 0.8.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 (44) hide show
  1. package/dist/contract/capabilities.d.ts.map +1 -1
  2. package/dist/contract/capabilities.js +31 -0
  3. package/dist/contract/capabilities.js.map +1 -1
  4. package/dist/contract/index.d.ts +1 -0
  5. package/dist/contract/index.d.ts.map +1 -1
  6. package/dist/contract/index.js +1 -0
  7. package/dist/contract/index.js.map +1 -1
  8. package/dist/contract/permissions.d.ts +23 -0
  9. package/dist/contract/permissions.d.ts.map +1 -1
  10. package/dist/contract/permissions.js +27 -0
  11. package/dist/contract/permissions.js.map +1 -1
  12. package/dist/contract/policies.d.ts +256 -0
  13. package/dist/contract/policies.d.ts.map +1 -0
  14. package/dist/contract/policies.js +175 -0
  15. package/dist/contract/policies.js.map +1 -0
  16. package/dist/contract/router.d.ts +707 -0
  17. package/dist/contract/router.d.ts.map +1 -1
  18. package/dist/contract/router.js +127 -0
  19. package/dist/contract/router.js.map +1 -1
  20. package/dist/policy/accrual.d.ts +127 -0
  21. package/dist/policy/accrual.d.ts.map +1 -0
  22. package/dist/policy/accrual.js +134 -0
  23. package/dist/policy/accrual.js.map +1 -0
  24. package/dist/server/jobs.d.ts.map +1 -1
  25. package/dist/server/jobs.js +186 -1
  26. package/dist/server/jobs.js.map +1 -1
  27. package/dist/server/router.d.ts +772 -0
  28. package/dist/server/router.d.ts.map +1 -1
  29. package/dist/server/router.js +462 -1
  30. package/dist/server/router.js.map +1 -1
  31. package/dist/server/schema.d.ts +612 -1
  32. package/dist/server/schema.d.ts.map +1 -1
  33. package/dist/server/schema.js +76 -0
  34. package/dist/server/schema.js.map +1 -1
  35. package/dist/server/services/policies.d.ts +53 -0
  36. package/dist/server/services/policies.d.ts.map +1 -0
  37. package/dist/server/services/policies.js +158 -0
  38. package/dist/server/services/policies.js.map +1 -0
  39. package/migrations/meta/_journal.json +7 -0
  40. package/package.json +1 -1
  41. package/src/contract/capabilities.ts +31 -0
  42. package/src/contract/index.ts +1 -0
  43. package/src/contract/permissions.ts +28 -0
  44. package/src/contract/router.ts +148 -0
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,cAAc;;;;;;;;GAuFzB,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,CAsEpE,CAAA"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,cAAc;;;;;;;;GAyGzB,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,CAmFpE,CAAA"}
@@ -73,6 +73,24 @@ export const hrCapabilities = defineCapabilities([
73
73
  defaultEnabled: true,
74
74
  level: 1,
75
75
  },
76
+ {
77
+ id: 'leave_accrual',
78
+ label: 'Accrual',
79
+ description: 'Earn leave over time, with proration, carry-forward and expiry',
80
+ dependsOn: ['leave'],
81
+ // Off by default. Plenty of companies grant a fixed allowance on 1 January and never accrue —
82
+ // and for them an accrual engine is a screen full of settings that change nothing.
83
+ defaultEnabled: false,
84
+ level: 2,
85
+ },
86
+ {
87
+ id: 'periods',
88
+ label: 'Payroll periods',
89
+ description: 'Close a month so a filed payroll cannot move underneath it',
90
+ dependsOn: ['core'],
91
+ defaultEnabled: false,
92
+ level: 2,
93
+ },
76
94
  {
77
95
  id: 'approvals',
78
96
  label: 'Approval chains',
@@ -181,6 +199,19 @@ export const hrCapabilityProcedures = {
181
199
  'attendance.regularizations.list',
182
200
  'attendance.regularizations.request',
183
201
  ],
202
+ leave_accrual: [
203
+ 'policies.list',
204
+ 'policies.get',
205
+ 'policies.create',
206
+ 'policies.update',
207
+ 'policies.archive',
208
+ 'policies.assign',
209
+ 'policies.unassign',
210
+ 'policies.resolveFor',
211
+ 'accrual.preview',
212
+ 'accrual.run',
213
+ ],
214
+ periods: ['periods.list', 'periods.create', 'periods.lock', 'periods.unlock'],
184
215
  approvals: [
185
216
  'approvals.chains.list',
186
217
  'approvals.chains.create',
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export * from './events.js';
13
13
  export * from './leave.js';
14
14
  export * from './models.js';
15
15
  export * from './permissions.js';
16
+ export * from './policies.js';
16
17
  export * from './router.js';
17
18
  export * from './settings.js';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
@@ -13,6 +13,7 @@ export * from './events.js';
13
13
  export * from './leave.js';
14
14
  export * from './models.js';
15
15
  export * from './permissions.js';
16
+ export * from './policies.js';
16
17
  export * from './router.js';
17
18
  export * from './settings.js';
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
@@ -214,6 +214,26 @@ export declare const hrPermissions: readonly [{
214
214
  readonly scope: "workspace";
215
215
  readonly defaultRoles: ["owner", "admin"];
216
216
  readonly dangerous: false;
217
+ }, {
218
+ readonly key: "hr.policy.view";
219
+ readonly label: "View accrual, overtime and rounding policies";
220
+ readonly scope: "workspace";
221
+ readonly defaultRoles: ["owner", "admin"];
222
+ readonly dangerous: false;
223
+ }, {
224
+ readonly key: "hr.policy.manage";
225
+ readonly label: "Change policies and who they apply to";
226
+ readonly description: "Changes what everybody accrues. A retroactive change is an adjustment, not a rewrite.";
227
+ readonly scope: "workspace";
228
+ readonly defaultRoles: ["owner"];
229
+ readonly dangerous: true;
230
+ }, {
231
+ readonly key: "hr.period.manage";
232
+ readonly label: "Open, lock and unlock payroll periods";
233
+ readonly description: "Locking freezes a month against recomputation. Unlocking lets it move again.";
234
+ readonly scope: "workspace";
235
+ readonly defaultRoles: ["owner"];
236
+ readonly dangerous: true;
217
237
  }, {
218
238
  readonly key: "hr.approval.manage";
219
239
  readonly label: "Configure approval chains";
@@ -268,6 +288,9 @@ export declare const HR_PERMISSIONS: {
268
288
  readonly attendanceManage: "hr.attendance.manage";
269
289
  readonly overtimeView: "hr.overtime.view";
270
290
  readonly overtimeManage: "hr.overtime.manage";
291
+ readonly policyView: "hr.policy.view";
292
+ readonly policyManage: "hr.policy.manage";
293
+ readonly periodManage: "hr.period.manage";
271
294
  readonly approvalManage: "hr.approval.manage";
272
295
  readonly approvalDelegate: "hr.approval.delegate";
273
296
  };
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoRxB,CAAA;AAEF,+DAA+D;AAC/D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCjB,CAAA"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6SxB,CAAA;AAEF,+DAA+D;AAC/D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCjB,CAAA"}
@@ -263,6 +263,30 @@ export const hrPermissions = definePermissions([
263
263
  defaultRoles: ['owner', 'admin'],
264
264
  dangerous: false,
265
265
  },
266
+ // ---------------------------------------------------------------- policies and periods
267
+ {
268
+ key: 'hr.policy.view',
269
+ label: 'View accrual, overtime and rounding policies',
270
+ scope: 'workspace',
271
+ defaultRoles: ['owner', 'admin'],
272
+ dangerous: false,
273
+ },
274
+ {
275
+ key: 'hr.policy.manage',
276
+ label: 'Change policies and who they apply to',
277
+ description: 'Changes what everybody accrues. A retroactive change is an adjustment, not a rewrite.',
278
+ scope: 'workspace',
279
+ defaultRoles: ['owner'],
280
+ dangerous: true,
281
+ },
282
+ {
283
+ key: 'hr.period.manage',
284
+ label: 'Open, lock and unlock payroll periods',
285
+ description: 'Locking freezes a month against recomputation. Unlocking lets it move again.',
286
+ scope: 'workspace',
287
+ defaultRoles: ['owner'],
288
+ dangerous: true,
289
+ },
266
290
  // ---------------------------------------------------------------- approvals
267
291
  {
268
292
  key: 'hr.approval.manage',
@@ -322,6 +346,9 @@ export const HR_PERMISSIONS = {
322
346
  attendanceManage: 'hr.attendance.manage',
323
347
  overtimeView: 'hr.overtime.view',
324
348
  overtimeManage: 'hr.overtime.manage',
349
+ policyView: 'hr.policy.view',
350
+ policyManage: 'hr.policy.manage',
351
+ periodManage: 'hr.period.manage',
325
352
  approvalManage: 'hr.approval.manage',
326
353
  approvalDelegate: 'hr.approval.delegate',
327
354
  };
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Policies as data, and the ladder that decides which one applies.
4
+ *
5
+ * Leave entitlement, overtime rules and rounding differ per company and per country, and encoding
6
+ * that as `if (country === 'TR')` is how a product acquires a branch per customer. A policy is a
7
+ * row: a kind, a config validated by that kind's schema, an effective range, and an assignment to
8
+ * somebody — a person, an office, a department, or the whole workspace.
9
+ *
10
+ * **One ladder, used by everything**: `person → primary office → legal entity → org unit →
11
+ * position → workspace`, nearest wins. The same order resolves a calendar, so there is never a
12
+ * second precedence rule to remember.
13
+ */
14
+ export declare const PolicyKind: z.ZodEnum<{
15
+ overtime: "overtime";
16
+ accrual: "accrual";
17
+ carry_forward: "carry_forward";
18
+ rounding: "rounding";
19
+ working_time: "working_time";
20
+ }>;
21
+ export type PolicyKind = z.infer<typeof PolicyKind>;
22
+ /**
23
+ * Rungs of the ladder, and the priority each carries.
24
+ *
25
+ * The numbers are the ladder made explicit so a query can order by them rather than a service
26
+ * knowing the sequence by heart.
27
+ */
28
+ export declare const PolicySubjectKind: z.ZodEnum<{
29
+ person: "person";
30
+ office: "office";
31
+ legal_entity: "legal_entity";
32
+ org_unit: "org_unit";
33
+ position: "position";
34
+ workspace: "workspace";
35
+ }>;
36
+ export type PolicySubjectKind = z.infer<typeof PolicySubjectKind>;
37
+ export declare const SUBJECT_PRIORITY: Record<PolicySubjectKind, number>;
38
+ export declare const SeniorityTier: z.ZodObject<{
39
+ afterYears: z.ZodNumber;
40
+ daysPerYear: z.ZodNumber;
41
+ }, z.core.$strip>;
42
+ export declare const AccrualConfig: z.ZodObject<{
43
+ frequency: z.ZodEnum<{
44
+ monthly: "monthly";
45
+ annual: "annual";
46
+ anniversary: "anniversary";
47
+ per_hour_worked: "per_hour_worked";
48
+ }>;
49
+ daysPerYear: z.ZodNumber;
50
+ minutesPerDay: z.ZodNumber;
51
+ seniorityTiers: z.ZodDefault<z.ZodArray<z.ZodObject<{
52
+ afterYears: z.ZodNumber;
53
+ daysPerYear: z.ZodNumber;
54
+ }, z.core.$strip>>>;
55
+ waitingPeriodMonths: z.ZodDefault<z.ZodNumber>;
56
+ calendar: z.ZodDefault<z.ZodEnum<{
57
+ gregorian: "gregorian";
58
+ persian: "persian";
59
+ }>>;
60
+ roundToMinutes: z.ZodDefault<z.ZodNumber>;
61
+ leaveTypeKey: z.ZodString;
62
+ }, z.core.$strip>;
63
+ export type AccrualConfig = z.infer<typeof AccrualConfig>;
64
+ export declare const CarryForwardConfig: z.ZodObject<{
65
+ leaveTypeKey: z.ZodString;
66
+ maxDays: z.ZodNumber;
67
+ expiresAfterMonths: z.ZodNullable<z.ZodNumber>;
68
+ }, z.core.$strip>;
69
+ export type CarryForwardConfig = z.infer<typeof CarryForwardConfig>;
70
+ export declare const OvertimeConfig: z.ZodObject<{
71
+ thresholdMinutes: z.ZodDefault<z.ZodNumber>;
72
+ capMinutesPerYear: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
73
+ rate: z.ZodDefault<z.ZodNumber>;
74
+ requiresApproval: z.ZodDefault<z.ZodBoolean>;
75
+ compOffLeaveTypeKey: z.ZodDefault<z.ZodNullable<z.ZodString>>;
76
+ }, z.core.$strip>;
77
+ export type OvertimeConfig = z.infer<typeof OvertimeConfig>;
78
+ export declare const RoundingConfig: z.ZodObject<{
79
+ stepMinutes: z.ZodNumber;
80
+ direction: z.ZodEnum<{
81
+ nearest: "nearest";
82
+ employee: "employee";
83
+ employer: "employer";
84
+ }>;
85
+ }, z.core.$strip>;
86
+ export type RoundingConfig = z.infer<typeof RoundingConfig>;
87
+ export declare const WorkingTimeConfig: z.ZodObject<{
88
+ minutesPerDay: z.ZodNumber;
89
+ maxMinutesPerWeek: z.ZodNullable<z.ZodNumber>;
90
+ minRestMinutes: z.ZodNullable<z.ZodNumber>;
91
+ }, z.core.$strip>;
92
+ export type WorkingTimeConfig = z.infer<typeof WorkingTimeConfig>;
93
+ /** The config union, keyed by kind. Each kind validates its own shape before it runs. */
94
+ export declare const PolicyConfig: z.ZodUnion<readonly [z.ZodObject<{
95
+ frequency: z.ZodEnum<{
96
+ monthly: "monthly";
97
+ annual: "annual";
98
+ anniversary: "anniversary";
99
+ per_hour_worked: "per_hour_worked";
100
+ }>;
101
+ daysPerYear: z.ZodNumber;
102
+ minutesPerDay: z.ZodNumber;
103
+ seniorityTiers: z.ZodDefault<z.ZodArray<z.ZodObject<{
104
+ afterYears: z.ZodNumber;
105
+ daysPerYear: z.ZodNumber;
106
+ }, z.core.$strip>>>;
107
+ waitingPeriodMonths: z.ZodDefault<z.ZodNumber>;
108
+ calendar: z.ZodDefault<z.ZodEnum<{
109
+ gregorian: "gregorian";
110
+ persian: "persian";
111
+ }>>;
112
+ roundToMinutes: z.ZodDefault<z.ZodNumber>;
113
+ leaveTypeKey: z.ZodString;
114
+ }, z.core.$strip>, z.ZodObject<{
115
+ leaveTypeKey: z.ZodString;
116
+ maxDays: z.ZodNumber;
117
+ expiresAfterMonths: z.ZodNullable<z.ZodNumber>;
118
+ }, z.core.$strip>, z.ZodObject<{
119
+ thresholdMinutes: z.ZodDefault<z.ZodNumber>;
120
+ capMinutesPerYear: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
121
+ rate: z.ZodDefault<z.ZodNumber>;
122
+ requiresApproval: z.ZodDefault<z.ZodBoolean>;
123
+ compOffLeaveTypeKey: z.ZodDefault<z.ZodNullable<z.ZodString>>;
124
+ }, z.core.$strip>, z.ZodObject<{
125
+ stepMinutes: z.ZodNumber;
126
+ direction: z.ZodEnum<{
127
+ nearest: "nearest";
128
+ employee: "employee";
129
+ employer: "employer";
130
+ }>;
131
+ }, z.core.$strip>, z.ZodObject<{
132
+ minutesPerDay: z.ZodNumber;
133
+ maxMinutesPerWeek: z.ZodNullable<z.ZodNumber>;
134
+ minRestMinutes: z.ZodNullable<z.ZodNumber>;
135
+ }, z.core.$strip>]>;
136
+ export declare const Policy: z.ZodObject<{
137
+ kind: z.ZodEnum<{
138
+ overtime: "overtime";
139
+ accrual: "accrual";
140
+ carry_forward: "carry_forward";
141
+ rounding: "rounding";
142
+ working_time: "working_time";
143
+ }>;
144
+ name: z.ZodString;
145
+ config: z.ZodRecord<z.ZodString, z.ZodUnknown>;
146
+ effectiveFrom: z.ZodISODate;
147
+ effectiveTo: z.ZodNullable<z.ZodISODate>;
148
+ source: z.ZodEnum<{
149
+ custom: "custom";
150
+ pack: "pack";
151
+ }>;
152
+ packKey: z.ZodNullable<z.ZodString>;
153
+ configHash: z.ZodString;
154
+ archivedAt: z.ZodNullable<z.ZodISODateTime>;
155
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
156
+ id: z.ZodUUID;
157
+ }, z.core.$strip>;
158
+ export type Policy = z.infer<typeof Policy>;
159
+ export declare const PolicyAssignment: z.ZodObject<{
160
+ policyId: z.ZodUUID;
161
+ subjectKind: z.ZodEnum<{
162
+ person: "person";
163
+ office: "office";
164
+ legal_entity: "legal_entity";
165
+ org_unit: "org_unit";
166
+ position: "position";
167
+ workspace: "workspace";
168
+ }>;
169
+ subjectId: z.ZodNullable<z.ZodUUID>;
170
+ effectiveFrom: z.ZodISODate;
171
+ effectiveTo: z.ZodNullable<z.ZodISODate>;
172
+ priority: z.ZodNumber;
173
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
174
+ id: z.ZodUUID;
175
+ }, z.core.$strip>;
176
+ export type PolicyAssignment = z.infer<typeof PolicyAssignment>;
177
+ /**
178
+ * Which policy of a kind applies to a person on a date, and which rung answered.
179
+ *
180
+ * The rung is not decoration: "why does she accrue differently from her team" is the question this
181
+ * module gets asked, and answering it without a database session is the whole reason the ladder is
182
+ * inspectable.
183
+ */
184
+ export declare const ResolvedPolicy: z.ZodObject<{
185
+ kind: z.ZodEnum<{
186
+ overtime: "overtime";
187
+ accrual: "accrual";
188
+ carry_forward: "carry_forward";
189
+ rounding: "rounding";
190
+ working_time: "working_time";
191
+ }>;
192
+ policyId: z.ZodNullable<z.ZodUUID>;
193
+ policyName: z.ZodNullable<z.ZodString>;
194
+ config: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
195
+ from: z.ZodNullable<z.ZodEnum<{
196
+ person: "person";
197
+ office: "office";
198
+ legal_entity: "legal_entity";
199
+ org_unit: "org_unit";
200
+ position: "position";
201
+ workspace: "workspace";
202
+ }>>;
203
+ fromSubjectId: z.ZodNullable<z.ZodUUID>;
204
+ }, z.core.$strip>;
205
+ export type ResolvedPolicy = z.infer<typeof ResolvedPolicy>;
206
+ /**
207
+ * A closed month, and the boundary every recomputation respects.
208
+ *
209
+ * Locking is what makes a filed payroll safe: nothing may silently move a day inside a locked
210
+ * period, so a policy changed with a retroactive `effectiveFrom` produces an adjustment in the open
211
+ * period rather than rewriting history.
212
+ *
213
+ * Per legal entity, because a Dutch entity closes on a different day from a Turkish one.
214
+ */
215
+ export declare const Period: z.ZodObject<{
216
+ kind: z.ZodEnum<{
217
+ attendance: "attendance";
218
+ payroll: "payroll";
219
+ }>;
220
+ legalEntityId: z.ZodNullable<z.ZodUUID>;
221
+ startsOn: z.ZodISODate;
222
+ endsOn: z.ZodISODate;
223
+ status: z.ZodEnum<{
224
+ locked: "locked";
225
+ open: "open";
226
+ }>;
227
+ lockedAt: z.ZodNullable<z.ZodISODateTime>;
228
+ lockedBy: z.ZodNullable<z.ZodUUID>;
229
+ note: z.ZodNullable<z.ZodString>;
230
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
231
+ id: z.ZodUUID;
232
+ }, z.core.$strip>;
233
+ export type Period = z.infer<typeof Period>;
234
+ /** What an accrual run would do, per person, before it writes anything. */
235
+ export declare const AccrualPreview: z.ZodObject<{
236
+ periodFrom: z.ZodISODate;
237
+ periodTo: z.ZodISODate;
238
+ rows: z.ZodArray<z.ZodObject<{
239
+ personId: z.ZodUUID;
240
+ displayName: z.ZodString;
241
+ leaveTypeId: z.ZodUUID;
242
+ leaveTypeName: z.ZodString;
243
+ minutes: z.ZodNumber;
244
+ days: z.ZodNumber;
245
+ reason: z.ZodString;
246
+ alreadyAccrued: z.ZodBoolean;
247
+ }, z.core.$strip>>;
248
+ totalMinutes: z.ZodNumber;
249
+ skipped: z.ZodArray<z.ZodObject<{
250
+ personId: z.ZodUUID;
251
+ displayName: z.ZodString;
252
+ reason: z.ZodString;
253
+ }, z.core.$strip>>;
254
+ }, z.core.$strip>;
255
+ export type AccrualPreview = z.infer<typeof AccrualPreview>;
256
+ //# sourceMappingURL=policies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../../src/contract/policies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,UAAU;;;;;;EAA+E,CAAA;AACtG,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;;;EAO5B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEjE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAO9D,CAAA;AAID,eAAO,MAAM,aAAa;;;iBAGxB,CAAA;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;iBAYxB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,eAAO,MAAM,kBAAkB;;;;iBAK7B,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE,eAAO,MAAM,cAAc;;;;;;iBAWzB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,cAAc;;;;;;;iBAGzB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,iBAAiB;;;;iBAK5B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEjE,yFAAyF;AACzF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAMvB,CAAA;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;iBAajB,CAAA;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAA;AAE3C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;iBAU3B,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;iBAOzB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAI3D;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;iBAWjB,CAAA;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAA;AAE3C,2EAA2E;AAC3E,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;iBAmBzB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
@@ -0,0 +1,175 @@
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
+ * Policies as data, and the ladder that decides which one applies.
7
+ *
8
+ * Leave entitlement, overtime rules and rounding differ per company and per country, and encoding
9
+ * that as `if (country === 'TR')` is how a product acquires a branch per customer. A policy is a
10
+ * row: a kind, a config validated by that kind's schema, an effective range, and an assignment to
11
+ * somebody — a person, an office, a department, or the whole workspace.
12
+ *
13
+ * **One ladder, used by everything**: `person → primary office → legal entity → org unit →
14
+ * position → workspace`, nearest wins. The same order resolves a calendar, so there is never a
15
+ * second precedence rule to remember.
16
+ */
17
+ export const PolicyKind = z.enum(['accrual', 'carry_forward', 'overtime', 'rounding', 'working_time']);
18
+ /**
19
+ * Rungs of the ladder, and the priority each carries.
20
+ *
21
+ * The numbers are the ladder made explicit so a query can order by them rather than a service
22
+ * knowing the sequence by heart.
23
+ */
24
+ export const PolicySubjectKind = z.enum([
25
+ 'person',
26
+ 'office',
27
+ 'legal_entity',
28
+ 'org_unit',
29
+ 'position',
30
+ 'workspace',
31
+ ]);
32
+ export const SUBJECT_PRIORITY = {
33
+ person: 100,
34
+ office: 80,
35
+ legal_entity: 60,
36
+ org_unit: 40,
37
+ position: 30,
38
+ workspace: 0,
39
+ };
40
+ // ---------------------------------------------------------------- config per kind
41
+ export const SeniorityTier = z.object({
42
+ afterYears: z.number().int().min(0).max(60),
43
+ daysPerYear: z.number().min(0).max(365),
44
+ });
45
+ export const AccrualConfig = z.object({
46
+ frequency: z.enum(['monthly', 'annual', 'anniversary', 'per_hour_worked']),
47
+ daysPerYear: z.number().min(0).max(365),
48
+ minutesPerDay: z.number().int().min(1).max(1440),
49
+ /** Most senior tier reached wins; the order they are written in does not matter. */
50
+ seniorityTiers: z.array(SeniorityTier).default([]),
51
+ waitingPeriodMonths: z.number().int().min(0).max(24).default(0),
52
+ /** Which calendar decides a period boundary. Iran accrues on Jalali months. */
53
+ calendar: z.enum(['gregorian', 'persian']).default('gregorian'),
54
+ roundToMinutes: z.number().int().min(0).max(480).default(0),
55
+ /** Which leave type this accrues into. */
56
+ leaveTypeKey: z.string().min(1).max(48),
57
+ });
58
+ export const CarryForwardConfig = z.object({
59
+ leaveTypeKey: z.string().min(1).max(48),
60
+ maxDays: z.number().min(0).max(365),
61
+ /** Months into the new year before carried leave lapses. Null never expires. */
62
+ expiresAfterMonths: z.number().int().min(1).max(24).nullable(),
63
+ });
64
+ export const OvertimeConfig = z.object({
65
+ /** Minutes past the schedule before overtime starts counting. */
66
+ thresholdMinutes: z.number().int().min(0).max(480).default(0),
67
+ /** Cap for the period. Null is uncapped — several jurisdictions cap hours *worked*, not just pay. */
68
+ capMinutesPerYear: z.number().int().min(0).nullable().default(null),
69
+ /** Multiplier for reporting and payroll export. Kern does not compute pay. */
70
+ rate: z.number().min(1).max(5).default(1.5),
71
+ /** Overtime must be approved before it counts towards anything. */
72
+ requiresApproval: z.boolean().default(true),
73
+ /** Convert approved overtime into compensatory leave of this type instead of paying it. */
74
+ compOffLeaveTypeKey: z.string().max(48).nullable().default(null),
75
+ });
76
+ export const RoundingConfig = z.object({
77
+ stepMinutes: z.number().int().min(0).max(60),
78
+ direction: z.enum(['nearest', 'employee', 'employer']),
79
+ });
80
+ export const WorkingTimeConfig = z.object({
81
+ minutesPerDay: z.number().int().min(1).max(1440),
82
+ maxMinutesPerWeek: z.number().int().min(1).max(10080).nullable(),
83
+ /** Minimum rest between shifts, in minutes. Reported, not enforced by refusing a punch. */
84
+ minRestMinutes: z.number().int().min(0).max(1440).nullable(),
85
+ });
86
+ /** The config union, keyed by kind. Each kind validates its own shape before it runs. */
87
+ export const PolicyConfig = z.union([
88
+ AccrualConfig,
89
+ CarryForwardConfig,
90
+ OvertimeConfig,
91
+ RoundingConfig,
92
+ WorkingTimeConfig,
93
+ ]);
94
+ export const Policy = z.object({
95
+ id: z.uuid(),
96
+ ...ws,
97
+ kind: PolicyKind,
98
+ name: z.string().min(1).max(120),
99
+ config: z.record(z.string(), z.unknown()),
100
+ effectiveFrom: IsoDate,
101
+ effectiveTo: IsoDate.nullable(),
102
+ source: z.enum(['pack', 'custom']),
103
+ packKey: z.string().max(32).nullable(),
104
+ /** What a derived row records, so a recomputation can tell a stale figure from a current one. */
105
+ configHash: z.string().max(64),
106
+ archivedAt: Timestamp.nullable(),
107
+ });
108
+ export const PolicyAssignment = z.object({
109
+ id: z.uuid(),
110
+ ...ws,
111
+ policyId: z.uuid(),
112
+ subjectKind: PolicySubjectKind,
113
+ /** Null for `workspace`, which needs no id. */
114
+ subjectId: z.uuid().nullable(),
115
+ effectiveFrom: IsoDate,
116
+ effectiveTo: IsoDate.nullable(),
117
+ priority: z.number().int(),
118
+ });
119
+ /**
120
+ * Which policy of a kind applies to a person on a date, and which rung answered.
121
+ *
122
+ * The rung is not decoration: "why does she accrue differently from her team" is the question this
123
+ * module gets asked, and answering it without a database session is the whole reason the ladder is
124
+ * inspectable.
125
+ */
126
+ export const ResolvedPolicy = z.object({
127
+ kind: PolicyKind,
128
+ policyId: z.uuid().nullable(),
129
+ policyName: z.string().nullable(),
130
+ config: z.record(z.string(), z.unknown()).nullable(),
131
+ from: PolicySubjectKind.nullable(),
132
+ fromSubjectId: z.uuid().nullable(),
133
+ });
134
+ // ---------------------------------------------------------------- periods
135
+ /**
136
+ * A closed month, and the boundary every recomputation respects.
137
+ *
138
+ * Locking is what makes a filed payroll safe: nothing may silently move a day inside a locked
139
+ * period, so a policy changed with a retroactive `effectiveFrom` produces an adjustment in the open
140
+ * period rather than rewriting history.
141
+ *
142
+ * Per legal entity, because a Dutch entity closes on a different day from a Turkish one.
143
+ */
144
+ export const Period = z.object({
145
+ id: z.uuid(),
146
+ ...ws,
147
+ kind: z.enum(['payroll', 'attendance']),
148
+ legalEntityId: z.uuid().nullable(),
149
+ startsOn: IsoDate,
150
+ endsOn: IsoDate,
151
+ status: z.enum(['open', 'locked']),
152
+ lockedAt: Timestamp.nullable(),
153
+ lockedBy: z.uuid().nullable(),
154
+ note: z.string().max(500).nullable(),
155
+ });
156
+ /** What an accrual run would do, per person, before it writes anything. */
157
+ export const AccrualPreview = z.object({
158
+ periodFrom: IsoDate,
159
+ periodTo: IsoDate,
160
+ rows: z.array(z.object({
161
+ personId: z.uuid(),
162
+ displayName: z.string(),
163
+ leaveTypeId: z.uuid(),
164
+ leaveTypeName: z.string(),
165
+ minutes: z.number().int(),
166
+ days: z.number(),
167
+ /** Why it is that number: entitlement, service, proration, FTE. */
168
+ reason: z.string(),
169
+ /** Already accrued for this period — a re-run must not double-credit. */
170
+ alreadyAccrued: z.boolean(),
171
+ })),
172
+ totalMinutes: z.number().int(),
173
+ skipped: z.array(z.object({ personId: z.uuid(), displayName: z.string(), reason: z.string() })),
174
+ });
175
+ //# sourceMappingURL=policies.js.map