@happyvertical/smrt-timesheets 0.56.0 → 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.
Files changed (35) hide show
  1. package/AGENTS.md +34 -0
  2. package/README.md +34 -1
  3. package/dist/attendance.js +2 -2
  4. package/dist/chunks/{attendance-B1jCbqSb.js → attendance-Cw75uJnT.js} +3 -3
  5. package/dist/chunks/{attendance-B1jCbqSb.js.map → attendance-Cw75uJnT.js.map} +1 -1
  6. package/dist/chunks/{attendance-DGVy-iHI.js → attendance-DJNytMTN.js} +3 -3
  7. package/dist/chunks/{attendance-DGVy-iHI.js.map → attendance-DJNytMTN.js.map} +1 -1
  8. package/dist/chunks/{models-0-YD5F_o.js → models-tUePZ5x7.js} +2 -2
  9. package/dist/chunks/{models-0-YD5F_o.js.map → models-tUePZ5x7.js.map} +1 -1
  10. package/dist/chunks/{rollup-CDqzCxI2.js → rollup-CzCb-DxI.js} +3 -3
  11. package/dist/chunks/{rollup-CDqzCxI2.js.map → rollup-CzCb-DxI.js.map} +1 -1
  12. package/dist/chunks/{service-time-entry-t7P-bkOQ.js → service-time-entry-BJVSGx33.js} +64 -5
  13. package/dist/chunks/service-time-entry-BJVSGx33.js.map +1 -0
  14. package/dist/chunks/time-entry-actions-ChT1lcOp.js +576 -0
  15. package/dist/chunks/time-entry-actions-ChT1lcOp.js.map +1 -0
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +113 -334
  19. package/dist/index.js.map +1 -1
  20. package/dist/manifest.json +252 -7
  21. package/dist/models/service-snapshots.d.ts.map +1 -1
  22. package/dist/models/service-time-entry.d.ts +36 -1
  23. package/dist/models/service-time-entry.d.ts.map +1 -1
  24. package/dist/recipes.d.ts +124 -0
  25. package/dist/recipes.d.ts.map +1 -0
  26. package/dist/rollup.js +1 -1
  27. package/dist/services/action-principal.d.ts +54 -0
  28. package/dist/services/action-principal.d.ts.map +1 -0
  29. package/dist/services/index.d.ts +2 -0
  30. package/dist/services/index.d.ts.map +1 -1
  31. package/dist/services/time-entry-actions.d.ts +83 -0
  32. package/dist/services/time-entry-actions.d.ts.map +1 -0
  33. package/dist/smrt-knowledge.json +230 -34
  34. package/package.json +8 -7
  35. package/dist/chunks/service-time-entry-t7P-bkOQ.js.map +0 -1
package/AGENTS.md CHANGED
@@ -48,6 +48,40 @@ files.
48
48
  through a `ServiceCommercialResolver`), and corrects. `smrt-projects` supplies
49
49
  `SubscriptionServiceCommercialResolver` for #1925 pricing.
50
50
 
