@things-factory/worklist 10.1.29 → 10.1.31

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 (64) hide show
  1. package/dist-client/pages/work-door/door-words.d.ts +41 -0
  2. package/dist-client/pages/work-door/door-words.js +54 -0
  3. package/dist-client/pages/work-door/door-words.js.map +1 -0
  4. package/dist-client/pages/work-door/work-doors-page.d.ts +37 -0
  5. package/dist-client/pages/work-door/work-doors-page.js +369 -0
  6. package/dist-client/pages/work-door/work-doors-page.js.map +1 -0
  7. package/dist-client/route.d.ts +1 -1
  8. package/dist-client/route.js +3 -0
  9. package/dist-client/route.js.map +1 -1
  10. package/dist-client/tsconfig.tsbuildinfo +1 -1
  11. package/dist-server/service/activity/index.d.ts +1 -1
  12. package/dist-server/service/activity-instance/index.d.ts +1 -1
  13. package/dist-server/service/activity-template/index.d.ts +1 -1
  14. package/dist-server/service/activity-thread/index.d.ts +1 -1
  15. package/dist-server/service/index.d.ts +3 -3
  16. package/dist-server/service/index.js +5 -2
  17. package/dist-server/service/index.js.map +1 -1
  18. package/dist-server/service/work-door/activity-lookup.d.ts +70 -0
  19. package/dist-server/service/work-door/activity-lookup.js +110 -0
  20. package/dist-server/service/work-door/activity-lookup.js.map +1 -0
  21. package/dist-server/service/work-door/approval-line-standing.d.ts +92 -0
  22. package/dist-server/service/work-door/approval-line-standing.js +47 -0
  23. package/dist-server/service/work-door/approval-line-standing.js.map +1 -0
  24. package/dist-server/service/work-door/index.d.ts +15 -0
  25. package/dist-server/service/work-door/index.js +20 -0
  26. package/dist-server/service/work-door/index.js.map +1 -0
  27. package/dist-server/service/work-door/pass-work-door.d.ts +74 -0
  28. package/dist-server/service/work-door/pass-work-door.js +45 -0
  29. package/dist-server/service/work-door/pass-work-door.js.map +1 -0
  30. package/dist-server/service/work-door/work-door-declaration.d.ts +114 -0
  31. package/dist-server/service/work-door/work-door-declaration.js +67 -0
  32. package/dist-server/service/work-door/work-door-declaration.js.map +1 -0
  33. package/dist-server/service/work-door/work-door-event.d.ts +20 -0
  34. package/dist-server/service/work-door/work-door-event.js +25 -0
  35. package/dist-server/service/work-door/work-door-event.js.map +1 -0
  36. package/dist-server/service/work-door/work-door-journal-service.d.ts +47 -0
  37. package/dist-server/service/work-door/work-door-journal-service.js +75 -0
  38. package/dist-server/service/work-door/work-door-journal-service.js.map +1 -0
  39. package/dist-server/service/work-door/work-door-journal.d.ts +30 -0
  40. package/dist-server/service/work-door/work-door-journal.js +94 -0
  41. package/dist-server/service/work-door/work-door-journal.js.map +1 -0
  42. package/dist-server/service/work-door/work-door-not-used.d.ts +39 -0
  43. package/dist-server/service/work-door/work-door-not-used.js +86 -0
  44. package/dist-server/service/work-door/work-door-not-used.js.map +1 -0
  45. package/dist-server/service/work-door/work-door-resolver.d.ts +29 -0
  46. package/dist-server/service/work-door/work-door-resolver.js +127 -0
  47. package/dist-server/service/work-door/work-door-resolver.js.map +1 -0
  48. package/dist-server/service/work-door/work-door-service.d.ts +29 -0
  49. package/dist-server/service/work-door/work-door-service.js +126 -0
  50. package/dist-server/service/work-door/work-door-service.js.map +1 -0
  51. package/dist-server/service/work-door/work-door-type.d.ts +49 -0
  52. package/dist-server/service/work-door/work-door-type.js +122 -0
  53. package/dist-server/service/work-door/work-door-type.js.map +1 -0
  54. package/dist-server/service/work-door/work-door.d.ts +138 -0
  55. package/dist-server/service/work-door/work-door.js +156 -0
  56. package/dist-server/service/work-door/work-door.js.map +1 -0
  57. package/dist-server/tsconfig.tsbuildinfo +1 -1
  58. package/package.json +10 -10
  59. package/tests/pass-work-door.test.ts +133 -0
  60. package/translations/en.json +12 -1
  61. package/translations/ja.json +12 -1
  62. package/translations/ko.json +12 -1
  63. package/translations/ms.json +12 -1
  64. package/translations/zh.json +12 -1
@@ -5,5 +5,5 @@ import { ActivityQuery } from "./activity-query.js";
5
5
  import { ActivityHistoryEntitySubscriber } from "./event-subscriber.js";
6
6
  import { ActivityDeclarationGuardSubscriber } from "./declaration-guard-subscriber.js";
7
7
  export declare const entities: (typeof Activity | typeof ActivityHistory)[];
8
- export declare const resolvers: (typeof ActivityMutation | typeof ActivityQuery)[];
8
+ export declare const resolvers: (typeof ActivityQuery | typeof ActivityMutation)[];
9
9
  export declare const subscribers: (typeof ActivityHistoryEntitySubscriber | typeof ActivityDeclarationGuardSubscriber)[];
@@ -6,5 +6,5 @@ import { ActivityInstanceHistoryQuery } from "./activity-instance-history-query.
6
6
  import { ActivityInstanceSubscription } from "./activity-instance-subscription.js";
7
7
  import { ActivityInstanceHistoryEntitySubscriber, ActivityInstanceSubscriber } from "./event-subscriber.js";
8
8
  export declare const entities: (typeof ActivityInstance | typeof ActivityInstanceHistory)[];
9
- export declare const resolvers: (typeof ActivityInstanceMutation | typeof ActivityInstanceQuery | typeof ActivityInstanceHistoryQuery | typeof ActivityInstanceSubscription)[];
9
+ export declare const resolvers: (typeof ActivityInstanceQuery | typeof ActivityInstanceMutation | typeof ActivityInstanceSubscription | typeof ActivityInstanceHistoryQuery)[];
10
10
  export declare const subscribers: (typeof ActivityInstanceSubscriber | typeof ActivityInstanceHistoryEntitySubscriber)[];
@@ -4,5 +4,5 @@ import { ActivityTemplateMutation } from "./activity-template-mutation.js";
4
4
  import { ActivityTemplateQuery } from "./activity-template-query.js";
5
5
  import { ActivityTemplateHistoryEntitySubscriber } from "./event-subscriber.js";
6
6
  export declare const entities: (typeof ActivityTemplate | typeof ActivityTemplateHistory)[];
7
- export declare const resolvers: (typeof ActivityTemplateMutation | typeof ActivityTemplateQuery)[];
7
+ export declare const resolvers: (typeof ActivityTemplateQuery | typeof ActivityTemplateMutation)[];
8
8
  export declare const subscribers: (typeof ActivityTemplateHistoryEntitySubscriber)[];
@@ -6,5 +6,5 @@ import { ActivityThreadHistoryQuery } from "./activity-thread-history-query.js";
6
6
  import { ActivityThreadSubscription } from "./activity-thread-subscription.js";
7
7
  import { ActivityThreadHistoryEntitySubscriber, ActivityThreadSubscriber } from "./event-subscriber.js";
8
8
  export declare const entities: (typeof ActivityThread | typeof ActivityThreadHistory)[];
9
- export declare const resolvers: (typeof ActivityThreadMutation | typeof ActivityThreadQuery | typeof ActivityThreadHistoryQuery | typeof ActivityThreadSubscription)[];
9
+ export declare const resolvers: (typeof ActivityThreadQuery | typeof ActivityThreadHistoryQuery | typeof ActivityThreadMutation | typeof ActivityThreadSubscription)[];
10
10
  export declare const subscribers: (typeof ActivityThreadSubscriber | typeof ActivityThreadHistoryEntitySubscriber)[];
@@ -5,8 +5,8 @@ export * from './activity-instance/activity-instance.js';
5
5
  export * from './activity/activity.js';
6
6
  export * from './installable-activity/installable-activity.js';
7
7
  export * from './activity-summary/activity-summary.js';
