@things-factory/work-shift 10.1.248 → 10.1.249

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 (87) hide show
  1. package/dist-client/bootstrap.d.ts +1 -0
  2. package/dist-client/bootstrap.js +6 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +0 -0
  5. package/dist-client/index.js +2 -0
  6. package/dist-client/index.js.map +1 -0
  7. package/dist-client/pages/work-shift.d.ts +105 -0
  8. package/dist-client/pages/work-shift.js +1144 -0
  9. package/dist-client/pages/work-shift.js.map +1 -0
  10. package/dist-client/route.d.ts +1 -0
  11. package/dist-client/route.js +8 -0
  12. package/dist-client/route.js.map +1 -0
  13. package/dist-client/shift-coverage.d.ts +102 -0
  14. package/dist-client/shift-coverage.js +196 -0
  15. package/dist-client/shift-coverage.js.map +1 -0
  16. package/dist-client/shift-editing.d.ts +80 -0
  17. package/dist-client/shift-editing.js +212 -0
  18. package/dist-client/shift-editing.js.map +1 -0
  19. package/dist-client/shift-revisions.d.ts +73 -0
  20. package/dist-client/shift-revisions.js +64 -0
  21. package/dist-client/shift-revisions.js.map +1 -0
  22. package/dist-client/tsconfig.tsbuildinfo +1 -0
  23. package/dist-server/controllers/index.d.ts +2 -0
  24. package/dist-server/controllers/index.js +6 -0
  25. package/dist-server/controllers/index.js.map +1 -0
  26. package/dist-server/controllers/work-shift-range.d.ts +28 -0
  27. package/dist-server/controllers/work-shift-range.js +65 -0
  28. package/dist-server/controllers/work-shift-range.js.map +1 -0
  29. package/dist-server/controllers/work-shift-schedule.d.ts +5 -0
  30. package/dist-server/controllers/work-shift-schedule.js +60 -0
  31. package/dist-server/controllers/work-shift-schedule.js.map +1 -0
  32. package/dist-server/index.d.ts +2 -0
  33. package/dist-server/index.js +19 -0
  34. package/dist-server/index.js.map +1 -0
  35. package/dist-server/service/index.d.ts +13 -0
  36. package/dist-server/service/index.js +33 -0
  37. package/dist-server/service/index.js.map +1 -0
  38. package/dist-server/service/work-shift/days-of-week.d.ts +30 -0
  39. package/dist-server/service/work-shift/days-of-week.js +74 -0
  40. package/dist-server/service/work-shift/days-of-week.js.map +1 -0
  41. package/dist-server/service/work-shift/index.d.ts +9 -0
  42. package/dist-server/service/work-shift/index.js +20 -0
  43. package/dist-server/service/work-shift/index.js.map +1 -0
  44. package/dist-server/service/work-shift/shift-occurrence.d.ts +19 -0
  45. package/dist-server/service/work-shift/shift-occurrence.js +34 -0
  46. package/dist-server/service/work-shift/shift-occurrence.js.map +1 -0
  47. package/dist-server/service/work-shift/work-shift-arrangement.d.ts +10 -0
  48. package/dist-server/service/work-shift/work-shift-arrangement.js +40 -0
  49. package/dist-server/service/work-shift/work-shift-arrangement.js.map +1 -0
  50. package/dist-server/service/work-shift/work-shift-baseline.d.ts +23 -0
  51. package/dist-server/service/work-shift/work-shift-baseline.js +55 -0
  52. package/dist-server/service/work-shift/work-shift-baseline.js.map +1 -0
  53. package/dist-server/service/work-shift/work-shift-change-approval.d.ts +14 -0
  54. package/dist-server/service/work-shift/work-shift-change-approval.js +64 -0
  55. package/dist-server/service/work-shift/work-shift-change-approval.js.map +1 -0
  56. package/dist-server/service/work-shift/work-shift-content.d.ts +18 -0
  57. package/dist-server/service/work-shift/work-shift-content.js +62 -0
  58. package/dist-server/service/work-shift/work-shift-content.js.map +1 -0
  59. package/dist-server/service/work-shift/work-shift-lifecycle-resolver.d.ts +68 -0
  60. package/dist-server/service/work-shift/work-shift-lifecycle-resolver.js +89 -0
  61. package/dist-server/service/work-shift/work-shift-lifecycle-resolver.js.map +1 -0
  62. package/dist-server/service/work-shift/work-shift-lifecycle.d.ts +229 -0
  63. package/dist-server/service/work-shift/work-shift-lifecycle.js +672 -0
  64. package/dist-server/service/work-shift/work-shift-lifecycle.js.map +1 -0
  65. package/dist-server/service/work-shift/work-shift-mutation.d.ts +16 -0
  66. package/dist-server/service/work-shift/work-shift-mutation.js +77 -0
  67. package/dist-server/service/work-shift/work-shift-mutation.js.map +1 -0
  68. package/dist-server/service/work-shift/work-shift-query.d.ts +14 -0
  69. package/dist-server/service/work-shift/work-shift-query.js +116 -0
  70. package/dist-server/service/work-shift/work-shift-query.js.map +1 -0
  71. package/dist-server/service/work-shift/work-shift-revision-service.d.ts +32 -0
  72. package/dist-server/service/work-shift/work-shift-revision-service.js +89 -0
  73. package/dist-server/service/work-shift/work-shift-revision-service.js.map +1 -0
  74. package/dist-server/service/work-shift/work-shift-revision.d.ts +85 -0
  75. package/dist-server/service/work-shift/work-shift-revision.js +337 -0
  76. package/dist-server/service/work-shift/work-shift-revision.js.map +1 -0
  77. package/dist-server/service/work-shift/work-shift-selection.d.ts +50 -0
  78. package/dist-server/service/work-shift/work-shift-selection.js +65 -0
  79. package/dist-server/service/work-shift/work-shift-selection.js.map +1 -0
  80. package/dist-server/service/work-shift/work-shift-type.d.ts +26 -0
  81. package/dist-server/service/work-shift/work-shift-type.js +77 -0
  82. package/dist-server/service/work-shift/work-shift-type.js.map +1 -0
  83. package/dist-server/service/work-shift/work-shift.d.ts +56 -0
  84. package/dist-server/service/work-shift/work-shift.js +109 -0
  85. package/dist-server/service/work-shift/work-shift.js.map +1 -0
  86. package/dist-server/tsconfig.tsbuildinfo +1 -0
  87. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-shift-content.js","sourceRoot":"","sources":["../../../server/service/work-shift/work-shift-content.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\nimport { Refusal } from '@things-factory/shell'\nimport type { WorkShift } from './work-shift'\n\nexport interface ShiftDefinition {\n name: string\n description?: string\n fromDate: number\n fromTime: string\n toDate: number\n toTime: string\n daysOfWeek: string\n}\nfunction invalid(detail: string): never { throw new Refusal('INVALID_SHIFT_CONTENT', {}, detail) }\nconst clock = (value: unknown) => {\n if (typeof value !== 'string' || !/^([01]\\d|2[0-3]):[0-5]\\d(:00)?$/.test(value)) invalid('Use HH:mm with minute precision.')\n return String(value).slice(0, 5)\n}\nconst minutes = (value: string) => Number(value.slice(0, 2)) * 60 + Number(value.slice(3))\n\n/** Weekdays refer to the work date, including shifts starting the previous/next day. */\nexport function shiftDraftContent(input: any, stored = false) {\n if (!input || typeof input !== 'object' || (!stored && Object.keys(input).some(k => !['description','timezone','shifts','effectiveFrom','reason'].includes(k)))) invalid('Unexpected shift arrangement fields.')\n if (typeof input.timezone !== 'string' || !moment.tz.zone(input.timezone)) invalid('Choose an IANA time zone.')\n if (!Array.isArray(input.shifts) || !input.shifts.length || input.shifts.length > 64) invalid('Provide between 1 and 64 shifts.')\n const names = new Set<string>(), windows: { from: number; to: number; name: string }[] = []\n const shifts: ShiftDefinition[] = input.shifts.map((row: any) => {\n if (!row || Object.keys(row).some(k => !['name','description','fromDate','fromTime','toDate','toTime','daysOfWeek'].includes(k))) invalid('Unexpected shift fields.')\n const name = typeof row.name === 'string' ? row.name.trim() : ''\n if (!name || name.length > 128 || names.has(name)) invalid('Shift names must be nonempty and unique within the arrangement.')\n names.add(name)\n if (![-1,0,1].includes(row.fromDate) || ![-1,0,1].includes(row.toDate)) invalid('Date offsets must be -1, 0 or 1.')\n const fromTime = clock(row.fromTime), toTime = clock(row.toTime)\n const from = row.fromDate * 1440 + minutes(fromTime), to = row.toDate * 1440 + minutes(toTime)\n if (to <= from || to - from > 1440) invalid('A shift must end after it starts and last at most 24 hours.')\n const said = row.daysOfWeek ?? ''\n if (typeof said !== 'string' || (said !== '' && !/^[0-6](,[0-6])*$/.test(said))) invalid('Weekdays must be a list of 0 (Sunday) through 6 (Saturday).')\n const days = said === '' ? [0,1,2,3,4,5,6] : [...new Set(said.split(',').map(Number))].sort()\n for (const day of days) for (const week of [-1,0,1]) windows.push({ from: from + day * 1440 + week * 10080, to: to + day * 1440 + week * 10080, name })\n if (row.description != null && typeof row.description !== 'string') invalid('Shift description must be text.')\n return { name, description: row.description ?? '', fromDate: row.fromDate, fromTime, toDate: row.toDate, toTime, daysOfWeek: days.length === 7 ? '' : days.join(',') }\n }).sort((a: ShiftDefinition,b: ShiftDefinition) => a.fromDate - b.fromDate || a.fromTime.localeCompare(b.fromTime) || a.name.localeCompare(b.name))\n windows.sort((a,b) => a.from - b.from)\n for (let i = 1; i < windows.length; i++) if (windows[i].from < windows[i-1].to) invalid(`Shifts overlap: ${windows[i-1].name}, ${windows[i].name}.`)\n if (input.description != null && typeof input.description !== 'string') invalid('Arrangement description must be text.')\n return { description: input.description ?? null, timezone: input.timezone as string, shifts }\n}\n\n/** Every field affecting execution belongs to the signed arrangement. */\nexport function shiftSetOf(shifts: Partial<WorkShift>[]): Record<string, unknown>[] {\n return shifts.map(s => ({ name: s.name, description: s.description ?? '', fromDate: s.fromDate,\n fromTime: s.fromTime, toDate: s.toDate, toTime: s.toTime, daysOfWeek: s.daysOfWeek ?? '' }))\n .sort((a,b) => a.fromDate - b.fromDate || a.fromTime.localeCompare(b.fromTime))\n}\n"]}
