@workwell-global/toolkit 1.1.41 → 1.1.42
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/models/schemas/bff/caseDetail/SGetCaseBFF.d.ts +68 -0
- package/dist/models/schemas/bff/caseDetail/SGetCaseBFF.d.ts.map +1 -1
- package/dist/models/schemas/bff/caseDetail/SGetCaseBFF.js +6 -0
- package/dist/models/schemas/bff/caseDetail/SGetCaseBFF.js.map +1 -1
- package/dist/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.d.ts +70 -1
- package/dist/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.d.ts.map +1 -1
- package/dist/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.js +9 -1
- package/dist/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.js.map +1 -1
- package/dist/models/schemas/bff/helpers/CaseHelper.d.ts +38 -0
- package/dist/models/schemas/bff/helpers/CaseHelper.d.ts.map +1 -0
- package/dist/models/schemas/bff/helpers/CaseHelper.js +55 -0
- package/dist/models/schemas/bff/helpers/CaseHelper.js.map +1 -0
- package/dist/models/schemas/bff/helpers/CaseHelper.test.d.ts +2 -0
- package/dist/models/schemas/bff/helpers/CaseHelper.test.d.ts.map +1 -0
- package/dist/models/schemas/bff/helpers/CaseHelper.test.js +113 -0
- package/dist/models/schemas/bff/helpers/CaseHelper.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -29,6 +29,52 @@ export declare const SGetCaseBFF: z.ZodObject<import("../../api/_entityTools/Sch
|
|
|
29
29
|
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
30
30
|
};
|
|
31
31
|
}> & {
|
|
32
|
+
status: z.ZodEnum<["open", "closed"]>;
|
|
33
|
+
requiresResponse: z.ZodBoolean;
|
|
34
|
+
latestActivity: z.ZodOptional<z.ZodObject<import("../../api/_entityTools/SchemasEntityTools.js").TPrettyShape<{
|
|
35
|
+
readonly activityid: {
|
|
36
|
+
readonly pretty: "activityId";
|
|
37
|
+
readonly type: z.ZodString;
|
|
38
|
+
};
|
|
39
|
+
readonly activitytypecode: {
|
|
40
|
+
readonly pretty: "activityType";
|
|
41
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
42
|
+
};
|
|
43
|
+
readonly subject: {
|
|
44
|
+
readonly pretty: "subject";
|
|
45
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
46
|
+
};
|
|
47
|
+
readonly description: {
|
|
48
|
+
readonly pretty: "body";
|
|
49
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
50
|
+
};
|
|
51
|
+
readonly createdon: {
|
|
52
|
+
readonly pretty: "createdOn";
|
|
53
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
54
|
+
};
|
|
55
|
+
readonly modifiedon: {
|
|
56
|
+
readonly pretty: "modifiedOn";
|
|
57
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
58
|
+
};
|
|
59
|
+
}> & {
|
|
60
|
+
fromUser: z.ZodBoolean;
|
|
61
|
+
}, z.UnknownKeysParam, z.ZodTypeAny, {
|
|
62
|
+
activityId: string;
|
|
63
|
+
fromUser: boolean;
|
|
64
|
+
createdOn?: string | null | undefined;
|
|
65
|
+
modifiedOn?: string | null | undefined;
|
|
66
|
+
body?: string | null | undefined;
|
|
67
|
+
activityType?: string | null | undefined;
|
|
68
|
+
subject?: string | null | undefined;
|
|
69
|
+
}, {
|
|
70
|
+
activityId: string;
|
|
71
|
+
fromUser: boolean;
|
|
72
|
+
createdOn?: string | null | undefined;
|
|
73
|
+
modifiedOn?: string | null | undefined;
|
|
74
|
+
body?: string | null | undefined;
|
|
75
|
+
activityType?: string | null | undefined;
|
|
76
|
+
subject?: string | null | undefined;
|
|
77
|
+
}>>;
|
|
32
78
|
activities: z.ZodOptional<z.ZodArray<z.ZodObject<import("../../api/_entityTools/SchemasEntityTools.js").TPrettyShape<{
|
|
33
79
|
readonly activityid: {
|
|
34
80
|
readonly pretty: "activityId";
|
|
@@ -74,7 +120,9 @@ export declare const SGetCaseBFF: z.ZodObject<import("../../api/_entityTools/Sch
|
|
|
74
120
|
subject?: string | null | undefined;
|
|
75
121
|
}>, "many">>;
|
|
76
122
|
}, z.UnknownKeysParam, z.ZodTypeAny, {
|
|
123
|
+
status: "open" | "closed";
|
|
77
124
|
caseId: string;
|
|
125
|
+
requiresResponse: boolean;
|
|
78
126
|
createdOn?: string | null | undefined;
|
|
79
127
|
modifiedOn?: string | null | undefined;
|
|
80
128
|
stateCode?: number | null | undefined;
|
|
@@ -90,8 +138,19 @@ export declare const SGetCaseBFF: z.ZodObject<import("../../api/_entityTools/Sch
|
|
|
90
138
|
activityType?: string | null | undefined;
|
|
91
139
|
subject?: string | null | undefined;
|
|
92
140
|
}[] | undefined;
|
|
141
|
+
latestActivity?: {
|
|
142
|
+
activityId: string;
|
|
143
|
+
fromUser: boolean;
|
|
144
|
+
createdOn?: string | null | undefined;
|
|
145
|
+
modifiedOn?: string | null | undefined;
|
|
146
|
+
body?: string | null | undefined;
|
|
147
|
+
activityType?: string | null | undefined;
|
|
148
|
+
subject?: string | null | undefined;
|
|
149
|
+
} | undefined;
|
|
93
150
|
}, {
|
|
151
|
+
status: "open" | "closed";
|
|
94
152
|
caseId: string;
|
|
153
|
+
requiresResponse: boolean;
|
|
95
154
|
createdOn?: string | null | undefined;
|
|
96
155
|
modifiedOn?: string | null | undefined;
|
|
97
156
|
stateCode?: number | null | undefined;
|
|
@@ -107,6 +166,15 @@ export declare const SGetCaseBFF: z.ZodObject<import("../../api/_entityTools/Sch
|
|
|
107
166
|
activityType?: string | null | undefined;
|
|
108
167
|
subject?: string | null | undefined;
|
|
109
168
|
}[] | undefined;
|
|
169
|
+
latestActivity?: {
|
|
170
|
+
activityId: string;
|
|
171
|
+
fromUser: boolean;
|
|
172
|
+
createdOn?: string | null | undefined;
|
|
173
|
+
modifiedOn?: string | null | undefined;
|
|
174
|
+
body?: string | null | undefined;
|
|
175
|
+
activityType?: string | null | undefined;
|
|
176
|
+
subject?: string | null | undefined;
|
|
177
|
+
} | undefined;
|
|
110
178
|
}>;
|
|
111
179
|
export declare const SCasePathParamsBFF: z.ZodObject<{
|
|
112
180
|
caseId: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SGetCaseBFF.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/caseDetail/SGetCaseBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"SGetCaseBFF.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/caseDetail/SGetCaseBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAqBnB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtB,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA"}
|
|
@@ -2,6 +2,7 @@ import z from 'zod';
|
|
|
2
2
|
import { caseManagementFields } from '../../api/caseManagement/DCaseManagementAPI.js';
|
|
3
3
|
import { createPrettySchema, pickPrettyFields, } from '../../api/_entityTools/SchemasEntityTools.js';
|
|
4
4
|
import { SGetCaseActivityBFF } from './SGetCaseActivityBFF.js';
|
|
5
|
+
import { casePortalStatuses } from '../helpers/CaseHelper.js';
|
|
5
6
|
const filteredFields = pickPrettyFields(caseManagementFields, [
|
|
6
7
|
'caseTitle',
|
|
7
8
|
'caseId',
|
|
@@ -11,7 +12,12 @@ const filteredFields = pickPrettyFields(caseManagementFields, [
|
|
|
11
12
|
'createdOn',
|
|
12
13
|
'modifiedOn',
|
|
13
14
|
]);
|
|
15
|
+
// `status`, `requiresResponse` and `latestActivity` are derived in the BFF
|
|
16
|
+
// (see helpers/CaseHelper.ts); `activities` holds only visible types, newest first.
|
|
14
17
|
export const SGetCaseBFF = createPrettySchema(filteredFields).extend({
|
|
18
|
+
status: z.enum(casePortalStatuses),
|
|
19
|
+
requiresResponse: z.boolean(),
|
|
20
|
+
latestActivity: SGetCaseActivityBFF.optional(),
|
|
15
21
|
activities: z.array(SGetCaseActivityBFF).optional(),
|
|
16
22
|
});
|
|
17
23
|
export const SCasePathParamsBFF = z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SGetCaseBFF.js","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/caseDetail/SGetCaseBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,8CAA8C,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"SGetCaseBFF.js","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/caseDetail/SGetCaseBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,8CAA8C,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,MAAM,cAAc,GAAG,gBAAgB,CAAC,oBAAoB,EAAE;IAC5D,WAAW;IACX,QAAQ;IACR,cAAc;IACd,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;CACb,CAAC,CAAA;AAEF,2EAA2E;AAC3E,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE;IAC7B,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IAC9C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA"}
|
|
@@ -28,22 +28,91 @@ export declare const SGetCasesSummaryBFF: z.ZodObject<import("../../api/_entityT
|
|
|
28
28
|
readonly pretty: "modifiedOn";
|
|
29
29
|
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
30
30
|
};
|
|
31
|
-
}
|
|
31
|
+
}> & {
|
|
32
|
+
status: z.ZodEnum<["open", "closed"]>;
|
|
33
|
+
requiresResponse: z.ZodBoolean;
|
|
34
|
+
latestActivity: z.ZodOptional<z.ZodObject<import("../../api/_entityTools/SchemasEntityTools.js").TPrettyShape<{
|
|
35
|
+
readonly activityid: {
|
|
36
|
+
readonly pretty: "activityId";
|
|
37
|
+
readonly type: z.ZodString;
|
|
38
|
+
};
|
|
39
|
+
readonly activitytypecode: {
|
|
40
|
+
readonly pretty: "activityType";
|
|
41
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
42
|
+
};
|
|
43
|
+
readonly subject: {
|
|
44
|
+
readonly pretty: "subject";
|
|
45
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
46
|
+
};
|
|
47
|
+
readonly description: {
|
|
48
|
+
readonly pretty: "body";
|
|
49
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
50
|
+
};
|
|
51
|
+
readonly createdon: {
|
|
52
|
+
readonly pretty: "createdOn";
|
|
53
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
54
|
+
};
|
|
55
|
+
readonly modifiedon: {
|
|
56
|
+
readonly pretty: "modifiedOn";
|
|
57
|
+
readonly type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
58
|
+
};
|
|
59
|
+
}> & {
|
|
60
|
+
fromUser: z.ZodBoolean;
|
|
61
|
+
}, z.UnknownKeysParam, z.ZodTypeAny, {
|
|
62
|
+
activityId: string;
|
|
63
|
+
fromUser: boolean;
|
|
64
|
+
createdOn?: string | null | undefined;
|
|
65
|
+
modifiedOn?: string | null | undefined;
|
|
66
|
+
body?: string | null | undefined;
|
|
67
|
+
activityType?: string | null | undefined;
|
|
68
|
+
subject?: string | null | undefined;
|
|
69
|
+
}, {
|
|
70
|
+
activityId: string;
|
|
71
|
+
fromUser: boolean;
|
|
72
|
+
createdOn?: string | null | undefined;
|
|
73
|
+
modifiedOn?: string | null | undefined;
|
|
74
|
+
body?: string | null | undefined;
|
|
75
|
+
activityType?: string | null | undefined;
|
|
76
|
+
subject?: string | null | undefined;
|
|
77
|
+
}>>;
|
|
78
|
+
}, z.UnknownKeysParam, z.ZodTypeAny, {
|
|
79
|
+
status: "open" | "closed";
|
|
32
80
|
caseId: string;
|
|
81
|
+
requiresResponse: boolean;
|
|
33
82
|
createdOn?: string | null | undefined;
|
|
34
83
|
modifiedOn?: string | null | undefined;
|
|
35
84
|
stateCode?: number | null | undefined;
|
|
36
85
|
statusCode?: number | null | undefined;
|
|
37
86
|
caseTitle?: string | null | undefined;
|
|
38
87
|
ticketNumber?: string | null | undefined;
|
|
88
|
+
latestActivity?: {
|
|
89
|
+
activityId: string;
|
|
90
|
+
fromUser: boolean;
|
|
91
|
+
createdOn?: string | null | undefined;
|
|
92
|
+
modifiedOn?: string | null | undefined;
|
|
93
|
+
body?: string | null | undefined;
|
|
94
|
+
activityType?: string | null | undefined;
|
|
95
|
+
subject?: string | null | undefined;
|
|
96
|
+
} | undefined;
|
|
39
97
|
}, {
|
|
98
|
+
status: "open" | "closed";
|
|
40
99
|
caseId: string;
|
|
100
|
+
requiresResponse: boolean;
|
|
41
101
|
createdOn?: string | null | undefined;
|
|
42
102
|
modifiedOn?: string | null | undefined;
|
|
43
103
|
stateCode?: number | null | undefined;
|
|
44
104
|
statusCode?: number | null | undefined;
|
|
45
105
|
caseTitle?: string | null | undefined;
|
|
46
106
|
ticketNumber?: string | null | undefined;
|
|
107
|
+
latestActivity?: {
|
|
108
|
+
activityId: string;
|
|
109
|
+
fromUser: boolean;
|
|
110
|
+
createdOn?: string | null | undefined;
|
|
111
|
+
modifiedOn?: string | null | undefined;
|
|
112
|
+
body?: string | null | undefined;
|
|
113
|
+
activityType?: string | null | undefined;
|
|
114
|
+
subject?: string | null | undefined;
|
|
115
|
+
} | undefined;
|
|
47
116
|
}>;
|
|
48
117
|
export declare const SCasesSummaryPathParamsBFF: z.ZodObject<{
|
|
49
118
|
userId: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SGetCasesSummaryBFF.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"SGetCasesSummaryBFF.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAqBnB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI9B,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;EAErC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AACrE,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAC9C,OAAO,0BAA0B,CAClC,CAAA"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import z from 'zod';
|
|
2
2
|
import { caseManagementFields } from '../../api/caseManagement/DCaseManagementAPI.js';
|
|
3
3
|
import { createPrettySchema, pickPrettyFields, } from '../../api/_entityTools/SchemasEntityTools.js';
|
|
4
|
+
import { SGetCaseActivityBFF } from '../caseDetail/SGetCaseActivityBFF.js';
|
|
5
|
+
import { casePortalStatuses } from '../helpers/CaseHelper.js';
|
|
4
6
|
const filteredFields = pickPrettyFields(caseManagementFields, [
|
|
5
7
|
'caseTitle',
|
|
6
8
|
'caseId',
|
|
@@ -10,7 +12,13 @@ const filteredFields = pickPrettyFields(caseManagementFields, [
|
|
|
10
12
|
'createdOn',
|
|
11
13
|
'modifiedOn',
|
|
12
14
|
]);
|
|
13
|
-
|
|
15
|
+
// `status`, `requiresResponse` and `latestActivity` are derived in the BFF
|
|
16
|
+
// (see helpers/CaseHelper.ts) so the portals never re-implement the rules.
|
|
17
|
+
export const SGetCasesSummaryBFF = createPrettySchema(filteredFields).extend({
|
|
18
|
+
status: z.enum(casePortalStatuses),
|
|
19
|
+
requiresResponse: z.boolean(),
|
|
20
|
+
latestActivity: SGetCaseActivityBFF.optional(),
|
|
21
|
+
});
|
|
14
22
|
export const SCasesSummaryPathParamsBFF = z.object({
|
|
15
23
|
userId: z.string().uuid(),
|
|
16
24
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SGetCasesSummaryBFF.js","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,8CAA8C,CAAA;
|
|
1
|
+
{"version":3,"file":"SGetCasesSummaryBFF.js","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/casesSummary/SGetCasesSummaryBFF.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,8CAA8C,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,MAAM,cAAc,GAAG,gBAAgB,CAAC,oBAAoB,EAAE;IAC5D,WAAW;IACX,QAAQ;IACR,cAAc;IACd,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;CACb,CAAC,CAAA;AAEF,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE;IAC7B,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAC1B,CAAC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Portal-facing case status. D365 `resolved` AND `cancelled` both read as closed. */
|
|
2
|
+
export declare const casePortalStatuses: readonly ["open", "closed"];
|
|
3
|
+
export type TCasePortalStatus = (typeof casePortalStatuses)[number];
|
|
4
|
+
export declare const toCasePortalStatus: (stateCode: number | null | undefined) => TCasePortalStatus;
|
|
5
|
+
/** The minimum an activity needs for visibility and sender checks. */
|
|
6
|
+
export type TCaseActivityLike = {
|
|
7
|
+
activityType?: string | null;
|
|
8
|
+
createdOn?: string | null;
|
|
9
|
+
modifiedOn?: string | null;
|
|
10
|
+
parties?: {
|
|
11
|
+
contactId?: string | null;
|
|
12
|
+
activityRole?: number | null;
|
|
13
|
+
}[] | null;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Activity types a portal user may see on a case timeline (#1601). Anything
|
|
17
|
+
* else (phone call, task, appointment, letter...) is internal and dropped.
|
|
18
|
+
*/
|
|
19
|
+
export declare const visibleCaseActivityTypes: readonly string[];
|
|
20
|
+
/**
|
|
21
|
+
* An email is visible only when the user is one of its parties (internal-only
|
|
22
|
+
* emails are hidden); web messages and case resolutions are always visible.
|
|
23
|
+
*/
|
|
24
|
+
export declare const isVisibleCaseActivity: (activity: TCaseActivityLike, userId: string) => boolean;
|
|
25
|
+
/** The user authored an activity when they are its Sender/From party. */
|
|
26
|
+
export declare const isActivityFromUser: (activity: TCaseActivityLike, userId: string) => boolean;
|
|
27
|
+
/** Visible activities, newest first by createdOn (falling back to modifiedOn). */
|
|
28
|
+
export declare const sortVisibleCaseActivities: <T extends TCaseActivityLike>(activities: T[] | null | undefined, userId: string) => T[];
|
|
29
|
+
export declare const selectLatestVisibleActivity: <T extends TCaseActivityLike>(activities: T[] | null | undefined, userId: string) => T | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* A case requires the user's response when it is open and the latest visible
|
|
32
|
+
* activity was not sent by them (#1595). Closed cases never do, even though
|
|
33
|
+
* the user may still reply to them.
|
|
34
|
+
*/
|
|
35
|
+
export declare const isCaseRequiringResponse: (status: TCasePortalStatus, latestActivity: {
|
|
36
|
+
fromUser: boolean;
|
|
37
|
+
} | null | undefined) => boolean;
|
|
38
|
+
//# sourceMappingURL=CaseHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaseHelper.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/helpers/CaseHelper.ts"],"names":[],"mappings":"AAOA,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,6BAA8B,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,eAAO,MAAM,kBAAkB,GAC7B,WAAW,MAAM,GAAG,IAAI,GAAG,SAAS,KACnC,iBAGW,CAAA;AAEd,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,GAAG,IAAI,CAAA;CAC/E,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAIrD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,iBAAiB,EAC3B,QAAQ,MAAM,KACb,OAOF,CAAA;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,GAC7B,UAAU,iBAAiB,EAC3B,QAAQ,MAAM,KACb,OAIsB,CAAA;AAWzB,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,GAAI,CAAC,SAAS,iBAAiB,EACnE,YAAY,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,EAClC,QAAQ,MAAM,KACb,CAAC,EAIkD,CAAA;AAEtD,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,iBAAiB,EACrE,YAAY,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,EAClC,QAAQ,MAAM,KACb,CAAC,GAAG,SAA6D,CAAA;AAEpE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,iBAAiB,EACzB,gBAAgB;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,KACvD,OAA4E,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { caseManagementOptions } from '../../api/caseManagement/DCaseManagementAPI.js';
|
|
2
|
+
import { activityPointerOptions } from '../../api/activityPointer/DActivityPointerAPI.js';
|
|
3
|
+
import { activityPartyOptions } from '../../api/activityParty/DActivityPartyAPI.js';
|
|
4
|
+
// Case Management business rules shared by every BFF route (list, detail,
|
|
5
|
+
// metrics) so the portals never re-derive them. Pure functions, no D365 access.
|
|
6
|
+
/** Portal-facing case status. D365 `resolved` AND `cancelled` both read as closed. */
|
|
7
|
+
export const casePortalStatuses = ['open', 'closed'];
|
|
8
|
+
export const toCasePortalStatus = (stateCode) => stateCode == null || stateCode === caseManagementOptions.Status.active
|
|
9
|
+
? 'open'
|
|
10
|
+
: 'closed';
|
|
11
|
+
/**
|
|
12
|
+
* Activity types a portal user may see on a case timeline (#1601). Anything
|
|
13
|
+
* else (phone call, task, appointment, letter...) is internal and dropped.
|
|
14
|
+
*/
|
|
15
|
+
export const visibleCaseActivityTypes = [
|
|
16
|
+
activityPointerOptions.ActivityTypes.email,
|
|
17
|
+
activityPointerOptions.ActivityTypes.webMessage,
|
|
18
|
+
activityPointerOptions.ActivityTypes.incidentResolution,
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* An email is visible only when the user is one of its parties (internal-only
|
|
22
|
+
* emails are hidden); web messages and case resolutions are always visible.
|
|
23
|
+
*/
|
|
24
|
+
export const isVisibleCaseActivity = (activity, userId) => {
|
|
25
|
+
const type = activity.activityType ?? '';
|
|
26
|
+
if (!visibleCaseActivityTypes.includes(type))
|
|
27
|
+
return false;
|
|
28
|
+
if (type === activityPointerOptions.ActivityTypes.email) {
|
|
29
|
+
return !!activity.parties?.some(party => party.contactId === userId);
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
};
|
|
33
|
+
/** The user authored an activity when they are its Sender/From party. */
|
|
34
|
+
export const isActivityFromUser = (activity, userId) => activity.parties?.find(party => party.activityRole === activityPartyOptions.ParticipationTypes.Sender)?.contactId === userId;
|
|
35
|
+
// Chronology is createdOn. D365 rewrites modifiedOn whenever an activity's
|
|
36
|
+
// status changes (e.g. every open activity is completed when a case is
|
|
37
|
+
// resolved), so ordering by it scrambles a thread. modifiedOn is only a fallback.
|
|
38
|
+
const activityTime = (activity) => {
|
|
39
|
+
const stamp = activity.createdOn ?? activity.modifiedOn;
|
|
40
|
+
const time = stamp ? new Date(stamp).getTime() : NaN;
|
|
41
|
+
return Number.isNaN(time) ? 0 : time;
|
|
42
|
+
};
|
|
43
|
+
/** Visible activities, newest first by createdOn (falling back to modifiedOn). */
|
|
44
|
+
export const sortVisibleCaseActivities = (activities, userId) => (activities ?? [])
|
|
45
|
+
.filter(activity => isVisibleCaseActivity(activity, userId))
|
|
46
|
+
.slice()
|
|
47
|
+
.sort((a, b) => activityTime(b) - activityTime(a));
|
|
48
|
+
export const selectLatestVisibleActivity = (activities, userId) => sortVisibleCaseActivities(activities, userId)[0];
|
|
49
|
+
/**
|
|
50
|
+
* A case requires the user's response when it is open and the latest visible
|
|
51
|
+
* activity was not sent by them (#1595). Closed cases never do, even though
|
|
52
|
+
* the user may still reply to them.
|
|
53
|
+
*/
|
|
54
|
+
export const isCaseRequiringResponse = (status, latestActivity) => status === 'open' && !!latestActivity && !latestActivity.fromUser;
|
|
55
|
+
//# sourceMappingURL=CaseHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaseHelper.js","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/helpers/CaseHelper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaseHelper.test.d.ts","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/helpers/CaseHelper.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { isActivityFromUser, isCaseRequiringResponse, isVisibleCaseActivity, selectLatestVisibleActivity, sortVisibleCaseActivities, toCasePortalStatus, } from './CaseHelper.js';
|
|
3
|
+
const USER = '22222222-2222-4222-8222-222222222222';
|
|
4
|
+
const AGENT = '33333333-3333-4333-8333-333333333333';
|
|
5
|
+
const sender = (contactId) => ({ contactId, activityRole: 1 });
|
|
6
|
+
const recipient = (contactId) => ({ contactId, activityRole: 2 });
|
|
7
|
+
describe('toCasePortalStatus', () => {
|
|
8
|
+
it('maps active to open and both resolved and cancelled to closed', () => {
|
|
9
|
+
expect(toCasePortalStatus(0)).toBe('open');
|
|
10
|
+
expect(toCasePortalStatus(1)).toBe('closed');
|
|
11
|
+
expect(toCasePortalStatus(2)).toBe('closed');
|
|
12
|
+
});
|
|
13
|
+
it('treats a missing state as open', () => {
|
|
14
|
+
expect(toCasePortalStatus(null)).toBe('open');
|
|
15
|
+
expect(toCasePortalStatus(undefined)).toBe('open');
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('isVisibleCaseActivity', () => {
|
|
19
|
+
it('shows emails only when the user is a party', () => {
|
|
20
|
+
expect(isVisibleCaseActivity({ activityType: 'email', parties: [sender(AGENT), recipient(USER)] }, USER)).toBe(true);
|
|
21
|
+
expect(isVisibleCaseActivity({ activityType: 'email', parties: [sender(AGENT)] }, USER)).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it('always shows web messages and case resolutions', () => {
|
|
24
|
+
expect(isVisibleCaseActivity({ activityType: 'ww_webmessage' }, USER)).toBe(true);
|
|
25
|
+
expect(isVisibleCaseActivity({ activityType: 'incidentresolution' }, USER)).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it('hides every other type, including phone calls', () => {
|
|
28
|
+
expect(isVisibleCaseActivity({ activityType: 'phonecall' }, USER)).toBe(false);
|
|
29
|
+
expect(isVisibleCaseActivity({ activityType: 'task' }, USER)).toBe(false);
|
|
30
|
+
expect(isVisibleCaseActivity({ activityType: null }, USER)).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('isActivityFromUser', () => {
|
|
34
|
+
it('is true only when the user is the Sender party', () => {
|
|
35
|
+
expect(isActivityFromUser({ parties: [sender(USER), recipient(AGENT)] }, USER)).toBe(true);
|
|
36
|
+
expect(isActivityFromUser({ parties: [sender(AGENT), recipient(USER)] }, USER)).toBe(false);
|
|
37
|
+
expect(isActivityFromUser({ parties: [] }, USER)).toBe(false);
|
|
38
|
+
expect(isActivityFromUser({}, USER)).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('sortVisibleCaseActivities / selectLatestVisibleActivity', () => {
|
|
42
|
+
const activities = [
|
|
43
|
+
{
|
|
44
|
+
activityId: 'old-web',
|
|
45
|
+
activityType: 'ww_webmessage',
|
|
46
|
+
createdOn: '2026-09-01T09:00:00Z',
|
|
47
|
+
modifiedOn: '2026-09-01T09:00:00Z',
|
|
48
|
+
parties: [sender(USER)],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
activityId: 'internal-email',
|
|
52
|
+
activityType: 'email',
|
|
53
|
+
createdOn: '2026-09-03T09:00:00Z',
|
|
54
|
+
parties: [sender(AGENT)],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
activityId: 'phone',
|
|
58
|
+
activityType: 'phonecall',
|
|
59
|
+
createdOn: '2026-09-04T09:00:00Z',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
activityId: 'reply-email',
|
|
63
|
+
activityType: 'email',
|
|
64
|
+
createdOn: '2026-09-02T09:00:00Z',
|
|
65
|
+
modifiedOn: '2026-09-02T12:00:00Z',
|
|
66
|
+
parties: [sender(AGENT), recipient(USER)],
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
it('orders by createdOn even when an older activity was modified later (case resolved)', () => {
|
|
70
|
+
const resolvedAt = '2026-09-05T08:00:00Z';
|
|
71
|
+
const thread = [
|
|
72
|
+
{
|
|
73
|
+
activityId: 'first',
|
|
74
|
+
activityType: 'ww_webmessage',
|
|
75
|
+
createdOn: '2026-09-01T09:00:00Z',
|
|
76
|
+
modifiedOn: resolvedAt,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
activityId: 'second',
|
|
80
|
+
activityType: 'email',
|
|
81
|
+
createdOn: '2026-09-02T09:00:00Z',
|
|
82
|
+
modifiedOn: resolvedAt,
|
|
83
|
+
parties: [sender(AGENT), recipient(USER)],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
activityId: 'resolution',
|
|
87
|
+
activityType: 'incidentresolution',
|
|
88
|
+
createdOn: resolvedAt,
|
|
89
|
+
modifiedOn: resolvedAt,
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
expect(sortVisibleCaseActivities(thread, USER).map(a => a.activityId)).toEqual(['resolution', 'second', 'first']);
|
|
93
|
+
});
|
|
94
|
+
it('drops hidden activities and orders newest first by createdOn', () => {
|
|
95
|
+
expect(sortVisibleCaseActivities(activities, USER).map(a => a.activityId)).toEqual(['reply-email', 'old-web']);
|
|
96
|
+
});
|
|
97
|
+
it('selects the newest visible activity, skipping newer hidden ones', () => {
|
|
98
|
+
expect(selectLatestVisibleActivity(activities, USER)?.activityId).toBe('reply-email');
|
|
99
|
+
expect(selectLatestVisibleActivity([], USER)).toBeUndefined();
|
|
100
|
+
expect(selectLatestVisibleActivity(undefined, USER)).toBeUndefined();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('isCaseRequiringResponse', () => {
|
|
104
|
+
it('is true for an open case whose latest visible activity is not from the user', () => {
|
|
105
|
+
expect(isCaseRequiringResponse('open', { fromUser: false })).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
it('is false when the user sent the latest activity, there is none, or the case is closed', () => {
|
|
108
|
+
expect(isCaseRequiringResponse('open', { fromUser: true })).toBe(false);
|
|
109
|
+
expect(isCaseRequiringResponse('open', undefined)).toBe(false);
|
|
110
|
+
expect(isCaseRequiringResponse('closed', { fromUser: false })).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=CaseHelper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaseHelper.test.js","sourceRoot":"","sources":["../../../../../src/models/schemas/bff/helpers/CaseHelper.test.ts"],"names":[],"mappings":"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"}
|