@kernhq/module-hr 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/contract/capabilities.d.ts.map +1 -1
  2. package/dist/contract/capabilities.js +31 -0
  3. package/dist/contract/capabilities.js.map +1 -1
  4. package/dist/contract/index.d.ts +1 -0
  5. package/dist/contract/index.d.ts.map +1 -1
  6. package/dist/contract/index.js +1 -0
  7. package/dist/contract/index.js.map +1 -1
  8. package/dist/contract/permissions.d.ts +23 -0
  9. package/dist/contract/permissions.d.ts.map +1 -1
  10. package/dist/contract/permissions.js +27 -0
  11. package/dist/contract/permissions.js.map +1 -1
  12. package/dist/contract/policies.d.ts +256 -0
  13. package/dist/contract/policies.d.ts.map +1 -0
  14. package/dist/contract/policies.js +175 -0
  15. package/dist/contract/policies.js.map +1 -0
  16. package/dist/contract/router.d.ts +707 -0
  17. package/dist/contract/router.d.ts.map +1 -1
  18. package/dist/contract/router.js +127 -0
  19. package/dist/contract/router.js.map +1 -1
  20. package/dist/policy/accrual.d.ts +127 -0
  21. package/dist/policy/accrual.d.ts.map +1 -0
  22. package/dist/policy/accrual.js +134 -0
  23. package/dist/policy/accrual.js.map +1 -0
  24. package/dist/server/jobs.d.ts.map +1 -1
  25. package/dist/server/jobs.js +186 -1
  26. package/dist/server/jobs.js.map +1 -1
  27. package/dist/server/router.d.ts +772 -0
  28. package/dist/server/router.d.ts.map +1 -1
  29. package/dist/server/router.js +462 -1
  30. package/dist/server/router.js.map +1 -1
  31. package/dist/server/schema.d.ts +612 -1
  32. package/dist/server/schema.d.ts.map +1 -1
  33. package/dist/server/schema.js +76 -0
  34. package/dist/server/schema.js.map +1 -1
  35. package/dist/server/services/policies.d.ts +53 -0
  36. package/dist/server/services/policies.d.ts.map +1 -0
  37. package/dist/server/services/policies.js +158 -0
  38. package/dist/server/services/policies.js.map +1 -0
  39. package/migrations/0004_policies.sql +89 -0
  40. package/migrations/meta/0004_snapshot.json +4035 -0
  41. package/migrations/meta/_journal.json +7 -0
  42. package/package.json +1 -1
  43. package/src/contract/capabilities.ts +31 -0
  44. package/src/contract/index.ts +1 -0
  45. package/src/contract/permissions.ts +28 -0
  46. package/src/contract/policies.ts +207 -0
  47. package/src/contract/router.ts +148 -0
