@mj-biz-apps/tasks-core 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './services/TaskService.js';
2
2
  export * from './services/TaskAssignmentService.js';
3
3
  export * from './services/TaskTemplateService.js';
4
+ export * from './services/TaskOrchestrationService.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './services/TaskService.js';
2
2
  export * from './services/TaskAssignmentService.js';
3
3
  export * from './services/TaskTemplateService.js';
4
+ export * from './services/TaskOrchestrationService.js';
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { BaseEntity } from "@memberjunction/core";
1
+ import { BaseEntity, UserInfo } from "@memberjunction/core";
2
2
  /**
3
3
  * Service for managing task assignments.
4
4
  * Handles polymorphic assignee operations (People and AI Agents)
@@ -17,7 +17,7 @@ export declare class TaskAssignmentService {
17
17
  roleID?: string;
18
18
  roleNotes?: string;
19
19
  assignedByPersonID?: string;
20
- }): Promise<BaseEntity>;
20
+ }, contextUser?: UserInfo): Promise<BaseEntity>;
21
21
  /**
22
22
  * Removes an assignment and logs the removal.
23
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TaskAssignmentService.d.ts","sourceRoot":"","sources":["../../src/services/TaskAssignmentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmC,MAAM,sBAAsB,CAAC;AAGnF;;;;GAIG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,WAAW,CAAqB;IAExC;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBvB;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvF;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CASrE"}
1
+ {"version":3,"file":"TaskAssignmentService.d.ts","sourceRoot":"","sources":["../../src/services/TaskAssignmentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmC,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG7F;;;;GAIG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,WAAW,CAAqB;IAExC;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC/B,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAuB/C;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvF;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CASrE"}
@@ -13,8 +13,8 @@ export class TaskAssignmentService {
13
13
  * Assigns an entity record (Person or Agent) to a task with an optional role.
14
14
  * Logs an activity entry after successful assignment.
15
15
  */
16
- async assignToTask(params) {
17
- const assignment = await Metadata.Provider.GetEntityObject('MJ_BizApps_Tasks: Task Assignments');
16
+ async assignToTask(params, contextUser) {
17
+ const assignment = await Metadata.Provider.GetEntityObject('MJ_BizApps_Tasks: Task Assignments', contextUser);
18
18
  assignment.NewRecord();
19
19
  assignment.Set('TaskID', params.taskID);
20
20
  assignment.Set('AssigneeEntityID', params.assigneeEntityID);
@@ -32,7 +32,7 @@ export class TaskAssignmentService {
32
32
  activityType: 'AssignmentAdded',
33
33
  newValue: params.assigneeRecordID,
34
34
  description: `Assignee added to task`,
35
- });
35
+ }, contextUser);
36
36
  return assignment;
37
37
  }
