@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.
Files changed (82) 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/attendance.d.ts +240 -0
  6. package/dist/contract/attendance.d.ts.map +1 -0
  7. package/dist/contract/attendance.js +154 -0
  8. package/dist/contract/attendance.js.map +1 -0
  9. package/dist/contract/capabilities.d.ts +1 -1
  10. package/dist/contract/capabilities.d.ts.map +1 -1
  11. package/dist/contract/capabilities.js +80 -0
  12. package/dist/contract/capabilities.js.map +1 -1
  13. package/dist/contract/events.d.ts +60 -0
  14. package/dist/contract/events.d.ts.map +1 -1
  15. package/dist/contract/events.js +60 -0
  16. package/dist/contract/events.js.map +1 -1
  17. package/dist/contract/index.d.ts +3 -0
  18. package/dist/contract/index.d.ts.map +1 -1
  19. package/dist/contract/index.js +3 -0
  20. package/dist/contract/index.js.map +1 -1
  21. package/dist/contract/leave.d.ts +168 -0
  22. package/dist/contract/leave.d.ts.map +1 -0
  23. package/dist/contract/leave.js +150 -0
  24. package/dist/contract/leave.js.map +1 -0
  25. package/dist/contract/permissions.d.ts +100 -0
  26. package/dist/contract/permissions.d.ts.map +1 -1
  27. package/dist/contract/permissions.js +119 -0
  28. package/dist/contract/permissions.js.map +1 -1
  29. package/dist/contract/router.d.ts +2440 -0
  30. package/dist/contract/router.d.ts.map +1 -1
  31. package/dist/contract/router.js +393 -0
  32. package/dist/contract/router.js.map +1 -1
  33. package/dist/policy/time.d.ts +48 -0
  34. package/dist/policy/time.d.ts.map +1 -0
  35. package/dist/policy/time.js +144 -0
  36. package/dist/policy/time.js.map +1 -0
  37. package/dist/policy/working-time.d.ts +98 -0
  38. package/dist/policy/working-time.d.ts.map +1 -0
  39. package/dist/policy/working-time.js +190 -0
  40. package/dist/policy/working-time.js.map +1 -0
  41. package/dist/server/index.d.ts.map +1 -1
  42. package/dist/server/index.js +2 -0
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/jobs.d.ts +16 -0
  45. package/dist/server/jobs.d.ts.map +1 -0
  46. package/dist/server/jobs.js +166 -0
  47. package/dist/server/jobs.js.map +1 -0
  48. package/dist/server/router.d.ts +2731 -58
  49. package/dist/server/router.d.ts.map +1 -1
  50. package/dist/server/router.js +1306 -3
  51. package/dist/server/router.js.map +1 -1
  52. package/dist/server/schema.d.ts +3344 -1
  53. package/dist/server/schema.d.ts.map +1 -1
  54. package/dist/server/schema.js +325 -0
  55. package/dist/server/schema.js.map +1 -1
  56. package/dist/server/services/approvals.d.ts +163 -0
  57. package/dist/server/services/approvals.d.ts.map +1 -0
  58. package/dist/server/services/approvals.js +325 -0
  59. package/dist/server/services/approvals.js.map +1 -0
  60. package/dist/server/services/attendance.d.ts +150 -0
  61. package/dist/server/services/attendance.d.ts.map +1 -0
  62. package/dist/server/services/attendance.js +239 -0
  63. package/dist/server/services/attendance.js.map +1 -0
  64. package/dist/server/services/ledger.d.ts +135 -0
  65. package/dist/server/services/ledger.d.ts.map +1 -0
  66. package/dist/server/services/ledger.js +178 -0
  67. package/dist/server/services/ledger.js.map +1 -0
  68. package/dist/server/services/people.d.ts +3 -3
  69. package/migrations/0002_leave.sql +237 -0
  70. package/migrations/0003_attendance.sql +206 -0
  71. package/migrations/meta/0002_snapshot.json +3009 -0
  72. package/migrations/meta/0003_snapshot.json +3681 -0
  73. package/migrations/meta/_journal.json +14 -0
  74. package/package.json +1 -1
  75. package/src/contract/approvals.ts +149 -0
  76. package/src/contract/attendance.ts +180 -0
  77. package/src/contract/capabilities.ts +80 -0
  78. package/src/contract/events.ts +81 -0
  79. package/src/contract/index.ts +3 -0
  80. package/src/contract/leave.ts +171 -0
  81. package/src/contract/permissions.ts +122 -0
  82. package/src/contract/router.ts +481 -0