@@ -0,0 +1,134 @@
1
+ import { datesBetween } from './calendar.js';
2
+ /**
3
+ * Completed years between two dates, by anniversary rather than by dividing days.
4
+ *
5
+ * `(b - a) / 365` gets leap years wrong and puts somebody over a seniority threshold days early,
6
+ * which is exactly the sort of error that shows up as one extra day of leave and takes an afternoon
7
+ * to trace.
8
+ */
9
+ export function completedYears(from, to) {
10
+ const [fy, fm, fd] = from.split('-').map(Number);
11
+ const [ty, tm, td] = to.split('-').map(Number);
12
+ let years = ty - fy;
13
+ if (tm < fm || (tm === fm && td < fd))
14
+ years--;
15
+ return Math.max(0, years);
16
+ }
17
+ /** The entitlement that applies at a given length of service. */
18
+ export function daysPerYearFor(policy, yearsOfService) {
19
+ if (!policy.seniorityTiers?.length)
20
+ return policy.daysPerYear;
21
+ // Most senior tier that has been reached; the list is sorted here rather than trusted.
22
+ const reached = [...policy.seniorityTiers]
23
+ .sort((a, b) => b.afterYears - a.afterYears)
24
+ .find((tier) => yearsOfService >= tier.afterYears);
25
+ return reached?.daysPerYear ?? policy.daysPerYear;
26
+ }
27
+ /** Whole months between two dates, counting only complete ones. */
28
+ export function completedMonths(from, to) {
29
+ const [fy, fm, fd] = from.split('-').map(Number);
30
+ const [ty, tm, td] = to.split('-').map(Number);
31
+ let months = (ty - fy) * 12 + (tm - fm);
32
+ if (td < fd)
33
+ months--;
34
+ return Math.max(0, months);
35
+ }
36
+ /**
37
+ * What one person earns over one period.
38
+ *
39
+ * **Prorated by the days of the period they were actually employed**, not by month count: somebody
40
+ * joining on the 20th earns a third of that month, and rounding it to a whole month is how a
41
+ * balance ends up a day out for everybody who ever joined mid-month.
42
+ *
43
+ * `fte` scales it again — a half-time contract earns half. The two multiply rather than the larger
44
+ * winning, because a half-time joiner on the 20th has earned a sixth of a month and both facts are
45
+ * true at once.
46
+ */
47
+ export function accrueForPeriod(opts) {
48
+ const { policy, period, hiredOn, terminatedOn, fte } = opts;
49
+ const periodDays = datesBetween(period.from, period.to).length;
50
+ if (periodDays <= 0)
51
+ return { minutes: 0, proration: 0, reason: 'empty period' };
52
+ // The window they were actually employed for, clipped to the period.
53
+ const start = hiredOn > period.from ? hiredOn : period.from;
54
+ const end = terminatedOn && terminatedOn < period.to ? terminatedOn : period.to;
55
+ if (end < start)
56
+ return { minutes: 0, proration: 0, reason: 'not employed in this period' };
57
+ const waiting = policy.waitingPeriodMonths ?? 0;
58
+ if (waiting > 0 && completedMonths(hiredOn, end) < waiting)
59
+ return { minutes: 0, proration: 0, reason: `within the ${waiting}-month waiting period` };
60
+ const employedDays = datesBetween(start, end).length;
61
+ const unpaid = Math.min(opts.unpaidDays ?? 0, employedDays);
62
+ const countedDays = Math.max(0, employedDays - unpaid);
63
+ const proration = countedDays / periodDays;
64
+ const years = completedYears(hiredOn, end);
65
+ const entitlementDays = daysPerYearFor(policy, years);
66
+ // How much of a *year* this period represents. Monthly is a twelfth; anything else is measured
67
+ // from the period itself so a part-year run does not silently become a full one.
68
+ const periodShareOfYear = policy.frequency === 'monthly' ? 1 / 12 : periodDays / 365;
69
+ const raw = entitlementDays * policy.minutesPerDay * periodShareOfYear * proration * fte;
70
+ const minutes = roundTo(raw, policy.roundToMinutes ?? 0);
71
+ const parts = [`${entitlementDays}d/yr`];
72
+ if (years > 0 && policy.seniorityTiers?.length)
73
+ parts.push(`${years}y service`);
74
+ if (proration < 1)
75
+ parts.push(`${Math.round(proration * 100)}% of period`);
76
+ if (fte !== 1)
77
+ parts.push(`${fte} FTE`);
78
+ if (unpaid > 0)
79
+ parts.push(`${unpaid}d unpaid`);
80
+ return { minutes, proration, reason: parts.join(' · ') };
81
+ }
82
+ const roundTo = (value, step) => step > 0 ? Math.round(value / step) * step : Math.round(value);
83
+ /**
84
+ * What survives into the next entitlement year, and what lapses.
85
+ *
86
+ * Returns both halves rather than just the survivor, because the ledger needs an `expiry` entry for
87
+ * the difference — a balance that silently shrinks at midnight on the 1st of January is the single
88
+ * most disputed number in any leave system.
89
+ */
90
+ export function carryForward(balanceMinutes, policy) {
91
+ if (balanceMinutes <= 0)
92
+ return { carriedMinutes: 0, expiredMinutes: 0 };
93
+ const carried = Math.min(balanceMinutes, policy.maxMinutes);
94
+ return { carriedMinutes: carried, expiredMinutes: balanceMinutes - carried };
95
+ }
96
+ /**
97
+ * The date carried leave lapses, if it does.
98
+ *
99
+ * Computed from the start of the new entitlement year rather than from the carry date, because
100
+ * "three months to use it" means three months of the new year for everybody — not three months from
101
+ * whenever the job happened to run.
102
+ */
103
+ export function carryExpiryDate(yearStart, policy) {
104
+ if (policy.expiresAfterMonths === null)
105
+ return null;
106
+ const [y, m, d] = yearStart.split('-').map(Number);
107
+ let month = m + policy.expiresAfterMonths;
108
+ let year = y;
109
+ while (month > 12) {
110
+ month -= 12;
111
+ year++;
112
+ }
113
+ const lengths = [31, isLeap(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
114
+ const day = Math.min(d, lengths[month - 1]);
115
+ return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
116
+ }
117
+ const isLeap = (y) => (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
118
+ /**
119
+ * Overtime beyond a threshold, with an optional weekly or monthly cap.
120
+ *
121
+ * The cap exists because several jurisdictions limit how much overtime may be *worked*, not just
122
+ * how it is paid — Turkish law caps it at 270 hours a year. Returning the excess separately lets a
123
+ * report show it rather than silently discarding the hours somebody actually worked.
124
+ */
125
+ export function overtimeFor(opts) {
126
+ const threshold = opts.thresholdMinutes ?? 0;
127
+ const raw = Math.max(0, opts.workedMinutes - opts.scheduledMinutes - threshold);
128
+ if (opts.capMinutes === null || opts.capMinutes === undefined)
129
+ return { overtimeMinutes: raw, beyondCapMinutes: 0 };
130
+ const room = Math.max(0, opts.capMinutes - (opts.alreadyCountedMinutes ?? 0));
131
+ const counted = Math.min(raw, room);
132
+ return { overtimeMinutes: counted, beyondCapMinutes: raw - counted };
133
+ }
134
+ //# sourceMappingURL=accrual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accrual.js","sourceRoot":"","sources":["../../src/policy/accrual.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/server/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAW,OAAO,EAAoB,MAAM,aAAa,CAAA;AAChE,OAAO,EAAkB,OAAO,EAAsB,MAAM,aAAa,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C;;;;;;;;GAQG;AACH,wBAAgB,MAAM,IAAI,MAAM,EAAE,CAqLjC;AAeD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/server/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAW,OAAO,EAAoB,MAAM,aAAa,CAAA;AAEhE,OAAO,EAKL,OAAO,EAIR,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAK1C;;;;;;;;GAQG;AACH,wBAAgB,MAAM,IAAI,MAAM,EAAE,CAwYjC;AAeD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -1,7 +1,10 @@
1
1
  import { and, eq, inArray, isNull, lte, sql } from 'drizzle-orm';
2
- import { attendanceDays, offices, punches, schedules } from './schema.js';
2
+ import { accrueForPeriod, carryForward } from '../policy/accrual.js';
3
+ import { attendanceDays, employments, leaveLedger, leaveTypes, offices, people, punches, schedules, } from './schema.js';
3
4
  import { AttendanceService } from './services/attendance.js';
4
5
  import { todayIn } from './services/db.js';
6
+ import { LedgerService } from './services/ledger.js';
7
+ import { PolicyService } from './services/policies.js';
5
8
  import { ResolveService } from './services/resolve.js';
6
9
  /**
7
10
  * HR's scheduled work.
@@ -44,6 +47,188 @@ export function hrJobs() {
44
47
  kernel.log.info({ module: 'hr' }, 'punch partitions ensured');
45
48
  },
46
49
  },
50
+ {
51
+ /**
52
+ * Monthly accrual.
53
+ *
54
+ * Runs on the 1st for the month that just ended, per office rather than once in UTC — "the
55
+ * month has ended" is a different moment in Istanbul and Amsterdam, and a single UTC-timed
56
+ * run credits one of them a day early.
57
+ *
58
+ * It writes through the same path `accrual.run` uses, so a scheduled credit and a manual one
59
+ * are the same operation and cannot drift. Idempotent per person, per type, per period: a
60
+ * retry after a partial failure credits only what is missing.
61
+ */
62
+ name: 'accrue-leave',
63
+ cron: '0 2 1 * *',
64
+ handler: async (_input, { kernel }) => {
65
+ const resolve = new ResolveService();
66
+ const policySvc = new PolicyService(resolve);
67
+ const ledger = new LedgerService();
68
+ for (const workspaceId of await activeWorkspaces(kernel))
69
+ await kernel.database.withWorkspace(workspaceId, async (tx) => {
70
+ // The month that just ended, computed by Postgres so month lengths and leap years are
71
+ // its problem rather than this file's.
72
+ const bounds = await tx.execute(sql `
73
+ select (date_trunc('month', now()) - interval '1 month')::date::text as from,
74
+ (date_trunc('month', now()) - interval '1 day')::date::text as to
75
+ `);
76
+ const previous = bounds.rows[0];
77
+ if (!previous)
78
+ return;
79
+ const { from, to } = previous;
80
+ const staff = await tx
81
+ .select()
82
+ .from(people)
83
+ .where(and(eq(people.workspaceId, workspaceId), inArray(people.status, ['active', 'on_leave'])));
84
+ if (!staff.length)
85
+ return;
86
+ const ids = staff.map((p) => p.id);
87
+ const resolved = await policySvc.forPeople(tx, workspaceId, ids, 'accrual', to);
88
+ const types = await tx
89
+ .select()
90
+ .from(leaveTypes)
91
+ .where(and(eq(leaveTypes.workspaceId, workspaceId), isNull(leaveTypes.archivedAt)));
92
+ const typeByKey = new Map(types.map((t) => [t.key, t]));
93
+ const employmentRows = await tx
94
+ .select()
95
+ .from(employments)
96
+ .where(and(eq(employments.workspaceId, workspaceId), inArray(employments.personId, ids), isNull(employments.effectiveTo)));
97
+ const employmentBy = new Map(employmentRows.map((e) => [e.personId, e]));
98
+ const already = new Set((await tx
99
+ .select({ personId: leaveLedger.personId, leaveTypeId: leaveLedger.leaveTypeId })
100
+ .from(leaveLedger)
101
+ .where(and(eq(leaveLedger.workspaceId, workspaceId), eq(leaveLedger.kind, 'accrual'), eq(leaveLedger.effectiveOn, to), inArray(leaveLedger.personId, ids)))).map((e) => `${e.personId}:${e.leaveTypeId}`));
102
+ let credited = 0;
103
+ for (const person of staff) {
104
+ const policy = resolved.get(person.id);
105
+ if (!policy?.config || !person.hiredOn)
106
+ continue;
107
+ const config = policy.config;
108
+ const type = typeByKey.get(config.leaveTypeKey);
109
+ if (!type || already.has(`${person.id}:${type.id}`))
110
+ continue;
111
+ const employment = employmentBy.get(person.id);
112
+ const result = accrueForPeriod({
113
+ policy: {
114
+ frequency: config.frequency,
115
+ daysPerYear: config.daysPerYear,
116
+ minutesPerDay: config.minutesPerDay,
117
+ seniorityTiers: config.seniorityTiers,
118
+ waitingPeriodMonths: config.waitingPeriodMonths,
119
+ roundToMinutes: config.roundToMinutes,
120
+ },
121
+ period: { from, to },
122
+ hiredOn: person.hiredOn,
123
+ terminatedOn: person.terminatedOn,
124
+ fte: employment ? Number.parseFloat(employment.fte ?? '1') : 1,
125
+ });
126
+ if (result.minutes <= 0)
127
+ continue;
128
+ const year = Number(to.slice(0, 4));
129
+ await ledger.lockAndRead(tx, workspaceId, person.id, type.id, year);
130
+ await ledger.append(tx, workspaceId, {
131
+ personId: person.id,
132
+ leaveTypeId: type.id,
133
+ kind: 'accrual',
134
+ amountMinutes: result.minutes,
135
+ effectiveOn: to,
136
+ periodYear: year,
137
+ reason: result.reason,
138
+ });
139
+ credited++;
140
+ }
141
+ if (credited)
142
+ kernel.log.info({ module: 'hr', workspaceId, credited, from, to }, 'leave accrued');
143
+ });
144
+ },
145
+ },
146
+ {
147
+ /**
148
+ * Carry-forward and expiry, on the turn of the entitlement year.
149
+ *
150
+ * Writes **both halves**: what carried and what lapsed, as separate ledger entries. A balance
151
+ * that silently shrinks at midnight on 1 January is the most disputed number in any leave
152
+ * system, and "you had 9 days, 5 carried, 4 expired under the cap" is a sentence somebody can
153
+ * check. Runs on the 2nd so a late December accrual has already landed.
154
+ */
155
+ name: 'carry-forward',
156
+ cron: '0 4 2 1 *',
157
+ handler: async (_input, { kernel }) => {
158
+ const resolve = new ResolveService();
159
+ const policySvc = new PolicyService(resolve);
160
+ const ledger = new LedgerService();
161
+ const thisYear = new Date().getUTCFullYear();
162
+ const lastYear = thisYear - 1;
163
+ for (const workspaceId of await activeWorkspaces(kernel))
164
+ await kernel.database.withWorkspace(workspaceId, async (tx) => {
165
+ const staff = await tx
166
+ .select({ id: people.id })
167
+ .from(people)
168
+ .where(and(eq(people.workspaceId, workspaceId), inArray(people.status, ['active', 'on_leave'])));
169
+ if (!staff.length)
170
+ return;
171
+ const ids = staff.map((p) => p.id);
172
+ const resolved = await policySvc.forPeople(tx, workspaceId, ids, 'carry_forward', `${lastYear}-12-31`);
173
+ const types = await tx.select().from(leaveTypes).where(eq(leaveTypes.workspaceId, workspaceId));
174
+ const typeByKey = new Map(types.map((t) => [t.key, t]));
175
+ let moved = 0;
176
+ for (const person of staff) {
177
+ const policy = resolved.get(person.id);
178
+ if (!policy?.config)
179
+ continue;
180
+ const config = policy.config;
181
+ const type = typeByKey.get(config.leaveTypeKey);
182
+ if (!type)
183
+ continue;
184
+ const minutesPerDay = 8 * 60;
185
+ const balance = await ledger.lockAndRead(tx, workspaceId, person.id, type.id, lastYear);
186
+ if (balance <= 0)
187
+ continue;
188
+ const { carriedMinutes, expiredMinutes } = carryForward(balance, {
189
+ maxMinutes: Math.round(config.maxDays * minutesPerDay),
190
+ expiresAfterMonths: config.expiresAfterMonths ?? null,
191
+ });
192
+ // The old year is closed out in full, then what survives opens the new one. Two
193
+ // entries rather than a transfer, so each year's ledger sums to what that year held.
194
+ if (expiredMinutes > 0)
195
+ await ledger.append(tx, workspaceId, {
196
+ personId: person.id,
197
+ leaveTypeId: type.id,
198
+ kind: 'expiry',
199
+ amountMinutes: -expiredMinutes,
200
+ effectiveOn: `${lastYear}-12-31`,
201
+ periodYear: lastYear,
202
+ reason: `Above the ${config.maxDays} day carry-forward cap`,
203
+ });
204
+ if (carriedMinutes > 0) {
205
+ await ledger.append(tx, workspaceId, {
206
+ personId: person.id,
207
+ leaveTypeId: type.id,
208
+ kind: 'carry_out',
209
+ amountMinutes: -carriedMinutes,
210
+ effectiveOn: `${lastYear}-12-31`,
211
+ periodYear: lastYear,
212
+ reason: `Carried into ${thisYear}`,
213
+ });
214
+ await ledger.lockAndRead(tx, workspaceId, person.id, type.id, thisYear);
215
+ await ledger.append(tx, workspaceId, {
216
+ personId: person.id,
217
+ leaveTypeId: type.id,
218
+ kind: 'carry_in',
219
+ amountMinutes: carriedMinutes,
220
+ effectiveOn: `${thisYear}-01-01`,
221
+ periodYear: thisYear,
222
+ reason: `Carried from ${lastYear}`,
223
+ });
224
+ moved++;
225
+ }
226
+ }
227
+ if (moved)
228
+ kernel.log.info({ module: 'hr', workspaceId, moved }, 'leave carried forward');
229
+ });
230
+ },
231
+ },
47
232
  {
48
233
  /**
49
234
  * Close shifts somebody forgot to clock out of.
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/server/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/server/jobs.ts"],"names":[],"mappings":"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"}