@@ -0,0 +1,68 @@
1
+ import { WorkShiftArrangement } from './work-shift-arrangement';
2
+ export declare class WorkShiftLifecycleResolver {
3
+ workShiftRevisionOverview(context: ResolverContext): Promise<{
4
+ approvalRequired: boolean;
5
+ timezone: string;
6
+ legacyShifts?: Record<string, unknown>[];
7
+ arrangementId: string;
8
+ name: string;
9
+ generation: number;
10
+ at: string;
11
+ schedule: {
12
+ state: string;
13
+ id: string;
14
+ domain: import("@things-factory/shell").Domain;
15
+ domainId: string;
16
+ arrangement: WorkShiftArrangement;
17
+ arrangementId: string;
18
+ plan: import("./work-shift-revision").WorkShiftPlan;
19
+ planId: string;
20
+ revision: import("./work-shift-revision").WorkShiftRevision;
21
+ revisionId: string;
22
+ validFrom: Date;
23
+ validTo: Date | null;
24
+ }[];
25
+ revisions: {
26
+ state: string;
27
+ releaseKind: import("@things-factory/ops-master").ReleaseKind;
28
+ revisionNumber: number;
29
+ policy: import("@things-factory/ops-master").MasterChangePolicy;
30
+ policyId: string;
31
+ id: string;
32
+ domain: import("@things-factory/shell").Domain;
33
+ domainId: string;
34
+ arrangement: WorkShiftArrangement;
35
+ arrangementId: string;
36
+ baseRevision: import("./work-shift-revision").WorkShiftRevision | null;
37
+ baseRevisionId: string | null;
38
+ baseGeneration: number;
39
+ editGeneration: number;
40
+ description: string | null;
41
+ timezone: string;
42
+ shifts: import("./work-shift-content").ShiftDefinition[];
43
+ effectiveFrom: Date;
44
+ reason: string;
45
+ creator: import("@things-factory/auth-base").User | null;
46
+ creatorId: string | null;
47
+ createdAt: Date;
48
+ frozenAt: Date | null;
49
+ contentHash: string | null;
50
+ activityInstanceId: string | null;
51
+ }[];
52
+ } | {
53
+ approvalRequired: boolean;
54
+ timezone: string;
55
+ legacyShifts?: Record<string, unknown>[];
56
+ revisions: any[];
57
+ schedule: any[];
58
+ generation: number;
59
+ }>;
60
+ createWorkShiftDraft(content: any, context: ResolverContext): Promise<import("./work-shift-revision").WorkShiftRevision>;
61
+ editWorkShiftDraft(id: string, generation: number, content: any, context: ResolverContext): Promise<import("./work-shift-revision").WorkShiftRevision>;
62
+ publishWorkShiftDraft(id: string, generation: number, context: ResolverContext): Promise<import("./work-shift-revision").WorkShiftPlan>;
63
+ /** 비규제 사업장의 저장 한 번 — 초안과 발행이 한 트랜잭션이다. 승인제면 거절되고 아무것도 안 남는다. */
64
+ saveAndPublishWorkShift(content: any, revisionId: string, editGeneration: number, context: ResolverContext): Promise<{
65
+ revision: import("./work-shift-revision").WorkShiftRevision;
66
+ plan: import("./work-shift-revision").WorkShiftPlan;
67
+ }>;
68
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkShiftLifecycleResolver = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const work_shift_arrangement_1 = require("./work-shift-arrangement");
8
+ const work_shift_lifecycle_1 = require("./work-shift-lifecycle");
9
+ let WorkShiftLifecycleResolver = class WorkShiftLifecycleResolver {
10
+ async workShiftRevisionOverview(context) {
11
+ return (0, work_shift_lifecycle_1.workShiftOverviewFor)((0, shell_1.getRepository)(work_shift_arrangement_1.WorkShiftArrangement).manager, context.state.domain);
12
+ }
13
+ async createWorkShiftDraft(content, context) {
14
+ const { tx, domain, user } = context.state;
15
+ return (0, work_shift_lifecycle_1.createWorkShiftDraft)(tx, domain.id, user.id, { content });
16
+ }
17
+ async editWorkShiftDraft(id, generation, content, context) {
18
+ const { tx, domain, user } = context.state;
19
+ return (0, work_shift_lifecycle_1.editWorkShiftDraft)(tx, domain.id, user.id, id, generation, content);
20
+ }
21
+ async publishWorkShiftDraft(id, generation, context) {
22
+ const { tx, domain, user } = context.state;
23
+ return (0, work_shift_lifecycle_1.publishUnregulatedWorkShift)(tx, domain.id, user.id, id, generation);
24
+ }
25
+ /** 비규제 사업장의 저장 한 번 — 초안과 발행이 한 트랜잭션이다. 승인제면 거절되고 아무것도 안 남는다. */
26
+ async saveAndPublishWorkShift(content, revisionId, editGeneration, context) {
27
+ const { tx, domain, user } = context.state;
28
+ return (0, work_shift_lifecycle_1.saveAndPublishWorkShift)(tx, domain.id, user.id, { content, revisionId, editGeneration });
29
+ }
30
+ };
31
+ exports.WorkShiftLifecycleResolver = WorkShiftLifecycleResolver;
32
+ tslib_1.__decorate([
33
+ (0, type_graphql_1.Directive)('@privilege(category: "work-shift", privilege: "query", domainOwnerGranted: true)'),
34
+ (0, type_graphql_1.Query)(() => shell_1.ScalarObject),
35
+ tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
36
+ tslib_1.__metadata("design:type", Function),
37
+ tslib_1.__metadata("design:paramtypes", [Object]),
38
+ tslib_1.__metadata("design:returntype", Promise)
39
+ ], WorkShiftLifecycleResolver.prototype, "workShiftRevisionOverview", null);
40
+ tslib_1.__decorate([
41
+ (0, type_graphql_1.Directive)('@privilege(category: "work-shift", privilege: "mutation", domainOwnerGranted: true)'),
42
+ (0, type_graphql_1.Directive)('@transaction'),
43
+ (0, type_graphql_1.Mutation)(() => shell_1.ScalarObject),
44
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('content', () => shell_1.ScalarObject)),
45
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
46
+ tslib_1.__metadata("design:type", Function),
47
+ tslib_1.__metadata("design:paramtypes", [Object, Object]),
48
+ tslib_1.__metadata("design:returntype", Promise)
49
+ ], WorkShiftLifecycleResolver.prototype, "createWorkShiftDraft", null);
50
+ tslib_1.__decorate([
51
+ (0, type_graphql_1.Directive)('@privilege(category: "work-shift", privilege: "mutation", domainOwnerGranted: true)'),
52
+ (0, type_graphql_1.Directive)('@transaction'),
53
+ (0, type_graphql_1.Mutation)(() => shell_1.ScalarObject),
54
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('revisionId')),
55
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('editGeneration', () => type_graphql_1.Int)),
56
+ tslib_1.__param(2, (0, type_graphql_1.Arg)('content', () => shell_1.ScalarObject)),
57
+ tslib_1.__param(3, (0, type_graphql_1.Ctx)()),
58
+ tslib_1.__metadata("design:type", Function),
59
+ tslib_1.__metadata("design:paramtypes", [String, Number, Object, Object]),
60
+ tslib_1.__metadata("design:returntype", Promise)
61
+ ], WorkShiftLifecycleResolver.prototype, "editWorkShiftDraft", null);
62
+ tslib_1.__decorate([
63
+ (0, type_graphql_1.Directive)('@privilege(category: "work-shift", privilege: "mutation", domainOwnerGranted: true)'),
64
+ (0, type_graphql_1.Directive)('@transaction'),
65
+ (0, type_graphql_1.Mutation)(() => shell_1.ScalarObject),
66
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('revisionId')),
67
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('editGeneration', () => type_graphql_1.Int)),
68
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
69
+ tslib_1.__metadata("design:type", Function),
70
+ tslib_1.__metadata("design:paramtypes", [String, Number, Object]),
71
+ tslib_1.__metadata("design:returntype", Promise)
72
+ ], WorkShiftLifecycleResolver.prototype, "publishWorkShiftDraft", null);
73
+ tslib_1.__decorate([
74
+ (0, type_graphql_1.Directive)('@privilege(category: "work-shift", privilege: "mutation", domainOwnerGranted: true)'),
75
+ (0, type_graphql_1.Directive)('@transaction'),
76
+ (0, type_graphql_1.Mutation)(() => shell_1.ScalarObject),
77
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('content', () => shell_1.ScalarObject)),
78
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('revisionId', () => String, { nullable: true })),
79
+ tslib_1.__param(2, (0, type_graphql_1.Arg)('editGeneration', () => type_graphql_1.Int, { nullable: true })),
80
+ tslib_1.__param(3, (0, type_graphql_1.Ctx)()),
81
+ tslib_1.__metadata("design:type", Function),
82
+ tslib_1.__metadata("design:paramtypes", [Object, String, Number, Object]),
83
+ tslib_1.__metadata("design:returntype", Promise)
84
+ ], WorkShiftLifecycleResolver.prototype, "saveAndPublishWorkShift", null);
85
+ exports.WorkShiftLifecycleResolver = WorkShiftLifecycleResolver = tslib_1.__decorate([
86
+ (0, type_graphql_1.Resolver)(),
87
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
88
+ ], WorkShiftLifecycleResolver);
89
+ //# sourceMappingURL=work-shift-lifecycle-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-shift-lifecycle-resolver.js","sourceRoot":"","sources":["../../../server/service/work-shift/work-shift-lifecycle-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Int, Mutation, Query, Resolver, UseMiddleware } from 'type-graphql'\nimport { getRepository, ScalarObject, SpeakRefusals } from '@things-factory/shell'\nimport { WorkShiftArrangement } from './work-shift-arrangement'\nimport { createWorkShiftDraft, editWorkShiftDraft, publishUnregulatedWorkShift, saveAndPublishWorkShift, workShiftOverviewFor } from './work-shift-lifecycle'\n\n@Resolver()\n@UseMiddleware(SpeakRefusals)\nexport class WorkShiftLifecycleResolver {\n @Directive('@privilege(category: \"work-shift\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(() => ScalarObject)\n async workShiftRevisionOverview(@Ctx() context: ResolverContext) {\n return workShiftOverviewFor(getRepository(WorkShiftArrangement).manager, context.state.domain)\n }\n @Directive('@privilege(category: \"work-shift\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(() => ScalarObject)\n async createWorkShiftDraft(@Arg('content', () => ScalarObject) content: any, @Ctx() context: ResolverContext) {\n const { tx, domain, user } = context.state\n return createWorkShiftDraft(tx, domain.id, user.id, { content })\n }\n @Directive('@privilege(category: \"work-shift\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(() => ScalarObject)\n async editWorkShiftDraft(@Arg('revisionId') id: string, @Arg('editGeneration', () => Int) generation: number,\n @Arg('content', () => ScalarObject) content: any, @Ctx() context: ResolverContext) {\n const { tx, domain, user } = context.state\n return editWorkShiftDraft(tx, domain.id, user.id, id, generation, content)\n }\n @Directive('@privilege(category: \"work-shift\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(() => ScalarObject)\n async publishWorkShiftDraft(@Arg('revisionId') id: string, @Arg('editGeneration', () => Int) generation: number, @Ctx() context: ResolverContext) {\n const { tx, domain, user } = context.state\n return publishUnregulatedWorkShift(tx, domain.id, user.id, id, generation)\n }\n\n /** 비규제 사업장의 저장 한 번 — 초안과 발행이 한 트랜잭션이다. 승인제면 거절되고 아무것도 안 남는다. */\n @Directive('@privilege(category: \"work-shift\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(() => ScalarObject)\n async saveAndPublishWorkShift(\n @Arg('content', () => ScalarObject) content: any,\n @Arg('revisionId', () => String, { nullable: true }) revisionId: string,\n @Arg('editGeneration', () => Int, { nullable: true }) editGeneration: number,\n @Ctx() context: ResolverContext\n ) {\n const { tx, domain, user } = context.state\n return saveAndPublishWorkShift(tx, domain.id, user.id, { content, revisionId, editGeneration })\n }\n}\n"]}
@@ -0,0 +1,229 @@
1
+ import { EntityManager } from 'typeorm';
2
+ import { Domain, Refusal } from '@things-factory/shell';
3
+ import { WorkShiftArrangement } from './work-shift-arrangement';
4
+ import { WorkShiftBasis, WorkShiftPlan, WorkShiftRevision, WorkShiftSegment } from './work-shift-revision';
5
+ export declare class WorkShiftRefusal extends Refusal {
6
+ constructor(code: string, detail?: string);
7
+ }
8
+ export declare function workShiftSubmissionHash(revision: WorkShiftRevision): string;
9
+ /** Display values are a checked projection of the frozen revision, never a second editable source. */
10
+ export declare function workShiftApprovalInput(manager: EntityManager, domainId: string, revisionId: string): Promise<{
11
+ headline: string;
12
+ reason: string;
13
+ effectiveFrom: string;
14
+ before: {
15
+ revisionNumber: number;
16
+ detail: {
17
+ validFrom?: string;
18
+ validTo?: string;
19
+ releaseKind?: "policy" | "approved" | "baseline";
20
+ revisionId: string;
21
+ createdAt: string;
22
+ frozenAt: string;
23
+ effectiveFrom: string;
24
+ reason: string;
25
+ };
26
+ description: string;
27
+ timezone: string;
28
+ shifts: import("./work-shift-content").ShiftDefinition[];
29
+ };
30
+ after: {
31
+ revisionNumber: number;
32
+ detail: {
33
+ validFrom?: string;
34
+ validTo?: string;
35
+ releaseKind?: "policy" | "approved" | "baseline";
36
+ revisionId: string;
37
+ createdAt: string;
38
+ frozenAt: string;
39
+ effectiveFrom: string;
40
+ reason: string;
41
+ };
42
+ description: string;
43
+ timezone: string;
44
+ shifts: import("./work-shift-content").ShiftDefinition[];
45
+ };
46
+ revision: {
47
+ revisionId: string;
48
+ hash: string;
49
+ arrangementId: string;
50
+ baseGeneration: number;
51
+ };
52
+ }>;
53
+ export declare function assertWorkShiftApprovalInput(manager: EntityManager, domainId: string, input: Record<string, unknown>): Promise<void>;
54
+ export interface WorkShiftDraftContent {
55
+ description?: string;
56
+ timezone: string;
57
+ shifts: import('./work-shift-content').ShiftDefinition[];
58
+ effectiveFrom: Date | string;
59
+ reason: string;
60
+ }
61
+ export declare function createWorkShiftDraft(manager: EntityManager, domainId: string, creatorId: string, asked: {
62
+ arrangementId?: string;
63
+ name?: string;
64
+ baseRevisionId?: string;
65
+ content: WorkShiftDraftContent;
66
+ }): Promise<WorkShiftRevision>;
67
+ export declare function editWorkShiftDraft(manager: EntityManager, domainId: string, actorId: string, revisionId: string, expectedEditGeneration: number, input: WorkShiftDraftContent): Promise<WorkShiftRevision>;
68
+ /** Product calls this in the same transaction as issuing its worklist approval. */
69
+ export declare function freezeWorkShiftDraft(manager: EntityManager, domainId: string, actorId: string, revisionId: string, expectedEditGeneration: number): Promise<WorkShiftRevision>;
70
+ export declare function bindWorkShiftApproval(manager: EntityManager, domainId: string, revisionId: string, activityInstanceId: string): Promise<void>;
71
+ /** Internal completion callback only. Never expose this as an approved=true mutation. */
72
+ export declare function publishWorkShiftRevision(manager: EntityManager, domainId: string, revisionId: string, decision: {
73
+ activityInstanceId: string;
74
+ approverId: string;
75
+ submissionHash: string;
76
+ }): Promise<WorkShiftPlan>;
77
+ export declare function publishUnregulatedWorkShift(manager: EntityManager, domainId: string, actorId: string, revisionId: string, editGeneration: number): Promise<WorkShiftPlan>;
78
+ export declare function resolveWorkShift(manager: EntityManager, domainId: string, arrangementId: string, businessTime: Date | string, knownAt?: Date | string): Promise<{
79
+ revision: WorkShiftRevision;
80
+ plan: WorkShiftPlan;
81
+ segment: WorkShiftSegment;
82
+ }>;
83
+ /**
84
+ * **편성 개정본이 하나도 없는 사업장**에 지금 서 있는 교대 행들을 첫 개정본으로 적는다 — 기준선
85
+ * (2026-09-24, ops-master `standMasterBaselines` 와 같은 판정). 개정 체계 전부터 있던 교대(`work_shifts`)는
86
+ * 편성으로 한 번도 올라간 적이 없어서, 교대 조회가 빈 목록을 답하고 실적이 교대 없이 적혔다.
87
+ *
88
+ * - 교대 행 전부가 한 벌이다(편성은 사업장마다 하나). 값은 행 그대로, 시간대는 사업장의 것이다.
89
+ * 사업장에 시간대가 없거나 그 벌이 편성 검사를 못 지나면 세우지 않고 까닭을 말한다 — 지어내지 않는다.
90
+ * - 결재 없음 · 발행 종류 `baseline` · 작성자와 발행자는 비고 버전이 사유에 남는다. 유효 시작은 세운 시각.
91
+ * - 편성 개정본이 하나라도 있으면 손대지 않는다. 둘이 동시에 돌면 편성의 도메인 유니크 · 개정 번호
92
+ * 유니크 · 세대 조건부 갱신이 둘째를 물린다.
93
+ */
94
+ export declare function standWorkShiftBaseline(manager: EntityManager, domainId: string, at: Date, edition: string): Promise<{
95
+ stood: number;
96
+ unreadable: {
97
+ name: string;
98
+ problem: string;
99
+ }[];
100
+ }>;
101
+ /** Replay reads verify the captured digest too, not only the currently effective schedule. */
102
+ export declare function workShiftRevisionForBasis(manager: EntityManager, domainId: string, basis: WorkShiftBasis): Promise<WorkShiftRevision>;
103
+ /** Must run inside the transaction that writes the business record. */
104
+ export declare function captureWorkShiftBasis(manager: EntityManager, domainId: string, arrangementId: string, recordKey: string, businessTime: Date | string): Promise<WorkShiftBasis>;
105
+ export declare function workShiftRevisionOverview(manager: EntityManager, domainId: string, arrangementId: string, at?: Date): Promise<{
106
+ arrangementId: string;
107
+ name: string;
108
+ generation: number;
109
+ at: string;
110
+ schedule: {
111
+ state: string;
112
+ id: string;
113
+ domain: Domain;
114
+ domainId: string;
115
+ arrangement: WorkShiftArrangement;
116
+ arrangementId: string;
117
+ plan: WorkShiftPlan;
118
+ planId: string;
119
+ revision: WorkShiftRevision;
120
+ revisionId: string;
121
+ validFrom: Date;
122
+ validTo: Date | null;
123
+ }[];
124
+ revisions: {
125
+ state: string;
126
+ releaseKind: import("@things-factory/ops-master").ReleaseKind;
127
+ revisionNumber: number;
128
+ policy: import("@things-factory/ops-master").MasterChangePolicy;
129
+ policyId: string;
130
+ id: string;
131
+ domain: Domain;
132
+ domainId: string;
133
+ arrangement: WorkShiftArrangement;
134
+ arrangementId: string;
135
+ baseRevision: WorkShiftRevision | null;
136
+ baseRevisionId: string | null;
137
+ baseGeneration: number;
138
+ editGeneration: number;
139
+ description: string | null;
140
+ timezone: string;
141
+ shifts: import("./work-shift-content").ShiftDefinition[];
142
+ effectiveFrom: Date;
143
+ reason: string;
144
+ creator: import("@things-factory/auth-base").User | null;
145
+ creatorId: string | null;
146
+ createdAt: Date;
147
+ frozenAt: Date | null;
148
+ contentHash: string | null;
149
+ activityInstanceId: string | null;
150
+ }[];
151
+ }>;
152
+ /**
153
+ * 교대 화면이 여는 것. **읽기만 한다** — 정책 줄이 없으면 기본값으로 답하고 줄을 세우지 않는다(2026-09-24).
154
+ * 앞서는 `masterChangePolicy` 로 줄을 세우려다 트랜잭션 밖이라 거절했고, 정책 줄이 없는 사업장은 화면이 안
155
+ * 열렸다. 기준선이 못 선 사업장은 줄이 끝내 안 생기므로 그 사업장을 고칠 화면이 영영 안 열렸다.
156
+ */
157
+ export declare function workShiftOverviewFor(manager: EntityManager, domain: Domain): Promise<{
158
+ approvalRequired: boolean;
159
+ timezone: string;
160
+ legacyShifts?: Record<string, unknown>[];
161
+ arrangementId: string;
162
+ name: string;
163
+ generation: number;
164
+ at: string;
165
+ schedule: {
166
+ state: string;
167
+ id: string;
168
+ domain: Domain;
169
+ domainId: string;
170
+ arrangement: WorkShiftArrangement;
171
+ arrangementId: string;
172
+ plan: WorkShiftPlan;
173
+ planId: string;
174
+ revision: WorkShiftRevision;
175
+ revisionId: string;
176
+ validFrom: Date;
177
+ validTo: Date | null;
178
+ }[];
179
+ revisions: {
180
+ state: string;
181
+ releaseKind: import("@things-factory/ops-master").ReleaseKind;
182
+ revisionNumber: number;
183
+ policy: import("@things-factory/ops-master").MasterChangePolicy;
184
+ policyId: string;
185
+ id: string;
186
+ domain: Domain;
187
+ domainId: string;
188
+ arrangement: WorkShiftArrangement;
189
+ arrangementId: string;
190
+ baseRevision: WorkShiftRevision | null;
191
+ baseRevisionId: string | null;
192
+ baseGeneration: number;
193
+ editGeneration: number;
194
+ description: string | null;
195
+ timezone: string;
196
+ shifts: import("./work-shift-content").ShiftDefinition[];
197
+ effectiveFrom: Date;
198
+ reason: string;
199
+ creator: import("@things-factory/auth-base").User | null;
200
+ creatorId: string | null;
201
+ createdAt: Date;
202
+ frozenAt: Date | null;
203
+ contentHash: string | null;
204
+ activityInstanceId: string | null;
205
+ }[];
206
+ } | {
207
+ approvalRequired: boolean;
208
+ timezone: string;
209
+ legacyShifts?: Record<string, unknown>[];
210
+ revisions: any[];
211
+ schedule: any[];
212
+ generation: number;
213
+ }>;
214
+ /**
215
+ * **비규제 사업장의 「저장」 한 번** — 초안을 만들고 바로 발행한다, 한 트랜잭션에서(ADR-0086 09-22 보탬).
216
+ * 비규제면 사람이 누를 것은 저장 하나다. 두 걸음(초안 저장 → 발행)이 구조상 필연인 것처럼 보이게 하지 않는다.
217
+ * 이 축이 승인제면 발행이 `MASTER_APPROVAL_REQUIRED` 로 거절되고, 같은 트랜잭션이라 초안도 함께 물러난다 —
218
+ * 반쯤 저장된 것이 남지 않는다. 개정본 · 적용계획 · 구간은 두 걸음 때와 똑같이 선다.
219
+ */
220
+ export declare function saveAndPublishWorkShift(manager: EntityManager, domainId: string, actorId: string, asked: {
221
+ arrangementId?: string;
222
+ baseRevisionId?: string;
223
+ content: WorkShiftDraftContent;
224
+ revisionId?: string;
225
+ editGeneration?: number;
226
+ }): Promise<{
227
+ revision: WorkShiftRevision;
228
+ plan: WorkShiftPlan;
229
+ }>;