8
- export declare const entities: (typeof import("./activity/activity.js").Activity | typeof import("./activity-approval/activity-approval.js").ActivityApproval | typeof import("./activity-thread/activity-thread.js").ActivityThread | typeof import("./activity-instance/activity-instance.js").ActivityInstance | typeof import("./installable-activity/installable-activity.js").InstallableActivity | typeof import("./activity-template/activity-template.js").ActivityTemplate | typeof import("./activity-summary/activity-summary.js").ActivitySummary | typeof import("./activity/activity-history.js").ActivityHistory | typeof import("./activity-instance/activity-instance-history.js").ActivityInstanceHistory | typeof import("./activity-template/activity-template-history.js").ActivityTemplateHistory | typeof import("./activity-thread/activity-thread-history.js").ActivityThreadHistory)[];
9
- export declare const subscribers: (typeof import("./activity-approval/event-subscriber.js").ActivityApprovalSubscriber | typeof import("./activity/event-subscriber.js").ActivityHistoryEntitySubscriber | typeof import("./activity/declaration-guard-subscriber.js").ActivityDeclarationGuardSubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceSubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceHistoryEntitySubscriber | typeof import("./activity-thread/event-subscriber.js").ActivityThreadSubscriber | typeof import("./activity-thread/event-subscriber.js").ActivityThreadHistoryEntitySubscriber)[];
8
+ export declare const entities: (typeof import("./work-door/work-door-not-used.js").WorkDoorNotUsed | typeof import("./work-door/work-door-journal.js").WorkDoorJournal | typeof import("./activity-approval/activity-approval.js").ActivityApproval | typeof import("./activity/activity.js").Activity | typeof import("./activity/activity-history.js").ActivityHistory | typeof import("./activity-instance/activity-instance.js").ActivityInstance | typeof import("./activity-instance/activity-instance-history.js").ActivityInstanceHistory | typeof import("./activity-template/activity-template.js").ActivityTemplate | typeof import("./activity-template/activity-template-history.js").ActivityTemplateHistory | typeof import("./activity-thread/activity-thread.js").ActivityThread | typeof import("./activity-thread/activity-thread-history.js").ActivityThreadHistory | typeof import("./installable-activity/installable-activity.js").InstallableActivity | typeof import("./activity-summary/activity-summary.js").ActivitySummary)[];
9
+ export declare const subscribers: (typeof import("./activity-approval/event-subscriber.js").ActivityApprovalSubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceSubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceHistoryEntitySubscriber | typeof import("./activity/event-subscriber.js").ActivityHistoryEntitySubscriber | typeof import("./activity/declaration-guard-subscriber.js").ActivityDeclarationGuardSubscriber | typeof import("./activity-thread/event-subscriber.js").ActivityThreadSubscriber | typeof import("./activity-thread/event-subscriber.js").ActivityThreadHistoryEntitySubscriber)[];
10
10
  export declare const schema: {
11
- resolverClasses: (typeof import("./activity-stats/activity-stats-query.js").ActivityStatsQuery | typeof import("./activity-approval/activity-approval-query.js").ActivityApprovalQuery | typeof import("./activity-approval/activity-approval-mutation.js").ActivityApprovalMutation | typeof import("./activity-approval/activity-approval-subscription.js").ActivityApprovalSubscription | typeof import("./activity/activity-mutation.js").ActivityMutation | typeof import("./activity/activity-query.js").ActivityQuery | typeof import("./activity-instance/activity-instance-mutation.js").ActivityInstanceMutation | typeof import("./activity-instance/activity-instance-query.js").ActivityInstanceQuery | typeof import("./activity-instance/activity-instance-history-query.js").ActivityInstanceHistoryQuery | typeof import("./activity-instance/activity-instance-subscription.js").ActivityInstanceSubscription | typeof import("./activity-template/activity-template-mutation.js").ActivityTemplateMutation | typeof import("./activity-template/activity-template-query.js").ActivityTemplateQuery | typeof import("./activity-thread/activity-thread-mutation.js").ActivityThreadMutation | typeof import("./activity-thread/activity-thread-query.js").ActivityThreadQuery | typeof import("./activity-thread/activity-thread-history-query.js").ActivityThreadHistoryQuery | typeof import("./activity-thread/activity-thread-subscription.js").ActivityThreadSubscription | typeof import("./installable-activity/installable-activity-query.js").InstallableActivityQuery | typeof import("./installable-activity/installable-activity-mutation.js").InstallableActivityMutation | typeof import("./activity-summary/activity-summary-query.js").ActivitySummaryQuery)[];
11
+ resolverClasses: (typeof import("./work-door/work-door-resolver.js").WorkDoorResolver | typeof import("./activity-stats/activity-stats-query.js").ActivityStatsQuery | typeof import("./activity-approval/activity-approval-query.js").ActivityApprovalQuery | typeof import("./activity-approval/activity-approval-mutation.js").ActivityApprovalMutation | typeof import("./activity-approval/activity-approval-subscription.js").ActivityApprovalSubscription | typeof import("./activity/activity-query.js").ActivityQuery | typeof import("./activity/activity-mutation.js").ActivityMutation | typeof import("./activity-instance/activity-instance-query.js").ActivityInstanceQuery | typeof import("./activity-instance/activity-instance-mutation.js").ActivityInstanceMutation | typeof import("./activity-instance/activity-instance-subscription.js").ActivityInstanceSubscription | typeof import("./activity-instance/activity-instance-history-query.js").ActivityInstanceHistoryQuery | typeof import("./activity-template/activity-template-query.js").ActivityTemplateQuery | typeof import("./activity-template/activity-template-mutation.js").ActivityTemplateMutation | typeof import("./activity-thread/activity-thread-query.js").ActivityThreadQuery | typeof import("./activity-thread/activity-thread-history-query.js").ActivityThreadHistoryQuery | typeof import("./activity-thread/activity-thread-mutation.js").ActivityThreadMutation | typeof import("./activity-thread/activity-thread-subscription.js").ActivityThreadSubscription | typeof import("./installable-activity/installable-activity-query.js").InstallableActivityQuery | typeof import("./installable-activity/installable-activity-mutation.js").InstallableActivityMutation | typeof import("./activity-summary/activity-summary-query.js").ActivitySummaryQuery)[];
12
12
  };
@@ -19,6 +19,7 @@ const index_js_5 = require("./activity-template/index.js");
19
19
  const index_js_6 = require("./activity-thread/index.js");
20
20
  const index_js_7 = require("./installable-activity/index.js");
21
21
  const index_js_8 = require("./activity-summary/index.js");