38
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TaskAssignmentService.js","sourceRoot":"","sources":["../../src/services/TaskAssignmentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAAlC;QACY,gBAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAsE5C,CAAC;IApEG;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,MAOlB;QACG,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,oCAAoC,CAAC,CAAC;QACjG,UAAU,CAAC,SAAS,EAAE,CAAC;QACvB,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC5D,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM;YAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,SAAS;YAAE,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,kBAAkB;YAAE,UAAU,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAE/F,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QAExB,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,kBAAkB;YACnC,YAAY,EAAE,iBAAiB;YAC/B,QAAQ,EAAE,MAAM,CAAC,gBAAgB;YACjC,WAAW,EAAE,wBAAwB;SACxC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,iBAA0B;QACnE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,oCAAoC,CAAC,CAAC;QACjG,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAW,CAAC;QAClD,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAW,CAAC;QAEtE,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;QAE1B,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;YAC/B,MAAM;YACN,QAAQ,EAAE,iBAAiB;YAC3B,YAAY,EAAE,mBAAmB;YACjC,aAAa,EAAE,gBAAgB;YAC/B,WAAW,EAAE,4BAA4B;SAC5C,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,MAAc;QACtC,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAa;YACxC,UAAU,EAAE,oCAAoC;YAChD,WAAW,EAAE,aAAa,MAAM,GAAG;YACnC,UAAU,EAAE,eAAe;SAC9B,CAAC,CAAC;QACH,OAAO,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;CACJ"}
1
+ {"version":3,"file":"TaskAssignmentService.js","sourceRoot":"","sources":["../../src/services/TaskAssignmentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAAlC;QACY,gBAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAsE5C,CAAC;IApEG;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,MAOlB,EAAE,WAAsB;QACrB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,oCAAoC,EAAE,WAAW,CAAC,CAAC;QAC9G,UAAU,CAAC,SAAS,EAAE,CAAC;QACvB,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC5D,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM;YAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,SAAS;YAAE,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,kBAAkB;YAAE,UAAU,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAE/F,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QAExB,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,kBAAkB;YACnC,YAAY,EAAE,iBAAiB;YAC/B,QAAQ,EAAE,MAAM,CAAC,gBAAgB;YACjC,WAAW,EAAE,wBAAwB;SACxC,EAAE,WAAW,CAAC,CAAC;QAEhB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,iBAA0B;QACnE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,oCAAoC,CAAC,CAAC;QACjG,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAW,CAAC;QAClD,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAW,CAAC;QAEtE,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;QAE1B,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;YAC/B,MAAM;YACN,QAAQ,EAAE,iBAAiB;YAC3B,YAAY,EAAE,mBAAmB;YACjC,aAAa,EAAE,gBAAgB;YAC/B,WAAW,EAAE,4BAA4B;SAC5C,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,MAAc;QACtC,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAa;YACxC,UAAU,EAAE,oCAAoC;YAChD,WAAW,EAAE,aAAa,MAAM,GAAG;YACnC,UAAU,EAAE,eAAe;SAC9B,CAAC,CAAC;QACH,OAAO,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;CACJ"}
@@ -0,0 +1,91 @@
1
+ import { UserInfo } from "@memberjunction/core";
2
+ import type { mjBizAppsTasksTaskEntity, mjBizAppsTasksTaskDecisionEntity } from "@mj-biz-apps/tasks-entities";
3
+ /** The closed set of task statuses (mirrors the generated Task.Status union). */
4
+ export type TaskStatus = 'Open' | 'InProgress' | 'Blocked' | 'Completed' | 'Cancelled';
5
+ /** Stable codes for the seeded TaskDecisionOutcome rows. */
6
+ export type TaskDecisionOutcomeCode = 'Approved' | 'Rejected' | 'ApprovedWithConditions';
7
+ export type CreateTaskParams = {
8
+ Name: string;
9
+ TypeID: string;
10
+ Description?: string;
11
+ CategoryID?: string;
12
+ ParentID?: string;
13
+ Priority?: 'Low' | 'Medium' | 'High' | 'Critical';
14
+ DueAt?: Date;
15
+ CreatedByPersonID?: string;
16
+ /** Initial status; defaults to 'Open'. */
17
+ Status?: TaskStatus;
18
+ };
19
+ export type RecordDecisionParams = {
20
+ TaskID: string;
21
+ OutcomeCode: TaskDecisionOutcomeCode;
22
+ DecidedByPersonID?: string;
23
+ Notes?: string;
24
+ /** When set, records a per-assignee decision for multi-approver flows. */
25
+ TaskAssignmentID?: string;
26
+ };
27
+ export type CreateApprovalRequestParams = {
28
+ Name: string;
29
+ /** TaskType ID for the approval — typically the seeded "Approval Request" type. */
30
+ TypeID: string;
31
+ Description?: string;
32
+ Priority?: 'Low' | 'Medium' | 'High' | 'Critical';
33
+ DueAt?: Date;
34
+ CreatedByPersonID?: string;
35
+ /** Source record this approval is about (polymorphic link). */
36
+ LinkEntityID?: string;
37
+ LinkRecordID?: string;
38
+ /** Approvers to assign, by Person entity record ID. */
39
+ ApproverPersonEntityID?: string;
40
+ ApproverPersonRecordIDs?: string[];
41
+ /** Optional TaskRole applied to each assignment. */
42
+ RoleID?: string;
43
+ };
44
+ export type RecordDecisionResult = {
45
+ Decision: mjBizAppsTasksTaskDecisionEntity;
46
+ Task: mjBizAppsTasksTaskEntity;
47
+ /** The status the task was transitioned to as a result of the decision (null if non-terminal). */
48
+ NewStatus: TaskStatus | null;
49
+ };
50
+ /**
51
+ * Generic orchestration verbs for the task / approval workflow substrate.
52
+ *
53
+ * Thin layer over the MJ entity API — every method saves through strongly-typed
54
+ * generated entities so that entity-subclass validation (status side-effects,
55
+ * cycle checks) and the server-side action hooks fire automatically.
56
+ *
57
+ * Every method threads an explicit `contextUser` for correct multi-user isolation
58
+ * on the server.
59
+ */
60
+ export declare class TaskOrchestrationService {
61
+ private assignmentService;
62
+ private taskService;
63
+ /** Creates a new task and returns the saved entity. */
64
+ CreateTask(params: CreateTaskParams, contextUser?: UserInfo): Promise<mjBizAppsTasksTaskEntity>;
65
+ /**
66
+ * Transitions a task to a new status and saves it. The entity subclass
67
+ * applies status side-effects (StartedAt/CompletedAt) and the server save-event
68
+ * handler fires any configured action hooks.
69
+ */
70
+ TransitionStatus(taskID: string, newStatus: TaskStatus, contextUser?: UserInfo): Promise<mjBizAppsTasksTaskEntity>;
71
+ /**
72
+ * Records an approve/reject decision against a task: creates a TaskDecision
73
+ * row, logs a DecisionRecorded activity, and (for terminal outcomes) transitions
74
+ * the task — Approved/ApprovedWithConditions → Completed, Rejected → Cancelled.
75
+ *
76
+ * The status transition fires the existing server hook seam, so consumers' OnReject /
77
+ * OnCancel / OnComplete actions run as a side-effect of recording the decision.
78
+ */
79
+ RecordDecision(params: RecordDecisionParams, contextUser?: UserInfo): Promise<RecordDecisionResult>;
80
+ /**
81
+ * Creates an approval-request task, optionally links it to a source record,
82
+ * and assigns the named approvers. Returns the created task.
83
+ */
84
+ CreateApprovalRequest(params: CreateApprovalRequestParams, contextUser?: UserInfo): Promise<mjBizAppsTasksTaskEntity>;
85
+ private loadTask;
86
+ /** Maps a terminal outcome code to the task status it drives. */
87
+ private statusForOutcome;
88
+ private resolveOutcome;
89
+ private linkSourceRecord;
90
+ }
91
+ //# sourceMappingURL=TaskOrchestrationService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskOrchestrationService.d.ts","sourceRoot":"","sources":["../../src/services/TaskOrchestrationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ import { CompositeKey, LogError, Metadata, RunView } from "@memberjunction/core";
2
+ import { TaskService } from "./TaskService.js";
3
+ import { TaskAssignmentService } from "./TaskAssignmentService.js";
4
+ const TASKS_ENTITY = 'MJ_BizApps_Tasks: Tasks';
5
+ const TASK_DECISIONS_ENTITY = 'MJ_BizApps_Tasks: Task Decisions';
6
+ const TASK_DECISION_OUTCOMES_ENTITY = 'MJ_BizApps_Tasks: Task Decision Outcomes';
7
+ const TASK_LINKS_ENTITY = 'MJ_BizApps_Tasks: Task Links';
8
+ /**
9
+ * Generic orchestration verbs for the task / approval workflow substrate.
10
+ *
11
+ * Thin layer over the MJ entity API — every method saves through strongly-typed
12
+ * generated entities so that entity-subclass validation (status side-effects,
13
+ * cycle checks) and the server-side action hooks fire automatically.
14
+ *
15
+ * Every method threads an explicit `contextUser` for correct multi-user isolation
16
+ * on the server.
17
+ */
18
+ export class TaskOrchestrationService {
19
+ constructor() {
20
+ this.assignmentService = new TaskAssignmentService();
21
+ this.taskService = new TaskService();
22
+ }
23
+ // ---------------------------------------------------------------
24
+ // Create
25
+ // ---------------------------------------------------------------
26
+ /** Creates a new task and returns the saved entity. */
27
+ async CreateTask(params, contextUser) {
28
+ const md = new Metadata();
29
+ const task = await md.GetEntityObject(TASKS_ENTITY, contextUser);
30
+ task.NewRecord();
31
+ task.Name = params.Name;
32
+ task.TypeID = params.TypeID;
33
+ task.Status = params.Status ?? 'Open';
34
+ if (params.Description != null)
35
+ task.Description = params.Description;
36
+ if (params.CategoryID != null)
37
+ task.CategoryID = params.CategoryID;
38
+ if (params.ParentID != null)
39
+ task.ParentID = params.ParentID;
40
+ if (params.Priority != null)
41
+ task.Priority = params.Priority;
42
+ if (params.DueAt != null)
43
+ task.DueAt = params.DueAt;
44
+ if (params.CreatedByPersonID != null)
45
+ task.CreatedByPersonID = params.CreatedByPersonID;
46
+ if (!(await task.Save())) {
47
+ throw new Error(`Failed to create task "${params.Name}": ${task.LatestResult?.CompleteMessage ?? 'unknown error'}`);
48
+ }
49
+ return task;
50
+ }
51
+ // ---------------------------------------------------------------
52
+ // Transition
53
+ // ---------------------------------------------------------------
54
+ /**
55
+ * Transitions a task to a new status and saves it. The entity subclass
56
+ * applies status side-effects (StartedAt/CompletedAt) and the server save-event
57
+ * handler fires any configured action hooks.
58
+ */
59
+ async TransitionStatus(taskID, newStatus, contextUser) {
60
+ const task = await this.loadTask(taskID, contextUser);
61
+ if (task.Status === newStatus) {
62
+ return task; // no-op; avoid a redundant save + hook fire
63
+ }
64
+ task.Status = newStatus;
65
+ if (!(await task.Save())) {
66
+ throw new Error(`Failed to transition task ${taskID} to ${newStatus}: ${task.LatestResult?.CompleteMessage ?? 'unknown error'}`);
67
+ }
68
+ return task;
69
+ }
70
+ // ---------------------------------------------------------------
71
+ // Record decision
72
+ // ---------------------------------------------------------------
73
+ /**
74
+ * Records an approve/reject decision against a task: creates a TaskDecision
75
+ * row, logs a DecisionRecorded activity, and (for terminal outcomes) transitions
76
+ * the task — Approved/ApprovedWithConditions → Completed, Rejected → Cancelled.
77
+ *
78
+ * The status transition fires the existing server hook seam, so consumers' OnReject /
79
+ * OnCancel / OnComplete actions run as a side-effect of recording the decision.
80
+ */
81
+ async RecordDecision(params, contextUser) {
82
+ const outcome = await this.resolveOutcome(params.OutcomeCode, contextUser);
83
+ const md = new Metadata();
84
+ const decision = await md.GetEntityObject(TASK_DECISIONS_ENTITY, contextUser);
85
+ decision.NewRecord();
86
+ decision.TaskID = params.TaskID;
87
+ decision.OutcomeID = outcome.ID;
88
+ if (params.DecidedByPersonID != null)
89
+ decision.DecidedByPersonID = params.DecidedByPersonID;
90
+ if (params.Notes != null)
91
+ decision.DecisionNotes = params.Notes;
92
+ if (params.TaskAssignmentID != null)
93
+ decision.TaskAssignmentID = params.TaskAssignmentID;
94
+ if (!(await decision.Save())) {
95
+ throw new Error(`Failed to record decision for task ${params.TaskID}: ${decision.LatestResult?.CompleteMessage ?? 'unknown error'}`);
96
+ }
97
+ await this.taskService.logActivity({
98
+ taskID: params.TaskID,
99
+ personID: params.DecidedByPersonID,
100
+ activityType: 'DecisionRecorded',
101
+ newValue: outcome.Code,
102
+ description: `Decision recorded: ${outcome.Name}`,
103
+ }, contextUser);
104
+ // Only terminal outcomes drive a status transition. Interim outcomes leave the task open.
105
+ let task;
106
+ let newStatus = null;
107
+ if (outcome.IsTerminal) {
108
+ newStatus = this.statusForOutcome(params.OutcomeCode);
109
+ task = await this.TransitionStatus(params.TaskID, newStatus, contextUser);
110
+ }
111
+ else {
112
+ task = await this.loadTask(params.TaskID, contextUser);
113
+ }
114
+ return { Decision: decision, Task: task, NewStatus: newStatus };
115
+ }
116
+ // ---------------------------------------------------------------
117
+ // Create approval request (convenience)
118
+ // ---------------------------------------------------------------
119
+ /**
120
+ * Creates an approval-request task, optionally links it to a source record,
121
+ * and assigns the named approvers. Returns the created task.
122
+ */
123
+ async CreateApprovalRequest(params, contextUser) {
124
+ const task = await this.CreateTask({
125
+ Name: params.Name,
126
+ TypeID: params.TypeID,
127
+ Description: params.Description,
128
+ Priority: params.Priority ?? 'High',
129
+ DueAt: params.DueAt,
130
+ CreatedByPersonID: params.CreatedByPersonID,
131
+ Status: 'Open',
132
+ }, contextUser);
133
+ if (params.LinkEntityID && params.LinkRecordID) {
134
+ await this.linkSourceRecord(task.ID, params.LinkEntityID, params.LinkRecordID, contextUser);
135
+ }
136
+ if (params.ApproverPersonEntityID && params.ApproverPersonRecordIDs?.length) {
137
+ for (const recordID of params.ApproverPersonRecordIDs) {
138
+ await this.assignmentService.assignToTask({
139
+ taskID: task.ID,
140
+ assigneeEntityID: params.ApproverPersonEntityID,
141
+ assigneeRecordID: recordID,
142
+ roleID: params.RoleID,
143
+ assignedByPersonID: params.CreatedByPersonID,
144
+ }, contextUser);
145
+ }
146
+ }
147
+ return task;
148
+ }
149
+ // ---------------------------------------------------------------
150
+ // Helpers
151
+ // ---------------------------------------------------------------
152
+ async loadTask(taskID, contextUser) {
153
+ const md = new Metadata();
154
+ const task = await md.GetEntityObject(TASKS_ENTITY, contextUser);
155
+ const loaded = await task.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: taskID }]));
156
+ if (!loaded) {
157
+ throw new Error(`Task ${taskID} not found`);
158
+ }
159
+ return task;
160
+ }
161
+ /** Maps a terminal outcome code to the task status it drives. */
162
+ statusForOutcome(code) {
163
+ switch (code) {
164
+ case 'Approved':
165
+ case 'ApprovedWithConditions':
166
+ return 'Completed';
167
+ case 'Rejected':
168
+ return 'Cancelled';
169
+ }
170
+ }
171
+ async resolveOutcome(code, contextUser) {
172
+ const rv = new RunView();
173
+ const result = await rv.RunView({
174
+ EntityName: TASK_DECISION_OUTCOMES_ENTITY,
175
+ ExtraFilter: `Code = '${code.replace(/'/g, "''")}'`,
176
+ ResultType: 'entity_object',
177
+ MaxRows: 1,
178
+ }, contextUser);
179
+ const outcome = result?.Results?.[0];
180
+ if (!result?.Success || !outcome) {
181
+ throw new Error(`Task decision outcome with code '${code}' not found (is the metadata seeded?)`);
182
+ }
183
+ return outcome;
184
+ }
185
+ async linkSourceRecord(taskID, entityID, recordID, contextUser) {
186
+ const md = new Metadata();
187
+ const link = await md.GetEntityObject(TASK_LINKS_ENTITY, contextUser);
188
+ link.NewRecord();
189
+ link.TaskID = taskID;
190
+ link.EntityID = entityID;
191
+ link.RecordID = recordID;
192
+ if (!(await link.Save())) {
193
+ LogError(`Failed to link task ${taskID} to ${entityID}/${recordID}: ${link.LatestResult?.CompleteMessage ?? 'unknown error'}`);
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=TaskOrchestrationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskOrchestrationService.js","sourceRoot":"","sources":["../../src/services/TaskOrchestrationService.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,6 @@ export declare class TaskService {
27
27
  previousValue?: string;
28
28
  newValue?: string;
29
29
  description: string;
30
- }): Promise<void>;
30
+ }, contextUser?: UserInfo): Promise<void>;
31
31
  }
