@acorex-platform/module-maintenance-management-client 0.0.21
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/fesm2022/acorex-platform-module-maintenance-management-client-acorex-platform-module-maintenance-management-client-BiQlJxPX.mjs +2698 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-acorex-platform-module-maintenance-management-client-BiQlJxPX.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-contracts.mjs +405 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-create-or-get-work-report-draft.activity-xxvOfIxf.mjs +141 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-create-or-get-work-report-draft.activity-xxvOfIxf.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-failure-register-status.provider-CLBaQy_e.mjs +181 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-failure-register-status.provider-CLBaQy_e.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-fill-work-report-completion.command-Capowl1e.mjs +174 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-fill-work-report-completion.command-Capowl1e.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-open-work-report-from-work-order.command-B0O4fWPt.mjs +105 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-open-work-report-from-work-order.command-B0O4fWPt.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-record-work-report-assessment.activity-CxRfaf0G.mjs +152 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-record-work-report-assessment.activity-CxRfaf0G.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-resolve-person-user-id.activity-nwXAJHkd.mjs +57 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-resolve-person-user-id.activity-nwXAJHkd.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-resolve-work-order.activity-q5WM7Sv5.mjs +92 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-resolve-work-order.activity-q5WM7Sv5.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-start-work-order-flow.command-B06a962Y.mjs +402 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-start-work-order-flow.command-B06a962Y.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-update-work-order-completed.activity-Di4R6LQl.mjs +89 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-update-work-order-completed.activity-Di4R6LQl.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-update-work-order-in-progress.activity-CzkCCl1L.mjs +96 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-update-work-order-in-progress.activity-CzkCCl1L.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-update-work-report-on-completion.activity-_B0SUFtQ.mjs +142 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-update-work-report-on-completion.activity-_B0SUFtQ.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-validate-work-order-completion.activity-RA2zaQHH.mjs +83 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-validate-work-order-completion.activity-RA2zaQHH.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-list-command-Bh_6PS5w.mjs +153 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-list-command-Bh_6PS5w.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-status.provider-DvBk5kAW.mjs +186 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-status.provider-DvBk5kAW.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-work-report-column.component-Bf1WZWIS.mjs +163 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-work-report-column.component-Bf1WZWIS.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-workflow-column.component-Dth3Z9fW.mjs +320 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-order-workflow-column.component-Dth3Z9fW.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-report-assessment.util-Da1HVAit.mjs +74 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-report-assessment.util-Da1HVAit.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-report-checklist-results-view.component-BSFW0Yt-.mjs +149 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client-work-report-checklist-results-view.component-BSFW0Yt-.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client.mjs +2 -0
- package/fesm2022/acorex-platform-module-maintenance-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-maintenance-management-client-contracts.d.ts +1081 -0
- package/types/acorex-platform-module-maintenance-management-client.d.ts +54 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { AXPDebugService } from '@acorex-platform/framework-client/core';
|
|
2
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { inject, Injectable } from '@angular/core';
|
|
5
|
+
import { isString } from 'lodash';
|
|
6
|
+
import { RootConfig, AXMWorkOrderStatus } from '@acorex-platform/module-maintenance-management-client/contracts';
|
|
7
|
+
import { A as AXM_WORK_ORDER_WORKFLOW_DEBUG_NAMESPACE } from './acorex-platform-module-maintenance-management-client-acorex-platform-module-maintenance-management-client-BiQlJxPX.mjs';
|
|
8
|
+
|
|
9
|
+
//#region ---- Imports ----
|
|
10
|
+
//#endregion
|
|
11
|
+
/**
|
|
12
|
+
* Sets the work order to in-progress when it is not already in that state.
|
|
13
|
+
*/
|
|
14
|
+
class UpdateWorkOrderInProgressActivity {
|
|
15
|
+
constructor() {
|
|
16
|
+
//#region ---- Services & Dependencies ----
|
|
17
|
+
this.entityService = inject(AXPEntityService);
|
|
18
|
+
this.debug = inject(AXPDebugService);
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region ---- Command Implementation ----
|
|
22
|
+
async execute(input) {
|
|
23
|
+
const workOrderId = this.resolveText(input?.workOrderId);
|
|
24
|
+
if (!workOrderId) {
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
message: { text: 'workOrderId is required' },
|
|
28
|
+
metadata: { outcome: 'Failed' },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const workOrder = (await this.entityService
|
|
32
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)
|
|
33
|
+
.data()
|
|
34
|
+
.byKey(workOrderId));
|
|
35
|
+
if (!workOrder?.id) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
message: { text: 'Work order not found' },
|
|
39
|
+
metadata: { outcome: 'NotFound' },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (workOrder.statusId === AXMWorkOrderStatus.InProgress) {
|
|
43
|
+
return { success: true, kind: 'object',
|
|
44
|
+
data: {
|
|
45
|
+
workOrderId,
|
|
46
|
+
statusId: AXMWorkOrderStatus.InProgress,
|
|
47
|
+
startedAt: workOrder.startedAt ?? null,
|
|
48
|
+
skipped: true,
|
|
49
|
+
},
|
|
50
|
+
metadata: { outcome: 'Done' },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (workOrder.statusId === AXMWorkOrderStatus.Completed || workOrder.statusId === AXMWorkOrderStatus.SignedOff) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
message: { text: 'Work order is already completed.' },
|
|
57
|
+
metadata: { outcome: 'Failed' },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const startedAt = this.resolveText(workOrder.startedAt) || new Date().toISOString();
|
|
61
|
+
await this.entityService
|
|
62
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)
|
|
63
|
+
.data()
|
|
64
|
+
.update(workOrderId, {
|
|
65
|
+
statusId: AXMWorkOrderStatus.InProgress,
|
|
66
|
+
startedAt,
|
|
67
|
+
});
|
|
68
|
+
this.debug.trace(AXM_WORK_ORDER_WORKFLOW_DEBUG_NAMESPACE, 'work-order-status', 'Work order set to in-progress', { workOrderId, startedAt, previousStatusId: workOrder.statusId });
|
|
69
|
+
return { success: true, kind: 'object',
|
|
70
|
+
data: {
|
|
71
|
+
workOrderId,
|
|
72
|
+
statusId: AXMWorkOrderStatus.InProgress,
|
|
73
|
+
startedAt,
|
|
74
|
+
skipped: false,
|
|
75
|
+
},
|
|
76
|
+
metadata: { outcome: 'Done' },
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region ---- Helpers ----
|
|
81
|
+
resolveText(value) {
|
|
82
|
+
if (!isString(value)) {
|
|
83
|
+
return '';
|
|
84
|
+
}
|
|
85
|
+
return value.trim();
|
|
86
|
+
}
|
|
87
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UpdateWorkOrderInProgressActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
88
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UpdateWorkOrderInProgressActivity, providedIn: 'root' }); }
|
|
89
|
+
}
|
|
90
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UpdateWorkOrderInProgressActivity, decorators: [{
|
|
91
|
+
type: Injectable,
|
|
92
|
+
args: [{ providedIn: 'root' }]
|
|
93
|
+
}] });
|
|
94
|
+
|
|
95
|
+
export { UpdateWorkOrderInProgressActivity };
|
|
96
|
+
//# sourceMappingURL=acorex-platform-module-maintenance-management-client-update-work-order-in-progress.activity-CzkCCl1L.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-maintenance-management-client-update-work-order-in-progress.activity-CzkCCl1L.mjs","sources":["../../../../libs/modules/maintenance-management/client/src/lib/features/work-order/workflows/activities/update-work-order-in-progress.activity.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPDebugService } from '@acorex-platform/framework-client/core';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { inject, Injectable } from '@angular/core';\nimport { isString } from 'lodash';\n\nimport { AXMWorkOrderStatus, RootConfig } from '@acorex-platform/module-maintenance-management-client/contracts';\nimport { AXM_WORK_ORDER_WORKFLOW_DEBUG_NAMESPACE } from '../work-order-workflow.debug';\nimport type { AXMMaintenanceManagementWorkOrderEntityModel } from '@acorex-platform/module-maintenance-management-client/contracts';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface UpdateWorkOrderInProgressInput {\n workOrderId: string;\n}\n\nexport interface UpdateWorkOrderInProgressOutput {\n workOrderId: string;\n statusId: string;\n startedAt: string | null;\n skipped: boolean;\n}\n\n//#endregion\n\n/**\n * Sets the work order to in-progress when it is not already in that state.\n */\n@Injectable({ providedIn: 'root' })\nexport class UpdateWorkOrderInProgressActivity\n implements AXPCommand<UpdateWorkOrderInProgressInput, UpdateWorkOrderInProgressOutput>\n{\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly debug = inject(AXPDebugService);\n\n //#endregion\n\n //#region ---- Command Implementation ----\n\n async execute(\n input: UpdateWorkOrderInProgressInput,\n ): AXPCommandExecuteResultPromise<UpdateWorkOrderInProgressOutput> {\n const workOrderId = this.resolveText(input?.workOrderId);\n if (!workOrderId) {\n return {\n success: false,\n message: { text: 'workOrderId is required' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const workOrder = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)\n .data()\n .byKey(workOrderId)) as AXMMaintenanceManagementWorkOrderEntityModel | null;\n\n if (!workOrder?.id) {\n return {\n success: false,\n message: { text: 'Work order not found' },\n metadata: { outcome: 'NotFound' },\n };\n }\n\n if (workOrder.statusId === AXMWorkOrderStatus.InProgress) {\n return { success: true, kind: 'object',\n data: {\n workOrderId,\n statusId: AXMWorkOrderStatus.InProgress,\n startedAt: workOrder.startedAt ?? null,\n skipped: true,\n },\n metadata: { outcome: 'Done' },\n };\n }\n\n if (workOrder.statusId === AXMWorkOrderStatus.Completed || workOrder.statusId === AXMWorkOrderStatus.SignedOff) {\n return {\n success: false,\n message: { text: 'Work order is already completed.' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const startedAt = this.resolveText(workOrder.startedAt) || new Date().toISOString();\n await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)\n .data()\n .update(workOrderId, {\n statusId: AXMWorkOrderStatus.InProgress,\n startedAt,\n } as never);\n\n this.debug.trace(\n AXM_WORK_ORDER_WORKFLOW_DEBUG_NAMESPACE,\n 'work-order-status',\n 'Work order set to in-progress',\n { workOrderId, startedAt, previousStatusId: workOrder.statusId },\n );\n\n return { success: true, kind: 'object',\n data: {\n workOrderId,\n statusId: AXMWorkOrderStatus.InProgress,\n startedAt,\n skipped: false,\n },\n metadata: { outcome: 'Done' },\n };\n }\n\n //#endregion\n\n //#region ---- Helpers ----\n\n private resolveText(value: unknown): string {\n if (!isString(value)) {\n return '';\n }\n return value.trim();\n }\n\n //#endregion\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, Injectable } from '@angular/core';
|
|
4
|
+
import { get, isNumber, isString } from 'lodash';
|
|
5
|
+
import { RootConfig } from '@acorex-platform/module-maintenance-management-client/contracts';
|
|
6
|
+
import { i as isWorkReportFinalized, a as isWorkReportEditable } from './acorex-platform-module-maintenance-management-client-work-report-assessment.util-Da1HVAit.mjs';
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
/**
|
|
10
|
+
* Updates completion fields on an existing work report after the technician submits the completion form.
|
|
11
|
+
* Checklist references are persisted by {@link RecordWorkReportAssessmentActivity} on checklist submit.
|
|
12
|
+
*/
|
|
13
|
+
class UpdateWorkReportOnCompletionActivity {
|
|
14
|
+
constructor() {
|
|
15
|
+
//#region ---- Services & Dependencies ----
|
|
16
|
+
this.entityService = inject(AXPEntityService);
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region ---- Command Implementation ----
|
|
20
|
+
async execute(input) {
|
|
21
|
+
const workOrderId = this.resolveText(input?.workOrderId);
|
|
22
|
+
const workReportId = this.resolveText(input?.workReportId);
|
|
23
|
+
if (!workOrderId) {
|
|
24
|
+
return {
|
|
25
|
+
success: false,
|
|
26
|
+
message: { text: 'workOrderId is required' },
|
|
27
|
+
metadata: { outcome: 'Failed' },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (!workReportId) {
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
message: { text: 'workReportId is required' },
|
|
34
|
+
metadata: { outcome: 'Failed' },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const workReport = (await this.entityService
|
|
38
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.workReport.name)
|
|
39
|
+
.data()
|
|
40
|
+
.byKey(workReportId));
|
|
41
|
+
if (!workReport?.id) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
message: { text: 'Work report not found' },
|
|
45
|
+
metadata: { outcome: 'NotFound' },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (this.resolveText(workReport.workOrderId) !== workOrderId) {
|
|
49
|
+
return {
|
|
50
|
+
success: false,
|
|
51
|
+
message: { text: 'Work report does not belong to the work order' },
|
|
52
|
+
metadata: { outcome: 'Failed' },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const workOrder = (await this.entityService
|
|
56
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)
|
|
57
|
+
.data()
|
|
58
|
+
.byKey(workOrderId));
|
|
59
|
+
if (isWorkReportFinalized(workReport) || !isWorkReportEditable(workReport, workOrder)) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
message: { text: 'Work report is not editable' },
|
|
63
|
+
metadata: { outcome: 'Failed' },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const formSource = this.resolveFormSource(input);
|
|
67
|
+
const update = {
|
|
68
|
+
result: this.resolveOptionalText(get(formSource, 'result')),
|
|
69
|
+
summary: this.resolveOptionalText(get(formSource, 'summary')),
|
|
70
|
+
actionTaken: this.resolveOptionalText(get(formSource, 'actionTaken')),
|
|
71
|
+
recommendation: this.resolveOptionalText(get(formSource, 'recommendation')),
|
|
72
|
+
laborHours: this.resolveLaborHours(get(formSource, 'laborHours'), workOrder?.actualHours),
|
|
73
|
+
downtimeMinutes: this.resolveDowntimeMinutes(get(formSource, 'downtimeMinutes'), workOrder?.downtimeMinutes),
|
|
74
|
+
endedAt: this.resolveEndedAt(get(formSource, 'endedAt')),
|
|
75
|
+
needFollowUp: get(formSource, 'needFollowUp') === true,
|
|
76
|
+
};
|
|
77
|
+
await this.entityService
|
|
78
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.workReport.name)
|
|
79
|
+
.data()
|
|
80
|
+
.update(workReportId, update);
|
|
81
|
+
return { success: true, kind: 'object',
|
|
82
|
+
data: { workReportId, workOrderId },
|
|
83
|
+
metadata: { outcome: 'Done' },
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region ---- Helpers ----
|
|
88
|
+
resolveFormSource(input) {
|
|
89
|
+
const nested = input.result;
|
|
90
|
+
if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
|
|
91
|
+
return nested;
|
|
92
|
+
}
|
|
93
|
+
return input;
|
|
94
|
+
}
|
|
95
|
+
resolveLaborHours(explicit, fromWorkOrder) {
|
|
96
|
+
if (isNumber(explicit) && explicit >= 0) {
|
|
97
|
+
return explicit;
|
|
98
|
+
}
|
|
99
|
+
if (isNumber(fromWorkOrder) && fromWorkOrder >= 0) {
|
|
100
|
+
return fromWorkOrder;
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
resolveDowntimeMinutes(explicit, fromWorkOrder) {
|
|
105
|
+
if (isNumber(explicit) && explicit >= 0) {
|
|
106
|
+
return explicit;
|
|
107
|
+
}
|
|
108
|
+
if (isNumber(fromWorkOrder) && fromWorkOrder >= 0) {
|
|
109
|
+
return fromWorkOrder;
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
resolveEndedAt(value) {
|
|
114
|
+
const text = this.resolveOptionalText(value);
|
|
115
|
+
if (text) {
|
|
116
|
+
const parsed = new Date(text);
|
|
117
|
+
if (!Number.isNaN(parsed.getTime())) {
|
|
118
|
+
return parsed;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return new Date();
|
|
122
|
+
}
|
|
123
|
+
resolveOptionalText(value) {
|
|
124
|
+
const text = this.resolveText(value);
|
|
125
|
+
return text || undefined;
|
|
126
|
+
}
|
|
127
|
+
resolveText(value) {
|
|
128
|
+
if (!isString(value)) {
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
return value.trim();
|
|
132
|
+
}
|
|
133
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UpdateWorkReportOnCompletionActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
134
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UpdateWorkReportOnCompletionActivity, providedIn: 'root' }); }
|
|
135
|
+
}
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UpdateWorkReportOnCompletionActivity, decorators: [{
|
|
137
|
+
type: Injectable,
|
|
138
|
+
args: [{ providedIn: 'root' }]
|
|
139
|
+
}] });
|
|
140
|
+
|
|
141
|
+
export { UpdateWorkReportOnCompletionActivity };
|
|
142
|
+
//# sourceMappingURL=acorex-platform-module-maintenance-management-client-update-work-report-on-completion.activity-_B0SUFtQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-maintenance-management-client-update-work-report-on-completion.activity-_B0SUFtQ.mjs","sources":["../../../../libs/modules/maintenance-management/client/src/lib/features/work-order/workflows/activities/update-work-report-on-completion.activity.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { inject, Injectable } from '@angular/core';\nimport { get, isNumber, isString } from 'lodash';\n\nimport { RootConfig } from '@acorex-platform/module-maintenance-management-client/contracts';\nimport type { AXMMaintenanceManagementWorkOrderEntityModel } from '@acorex-platform/module-maintenance-management-client/contracts';\nimport type { AXMMaintenanceManagementWorkReportEntityModel } from '@acorex-platform/module-maintenance-management-client/contracts';\nimport { isWorkReportEditable, isWorkReportFinalized } from '../../../work-report/work-report-assessment.util';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface UpdateWorkReportOnCompletionInput {\n workOrderId: string;\n workReportId: string;\n /** Flat field or nested form payload from fill-work-report-completion (workflow `outputs.result`). */\n result?: string | Record<string, unknown>;\n summary?: string;\n actionTaken?: string;\n recommendation?: string;\n laborHours?: number;\n downtimeMinutes?: number;\n endedAt?: string;\n needFollowUp?: boolean;\n}\n\nexport interface UpdateWorkReportOnCompletionOutput {\n workReportId: string;\n workOrderId: string;\n}\n\n//#endregion\n\n/**\n * Updates completion fields on an existing work report after the technician submits the completion form.\n * Checklist references are persisted by {@link RecordWorkReportAssessmentActivity} on checklist submit.\n */\n@Injectable({ providedIn: 'root' })\nexport class UpdateWorkReportOnCompletionActivity\n implements AXPCommand<UpdateWorkReportOnCompletionInput, UpdateWorkReportOnCompletionOutput>\n{\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n\n //#endregion\n\n //#region ---- Command Implementation ----\n\n async execute(\n input: UpdateWorkReportOnCompletionInput,\n ): AXPCommandExecuteResultPromise<UpdateWorkReportOnCompletionOutput> {\n const workOrderId = this.resolveText(input?.workOrderId);\n const workReportId = this.resolveText(input?.workReportId);\n\n if (!workOrderId) {\n return {\n success: false,\n message: { text: 'workOrderId is required' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n if (!workReportId) {\n return {\n success: false,\n message: { text: 'workReportId is required' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const workReport = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.workReport.name)\n .data()\n .byKey(workReportId)) as AXMMaintenanceManagementWorkReportEntityModel | null;\n\n if (!workReport?.id) {\n return {\n success: false,\n message: { text: 'Work report not found' },\n metadata: { outcome: 'NotFound' },\n };\n }\n\n if (this.resolveText(workReport.workOrderId) !== workOrderId) {\n return {\n success: false,\n message: { text: 'Work report does not belong to the work order' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const workOrder = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)\n .data()\n .byKey(workOrderId)) as AXMMaintenanceManagementWorkOrderEntityModel | null;\n\n if (isWorkReportFinalized(workReport) || !isWorkReportEditable(workReport, workOrder)) {\n return {\n success: false,\n message: { text: 'Work report is not editable' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const formSource = this.resolveFormSource(input);\n const update: Partial<AXMMaintenanceManagementWorkReportEntityModel> = {\n result: this.resolveOptionalText(get(formSource, 'result')),\n summary: this.resolveOptionalText(get(formSource, 'summary')),\n actionTaken: this.resolveOptionalText(get(formSource, 'actionTaken')),\n recommendation: this.resolveOptionalText(get(formSource, 'recommendation')),\n laborHours: this.resolveLaborHours(get(formSource, 'laborHours'), workOrder?.actualHours),\n downtimeMinutes: this.resolveDowntimeMinutes(get(formSource, 'downtimeMinutes'), workOrder?.downtimeMinutes),\n endedAt: this.resolveEndedAt(get(formSource, 'endedAt')),\n needFollowUp: get(formSource, 'needFollowUp') === true,\n };\n\n await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.workReport.name)\n .data()\n .update(workReportId, update as never);\n\n return { success: true, kind: 'object',\n data: { workReportId, workOrderId },\n metadata: { outcome: 'Done' },\n };\n }\n\n //#endregion\n\n //#region ---- Helpers ----\n\n private resolveFormSource(input: UpdateWorkReportOnCompletionInput): Record<string, unknown> {\n const nested = input.result;\n if (nested && typeof nested === 'object' && !Array.isArray(nested)) {\n return nested;\n }\n return input as unknown as Record<string, unknown>;\n }\n\n private resolveLaborHours(explicit: unknown, fromWorkOrder: unknown): number | undefined {\n if (isNumber(explicit) && explicit >= 0) {\n return explicit;\n }\n if (isNumber(fromWorkOrder) && fromWorkOrder >= 0) {\n return fromWorkOrder;\n }\n return undefined;\n }\n\n private resolveDowntimeMinutes(explicit: unknown, fromWorkOrder: unknown): number | undefined {\n if (isNumber(explicit) && explicit >= 0) {\n return explicit;\n }\n if (isNumber(fromWorkOrder) && fromWorkOrder >= 0) {\n return fromWorkOrder;\n }\n return undefined;\n }\n\n private resolveEndedAt(value: unknown): Date {\n const text = this.resolveOptionalText(value);\n if (text) {\n const parsed = new Date(text);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed;\n }\n }\n return new Date();\n }\n\n private resolveOptionalText(value: unknown): string | undefined {\n const text = this.resolveText(value);\n return text || undefined;\n }\n\n private resolveText(value: unknown): string {\n if (!isString(value)) {\n return '';\n }\n return value.trim();\n }\n\n //#endregion\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, Injectable } from '@angular/core';
|
|
4
|
+
import { defaultTo, get, isString } from 'lodash';
|
|
5
|
+
import { RootConfig, AXMWorkOrderStatus } from '@acorex-platform/module-maintenance-management-client/contracts';
|
|
6
|
+
|
|
7
|
+
//#endregion
|
|
8
|
+
/**
|
|
9
|
+
* Validates that a work order can be completed.
|
|
10
|
+
* TODO: enforce required questionnaire/checklist responses when multi-stage questionnaires are wired for execution.
|
|
11
|
+
*/
|
|
12
|
+
class ValidateWorkOrderCompletionActivity {
|
|
13
|
+
constructor() {
|
|
14
|
+
//#region ---- Services & Dependencies ----
|
|
15
|
+
this.entityService = inject(AXPEntityService);
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region ---- Command Implementation ----
|
|
19
|
+
async execute(input) {
|
|
20
|
+
const workOrderId = this.resolveText(input?.workOrderId);
|
|
21
|
+
if (!workOrderId) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
message: { text: 'workOrderId is required' },
|
|
25
|
+
metadata: { outcome: 'Failed' },
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const workOrder = (await this.entityService
|
|
29
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)
|
|
30
|
+
.data()
|
|
31
|
+
.byKey(workOrderId));
|
|
32
|
+
if (!workOrder) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
message: { text: 'Work order not found' },
|
|
36
|
+
metadata: { outcome: 'NotFound' },
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (workOrder.statusId !== AXMWorkOrderStatus.InProgress) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
message: { text: 'Work order must be in progress before it can be completed.' },
|
|
43
|
+
metadata: { outcome: 'Failed' },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const workReportPage = await this.entityService
|
|
47
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.workReport.name)
|
|
48
|
+
.data()
|
|
49
|
+
.query({
|
|
50
|
+
skip: 0,
|
|
51
|
+
take: 1,
|
|
52
|
+
filter: {
|
|
53
|
+
logic: 'and',
|
|
54
|
+
filters: [{ field: 'workOrderId', operator: { type: 'equal' }, value: workOrderId }],
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
const workReport = defaultTo(get(workReportPage, 'items[0]'), null);
|
|
58
|
+
const workReportId = workReport?.id?.trim() || null;
|
|
59
|
+
// TODO: when WorkReport becomes mandatory for completion, fail when workReportId is missing.
|
|
60
|
+
// TODO: validate assessments on WorkReport when completion checklists are enabled.
|
|
61
|
+
return { success: true, kind: 'object',
|
|
62
|
+
data: { valid: true, workReportId },
|
|
63
|
+
metadata: { outcome: 'Done' },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region ---- Helpers ----
|
|
68
|
+
resolveText(value) {
|
|
69
|
+
if (!isString(value)) {
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
return value.trim();
|
|
73
|
+
}
|
|
74
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValidateWorkOrderCompletionActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
75
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValidateWorkOrderCompletionActivity, providedIn: 'root' }); }
|
|
76
|
+
}
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValidateWorkOrderCompletionActivity, decorators: [{
|
|
78
|
+
type: Injectable,
|
|
79
|
+
args: [{ providedIn: 'root' }]
|
|
80
|
+
}] });
|
|
81
|
+
|
|
82
|
+
export { ValidateWorkOrderCompletionActivity };
|
|
83
|
+
//# sourceMappingURL=acorex-platform-module-maintenance-management-client-validate-work-order-completion.activity-RA2zaQHH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-maintenance-management-client-validate-work-order-completion.activity-RA2zaQHH.mjs","sources":["../../../../libs/modules/maintenance-management/client/src/lib/features/work-order/workflows/activities/validate-work-order-completion.activity.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { inject, Injectable } from '@angular/core';\nimport { defaultTo, get, isString } from 'lodash';\n\nimport { AXMWorkOrderStatus, RootConfig } from '@acorex-platform/module-maintenance-management-client/contracts';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface ValidateWorkOrderCompletionInput {\n workOrderId: string;\n}\n\nexport interface ValidateWorkOrderCompletionOutput {\n valid: boolean;\n workReportId?: string | null;\n}\n\n//#endregion\n\n/**\n * Validates that a work order can be completed.\n * TODO: enforce required questionnaire/checklist responses when multi-stage questionnaires are wired for execution.\n */\n@Injectable({ providedIn: 'root' })\nexport class ValidateWorkOrderCompletionActivity\n implements AXPCommand<ValidateWorkOrderCompletionInput, ValidateWorkOrderCompletionOutput>\n{\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n\n //#endregion\n\n //#region ---- Command Implementation ----\n\n async execute(\n input: ValidateWorkOrderCompletionInput,\n ): AXPCommandExecuteResultPromise<ValidateWorkOrderCompletionOutput> {\n const workOrderId = this.resolveText(input?.workOrderId);\n if (!workOrderId) {\n return {\n success: false,\n message: { text: 'workOrderId is required' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const workOrder = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.workOrder.name)\n .data()\n .byKey(workOrderId)) as { statusId?: string } | null;\n\n if (!workOrder) {\n return {\n success: false,\n message: { text: 'Work order not found' },\n metadata: { outcome: 'NotFound' },\n };\n }\n\n if (workOrder.statusId !== AXMWorkOrderStatus.InProgress) {\n return {\n success: false,\n message: { text: 'Work order must be in progress before it can be completed.' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const workReportPage = await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.workReport.name)\n .data()\n .query({\n skip: 0,\n take: 1,\n filter: {\n logic: 'and',\n filters: [{ field: 'workOrderId', operator: { type: 'equal' }, value: workOrderId }],\n },\n } as never);\n\n const workReport = defaultTo(get(workReportPage, 'items[0]'), null) as { id?: string } | null;\n const workReportId = workReport?.id?.trim() || null;\n\n // TODO: when WorkReport becomes mandatory for completion, fail when workReportId is missing.\n // TODO: validate assessments on WorkReport when completion checklists are enabled.\n\n return { success: true, kind: 'object',\n data: { valid: true, workReportId },\n metadata: { outcome: 'Done' },\n };\n }\n\n //#endregion\n\n //#region ---- Helpers ----\n\n private resolveText(value: unknown): string {\n if (!isString(value)) {\n return '';\n }\n return value.trim();\n }\n\n //#endregion\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { AXPSessionService } from '@acorex-platform/framework-client/auth';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, Injectable } from '@angular/core';
|
|
4
|
+
import { Router } from '@angular/router';
|
|
5
|
+
import { RootConfig } from '@acorex-platform/module-maintenance-management-client/contracts';
|
|
6
|
+
|
|
7
|
+
/** Asset detail route segments (must match AssetManagement entity registration). */
|
|
8
|
+
const ASSET_DETAIL_MODULE = 'AssetManagement';
|
|
9
|
+
const ASSET_DETAIL_ENTITY = 'Asset';
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region ---- Command ----
|
|
12
|
+
class WorkOrderListCommand {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.router = inject(Router);
|
|
15
|
+
this.sessionService = inject(AXPSessionService);
|
|
16
|
+
}
|
|
17
|
+
resolvePayload(input) {
|
|
18
|
+
const entity = (typeof input.entity === 'string' && input.entity.trim() ? input.entity : undefined) ??
|
|
19
|
+
(typeof input.options?.entity === 'string' && input.options?.entity?.trim()
|
|
20
|
+
? input.options.entity
|
|
21
|
+
: undefined);
|
|
22
|
+
if (!entity) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const conditions = input.conditions ?? input.options?.conditions;
|
|
26
|
+
return { entity, ...(Array.isArray(conditions) ? { conditions } : {}) };
|
|
27
|
+
}
|
|
28
|
+
buildFilterQueries(conditions) {
|
|
29
|
+
if (!Array.isArray(conditions)) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const filters = [];
|
|
33
|
+
for (const condition of conditions) {
|
|
34
|
+
const field = (typeof condition.name === 'string' && condition.name) ||
|
|
35
|
+
(typeof condition.field === 'string'
|
|
36
|
+
? condition.field
|
|
37
|
+
: undefined);
|
|
38
|
+
if (!field || condition.value === undefined || condition.value === null || condition.value === '') {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const operator = condition.operator && typeof condition.operator === 'object' && 'type' in condition.operator
|
|
42
|
+
? condition.operator
|
|
43
|
+
: { type: 'equal' };
|
|
44
|
+
filters.push({ field, operator, value: condition.value });
|
|
45
|
+
}
|
|
46
|
+
return filters;
|
|
47
|
+
}
|
|
48
|
+
resolveAssetIdFromContext(input) {
|
|
49
|
+
const data = input.data;
|
|
50
|
+
if (!data || typeof data !== 'object') {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const record = data;
|
|
54
|
+
const assetId = record['assetId'];
|
|
55
|
+
if (typeof assetId === 'string' && assetId.trim()) {
|
|
56
|
+
return assetId;
|
|
57
|
+
}
|
|
58
|
+
const asset = record['asset'];
|
|
59
|
+
if (asset && typeof asset === 'object' && typeof asset.id === 'string') {
|
|
60
|
+
return asset.id;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
findAssetDetailsRoute() {
|
|
65
|
+
const stack = [this.router.routerState.root];
|
|
66
|
+
while (stack.length > 0) {
|
|
67
|
+
const current = stack.pop();
|
|
68
|
+
if (!current) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const module = current.snapshot.paramMap.get('module');
|
|
72
|
+
const entity = current.snapshot.paramMap.get('entity');
|
|
73
|
+
const id = current.snapshot.paramMap.get('id');
|
|
74
|
+
const onViewRoute = current.snapshot.url.some((segment) => segment.path === 'view');
|
|
75
|
+
if (onViewRoute && module === ASSET_DETAIL_MODULE && entity === ASSET_DETAIL_ENTITY && id) {
|
|
76
|
+
return current;
|
|
77
|
+
}
|
|
78
|
+
stack.push(...current.children);
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
buildWorkOrderPageQueryParams(conditions) {
|
|
83
|
+
const queryParams = {
|
|
84
|
+
page: RootConfig.entities.workOrder.name,
|
|
85
|
+
};
|
|
86
|
+
const filterQueries = this.buildFilterQueries(conditions);
|
|
87
|
+
if (filterQueries.length > 0) {
|
|
88
|
+
queryParams['filters'] = JSON.stringify(filterQueries);
|
|
89
|
+
}
|
|
90
|
+
return queryParams;
|
|
91
|
+
}
|
|
92
|
+
async navigateWithinCurrentAssetDetails(assetDetailsRoute, conditions) {
|
|
93
|
+
await this.router.navigate([], {
|
|
94
|
+
relativeTo: assetDetailsRoute,
|
|
95
|
+
queryParams: this.buildWorkOrderPageQueryParams(conditions),
|
|
96
|
+
queryParamsHandling: 'merge',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async navigateToAssetWorkOrdersPage(assetId, conditions) {
|
|
100
|
+
const appName = this.sessionService.application?.name;
|
|
101
|
+
if (!appName) {
|
|
102
|
+
throw new Error('Application name is required to open work orders in asset layout.');
|
|
103
|
+
}
|
|
104
|
+
const queryParams = this.buildWorkOrderPageQueryParams(conditions);
|
|
105
|
+
const queryString = new URLSearchParams(queryParams).toString();
|
|
106
|
+
const path = `/${appName}/m/${ASSET_DETAIL_MODULE}/e/${ASSET_DETAIL_ENTITY}/${assetId}/view`;
|
|
107
|
+
const url = queryString ? `${path}?${queryString}` : path;
|
|
108
|
+
await this.router.navigateByUrl(url);
|
|
109
|
+
}
|
|
110
|
+
async execute(input) {
|
|
111
|
+
try {
|
|
112
|
+
const payload = this.resolvePayload(input);
|
|
113
|
+
if (!payload) {
|
|
114
|
+
return {
|
|
115
|
+
success: false,
|
|
116
|
+
message: { text: 'Entity is required for Entity:List command.' },
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const assetDetailsRoute = this.findAssetDetailsRoute();
|
|
120
|
+
if (assetDetailsRoute) {
|
|
121
|
+
await this.navigateWithinCurrentAssetDetails(assetDetailsRoute, payload.conditions);
|
|
122
|
+
return { success: true, kind: 'object', data: undefined };
|
|
123
|
+
}
|
|
124
|
+
const assetId = this.resolveAssetIdFromContext(input);
|
|
125
|
+
if (!assetId) {
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
message: {
|
|
129
|
+
text: 'Cannot open work orders in asset layout: asset id is missing on the maintenance plan.',
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
await this.navigateToAssetWorkOrdersPage(assetId, payload.conditions);
|
|
134
|
+
return { success: true, kind: 'object', data: undefined };
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
message: {
|
|
140
|
+
text: `Failed to open work orders in asset layout: ${error instanceof Error ? error.message : String(error)}`,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: WorkOrderListCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
146
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: WorkOrderListCommand }); }
|
|
147
|
+
}
|
|
148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: WorkOrderListCommand, decorators: [{
|
|
149
|
+
type: Injectable
|
|
150
|
+
}] });
|
|
151
|
+
|
|
152
|
+
export { WorkOrderListCommand };
|
|
153
|
+
//# sourceMappingURL=acorex-platform-module-maintenance-management-client-work-order-list-command-Bh_6PS5w.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-maintenance-management-client-work-order-list-command-Bh_6PS5w.mjs","sources":["../../../../libs/modules/maintenance-management/client/src/lib/features/commands/work-order-list-command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { Injectable, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { RootConfig } from '@acorex-platform/module-maintenance-management-client/contracts';\n\n/** Asset detail route segments (must match AssetManagement entity registration). */\nconst ASSET_DETAIL_MODULE = 'AssetManagement';\nconst ASSET_DETAIL_ENTITY = 'Asset';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface WorkOrderListCommandInput {\n entity: string;\n conditions?: Array<{ name?: string; operator?: unknown; value?: unknown }>;\n}\n\ntype WorkOrderListCommandInvocation = Partial<WorkOrderListCommandInput> & {\n data?: Record<string, unknown>;\n options?: Partial<WorkOrderListCommandInput> & { entity?: string; conditions?: WorkOrderListCommandInput['conditions'] };\n};\n\ninterface ListFilterQuery {\n field: string;\n operator: { type: string };\n value: unknown;\n}\n\n//#endregion\n\n//#region ---- Command ----\n\n@Injectable()\nexport class WorkOrderListCommand implements AXPCommand<WorkOrderListCommandInput, void> {\n private readonly router = inject(Router);\n private readonly sessionService = inject(AXPSessionService);\n\n private resolvePayload(input: WorkOrderListCommandInvocation): WorkOrderListCommandInput | null {\n const entity =\n (typeof input.entity === 'string' && input.entity.trim() ? input.entity : undefined) ??\n (typeof input.options?.entity === 'string' && input.options?.entity?.trim()\n ? input.options.entity\n : undefined);\n\n if (!entity) {\n return null;\n }\n\n const conditions = input.conditions ?? input.options?.conditions;\n return { entity, ...(Array.isArray(conditions) ? { conditions } : {}) };\n }\n\n private buildFilterQueries(conditions: WorkOrderListCommandInput['conditions']): ListFilterQuery[] {\n if (!Array.isArray(conditions)) {\n return [];\n }\n\n const filters: ListFilterQuery[] = [];\n\n for (const condition of conditions) {\n const field =\n (typeof condition.name === 'string' && condition.name) ||\n (typeof (condition as { field?: string }).field === 'string'\n ? (condition as { field: string }).field\n : undefined);\n\n if (!field || condition.value === undefined || condition.value === null || condition.value === '') {\n continue;\n }\n\n const operator =\n condition.operator && typeof condition.operator === 'object' && 'type' in condition.operator\n ? (condition.operator as { type: string })\n : { type: 'equal' };\n\n filters.push({ field, operator, value: condition.value });\n }\n\n return filters;\n }\n\n private resolveAssetIdFromContext(input: WorkOrderListCommandInvocation): string | null {\n const data = input.data;\n if (!data || typeof data !== 'object') {\n return null;\n }\n\n const record = data as Record<string, unknown>;\n const assetId = record['assetId'];\n if (typeof assetId === 'string' && assetId.trim()) {\n return assetId;\n }\n\n const asset = record['asset'];\n if (asset && typeof asset === 'object' && typeof (asset as { id?: unknown }).id === 'string') {\n return (asset as { id: string }).id;\n }\n\n return null;\n }\n\n private findAssetDetailsRoute(): ActivatedRoute | null {\n const stack: ActivatedRoute[] = [this.router.routerState.root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) {\n continue;\n }\n\n const module = current.snapshot.paramMap.get('module');\n const entity = current.snapshot.paramMap.get('entity');\n const id = current.snapshot.paramMap.get('id');\n const onViewRoute = current.snapshot.url.some((segment) => segment.path === 'view');\n\n if (onViewRoute && module === ASSET_DETAIL_MODULE && entity === ASSET_DETAIL_ENTITY && id) {\n return current;\n }\n\n stack.push(...current.children);\n }\n\n return null;\n }\n\n private buildWorkOrderPageQueryParams(\n conditions: WorkOrderListCommandInput['conditions'],\n ): Record<string, string> {\n const queryParams: Record<string, string> = {\n page: RootConfig.entities.workOrder.name,\n };\n\n const filterQueries = this.buildFilterQueries(conditions);\n if (filterQueries.length > 0) {\n queryParams['filters'] = JSON.stringify(filterQueries);\n }\n\n return queryParams;\n }\n\n private async navigateWithinCurrentAssetDetails(\n assetDetailsRoute: ActivatedRoute,\n conditions: WorkOrderListCommandInput['conditions'],\n ): Promise<void> {\n await this.router.navigate([], {\n relativeTo: assetDetailsRoute,\n queryParams: this.buildWorkOrderPageQueryParams(conditions),\n queryParamsHandling: 'merge',\n });\n }\n\n private async navigateToAssetWorkOrdersPage(\n assetId: string,\n conditions: WorkOrderListCommandInput['conditions'],\n ): Promise<void> {\n const appName = this.sessionService.application?.name;\n if (!appName) {\n throw new Error('Application name is required to open work orders in asset layout.');\n }\n\n const queryParams = this.buildWorkOrderPageQueryParams(conditions);\n const queryString = new URLSearchParams(queryParams).toString();\n const path = `/${appName}/m/${ASSET_DETAIL_MODULE}/e/${ASSET_DETAIL_ENTITY}/${assetId}/view`;\n const url = queryString ? `${path}?${queryString}` : path;\n\n await this.router.navigateByUrl(url);\n }\n\n async execute(input: WorkOrderListCommandInvocation): AXPCommandExecuteResultPromise<void> {\n try {\n const payload = this.resolvePayload(input);\n if (!payload) {\n return {\n success: false,\n message: { text: 'Entity is required for Entity:List command.' },\n };\n }\n\n const assetDetailsRoute = this.findAssetDetailsRoute();\n if (assetDetailsRoute) {\n await this.navigateWithinCurrentAssetDetails(assetDetailsRoute, payload.conditions);\n return { success: true, kind: 'object', data: undefined };\n }\n\n const assetId = this.resolveAssetIdFromContext(input);\n if (!assetId) {\n return {\n success: false,\n message: {\n text: 'Cannot open work orders in asset layout: asset id is missing on the maintenance plan.',\n },\n };\n }\n\n await this.navigateToAssetWorkOrdersPage(assetId, payload.conditions);\n return { success: true, kind: 'object', data: undefined };\n } catch (error: unknown) {\n return {\n success: false,\n message: {\n text: `Failed to open work orders in asset layout: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n }\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|