@@ -0,0 +1,154 @@
1
+ import { Timestamp, WorkspaceId } from '@kernhq/contracts';
2
+ import { z } from 'zod';
3
+ import { IsoDate, TimeZone, WallClock } from './models.js';
4
+ const ws = { workspaceId: WorkspaceId };
5
+ /**
6
+ * Attendance: who was at work, when, and for how long.
7
+ *
8
+ * Two rules shape everything here:
9
+ *
10
+ * - **Raw punches are immutable.** A wrong punch is *voided* by a correcting row, never edited. An
11
+ * attendance record somebody can quietly rewrite is worth nothing in the dispute it exists for.
12
+ * - **The day sheet is derived.** `AttendanceDay` is a projection of punches + schedule + calendar +
13
+ * leave, recomputable from scratch at any time. It is never the source of truth, so a bad
14
+ * computation is a bug to fix and re-run rather than data to repair by hand.
15
+ */
16
+ export const PunchDirection = z.enum(['in', 'out', 'break_start', 'break_end']);
17
+ export const PunchMethod = z.enum(['web', 'mobile', 'kiosk', 'qr', 'device', 'import', 'manual']);
18
+ /**
19
+ * How much the recorded instant can be trusted.
20
+ *
21
+ * `trusted` was stamped by the server as it happened. `claimed` came from a client that was offline
22
+ * and is asserting when it happened — believed within a policy threshold, flagged beyond it.
23
+ * `disputed` is a claim somebody has to look at. Client clocks lie, sometimes by accident and
24
+ * sometimes not, and a system that cannot say which is which cannot defend any of its numbers.
25
+ */
26
+ export const PunchTrust = z.enum(['trusted', 'claimed', 'disputed']);
27
+ export const Punch = z.object({
28
+ id: z.uuid(),
29
+ ...ws,
30
+ personId: z.uuid(),
31
+ direction: PunchDirection,
32
+ /** Server-stamped, or the client's claim when it was offline. Always an instant, never a local time. */
33
+ at: Timestamp,
34
+ /** What the client believed the time was. Kept for audit even when it disagrees. */
35
+ clientReportedAt: Timestamp.nullable(),
36
+ /** How far the client's clock was out, in milliseconds. Null when the server stamped it. */
37
+ skewMs: z.number().int().nullable(),
38
+ /** The day this belongs to, in the person's schedule zone. A night shift lands on its start date. */
39
+ businessDate: IsoDate,
40
+ /** The zone the punch actually happened in — for audit, not for attribution. */
41
+ timezone: TimeZone,
42
+ method: PunchMethod,
43
+ /** The office whose geofence or allowlist accepted it; any office the person is assigned to. */
44
+ officeId: z.uuid().nullable(),
45
+ deviceId: z.uuid().nullable(),
46
+ geo: z.object({ lat: z.number(), lng: z.number(), accuracyM: z.number().optional() }).nullable(),
47
+ trust: PunchTrust,
48
+ /** Set when a later correction voided this row. The row itself never changes otherwise. */
49
+ voidedByPunchId: z.uuid().nullable(),
50
+ note: z.string().max(500).nullable(),
51
+ createdAt: Timestamp,
52
+ });
53
+ export const AttendanceStatus = z.enum([
54
+ 'present',
55
+ 'absent',
56
+ 'leave',
57
+ 'holiday',
58
+ 'weekend',
59
+ 'partial',
60
+ /** Something is unpaired — usually a missing clock-out. Needs a human. */
61
+ 'pending',
62
+ ]);
63
+ /**
64
+ * One person, one day, derived.
65
+ *
66
+ * Recomputable from punches, schedule, calendar and leave at any moment. `policyHash` records what
67
+ * produced it, so a recomputation can tell whether a row is stale; `locked` mirrors the period, so
68
+ * a closed month cannot silently move.
69
+ */
70
+ export const AttendanceDay = z.object({
71
+ id: z.uuid(),
72
+ ...ws,
73
+ personId: z.uuid(),
74
+ businessDate: IsoDate,
75
+ scheduledMinutes: z.number().int(),
76
+ workedMinutes: z.number().int(),
77
+ breakMinutes: z.number().int(),
78
+ overtimeMinutes: z.number().int(),
79
+ lateMinutes: z.number().int(),
80
+ earlyLeaveMinutes: z.number().int(),
81
+ status: AttendanceStatus,
82
+ leaveRequestId: z.uuid().nullable(),
83
+ anomalies: z.array(z.string()),
84
+ firstIn: Timestamp.nullable(),
85
+ lastOut: Timestamp.nullable(),
86
+ policyHash: z.string().max(64).nullable(),
87
+ locked: z.boolean(),
88
+ computedAt: Timestamp,
89
+ });
90
+ /** A week of shifts, in wall-clock readings. Meaningless until a date and a zone arrive. */
91
+ export const ScheduleWeek = z.record(z.enum(['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']), z
92
+ .object({
93
+ start: WallClock,
94
+ end: WallClock,
95
+ breakMinutes: z.number().int().min(0).max(480).default(0),
96
+ })
97
+ .nullable());
98
+ export const Schedule = z.object({
99
+ id: z.uuid(),
100
+ ...ws,
101
+ name: z.string().min(1).max(120),
102
+ kind: z.enum(['fixed', 'flexible', 'shift']),
103
+ week: ScheduleWeek,
104
+ /** `office` means the person's primary office — the default, and almost always right. */
105
+ tzMode: z.enum(['office', 'person', 'fixed']),
106
+ tz: TimeZone.nullable(),
107
+ graceInMinutes: z.number().int().min(0).max(240),
108
+ graceOutMinutes: z.number().int().min(0).max(240),
109
+ roundingStepMinutes: z.number().int().min(0).max(60),
110
+ roundingDirection: z.enum(['nearest', 'employee', 'employer']),
111
+ /** Close an open shift automatically after this many minutes. Null leaves it for a human. */
112
+ autoClockOutAfterMinutes: z.number().int().min(60).nullable(),
113
+ archivedAt: Timestamp.nullable(),
114
+ });
115
+ export const ScheduleAssignment = z.object({
116
+ id: z.uuid(),
117
+ ...ws,
118
+ personId: z.uuid(),
119
+ scheduleId: z.uuid(),
120
+ effectiveFrom: IsoDate,
121
+ effectiveTo: IsoDate.nullable(),
122
+ });
123
+ /**
124
+ * A request to fix a wrong or missing punch.
125
+ *
126
+ * It does not edit anything. Approving it writes *new* punches that void the old ones, so the
127
+ * original record and the correction both survive — which is the difference between a corrected
128
+ * timesheet and an edited one.
129
+ */
130
+ export const Regularization = z.object({
131
+ id: z.uuid(),
132
+ ...ws,
133
+ personId: z.uuid(),
134
+ businessDate: IsoDate,
135
+ /** Null when the person never punched at all and is asking for the whole day to be recorded. */
136
+ punchId: z.uuid().nullable(),
137
+ proposed: z.array(z.object({ direction: PunchDirection, at: Timestamp })),
138
+ reason: z.string().min(1).max(1000),
139
+ status: z.enum(['pending', 'approved', 'rejected', 'cancelled']),
140
+ approvalRequestId: z.uuid().nullable(),
141
+ appliedAt: Timestamp.nullable(),
142
+ createdAt: Timestamp,
143
+ });
144
+ /** The person's own live state: are they clocked in, since when, on a break? */
145
+ export const ClockState = z.object({
146
+ personId: z.uuid(),
147
+ businessDate: IsoDate,
148
+ clockedIn: z.boolean(),
149
+ onBreak: z.boolean(),
150
+ since: Timestamp.nullable(),
151
+ workedMinutesToday: z.number().int(),
152
+ timezone: TimeZone,
153
+ });
154
+ //# sourceMappingURL=attendance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.js","sourceRoot":"","sources":["../../src/contract/attendance.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;;;;;;;;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"}
@@ -63,6 +63,44 @@ 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
+ },
86
+ {
87
+ id: 'attendance',
88
+ label: 'Attendance',
89
+ description: 'Clock in and out, schedules and a daily sheet',
90
+ dependsOn: ['core', 'calendars'],
91
+ // Off by default. Plenty of companies never clock anybody in, and a directory that offers a
92
+ // clock button to salaried staff is offering a feature nobody asked for.
93
+ defaultEnabled: false,
94
+ level: 1,
95
+ },
96
+ {
97
+ id: 'overtime',
98
+ label: 'Overtime',
99
+ description: 'Detect and approve time worked beyond the schedule',
100
+ dependsOn: ['attendance'],
101
+ defaultEnabled: false,
102
+ level: 2,
103
+ },
66
104
  {
67
105
  id: 'documents',
68
106
  label: 'Employee documents',
@@ -110,5 +148,47 @@ export const hrCapabilityProcedures = {
110
148
  'calendars.workingDays',
111
149
  ],
112
150
  documents: ['documents.list', 'documents.attach', 'documents.remove'],
151
+ leave: [
152
+ 'leave.types.list',
153
+ 'leave.types.create',
154
+ 'leave.types.update',
155
+ 'leave.types.archive',
156
+ 'leave.balance.get',
157
+ 'leave.ledger.list',
158
+ 'leave.adjust',
159
+ 'leave.requests.list',
160
+ 'leave.requests.get',
161
+ 'leave.requests.simulate',
162
+ 'leave.requests.create',
163
+ 'leave.requests.cancel',
164
+ 'leave.team.calendar',
165
+ ],
166
+ attendance: [
167
+ 'attendance.state',
168
+ 'attendance.clockIn',
169
+ 'attendance.clockOut',
170
+ 'attendance.breakStart',
171
+ 'attendance.breakEnd',
172
+ 'attendance.punches.list',
173
+ 'attendance.punches.void',
174
+ 'attendance.days.list',
175
+ 'attendance.days.recompute',
176
+ 'attendance.schedules.list',
177
+ 'attendance.schedules.create',
178
+ 'attendance.schedules.update',
179
+ 'attendance.schedules.archive',
180
+ 'attendance.schedules.assign',
181
+ 'attendance.regularizations.list',
182
+ 'attendance.regularizations.request',
183
+ ],
184
+ approvals: [
185
+ 'approvals.chains.list',
186
+ 'approvals.chains.create',
187
+ 'approvals.chains.update',
188
+ 'approvals.chains.archive',
189
+ 'approvals.delegate',
190
+ 'approvals.revokeDelegation',
191
+ 'approvals.delegations',
192
+ ],
113
193
  };
