@happyvertical/smrt-timesheets 0.55.24 → 0.56.1
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 +60 -0
- package/README.md +190 -12
- package/agents/period-rollup.md +20 -0
- package/dist/attendance/context.d.ts +80 -0
- package/dist/attendance/context.d.ts.map +1 -0
- package/dist/attendance/correction-models.d.ts +39 -0
- package/dist/attendance/correction-models.d.ts.map +1 -0
- package/dist/attendance/correction-service.d.ts +118 -0
- package/dist/attendance/correction-service.d.ts.map +1 -0
- package/dist/attendance/models.d.ts +57 -0
- package/dist/attendance/models.d.ts.map +1 -1
- package/dist/attendance/segments.d.ts +20 -0
- package/dist/attendance/segments.d.ts.map +1 -0
- package/dist/attendance/service.d.ts +106 -22
- package/dist/attendance/service.d.ts.map +1 -1
- package/dist/attendance/write.d.ts +12 -0
- package/dist/attendance/write.d.ts.map +1 -0
- package/dist/attendance.d.ts +2 -0
- package/dist/attendance.d.ts.map +1 -1
- package/dist/attendance.js +3 -323
- package/dist/chunks/{attendance-Cpo4mIID.js → attendance-Cw75uJnT.js} +3 -3
- package/dist/chunks/{attendance-Cpo4mIID.js.map → attendance-Cw75uJnT.js.map} +1 -1
- package/dist/chunks/attendance-DJNytMTN.js +1246 -0
- package/dist/chunks/attendance-DJNytMTN.js.map +1 -0
- package/dist/chunks/models-tUePZ5x7.js +372 -0
- package/dist/chunks/models-tUePZ5x7.js.map +1 -0
- package/dist/chunks/{rollup-Du6uaqyM.js → rollup-CzCb-DxI.js} +211 -6
- package/dist/chunks/rollup-CzCb-DxI.js.map +1 -0
- package/dist/chunks/service-time-entry-BJVSGx33.js +286 -0
- package/dist/chunks/service-time-entry-BJVSGx33.js.map +1 -0
- package/dist/chunks/time-entry-actions-ChT1lcOp.js +576 -0
- package/dist/chunks/time-entry-actions-ChT1lcOp.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 +2020 -168
- 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/correction-guard.d.ts +12 -0
- package/dist/rollup/correction-guard.d.ts.map +1 -0
- package/dist/rollup/models.d.ts +31 -1
- package/dist/rollup/models.d.ts.map +1 -1
- package/dist/rollup/service.d.ts +25 -7
- package/dist/rollup/service.d.ts.map +1 -1
- package/dist/rollup/types.d.ts +18 -0
- package/dist/rollup/types.d.ts.map +1 -1
- package/dist/rollup/write.d.ts +2 -0
- package/dist/rollup/write.d.ts.map +1 -1
- package/dist/rollup.d.ts +3 -2
- package/dist/rollup.d.ts.map +1 -1
- package/dist/rollup.js +2 -2
- 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 +902 -40
- package/package.json +8 -7
- package/dist/attendance.js.map +0 -1
- package/dist/chunks/models-_ZbpXWnb.js +0 -176
- package/dist/chunks/models-_ZbpXWnb.js.map +0 -1
- package/dist/chunks/rollup-Du6uaqyM.js.map +0 -1
- package/dist/chunks/service-time-entry-BGj39_EC.js +0 -227
- package/dist/chunks/service-time-entry-BGj39_EC.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-snapshots.d.ts","sourceRoot":"","sources":["../../src/models/service-snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,EACd,UAAU,EAGX,MAAM,0BAA0B,CAAC;AAGlC;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAa7E;AAoDD;;;GAGG;AACH,qBAYa,qBAAsB,SAAQ,UAAU;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IACT,WAAW,EAAE,MAAM,CAAM;IAC7E;;;;;;;;OAQG;IACH,MAAM,EAAE,MAAM,CAAK;IACM,QAAQ,EAAE,MAAM,CAAS;IACzB,cAAc,EAAE,MAAM,CAAM;IAC5B,QAAQ,EAAE,MAAM,CAAM;IACtB,YAAY,EAAE,MAAM,CAAQ;IAC5B,eAAe,EAAE,MAAM,CAAM;IACtD,SAAS,EAAE,IAAI,CAAc;IAEd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBrC;AAED;;;GAGG;AACH,qBAYa,2BAA4B,SAAQ,UAAU;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IACT,WAAW,EAAE,MAAM,CAAM;IAC7E;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAK;IACM,QAAQ,EAAE,MAAM,CAAS;IACzB,YAAY,EAAE,MAAM,CAAM;IAC1B,YAAY,EAAE,MAAM,CAAQ;IACrD,SAAS,EAAE,IAAI,CAAc;IAEd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBrC;AAED,kDAAkD;
|
|
1
|
+
{"version":3,"file":"service-snapshots.d.ts","sourceRoot":"","sources":["../../src/models/service-snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,EACd,UAAU,EAGX,MAAM,0BAA0B,CAAC;AAGlC;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAa7E;AAoDD;;;GAGG;AACH,qBAYa,qBAAsB,SAAQ,UAAU;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IACT,WAAW,EAAE,MAAM,CAAM;IAC7E;;;;;;;;OAQG;IACH,MAAM,EAAE,MAAM,CAAK;IACM,QAAQ,EAAE,MAAM,CAAS;IACzB,cAAc,EAAE,MAAM,CAAM;IAC5B,QAAQ,EAAE,MAAM,CAAM;IACtB,YAAY,EAAE,MAAM,CAAQ;IAC5B,eAAe,EAAE,MAAM,CAAM;IACtD,SAAS,EAAE,IAAI,CAAc;IAEd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBrC;AAED;;;GAGG;AACH,qBAYa,2BAA4B,SAAQ,UAAU;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IACT,WAAW,EAAE,MAAM,CAAM;IAC7E;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAK;IACM,QAAQ,EAAE,MAAM,CAAS;IACzB,YAAY,EAAE,MAAM,CAAM;IAC1B,YAAY,EAAE,MAAM,CAAQ;IACrD,SAAS,EAAE,IAAI,CAAc;IAEd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBrC;AAED,kDAAkD;AAIlD,qBACa,+BAAgC,SAAQ,cAAc,CAAC,qBAAqB,CAAC;IACxF,MAAM,CAAC,QAAQ,CAAC,UAAU,+BAAyB;CACpD;AACD,wDAAwD;AAIxD,qBACa,qCAAsC,SAAQ,cAAc,CAAC,2BAA2B,CAAC;IACpG,MAAM,CAAC,QAAQ,CAAC,UAAU,qCAA+B;CAC1D"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SmrtCollection, SmrtObject } from '@happyvertical/smrt-core';
|
|
2
|
+
import type { RecordServiceTimeActionInput, ServiceTimeEntryActionTarget } from '../services/time-entry-actions.js';
|
|
2
3
|
import { type ServiceEvidence, type ServiceParticipantKind, type ServiceTimeEntrySource, type ServiceTimeEntryStatus } from '../types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Fields that may not change once an entry is approved (or corrected). A
|
|
@@ -6,6 +7,13 @@ import { type ServiceEvidence, type ServiceParticipantKind, type ServiceTimeEntr
|
|
|
6
7
|
* {@link ServiceTimeEntry.frozenFieldNames}.
|
|
7
8
|
*/
|
|
8
9
|
export declare const SERVICE_TIME_ENTRY_FROZEN_FIELDS: readonly ["tenantId", "workRefType", "workRefId", "participantKind", "participantProfileId", "agentRef", "source", "description", "startedAt", "endedAt", "durationSeconds", "evidence", "correctionOfId"];
|
|
10
|
+
/**
|
|
11
|
+
* The service-backed write actions (#4001). Each is a `POST
|
|
12
|
+
* /<collection>/<action>` route guarded by the `<collection>.<action>`
|
|
13
|
+
* permission inside the action itself, so every transport that reaches it
|
|
14
|
+
* enforces the same rule.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SERVICE_TIME_ENTRY_ACTIONS: readonly ["record", "submit", "approve"];
|
|
9
17
|
/**
|
|
10
18
|
* A person or agent worked this long on this thing, and someone approved it.
|
|
11
19
|
*
|
|
@@ -63,9 +71,36 @@ export declare class ServiceTimeEntry extends SmrtObject {
|
|
|
63
71
|
save(): Promise<this>;
|
|
64
72
|
private readPrior;
|
|
65
73
|
}
|
|
66
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Collection over `service_time_entries`.
|
|
76
|
+
*
|
|
77
|
+
* Collection classes are registered too, so this one carries its own surface:
|
|
78
|
+
* undecorated, it published generated `create`/`update`/`delete` MCP tools and
|
|
79
|
+
* CLI commands that wrote status and the approval trail directly. It keeps the
|
|
80
|
+
* reads it published and hosts the service-backed actions on REST only.
|
|
81
|
+
*/
|
|
67
82
|
export declare class ServiceTimeEntryCollection extends SmrtCollection<ServiceTimeEntry> {
|
|
68
83
|
static readonly _itemClass: typeof ServiceTimeEntry;
|
|
84
|
+
/**
|
|
85
|
+
* Record a draft time entry for the signed-in person through
|
|
86
|
+
* `ServiceEvidenceService.record()`. Needs `<collection>.record`; recording
|
|
87
|
+
* for another participant also needs `<collection>.approve`. The tenant and
|
|
88
|
+
* actor come from the session, never from the body.
|
|
89
|
+
*/
|
|
90
|
+
record(options: RecordServiceTimeActionInput): Promise<ServiceTimeEntry>;
|
|
91
|
+
/**
|
|
92
|
+
* Submit a draft or rejected entry for approval through
|
|
93
|
+
* `ServiceEvidenceService.submit()`. Needs `<collection>.submit`; only the
|
|
94
|
+
* entry's participant may submit it unless the caller can also approve.
|
|
95
|
+
*/
|
|
96
|
+
submit(options: ServiceTimeEntryActionTarget): Promise<ServiceTimeEntry>;
|
|
97
|
+
/**
|
|
98
|
+
* Approve a submitted entry through `ServiceEvidenceService.approve()`,
|
|
99
|
+
* writing its charge and compensation snapshots with the host's installed
|
|
100
|
+
* `ServiceCommercialResolver`. Needs an explicit `<collection>.approve`
|
|
101
|
+
* grant (no super-admin bypass). Retrying an incomplete approval is safe.
|
|
102
|
+
*/
|
|
103
|
+
approve(options: ServiceTimeEntryActionTarget): Promise<ServiceTimeEntry>;
|
|
69
104
|
forWork(workRefType: string, workRefId: string): Promise<ServiceTimeEntry[]>;
|
|
70
105
|
pendingApproval(): Promise<ServiceTimeEntry[]>;
|
|
71
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-time-entry.d.ts","sourceRoot":"","sources":["../../src/models/service-time-entry.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"service-time-entry.d.ts","sourceRoot":"","sources":["../../src/models/service-time-entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AttendanceCorrectionGuard } from '../attendance/correction-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* An `AttendanceCorrectionService` guard that refuses to change attendance
|
|
4
|
+
* inside a period a `PeriodTimecard` has confirmed. A confirmed card never
|
|
5
|
+
* changes, so correcting its sources would leave card and attendance
|
|
6
|
+
* disagreeing; reopen the card first (`PeriodRollupService.reopen`), correct,
|
|
7
|
+
* then roll up again. A submitted card is frozen too. A reopened card is `open`
|
|
8
|
+
* again, so corrections inside it are allowed.
|
|
9
|
+
* Needs the `period_timecards` table, which is why it is opt-in.
|
|
10
|
+
*/
|
|
11
|
+
export declare const confirmedTimecardGuard: AttendanceCorrectionGuard;
|
|
12
|
+
//# sourceMappingURL=correction-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-guard.d.ts","sourceRoot":"","sources":["../../src/rollup/correction-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAGrF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,EAAE,yBAuBpC,CAAC"}
|
package/dist/rollup/models.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { SmrtCollection, SmrtObject } from '@happyvertical/smrt-core';
|
|
2
2
|
import type { TimecardSource } from './types.js';
|
|
3
|
+
/** `open` is the draft state; `submitted` is optional (see `PeriodRollupService`). */
|
|
4
|
+
export type TimecardStatus = 'open' | 'submitted' | 'confirmed';
|
|
3
5
|
/** One person's immutable-on-confirmation period snapshot, in integer seconds. */
|
|
4
6
|
export declare class PeriodTimecard extends SmrtObject {
|
|
5
7
|
tenantId: string;
|
|
@@ -13,7 +15,10 @@ export declare class PeriodTimecard extends SmrtObject {
|
|
|
13
15
|
regularSeconds: number;
|
|
14
16
|
overtimeSeconds: number;
|
|
15
17
|
totalSeconds: number;
|
|
16
|
-
status:
|
|
18
|
+
status: TimecardStatus;
|
|
19
|
+
/** Set by `submit()`; cleared when the card is reopened. */
|
|
20
|
+
submittedAt: Date | null;
|
|
21
|
+
submittedByProfileId: string | null;
|
|
17
22
|
confirmedAt: Date | null;
|
|
18
23
|
confirmedByProfileId: string | null;
|
|
19
24
|
/** Return a detached source snapshot; corrupt persisted JSON fails closed. */
|
|
@@ -36,6 +41,27 @@ export declare class TimecardAdjustment extends SmrtObject {
|
|
|
36
41
|
save(): Promise<this>;
|
|
37
42
|
delete(): Promise<void>;
|
|
38
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Append-only audit row for one reopening of a submitted or confirmed card: who
|
|
46
|
+
* reopened whose period, why, and the totals it had at that moment (base,
|
|
47
|
+
* adjustments and effective, in integer seconds). Written only by
|
|
48
|
+
* `PeriodRollupService.reopen()` in the same transaction as the status change.
|
|
49
|
+
*/
|
|
50
|
+
export declare class TimecardReopening extends SmrtObject {
|
|
51
|
+
tenantId: string;
|
|
52
|
+
timecardId: string;
|
|
53
|
+
profileId: string;
|
|
54
|
+
actorProfileId: string;
|
|
55
|
+
operationId: string;
|
|
56
|
+
fromStatus: TimecardStatus;
|
|
57
|
+
reason: string;
|
|
58
|
+
/** JSON: base/adjustment/effective seconds, confirmation and submission attribution. */
|
|
59
|
+
previousState: string;
|
|
60
|
+
/** The totals and attribution the card had when it was reopened. */
|
|
61
|
+
getPrevious<T = Record<string, unknown>>(): T;
|
|
62
|
+
save(): Promise<this>;
|
|
63
|
+
delete(): Promise<void>;
|
|
64
|
+
}
|
|
39
65
|
/** Scoped persistence collection; mutations must use PeriodRollupService. */
|
|
40
66
|
export declare class PeriodTimecardCollection extends SmrtCollection<PeriodTimecard> {
|
|
41
67
|
static readonly _itemClass: typeof PeriodTimecard;
|
|
@@ -44,4 +70,8 @@ export declare class PeriodTimecardCollection extends SmrtCollection<PeriodTimec
|
|
|
44
70
|
export declare class TimecardAdjustmentCollection extends SmrtCollection<TimecardAdjustment> {
|
|
45
71
|
static readonly _itemClass: typeof TimecardAdjustment;
|
|
46
72
|
}
|
|
73
|
+
/** Scoped append-only reopening ledger. */
|
|
74
|
+
export declare class TimecardReopeningCollection extends SmrtCollection<TimecardReopening> {
|
|
75
|
+
static readonly _itemClass: typeof TimecardReopening;
|
|
76
|
+
}
|
|
47
77
|
//# sourceMappingURL=models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/rollup/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EACd,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,kFAAkF;AAClF,qBAQa,cAAe,SAAQ,UAAU;IAChC,QAAQ,SAAM;IAI1B,SAAS,SAAM;IACf,QAAQ,EAAE,IAAI,CAAe;IAC7B,MAAM,EAAE,IAAI,CAAe;IAC3B,QAAQ,SAAM;IACd,YAAY,SAAM;IACO,aAAa,SAAQ;IACrB,cAAc,SAAQ;IAC/C,cAAc,SAAK;IACnB,eAAe,SAAK;IACpB,YAAY,SAAK;IACQ,MAAM,EAAE,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/rollup/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EACd,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,sFAAsF;AACtF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;AAEhE,kFAAkF;AAClF,qBAQa,cAAe,SAAQ,UAAU;IAChC,QAAQ,SAAM;IAI1B,SAAS,SAAM;IACf,QAAQ,EAAE,IAAI,CAAe;IAC7B,MAAM,EAAE,IAAI,CAAe;IAC3B,QAAQ,SAAM;IACd,YAAY,SAAM;IACO,aAAa,SAAQ;IACrB,cAAc,SAAQ;IAC/C,cAAc,SAAK;IACnB,eAAe,SAAK;IACpB,YAAY,SAAK;IACQ,MAAM,EAAE,cAAc,CAAU;IACzD,4DAA4D;IAC5D,WAAW,EAAE,IAAI,GAAG,IAAI,CAAQ;IAKhC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3C,WAAW,EAAE,IAAI,GAAG,IAAI,CAAQ;IAKhC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C,8EAA8E;IAC9E,UAAU,IAAI,cAAc,EAAE;IAM9B,0DAA0D;IAC1D,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAMpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC;AAED,oFAAoF;AACpF,qBAQa,kBAAmB,SAAQ,UAAU;IACpC,QAAQ,SAAM;IAC4B,UAAU,SAAM;IAItE,SAAS,SAAM;IAIf,cAAc,SAAM;IACpB,WAAW,SAAM;IACjB,cAAc,SAAK;IACnB,eAAe,SAAK;IACpB,MAAM,SAAM;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC;AACD;;;;;GAKG;AACH,qBAca,iBAAkB,SAAQ,UAAU;IACnC,QAAQ,SAAM;IAC4B,UAAU,SAAM;IAItE,SAAS,SAAM;IAIf,cAAc,SAAM;IACpB,WAAW,SAAM;IACQ,UAAU,EAAE,cAAc,CAAe;IACzC,MAAM,SAAM;IACrC,wFAAwF;IAC/D,aAAa,SAAQ;IAC9C,oEAAoE;IACpE,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;IAM9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC;AACD,6EAA6E;AAC7E,qBAAa,wBAAyB,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC1E,MAAM,CAAC,QAAQ,CAAC,UAAU,wBAAkB;CAC7C;AACD,gDAAgD;AAChD,qBAAa,4BAA6B,SAAQ,cAAc,CAAC,kBAAkB,CAAC;IAClF,MAAM,CAAC,QAAQ,CAAC,UAAU,4BAAsB;CACjD;AACD,2CAA2C;AAC3C,qBAAa,2BAA4B,SAAQ,cAAc,CAAC,iBAAiB,CAAC;IAChF,MAAM,CAAC,QAAQ,CAAC,UAAU,2BAAqB;CAChD"}
|
package/dist/rollup/service.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
-
import { PeriodTimecard, TimecardAdjustment } from './models.js';
|
|
3
|
-
import type { PeriodRulesResolver, TimecardActor, TimecardAdjustmentInput } from './types.js';
|
|
2
|
+
import { PeriodTimecard, TimecardAdjustment, TimecardReopening } from './models.js';
|
|
3
|
+
import type { PeriodRollupOptions, PeriodRulesResolver, TimecardActor, TimecardAdjustmentInput, TimecardReopenInput } from './types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Server-side, trusted tenant/person capability. Consumers authorize this scope
|
|
6
6
|
* before construction. Reads and writes reject conflicting ambient tenancy.
|
|
@@ -11,10 +11,7 @@ export declare class PeriodRollupService {
|
|
|
11
11
|
private readonly actor;
|
|
12
12
|
private readonly resolver;
|
|
13
13
|
private readonly options;
|
|
14
|
-
constructor(db: DatabaseInterface, actor: TimecardActor, resolver: PeriodRulesResolver, options?:
|
|
15
|
-
attendance?: boolean;
|
|
16
|
-
actorProfileId?: string;
|
|
17
|
-
});
|
|
14
|
+
constructor(db: DatabaseInterface, actor: TimecardActor, resolver: PeriodRulesResolver, options?: PeriodRollupOptions);
|
|
18
15
|
private identity;
|
|
19
16
|
private scope;
|
|
20
17
|
private transact;
|
|
@@ -23,8 +20,29 @@ export declare class PeriodRollupService {
|
|
|
23
20
|
get(id: string): Promise<PeriodTimecard>;
|
|
24
21
|
/** Rebuild one open card from a consistent transaction-bound source snapshot. */
|
|
25
22
|
rollup(at: Date): Promise<PeriodTimecard>;
|
|
26
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Optional step: freeze an open card for review (open -> submitted). The
|
|
25
|
+
* actor is the submitter; repeating it on a submitted card is idempotent.
|
|
26
|
+
*/
|
|
27
|
+
submit(id: string): Promise<PeriodTimecard>;
|
|
28
|
+
/**
|
|
29
|
+
* Confirm the current snapshot; repeated confirmation is idempotent. With
|
|
30
|
+
* `requireSubmission` the card must be submitted first.
|
|
31
|
+
*/
|
|
27
32
|
confirm(id: string): Promise<PeriodTimecard>;
|
|
33
|
+
/**
|
|
34
|
+
* Return a submitted or confirmed card to `open` so its sources can be
|
|
35
|
+
* corrected and `rollup()` run again, then confirmed anew. Needs a reason and
|
|
36
|
+
* an operation key; appends a `TimecardReopening` with the totals the card had
|
|
37
|
+
* (base, adjustments, effective). Adjustments stay on the ledger and keep
|
|
38
|
+
* counting in `totals()`: after a re-roll, offset them with a new adjustment
|
|
39
|
+
* if the correction made them redundant. The consumer authorizes the actor
|
|
40
|
+
* (give reopening its own permission); a retry with the same key and reason
|
|
41
|
+
* is a no-op.
|
|
42
|
+
*/
|
|
43
|
+
reopen(id: string, input: TimecardReopenInput): Promise<PeriodTimecard>;
|
|
44
|
+
/** The append-only reopening history of one card, oldest first. */
|
|
45
|
+
reopenings(id: string): Promise<TimecardReopening[]>;
|
|
28
46
|
/** Append a correction. An operation key retry must have exactly the same payload. */
|
|
29
47
|
adjust(id: string, input: TimecardAdjustmentInput): Promise<TimecardAdjustment>;
|
|
30
48
|
/** Effective totals combine the frozen base with append-only corrections. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/rollup/service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EACL,cAAc,EAEd,kBAAkB,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/rollup/service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EACL,cAAc,EAEd,kBAAkB,EAElB,iBAAiB,EAElB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAuBpB;;;;GAIG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,EAAE,EAAE,iBAAiB,EACrB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,GAAE,mBAAwB;IAmBpD,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,QAAQ;YA8BF,IAAI;IAYlB,gFAAgF;IAC1E,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAG9C,iFAAiF;IAC3E,MAAM,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAgJ/C;;;OAGG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAcjD;;;OAGG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAalD;;;;;;;;;OASG;IACG,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,cAAc,CAAC;IA0F1B,mEAAmE;IAC7D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAU1D,sFAAsF;IAChF,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IA8E9B,6EAA6E;IACvE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CAwBH"}
|
package/dist/rollup/types.d.ts
CHANGED
|
@@ -35,4 +35,22 @@ export interface TimecardAdjustmentInput {
|
|
|
35
35
|
overtimeSeconds: number;
|
|
36
36
|
reason: string;
|
|
37
37
|
}
|
|
38
|
+
/** Reopen a submitted or confirmed card. The actor is authorized by the consumer. */
|
|
39
|
+
export interface TimecardReopenInput {
|
|
40
|
+
/** Idempotency key; a retry must carry exactly the same reason. */
|
|
41
|
+
operationId: string;
|
|
42
|
+
/** Required, non-blank; stored on the ledger row. */
|
|
43
|
+
reason: string;
|
|
44
|
+
}
|
|
45
|
+
/** Service options for the card lifecycle. */
|
|
46
|
+
export interface PeriodRollupOptions {
|
|
47
|
+
attendance?: boolean;
|
|
48
|
+
actorProfileId?: string;
|
|
49
|
+
/**
|
|
50
|
+
* When true, `confirm()` accepts only a `submitted` card (open -> submitted
|
|
51
|
+
* -> confirmed). Default false: `submit()` is optional and `confirm()` also
|
|
52
|
+
* accepts an `open` card (open -> confirmed), as before.
|
|
53
|
+
*/
|
|
54
|
+
requireSubmission?: boolean;
|
|
55
|
+
}
|
|
38
56
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rollup/types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7E,QAAQ,CACN,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,OAAO,EAAE,SAAS,QAAQ,CAAC,cAAc,CAAC,EAAE,EAC5C,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC7B,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,qFAAqF;AACrF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rollup/types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7E,QAAQ,CACN,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,OAAO,EAAE,SAAS,QAAQ,CAAC,cAAc,CAAC,EAAE,EAC5C,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC7B,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,qFAAqF;AACrF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B"}
|
package/dist/rollup/write.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { SmrtObject } from '@happyvertical/smrt-core';
|
|
2
2
|
export declare function assertRollupWrite(object: SmrtObject): void;
|
|
3
3
|
export declare function persistRollup<T extends SmrtObject>(object: T): Promise<T>;
|
|
4
|
+
export declare function isReopenWrite(object: SmrtObject): boolean;
|
|
5
|
+
export declare function persistReopen<T extends SmrtObject>(object: T): Promise<T>;
|
|
4
6
|
//# sourceMappingURL=write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/rollup/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAI3D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAK1D;AACD,wBAAsB,aAAa,CAAC,CAAC,SAAS,UAAU,EACtD,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,CAAC,CAAC,CAQZ"}
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/rollup/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAI3D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAK1D;AACD,wBAAsB,aAAa,CAAC,CAAC,SAAS,UAAU,EACtD,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,CAAC,CAAC,CAQZ;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEzD;AACD,wBAAsB,aAAa,CAAC,CAAC,SAAS,UAAU,EACtD,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|
package/dist/rollup.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import './__smrt-register__.js';
|
|
2
|
-
export {
|
|
2
|
+
export { confirmedTimecardGuard } from './rollup/correction-guard.js';
|
|
3
|
+
export { PeriodTimecard, PeriodTimecardCollection, TimecardAdjustment, TimecardAdjustmentCollection, TimecardReopening, TimecardReopeningCollection, type TimecardStatus, } from './rollup/models.js';
|
|
3
4
|
export { PeriodRollupService } from './rollup/service.js';
|
|
4
|
-
export type { PeriodRulesResolver, TimecardActor, TimecardAdjustmentInput, TimecardPeriod, TimecardSource, } from './rollup/types.js';
|
|
5
|
+
export type { PeriodRollupOptions, PeriodRulesResolver, TimecardActor, TimecardAdjustmentInput, TimecardPeriod, TimecardReopenInput, TimecardSource, } from './rollup/types.js';
|
|
5
6
|
//# sourceMappingURL=rollup.d.ts.map
|
package/dist/rollup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../src/rollup.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,4BAA4B,
|
|
1
|
+
{"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../src/rollup.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,EACjB,2BAA2B,EAC3B,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC"}
|
package/dist/rollup.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { PeriodRollupService, PeriodTimecard, PeriodTimecardCollection, TimecardAdjustment, TimecardAdjustmentCollection };
|
|
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-CzCb-DxI.js";
|
|
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"}
|