32
32
  //# sourceMappingURL=TaskService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskService.d.ts","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+C,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE7F;;;;;;;GAOG;AACH,qBAAa,WAAW;IAMpB;;;;;;OAMG;IACG,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DvF;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,IAAI,CAAC;CAWpB"}
1
+ {"version":3,"file":"TaskService.d.ts","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+C,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE7F;;;;;;;GAOG;AACH,qBAAa,WAAW;IAMpB;;;;;;OAMG;IACG,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DvF;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACvB,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAW5C"}
@@ -70,8 +70,8 @@ export class TaskService {
70
70
  * Creates a TaskActivity record for an auditable change.
71
71
  * Called from entity subclass hooks or service methods after a save.
72
72
  */
73
- async logActivity(params) {
74
- const activity = await Metadata.Provider.GetEntityObject('MJ_BizApps_Tasks: Task Activities');
73
+ async logActivity(params, contextUser) {
74
+ const activity = await Metadata.Provider.GetEntityObject('MJ_BizApps_Tasks: Task Activities', contextUser);
75
75
  activity.NewRecord();
76
76
  activity.Set('TaskID', params.taskID);
77
77
  if (params.personID)
@@ -1 +1 @@
1
- {"version":3,"file":"TaskService.js","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskService.js","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAE7F;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IAEpB,kEAAkE;IAClE,2BAA2B;IAC3B,kEAAkE;IAElE;;;;;;OAMG;IACH,KAAK,CAAC,oBAAoB,CAAC,YAAoB,EAAE,WAAsB;QACnE,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAa;YAC1C,UAAU,EAAE,yBAAyB;YACrC,WAAW,EAAE,eAAe,YAAY,GAAG;YAC3C,UAAU,EAAE,QAAQ;SACvB,EAAE,WAAW,CAAC,CAAC;QAEhB,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM;YAAE,OAAO;QAEvC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,GAAG,GAAI,KAAa,CAAC,eAAyB,IAAI,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAI,KAAa,CAAC,cAA+B,CAAC;YAC7D,MAAM,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtD,WAAW,IAAI,GAAG,GAAG,MAAM,CAAC;YAC5B,WAAW,IAAI,MAAM,CAAC;YAEtB,IAAK,KAAa,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACxC,YAAY,GAAG,KAAK,CAAC;YACzB,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3E,mEAAmE;QACnE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC;QACnG,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAW,CAAC;QAC/D,MAAM,cAAc,GAAG,YAAY,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,WAAW,CAAC;QAEhF,sEAAsE;QACtE,2EAA2E;QAC3E,IAAI,UAAU,KAAK,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,OAAO;QACX,CAAC;QAED,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,cAAc,EAAE,CAAC;YACjB,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QAExB,sBAAsB;QACtB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAkB,CAAC;QAClE,IAAI,aAAa,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAChE,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,mBAAmB;IACnB,kEAAkE;IAElE;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,MAOjB,EAAE,WAAsB;QACrB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,mCAAmC,EAAE,WAAW,CAAC,CAAC;QAC3G,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrB,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,QAAQ;YAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/D,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,aAAa;YAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,QAAQ;YAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/D,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "name": "@mj-biz-apps/tasks-core",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.1.0",
5
5
  "description": "BizApps Tasks Core Services - TaskService, TaskAssignmentService, TaskTemplateService",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "publishConfig": {
9
9
  "access": "public"
10
10
  },
11
- "files": ["/dist"],
11
+ "files": [
12
+ "/dist"
13
+ ],
12
14
  "scripts": {
13
15
  "build": "tsc && tsc-alias -f",
14
16
  "test": "vitest run"
@@ -19,11 +21,11 @@
19
21
  "typescript": "^5.9.3"
20
22
  },
21
23
  "dependencies": {
22
- "@mj-biz-apps/tasks-entities": "1.0.0"
24
+ "@mj-biz-apps/tasks-entities": "1.1.0"
23
25
  },
24
26
  "peerDependencies": {
25
- "@memberjunction/core": "^5.38.0",
26
- "@memberjunction/global": "^5.38.0"
27
+ "@memberjunction/core": "^5.40.2",
28
+ "@memberjunction/global": "^5.40.2"
27
29
  },
28
30
  "repository": {
29
31
  "type": "git",