114
194
  //# 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":"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,OAAO;QACX,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,mDAAmD;QAChE,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;QAChC,6FAA6F;QAC7F,6EAA6E;QAC7E,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,yEAAyE;QACtF,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,8FAA8F;QAC9F,yEAAyE;QACzE,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,+CAA+C;QAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;QAChC,4FAA4F;QAC5F,yEAAyE;QACzE,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,CAAC;KACT;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,oDAAoD;QACjE,SAAS,EAAE,CAAC,YAAY,CAAC;QACzB,cAAc,EAAE,KAAK;QACrB,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;IACrE,KAAK,EAAE;QACL,kBAAkB;QAClB,oBAAoB;QACpB,oBAAoB;QACpB,qBAAqB;QACrB,mBAAmB;QACnB,mBAAmB;QACnB,cAAc;QACd,qBAAqB;QACrB,oBAAoB;QACpB,yBAAyB;QACzB,uBAAuB;QACvB,uBAAuB;QACvB,qBAAqB;KACtB;IACD,UAAU,EAAE;QACV,kBAAkB;QAClB,oBAAoB;QACpB,qBAAqB;QACrB,uBAAuB;QACvB,qBAAqB;QACrB,yBAAyB;QACzB,yBAAyB;QACzB,sBAAsB;QACtB,2BAA2B;QAC3B,2BAA2B;QAC3B,6BAA6B;QAC7B,6BAA6B;QAC7B,8BAA8B;QAC9B,6BAA6B;QAC7B,iCAAiC;QACjC,oCAAoC;KACrC;IACD,SAAS,EAAE;QACT,uBAAuB;QACvB,yBAAyB;QACzB,yBAAyB;QACzB,0BAA0B;QAC1B,oBAAoB;QACpB,4BAA4B;QAC5B,uBAAuB;KACxB;CACF,CAAA"}
