@mj-biz-apps/tasks-core 1.0.1 → 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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/services/TaskAssignmentService.d.ts +2 -2
- package/dist/services/TaskAssignmentService.d.ts.map +1 -1
- package/dist/services/TaskAssignmentService.js +3 -3
- package/dist/services/TaskAssignmentService.js.map +1 -1
- package/dist/services/TaskOrchestrationService.d.ts +91 -0
- package/dist/services/TaskOrchestrationService.d.ts.map +1 -0
- package/dist/services/TaskOrchestrationService.js +197 -0
- package/dist/services/TaskOrchestrationService.js.map +1 -0
- package/dist/services/TaskService.d.ts +1 -1
- package/dist/services/TaskService.d.ts.map +1 -1
- package/dist/services/TaskService.js +2 -2
- package/dist/services/TaskService.js.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -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
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;
|
|
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,
|
|
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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"}
|
|
@@ -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;
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"TaskService.js","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mj-biz-apps/tasks-core",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.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",
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"typescript": "^5.9.3"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@mj-biz-apps/tasks-entities": "1.0
|
|
24
|
+
"@mj-biz-apps/tasks-entities": "1.1.0"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@memberjunction/core": "^5.
|
|
28
|
-
"@memberjunction/global": "^5.
|
|
27
|
+
"@memberjunction/core": "^5.40.2",
|
|
28
|
+
"@memberjunction/global": "^5.40.2"
|
|
29
29
|
},
|
|
30
30
|
"repository": {
|
|
31
31
|
"type": "git",
|