51
+ ## Generated write actions (#4001)
52
+
53
+ Generated CRUD writes stay closed. `ServiceTimeEntryCollection` hosts the only
54
+ generated writes, `record` / `submit` / `approve` (`POST
55
+ /servicetimeentries/<action>`, body `{ entryId }` for submit/approve), on REST
56
+ only; MCP and CLI stay read-only until per-operation MCP authorization (#4004).
57
+ `services/time-entry-actions.ts` delegates each to `ServiceEvidenceService`, so
58
+ the trail and snapshots are set in one place. `services/action-principal.ts`
59
+ takes identity from the tenancy ALS, then the smrt-users session ALS, never the
60
+ body; authorizes `servicetimeentries.<action>` with `assertOperationPermission`
61
+ (system context never bypasses; `approve` refuses super-admin bypass); and
62
+ stamps the user's linked profile. Only the participant records/submits their
63
+ own time unless the caller holds `approve`. `approve` prices with the host's
64
+ `setServiceTimeEntryCommercialResolver()` — a factory called per request with
65
+ the collection's options, so a writing resolver shares the request executor;
66
+ without one it is a 409 and writes nothing. The runtime REST transport gates
67
+ a collection-hosted action on the ITEM's `api.include`, SvelteKit on the
68
+ collection's, so both list the actions;
69
+ a consumer closing them overrides both registrations. The collection and both
70
+ snapshot collections carry their own `@smrt()` surface: undecorated, they
71
+ published generated create/update/delete MCP tools. `reject` waits for #3994.
72
+
73
+ ## Recipe
74
+
75
+ `src/recipes.ts` declares one `SmrtRecipe`, `timesheets.time-entries`
76
+ (label "Time entries", section `work`), emitted into the built
77
+ `manifest.json` and `smrt-knowledge.json` `recipes`. It shows
78
+ `ServiceTimeEntry` alone, with the generic work reference, evidence, agent
79
+ and approval-trail fields hidden; attendance and rollup models stay out of
80
+ it. `status` and its trail are hidden and locked, and the help never says to
81
+ set them: `save()` accepts a bare transition, so submit and approve must go
82
+ through `ServiceEvidenceService` (the recipe declares no surface for that). Help lives in `src/time-entries.recipe.md` (#3591); keep it and the recipe
83
+ in plain language. See [core recipes](../core/agents/recipes.md).
84
+
51
85
  ## Invariants
52
86
 
53
87
  - **No domain foreign key on the base.** Work context is the generic
package/README.md CHANGED
@@ -131,10 +131,41 @@ recording facade remains seconds-based; its shared entry view uses
131
131
  `TimeEntryApprovalQueue` are props-driven: hosts load entries and pass plain
132
132
  view objects (`TimeEntry`, `TimeEntryApprovalView`).
133
133
 
134
+ ## Generated write actions
135
+
136
+ Generated CRUD writes are closed. The write path a generated app can call is
137
+ three service-backed REST actions on `ServiceTimeEntryCollection` (#4001):
138
+
139
+ | Route | Body | Permission |
140
+ |---|---|---|
141
+ | `POST /servicetimeentries/record` | work ref, `source` (`manual`/`timer`), times or `durationSeconds`/`durationHours`, optional `participantProfileId` | `servicetimeentries.record` |
142
+ | `POST /servicetimeentries/submit` | `{ entryId }` | `servicetimeentries.submit` |
143
+ | `POST /servicetimeentries/approve` | `{ entryId }` | `servicetimeentries.approve` (no super-admin bypass) |
144
+
145
+ Each delegates to `ServiceEvidenceService`, so `submittedAt`/`submittedBy`,
146
+ `approvedAt`/`approvedBy`/`approvalPath` (`operator`) and both snapshots are
147
+ set exactly as the service sets them. The tenant and the acting profile come
148
+ from the authenticated session, never the body. Recording or submitting
149
+ someone else's time needs `approve` as well. Install pricing for `approve`
150
+ as a factory, so a resolver that writes (client charges) runs on the request's
151
+ executor and transaction:
152
+
153
+ ```ts
154
+ import { setServiceTimeEntryCommercialResolver } from '@happyvertical/smrt-timesheets';
155
+
156
+ setServiceTimeEntryCommercialResolver(({ options }) =>
157
+ SubscriptionServiceCommercialResolver.create(options, provider),
158
+ );
159
+ ```
160
+
161
+ Without a resolver, `approve` answers 409 `approval_not_configured`. MCP and
162
+ CLI stay read-only; there is no `reject` action yet (#3994).
163
+
134
164
  ## Closing the generated surface
135
165
 
136
166
  The entry and both snapshots expose generated `list` / `get` on REST, CLI,
137
- and MCP, with optional tenant scoping. An application that routes all time
167
+ and MCP, with optional tenant scoping, and the entry's collection the write
168
+ actions above. An application that routes all time
138
169
  and money through its own permission-gated services can close those surfaces
139
170
  without declaring replacement models:
140
171
 
@@ -144,6 +175,8 @@ import '@happyvertical/smrt-timesheets';
144
175
 
145
176
  for (const name of [
146
177
  'ServiceTimeEntry',
178
+ // Hosts the record/submit/approve actions on generated SvelteKit routes.
179
+ 'ServiceTimeEntryCollection',
147
180
  'ServiceChargeSnapshot',
148
181
  'ServiceCompensationSnapshot',
149
182
  ]) {
@@ -1,3 +1,3 @@
1
- import { a as AttendanceReplay, c as AttendanceSegmentCollection, i as AttendancePunchCollection, n as AttendanceBreakCollection, o as AttendanceReplayCollection, r as AttendancePunch, s as AttendanceSegment, t as AttendanceBreak } from "./chunks/models-0-YD5F_o.js";
2
- import { a as continueSegment, c as openSegment, d as validateAttendanceWork, f as ATTENDANCE_CORRECTION_KINDS, i as closeOpenSegment, l as replaceSegment, m as AttendanceCorrectionCollection, n as AttendanceService, o as endSegment, p as AttendanceCorrection, r as beginSegment, s as listSegments, t as AttendanceCorrectionService, u as AttendanceConflict } from "./chunks/attendance-DGVy-iHI.js";
1
+ import { a as AttendanceReplay, c as AttendanceSegmentCollection, i as AttendancePunchCollection, n as AttendanceBreakCollection, o as AttendanceReplayCollection, r as AttendancePunch, s as AttendanceSegment, t as AttendanceBreak } from "./chunks/models-tUePZ5x7.js";
2
+ import { a as continueSegment, c as openSegment, d as validateAttendanceWork, f as ATTENDANCE_CORRECTION_KINDS, i as closeOpenSegment, l as replaceSegment, m as AttendanceCorrectionCollection, n as AttendanceService, o as endSegment, p as AttendanceCorrection, r as beginSegment, s as listSegments, t as AttendanceCorrectionService, u as AttendanceConflict } from "./chunks/attendance-DJNytMTN.js";
3
3
  export { ATTENDANCE_CORRECTION_KINDS, AttendanceBreak, AttendanceBreakCollection, AttendanceConflict, AttendanceCorrection, AttendanceCorrectionCollection, AttendanceCorrectionService, AttendancePunch, AttendancePunchCollection, AttendanceReplay, AttendanceReplayCollection, AttendanceSegment, AttendanceSegmentCollection, AttendanceService, beginSegment, closeOpenSegment, continueSegment, endSegment, listSegments, openSegment, replaceSegment, validateAttendanceWork };
@@ -1,5 +1,5 @@
1
- import { i as AttendancePunchCollection, n as AttendanceBreakCollection } from "./models-0-YD5F_o.js";
2
- import { i as integer, n as clipSource, r as instant } from "./rollup-CDqzCxI2.js";
1
+ import { i as AttendancePunchCollection, n as AttendanceBreakCollection } from "./models-tUePZ5x7.js";
2
+ import { i as integer, n as clipSource, r as instant } from "./rollup-CzCb-DxI.js";
3
3
  //#region src/rollup/attendance.ts
4
4
  async function attendanceSources(db, actor, period) {
5
5
  const punches = await AttendancePunchCollection.create({ db });
@@ -57,4 +57,4 @@ async function attendanceSources(db, actor, period) {
57
57
  //#endregion
58
58
  export { attendanceSources };
59
59
 
60
- //# sourceMappingURL=attendance-B1jCbqSb.js.map
60
+ //# sourceMappingURL=attendance-Cw75uJnT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"attendance-B1jCbqSb.js","names":[],"sources":["../../src/rollup/attendance.ts"],"sourcesContent":["import type { DatabaseInterface } from '@happyvertical/sql';\nimport {\n AttendanceBreakCollection,\n AttendancePunchCollection,\n} from '../attendance/models.js';\nimport { clipSource, instant, integer } from './calculation.js';\nimport type { TimecardActor, TimecardPeriod, TimecardSource } from './types.js';\n\n/** Optional attendance reader. Called on the rollup's transaction executor. */\nexport async function attendanceSources(\n db: DatabaseInterface,\n actor: TimecardActor,\n period: TimecardPeriod,\n): Promise<{ sources: TimecardSource[]; linkedEntryIds: Set<string> }> {\n const punches = await AttendancePunchCollection.create({ db });\n const breaks = await AttendanceBreakCollection.create({ db });\n const sources: TimecardSource[] = [];\n const linkedEntryIds = new Set<string>();\n for (const punch of await punches.list({ where: { ...actor } })) {\n // A linked punch is authoritative even when pending review: never count its\n // evidence entry behind the review gate, or outside the punch's period.\n if (punch.serviceTimeEntryId) linkedEntryIds.add(punch.serviceTimeEntryId);\n if (!punch.endedAt || punch.reviewRequired) continue;\n const start = instant(punch.startedAt);\n const end = instant(punch.endedAt);\n if (end < start) throw new Error('Invalid attendance interval.');\n let cursor = start;\n let unpaidMs = 0;\n const spans: [number, number][] = [];\n for (const pause of await breaks.list({\n where: { tenantId: actor.tenantId, punchId: punch.id },\n orderBy: 'started_at ASC',\n })) {\n if (!pause.endedAt)\n throw new Error('Closed attendance has an open break.');\n const left = instant(pause.startedAt);\n const right = instant(pause.endedAt);\n if (left < cursor || right < left || right > end)\n throw new Error('Invalid or overlapping attendance breaks.');\n if (!pause.paid) {\n spans.push([cursor, left]);\n unpaidMs += right - left;\n } else {\n spans.push([cursor, right]);\n }\n cursor = right;\n }\n spans.push([cursor, end]);\n const net = Math.round((end - start - unpaidMs) / 1000);\n if (integer(punch.durationSeconds) !== net)\n throw new Error('Attendance duration does not match its breaks.');\n // Round elapsed paid prefixes once, preserving conservation across breaks.\n let paidMs = 0;\n for (const [left, right] of spans) {\n const seconds =\n Math.round((paidMs + right - left) / 1000) - Math.round(paidMs / 1000);\n paidMs += right - left;\n const source = clipSource(\n {\n kind: 'attendance',\n id: String(punch.id),\n startsAt: new Date(left).toISOString(),\n endsAt: new Date(right).toISOString(),\n seconds,\n },\n period,\n );\n if (source?.seconds) sources.push(source);\n }\n }\n return { sources, linkedEntryIds };\n}\n"],"mappings":";;;AASA,eAAsB,kBACpB,IACA,OACA,QACqE;CACrE,MAAM,UAAU,MAAM,0BAA0B,OAAO,EAAE,GAAG,CAAC;CAC7D,MAAM,SAAS,MAAM,0BAA0B,OAAO,EAAE,GAAG,CAAC;CAC5D,MAAM,UAA4B,CAAC;CACnC,MAAM,iCAAiB,IAAI,IAAY;CACvC,KAAA,MAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG;EAG/D,IAAI,MAAM,oBAAoB,eAAe,IAAI,MAAM,kBAAkB;EACzE,IAAI,CAAC,MAAM,WAAW,MAAM,gBAAgB;EAC5C,MAAM,QAAQ,QAAQ,MAAM,SAAS;EACrC,MAAM,MAAM,QAAQ,MAAM,OAAO;EACjC,IAAI,MAAM,OAAO,MAAM,IAAI,MAAM,8BAA8B;EAC/D,IAAI,SAAS;EACb,IAAI,WAAW;EACf,MAAM,QAA4B,CAAC;EACnC,KAAA,MAAW,SAAS,MAAM,OAAO,KAAK;GACpC,OAAO;IAAE,UAAU,MAAM;IAAU,SAAS,MAAM;GAAG;GACrD,SAAS;EACX,CAAC,GAAG;GACF,IAAI,CAAC,MAAM,SACT,MAAM,IAAI,MAAM,sCAAsC;GACxD,MAAM,OAAO,QAAQ,MAAM,SAAS;GACpC,MAAM,QAAQ,QAAQ,MAAM,OAAO;GACnC,IAAI,OAAO,UAAU,QAAQ,QAAQ,QAAQ,KAC3C,MAAM,IAAI,MAAM,2CAA2C;GAC7D,IAAI,CAAC,MAAM,MAAM;IACf,MAAM,KAAK,CAAC,QAAQ,IAAI,CAAC;IACzB,YAAY,QAAQ;GACtB,OACE,MAAM,KAAK,CAAC,QAAQ,KAAK,CAAC;GAE5B,SAAS;EACX;EACA,MAAM,KAAK,CAAC,QAAQ,GAAG,CAAC;EACxB,MAAM,MAAM,KAAK,OAAO,MAAM,QAAQ,YAAY,GAAI;EACtD,IAAI,QAAQ,MAAM,eAAe,MAAM,KACrC,MAAM,IAAI,MAAM,gDAAgD;EAElE,IAAI,SAAS;EACb,KAAA,MAAW,CAAC,MAAM,UAAU,OAAO;GACjC,MAAM,UACJ,KAAK,OAAO,SAAS,QAAQ,QAAQ,GAAI,IAAI,KAAK,MAAM,SAAS,GAAI;GACvE,UAAU,QAAQ;GAClB,MAAM,SAAS,WACb;IACE,MAAM;IACN,IAAI,OAAO,MAAM,EAAE;IACnB,UAAU,IAAI,KAAK,IAAI,CAAA,CAAE,YAAY;IACrC,QAAQ,IAAI,KAAK,KAAK,CAAA,CAAE,YAAY;IACpC;GACF,GACA,MACF;GACA,IAAI,QAAQ,SAAS,QAAQ,KAAK,MAAM;EAC1C;CACF;CACA,OAAO;EAAE;EAAS;CAAe;AACnC"}
1
+ {"version":3,"file":"attendance-Cw75uJnT.js","names":[],"sources":["../../src/rollup/attendance.ts"],"sourcesContent":["import type { DatabaseInterface } from '@happyvertical/sql';\nimport {\n AttendanceBreakCollection,\n AttendancePunchCollection,\n} from '../attendance/models.js';\nimport { clipSource, instant, integer } from './calculation.js';\nimport type { TimecardActor, TimecardPeriod, TimecardSource } from './types.js';\n\n/** Optional attendance reader. Called on the rollup's transaction executor. */\nexport async function attendanceSources(\n db: DatabaseInterface,\n actor: TimecardActor,\n period: TimecardPeriod,\n): Promise<{ sources: TimecardSource[]; linkedEntryIds: Set<string> }> {\n const punches = await AttendancePunchCollection.create({ db });\n const breaks = await AttendanceBreakCollection.create({ db });\n const sources: TimecardSource[] = [];\n const linkedEntryIds = new Set<string>();\n for (const punch of await punches.list({ where: { ...actor } })) {\n // A linked punch is authoritative even when pending review: never count its\n // evidence entry behind the review gate, or outside the punch's period.\n if (punch.serviceTimeEntryId) linkedEntryIds.add(punch.serviceTimeEntryId);\n if (!punch.endedAt || punch.reviewRequired) continue;\n const start = instant(punch.startedAt);\n const end = instant(punch.endedAt);\n if (end < start) throw new Error('Invalid attendance interval.');\n let cursor = start;\n let unpaidMs = 0;\n const spans: [number, number][] = [];\n for (const pause of await breaks.list({\n where: { tenantId: actor.tenantId, punchId: punch.id },\n orderBy: 'started_at ASC',\n })) {\n if (!pause.endedAt)\n throw new Error('Closed attendance has an open break.');\n const left = instant(pause.startedAt);\n const right = instant(pause.endedAt);\n if (left < cursor || right < left || right > end)\n throw new Error('Invalid or overlapping attendance breaks.');\n if (!pause.paid) {\n spans.push([cursor, left]);\n unpaidMs += right - left;\n } else {\n spans.push([cursor, right]);\n }\n cursor = right;\n }\n spans.push([cursor, end]);\n const net = Math.round((end - start - unpaidMs) / 1000);\n if (integer(punch.durationSeconds) !== net)\n throw new Error('Attendance duration does not match its breaks.');\n // Round elapsed paid prefixes once, preserving conservation across breaks.\n let paidMs = 0;\n for (const [left, right] of spans) {\n const seconds =\n Math.round((paidMs + right - left) / 1000) - Math.round(paidMs / 1000);\n paidMs += right - left;\n const source = clipSource(\n {\n kind: 'attendance',\n id: String(punch.id),\n startsAt: new Date(left).toISOString(),\n endsAt: new Date(right).toISOString(),\n seconds,\n },\n period,\n );\n if (source?.seconds) sources.push(source);\n }\n }\n return { sources, linkedEntryIds };\n}\n"],"mappings":";;;AASA,eAAsB,kBACpB,IACA,OACA,QACqE;CACrE,MAAM,UAAU,MAAM,0BAA0B,OAAO,EAAE,GAAG,CAAC;CAC7D,MAAM,SAAS,MAAM,0BAA0B,OAAO,EAAE,GAAG,CAAC;CAC5D,MAAM,UAA4B,CAAC;CACnC,MAAM,iCAAiB,IAAI,IAAY;CACvC,KAAA,MAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG;EAG/D,IAAI,MAAM,oBAAoB,eAAe,IAAI,MAAM,kBAAkB;EACzE,IAAI,CAAC,MAAM,WAAW,MAAM,gBAAgB;EAC5C,MAAM,QAAQ,QAAQ,MAAM,SAAS;EACrC,MAAM,MAAM,QAAQ,MAAM,OAAO;EACjC,IAAI,MAAM,OAAO,MAAM,IAAI,MAAM,8BAA8B;EAC/D,IAAI,SAAS;EACb,IAAI,WAAW;EACf,MAAM,QAA4B,CAAC;EACnC,KAAA,MAAW,SAAS,MAAM,OAAO,KAAK;GACpC,OAAO;IAAE,UAAU,MAAM;IAAU,SAAS,MAAM;GAAG;GACrD,SAAS;EACX,CAAC,GAAG;GACF,IAAI,CAAC,MAAM,SACT,MAAM,IAAI,MAAM,sCAAsC;GACxD,MAAM,OAAO,QAAQ,MAAM,SAAS;GACpC,MAAM,QAAQ,QAAQ,MAAM,OAAO;GACnC,IAAI,OAAO,UAAU,QAAQ,QAAQ,QAAQ,KAC3C,MAAM,IAAI,MAAM,2CAA2C;GAC7D,IAAI,CAAC,MAAM,MAAM;IACf,MAAM,KAAK,CAAC,QAAQ,IAAI,CAAC;IACzB,YAAY,QAAQ;GACtB,OACE,MAAM,KAAK,CAAC,QAAQ,KAAK,CAAC;GAE5B,SAAS;EACX;EACA,MAAM,KAAK,CAAC,QAAQ,GAAG,CAAC;EACxB,MAAM,MAAM,KAAK,OAAO,MAAM,QAAQ,YAAY,GAAI;EACtD,IAAI,QAAQ,MAAM,eAAe,MAAM,KACrC,MAAM,IAAI,MAAM,gDAAgD;EAElE,IAAI,SAAS;EACb,KAAA,MAAW,CAAC,MAAM,UAAU,OAAO;GACjC,MAAM,UACJ,KAAK,OAAO,SAAS,QAAQ,QAAQ,GAAI,IAAI,KAAK,MAAM,SAAS,GAAI;GACvE,UAAU,QAAQ;GAClB,MAAM,SAAS,WACb;IACE,MAAM;IACN,IAAI,OAAO,MAAM,EAAE;IACnB,UAAU,IAAI,KAAK,IAAI,CAAA,CAAE,YAAY;IACrC,QAAQ,IAAI,KAAK,KAAK,CAAA,CAAE,YAAY;IACpC;GACF,GACA,MACF;GACA,IAAI,QAAQ,SAAS,QAAQ,KAAK,MAAM;EAC1C;CACF;CACA,OAAO;EAAE;EAAS;CAAe;AACnC"}
@@ -1,5 +1,5 @@
1
- import { i as ServiceTimeEntryCollection, o as parseTimesheetJson } from "./service-time-entry-t7P-bkOQ.js";
2
- import { c as AttendanceSegmentCollection, d as persistAutoClose, f as persistCorrection, i as AttendancePunchCollection, l as deleteCorrection, n as AttendanceBreakCollection, o as AttendanceReplayCollection, r as AttendancePunch, s as AttendanceSegment, t as AttendanceBreak, u as isCorrectionWrite } from "./models-0-YD5F_o.js";
1
+ import { i as ServiceTimeEntryCollection, o as parseTimesheetJson } from "./service-time-entry-BJVSGx33.js";
2
+ import { c as AttendanceSegmentCollection, d as persistAutoClose, f as persistCorrection, i as AttendancePunchCollection, l as deleteCorrection, n as AttendanceBreakCollection, o as AttendanceReplayCollection, r as AttendancePunch, s as AttendanceSegment, t as AttendanceBreak, u as isCorrectionWrite } from "./models-tUePZ5x7.js";
3
3
  import { SmrtCollection, SmrtObject, crossPackageRef, field, foreignKey, isEmbeddedDatabase, isPostgresDatabase, smrt, withEmbeddedWriteTransaction } from "@happyvertical/smrt-core";
4
4
  import { TenantScoped, getTenantId, tenantId, withTenant } from "@happyvertical/smrt-tenancy";
5
5
  //#region src/attendance/correction-models.ts
@@ -1243,4 +1243,4 @@ var AttendanceCorrectionService = class {
1243
1243
  //#endregion
1244
1244
  export { continueSegment as a, openSegment as c, validateAttendanceWork as d, ATTENDANCE_CORRECTION_KINDS as f, closeOpenSegment as i, replaceSegment as l, AttendanceCorrectionCollection as m, AttendanceService as n, endSegment as o, AttendanceCorrection as p, beginSegment as r, listSegments as s, AttendanceCorrectionService as t, AttendanceConflict as u };
1245
1245
 
1246
- //# sourceMappingURL=attendance-DGVy-iHI.js.map
1246
+ //# sourceMappingURL=attendance-DJNytMTN.js.map