@@ -64,6 +64,66 @@ 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>>;
109
+ punchRecorded: import("@kernhq/contracts").EventDef<"hr.punch.recorded", z.ZodObject<{
110
+ punchId: z.ZodUUID;
111
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
112
+ personId: z.ZodUUID;
113
+ direction: z.ZodString;
114
+ businessDate: z.ZodISODate;
115
+ }, z.core.$strip>>;
116
+ /**
117
+ * A derived day changed. Carries the date so a consumer recomputes that window rather than
118
+ * everything — this fires on every punch, so a coarse payload would be a stampede.
119
+ */
120
+ attendanceDayComputed: import("@kernhq/contracts").EventDef<"hr.attendance.day_computed", z.ZodObject<{
121
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
122
+ personId: z.ZodUUID;
123
+ businessDate: z.ZodISODate;
124
+ status: z.ZodString;
125
+ workedMinutes: z.ZodNumber;
126
+ }, z.core.$strip>>;
67
127
  calendarChanged: import("@kernhq/contracts").EventDef<"hr.calendar.changed", z.ZodObject<{
68
128
  calendarId: z.ZodUUID;
69
129
  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;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwCnF;;;OAGG;;;;;;;;;;;;;;CAoBJ,CAAA"}
@@ -53,6 +53,66 @@ 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
+ })),
98
+ punchRecorded: defineEvent('hr.punch.recorded', z.object({
99
+ punchId: z.uuid(),
100
+ workspaceId: WorkspaceId,
101
+ personId: z.uuid(),
102
+ direction: z.string(),
103
+ businessDate: z.iso.date(),
104
+ })),
105
+ /**
106
+ * A derived day changed. Carries the date so a consumer recomputes that window rather than
107
+ * everything — this fires on every punch, so a coarse payload would be a stampede.
108
+ */
109
+ attendanceDayComputed: defineEvent('hr.attendance.day_computed', z.object({
110
+ workspaceId: WorkspaceId,
111
+ personId: z.uuid(),
112
+ businessDate: z.iso.date(),
113
+ status: z.string(),
114
+ workedMinutes: z.number().int(),
115
+ })),
56
116
  calendarChanged: defineEvent('hr.calendar.changed', z.object({
57
117
  calendarId: z.uuid(),
58
118
  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":"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,cAAc,EAAE,WAAW,CACzB,oBAAoB,EACpB,CAAC,CAAC,MAAM,CAAC;QACP,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QACtB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KACrB,CAAC,CACH;IACD;;;;;OAKG;IACH,YAAY,EAAE,WAAW,CACvB,kBAAkB,EAClB,CAAC,CAAC,MAAM,CAAC;QACP,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QACtB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KACrB,CAAC,CACH;IACD,mFAAmF;IACnF,mBAAmB,EAAE,WAAW,CAC9B,0BAA0B,EAC1B,CAAC,CAAC,MAAM,CAAC;QACP,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE;QACrB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;KAC/B,CAAC,CACH;IACD,iBAAiB,EAAE,WAAW,CAC5B,uBAAuB,EACvB,CAAC,CAAC,MAAM,CAAC;QACP,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KAC/B,CAAC,CACH;IACD,eAAe,EAAE,WAAW,CAC1B,qBAAqB,EACrB,CAAC,CAAC,MAAM,CAAC;QACP,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB,CAAC,CACH;IACD,aAAa,EAAE,WAAW,CACxB,mBAAmB,EACnB,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;QACjB,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KAC3B,CAAC,CACH;IACD;;;OAGG;IACH,qBAAqB,EAAE,WAAW,CAChC,4BAA4B,EAC5B,CAAC,CAAC,MAAM,CAAC;QACP,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;QAClB,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;KAChC,CAAC,CACH;IACD,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"}
@@ -6,8 +6,11 @@
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';
10
+ export * from './attendance.js';
9
11
  export * from './capabilities.js';
10
12
  export * from './events.js';
13
+ export * from './leave.js';
11
14
  export * from './models.js';
12
15
  export * from './permissions.js';
13
16
  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,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"}
@@ -6,8 +6,11 @@
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';
10
+ export * from './attendance.js';
9
11
  export * from './capabilities.js';
10
12
  export * from './events.js';
13
+ export * from './leave.js';
11
14
  export * from './models.js';
12
15
  export * from './permissions.js';
13
16
  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,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"}
@@ -0,0 +1,168 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Leave, and the one rule everything here follows: **a balance is a sum, never a stored number.**
4
+ *
5
+ * Every grant, accrual, consumption, reversal, expiry and adjustment is an append-only ledger entry.
6
+ * Cancelling approved leave inserts a reversal; it does not delete the consumption. That costs a
7
+ * little arithmetic and buys the only thing that matters when an employee and HR disagree about a
8
+ * balance: a list of what happened, in order, that nobody edited.
9
+ */
10
+ export declare const LeaveUnit: z.ZodEnum<{
11
+ half_day: "half_day";
12
+ day: "day";
13
+ hour: "hour";
14
+ }>;
15
+ export type LeaveUnit = z.infer<typeof LeaveUnit>;
16
+ export declare const LeaveType: z.ZodObject<{
17
+ key: z.ZodString;
18
+ name: z.ZodString;
19
+ paid: z.ZodBoolean;
20
+ unit: z.ZodEnum<{
21
+ half_day: "half_day";
22
+ day: "day";
23
+ hour: "hour";
24
+ }>;
25
+ color: z.ZodNullable<z.ZodString>;
26
+ icon: z.ZodNullable<z.ZodString>;
27
+ requiresDocumentAfterDays: z.ZodNullable<z.ZodNumber>;
28
+ countsWorkingDaysOnly: z.ZodBoolean;
29
+ allowNegative: z.ZodBoolean;
30
+ maxNegativeMinutes: z.ZodNumber;
31
+ order: z.ZodNumber;
32
+ archivedAt: z.ZodNullable<z.ZodISODateTime>;
33
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
34
+ id: z.ZodUUID;
35
+ }, z.core.$strip>;
36
+ export type LeaveType = z.infer<typeof LeaveType>;
37
+ /**
38
+ * Why a ledger entry exists. The set is closed on purpose — a new kind of movement is a decision,
39
+ * not a string somebody passes in.
40
+ */
41
+ export declare const LedgerKind: z.ZodEnum<{
42
+ grant: "grant";
43
+ accrual: "accrual";
44
+ consumption: "consumption";
45
+ reversal: "reversal";
46
+ expiry: "expiry";
47
+ adjustment: "adjustment";
48
+ carry_in: "carry_in";
49
+ carry_out: "carry_out";
50
+ encashment: "encashment";
51
+ }>;
52
+ export type LedgerKind = z.infer<typeof LedgerKind>;
53
+ export declare const LeaveLedgerEntry: z.ZodObject<{
54
+ personId: z.ZodUUID;
55
+ leaveTypeId: z.ZodUUID;
56
+ kind: z.ZodEnum<{
57
+ grant: "grant";
58
+ accrual: "accrual";
59
+ consumption: "consumption";
60
+ reversal: "reversal";
61
+ expiry: "expiry";
62
+ adjustment: "adjustment";
63
+ carry_in: "carry_in";
64
+ carry_out: "carry_out";
65
+ encashment: "encashment";
66
+ }>;
67
+ amountMinutes: z.ZodNumber;
68
+ effectiveOn: z.ZodISODate;
69
+ periodYear: z.ZodNumber;
70
+ requestId: z.ZodNullable<z.ZodUUID>;
71
+ reversesEntryId: z.ZodNullable<z.ZodUUID>;
72
+ policyHash: z.ZodNullable<z.ZodString>;
73
+ reason: z.ZodNullable<z.ZodString>;
74
+ createdBy: z.ZodNullable<z.ZodUUID>;
75
+ createdAt: z.ZodISODateTime;
76
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
77
+ id: z.ZodUUID;
78
+ }, z.core.$strip>;
79
+ export type LeaveLedgerEntry = z.infer<typeof LeaveLedgerEntry>;
80
+ export declare const LeaveBalance: z.ZodObject<{
81
+ personId: z.ZodUUID;
82
+ leaveTypeId: z.ZodUUID;
83
+ leaveTypeName: z.ZodString;
84
+ unit: z.ZodEnum<{
85
+ half_day: "half_day";
86
+ day: "day";
87
+ hour: "hour";
88
+ }>;
89
+ periodYear: z.ZodNumber;
90
+ balanceMinutes: z.ZodNumber;
91
+ bookedMinutes: z.ZodNumber;
92
+ pendingMinutes: z.ZodNumber;
93
+ availableMinutes: z.ZodNumber;
94
+ balance: z.ZodNumber;
95
+ available: z.ZodNumber;
96
+ }, z.core.$strip>;
97
+ export type LeaveBalance = z.infer<typeof LeaveBalance>;
98
+ export declare const LeaveRequestStatus: z.ZodEnum<{
99
+ pending: "pending";
100
+ approved: "approved";
101
+ rejected: "rejected";
102
+ cancelled: "cancelled";
103
+ draft: "draft";
104
+ withdrawn: "withdrawn";
105
+ }>;
106
+ export type LeaveRequestStatus = z.infer<typeof LeaveRequestStatus>;
107
+ /** Which half of a day a request starts or ends on. */
108
+ export declare const DayPart: z.ZodEnum<{
109
+ full: "full";
110
+ morning: "morning";
111
+ afternoon: "afternoon";
112
+ }>;
113
+ export type DayPart = z.infer<typeof DayPart>;
114
+ export declare const LeaveRequest: z.ZodObject<{
115
+ personId: z.ZodUUID;
116
+ leaveTypeId: z.ZodUUID;
117
+ startsOn: z.ZodISODate;
118
+ endsOn: z.ZodISODate;
119
+ startPart: z.ZodEnum<{
120
+ full: "full";
121
+ morning: "morning";
122
+ afternoon: "afternoon";
123
+ }>;
124
+ endPart: z.ZodEnum<{
125
+ full: "full";
126
+ morning: "morning";
127
+ afternoon: "afternoon";
128
+ }>;
129
+ hours: z.ZodNullable<z.ZodNumber>;
130
+ workingDays: z.ZodNumber;
131
+ minutes: z.ZodNumber;
132
+ status: z.ZodEnum<{
133
+ pending: "pending";
134
+ approved: "approved";
135
+ rejected: "rejected";
136
+ cancelled: "cancelled";
137
+ draft: "draft";
138
+ withdrawn: "withdrawn";
139
+ }>;
140
+ reason: z.ZodNullable<z.ZodString>;
141
+ documentFileId: z.ZodNullable<z.ZodUUID>;
142
+ approvalRequestId: z.ZodNullable<z.ZodUUID>;
143
+ decidedAt: z.ZodNullable<z.ZodISODateTime>;
144
+ createdAt: z.ZodISODateTime;
145
+ updatedAt: z.ZodISODateTime;
146
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
147
+ id: z.ZodUUID;
148
+ }, z.core.$strip>;
149
+ export type LeaveRequest = z.infer<typeof LeaveRequest>;
150
+ /** What a request would cost, before anybody submits it. */
151
+ export declare const LeaveSimulation: z.ZodObject<{
152
+ workingDays: z.ZodNumber;
153
+ minutes: z.ZodNumber;
154
+ days: z.ZodArray<z.ZodObject<{
155
+ date: z.ZodISODate;
156
+ fraction: z.ZodNumber;
157
+ counted: z.ZodBoolean;
158
+ reason: z.ZodNullable<z.ZodString>;
159
+ }, z.core.$strip>>;
160
+ balanceBeforeMinutes: z.ZodNumber;
161
+ balanceAfterMinutes: z.ZodNumber;
162
+ blockers: z.ZodArray<z.ZodObject<{
163
+ code: z.ZodString;
164
+ message: z.ZodString;
165
+ }, z.core.$strip>>;
166
+ }, z.core.$strip>;
167
+ export type LeaveSimulation = z.infer<typeof LeaveSimulation>;
168
+ //# sourceMappingURL=leave.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leave.d.ts","sourceRoot":"","sources":["../../src/contract/leave.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;GAOG;AAEH,eAAO,MAAM,SAAS;;;;EAAsC,CAAA;AAC5D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAEjD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;iBAwBpB,CAAA;AACF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;EAiBrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;iBAqB3B,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;iBAiBvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,eAAO,MAAM,kBAAkB;;;;;;;EAQ7B,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE,uDAAuD;AACvD,eAAO,MAAM,OAAO;;;;EAA2C,CAAA;AAC/D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAA;AAE7C,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,4DAA4D;AAC5D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;iBAgB1B,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}