@kernhq/module-hr 0.1.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 (75) hide show
  1. package/LICENSE +662 -0
  2. package/README.md +71 -0
  3. package/dist/contract/capabilities.d.ts +45 -0
  4. package/dist/contract/capabilities.d.ts.map +1 -0
  5. package/dist/contract/capabilities.js +114 -0
  6. package/dist/contract/capabilities.js.map +1 -0
  7. package/dist/contract/events.d.ts +74 -0
  8. package/dist/contract/events.d.ts.map +1 -0
  9. package/dist/contract/events.js +63 -0
  10. package/dist/contract/events.js.map +1 -0
  11. package/dist/contract/index.d.ts +15 -0
  12. package/dist/contract/index.d.ts.map +1 -0
  13. package/dist/contract/index.js +15 -0
  14. package/dist/contract/index.js.map +1 -0
  15. package/dist/contract/models.d.ts +457 -0
  16. package/dist/contract/models.d.ts.map +1 -0
  17. package/dist/contract/models.js +381 -0
  18. package/dist/contract/models.js.map +1 -0
  19. package/dist/contract/permissions.d.ts +174 -0
  20. package/dist/contract/permissions.d.ts.map +1 -0
  21. package/dist/contract/permissions.js +209 -0
  22. package/dist/contract/permissions.js.map +1 -0
  23. package/dist/contract/router.d.ts +2720 -0
  24. package/dist/contract/router.d.ts.map +1 -0
  25. package/dist/contract/router.js +520 -0
  26. package/dist/contract/router.js.map +1 -0
  27. package/dist/contract/settings.d.ts +20 -0
  28. package/dist/contract/settings.d.ts.map +1 -0
  29. package/dist/contract/settings.js +34 -0
  30. package/dist/contract/settings.js.map +1 -0
  31. package/dist/policy/calendar.d.ts +64 -0
  32. package/dist/policy/calendar.d.ts.map +1 -0
  33. package/dist/policy/calendar.js +113 -0
  34. package/dist/policy/calendar.js.map +1 -0
  35. package/dist/server/index.d.ts +8 -0
  36. package/dist/server/index.d.ts.map +1 -0
  37. package/dist/server/index.js +141 -0
  38. package/dist/server/index.js.map +1 -0
  39. package/dist/server/packs/index.d.ts +50 -0
  40. package/dist/server/packs/index.d.ts.map +1 -0
  41. package/dist/server/packs/index.js +121 -0
  42. package/dist/server/packs/index.js.map +1 -0
  43. package/dist/server/router.d.ts +3095 -0
  44. package/dist/server/router.d.ts.map +1 -0
  45. package/dist/server/router.js +1537 -0
  46. package/dist/server/router.js.map +1 -0
  47. package/dist/server/schema.d.ts +2828 -0
  48. package/dist/server/schema.d.ts.map +1 -0
  49. package/dist/server/schema.js +313 -0
  50. package/dist/server/schema.js.map +1 -0
  51. package/dist/server/services/db.d.ts +22 -0
  52. package/dist/server/services/db.d.ts.map +1 -0
  53. package/dist/server/services/db.js +23 -0
  54. package/dist/server/services/db.js.map +1 -0
  55. package/dist/server/services/people.d.ts +110 -0
  56. package/dist/server/services/people.d.ts.map +1 -0
  57. package/dist/server/services/people.js +182 -0
  58. package/dist/server/services/people.js.map +1 -0
  59. package/dist/server/services/resolve.d.ts +66 -0
  60. package/dist/server/services/resolve.d.ts.map +1 -0
  61. package/dist/server/services/resolve.js +145 -0
  62. package/dist/server/services/resolve.js.map +1 -0
  63. package/migrations/0000_init.sql +223 -0
  64. package/migrations/0001_rls.sql +141 -0
  65. package/migrations/meta/0000_snapshot.json +1715 -0
  66. package/migrations/meta/_journal.json +20 -0
  67. package/package.json +59 -0
  68. package/src/client/index.ts +62 -0
  69. package/src/contract/capabilities.ts +117 -0
  70. package/src/contract/events.ts +84 -0
  71. package/src/contract/index.ts +14 -0
  72. package/src/contract/models.ts +437 -0
  73. package/src/contract/permissions.ts +217 -0
  74. package/src/contract/router.ts +611 -0
  75. package/src/contract/settings.ts +35 -0
