@happyvertical/smrt-timesheets 0.53.1 → 0.53.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 +32 -21
- package/README.md +124 -58
- package/agents/period-rollup.md +130 -0
- package/dist/attendance/models.d.ts +59 -0
- package/dist/attendance/models.d.ts.map +1 -0
- package/dist/attendance/service.d.ts +64 -0
- package/dist/attendance/service.d.ts.map +1 -0
- package/dist/attendance.d.ts +5 -0
- package/dist/attendance.d.ts.map +1 -0
- package/dist/attendance.js +323 -0
- package/dist/attendance.js.map +1 -0
- package/dist/chunks/attendance-Bk8o96dt.js +60 -0
- package/dist/chunks/attendance-Bk8o96dt.js.map +1 -0
- package/dist/chunks/models-D9n8HKXH.js +166 -0
- package/dist/chunks/models-D9n8HKXH.js.map +1 -0
- package/dist/chunks/rollup-yE0TFLJe.js +425 -0
- package/dist/chunks/rollup-yE0TFLJe.js.map +1 -0
- package/dist/chunks/service-time-entry-B2gHrJYI.js +190 -0
- package/dist/chunks/service-time-entry-B2gHrJYI.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -205
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +2553 -652
- package/dist/rollup/attendance.d.ts +8 -0
- package/dist/rollup/attendance.d.ts.map +1 -0
- package/dist/rollup/calculation.d.ts +7 -0
- package/dist/rollup/calculation.d.ts.map +1 -0
- package/dist/rollup/models.d.ts +47 -0
- package/dist/rollup/models.d.ts.map +1 -0
- package/dist/rollup/service.d.ts +37 -0
- package/dist/rollup/service.d.ts.map +1 -0
- package/dist/rollup/types.d.ts +38 -0
- package/dist/rollup/types.d.ts.map +1 -0
- package/dist/rollup/write.d.ts +4 -0
- package/dist/rollup/write.d.ts.map +1 -0
- package/dist/rollup.d.ts +5 -0
- package/dist/rollup.d.ts.map +1 -0
- package/dist/rollup.js +2 -0
- package/dist/smrt-knowledge.json +1319 -433
- package/package.json +19 -10
- package/dist/svelte/components/__tests__/DurationDisplay.test.js +0 -57
- package/dist/svelte/components/__tests__/TimeEntryApprovalQueue.test.js +0 -114
- package/dist/svelte/components/__tests__/TimeEntryCard.test.js +0 -45
- package/dist/svelte/components/__tests__/TimeEntryList.test.js +0 -50
- package/dist/svelte/components/__tests__/TimeSummary.test.js +0 -39
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import type { TimecardActor, TimecardPeriod, TimecardSource } from './types.js';
|
|
3
|
+
/** Optional attendance reader. Called on the rollup's transaction executor. */
|
|
4
|
+
export declare function attendanceSources(db: DatabaseInterface, actor: TimecardActor, period: TimecardPeriod): Promise<{
|
|
5
|
+
sources: TimecardSource[];
|
|
6
|
+
linkedEntryIds: Set<string>;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=attendance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attendance.d.ts","sourceRoot":"","sources":["../../src/rollup/attendance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAM5D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhF,+EAA+E;AAC/E,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,iBAAiB,EACrB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,CA0DrE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TimecardPeriod, TimecardSource } from './types.js';
|
|
2
|
+
export declare function integer(value: number, signed?: boolean): number;
|
|
3
|
+
export declare function instant(value: Date): number;
|
|
4
|
+
export declare function validatePeriod(value: TimecardPeriod, at: Date): TimecardPeriod;
|
|
5
|
+
/** Prefix allocation preserves integer seconds across adjacent half-open periods. */
|
|
6
|
+
export declare function clipSource(source: TimecardSource, period: TimecardPeriod): TimecardSource | null;
|
|
7
|
+
//# sourceMappingURL=calculation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculation.d.ts","sourceRoot":"","sources":["../../src/rollup/calculation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAI7D;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAI3C;AACD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,EAAE,EAAE,IAAI,GACP,cAAc,CAsChB;AACD,qFAAqF;AACrF,wBAAgB,UAAU,CACxB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,IAAI,CAsBvB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { SmrtCollection, SmrtObject } from '@happyvertical/smrt-core';
|
|
2
|
+
import type { TimecardSource } from './types.js';
|
|
3
|
+
/** One person's immutable-on-confirmation period snapshot, in integer seconds. */
|
|
4
|
+
export declare class PeriodTimecard extends SmrtObject {
|
|
5
|
+
tenantId: string;
|
|
6
|
+
profileId: string;
|
|
7
|
+
startsAt: Date;
|
|
8
|
+
endsAt: Date;
|
|
9
|
+
timezone: string;
|
|
10
|
+
rulesVersion: string;
|
|
11
|
+
rulesSnapshot: string;
|
|
12
|
+
sourceSnapshot: string;
|
|
13
|
+
regularSeconds: number;
|
|
14
|
+
overtimeSeconds: number;
|
|
15
|
+
totalSeconds: number;
|
|
16
|
+
status: 'open' | 'confirmed';
|
|
17
|
+
confirmedAt: Date | null;
|
|
18
|
+
confirmedByProfileId: string | null;
|
|
19
|
+
/** Return a detached source snapshot; corrupt persisted JSON fails closed. */
|
|
20
|
+
getSources(): TimecardSource[];
|
|
21
|
+
/** Return the consumer policy frozen with this rollup. */
|
|
22
|
+
getRules(): Record<string, unknown>;
|
|
23
|
+
save(): Promise<this>;
|
|
24
|
+
delete(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** Attributed append-only signed seconds; the confirmed base card never changes. */
|
|
27
|
+
export declare class TimecardAdjustment extends SmrtObject {
|
|
28
|
+
tenantId: string;
|
|
29
|
+
timecardId: string;
|
|
30
|
+
profileId: string;
|
|
31
|
+
actorProfileId: string;
|
|
32
|
+
operationId: string;
|
|
33
|
+
regularSeconds: number;
|
|
34
|
+
overtimeSeconds: number;
|
|
35
|
+
reason: string;
|
|
36
|
+
save(): Promise<this>;
|
|
37
|
+
delete(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/** Scoped persistence collection; mutations must use PeriodRollupService. */
|
|
40
|
+
export declare class PeriodTimecardCollection extends SmrtCollection<PeriodTimecard> {
|
|
41
|
+
static readonly _itemClass: typeof PeriodTimecard;
|
|
42
|
+
}
|
|
43
|
+
/** Scoped append-only adjustment collection. */
|
|
44
|
+
export declare class TimecardAdjustmentCollection extends SmrtCollection<TimecardAdjustment> {
|
|
45
|
+
static readonly _itemClass: typeof TimecardAdjustment;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +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,WAAW,CAAU;IAC/D,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;IAmBrB,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,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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import { PeriodTimecard, TimecardAdjustment } from './models.js';
|
|
3
|
+
import type { PeriodRulesResolver, TimecardActor, TimecardAdjustmentInput } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Server-side, trusted tenant/person capability. Consumers authorize this scope
|
|
6
|
+
* before construction. Reads and writes reject conflicting ambient tenancy.
|
|
7
|
+
* SQLite and PostgreSQL are supported; policy and payroll remain consumer-owned.
|
|
8
|
+
*/
|
|
9
|
+
export declare class PeriodRollupService {
|
|
10
|
+
private readonly db;
|
|
11
|
+
private readonly actor;
|
|
12
|
+
private readonly resolver;
|
|
13
|
+
private readonly options;
|
|
14
|
+
constructor(db: DatabaseInterface, actor: TimecardActor, resolver: PeriodRulesResolver, options?: {
|
|
15
|
+
attendance?: boolean;
|
|
16
|
+
actorProfileId?: string;
|
|
17
|
+
});
|
|
18
|
+
private identity;
|
|
19
|
+
private scope;
|
|
20
|
+
private transact;
|
|
21
|
+
private card;
|
|
22
|
+
/** Scoped read on the root executor, including after transaction completion. */
|
|
23
|
+
get(id: string): Promise<PeriodTimecard>;
|
|
24
|
+
/** Rebuild one open card from a consistent transaction-bound source snapshot. */
|
|
25
|
+
rollup(at: Date): Promise<PeriodTimecard>;
|
|
26
|
+
/** Confirm the current snapshot; repeated confirmation is idempotent. */
|
|
27
|
+
confirm(id: string): Promise<PeriodTimecard>;
|
|
28
|
+
/** Append a correction. An operation key retry must have exactly the same payload. */
|
|
29
|
+
adjust(id: string, input: TimecardAdjustmentInput): Promise<TimecardAdjustment>;
|
|
30
|
+
/** Effective totals combine the frozen base with append-only corrections. */
|
|
31
|
+
totals(id: string): Promise<{
|
|
32
|
+
regularSeconds: number;
|
|
33
|
+
overtimeSeconds: number;
|
|
34
|
+
totalSeconds: number;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +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,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EAExB,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;QACxB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;KACpB;IAkBR,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;IAsI/C,yEAAyE;IACnE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAWlD,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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Trusted scope resolved and authorized by the consumer's server. */
|
|
2
|
+
export interface TimecardActor {
|
|
3
|
+
tenantId: string;
|
|
4
|
+
profileId: string;
|
|
5
|
+
}
|
|
6
|
+
/** Half-open UTC period; the resolver owns calendar length/start day and DST. */
|
|
7
|
+
export interface TimecardPeriod {
|
|
8
|
+
startsAt: Date;
|
|
9
|
+
endsAt: Date;
|
|
10
|
+
timezone: string;
|
|
11
|
+
version: string;
|
|
12
|
+
/** JSON policy snapshot: thresholds, holidays, calendar configuration, etc. */
|
|
13
|
+
rules: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/** Auditable integer-second contribution after clipping to the period. */
|
|
16
|
+
export interface TimecardSource {
|
|
17
|
+
kind: 'entry' | 'attendance';
|
|
18
|
+
id: string;
|
|
19
|
+
startsAt: string;
|
|
20
|
+
endsAt: string;
|
|
21
|
+
seconds: number;
|
|
22
|
+
}
|
|
23
|
+
/** No payroll or jurisdiction policy is built into this interface. */
|
|
24
|
+
export interface PeriodRulesResolver {
|
|
25
|
+
periodFor(at: Date, actor: Readonly<TimecardActor>): Promise<TimecardPeriod>;
|
|
26
|
+
classify(period: Readonly<TimecardPeriod>, sources: readonly Readonly<TimecardSource>[], actor: Readonly<TimecardActor>): Promise<{
|
|
27
|
+
regularSeconds: number;
|
|
28
|
+
overtimeSeconds: number;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
/** Signed correction to a confirmed card, deduplicated by a caller operation key. */
|
|
32
|
+
export interface TimecardAdjustmentInput {
|
|
33
|
+
operationId: string;
|
|
34
|
+
regularSeconds: number;
|
|
35
|
+
overtimeSeconds: number;
|
|
36
|
+
reason: string;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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"}
|
package/dist/rollup.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import './__smrt-register__.js';
|
|
2
|
+
export { PeriodTimecard, PeriodTimecardCollection, TimecardAdjustment, TimecardAdjustmentCollection, } from './rollup/models.js';
|
|
3
|
+
export { PeriodRollupService } from './rollup/service.js';
|
|
4
|
+
export type { PeriodRulesResolver, TimecardActor, TimecardAdjustmentInput, TimecardPeriod, TimecardSource, } from './rollup/types.js';
|
|
5
|
+
//# sourceMappingURL=rollup.d.ts.map
|
|
@@ -0,0 +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,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,cAAc,GACf,MAAM,mBAAmB,CAAC"}
|
package/dist/rollup.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as PeriodTimecard, c as TimecardAdjustmentCollection, o as PeriodTimecardCollection, s as TimecardAdjustment, t as PeriodRollupService } from "./chunks/rollup-yE0TFLJe.js";
|
|
2
|
+
export { PeriodRollupService, PeriodTimecard, PeriodTimecardCollection, TimecardAdjustment, TimecardAdjustmentCollection };
|