@kernhq/module-hr 0.3.0 → 0.5.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 (62) hide show
  1. package/dist/contract/attendance.d.ts +240 -0
  2. package/dist/contract/attendance.d.ts.map +1 -0
  3. package/dist/contract/attendance.js +154 -0
  4. package/dist/contract/attendance.js.map +1 -0
  5. package/dist/contract/capabilities.d.ts.map +1 -1
  6. package/dist/contract/capabilities.js +36 -0
  7. package/dist/contract/capabilities.js.map +1 -1
  8. package/dist/contract/events.d.ts +18 -0
  9. package/dist/contract/events.d.ts.map +1 -1
  10. package/dist/contract/events.js +18 -0
  11. package/dist/contract/events.js.map +1 -1
  12. package/dist/contract/index.d.ts +1 -0
  13. package/dist/contract/index.d.ts.map +1 -1
  14. package/dist/contract/index.js +1 -0
  15. package/dist/contract/index.js.map +1 -1
  16. package/dist/contract/permissions.d.ts +43 -0
  17. package/dist/contract/permissions.d.ts.map +1 -1
  18. package/dist/contract/permissions.js +50 -0
  19. package/dist/contract/permissions.js.map +1 -1
  20. package/dist/contract/router.d.ts +996 -0
  21. package/dist/contract/router.d.ts.map +1 -1
  22. package/dist/contract/router.js +165 -1
  23. package/dist/contract/router.js.map +1 -1
  24. package/dist/policy/time.d.ts +48 -0
  25. package/dist/policy/time.d.ts.map +1 -0
  26. package/dist/policy/time.js +144 -0
  27. package/dist/policy/time.js.map +1 -0
  28. package/dist/policy/working-time.d.ts +98 -0
  29. package/dist/policy/working-time.d.ts.map +1 -0
  30. package/dist/policy/working-time.js +190 -0
  31. package/dist/policy/working-time.js.map +1 -0
  32. package/dist/server/index.d.ts.map +1 -1
  33. package/dist/server/index.js +2 -0
  34. package/dist/server/index.js.map +1 -1
  35. package/dist/server/jobs.d.ts +16 -0
  36. package/dist/server/jobs.d.ts.map +1 -0
  37. package/dist/server/jobs.js +166 -0
  38. package/dist/server/jobs.js.map +1 -0
  39. package/dist/server/router.d.ts +1087 -0
  40. package/dist/server/router.d.ts.map +1 -1
  41. package/dist/server/router.js +521 -3
  42. package/dist/server/router.js.map +1 -1
  43. package/dist/server/schema.d.ts +1261 -1
  44. package/dist/server/schema.d.ts.map +1 -1
  45. package/dist/server/schema.js +116 -0
  46. package/dist/server/schema.js.map +1 -1
  47. package/dist/server/services/attendance.d.ts +150 -0
  48. package/dist/server/services/attendance.d.ts.map +1 -0
  49. package/dist/server/services/attendance.js +239 -0
  50. package/dist/server/services/attendance.js.map +1 -0
  51. package/dist/server/services/ledger.d.ts +2 -2
  52. package/migrations/0003_attendance.sql +206 -0
  53. package/migrations/meta/0003_snapshot.json +3681 -0
  54. package/migrations/meta/_journal.json +7 -0
  55. package/package.json +1 -1
  56. package/src/client/index.ts +18 -0
  57. package/src/contract/attendance.ts +180 -0
  58. package/src/contract/capabilities.ts +36 -0
  59. package/src/contract/events.ts +24 -0
  60. package/src/contract/index.ts +1 -0
  61. package/src/contract/permissions.ts +51 -0
  62. package/src/contract/router.ts +203 -1
