@happyvertical/smrt-timesheets 0.56.0 → 0.56.2
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/AGENTS.md +34 -0
- package/README.md +34 -1
- package/dist/attendance.js +2 -2
- package/dist/chunks/{attendance-DGVy-iHI.js → attendance-CDfhph1R.js} +3 -3
- package/dist/chunks/{attendance-DGVy-iHI.js.map → attendance-CDfhph1R.js.map} +1 -1
- package/dist/chunks/{attendance-B1jCbqSb.js → attendance-mk6nqJhX.js} +3 -3
- package/dist/chunks/{attendance-B1jCbqSb.js.map → attendance-mk6nqJhX.js.map} +1 -1
- package/dist/chunks/{models-0-YD5F_o.js → models-C1krjn40.js} +2 -2
- package/dist/chunks/{models-0-YD5F_o.js.map → models-C1krjn40.js.map} +1 -1
- package/dist/chunks/{rollup-CDqzCxI2.js → rollup-C8p1PAXX.js} +3 -3
- package/dist/chunks/{rollup-CDqzCxI2.js.map → rollup-C8p1PAXX.js.map} +1 -1
- package/dist/chunks/service-time-entry-Cxh0pt0J.js +286 -0
- package/dist/chunks/service-time-entry-Cxh0pt0J.js.map +1 -0
- package/dist/chunks/time-entry-actions-Bp--TxUD.js +576 -0
- package/dist/chunks/time-entry-actions-Bp--TxUD.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +113 -334
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +373 -17
- package/dist/models/service-snapshots.d.ts.map +1 -1
- package/dist/models/service-time-entry.d.ts +36 -1
- package/dist/models/service-time-entry.d.ts.map +1 -1
- package/dist/recipes.d.ts +124 -0
- package/dist/recipes.d.ts.map +1 -0
- package/dist/rollup.js +1 -1
- package/dist/services/action-principal.d.ts +54 -0
- package/dist/services/action-principal.d.ts.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/time-entry-actions.d.ts +83 -0
- package/dist/services/time-entry-actions.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +230 -34
- package/package.json +8 -7
- package/dist/chunks/service-time-entry-t7P-bkOQ.js +0 -227
- package/dist/chunks/service-time-entry-t7P-bkOQ.js.map +0 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declared recipes for smrt-timesheets (#3590, #3604): user-facing units of
|
|
3
|
+
* functionality an app or agent can pick instead of the whole package.
|
|
4
|
+
* The scanner reads these statics into the `recipes` array of `manifest.json`
|
|
5
|
+
* and `smrt-knowledge.json`; nothing here runs at that point.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { SmrtRecipe } from '@happyvertical/smrt-core';
|
|
10
|
+
import { ServiceTimeEntry } from './models/service-time-entry.js';
|
|
11
|
+
/** Time entries: Record who worked how long on what, for approval. */
|
|
12
|
+
export declare class TimeEntriesRecipe extends SmrtRecipe {
|
|
13
|
+
static id: string;
|
|
14
|
+
static help: string;
|
|
15
|
+
static label: string;
|
|
16
|
+
static summary: string;
|
|
17
|
+
static synonyms: string[];
|
|
18
|
+
static section: {
|
|
19
|
+
id: string;
|
|
20
|
+
label: string;
|
|
21
|
+
icon: string;
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
static models: (typeof ServiceTimeEntry)[];
|
|
25
|
+
static nav: {
|
|
26
|
+
label: string;
|
|
27
|
+
model: typeof ServiceTimeEntry;
|
|
28
|
+
icon: string;
|
|
29
|
+
description: string;
|
|
30
|
+
}[];
|
|
31
|
+
static options: {
|
|
32
|
+
readonly ServiceTimeEntry: {
|
|
33
|
+
readonly fields: {
|
|
34
|
+
readonly participantProfileId: {
|
|
35
|
+
readonly label: "Person";
|
|
36
|
+
readonly order: 1;
|
|
37
|
+
};
|
|
38
|
+
readonly description: {
|
|
39
|
+
readonly order: 2;
|
|
40
|
+
readonly help: "What the time was spent on, in a few words.";
|
|
41
|
+
};
|
|
42
|
+
readonly startedAt: {
|
|
43
|
+
readonly label: "Started";
|
|
44
|
+
readonly order: 3;
|
|
45
|
+
};
|
|
46
|
+
readonly endedAt: {
|
|
47
|
+
readonly label: "Ended";
|
|
48
|
+
readonly order: 4;
|
|
49
|
+
};
|
|
50
|
+
readonly durationSeconds: {
|
|
51
|
+
readonly label: "Duration (seconds)";
|
|
52
|
+
readonly order: 5;
|
|
53
|
+
readonly help: "Whole seconds: 3600 is one hour.";
|
|
54
|
+
};
|
|
55
|
+
readonly workRefId: {
|
|
56
|
+
readonly label: "Work reference";
|
|
57
|
+
readonly order: 6;
|
|
58
|
+
readonly help: "The job, project or case this time belongs to.";
|
|
59
|
+
};
|
|
60
|
+
readonly workRefType: {
|
|
61
|
+
readonly visibility: "hidden";
|
|
62
|
+
};
|
|
63
|
+
readonly participantKind: {
|
|
64
|
+
readonly default: "human";
|
|
65
|
+
readonly visibility: "hidden";
|
|
66
|
+
};
|
|
67
|
+
readonly agentRef: {
|
|
68
|
+
readonly visibility: "hidden";
|
|
69
|
+
};
|
|
70
|
+
readonly source: {
|
|
71
|
+
readonly default: "manual";
|
|
72
|
+
readonly visibility: "hidden";
|
|
73
|
+
};
|
|
74
|
+
readonly evidence: {
|
|
75
|
+
readonly visibility: "hidden";
|
|
76
|
+
};
|
|
77
|
+
readonly status: {
|
|
78
|
+
readonly visibility: "hidden";
|
|
79
|
+
readonly locked: true;
|
|
80
|
+
};
|
|
81
|
+
readonly submittedAt: {
|
|
82
|
+
readonly visibility: "hidden";
|
|
83
|
+
readonly locked: true;
|
|
84
|
+
};
|
|
85
|
+
readonly submittedByProfileId: {
|
|
86
|
+
readonly visibility: "hidden";
|
|
87
|
+
readonly locked: true;
|
|
88
|
+
};
|
|
89
|
+
readonly approvedAt: {
|
|
90
|
+
readonly visibility: "hidden";
|
|
91
|
+
readonly locked: true;
|
|
92
|
+
};
|
|
93
|
+
readonly approvedByProfileId: {
|
|
94
|
+
readonly visibility: "hidden";
|
|
95
|
+
readonly locked: true;
|
|
96
|
+
};
|
|
97
|
+
readonly approvalPath: {
|
|
98
|
+
readonly visibility: "hidden";
|
|
99
|
+
readonly locked: true;
|
|
100
|
+
};
|
|
101
|
+
readonly rejectedAt: {
|
|
102
|
+
readonly visibility: "hidden";
|
|
103
|
+
readonly locked: true;
|
|
104
|
+
};
|
|
105
|
+
readonly rejectedByProfileId: {
|
|
106
|
+
readonly visibility: "hidden";
|
|
107
|
+
readonly locked: true;
|
|
108
|
+
};
|
|
109
|
+
readonly rejectionReason: {
|
|
110
|
+
readonly visibility: "hidden";
|
|
111
|
+
readonly locked: true;
|
|
112
|
+
};
|
|
113
|
+
readonly correctionOfId: {
|
|
114
|
+
readonly visibility: "hidden";
|
|
115
|
+
readonly locked: true;
|
|
116
|
+
};
|
|
117
|
+
readonly metadata: {
|
|
118
|
+
readonly visibility: "hidden";
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=recipes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,sEAAsE;AACtE,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,MAAM,CAAC,EAAE,SAA6B;IACtC,MAAM,CAAC,IAAI,SAA8B;IACzC,MAAM,CAAC,KAAK,SAAkB;IAC9B,MAAM,CAAC,OAAO,SAAuD;IACrE,MAAM,CAAC,QAAQ,WAMb;IACF,MAAM,CAAC,OAAO;;;;;MAKZ;IACF,MAAM,CAAC,MAAM,8BAAsB;IACnC,MAAM,CAAC,GAAG;;;;;QAQR;IACF,MAAM,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA0CH;CACZ"}
|
package/dist/rollup.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as confirmedTimecardGuard, c as TimecardAdjustment, d as TimecardReopeningCollection, l as TimecardAdjustmentCollection, o as PeriodTimecard, s as PeriodTimecardCollection, t as PeriodRollupService, u as TimecardReopening } from "./chunks/rollup-
|
|
1
|
+
import { a as confirmedTimecardGuard, c as TimecardAdjustment, d as TimecardReopeningCollection, l as TimecardAdjustmentCollection, o as PeriodTimecard, s as PeriodTimecardCollection, t as PeriodRollupService, u as TimecardReopening } from "./chunks/rollup-C8p1PAXX.js";
|
|
2
2
|
export { PeriodRollupService, PeriodTimecard, PeriodTimecardCollection, TimecardAdjustment, TimecardAdjustmentCollection, TimecardReopening, TimecardReopeningCollection, confirmedTimecardGuard };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The acting principal for the generated service-backed time entry actions
|
|
3
|
+
* (#4001).
|
|
4
|
+
*
|
|
5
|
+
* Identity always comes from the ambient request context, never from the
|
|
6
|
+
* request body: the tenancy ALS (`withTenant`, the SvelteKit/Express
|
|
7
|
+
* adapters) first, then the authenticated smrt-users session-permission ALS
|
|
8
|
+
* (`createSessionHandler()` without `enterTenantContext`). This is the
|
|
9
|
+
* smrt-fields / smrt-preferences precedent. Authorization goes through
|
|
10
|
+
* smrt-users' `assertOperationPermission()` against the principal's published
|
|
11
|
+
* permission snapshot, so ceilings, super-admin and catalog presence behave
|
|
12
|
+
* exactly as they do for every other guarded operation.
|
|
13
|
+
*/
|
|
14
|
+
import type { SmrtClassOptions } from '@happyvertical/smrt-core';
|
|
15
|
+
import { type OperationPermissionCollectionInput } from '@happyvertical/smrt-users';
|
|
16
|
+
/** A refused action with a 4xx status the generated transports serialize. */
|
|
17
|
+
export declare class TimesheetActionError extends Error {
|
|
18
|
+
readonly status: number;
|
|
19
|
+
readonly code: string;
|
|
20
|
+
readonly publicMessage: string;
|
|
21
|
+
constructor(status: number, code: string, message: string);
|
|
22
|
+
}
|
|
23
|
+
/** Who is acting, resolved from the ambient context. */
|
|
24
|
+
export interface TimesheetActionPrincipal {
|
|
25
|
+
tenantId: string;
|
|
26
|
+
userId: string;
|
|
27
|
+
permissions: ReadonlySet<string>;
|
|
28
|
+
/** smrt-profiles Profile linked to the user; stamped into audit fields. */
|
|
29
|
+
profileId: string;
|
|
30
|
+
/** True when the tenancy ALS already carries this principal. */
|
|
31
|
+
fromTenancy: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** True when the ambient principal holds `<collection>.<action>`. */
|
|
34
|
+
export declare function principalHolds(collection: OperationPermissionCollectionInput, action: string, options: SmrtClassOptions): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Authorize `<collection>.<action>` for the ambient principal and resolve the
|
|
37
|
+
* profile it acts as. Fails closed (403) without an authenticated,
|
|
38
|
+
* tenant-bound principal, without the permission, or without a linked
|
|
39
|
+
* profile — an action always records who took it.
|
|
40
|
+
*
|
|
41
|
+
* System context never bypasses: trusted server code without a person calls
|
|
42
|
+
* `ServiceEvidenceService` directly. `allowSuperAdminBypass: false` is for
|
|
43
|
+
* money and separation-of-duties operations that need an explicit grant.
|
|
44
|
+
*/
|
|
45
|
+
export declare function authorizeTimesheetAction(collection: OperationPermissionCollectionInput, action: string, options: SmrtClassOptions, guard: {
|
|
46
|
+
allowSuperAdminBypass: boolean;
|
|
47
|
+
}): Promise<TimesheetActionPrincipal>;
|
|
48
|
+
/**
|
|
49
|
+
* Run `fn` with the tenancy ALS carrying `principal`, so the tenancy
|
|
50
|
+
* interceptor scopes every read and write. A session-only principal is
|
|
51
|
+
* entered with the same tenant, user and permissions; nothing is widened.
|
|
52
|
+
*/
|
|
53
|
+
export declare function withActionPrincipal<T>(principal: TimesheetActionPrincipal, fn: () => Promise<T>): Promise<T>;
|
|
54
|
+
//# sourceMappingURL=action-principal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-principal.d.ts","sourceRoot":"","sources":["../../src/services/action-principal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAGL,KAAK,kCAAkC,EAGxC,MAAM,2BAA2B,CAAC;AAEnC,6EAA6E;AAC7E,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEnB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAO1D;AAED,wDAAwD;AACxD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAC;CACtB;AAyDD,qEAAqE;AACrE,wBAAsB,cAAc,CAClC,UAAU,EAAE,kCAAkC,EAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,kCAAkC,EAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE;IAAE,qBAAqB,EAAE,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,wBAAwB,CAAC,CA0CnC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,SAAS,EAAE,wBAAwB,EACnC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAUZ"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
export { TimesheetActionError, type TimesheetActionPrincipal, } from './action-principal.js';
|
|
1
2
|
export * from './dated-labour-commercial-resolver.js';
|
|
2
3
|
export * from './dated-percentage-labour-commercial-resolver.js';
|
|
3
4
|
export * from './labour-valuation-reconciliation.js';
|
|
4
5
|
export * from './service-evidence-service.js';
|
|
6
|
+
export * from './time-entry-actions.js';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,wBAAwB,GAC9B,MAAM,uBAAuB,CAAC;AAC/B,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-backed write actions for `ServiceTimeEntry` (#4001).
|
|
3
|
+
*
|
|
4
|
+
* The generated CRUD writes stay closed: these are the only generated write
|
|
5
|
+
* path, and each delegates to {@link ServiceEvidenceService}, so the status
|
|
6
|
+
* machine, the submission/approval trail and the charge/compensation
|
|
7
|
+
* snapshots are set in exactly one place. The thin collection methods in
|
|
8
|
+
* `models/service-time-entry.ts` call in here.
|
|
9
|
+
*/
|
|
10
|
+
import type { SmrtClassOptions } from '@happyvertical/smrt-core';
|
|
11
|
+
import type { ServiceTimeEntry, ServiceTimeEntryCollection } from '../models/service-time-entry.js';
|
|
12
|
+
import type { ServiceEvidence } from '../types.js';
|
|
13
|
+
import { type ServiceCommercialResolver } from './service-evidence-service.js';
|
|
14
|
+
/** Approval path stamped by the generated `approve` action. */
|
|
15
|
+
export declare const SERVICE_TIME_ENTRY_ACTION_APPROVAL_PATH = "operator";
|
|
16
|
+
/**
|
|
17
|
+
* What `approve` prices with: a resolver, or a factory the action calls per
|
|
18
|
+
* request with the collection's options. Use the factory whenever the
|
|
19
|
+
* resolver writes (e.g. smrt-projects' `SubscriptionServiceCommercialResolver`
|
|
20
|
+
* records client charges): `options.db` is the request-bound executor, so
|
|
21
|
+
* those writes share the request's transaction and PostgreSQL RLS state
|
|
22
|
+
* instead of a connection captured at startup.
|
|
23
|
+
*/
|
|
24
|
+
export type ServiceTimeEntryCommercialResolverSource = ServiceCommercialResolver | ((context: {
|
|
25
|
+
options: SmrtClassOptions;
|
|
26
|
+
}) => ServiceCommercialResolver | Promise<ServiceCommercialResolver>);
|
|
27
|
+
/**
|
|
28
|
+
* Install what the generated `approve` action prices with. Pass `null` to
|
|
29
|
+
* remove it. Without one, `approve` refuses with 409
|
|
30
|
+
* (`approval_not_configured`) and writes nothing.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* setServiceTimeEntryCommercialResolver(({ options }) =>
|
|
35
|
+
* SubscriptionServiceCommercialResolver.create(options, provider),
|
|
36
|
+
* );
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function setServiceTimeEntryCommercialResolver(resolver: ServiceTimeEntryCommercialResolverSource | null): void;
|
|
40
|
+
/** The source installed by {@link setServiceTimeEntryCommercialResolver}. */
|
|
41
|
+
export declare function getServiceTimeEntryCommercialResolver(): ServiceTimeEntryCommercialResolverSource | null;
|
|
42
|
+
/** Body of the `record` action. Identity and tenant come from the session. */
|
|
43
|
+
export interface RecordServiceTimeActionInput {
|
|
44
|
+
workRefType: string;
|
|
45
|
+
workRefId: string;
|
|
46
|
+
/** Defaults to the acting user's profile; another person needs `approve`. */
|
|
47
|
+
participantProfileId?: string | null;
|
|
48
|
+
/** `manual` (default) or `timer`; imports and agents use the service. */
|
|
49
|
+
source?: 'manual' | 'timer';
|
|
50
|
+
description?: string;
|
|
51
|
+
/** ISO 8601 instant. */
|
|
52
|
+
startedAt?: string | null;
|
|
53
|
+
/** ISO 8601 instant. */
|
|
54
|
+
endedAt?: string | null;
|
|
55
|
+
durationSeconds?: number | null;
|
|
56
|
+
/** Exact positive decimal text; exclusive with seconds and timestamps. */
|
|
57
|
+
durationHours?: string;
|
|
58
|
+
evidence?: ServiceEvidence[];
|
|
59
|
+
metadata?: Record<string, unknown>;
|
|
60
|
+
}
|
|
61
|
+
/** Body of the `submit` and `approve` actions. */
|
|
62
|
+
export interface ServiceTimeEntryActionTarget {
|
|
63
|
+
entryId: string;
|
|
64
|
+
}
|
|
65
|
+
/** `record`: create a draft entry through `ServiceEvidenceService.record()`. */
|
|
66
|
+
export declare function recordServiceTimeAction(entries: ServiceTimeEntryCollection, input: unknown): Promise<ServiceTimeEntry>;
|
|
67
|
+
/**
|
|
68
|
+
* `submit`: `draft | rejected → submitted` through
|
|
69
|
+
* `ServiceEvidenceService.submit()`, stamping `submittedAt` and the acting
|
|
70
|
+
* profile. Only the entry's participant may submit it, unless the caller
|
|
71
|
+
* holds `approve` (a supervisor submitting on someone's behalf).
|
|
72
|
+
*/
|
|
73
|
+
export declare function submitServiceTimeAction(entries: ServiceTimeEntryCollection, input: unknown): Promise<ServiceTimeEntry>;
|
|
74
|
+
/**
|
|
75
|
+
* `approve`: `submitted → approved` through `ServiceEvidenceService.approve()`,
|
|
76
|
+
* which stamps `approvedAt`, the acting profile and the approval path, then
|
|
77
|
+
* writes the immutable charge and compensation snapshots through the
|
|
78
|
+
* installed {@link setServiceTimeEntryCommercialResolver resolver} (a factory
|
|
79
|
+
* is called per request with the collection's options). Money:
|
|
80
|
+
* super-admin bypass does not apply, the grant must be explicit.
|
|
81
|
+
*/
|
|
82
|
+
export declare function approveServiceTimeAction(entries: ServiceTimeEntryCollection, input: unknown): Promise<ServiceTimeEntry>;
|
|
83
|
+
//# sourceMappingURL=time-entry-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-entry-actions.d.ts","sourceRoot":"","sources":["../../src/services/time-entry-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAKjE,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQnD,OAAO,EACL,KAAK,yBAAyB,EAE/B,MAAM,+BAA+B,CAAC;AAEvC,+DAA+D;AAC/D,eAAO,MAAM,uCAAuC,aAAa,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,MAAM,wCAAwC,GAChD,yBAAyB,GACzB,CAAC,CAAC,OAAO,EAAE;IACT,OAAO,EAAE,gBAAgB,CAAC;CAC3B,KAAK,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;AAK1E;;;;;;;;;;;GAWG;AACH,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,wCAAwC,GAAG,IAAI,GACxD,IAAI,CAEN;AAED,6EAA6E;AAC7E,wBAAgB,qCAAqC,IAAI,wCAAwC,GAAG,IAAI,CAEvG;AAED,8EAA8E;AAC9E,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,yEAAyE;IACzE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,kDAAkD;AAClD,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAgHD,gFAAgF;AAChF,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,gBAAgB,CAAC,CAqF3B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,gBAAgB,CAAC,CAuB3B;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,gBAAgB,CAAC,CAkC3B"}
|