22
+ const index_js_9 = require("./work-door/index.js");
22
23
  exports.entities = [
23
24
  /* ENTITIES */
24
25
  ...index_js_2.entities,
@@ -27,7 +28,8 @@ exports.entities = [
27
28
  ...index_js_5.entities,
28
29
  ...index_js_6.entities,
29
30
  ...index_js_7.entities,
30
- ...index_js_8.entities
31
+ ...index_js_8.entities,
32
+ ...index_js_9.entities
31
33
  ];
32
34
  exports.subscribers = [
33
35
  /* SUBSCRIBERS */
@@ -46,7 +48,8 @@ exports.schema = {
46
48
  ...index_js_5.resolvers,
47
49
  ...index_js_6.resolvers,
48
50
  ...index_js_7.resolvers,
49
- ...index_js_8.resolvers
51
+ ...index_js_8.resolvers,
52
+ ...index_js_9.resolvers
50
53
  ]
51
54
  };
52
55
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,mFAAwD;AACxD,+EAAoD;AACpD,mFAAwD;AACxD,mFAAwD;AACxD,iEAAsC;AACtC,yFAA8D;AAC9D,iFAAsD;AAEtD,mCAAmC;AACnC,wDAA+E;AAC/E,2DAIqC;AACrC,kDAI4B;AAC5B,2DAIqC;AACrC,2DAGqC;AACrC,yDAImC;AACnC,8DAGwC;AACxC,0DAAwH;AAE3G,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,mBAAwB;IAC3B,GAAG,mBAAgB;IACnB,GAAG,mBAAwB;IAC3B,GAAG,mBAAwB;IAC3B,GAAG,mBAAsB;IACzB,GAAG,mBAA2B;IAC9B,GAAG,mBAAuB;CAC3B,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,iBAAiB;IACjB,GAAG,sBAA2B;IAC9B,GAAG,sBAA2B;IAC9B,GAAG,sBAAmB;IACtB,GAAG,sBAAyB;CAC7B,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,oBAAsB;QACzB,GAAG,oBAAyB;QAC5B,GAAG,oBAAiB;QACpB,GAAG,oBAAyB;QAC5B,GAAG,oBAAyB;QAC5B,GAAG,oBAAuB;QAC1B,GAAG,oBAA4B;QAC/B,GAAG,oBAAwB;KAC5B;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './activity-approval/activity-approval.js'\nexport * from './activity-thread/activity-thread.js'\nexport * from './activity-template/activity-template.js'\nexport * from './activity-instance/activity-instance.js'\nexport * from './activity/activity.js'\nexport * from './installable-activity/installable-activity.js'\nexport * from './activity-summary/activity-summary.js'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { resolvers as ActivityStatsResolvers } from './activity-stats/index.js'\nimport {\n entities as ActivityApprovalEntities,\n resolvers as ActivityApprovalResolvers,\n subscribers as ActivityApprovalSubscribers\n} from './activity-approval/index.js'\nimport {\n entities as ActivityEntities,\n resolvers as ActivityResolvers,\n subscribers as ActivitySubscribers\n} from './activity/index.js'\nimport {\n entities as ActivityInstanceEntities,\n resolvers as ActivityInstanceResolvers,\n subscribers as ActivityInstanceSubscribers\n} from './activity-instance/index.js'\nimport {\n entities as ActivityTemplateEntities,\n resolvers as ActivityTemplateResolvers\n} from './activity-template/index.js'\nimport {\n entities as ActivityThreadEntities,\n resolvers as ActivityThreadResolvers,\n subscribers as ActivityThreadSubscribers\n} from './activity-thread/index.js'\nimport {\n entities as InstallableActivityEntities,\n resolvers as InstallableActivityResolvers\n} from './installable-activity/index.js'\nimport { entities as ActivitySummaryEntities, resolvers as ActivitySummaryResolvers } from './activity-summary/index.js'\n\nexport const entities = [\n /* ENTITIES */\n ...ActivityApprovalEntities,\n ...ActivityEntities,\n ...ActivityInstanceEntities,\n ...ActivityTemplateEntities,\n ...ActivityThreadEntities,\n ...InstallableActivityEntities,\n ...ActivitySummaryEntities\n]\n\nexport const subscribers = [\n /* SUBSCRIBERS */\n ...ActivityApprovalSubscribers,\n ...ActivityInstanceSubscribers,\n ...ActivitySubscribers,\n ...ActivityThreadSubscribers\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...ActivityStatsResolvers,\n ...ActivityApprovalResolvers,\n ...ActivityResolvers,\n ...ActivityInstanceResolvers,\n ...ActivityTemplateResolvers,\n ...ActivityThreadResolvers,\n ...InstallableActivityResolvers,\n ...ActivitySummaryResolvers\n ]\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,mFAAwD;AACxD,+EAAoD;AACpD,mFAAwD;AACxD,mFAAwD;AACxD,iEAAsC;AACtC,yFAA8D;AAC9D,iFAAsD;AAEtD,mCAAmC;AACnC,wDAA+E;AAC/E,2DAIqC;AACrC,kDAI4B;AAC5B,2DAIqC;AACrC,2DAGqC;AACrC,yDAImC;AACnC,8DAGwC;AACxC,0DAAwH;AACxH,mDAAmG;AAEtF,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,mBAAwB;IAC3B,GAAG,mBAAgB;IACnB,GAAG,mBAAwB;IAC3B,GAAG,mBAAwB;IAC3B,GAAG,mBAAsB;IACzB,GAAG,mBAA2B;IAC9B,GAAG,mBAAuB;IAC1B,GAAG,mBAAgB;CACpB,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,iBAAiB;IACjB,GAAG,sBAA2B;IAC9B,GAAG,sBAA2B;IAC9B,GAAG,sBAAmB;IACtB,GAAG,sBAAyB;CAC7B,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,oBAAsB;QACzB,GAAG,oBAAyB;QAC5B,GAAG,oBAAiB;QACpB,GAAG,oBAAyB;QAC5B,GAAG,oBAAyB;QAC5B,GAAG,oBAAuB;QAC1B,GAAG,oBAA4B;QAC/B,GAAG,oBAAwB;QAC3B,GAAG,oBAAiB;KACrB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './activity-approval/activity-approval.js'\nexport * from './activity-thread/activity-thread.js'\nexport * from './activity-template/activity-template.js'\nexport * from './activity-instance/activity-instance.js'\nexport * from './activity/activity.js'\nexport * from './installable-activity/installable-activity.js'\nexport * from './activity-summary/activity-summary.js'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { resolvers as ActivityStatsResolvers } from './activity-stats/index.js'\nimport {\n entities as ActivityApprovalEntities,\n resolvers as ActivityApprovalResolvers,\n subscribers as ActivityApprovalSubscribers\n} from './activity-approval/index.js'\nimport {\n entities as ActivityEntities,\n resolvers as ActivityResolvers,\n subscribers as ActivitySubscribers\n} from './activity/index.js'\nimport {\n entities as ActivityInstanceEntities,\n resolvers as ActivityInstanceResolvers,\n subscribers as ActivityInstanceSubscribers\n} from './activity-instance/index.js'\nimport {\n entities as ActivityTemplateEntities,\n resolvers as ActivityTemplateResolvers\n} from './activity-template/index.js'\nimport {\n entities as ActivityThreadEntities,\n resolvers as ActivityThreadResolvers,\n subscribers as ActivityThreadSubscribers\n} from './activity-thread/index.js'\nimport {\n entities as InstallableActivityEntities,\n resolvers as InstallableActivityResolvers\n} from './installable-activity/index.js'\nimport { entities as ActivitySummaryEntities, resolvers as ActivitySummaryResolvers } from './activity-summary/index.js'\nimport { entities as WorkDoorEntities, resolvers as WorkDoorResolvers } from './work-door/index.js'\n\nexport const entities = [\n /* ENTITIES */\n ...ActivityApprovalEntities,\n ...ActivityEntities,\n ...ActivityInstanceEntities,\n ...ActivityTemplateEntities,\n ...ActivityThreadEntities,\n ...InstallableActivityEntities,\n ...ActivitySummaryEntities,\n ...WorkDoorEntities\n]\n\nexport const subscribers = [\n /* SUBSCRIBERS */\n ...ActivityApprovalSubscribers,\n ...ActivityInstanceSubscribers,\n ...ActivitySubscribers,\n ...ActivityThreadSubscribers\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...ActivityStatsResolvers,\n ...ActivityApprovalResolvers,\n ...ActivityResolvers,\n ...ActivityInstanceResolvers,\n ...ActivityTemplateResolvers,\n ...ActivityThreadResolvers,\n ...InstallableActivityResolvers,\n ...ActivitySummaryResolvers,\n ...WorkDoorResolvers\n ]\n}\n"]}
@@ -0,0 +1,70 @@
1
+ import { EntityManager } from 'typeorm';
2
+ import { Activity } from '../activity/activity.js';
3
+ import { ApprovalLineStanding, ApprovalSeatReader } from './approval-line-standing.js';
4
+ /**
5
+ * 이 도메인에 선 결재 양식을 이름으로 찾는다 — **규칙을 한 군데 둔다.**
6
+ *
7
+ * ── 두 모양으로 낸다 ───────────────────────────────────────────────────────
8
+ * `activityNamedIn` 은 `manager` 를 받고, `activityNamed` 는 컨텍스트에서 꺼내 그것을 부른다.
9
+ * 질의에는 `tx` 가 없기 때문이다(§`activityNamed`).
10
+ *
11
+ * ── 왜 부모까지 보나 ───────────────────────────────────────────────────────
12
+ * 결재 양식을 본사에서 정하고 공장이 쓰는 것이 정상이다(`dataset` 의 `issueOocResolve` 와 같은 규율).
13
+ * 그래서 이 도메인에 없으면 부모에서 찾고, **가까운 도메인의 것이 이긴다** — 공장이 자기 것을 두면
14
+ * 그것이 본사 것을 덮는다.
15
+ *
16
+ * ── 왜 파일이 따로 있나 ────────────────────────────────────────────────────
17
+ * 처분 승인 안에 사적으로 있던 함수다. 정비 완료 확인이 같은 읽기를 하게 되면서 두 벌이 될 자리였고,
18
+ * 이 패키지는 그 값을 이미 치렀다 — 아웃박스와 `erp_postings` 가 같은 기계를 다른 모양으로 들고
19
+ * 있어서 한쪽에서 고친 넷이 다른 쪽에 없다(2026-09-08).
20
+ */
21
+ export declare function activityNamedIn(manager: EntityManager, domain: {
22
+ id: string;
23
+ parentId?: string;
24
+ }, name: string): Promise<Activity | undefined>;
25
+ /**
26
+ * 컨텍스트에서 부르는 자리 — **`tx` 가 없을 수 있다.**
27
+ *
28
+ * `tx` 는 `@Directive('@transaction')` 이 붙은 뮤테이션에만 실린다. 질의에서 그대로 쓰면
29
+ * `Cannot read properties of undefined (reading 'getRepository')` 가 난다 — 처분 승인이 뮤테이션에서만
30
+ * 부르고 있어서 안 드러났고, 정비 쪽 질의에서 부르자 그날 터졌다(2026-09-09).
31
+ *
32
+ * 트랜잭션이 있으면 그것으로 읽는다 — 같은 트랜잭션 안에서 결재선을 보고 상신해야, 보고 나서 내기까지
33
+ * 사이에 누가 결재선을 비우는 것을 막을 수 있다.
34
+ */
35
+ export declare function activityNamed(name: string, context: ResolverContext): Promise<Activity | undefined>;
36
+ /**
37
+ * 이 양식의 결재선이 **차 있나** — 양식이 서 있는 것 · 결재선이 있는 것 · 그 결재선이 도는 것은 셋 다
38
+ * 다르다.
39
+ *
40
+ * 양식은 제품이 기동할 때 세우고, 결재선은 그 공장이 채운다. 그래서 「양식이 있다」로는 이 공장이 그
41
+ * 단계를 쓰기로 했는지 알 수 없다. **결재선이 찬 것이 그 공장의 선언이다.**
42
+ *
43
+ * 비어 있는 것을 결재로 읽으면 안 되는 이유는 워크리스트의 거동이다 — **결재선이 비면 상신이 곧
44
+ * 완료가 되어, 올린 사람이 자기 건을 승인한 것이 된다.**
45
+ *
46
+ * ── 줄 수만 세면 「쓸 때 터지는」 결재선이 통과한다 ───────────────────────
47
+ * 역할을 지목해 놓고 그 역할에 사람이 하나도 없으면, 줄 수는 있는데 결재자는 없다. 문 현황은 「섰다」로
48
+ * 그리고 상신하는 순간 워크리스트 `create-approval` 이 `approver is not set` 으로 던진다. 그래서
49
+ * **사람이 있는지까지 읽는다**(§`approval-line-standing`, ADR-0047 ③).
50
+ *
51
+ * 판단은 순수 모듈에 있고 여기서는 읽기만 한다 — 지목된 역할만 골라 한 번에 읽는다.
52
+ */
53
+ export declare function approvalLineStandingIn(manager: EntityManager, activity?: {
54
+ approvalLine?: unknown[];
55
+ } | null): Promise<ApprovalLineStanding>;
56
+ /** 컨텍스트에서 부르는 자리 — `tx` 가 있으면 그것으로 읽는다(§`activityNamed`). */
57
+ export declare function approvalLineStanding(activity: {
58
+ approvalLine?: unknown[];
59
+ } | null | undefined, context: ResolverContext): Promise<ApprovalLineStanding>;
60
+ /**
61
+ * 결재선의 자리를 사람으로 풀어 보는 포트 — **한 번 읽은 것은 다시 안 묻는다.**
62
+ *
63
+ * 결재선 대부분이 공장장으로 끝난다. 문 열일곱을 한 화면에서 판정할 때 같은 역할을 열일곱 번 묻지
64
+ * 않게, 포트 하나가 자기가 읽은 것을 기억한다. 포트는 **한 판정 동안만** 산다 — 더 오래 살면 역할에
65
+ * 사람을 넣은 직후에도 옛 답을 내놓는다(ADR-0047 ③).
66
+ *
67
+ * 읽는 방식은 **워크리스트가 상신할 때 푸는 방식 그대로**다(`controllers/common.js`). 다르게 읽으면
68
+ * 여기서는 「찼다」인데 거기서는 못 푸는 자리가 생긴다 — 이 정의를 고친 이유가 바로 그것이다.
69
+ */
70
+ export declare function seatReader(manager: EntityManager): ApprovalSeatReader;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.activityNamedIn = activityNamedIn;
4
+ exports.activityNamed = activityNamed;
5
+ exports.approvalLineStandingIn = approvalLineStandingIn;
6
+ exports.approvalLineStanding = approvalLineStanding;
7
+ exports.seatReader = seatReader;
8
+ const typeorm_1 = require("typeorm");
9
+ const shell_1 = require("@things-factory/shell");
10
+ const auth_base_1 = require("@things-factory/auth-base");
11
+ const organization_1 = require("@things-factory/organization");
12
+ const activity_js_1 = require("../activity/activity.js");
13
+ const approval_line_standing_js_1 = require("./approval-line-standing.js");
14
+ /**
15
+ * 이 도메인에 선 결재 양식을 이름으로 찾는다 — **규칙을 한 군데 둔다.**
16
+ *
17
+ * ── 두 모양으로 낸다 ───────────────────────────────────────────────────────
18
+ * `activityNamedIn` 은 `manager` 를 받고, `activityNamed` 는 컨텍스트에서 꺼내 그것을 부른다.
19
+ * 질의에는 `tx` 가 없기 때문이다(§`activityNamed`).
20
+ *
21
+ * ── 왜 부모까지 보나 ───────────────────────────────────────────────────────
22
+ * 결재 양식을 본사에서 정하고 공장이 쓰는 것이 정상이다(`dataset` 의 `issueOocResolve` 와 같은 규율).
23
+ * 그래서 이 도메인에 없으면 부모에서 찾고, **가까운 도메인의 것이 이긴다** — 공장이 자기 것을 두면
24
+ * 그것이 본사 것을 덮는다.
25
+ *
26
+ * ── 왜 파일이 따로 있나 ────────────────────────────────────────────────────
27
+ * 처분 승인 안에 사적으로 있던 함수다. 정비 완료 확인이 같은 읽기를 하게 되면서 두 벌이 될 자리였고,
28
+ * 이 패키지는 그 값을 이미 치렀다 — 아웃박스와 `erp_postings` 가 같은 기계를 다른 모양으로 들고
29
+ * 있어서 한쪽에서 고친 넷이 다른 쪽에 없다(2026-09-08).
30
+ */
31
+ async function activityNamedIn(manager, domain, name) {
32
+ const domainIds = domain.parentId ? [domain.id, domain.parentId] : [domain.id];
33
+ const candidates = await manager.find(activity_js_1.Activity, {
34
+ where: { domain: { id: (0, typeorm_1.In)(domainIds) }, name }
35
+ });
36
+ return [...candidates].sort((a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId))[0];
37
+ }
38
+ /**
39
+ * 컨텍스트에서 부르는 자리 — **`tx` 가 없을 수 있다.**
40
+ *
41
+ * `tx` 는 `@Directive('@transaction')` 이 붙은 뮤테이션에만 실린다. 질의에서 그대로 쓰면
42
+ * `Cannot read properties of undefined (reading 'getRepository')` 가 난다 — 처분 승인이 뮤테이션에서만
43
+ * 부르고 있어서 안 드러났고, 정비 쪽 질의에서 부르자 그날 터졌다(2026-09-09).
44
+ *
45
+ * 트랜잭션이 있으면 그것으로 읽는다 — 같은 트랜잭션 안에서 결재선을 보고 상신해야, 보고 나서 내기까지
46
+ * 사이에 누가 결재선을 비우는 것을 막을 수 있다.
47
+ */
48
+ async function activityNamed(name, context) {
49
+ const { domain, tx } = context.state;
50
+ return await activityNamedIn(tx ?? (0, shell_1.getRepository)(activity_js_1.Activity).manager, domain, name);
51
+ }
52
+ /**
53
+ * 이 양식의 결재선이 **차 있나** — 양식이 서 있는 것 · 결재선이 있는 것 · 그 결재선이 도는 것은 셋 다
54
+ * 다르다.
55
+ *
56
+ * 양식은 제품이 기동할 때 세우고, 결재선은 그 공장이 채운다. 그래서 「양식이 있다」로는 이 공장이 그
57
+ * 단계를 쓰기로 했는지 알 수 없다. **결재선이 찬 것이 그 공장의 선언이다.**
58
+ *
59
+ * 비어 있는 것을 결재로 읽으면 안 되는 이유는 워크리스트의 거동이다 — **결재선이 비면 상신이 곧
60
+ * 완료가 되어, 올린 사람이 자기 건을 승인한 것이 된다.**
61
+ *
62
+ * ── 줄 수만 세면 「쓸 때 터지는」 결재선이 통과한다 ───────────────────────
63
+ * 역할을 지목해 놓고 그 역할에 사람이 하나도 없으면, 줄 수는 있는데 결재자는 없다. 문 현황은 「섰다」로
64
+ * 그리고 상신하는 순간 워크리스트 `create-approval` 이 `approver is not set` 으로 던진다. 그래서
65
+ * **사람이 있는지까지 읽는다**(§`approval-line-standing`, ADR-0047 ③).
66
+ *
67
+ * 판단은 순수 모듈에 있고 여기서는 읽기만 한다 — 지목된 역할만 골라 한 번에 읽는다.
68
+ */
69
+ async function approvalLineStandingIn(manager, activity) {
70
+ return await (0, approval_line_standing_js_1.judgeApprovalLine)(activity?.approvalLine, seatReader(manager));
71
+ }
72
+ /** 컨텍스트에서 부르는 자리 — `tx` 가 있으면 그것으로 읽는다(§`activityNamed`). */
73
+ async function approvalLineStanding(activity, context) {
74
+ return await approvalLineStandingIn(context.state.tx ?? (0, shell_1.getRepository)(activity_js_1.Activity).manager, activity);
75
+ }
76
+ /**
77
+ * 결재선의 자리를 사람으로 풀어 보는 포트 — **한 번 읽은 것은 다시 안 묻는다.**
78
+ *
79
+ * 결재선 대부분이 공장장으로 끝난다. 문 열일곱을 한 화면에서 판정할 때 같은 역할을 열일곱 번 묻지
80
+ * 않게, 포트 하나가 자기가 읽은 것을 기억한다. 포트는 **한 판정 동안만** 산다 — 더 오래 살면 역할에
81
+ * 사람을 넣은 직후에도 옛 답을 내놓는다(ADR-0047 ③).
82
+ *
83
+ * 읽는 방식은 **워크리스트가 상신할 때 푸는 방식 그대로**다(`controllers/common.js`). 다르게 읽으면
84
+ * 여기서는 「찼다」인데 거기서는 못 푸는 자리가 생긴다 — 이 정의를 고친 이유가 바로 그것이다.
85
+ */
86
+ function seatReader(manager) {
87
+ const roles = new Map();
88
+ const people = new Map();
89
+ const remember = async (known, key, read) => {
90
+ const held = known.get(key);
91
+ if (held !== undefined) {
92
+ return held;
93
+ }
94
+ const found = await read();
95
+ known.set(key, found);
96
+ return found;
97
+ };
98
+ return {
99
+ roleHasMembers: (roleId) => remember(roles, roleId, async () => {
100
+ const role = await manager.findOne(auth_base_1.Role, { where: { id: roleId }, relations: ['users'] });
101
+ return !!role?.users?.length;
102
+ }),
103
+ /* 사람 지목은 **계정까지** 있어야 풀린다 — 워크리스트가 `employee.user` 를 쓴다. */
104
+ personIsHere: (personId) => remember(people, personId, async () => {
105
+ const employee = await manager.findOne(organization_1.Employee, { where: { id: personId }, relations: ['user'] });
106
+ return !!employee?.user;
107
+ })
108
+ };
109
+ }
110
+ //# sourceMappingURL=activity-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-lookup.js","sourceRoot":"","sources":["../../../server/service/work-door/activity-lookup.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { getRepository } from '@things-factory/shell'\nimport { Role } from '@things-factory/auth-base'\nimport { Employee } from '@things-factory/organization'\nimport { Activity } from '../activity/activity.js'\n\nimport { ApprovalLineStanding, ApprovalSeatReader, judgeApprovalLine } from './approval-line-standing.js'\n\n/**\n * 이 도메인에 선 결재 양식을 이름으로 찾는다 — **규칙을 한 군데 둔다.**\n *\n * ── 두 모양으로 낸다 ───────────────────────────────────────────────────────\n * `activityNamedIn` 은 `manager` 를 받고, `activityNamed` 는 컨텍스트에서 꺼내 그것을 부른다.\n * 질의에는 `tx` 가 없기 때문이다(§`activityNamed`).\n *\n * ── 왜 부모까지 보나 ───────────────────────────────────────────────────────\n * 결재 양식을 본사에서 정하고 공장이 쓰는 것이 정상이다(`dataset` 의 `issueOocResolve` 와 같은 규율).\n * 그래서 이 도메인에 없으면 부모에서 찾고, **가까운 도메인의 것이 이긴다** — 공장이 자기 것을 두면\n * 그것이 본사 것을 덮는다.\n *\n * ── 왜 파일이 따로 있나 ────────────────────────────────────────────────────\n * 처분 승인 안에 사적으로 있던 함수다. 정비 완료 확인이 같은 읽기를 하게 되면서 두 벌이 될 자리였고,\n * 이 패키지는 그 값을 이미 치렀다 — 아웃박스와 `erp_postings` 가 같은 기계를 다른 모양으로 들고\n * 있어서 한쪽에서 고친 넷이 다른 쪽에 없다(2026-09-08).\n */\nexport async function activityNamedIn(\n manager: EntityManager,\n domain: { id: string; parentId?: string },\n name: string\n): Promise<Activity | undefined> {\n const domainIds = domain.parentId ? [domain.id, domain.parentId] : [domain.id]\n\n const candidates = await manager.find(Activity, {\n where: { domain: { id: In(domainIds) }, name }\n })\n\n return [...candidates].sort((a, b) => domainIds.indexOf(a.domainId) - domainIds.indexOf(b.domainId))[0]\n}\n\n/**\n * 컨텍스트에서 부르는 자리 — **`tx` 가 없을 수 있다.**\n *\n * `tx` 는 `@Directive('@transaction')` 이 붙은 뮤테이션에만 실린다. 질의에서 그대로 쓰면\n * `Cannot read properties of undefined (reading 'getRepository')` 가 난다 — 처분 승인이 뮤테이션에서만\n * 부르고 있어서 안 드러났고, 정비 쪽 질의에서 부르자 그날 터졌다(2026-09-09).\n *\n * 트랜잭션이 있으면 그것으로 읽는다 — 같은 트랜잭션 안에서 결재선을 보고 상신해야, 보고 나서 내기까지\n * 사이에 누가 결재선을 비우는 것을 막을 수 있다.\n */\nexport async function activityNamed(name: string, context: ResolverContext): Promise<Activity | undefined> {\n const { domain, tx } = context.state\n\n return await activityNamedIn(tx ?? getRepository(Activity).manager, domain, name)\n}\n\n/**\n * 이 양식의 결재선이 **차 있나** — 양식이 서 있는 것 · 결재선이 있는 것 · 그 결재선이 도는 것은 셋 다\n * 다르다.\n *\n * 양식은 제품이 기동할 때 세우고, 결재선은 그 공장이 채운다. 그래서 「양식이 있다」로는 이 공장이 그\n * 단계를 쓰기로 했는지 알 수 없다. **결재선이 찬 것이 그 공장의 선언이다.**\n *\n * 비어 있는 것을 결재로 읽으면 안 되는 이유는 워크리스트의 거동이다 — **결재선이 비면 상신이 곧\n * 완료가 되어, 올린 사람이 자기 건을 승인한 것이 된다.**\n *\n * ── 줄 수만 세면 「쓸 때 터지는」 결재선이 통과한다 ───────────────────────\n * 역할을 지목해 놓고 그 역할에 사람이 하나도 없으면, 줄 수는 있는데 결재자는 없다. 문 현황은 「섰다」로\n * 그리고 상신하는 순간 워크리스트 `create-approval` 이 `approver is not set` 으로 던진다. 그래서\n * **사람이 있는지까지 읽는다**(§`approval-line-standing`, ADR-0047 ③).\n *\n * 판단은 순수 모듈에 있고 여기서는 읽기만 한다 — 지목된 역할만 골라 한 번에 읽는다.\n */\nexport async function approvalLineStandingIn(\n manager: EntityManager,\n activity?: { approvalLine?: unknown[] } | null\n): Promise<ApprovalLineStanding> {\n return await judgeApprovalLine(\n activity?.approvalLine as Parameters<typeof judgeApprovalLine>[0],\n seatReader(manager)\n )\n}\n\n/** 컨텍스트에서 부르는 자리 — `tx` 가 있으면 그것으로 읽는다(§`activityNamed`). */\nexport async function approvalLineStanding(\n activity: { approvalLine?: unknown[] } | null | undefined,\n context: ResolverContext\n): Promise<ApprovalLineStanding> {\n return await approvalLineStandingIn(context.state.tx ?? getRepository(Activity).manager, activity)\n}\n\n/**\n * 결재선의 자리를 사람으로 풀어 보는 포트 — **한 번 읽은 것은 다시 안 묻는다.**\n *\n * 결재선 대부분이 공장장으로 끝난다. 문 열일곱을 한 화면에서 판정할 때 같은 역할을 열일곱 번 묻지\n * 않게, 포트 하나가 자기가 읽은 것을 기억한다. 포트는 **한 판정 동안만** 산다 — 더 오래 살면 역할에\n * 사람을 넣은 직후에도 옛 답을 내놓는다(ADR-0047 ③).\n *\n * 읽는 방식은 **워크리스트가 상신할 때 푸는 방식 그대로**다(`controllers/common.js`). 다르게 읽으면\n * 여기서는 「찼다」인데 거기서는 못 푸는 자리가 생긴다 — 이 정의를 고친 이유가 바로 그것이다.\n */\nexport function seatReader(manager: EntityManager): ApprovalSeatReader {\n const roles = new Map<string, boolean>()\n const people = new Map<string, boolean>()\n\n const remember = async (known: Map<string, boolean>, key: string, read: () => Promise<boolean>) => {\n const held = known.get(key)\n\n if (held !== undefined) {\n return held\n }\n\n const found = await read()\n\n known.set(key, found)\n\n return found\n }\n\n return {\n roleHasMembers: (roleId: string) =>\n remember(roles, roleId, async () => {\n const role = await manager.findOne(Role, { where: { id: roleId }, relations: ['users'] })\n\n return !!role?.users?.length\n }),\n /* 사람 지목은 **계정까지** 있어야 풀린다 — 워크리스트가 `employee.user` 를 쓴다. */\n personIsHere: (personId: string) =>\n remember(people, personId, async () => {\n const employee = await manager.findOne(Employee, { where: { id: personId }, relations: ['user'] })\n\n return !!employee?.user\n })\n }\n}\n"]}
@@ -0,0 +1,92 @@
1
+ import { Refusal } from '@things-factory/shell';
2
+ /**
3
+ * 결재선이 **차 있나** — 순수 판단. DB 도 TypeORM 도 모른다.
4
+ *
5
+ * ═══════════════════════════════════════════════════════════════════════════
6
+ * ── 「있다」와 「찼다」가 다르다 ───────────────────────────────────────────
7
+ * 앞서는 `approvalLine?.length` 만 셌다. 그러면 **역할을 지목해 놓고 그 역할에 사람이 하나도 없는**
8
+ * 결재선이 「찼다」로 읽힌다. 문 현황 화면은 「이 문은 섰습니다」라고 그리고, 현장이 상신을 누르는
9
+ * 순간 워크리스트가 `approver is not set` 으로 던진다 — **준비됐다고 말해 놓고 쓸 때 터지는** 부류다.
10
+ *
11
+ * 실 테넌트에서 이것이 예외가 아니다. 미라텍에는 이 제품이 세운 역할이 하나도 없다
12
+ * (§`project_mes_roles_locked_behind_demo`). 역할을 지목한 결재선은 거기서 전부 빈 자리를 가리킨다.
13
+ *
14
+ * ── 불을 돌려주지 않는다. 그리고 **union 으로도 안 돌려준다** ────────────
15
+ * 막은 쪽이 이유를 말한다. `true`/`false` 하나면 화면이 「왜 안 되나」를 **다시 세게 되고**, 그러면
16
+ * 정의가 두 곳이 된다 — 이 판단을 한 곳으로 모은 이유가 없어진다.
17
+ *
18
+ * 그래서 처음에 `{ok:true} | {ok:false, code}` 로 두었는데, 이 패키지의 `server/tsconfig.json` 은
19
+ * **`strict: false`** 라 `strictNullChecks` 가 없고, 그러면 TS 가 **boolean 판별자로 union 을 안
20
+ * 좁힌다.** `if (r.ok) return` 뒤에서 `r.code` 를 읽으면 컴파일이 깨진다 — 하루에 소비자 둘이
21
+ * 연달아 걸렸고 그중 하나는 서버를 아예 못 뜨게 했다.
22
+ *
23
+ * 그래서 **한 객체에 선택 칸**이다. `if (standing.refusal)` 하나로 어디서나 읽힌다.
24
+ * [합의했다] ADR-0047 ⑤(개정)
25
+ *
26
+ * ```
27
+ * approval-line-missing 결재선 자체가 없다 누가 결재하는지를 정해야 한다
28
+ * approval-role-empty 역할은 있는데 사람이 없다 그 역할에 사람을 넣어야 한다
29
+ * approval-person-absent 지목한 사람이 여기 없다 다른 사람을 지목하거나 그 사람을 넣어야 한다
30
+ * ```
31
+ *
32
+ * 관리자가 할 일이 다르므로 코드가 셋이다.
33
+ *
34
+ * ── 참조는 세지 않는다 ───────────────────────────────────────────────────
35
+ * `participation: 'reference'` 는 의견만 내고 결재를 막지 않는다. 참조자 역할이 비었다고 거절하면
36
+ * **결재와 무관한 이유로** 막는 것이 된다. 참조만 있는 결재선은 결재 없이 끝나므로 「없다」로 읽는다.
37
+ *
38
+ * ── 읽는 것은 부르는 쪽이 넘긴다 ─────────────────────────────────────────
39
+ * 포트 하나를 받는다. 이 판단이 `manager` 를 받으면 TypeORM 을 알게 되어 순수 시험이 서지 않고,
40
+ * **어느 도메인으로 좁혔나**가 부르는 쪽에서 안 보이게 된다. 포트의 수명은 **판정 하나**다 — 더
41
+ * 오래 살면 역할에 사람을 넣은 직후에도 옛 답을 내놓는다.
42
+ *
43
+ * ── 사람을 직접 지목한 자리도 읽는다 ─────────────────────────────────────
44
+ * 「이 제품은 역할만 쓴다」로 닫지 않는다. 그렇게 두면 **없는 사람을 지목한 결재선이 「찼다」로
45
+ * 그려지고 상신 순간 터진다** — 역할에서 고친 그 모양이 사람 축으로 다시 나는 것이고, 「없음」이
46
+ * 안전하지 않은 쪽으로 기우는 것이다. 게다가 이 정의는 워크리스트의 `ApprovalLineItem` 을 읽는
47
+ * 공용 자리라, 다른 제품이 사람을 지목하는 날 조용히 틀린다.
48
+ *
49
+ * `Myself` · `MyDepartment` · `MySupervisor` 는 **상신할 때 그 사람으로 풀리는** 자리라 미리 셀 것이
50
+ * 없다. 부서 지목(`Department`)은 부서장이 있어야 풀리는데 그 코드는 아직 없다 — 지어내지 않는다.
51
+ *
52
+ * [합의했다] operato-application/adr/ADR-0047.md ③⑤
53
+ * ═══════════════════════════════════════════════════════════════════════════
54
+ */
55
+ /** 결재선 한 자리 — `ApprovalLineItem` 중 이 판단이 보는 칸만. */
56
+ export interface ApprovalSeat {
57
+ /** `OrgMemberTargetType` — 역할이면 `'Role'`. */
58
+ type?: string;
59
+ /** 역할이면 role id, 사람이면 user id. */
60
+ value?: string;
61
+ /** 비어 있으면 결재다(`ApprovalLineItem.participation` 의 규약). */
62
+ participation?: string;
63
+ }
64
+ export type ApprovalLineRefusal = 'approval-line-missing' | 'approval-role-empty' | 'approval-person-absent';
65
+ export interface ApprovalLineStanding {
66
+ /** 이 결재선이 지나는 자리 수. 안 서는 결재선이면 0. */
67
+ approvers: number;
68
+ /**
69
+ * 왜 안 서나 — **있으면 안 서는 것이다.** 없으면 선다.
70
+ *
71
+ * `params` 는 그 코드가 가리키는 것 하나다: 역할이 비었으면 그 역할, 사람이 없으면 그 사람.
72
+ */
73
+ refusal?: {
74
+ code: ApprovalLineRefusal;
75
+ params?: {
76
+ role?: string;
77
+ personId?: string;
78
+ };
79
+ };
80
+ }
81
+ /** A line that does not stand, as a refusal. The params are the one thing the code points at. */
82
+ export declare function approvalLineRefusal(refusal: NonNullable<ApprovalLineStanding['refusal']>): Refusal;
83
+ /** 결재선의 자리가 실제로 사람으로 풀리나 — 읽는 것은 부르는 쪽 일이다. */
84
+ export interface ApprovalSeatReader {
85
+ /** 그 역할에 사람이 하나 이상 있나. */
86
+ roleHasMembers(roleId: string): Promise<boolean>;
87
+ /** 지목한 그 사람이 이 공장에 있고 계정이 붙어 있나. */
88
+ personIsHere(personId: string): Promise<boolean>;
89
+ }
90
+ export declare function judgeApprovalLine(line: ApprovalSeat[] | undefined | null, reader: ApprovalSeatReader): Promise<ApprovalLineStanding>;
91
+ /** 결재선에서 **역할을 지목한 자리**의 id 들 — 부르는 쪽이 미리 읽어 둘 때 쓴다. */
92
+ export declare function rolesNamedIn(line: ApprovalSeat[] | undefined | null): string[];
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.approvalLineRefusal = approvalLineRefusal;
4
+ exports.judgeApprovalLine = judgeApprovalLine;
5
+ exports.rolesNamedIn = rolesNamedIn;
6
+ const shell_1 = require("@things-factory/shell");
7
+ const LINE_REFUSAL_ENGLISH = {
8
+ 'approval-line-missing': 'this form has no approval line. set who approves it.',
9
+ 'approval-role-empty': 'nobody holds the role {role} named in the approval line. add a person to that role.',
10
+ 'approval-person-absent': 'the person named in the approval line is not in this plant. name someone else in the approval line.'
11
+ };
12
+ /** A line that does not stand, as a refusal. The params are the one thing the code points at. */
13
+ function approvalLineRefusal(refusal) {
14
+ const params = { role: refusal.params?.role ?? null, personId: refusal.params?.personId ?? null };
15
+ return new shell_1.Refusal(refusal.code, params, LINE_REFUSAL_ENGLISH[refusal.code].replace('{role}', params.role ?? ''));
16
+ }
17
+ const REFERENCE = 'reference';
18
+ const ROLE = 'Role';
19
+ const PERSON = 'Employee';
20
+ async function judgeApprovalLine(line, reader) {
21
+ const seats = (line ?? []).filter(seat => seat?.participation !== REFERENCE);
22
+ if (!seats.length) {
23
+ return { approvers: 0, refusal: { code: 'approval-line-missing' } };
24
+ }
25
+ for (const seat of seats) {
26
+ if (seat?.type === ROLE) {
27
+ if (!seat.value || !(await reader.roleHasMembers(seat.value))) {
28
+ return { approvers: 0, refusal: { code: 'approval-role-empty', params: { role: seat.value ?? '' } } };
29
+ }
30
+ continue;
31
+ }
32
+ if (seat?.type === PERSON) {
33
+ if (!seat.value || !(await reader.personIsHere(seat.value))) {
34
+ return { approvers: 0, refusal: { code: 'approval-person-absent', params: { personId: seat.value ?? '' } } };
35
+ }
36
+ }
37
+ }
38
+ return { approvers: seats.length };
39
+ }
40
+ /** 결재선에서 **역할을 지목한 자리**의 id 들 — 부르는 쪽이 미리 읽어 둘 때 쓴다. */
41
+ function rolesNamedIn(line) {
42
+ return (line ?? [])
43
+ .filter(seat => seat?.participation !== REFERENCE && seat?.type === ROLE)
44
+ .map(seat => seat?.value)
45
+ .filter((one) => !!one);
46
+ }
47
+ //# sourceMappingURL=approval-line-standing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-line-standing.js","sourceRoot":"","sources":["../../../server/service/work-door/approval-line-standing.ts"],"names":[],"mappings":";;AAyFA,kDAIC;AAcD,8CA2BC;AAGD,oCAKC;AA9ID,iDAA+C;AAkF/C,MAAM,oBAAoB,GAAwC;IAChE,uBAAuB,EAAE,sDAAsD;IAC/E,qBAAqB,EAAE,qFAAqF;IAC5G,wBAAwB,EAAE,qGAAqG;CAChI,CAAA;AAED,iGAAiG;AACjG,SAAgB,mBAAmB,CAAC,OAAqD;IACvF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAA;IAEjG,OAAO,IAAI,eAAO,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;AACnH,CAAC;AAUD,MAAM,SAAS,GAAG,WAAW,CAAA;AAC7B,MAAM,IAAI,GAAG,MAAM,CAAA;AACnB,MAAM,MAAM,GAAG,UAAU,CAAA;AAElB,KAAK,UAAU,iBAAiB,CACrC,IAAuC,EACvC,MAA0B;IAE1B,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,SAAS,CAAC,CAAA;IAE5E,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,CAAA;IACrE,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC9D,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,CAAA;YACvG,CAAC;YAED,SAAQ;QACV,CAAC;QAED,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC5D,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,CAAA;YAC9G,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;AACpC,CAAC;AAED,wDAAwD;AACxD,SAAgB,YAAY,CAAC,IAAuC;IAClE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;SAChB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,SAAS,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;SACxE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;SACxB,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAC1C,CAAC","sourcesContent":["import { Refusal } from '@things-factory/shell'\n\n/**\n * 결재선이 **차 있나** — 순수 판단. DB 도 TypeORM 도 모른다.\n *\n * ═══════════════════════════════════════════════════════════════════════════\n * ── 「있다」와 「찼다」가 다르다 ───────────────────────────────────────────\n * 앞서는 `approvalLine?.length` 만 셌다. 그러면 **역할을 지목해 놓고 그 역할에 사람이 하나도 없는**\n * 결재선이 「찼다」로 읽힌다. 문 현황 화면은 「이 문은 섰습니다」라고 그리고, 현장이 상신을 누르는\n * 순간 워크리스트가 `approver is not set` 으로 던진다 — **준비됐다고 말해 놓고 쓸 때 터지는** 부류다.\n *\n * 실 테넌트에서 이것이 예외가 아니다. 미라텍에는 이 제품이 세운 역할이 하나도 없다\n * (§`project_mes_roles_locked_behind_demo`). 역할을 지목한 결재선은 거기서 전부 빈 자리를 가리킨다.\n *\n * ── 불을 돌려주지 않는다. 그리고 **union 으로도 안 돌려준다** ────────────\n * 막은 쪽이 이유를 말한다. `true`/`false` 하나면 화면이 「왜 안 되나」를 **다시 세게 되고**, 그러면\n * 정의가 두 곳이 된다 — 이 판단을 한 곳으로 모은 이유가 없어진다.\n *\n * 그래서 처음에 `{ok:true} | {ok:false, code}` 로 두었는데, 이 패키지의 `server/tsconfig.json` 은\n * **`strict: false`** 라 `strictNullChecks` 가 없고, 그러면 TS 가 **boolean 판별자로 union 을 안\n * 좁힌다.** `if (r.ok) return` 뒤에서 `r.code` 를 읽으면 컴파일이 깨진다 — 하루에 소비자 둘이\n * 연달아 걸렸고 그중 하나는 서버를 아예 못 뜨게 했다.\n *\n * 그래서 **한 객체에 선택 칸**이다. `if (standing.refusal)` 하나로 어디서나 읽힌다.\n * [합의했다] ADR-0047 ⑤(개정)\n *\n * ```\n * approval-line-missing 결재선 자체가 없다 누가 결재하는지를 정해야 한다\n * approval-role-empty 역할은 있는데 사람이 없다 그 역할에 사람을 넣어야 한다\n * approval-person-absent 지목한 사람이 여기 없다 다른 사람을 지목하거나 그 사람을 넣어야 한다\n * ```\n *\n * 관리자가 할 일이 다르므로 코드가 셋이다.\n *\n * ── 참조는 세지 않는다 ───────────────────────────────────────────────────\n * `participation: 'reference'` 는 의견만 내고 결재를 막지 않는다. 참조자 역할이 비었다고 거절하면\n * **결재와 무관한 이유로** 막는 것이 된다. 참조만 있는 결재선은 결재 없이 끝나므로 「없다」로 읽는다.\n *\n * ── 읽는 것은 부르는 쪽이 넘긴다 ─────────────────────────────────────────\n * 포트 하나를 받는다. 이 판단이 `manager` 를 받으면 TypeORM 을 알게 되어 순수 시험이 서지 않고,\n * **어느 도메인으로 좁혔나**가 부르는 쪽에서 안 보이게 된다. 포트의 수명은 **판정 하나**다 — 더\n * 오래 살면 역할에 사람을 넣은 직후에도 옛 답을 내놓는다.\n *\n * ── 사람을 직접 지목한 자리도 읽는다 ─────────────────────────────────────\n * 「이 제품은 역할만 쓴다」로 닫지 않는다. 그렇게 두면 **없는 사람을 지목한 결재선이 「찼다」로\n * 그려지고 상신 순간 터진다** — 역할에서 고친 그 모양이 사람 축으로 다시 나는 것이고, 「없음」이\n * 안전하지 않은 쪽으로 기우는 것이다. 게다가 이 정의는 워크리스트의 `ApprovalLineItem` 을 읽는\n * 공용 자리라, 다른 제품이 사람을 지목하는 날 조용히 틀린다.\n *\n * `Myself` · `MyDepartment` · `MySupervisor` 는 **상신할 때 그 사람으로 풀리는** 자리라 미리 셀 것이\n * 없다. 부서 지목(`Department`)은 부서장이 있어야 풀리는데 그 코드는 아직 없다 — 지어내지 않는다.\n *\n * [합의했다] operato-application/adr/ADR-0047.md ③⑤\n * ═══════════════════════════════════════════════════════════════════════════\n */\n\n/** 결재선 한 자리 — `ApprovalLineItem` 중 이 판단이 보는 칸만. */\nexport interface ApprovalSeat {\n /** `OrgMemberTargetType` — 역할이면 `'Role'`. */\n type?: string\n /** 역할이면 role id, 사람이면 user id. */\n value?: string\n /** 비어 있으면 결재다(`ApprovalLineItem.participation` 의 규약). */\n participation?: string\n}\n\nexport type ApprovalLineRefusal = 'approval-line-missing' | 'approval-role-empty' | 'approval-person-absent'\n\nexport interface ApprovalLineStanding {\n /** 이 결재선이 지나는 자리 수. 안 서는 결재선이면 0. */\n approvers: number\n /**\n * 왜 안 서나 — **있으면 안 서는 것이다.** 없으면 선다.\n *\n * `params` 는 그 코드가 가리키는 것 하나다: 역할이 비었으면 그 역할, 사람이 없으면 그 사람.\n */\n refusal?: {\n code: ApprovalLineRefusal\n params?: { role?: string; personId?: string }\n }\n}\n\nconst LINE_REFUSAL_ENGLISH: Record<ApprovalLineRefusal, string> = {\n 'approval-line-missing': 'this form has no approval line. set who approves it.',\n 'approval-role-empty': 'nobody holds the role {role} named in the approval line. add a person to that role.',\n 'approval-person-absent': 'the person named in the approval line is not in this plant. name someone else in the approval line.'\n}\n\n/** A line that does not stand, as a refusal. The params are the one thing the code points at. */\nexport function approvalLineRefusal(refusal: NonNullable<ApprovalLineStanding['refusal']>): Refusal {\n const params = { role: refusal.params?.role ?? null, personId: refusal.params?.personId ?? null }\n\n return new Refusal(refusal.code, params, LINE_REFUSAL_ENGLISH[refusal.code].replace('{role}', params.role ?? ''))\n}\n\n/** 결재선의 자리가 실제로 사람으로 풀리나 — 읽는 것은 부르는 쪽 일이다. */\nexport interface ApprovalSeatReader {\n /** 그 역할에 사람이 하나 이상 있나. */\n roleHasMembers(roleId: string): Promise<boolean>\n /** 지목한 그 사람이 이 공장에 있고 계정이 붙어 있나. */\n personIsHere(personId: string): Promise<boolean>\n}\n\nconst REFERENCE = 'reference'\nconst ROLE = 'Role'\nconst PERSON = 'Employee'\n\nexport async function judgeApprovalLine(\n line: ApprovalSeat[] | undefined | null,\n reader: ApprovalSeatReader\n): Promise<ApprovalLineStanding> {\n const seats = (line ?? []).filter(seat => seat?.participation !== REFERENCE)\n\n if (!seats.length) {\n return { approvers: 0, refusal: { code: 'approval-line-missing' } }\n }\n\n for (const seat of seats) {\n if (seat?.type === ROLE) {\n if (!seat.value || !(await reader.roleHasMembers(seat.value))) {\n return { approvers: 0, refusal: { code: 'approval-role-empty', params: { role: seat.value ?? '' } } }\n }\n\n continue\n }\n\n if (seat?.type === PERSON) {\n if (!seat.value || !(await reader.personIsHere(seat.value))) {\n return { approvers: 0, refusal: { code: 'approval-person-absent', params: { personId: seat.value ?? '' } } }\n }\n }\n }\n\n return { approvers: seats.length }\n}\n\n/** 결재선에서 **역할을 지목한 자리**의 id 들 — 부르는 쪽이 미리 읽어 둘 때 쓴다. */\nexport function rolesNamedIn(line: ApprovalSeat[] | undefined | null): string[] {\n return (line ?? [])\n .filter(seat => seat?.participation !== REFERENCE && seat?.type === ROLE)\n .map(seat => seat?.value)\n .filter((one): one is string => !!one)\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { WorkDoorNotUsed } from './work-door-not-used.js';
2
+ import { WorkDoorJournal } from './work-door-journal.js';
3
+ import { WorkDoorResolver } from './work-door-resolver.js';
4
+ export declare const entities: (typeof WorkDoorNotUsed | typeof WorkDoorJournal)[];
5
+ export declare const resolvers: (typeof WorkDoorResolver)[];
6
+ export * from './approval-line-standing.js';
7
+ export * from './activity-lookup.js';
8
+ export * from './work-door.js';
9
+ export * from './work-door-declaration.js';
10
+ export * from './work-door-journal.js';
11
+ export * from './work-door-journal-service.js';
12
+ export * from './work-door-not-used.js';
13
+ export * from './work-door-service.js';
14
+ export * from './work-door-type.js';
15
+ export * from './pass-work-door.js';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const work_door_not_used_js_1 = require("./work-door-not-used.js");
6
+ const work_door_journal_js_1 = require("./work-door-journal.js");
7
+ const work_door_resolver_js_1 = require("./work-door-resolver.js");
8
+ exports.entities = [work_door_not_used_js_1.WorkDoorNotUsed, work_door_journal_js_1.WorkDoorJournal];
9
+ exports.resolvers = [work_door_resolver_js_1.WorkDoorResolver];
10
+ tslib_1.__exportStar(require("./approval-line-standing.js"), exports);
11
+ tslib_1.__exportStar(require("./activity-lookup.js"), exports);
12
+ tslib_1.__exportStar(require("./work-door.js"), exports);
13
+ tslib_1.__exportStar(require("./work-door-declaration.js"), exports);
14
+ tslib_1.__exportStar(require("./work-door-journal.js"), exports);
15
+ tslib_1.__exportStar(require("./work-door-journal-service.js"), exports);
16
+ tslib_1.__exportStar(require("./work-door-not-used.js"), exports);
17
+ tslib_1.__exportStar(require("./work-door-service.js"), exports);
18
+ tslib_1.__exportStar(require("./work-door-type.js"), exports);
19
+ tslib_1.__exportStar(require("./pass-work-door.js"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/work-door/index.ts"],"names":[],"mappings":";;;;AAAA,mEAAyD;AACzD,iEAAwD;AACxD,mEAA0D;AAE7C,QAAA,QAAQ,GAAG,CAAC,uCAAe,EAAE,sCAAe,CAAC,CAAA;AAC7C,QAAA,SAAS,GAAG,CAAC,wCAAgB,CAAC,CAAA;AAE3C,sEAA2C;AAC3C,+DAAoC;AACpC,yDAA8B;AAC9B,qEAA0C;AAC1C,iEAAsC;AACtC,yEAA8C;AAC9C,kEAAuC;AACvC,iEAAsC;AACtC,8DAAmC;AACnC,8DAAmC","sourcesContent":["import { WorkDoorNotUsed } from './work-door-not-used.js'\nimport { WorkDoorJournal } from './work-door-journal.js'\nimport { WorkDoorResolver } from './work-door-resolver.js'\n\nexport const entities = [WorkDoorNotUsed, WorkDoorJournal]\nexport const resolvers = [WorkDoorResolver]\n\nexport * from './approval-line-standing.js'\nexport * from './activity-lookup.js'\nexport * from './work-door.js'\nexport * from './work-door-declaration.js'\nexport * from './work-door-journal.js'\nexport * from './work-door-journal-service.js'\nexport * from './work-door-not-used.js'\nexport * from './work-door-service.js'\nexport * from './work-door-type.js'\nexport * from './pass-work-door.js'\n"]}
@@ -0,0 +1,74 @@
1
+ import { EntityManager } from 'typeorm';
2
+ import { Domain, Refusal } from '@things-factory/shell';
3
+ import { User } from '@things-factory/auth-base';
4
+ import { type ApprovalLineStanding, type ApprovalSeatReader } from './approval-line-standing.js';
5
+ import { WorkDoorEvent } from './work-door-event.js';
6
+ import type { WorkDoorDeclaration } from './work-door-declaration.js';
7
+ /**
8
+ * **One place decides, and the same place writes it down** (ADR-0077 decision 1).
9
+ *
10
+ * ═══════════════════════════════════════════════════════════════════════════
11
+ * ── Why judgement and record are one call ─────────────────────────────────
12
+ * Until now each application door read the approval line itself and decided what to do, which is why
13
+ * eight of operato-plant's doors run with no line and none of them leaves a trace: the place that
14
+ * knew a step had been skipped was not the place that wrote anything down, and there were eight of
15
+ * them. Joined here, a door cannot take the `run` branch without the line being written - there is
16
+ * no branch to take that skips it.
17
+ *
18
+ * ── The transaction is not a convenience ──────────────────────────────────
19
+ * `tx` is the caller's **open** transaction, not a manager. The line and the work it describes have
20
+ * to commit together: the line first and the work failing leaves a log that says something happened
21
+ * that did not, and the reverse leaves the silent pass this log exists to end. A plain manager
22
+ * commits each statement where it stands, so passing one is the same bug the outbox sequence has
23
+ * one layer down - and there it burned 200 numbers before anyone noticed.
24
+ *
25
+ * ── `as-established` asks the door, it does not guess ─────────────────────
26
+ * A door whose branch turns on the row's own history (a non-working period withdrawn: declared
27
+ * through approval, withdrawn through approval) answers `establishedByApproval` itself. This
28
+ * function reads that one flag. Putting the judgement here would mean the worklist knew what a
29
+ * non-working period is.
30
+ * ═══════════════════════════════════════════════════════════════════════════
31
+ */
32
+ export interface WorkDoorReading {
33
+ door: WorkDoorDeclaration;
34
+ /** The activity as installed in this domain, if it is installed at all. */
35
+ activity?: {
36
+ id?: string;
37
+ approvalLine?: unknown[];
38
+ } | null;
39
+ /** What this is about, as the application names it. Two strings; nothing is read inside them. */
40
+ subject: {
41
+ kind: string;
42
+ id: string;
43
+ };
44
+ /** `as-established` doors only: did the row this is about come about through approval? */
45
+ establishedByApproval?: boolean;
46
+ /** True when this domain has declared it does not use this door. */
47
+ notUsed?: boolean;
48
+ }
49
+ export interface WorkDoorPassage {
50
+ /** The caller's open transaction - the work and the log line commit together. */
51
+ tx: EntityManager;
52
+ domain: Domain;
53
+ user?: User;
54
+ /** Reads whether a seat in the line resolves to a person. */
55
+ seats: ApprovalSeatReader;
56
+ }
57
+ export type WorkDoorVerdict =
58
+ /** The line stands. The caller raises it for approval; the instance is the record. */
59
+ {
60
+ go: 'raise';
61
+ standing: ApprovalLineStanding;
62
+ }
63
+ /** No approval here. The work happens, and this is the id of the line written about it. */
64
+ | {
65
+ go: 'run';
66
+ noted: string;
67
+ because: WorkDoorEvent.RanWithoutLine | WorkDoorEvent.RanNotUsed;
68
+ }
69
+ /** The caller is refused, in words that say what to go and fix. */
70
+ | {
71
+ go: 'refuse';
72
+ refusal: Refusal;
73
+ };
74
+ export declare function passWorkDoor(reading: WorkDoorReading, passage: WorkDoorPassage): Promise<WorkDoorVerdict>;