@fabriktor/fx 0.0.125 → 0.0.127
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BillableOperator, PayrollsOperator, QueryOptions } from "@fabriktor/client";
|
|
1
|
+
import type { FieldOf, BillableOperator, PayrollsOperator, QueryOptions } from "@fabriktor/client";
|
|
2
2
|
import { ColPayrollsPayrolls, ColPayrollsHourBanks, ColPayrollsPayables, ColPayrollsAdjustments, ColPayrollsAdjustmentFolders, ColPayrollsPayConfigs, ColPayrollsEmployeePayConfigs, ColPayrollsAdjustmentRecords, ColPayrollsAdjustmentAggregates, ColPayrollsPayrollPrograms, type Payroll, type HourBank, type Payable, type Adjustment, type AdjustmentFolder, type PayConfig, type EmployeePayConfig, type AdjustmentRecord, type AdjustmentAggregate, type PayrollProgram, type InPayroll, type InAdjustment, type InAdjustmentFolder, type InPayConfig, type InEmployeePayConfig, type InPayrollProgram, type InAdjustmentAggregate, type PLPayrollsGeneratePayrollFromEntities, type InDate, type Period, type Folder } from "@fabriktor/schema";
|
|
3
3
|
import type { EmploymentActor, EmploymentReadContext } from "../contacts/scope.js";
|
|
4
4
|
import { type SearchOptions, type SearchPage } from "../core/search.js";
|
|
@@ -45,102 +45,24 @@ export type PayrollFilters = {
|
|
|
45
45
|
is_banked?: boolean;
|
|
46
46
|
is_problematic?: boolean;
|
|
47
47
|
is_enabled?: boolean;
|
|
48
|
+
is_accrued?: boolean;
|
|
48
49
|
is_employer_contribution?: boolean;
|
|
49
50
|
type?: string[];
|
|
50
51
|
name?: string[];
|
|
51
52
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
archive: boolean;
|
|
61
|
-
};
|
|
62
|
-
hour_banks: {
|
|
63
|
-
searchable: false;
|
|
64
|
-
filters: ("timezone" | "currency" | "employee_id" | "period_indexes" | "is_payrolled")[];
|
|
65
|
-
employee_read: boolean;
|
|
66
|
-
create: boolean;
|
|
67
|
-
archive: boolean;
|
|
68
|
-
remove: boolean;
|
|
69
|
-
report: boolean;
|
|
70
|
-
};
|
|
71
|
-
payables: {
|
|
72
|
-
filters: ("period_index" | "currency" | "employee_id" | "payroll_id" | "is_payrolled")[];
|
|
73
|
-
employee_read: boolean;
|
|
74
|
-
searchable: boolean;
|
|
75
|
-
create: boolean;
|
|
76
|
-
archive: boolean;
|
|
77
|
-
remove: boolean;
|
|
78
|
-
report: boolean;
|
|
79
|
-
};
|
|
80
|
-
adjustments: {
|
|
81
|
-
filters: ("is_archived" | "type" | "currency" | "folder_id" | "name" | "is_employer_contribution")[];
|
|
82
|
-
employee_read: boolean;
|
|
83
|
-
searchable: boolean;
|
|
84
|
-
create: boolean;
|
|
85
|
-
archive: boolean;
|
|
86
|
-
remove: boolean;
|
|
87
|
-
report: boolean;
|
|
88
|
-
};
|
|
89
|
-
adjustment_folders: {
|
|
90
|
-
archive: false;
|
|
91
|
-
remove: true;
|
|
92
|
-
filters: "is_archived"[];
|
|
93
|
-
employee_read: boolean;
|
|
94
|
-
searchable: boolean;
|
|
95
|
-
create: boolean;
|
|
96
|
-
report: boolean;
|
|
97
|
-
};
|
|
98
|
-
pay_configs: {
|
|
99
|
-
filters: ("is_archived" | "type" | "currency" | "name")[];
|
|
100
|
-
employee_read: boolean;
|
|
101
|
-
searchable: boolean;
|
|
102
|
-
create: boolean;
|
|
103
|
-
archive: boolean;
|
|
104
|
-
remove: boolean;
|
|
105
|
-
report: boolean;
|
|
106
|
-
};
|
|
107
|
-
employee_pay_configs: {
|
|
108
|
-
employee_read: true;
|
|
109
|
-
filters: ("is_archived" | "currency" | "name" | "employee_id" | "pay_config_id")[];
|
|
110
|
-
searchable: boolean;
|
|
111
|
-
create: boolean;
|
|
112
|
-
archive: boolean;
|
|
113
|
-
remove: boolean;
|
|
114
|
-
report: boolean;
|
|
115
|
-
};
|
|
116
|
-
adjustment_records: {
|
|
117
|
-
filters: ("period_index" | "currency" | "employee_id" | "payroll_id")[];
|
|
118
|
-
employee_read: boolean;
|
|
119
|
-
searchable: boolean;
|
|
120
|
-
create: boolean;
|
|
121
|
-
archive: boolean;
|
|
122
|
-
remove: boolean;
|
|
123
|
-
report: boolean;
|
|
124
|
-
};
|
|
125
|
-
adjustment_aggregates: {
|
|
126
|
-
employee_read: false;
|
|
127
|
-
create: true;
|
|
128
|
-
report: true;
|
|
129
|
-
filters: ("currency" | "period_indexes")[];
|
|
130
|
-
searchable: boolean;
|
|
131
|
-
archive: boolean;
|
|
132
|
-
remove: boolean;
|
|
133
|
-
};
|
|
134
|
-
payroll_programs: {
|
|
135
|
-
searchable: false;
|
|
136
|
-
create: true;
|
|
137
|
-
remove: true;
|
|
138
|
-
filters: ("timezone" | "currency" | "employee_id" | "employee_pay_config_id" | "is_enabled")[];
|
|
139
|
-
employee_read: boolean;
|
|
140
|
-
archive: boolean;
|
|
141
|
-
report: boolean;
|
|
142
|
-
};
|
|
53
|
+
type Policy<K extends PayrollResource> = {
|
|
54
|
+
employee_read: boolean;
|
|
55
|
+
searchable: boolean;
|
|
56
|
+
create: boolean;
|
|
57
|
+
archive: boolean;
|
|
58
|
+
remove: boolean;
|
|
59
|
+
report: boolean;
|
|
60
|
+
filters: readonly (keyof PayrollFilters & FieldOf<PayrollRecordMap[K]>)[];
|
|
143
61
|
};
|
|
62
|
+
type PayrollPolicies = {
|
|
63
|
+
[K in PayrollResource]: Policy<K>;
|
|
64
|
+
};
|
|
65
|
+
export declare const payrollPolicies: PayrollPolicies;
|
|
144
66
|
export declare const payrollPayTypes: readonly ["per_hour", "fixed"];
|
|
145
67
|
export declare const payrollAdjustmentTypes: readonly ["rate", "per_period", "per_hour"];
|
|
146
68
|
export declare const payrollRecurrenceTypes: readonly ["daily", "weekly", "monthly", "yearly"];
|
|
@@ -182,7 +104,7 @@ export declare class PayrollWorkflowError extends Error {
|
|
|
182
104
|
}
|
|
183
105
|
export declare function payrollCanManage(actor: EmploymentActor, record?: PayrollRecord | null): boolean;
|
|
184
106
|
export declare function payrollCanRead(actor: EmploymentActor, resource: PayrollResource): boolean;
|
|
185
|
-
export declare function payrollFilterQuery(resource:
|
|
107
|
+
export declare function payrollFilterQuery<K extends PayrollResource>(resource: K, filters?: PayrollFilters, employee_id?: string): QueryOptions;
|
|
186
108
|
export declare class PayrollsWorkspace {
|
|
187
109
|
private readonly payrolls;
|
|
188
110
|
private readonly billable?;
|
|
@@ -209,3 +131,4 @@ export declare class PayrollsWorkspace {
|
|
|
209
131
|
setEnabled(actor: EmploymentActor, record: PayrollProgram, is_enabled: boolean): Promise<void>;
|
|
210
132
|
remove(actor: EmploymentActor, resource: PayrollResource, record: PayrollRecord): Promise<void>;
|
|
211
133
|
}
|
|
134
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isHTTPClientErr } from "@fabriktor/client";
|
|
1
|
+
import { isHTTPClientErr, queryParam } from "@fabriktor/client";
|
|
2
2
|
import { ColPayrollsPayrolls, ColPayrollsHourBanks, ColPayrollsPayables, ColPayrollsAdjustments, ColPayrollsAdjustmentFolders, ColPayrollsPayConfigs, ColPayrollsEmployeePayConfigs, ColPayrollsAdjustmentRecords, ColPayrollsAdjustmentAggregates, ColPayrollsPayrollPrograms, UserTypeEmployer, UserTypeEmployee, AdjustmentTypeRate, AdjustmentTypePerHour, AdjustmentTypePerPeriod, PayTypeFixed, PayTypePerHour, RecurrenceTypeDaily, RecurrenceTypeWeekly, RecurrenceTypeMonthly, RecurrenceTypeYearly, } from "@fabriktor/schema";
|
|
3
3
|
import { employmentCanRead, employmentCatalogOwnerIDs, employmentOwnsRecord, } from "../contacts/scope.js";
|
|
4
4
|
import { normalizeIDs, requiredOperationID } from "../core/id.js";
|
|
@@ -23,7 +23,6 @@ const generated = {
|
|
|
23
23
|
archive: false,
|
|
24
24
|
remove: false,
|
|
25
25
|
report: false,
|
|
26
|
-
filters: [],
|
|
27
26
|
};
|
|
28
27
|
const catalog = {
|
|
29
28
|
...generated,
|
|
@@ -76,6 +75,7 @@ export const payrollPolicies = {
|
|
|
76
75
|
filters: [
|
|
77
76
|
"name",
|
|
78
77
|
"type",
|
|
78
|
+
"is_accrued",
|
|
79
79
|
"is_employer_contribution",
|
|
80
80
|
"folder_id",
|
|
81
81
|
"currency",
|
|
@@ -167,9 +167,18 @@ export function payrollCanRead(actor, resource) {
|
|
|
167
167
|
(actor.active_mode === UserTypeEmployer ||
|
|
168
168
|
payrollPolicies[resource].employee_read));
|
|
169
169
|
}
|
|
170
|
-
export function payrollFilterQuery(resource, filters = {}) {
|
|
171
|
-
const
|
|
172
|
-
|
|
170
|
+
export function payrollFilterQuery(resource, filters = {}, employee_id) {
|
|
171
|
+
const policy = payrollPolicies[resource];
|
|
172
|
+
const query = {};
|
|
173
|
+
for (const key of policy.filters) {
|
|
174
|
+
// Authenticated employee scope takes precedence over selectable filters.
|
|
175
|
+
const value = key === "employee_id" && employee_id !== undefined
|
|
176
|
+
? employee_id
|
|
177
|
+
: filters[key];
|
|
178
|
+
if (value !== undefined)
|
|
179
|
+
Object.assign(query, queryParam(key, value));
|
|
180
|
+
}
|
|
181
|
+
return query;
|
|
173
182
|
}
|
|
174
183
|
export class PayrollsWorkspace {
|
|
175
184
|
payrolls;
|
|
@@ -239,9 +248,9 @@ export class PayrollsWorkspace {
|
|
|
239
248
|
if (!payrollCanRead(opts.context, opts.resource))
|
|
240
249
|
return emptySearchPage(opts.page, opts.per_page);
|
|
241
250
|
const owner_ids = employmentCatalogOwnerIDs(opts.context, opts.employer_ids);
|
|
242
|
-
const query = payrollFilterQuery(opts.resource, opts.filters
|
|
243
|
-
|
|
244
|
-
|
|
251
|
+
const query = payrollFilterQuery(opts.resource, opts.filters, opts.context.active_mode === UserTypeEmployee
|
|
252
|
+
? opts.context.owner_id
|
|
253
|
+
: undefined);
|
|
245
254
|
const port = this.ports[opts.resource];
|
|
246
255
|
if (payrollPolicies[opts.resource].searchable) {
|
|
247
256
|
return runOwnerScopeSearch({
|