@@ -0,0 +1,240 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Attendance: who was at work, when, and for how long.
4
+ *
5
+ * Two rules shape everything here:
6
+ *
7
+ * - **Raw punches are immutable.** A wrong punch is *voided* by a correcting row, never edited. An
8
+ * attendance record somebody can quietly rewrite is worth nothing in the dispute it exists for.
9
+ * - **The day sheet is derived.** `AttendanceDay` is a projection of punches + schedule + calendar +
10
+ * leave, recomputable from scratch at any time. It is never the source of truth, so a bad
11
+ * computation is a bug to fix and re-run rather than data to repair by hand.
12
+ */
13
+ export declare const PunchDirection: z.ZodEnum<{
14
+ out: "out";
15
+ in: "in";
16
+ break_start: "break_start";
17
+ break_end: "break_end";
18
+ }>;
19
+ export type PunchDirection = z.infer<typeof PunchDirection>;
20
+ export declare const PunchMethod: z.ZodEnum<{
21
+ web: "web";
22
+ mobile: "mobile";
23
+ kiosk: "kiosk";
24
+ qr: "qr";
25
+ device: "device";
26
+ import: "import";
27
+ manual: "manual";
28
+ }>;
29
+ export type PunchMethod = z.infer<typeof PunchMethod>;
30
+ /**
31
+ * How much the recorded instant can be trusted.
32
+ *
33
+ * `trusted` was stamped by the server as it happened. `claimed` came from a client that was offline
34
+ * and is asserting when it happened — believed within a policy threshold, flagged beyond it.
35
+ * `disputed` is a claim somebody has to look at. Client clocks lie, sometimes by accident and
36
+ * sometimes not, and a system that cannot say which is which cannot defend any of its numbers.
37
+ */
38
+ export declare const PunchTrust: z.ZodEnum<{
39
+ trusted: "trusted";
40
+ claimed: "claimed";
41
+ disputed: "disputed";
42
+ }>;
43
+ export type PunchTrust = z.infer<typeof PunchTrust>;
44
+ export declare const Punch: z.ZodObject<{
45
+ personId: z.ZodUUID;
46
+ direction: z.ZodEnum<{
47
+ out: "out";
48
+ in: "in";
49
+ break_start: "break_start";
50
+ break_end: "break_end";
51
+ }>;
52
+ at: z.ZodISODateTime;
53
+ clientReportedAt: z.ZodNullable<z.ZodISODateTime>;
54
+ skewMs: z.ZodNullable<z.ZodNumber>;
55
+ businessDate: z.ZodISODate;
56
+ timezone: z.ZodString;
57
+ method: z.ZodEnum<{
58
+ web: "web";
59
+ mobile: "mobile";
60
+ kiosk: "kiosk";
61
+ qr: "qr";
62
+ device: "device";
63
+ import: "import";
64
+ manual: "manual";
65
+ }>;
66
+ officeId: z.ZodNullable<z.ZodUUID>;
67
+ deviceId: z.ZodNullable<z.ZodUUID>;
68
+ geo: z.ZodNullable<z.ZodObject<{
69
+ lat: z.ZodNumber;
70
+ lng: z.ZodNumber;
71
+ accuracyM: z.ZodOptional<z.ZodNumber>;
72
+ }, z.core.$strip>>;
73
+ trust: z.ZodEnum<{
74
+ trusted: "trusted";
75
+ claimed: "claimed";
76
+ disputed: "disputed";
77
+ }>;
78
+ voidedByPunchId: z.ZodNullable<z.ZodUUID>;
79
+ note: z.ZodNullable<z.ZodString>;
80
+ createdAt: z.ZodISODateTime;
81
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
82
+ id: z.ZodUUID;
83
+ }, z.core.$strip>;
84
+ export type Punch = z.infer<typeof Punch>;
85
+ export declare const AttendanceStatus: z.ZodEnum<{
86
+ leave: "leave";
87
+ pending: "pending";
88
+ present: "present";
89
+ absent: "absent";
90
+ holiday: "holiday";
91
+ weekend: "weekend";
92
+ partial: "partial";
93
+ }>;
94
+ export type AttendanceStatus = z.infer<typeof AttendanceStatus>;
95
+ /**
96
+ * One person, one day, derived.
97
+ *
98
+ * Recomputable from punches, schedule, calendar and leave at any moment. `policyHash` records what
99
+ * produced it, so a recomputation can tell whether a row is stale; `locked` mirrors the period, so
100
+ * a closed month cannot silently move.
101
+ */
102
+ export declare const AttendanceDay: z.ZodObject<{
103
+ personId: z.ZodUUID;
104
+ businessDate: z.ZodISODate;
105
+ scheduledMinutes: z.ZodNumber;
106
+ workedMinutes: z.ZodNumber;
107
+ breakMinutes: z.ZodNumber;
108
+ overtimeMinutes: z.ZodNumber;
109
+ lateMinutes: z.ZodNumber;
110
+ earlyLeaveMinutes: z.ZodNumber;
111
+ status: z.ZodEnum<{
112
+ leave: "leave";
113
+ pending: "pending";
114
+ present: "present";
115
+ absent: "absent";
116
+ holiday: "holiday";
117
+ weekend: "weekend";
118
+ partial: "partial";
119
+ }>;
120
+ leaveRequestId: z.ZodNullable<z.ZodUUID>;
121
+ anomalies: z.ZodArray<z.ZodString>;
122
+ firstIn: z.ZodNullable<z.ZodISODateTime>;
123
+ lastOut: z.ZodNullable<z.ZodISODateTime>;
124
+ policyHash: z.ZodNullable<z.ZodString>;
125
+ locked: z.ZodBoolean;
126
+ computedAt: z.ZodISODateTime;
127
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
128
+ id: z.ZodUUID;
129
+ }, z.core.$strip>;
130
+ export type AttendanceDay = z.infer<typeof AttendanceDay>;
131
+ /** A week of shifts, in wall-clock readings. Meaningless until a date and a zone arrive. */
132
+ export declare const ScheduleWeek: z.ZodRecord<z.ZodEnum<{
133
+ mon: "mon";
134
+ tue: "tue";
135
+ wed: "wed";
136
+ thu: "thu";
137
+ fri: "fri";
138
+ sat: "sat";
139
+ sun: "sun";
140
+ }>, z.ZodNullable<z.ZodObject<{
141
+ start: z.ZodString;
142
+ end: z.ZodString;
143
+ breakMinutes: z.ZodDefault<z.ZodNumber>;
144
+ }, z.core.$strip>>>;
145
+ export type ScheduleWeek = z.infer<typeof ScheduleWeek>;
146
+ export declare const Schedule: z.ZodObject<{
147
+ name: z.ZodString;
148
+ kind: z.ZodEnum<{
149
+ fixed: "fixed";
150
+ flexible: "flexible";
151
+ shift: "shift";
152
+ }>;
153
+ week: z.ZodRecord<z.ZodEnum<{
154
+ mon: "mon";
155
+ tue: "tue";
156
+ wed: "wed";
157
+ thu: "thu";
158
+ fri: "fri";
159
+ sat: "sat";
160
+ sun: "sun";
161
+ }>, z.ZodNullable<z.ZodObject<{
162
+ start: z.ZodString;
163
+ end: z.ZodString;
164
+ breakMinutes: z.ZodDefault<z.ZodNumber>;
165
+ }, z.core.$strip>>>;
166
+ tzMode: z.ZodEnum<{
167
+ person: "person";
168
+ office: "office";
169
+ fixed: "fixed";
170
+ }>;
171
+ tz: z.ZodNullable<z.ZodString>;
172
+ graceInMinutes: z.ZodNumber;
173
+ graceOutMinutes: z.ZodNumber;
174
+ roundingStepMinutes: z.ZodNumber;
175
+ roundingDirection: z.ZodEnum<{
176
+ nearest: "nearest";
177
+ employee: "employee";
178
+ employer: "employer";
179
+ }>;
180
+ autoClockOutAfterMinutes: z.ZodNullable<z.ZodNumber>;
181
+ archivedAt: z.ZodNullable<z.ZodISODateTime>;
182
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
183
+ id: z.ZodUUID;
184
+ }, z.core.$strip>;
185
+ export type Schedule = z.infer<typeof Schedule>;
186
+ export declare const ScheduleAssignment: z.ZodObject<{
187
+ personId: z.ZodUUID;
188
+ scheduleId: z.ZodUUID;
189
+ effectiveFrom: z.ZodISODate;
190
+ effectiveTo: z.ZodNullable<z.ZodISODate>;
191
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
192
+ id: z.ZodUUID;
193
+ }, z.core.$strip>;
194
+ export type ScheduleAssignment = z.infer<typeof ScheduleAssignment>;
195
+ /**
196
+ * A request to fix a wrong or missing punch.
197
+ *
198
+ * It does not edit anything. Approving it writes *new* punches that void the old ones, so the
199
+ * original record and the correction both survive — which is the difference between a corrected
200
+ * timesheet and an edited one.
201
+ */
202
+ export declare const Regularization: z.ZodObject<{
203
+ personId: z.ZodUUID;
204
+ businessDate: z.ZodISODate;
205
+ punchId: z.ZodNullable<z.ZodUUID>;
206
+ proposed: z.ZodArray<z.ZodObject<{
207
+ direction: z.ZodEnum<{
208
+ out: "out";
209
+ in: "in";
210
+ break_start: "break_start";
211
+ break_end: "break_end";
212
+ }>;
213
+ at: z.ZodISODateTime;
214
+ }, z.core.$strip>>;
215
+ reason: z.ZodString;
216
+ status: z.ZodEnum<{
217
+ pending: "pending";
218
+ approved: "approved";
219
+ rejected: "rejected";
220
+ cancelled: "cancelled";
221
+ }>;
222
+ approvalRequestId: z.ZodNullable<z.ZodUUID>;
223
+ appliedAt: z.ZodNullable<z.ZodISODateTime>;
224
+ createdAt: z.ZodISODateTime;
225
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
226
+ id: z.ZodUUID;
227
+ }, z.core.$strip>;
228
+ export type Regularization = z.infer<typeof Regularization>;
229
+ /** The person's own live state: are they clocked in, since when, on a break? */
230
+ export declare const ClockState: z.ZodObject<{
231
+ personId: z.ZodUUID;
232
+ businessDate: z.ZodISODate;
233
+ clockedIn: z.ZodBoolean;
234
+ onBreak: z.ZodBoolean;
235
+ since: z.ZodNullable<z.ZodISODateTime>;
236
+ workedMinutesToday: z.ZodNumber;
237
+ timezone: z.ZodString;
238
+ }, z.core.$strip>;
239
+ export type ClockState = z.infer<typeof ClockState>;
240
+ //# sourceMappingURL=attendance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.d.ts","sourceRoot":"","sources":["../../src/contract/attendance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,cAAc;;;;;EAAoD,CAAA;AAC/E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,WAAW;;;;;;;;EAAyE,CAAA;AACjG,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;;;;EAA6C,CAAA;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAA;AAEzC,eAAO,MAAM,gBAAgB;;;;;;;;EAS3B,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBxB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,4FAA4F;AAC5F,eAAO,MAAM,YAAY;;;;;;;;;;;;mBASxB,CAAA;AACD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgBnB,CAAA;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE/C,eAAO,MAAM,kBAAkB;;;;;;;iBAO7B,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;iBAazB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,gFAAgF;AAChF,eAAO,MAAM,UAAU;;;;;;;;iBAQrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -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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"}
@@ -1 +1 @@
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"}
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"}
@@ -83,6 +83,24 @@ export const hrCapabilities = defineCapabilities([
83
83
  defaultEnabled: false,
84
84
  level: 2,
85
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
+ },
86
104
  {
87
105
  id: 'documents',
88
106
  label: 'Employee documents',
@@ -145,6 +163,24 @@ export const hrCapabilityProcedures = {
145
163
  'leave.requests.cancel',
146
164
  'leave.team.calendar',
147
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
+ ],
148
184
  approvals: [
149
185
  'approvals.chains.list',
150
186
  '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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"}
@@ -106,6 +106,24 @@ export declare const hrEvents: {
106
106
  subjectId: z.ZodUUID;
107
107
  status: z.ZodString;
108
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>>;
109
127
  calendarChanged: import("@kernhq/contracts").EventDef<"hr.calendar.changed", z.ZodObject<{
110
128
  calendarId: z.ZodUUID;
111
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;;;;;;;;IAWH;;;;;OAKG;;;;;;;;;IAYH,mFAAmF;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCpF,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"}
@@ -95,6 +95,24 @@ export const hrEvents = {
95
95
  subjectId: z.uuid(),
96
96
  status: z.string(),
97
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
+ })),
98
116
  calendarChanged: defineEvent('hr.calendar.changed', z.object({
99
117
  calendarId: z.uuid(),
100
118
  workspaceId: WorkspaceId,
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/contract/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/contract/events.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  * and also that every procedure listed in `hrCapabilityProcedures` carries its capability guard.
8
8
  */
9
9
  export * from './approvals.js';
10
+ export * from './attendance.js';
10
11
  export * from './capabilities.js';
11
12
  export * from './events.js';
12
13
  export * from './leave.js';
@@ -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,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,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
@@ -7,6 +7,7 @@
7
7
  * and also that every procedure listed in `hrCapabilityProcedures` carries its capability guard.
8
8
  */
9
9
  export * from './approvals.js';
10
+ export * from './attendance.js';
10
11
  export * from './capabilities.js';
11
12
  export * from './events.js';
12
13
  export * from './leave.js';
@@ -1 +1 @@
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"}
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"}
@@ -177,6 +177,43 @@ export declare const hrPermissions: readonly [{
177
177
  readonly scope: "workspace";
178
178
  readonly defaultRoles: [];
179
179
  readonly dangerous: true;
180
+ }, {
181
+ readonly key: "hr.attendance.punch";
182
+ readonly label: "Clock yourself in and out";
183
+ readonly scope: "workspace";
184
+ readonly defaultRoles: ["owner", "admin", "member"];
185
+ readonly dangerous: false;
186
+ }, {
187
+ readonly key: "hr.attendance.view";
188
+ readonly label: "View your own attendance";
189
+ readonly scope: "workspace";
190
+ readonly defaultRoles: ["owner", "admin", "member"];
191
+ readonly dangerous: false;
192
+ }, {
193
+ readonly key: "hr.attendance.view_team";
194
+ readonly label: "View your team's attendance";
195
+ readonly scope: "object";
196
+ readonly defaultRoles: ["owner", "admin"];
197
+ readonly dangerous: false;
198
+ }, {
199
+ readonly key: "hr.attendance.manage";
200
+ readonly label: "Correct punches, schedules and day sheets";
201
+ readonly description: "Voids punches and recomputes days. Every change leaves the original visible.";
202
+ readonly scope: "workspace";
203
+ readonly defaultRoles: ["owner", "admin"];
204
+ readonly dangerous: true;
205
+ }, {
206
+ readonly key: "hr.overtime.view";
207
+ readonly label: "View overtime";
208
+ readonly scope: "workspace";
209
+ readonly defaultRoles: ["owner", "admin"];
210
+ readonly dangerous: false;
211
+ }, {
212
+ readonly key: "hr.overtime.manage";
213
+ readonly label: "Approve and adjust overtime";
214
+ readonly scope: "workspace";
215
+ readonly defaultRoles: ["owner", "admin"];
216
+ readonly dangerous: false;
180
217
  }, {
181
218
  readonly key: "hr.approval.manage";
182
219
  readonly label: "Configure approval chains";
@@ -225,6 +262,12 @@ export declare const HR_PERMISSIONS: {
225
262
  readonly leaveViewLedger: "hr.leave.view_ledger";
226
263
  readonly leaveManage: "hr.leave.manage";
227
264
  readonly leaveAdjust: "hr.leave.adjust";
265
+ readonly attendancePunch: "hr.attendance.punch";
266
+ readonly attendanceView: "hr.attendance.view";
267
+ readonly attendanceViewTeam: "hr.attendance.view_team";
268
+ readonly attendanceManage: "hr.attendance.manage";
269
+ readonly overtimeView: "hr.overtime.view";
270
+ readonly overtimeManage: "hr.overtime.manage";
228
271
  readonly approvalManage: "hr.approval.manage";
229
272
  readonly approvalDelegate: "hr.approval.delegate";
230
273
  };
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuOxB,CAAA;AAEF,+DAA+D;AAC/D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BjB,CAAA"}
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"}