@@ -0,0 +1,209 @@
1
+ import { definePermissions } from '@kernhq/contracts';
2
+ /**
3
+ * Who may see and change what.
4
+ *
5
+ * HR holds the most sensitive data in the product, so the split is finer than other modules':
6
+ *
7
+ * - **Your own record is not a permission.** Everybody reads and edits their own profile; there is
8
+ * no `hr.person.view_self` because a permission somebody can never lack is noise in the role
9
+ * editor. The router enforces it by identity instead.
10
+ * - **Three widths of "other people".** `view_team` is the org-unit subtree you head plus your direct
11
+ * reports; `view_office` is everybody assigned to an office you administer, which is what a local
12
+ * HR person in Amsterdam holds; `view_all` is the workspace. None of them implies the others, so a
13
+ * country HR manager does not silently become a global one.
14
+ * - **Sensitive fields are their own pair.** A directory is `hr.person.view`. A national identity
15
+ * number, a birth date and a bank account are `hr.person.view_sensitive`, which nobody holds by
16
+ * default — not even an owner's role, though an owner passes every check anyway.
17
+ *
18
+ * `scope: 'object'` on the team and office reads is deliberate: `PermissionScopeKind` has no
19
+ * `org_unit` or `office` member, and adding one is a change to `@kernhq/contracts` that would have
20
+ * to roll through the kernel and core. Binding at object scope with the unit or office id gets the
21
+ * same result today; `HrAccessService` is what resolves it.
22
+ */
23
+ export const hrPermissions = definePermissions([
24
+ // ---------------------------------------------------------------- people
25
+ {
26
+ key: 'hr.person.view',
27
+ label: 'View the staff directory',
28
+ scope: 'workspace',
29
+ defaultRoles: ['owner', 'admin', 'member'],
30
+ dangerous: false,
31
+ },
32
+ {
33
+ key: 'hr.person.view_team',
34
+ label: "View your team's records",
35
+ scope: 'object',
36
+ defaultRoles: ['owner', 'admin'],
37
+ dangerous: false,
38
+ },
39
+ {
40
+ key: 'hr.person.view_office',
41
+ label: "View an office's records",
42
+ scope: 'object',
43
+ defaultRoles: ['owner', 'admin'],
44
+ dangerous: false,
45
+ },
46
+ {
47
+ key: 'hr.person.view_all',
48
+ label: 'View every record in the workspace',
49
+ scope: 'workspace',
50
+ defaultRoles: ['owner', 'admin'],
51
+ dangerous: false,
52
+ },
53
+ {
54
+ key: 'hr.person.manage',
55
+ label: 'Add, edit and offboard people',
56
+ scope: 'workspace',
57
+ defaultRoles: ['owner', 'admin'],
58
+ dangerous: false,
59
+ },
60
+ {
61
+ key: 'hr.person.view_sensitive',
62
+ label: 'View identity, birth date and bank details',
63
+ description: 'Personal data protected under GDPR and KVKK. Grant to HR only.',
64
+ scope: 'workspace',
65
+ // Nobody by default. An owner passes every check regardless of the grant, which is the one
66
+ // unavoidable hole; every other holder had to be given it deliberately.
67
+ defaultRoles: [],
68
+ dangerous: true,
69
+ },
70
+ {
71
+ key: 'hr.person.manage_sensitive',
72
+ label: 'Edit identity, birth date and bank details',
73
+ scope: 'workspace',
74
+ defaultRoles: [],
75
+ dangerous: true,
76
+ },
77
+ // ---------------------------------------------------------------- employment
78
+ {
79
+ key: 'hr.employment.view',
80
+ label: 'View employment records and history',
81
+ scope: 'workspace',
82
+ defaultRoles: ['owner', 'admin'],
83
+ dangerous: false,
84
+ },
85
+ {
86
+ key: 'hr.employment.manage',
87
+ label: 'Change job, manager, department or hours',
88
+ scope: 'workspace',
89
+ defaultRoles: ['owner', 'admin'],
90
+ dangerous: true,
91
+ },
92
+ // ---------------------------------------------------------------- org
93
+ {
94
+ key: 'hr.org.view',
95
+ label: 'View the org chart, departments and positions',
96
+ scope: 'workspace',
97
+ defaultRoles: ['owner', 'admin', 'member'],
98
+ dangerous: false,
99
+ },
100
+ {
101
+ key: 'hr.org.manage',
102
+ label: 'Change departments, positions and reporting lines',
103
+ scope: 'workspace',
104
+ defaultRoles: ['owner', 'admin'],
105
+ dangerous: false,
106
+ },
107
+ // ---------------------------------------------------------------- offices
108
+ {
109
+ key: 'hr.office.view',
110
+ label: 'View offices',
111
+ scope: 'workspace',
112
+ defaultRoles: ['owner', 'admin', 'member'],
113
+ dangerous: false,
114
+ },
115
+ {
116
+ key: 'hr.office.manage',
117
+ label: 'Add and edit offices',
118
+ scope: 'workspace',
119
+ defaultRoles: ['owner', 'admin'],
120
+ dangerous: false,
121
+ },
122
+ {
123
+ key: 'hr.office.assign',
124
+ label: 'Assign people to offices',
125
+ // Separate from `manage`: a local HR person moves people between their own offices without being
126
+ // able to create one or change its country, which would change everybody's holidays.
127
+ scope: 'object',
128
+ defaultRoles: ['owner', 'admin'],
129
+ dangerous: false,
130
+ },
131
+ // ---------------------------------------------------------------- legal entities
132
+ {
133
+ key: 'hr.entity.view',
134
+ label: 'View legal entities and cost centres',
135
+ scope: 'workspace',
136
+ defaultRoles: ['owner', 'admin'],
137
+ dangerous: false,
138
+ },
139
+ {
140
+ key: 'hr.entity.manage',
141
+ label: 'Add and edit legal entities and cost centres',
142
+ scope: 'workspace',
143
+ defaultRoles: ['owner'],
144
+ dangerous: false,
145
+ },
146
+ // ---------------------------------------------------------------- calendars
147
+ {
148
+ key: 'hr.calendar.view',
149
+ label: 'View holiday calendars',
150
+ scope: 'workspace',
151
+ defaultRoles: ['owner', 'admin', 'member', 'guest'],
152
+ dangerous: false,
153
+ },
154
+ {
155
+ key: 'hr.calendar.manage',
156
+ label: 'Add and edit holidays and closures',
157
+ scope: 'workspace',
158
+ defaultRoles: ['owner', 'admin'],
159
+ dangerous: false,
160
+ },
161
+ // ---------------------------------------------------------------- documents
162
+ {
163
+ key: 'hr.document.view',
164
+ label: 'View employee documents',
165
+ scope: 'workspace',
166
+ defaultRoles: [],
167
+ dangerous: true,
168
+ },
169
+ {
170
+ key: 'hr.document.manage',
171
+ label: 'Attach and remove employee documents',
172
+ scope: 'workspace',
173
+ defaultRoles: [],
174
+ dangerous: true,
175
+ },
176
+ // ---------------------------------------------------------------- fields
177
+ {
178
+ key: 'hr.field.manage',
179
+ label: 'Add and edit custom fields',
180
+ scope: 'workspace',
181
+ defaultRoles: ['owner', 'admin'],
182
+ dangerous: false,
183
+ },
184
+ ]);
185
+ /** The keys, so nothing gates on a string somebody retyped. */
186
+ export const HR_PERMISSIONS = {
187
+ personView: 'hr.person.view',
188
+ personViewTeam: 'hr.person.view_team',
189
+ personViewOffice: 'hr.person.view_office',
190
+ personViewAll: 'hr.person.view_all',
191
+ personManage: 'hr.person.manage',
192
+ personViewSensitive: 'hr.person.view_sensitive',
193
+ personManageSensitive: 'hr.person.manage_sensitive',
194
+ employmentView: 'hr.employment.view',
195
+ employmentManage: 'hr.employment.manage',
196
+ orgView: 'hr.org.view',
197
+ orgManage: 'hr.org.manage',
198
+ officeView: 'hr.office.view',
199
+ officeManage: 'hr.office.manage',
200
+ officeAssign: 'hr.office.assign',
201
+ entityView: 'hr.entity.view',
202
+ entityManage: 'hr.entity.manage',
203
+ calendarView: 'hr.calendar.view',
204
+ calendarManage: 'hr.calendar.manage',
205
+ documentView: 'hr.document.view',
206
+ documentManage: 'hr.document.manage',
207
+ fieldManage: 'hr.field.manage',
208
+ };
209
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/contract/permissions.ts"],"names":[],"mappings":"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"}