@kernhq/module-hr 0.19.0 → 0.20.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 (40) hide show
  1. package/dist/contract/capabilities.d.ts.map +1 -1
  2. package/dist/contract/capabilities.js +29 -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 +2 -2
  9. package/dist/contract/permissions.d.ts.map +1 -1
  10. package/dist/contract/permissions.js +12 -2
  11. package/dist/contract/permissions.js.map +1 -1
  12. package/dist/contract/rosters.d.ts +183 -0
  13. package/dist/contract/rosters.d.ts.map +1 -0
  14. package/dist/contract/rosters.js +138 -0
  15. package/dist/contract/rosters.js.map +1 -0
  16. package/dist/contract/router.d.ts +621 -0
  17. package/dist/contract/router.d.ts.map +1 -1
  18. package/dist/contract/router.js +153 -1
  19. package/dist/contract/router.js.map +1 -1
  20. package/dist/server/router.d.ts +927 -0
  21. package/dist/server/router.d.ts.map +1 -1
  22. package/dist/server/router.js +462 -1
  23. package/dist/server/router.js.map +1 -1
  24. package/dist/server/schema.d.ts +727 -1
  25. package/dist/server/schema.d.ts.map +1 -1
  26. package/dist/server/schema.js +105 -0
  27. package/dist/server/schema.js.map +1 -1
  28. package/dist/server/services/rosters.d.ts +166 -0
  29. package/dist/server/services/rosters.d.ts.map +1 -0
  30. package/dist/server/services/rosters.js +268 -0
  31. package/dist/server/services/rosters.js.map +1 -0
  32. package/migrations/0012_rosters.sql +163 -0
  33. package/migrations/meta/0012_snapshot.json +4847 -0
  34. package/migrations/meta/_journal.json +7 -0
  35. package/package.json +1 -1
  36. package/src/contract/capabilities.ts +29 -0
  37. package/src/contract/index.ts +1 -0
  38. package/src/contract/permissions.ts +13 -2
  39. package/src/contract/rosters.ts +156 -0
  40. package/src/contract/router.ts +183 -0
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,cAAc;;;;;;;;GA0HzB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAElE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAAI,IAAI,MAAM,WAAmB,CAAA;AAChE,eAAO,MAAM,wBAAwB,GAAI,IAAI,MAAM,WAAwB,CAAA;AAE3E;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA8FpE,CAAA"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/contract/capabilities.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,cAAc;;;;;;;;GAsIzB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAElE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAAI,IAAI,MAAM,WAAmB,CAAA;AAChE,eAAO,MAAM,wBAAwB,GAAI,IAAI,MAAM,WAAwB,CAAA;AAE3E;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA+GpE,CAAA"}
@@ -121,6 +121,18 @@ export const hrCapabilities = defineCapabilities([
121
121
  defaultEnabled: false,
122
122
  level: 1,
123
123
  },
124
+ {
125
+ id: 'rosters',
126
+ label: 'Shift rosters',
127
+ description: 'Rotating shifts on a calendar, and who covers which office-day',
128
+ // Depends on attendance rather than on core: a roster is what the clock and the day sheet are
129
+ // judged against, and rostering a workspace that never clocks anybody in is a planning grid
130
+ // nothing reads. Off by default and level 3 — most companies work a week that repeats, and for
131
+ // them a rotation editor is a screen full of settings that change nothing.
132
+ dependsOn: ['attendance'],
133
+ defaultEnabled: false,
134
+ level: 3,
135
+ },
124
136
  {
125
137
  id: 'documents',
126
138
  label: 'Employee documents',
@@ -243,6 +255,23 @@ export const hrCapabilityProcedures = {
243
255
  'reports.overtime',
244
256
  'reports.absence',
245
257
  ],
258
+ rosters: [
259
+ 'rosters.shifts.list',
260
+ 'rosters.shifts.create',
261
+ 'rosters.shifts.update',
262
+ 'rosters.shifts.archive',
263
+ 'rosters.patterns.list',
264
+ 'rosters.patterns.create',
265
+ 'rosters.patterns.update',
266
+ 'rosters.patterns.archive',
267
+ 'rosters.assignments',
268
+ 'rosters.assign',
269
+ 'rosters.unassign',
270
+ 'rosters.days',
271
+ 'rosters.set',
272
+ 'rosters.clear',
273
+ 'rosters.coverage',
274
+ ],
246
275
  leave_accrual: [
247
276
  'policies.list',
248
277
  'policies.get',
@@ -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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"}
@@ -17,6 +17,7 @@ export * from './permissions.js';
17
17
  export * from './policies.js';
18
18
  export * from './privacy.js';
19
19
  export * from './reports.js';
20
+ export * from './rosters.js';
20
21
  export * from './router.js';
21
22
  export * from './settings.js';
22
23
  //# 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,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,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,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
@@ -17,6 +17,7 @@ export * from './permissions.js';
17
17
  export * from './policies.js';
18
18
  export * from './privacy.js';
19
19
  export * from './reports.js';
20
+ export * from './rosters.js';
20
21
  export * from './router.js';
21
22
  export * from './settings.js';
22
23
  //# 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,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,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,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
@@ -197,8 +197,8 @@ export declare const hrPermissions: readonly [{
197
197
  readonly dangerous: false;
198
198
  }, {
199
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.";
200
+ readonly label: "Correct punches and set schedules, rosters and day sheets";
201
+ readonly description: string;
202
202
  readonly scope: "workspace";
203
203
  readonly defaultRoles: ["owner", "admin"];
204
204
  readonly dangerous: true;
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgXxB,CAAA;AAEF,+DAA+D;AAC/D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCjB,CAAA"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2XxB,CAAA;AAEF,+DAA+D;AAC/D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCjB,CAAA"}
@@ -243,8 +243,10 @@ export const hrPermissions = definePermissions([
243
243
  },
244
244
  {
245
245
  key: 'hr.attendance.manage',
246
- label: 'Correct punches, schedules and day sheets',
247
- description: 'Voids punches and recomputes days. Every change leaves the original visible.',
246
+ label: 'Correct punches and set schedules, rosters and day sheets',
247
+ description: 'Voids punches and recomputes days. Every change leaves the original visible. Also edits ' +
248
+ 'shifts and rotations and puts people on them, which decides what a shift worker is ' +
249
+ 'expected to turn up for.',
248
250
  scope: 'workspace',
249
251
  defaultRoles: ['owner', 'admin'],
250
252
  dangerous: true,
@@ -253,6 +255,14 @@ export const hrPermissions = definePermissions([
253
255
  // nothing asks a question these keys could answer — a role checkbox that gates nothing teaches an
254
256
  // administrator the same lesson a dead capability switch does. They come back with the approval
255
257
  // flow that needs them.
258
+ //
259
+ // No `hr.roster.*` either, for the same reason and after weighing it. Rostering is `manage`:
260
+ // deciding what somebody was meant to work is the same authority as correcting what they did, and
261
+ // both feed the same day sheet. Reading a roster is `hr.attendance.view` for your own and
262
+ // `hr.attendance.view_team` for anybody else's — the coverage grid asks for the second, which is
263
+ // already what `attendance.days.list` costs to read a whole office. Four new keys would gate
264
+ // nothing the three existing ones do not already gate, which is how `hr.overtime.*` came to be
265
+ // deleted. They arrive if a workspace ever needs a planner who may roster and may not correct.
256
266
  // ---------------------------------------------------------------- reports
257
267
  {
258
268
  key: 'hr.report.view',
@@ -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,183 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Rosters: which shift a person works on a **date**.
4
+ *
5
+ * A `Schedule` is a week that repeats for ever, so `ScheduleWeek` is keyed by weekday name. That is
6
+ * the right shape for an office and cannot express a factory: 4-on-4-off has no weekly period at
7
+ * all, and neither does any 2- or 3-week rotation, so there is no length of `ScheduleWeek` that
8
+ * describes one. A roster is keyed by the calendar instead, and adds exactly three things a
9
+ * schedule does not have:
10
+ *
11
+ * - **A shift on a date.** The key is the day, not a modulus of seven.
12
+ * - **Coverage** — "who is on Early on Tuesday" is a question about an office-day, not about a
13
+ * person, and it cannot be asked of a set of weekly schedules without walking everybody's week.
14
+ * - **A one-day exception that survives.** A schedule change is effective-dated and rewrites every
15
+ * day after it; a roster override changes one day and leaves the rotation alone.
16
+ *
17
+ * Everything else attendance already does — grace, rounding, overnight shifts, night-shift business
18
+ * date attribution, the auto-close sweep — stays where it is. A roster is not a second computation
19
+ * of hours; it is a different answer to "what was this person meant to work today".
20
+ *
21
+ * **The rotation is computed, never stored per day.** A `RosterPattern` is a cycle of days and the
22
+ * date `days[0]` falls on; what somebody works on any date at all is arithmetic from those two.
23
+ * Generating a year of rows per person is what makes a roster impossible to change afterwards —
24
+ * moving a crew forward by a day becomes a bulk rewrite of thousands of rows with no way to say
25
+ * which of them a human had touched. Only the exceptions are rows.
26
+ */
27
+ /**
28
+ * A named shift: Early, Late, Night.
29
+ *
30
+ * Named rather than inlined into each pattern because coverage groups by it — "Early" in the
31
+ * warehouse pattern and "Early" in the picking pattern have to be the same column of the same grid.
32
+ * `graceInMinutes` / `graceOutMinutes` sit here rather than on the schedule for the same reason a
33
+ * night shift usually has a wider grace than a day one: they are properties of the shift.
34
+ */
35
+ export declare const RosterShift: z.ZodObject<{
36
+ name: z.ZodString;
37
+ code: z.ZodNullable<z.ZodString>;
38
+ start: z.ZodString;
39
+ end: z.ZodString;
40
+ breakMinutes: z.ZodNumber;
41
+ graceInMinutes: z.ZodNumber;
42
+ graceOutMinutes: z.ZodNumber;
43
+ color: z.ZodNullable<z.ZodString>;
44
+ archivedAt: z.ZodNullable<z.ZodISODateTime>;
45
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
46
+ id: z.ZodUUID;
47
+ }, z.core.$strip>;
48
+ export type RosterShift = z.infer<typeof RosterShift>;
49
+ /**
50
+ * One position in a rotation: the shifts worked on that day of the cycle.
51
+ *
52
+ * An **array**, so a split shift — 06:00–10:00 and 16:00–20:00, ordinary in hospitality — is a
53
+ * cycle day with two entries rather than something the model forbids. An empty array is a rest day,
54
+ * which is a different fact from "nothing is rostered": a rest day is planned.
55
+ */
56
+ export declare const RosterCycleDay: z.ZodArray<z.ZodUUID>;
57
+ export type RosterCycleDay = z.infer<typeof RosterCycleDay>;
58
+ /**
59
+ * A rotation, as a cycle and the date it starts from.
60
+ *
61
+ * The cycle length is `days.length` and is not stored separately — two numbers that must agree is
62
+ * one number and a bug. `anchorDate` is the date `days[0]` applies to; every other date is
63
+ * `(dayNumber(date) - dayNumber(anchorDate) + cycleOffset) mod days.length`, which answers for
64
+ * dates before the anchor as readily as after it.
65
+ */
66
+ export declare const RosterPattern: z.ZodObject<{
67
+ name: z.ZodString;
68
+ anchorDate: z.ZodISODate;
69
+ days: z.ZodArray<z.ZodArray<z.ZodUUID>>;
70
+ archivedAt: z.ZodNullable<z.ZodISODateTime>;
71
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
72
+ id: z.ZodUUID;
73
+ }, z.core.$strip>;
74
+ export type RosterPattern = z.infer<typeof RosterPattern>;
75
+ /**
76
+ * A person on a rotation, over a period.
77
+ *
78
+ * Effective-dated like every other assignment here, and at most one may be in force on a day — the
79
+ * exclusion constraint in migration 0012 is what guarantees that rather than the handler, because
80
+ * two concurrent requests cannot both win against a constraint.
81
+ *
82
+ * `cycleOffset` is what puts two crews on one pattern out of phase: crew B on a 4-on-4-off cycle
83
+ * with `cycleOffset: 4` works exactly the days crew A is off. Without it every crew needs its own
84
+ * copy of the same rotation, and a change to the rotation has to be made once per crew.
85
+ */
86
+ export declare const RosterAssignment: z.ZodObject<{
87
+ personId: z.ZodUUID;
88
+ patternId: z.ZodUUID;
89
+ effectiveFrom: z.ZodISODate;
90
+ effectiveTo: z.ZodNullable<z.ZodISODate>;
91
+ cycleOffset: z.ZodNumber;
92
+ createdAt: z.ZodISODateTime;
93
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
94
+ id: z.ZodUUID;
95
+ }, z.core.$strip>;
96
+ export type RosterAssignment = z.infer<typeof RosterAssignment>;
97
+ /**
98
+ * Where a rostered day came from.
99
+ *
100
+ * `none` is not the same as a rest day: it means nothing rosters this person on this date at all,
101
+ * and a screen that renders it identically to a planned day off is telling somebody their absence
102
+ * was intended. A rest day is `pattern` with no shifts.
103
+ */
104
+ export declare const RosterDaySource: z.ZodEnum<{
105
+ pattern: "pattern";
106
+ override: "override";
107
+ none: "none";
108
+ }>;
109
+ export type RosterDaySource = z.infer<typeof RosterDaySource>;
110
+ export declare const RosterDay: z.ZodObject<{
111
+ personId: z.ZodUUID;
112
+ businessDate: z.ZodISODate;
113
+ shifts: z.ZodArray<z.ZodObject<{
114
+ name: z.ZodString;
115
+ code: z.ZodNullable<z.ZodString>;
116
+ start: z.ZodString;
117
+ end: z.ZodString;
118
+ breakMinutes: z.ZodNumber;
119
+ graceInMinutes: z.ZodNumber;
120
+ graceOutMinutes: z.ZodNumber;
121
+ color: z.ZodNullable<z.ZodString>;
122
+ archivedAt: z.ZodNullable<z.ZodISODateTime>;
123
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
124
+ id: z.ZodUUID;
125
+ }, z.core.$strip>>;
126
+ source: z.ZodEnum<{
127
+ pattern: "pattern";
128
+ override: "override";
129
+ none: "none";
130
+ }>;
131
+ note: z.ZodNullable<z.ZodString>;
132
+ }, z.core.$strip>;
133
+ export type RosterDay = z.infer<typeof RosterDay>;
134
+ /** Enough of a person to fill a coverage grid. The name every member may already read. */
135
+ export declare const RosterPerson: z.ZodObject<{
136
+ personId: z.ZodUUID;
137
+ displayName: z.ZodString;
138
+ }, z.core.$strip>;
139
+ export type RosterPerson = z.infer<typeof RosterPerson>;
140
+ /**
141
+ * One office-day, which is the question a roster exists to answer.
142
+ *
143
+ * `off` carries the people a pattern covers on this date and does not put on a shift — the answer
144
+ * to "who could I call in", which is the second thing anybody looking at a coverage grid wants and
145
+ * the one a list of who is working cannot give.
146
+ */
147
+ export declare const RosterCoverageDay: z.ZodObject<{
148
+ businessDate: z.ZodISODate;
149
+ slots: z.ZodArray<z.ZodObject<{
150
+ shift: z.ZodObject<{
151
+ name: z.ZodString;
152
+ code: z.ZodNullable<z.ZodString>;
153
+ start: z.ZodString;
154
+ end: z.ZodString;
155
+ breakMinutes: z.ZodNumber;
156
+ graceInMinutes: z.ZodNumber;
157
+ graceOutMinutes: z.ZodNumber;
158
+ color: z.ZodNullable<z.ZodString>;
159
+ archivedAt: z.ZodNullable<z.ZodISODateTime>;
160
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
161
+ id: z.ZodUUID;
162
+ }, z.core.$strip>;
163
+ people: z.ZodArray<z.ZodObject<{
164
+ personId: z.ZodUUID;
165
+ displayName: z.ZodString;
166
+ }, z.core.$strip>>;
167
+ }, z.core.$strip>>;
168
+ off: z.ZodArray<z.ZodObject<{
169
+ personId: z.ZodUUID;
170
+ displayName: z.ZodString;
171
+ }, z.core.$strip>>;
172
+ }, z.core.$strip>;
173
+ export type RosterCoverageDay = z.infer<typeof RosterCoverageDay>;
174
+ /**
175
+ * How long a roster range may be.
176
+ *
177
+ * Expansion is arithmetic and cheap; the cost is the person-days a coverage grid resolves and the
178
+ * size of what comes back. A quarter covers the longest rotation anybody plans by hand, and
179
+ * coverage is capped tighter because it multiplies by the population of an office.
180
+ */
181
+ export declare const MAX_ROSTER_DAYS = 186;
182
+ export declare const MAX_COVERAGE_DAYS = 42;
183
+ //# sourceMappingURL=rosters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rosters.d.ts","sourceRoot":"","sources":["../../src/contract/rosters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;iBActB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,uBAA2B,CAAA;AACtD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;;;;;;iBAQxB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;iBAS3B,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;EAA0C,CAAA;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAE7D,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;iBAOpB,CAAA;AACF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAEjD,0FAA0F;AAC1F,eAAO,MAAM,YAAY;;;iBAA4D,CAAA;AACrF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;iBAI5B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEjE;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA;AAClC,eAAO,MAAM,iBAAiB,KAAK,CAAA"}
@@ -0,0 +1,138 @@
1
+ import { Timestamp, WorkspaceId } from '@kernhq/contracts';
2
+ import { z } from 'zod';
3
+ import { IsoDate, WallClock } from './models.js';
4
+ const ws = { workspaceId: WorkspaceId };
5
+ /**
6
+ * Rosters: which shift a person works on a **date**.
7
+ *
8
+ * A `Schedule` is a week that repeats for ever, so `ScheduleWeek` is keyed by weekday name. That is
9
+ * the right shape for an office and cannot express a factory: 4-on-4-off has no weekly period at
10
+ * all, and neither does any 2- or 3-week rotation, so there is no length of `ScheduleWeek` that
11
+ * describes one. A roster is keyed by the calendar instead, and adds exactly three things a
12
+ * schedule does not have:
13
+ *
14
+ * - **A shift on a date.** The key is the day, not a modulus of seven.
15
+ * - **Coverage** — "who is on Early on Tuesday" is a question about an office-day, not about a
16
+ * person, and it cannot be asked of a set of weekly schedules without walking everybody's week.
17
+ * - **A one-day exception that survives.** A schedule change is effective-dated and rewrites every
18
+ * day after it; a roster override changes one day and leaves the rotation alone.
19
+ *
20
+ * Everything else attendance already does — grace, rounding, overnight shifts, night-shift business
21
+ * date attribution, the auto-close sweep — stays where it is. A roster is not a second computation
22
+ * of hours; it is a different answer to "what was this person meant to work today".
23
+ *
24
+ * **The rotation is computed, never stored per day.** A `RosterPattern` is a cycle of days and the
25
+ * date `days[0]` falls on; what somebody works on any date at all is arithmetic from those two.
26
+ * Generating a year of rows per person is what makes a roster impossible to change afterwards —
27
+ * moving a crew forward by a day becomes a bulk rewrite of thousands of rows with no way to say
28
+ * which of them a human had touched. Only the exceptions are rows.
29
+ */
30
+ /**
31
+ * A named shift: Early, Late, Night.
32
+ *
33
+ * Named rather than inlined into each pattern because coverage groups by it — "Early" in the
34
+ * warehouse pattern and "Early" in the picking pattern have to be the same column of the same grid.
35
+ * `graceInMinutes` / `graceOutMinutes` sit here rather than on the schedule for the same reason a
36
+ * night shift usually has a wider grace than a day one: they are properties of the shift.
37
+ */
38
+ export const RosterShift = z.object({
39
+ id: z.uuid(),
40
+ ...ws,
41
+ name: z.string().min(1).max(80),
42
+ /** A one- or two-letter code, for a grid too dense to carry a name. */
43
+ code: z.string().max(8).nullable(),
44
+ start: WallClock,
45
+ /** Earlier than `start` for a shift that ends the next morning — the same rule `ShiftSpec` uses. */
46
+ end: WallClock,
47
+ breakMinutes: z.number().int().min(0).max(480),
48
+ graceInMinutes: z.number().int().min(0).max(240),
49
+ graceOutMinutes: z.number().int().min(0).max(240),
50
+ color: z.string().max(32).nullable(),
51
+ archivedAt: Timestamp.nullable(),
52
+ });
53
+ /**
54
+ * One position in a rotation: the shifts worked on that day of the cycle.
55
+ *
56
+ * An **array**, so a split shift — 06:00–10:00 and 16:00–20:00, ordinary in hospitality — is a
57
+ * cycle day with two entries rather than something the model forbids. An empty array is a rest day,
58
+ * which is a different fact from "nothing is rostered": a rest day is planned.
59
+ */
60
+ export const RosterCycleDay = z.array(z.uuid()).max(4);
61
+ /**
62
+ * A rotation, as a cycle and the date it starts from.
63
+ *
64
+ * The cycle length is `days.length` and is not stored separately — two numbers that must agree is
65
+ * one number and a bug. `anchorDate` is the date `days[0]` applies to; every other date is
66
+ * `(dayNumber(date) - dayNumber(anchorDate) + cycleOffset) mod days.length`, which answers for
67
+ * dates before the anchor as readily as after it.
68
+ */
69
+ export const RosterPattern = z.object({
70
+ id: z.uuid(),
71
+ ...ws,
72
+ name: z.string().min(1).max(120),
73
+ /** The date `days[0]` falls on. Moving it rotates every assignment on this pattern at once. */
74
+ anchorDate: IsoDate,
75
+ days: z.array(RosterCycleDay).min(1).max(56),
76
+ archivedAt: Timestamp.nullable(),
77
+ });
78
+ /**
79
+ * A person on a rotation, over a period.
80
+ *
81
+ * Effective-dated like every other assignment here, and at most one may be in force on a day — the
82
+ * exclusion constraint in migration 0012 is what guarantees that rather than the handler, because
83
+ * two concurrent requests cannot both win against a constraint.
84
+ *
85
+ * `cycleOffset` is what puts two crews on one pattern out of phase: crew B on a 4-on-4-off cycle
86
+ * with `cycleOffset: 4` works exactly the days crew A is off. Without it every crew needs its own
87
+ * copy of the same rotation, and a change to the rotation has to be made once per crew.
88
+ */
89
+ export const RosterAssignment = z.object({
90
+ id: z.uuid(),
91
+ ...ws,
92
+ personId: z.uuid(),
93
+ patternId: z.uuid(),
94
+ effectiveFrom: IsoDate,
95
+ effectiveTo: IsoDate.nullable(),
96
+ cycleOffset: z.number().int().min(0).max(55),
97
+ createdAt: Timestamp,
98
+ });
99
+ /**
100
+ * Where a rostered day came from.
101
+ *
102
+ * `none` is not the same as a rest day: it means nothing rosters this person on this date at all,
103
+ * and a screen that renders it identically to a planned day off is telling somebody their absence
104
+ * was intended. A rest day is `pattern` with no shifts.
105
+ */
106
+ export const RosterDaySource = z.enum(['pattern', 'override', 'none']);
107
+ export const RosterDay = z.object({
108
+ personId: z.uuid(),
109
+ businessDate: IsoDate,
110
+ shifts: z.array(RosterShift),
111
+ source: RosterDaySource,
112
+ /** Why this day differs from the rotation. Only ever set on an override. */
113
+ note: z.string().max(500).nullable(),
114
+ });
115
+ /** Enough of a person to fill a coverage grid. The name every member may already read. */
116
+ export const RosterPerson = z.object({ personId: z.uuid(), displayName: z.string() });
117
+ /**
118
+ * One office-day, which is the question a roster exists to answer.
119
+ *
120
+ * `off` carries the people a pattern covers on this date and does not put on a shift — the answer
121
+ * to "who could I call in", which is the second thing anybody looking at a coverage grid wants and
122
+ * the one a list of who is working cannot give.
123
+ */
124
+ export const RosterCoverageDay = z.object({
125
+ businessDate: IsoDate,
126
+ slots: z.array(z.object({ shift: RosterShift, people: z.array(RosterPerson) })),
127
+ off: z.array(RosterPerson),
128
+ });
129
+ /**
130
+ * How long a roster range may be.
131
+ *
132
+ * Expansion is arithmetic and cheap; the cost is the person-days a coverage grid resolves and the
133
+ * size of what comes back. A quarter covers the longest rotation anybody plans by hand, and
134
+ * coverage is capped tighter because it multiplies by the population of an office.
135
+ */
136
+ export const MAX_ROSTER_DAYS = 186;
137
+ export const MAX_COVERAGE_DAYS = 42;
138
+ //# sourceMappingURL=rosters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rosters.js","sourceRoot":"","sources":["../../src/contract/rosters.ts"],"names":[],"mappings":"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"}