@fabriktor/fx 0.0.125 → 0.0.126

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";
@@ -49,98 +49,19 @@ export type PayrollFilters = {
49
49
  type?: string[];
50
50
  name?: string[];
51
51
  };
52
- export declare const payrollPolicies: {
53
- payrolls: {
54
- create: true;
55
- remove: true;
56
- report: true;
57
- filters: ("timezone" | "currency" | "employee_id" | "employee_pay_config_id" | "hour_bank_id" | "period_indexes" | "is_banked" | "is_problematic")[];
58
- employee_read: boolean;
59
- searchable: boolean;
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
- };
52
+ type Policy<K extends PayrollResource> = {
53
+ employee_read: boolean;
54
+ searchable: boolean;
55
+ create: boolean;
56
+ archive: boolean;
57
+ remove: boolean;
58
+ report: boolean;
59
+ filters: readonly (keyof PayrollFilters & FieldOf<PayrollRecordMap[K]>)[];
143
60
  };
61
+ type PayrollPolicies = {
62
+ [K in PayrollResource]: Policy<K>;
63
+ };
64
+ export declare const payrollPolicies: PayrollPolicies;
144
65
  export declare const payrollPayTypes: readonly ["per_hour", "fixed"];
145
66
  export declare const payrollAdjustmentTypes: readonly ["rate", "per_period", "per_hour"];
146
67
  export declare const payrollRecurrenceTypes: readonly ["daily", "weekly", "monthly", "yearly"];
@@ -182,7 +103,7 @@ export declare class PayrollWorkflowError extends Error {
182
103
  }
183
104
  export declare function payrollCanManage(actor: EmploymentActor, record?: PayrollRecord | null): boolean;
184
105
  export declare function payrollCanRead(actor: EmploymentActor, resource: PayrollResource): boolean;
185
- export declare function payrollFilterQuery(resource: PayrollResource, filters?: PayrollFilters): QueryOptions;
106
+ export declare function payrollFilterQuery<K extends PayrollResource>(resource: K, filters?: PayrollFilters, employee_id?: string): QueryOptions;
186
107
  export declare class PayrollsWorkspace {
187
108
  private readonly payrolls;
188
109
  private readonly billable?;
@@ -209,3 +130,4 @@ export declare class PayrollsWorkspace {
209
130
  setEnabled(actor: EmploymentActor, record: PayrollProgram, is_enabled: boolean): Promise<void>;
210
131
  remove(actor: EmploymentActor, resource: PayrollResource, record: PayrollRecord): Promise<void>;
211
132
  }
133
+ 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,
@@ -167,9 +166,18 @@ export function payrollCanRead(actor, resource) {
167
166
  (actor.active_mode === UserTypeEmployer ||
168
167
  payrollPolicies[resource].employee_read));
169
168
  }
170
- export function payrollFilterQuery(resource, filters = {}) {
171
- const allowed = payrollPolicies[resource].filters;
172
- return Object.fromEntries(Object.entries(filters).filter(([key, value]) => allowed.includes(key) && value !== undefined));
169
+ export function payrollFilterQuery(resource, filters = {}, employee_id) {
170
+ const policy = payrollPolicies[resource];
171
+ const query = {};
172
+ for (const key of policy.filters) {
173
+ // Authenticated employee scope takes precedence over selectable filters.
174
+ const value = key === "employee_id" && employee_id !== undefined
175
+ ? employee_id
176
+ : filters[key];
177
+ if (value !== undefined)
178
+ Object.assign(query, queryParam(key, value));
179
+ }
180
+ return query;
173
181
  }
174
182
  export class PayrollsWorkspace {
175
183
  payrolls;
@@ -239,9 +247,9 @@ export class PayrollsWorkspace {
239
247
  if (!payrollCanRead(opts.context, opts.resource))
240
248
  return emptySearchPage(opts.page, opts.per_page);
241
249
  const owner_ids = employmentCatalogOwnerIDs(opts.context, opts.employer_ids);
242
- const query = payrollFilterQuery(opts.resource, opts.filters);
243
- if (opts.context.active_mode === UserTypeEmployee)
244
- query.employee_id = opts.context.owner_id;
250
+ const query = payrollFilterQuery(opts.resource, opts.filters, opts.context.active_mode === UserTypeEmployee
251
+ ? opts.context.owner_id
252
+ : undefined);
245
253
  const port = this.ports[opts.resource];
246
254
  if (payrollPolicies[opts.resource].searchable) {
247
255
  return runOwnerScopeSearch({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabriktor/fx",
3
- "version": "0.0.125",
3
+ "version": "0.0.126",
4
4
  "description": "![Fabriktor Logo](./img/fabriktor-character.gif)",
5
5
  "type": "module",
6
6
  "exports": {