@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.
- package/LICENSE +662 -0
- package/README.md +71 -0
- package/dist/contract/capabilities.d.ts +45 -0
- package/dist/contract/capabilities.d.ts.map +1 -0
- package/dist/contract/capabilities.js +114 -0
- package/dist/contract/capabilities.js.map +1 -0
- package/dist/contract/events.d.ts +74 -0
- package/dist/contract/events.d.ts.map +1 -0
- package/dist/contract/events.js +63 -0
- package/dist/contract/events.js.map +1 -0
- package/dist/contract/index.d.ts +15 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +15 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/models.d.ts +457 -0
- package/dist/contract/models.d.ts.map +1 -0
- package/dist/contract/models.js +381 -0
- package/dist/contract/models.js.map +1 -0
- package/dist/contract/permissions.d.ts +174 -0
- package/dist/contract/permissions.d.ts.map +1 -0
- package/dist/contract/permissions.js +209 -0
- package/dist/contract/permissions.js.map +1 -0
- package/dist/contract/router.d.ts +2720 -0
- package/dist/contract/router.d.ts.map +1 -0
- package/dist/contract/router.js +520 -0
- package/dist/contract/router.js.map +1 -0
- package/dist/contract/settings.d.ts +20 -0
- package/dist/contract/settings.d.ts.map +1 -0
- package/dist/contract/settings.js +34 -0
- package/dist/contract/settings.js.map +1 -0
- package/dist/policy/calendar.d.ts +64 -0
- package/dist/policy/calendar.d.ts.map +1 -0
- package/dist/policy/calendar.js +113 -0
- package/dist/policy/calendar.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +141 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/packs/index.d.ts +50 -0
- package/dist/server/packs/index.d.ts.map +1 -0
- package/dist/server/packs/index.js +121 -0
- package/dist/server/packs/index.js.map +1 -0
- package/dist/server/router.d.ts +3095 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +1537 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/schema.d.ts +2828 -0
- package/dist/server/schema.d.ts.map +1 -0
- package/dist/server/schema.js +313 -0
- package/dist/server/schema.js.map +1 -0
- package/dist/server/services/db.d.ts +22 -0
- package/dist/server/services/db.d.ts.map +1 -0
- package/dist/server/services/db.js +23 -0
- package/dist/server/services/db.js.map +1 -0
- package/dist/server/services/people.d.ts +110 -0
- package/dist/server/services/people.d.ts.map +1 -0
- package/dist/server/services/people.js +182 -0
- package/dist/server/services/people.js.map +1 -0
- package/dist/server/services/resolve.d.ts +66 -0
- package/dist/server/services/resolve.d.ts.map +1 -0
- package/dist/server/services/resolve.js +145 -0
- package/dist/server/services/resolve.js.map +1 -0
- package/migrations/0000_init.sql +223 -0
- package/migrations/0001_rls.sql +141 -0
- package/migrations/meta/0000_snapshot.json +1715 -0
- package/migrations/meta/_journal.json +20 -0
- package/package.json +59 -0
- package/src/client/index.ts +62 -0
- package/src/contract/capabilities.ts +117 -0
- package/src/contract/events.ts +84 -0
- package/src/contract/index.ts +14 -0
- package/src/contract/models.ts +437 -0
- package/src/contract/permissions.ts +217 -0
- package/src/contract/router.ts +611 -0
- 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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"}
|