@platform-modules/civil-aviation-authority 2.3.297 → 2.3.299
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.
|
@@ -183,6 +183,18 @@
|
|
|
183
183
|
"it_helpdesk_wf_l3_not_required_closed": {
|
|
184
184
|
"en": "L3 assignment not required, request closed by {{userName}}{{comment}}",
|
|
185
185
|
"ar": "تعيين المستوى الثالث (L3) غير مطلوب، تم إغلاق الطلب بواسطة {{userName}}{{comment}}"
|
|
186
|
+
},
|
|
187
|
+
"request_assigned": {
|
|
188
|
+
"en": "Request Assigned",
|
|
189
|
+
"ar": "تم تعيين الطلب"
|
|
190
|
+
},
|
|
191
|
+
"request_pending_from": {
|
|
192
|
+
"en": "Request Pending from {{name}}",
|
|
193
|
+
"ar": "الطلب قيد الانتظار من {{name}}"
|
|
194
|
+
},
|
|
195
|
+
"request_pending": {
|
|
196
|
+
"en": "Request Pending",
|
|
197
|
+
"ar": "الطلب قيد الانتظار"
|
|
186
198
|
}
|
|
187
199
|
},
|
|
188
200
|
"chatTemplates": {
|
|
@@ -58,6 +58,15 @@ export declare function renderSynchronizedWorkflowMessage(templateKey: string, e
|
|
|
58
58
|
export declare function renderSynchronizedChatMessage(templateKey: string, enParams: Record<string, string>, arParams: Record<string, string>): BilingualText;
|
|
59
59
|
export declare function buildBilingualFromTemplate(templateCatalog: Record<string, BilingualText>, key: string, params?: Record<string, string>, arParams?: Record<string, string>): BilingualText;
|
|
60
60
|
export declare function workflowTemplate(key: string, params?: Record<string, string>, arParams?: Record<string, string>): BilingualText;
|
|
61
|
+
/** Create/submit step for assign-tasks-emp workflow logs. */
|
|
62
|
+
export declare function buildAssignTasksEmpAssignedWorkflowFields(): BilingualText;
|
|
63
|
+
/** Approval step — pending from assigned employee. */
|
|
64
|
+
export declare function buildAssignTasksEmpPendingFromWorkflowFields(params: {
|
|
65
|
+
userName: string;
|
|
66
|
+
userArabicName?: string | null;
|
|
67
|
+
}): BilingualText;
|
|
68
|
+
/** Approval step fallback when assignee name is unavailable. */
|
|
69
|
+
export declare function buildAssignTasksEmpPendingWorkflowFields(): BilingualText;
|
|
61
70
|
export declare function chatTemplate(key: string, params?: Record<string, string>, arParams?: Record<string, string>): BilingualText;
|
|
62
71
|
/**
|
|
63
72
|
* Standard entry point for workflow `content` + `content_ar`.
|
|
@@ -17,6 +17,9 @@ exports.renderSynchronizedWorkflowMessage = renderSynchronizedWorkflowMessage;
|
|
|
17
17
|
exports.renderSynchronizedChatMessage = renderSynchronizedChatMessage;
|
|
18
18
|
exports.buildBilingualFromTemplate = buildBilingualFromTemplate;
|
|
19
19
|
exports.workflowTemplate = workflowTemplate;
|
|
20
|
+
exports.buildAssignTasksEmpAssignedWorkflowFields = buildAssignTasksEmpAssignedWorkflowFields;
|
|
21
|
+
exports.buildAssignTasksEmpPendingFromWorkflowFields = buildAssignTasksEmpPendingFromWorkflowFields;
|
|
22
|
+
exports.buildAssignTasksEmpPendingWorkflowFields = buildAssignTasksEmpPendingWorkflowFields;
|
|
20
23
|
exports.chatTemplate = chatTemplate;
|
|
21
24
|
exports.buildSynchronizedWorkflowMessage = buildSynchronizedWorkflowMessage;
|
|
22
25
|
exports.buildSynchronizedChatMessage = buildSynchronizedChatMessage;
|
|
@@ -154,6 +157,45 @@ function buildBilingualFromTemplate(templateCatalog, key, params = {}, arParams)
|
|
|
154
157
|
function workflowTemplate(key, params = {}, arParams) {
|
|
155
158
|
return buildBilingualFromTemplate(WORKFLOW_TEMPLATES, key, params, arParams);
|
|
156
159
|
}
|
|
160
|
+
/** Assign-tasks-emp workflow templates (catalog + runtime fallback when dist JSON is stale). */
|
|
161
|
+
const ASSIGN_TASKS_EMP_WF_FALLBACKS = {
|
|
162
|
+
request_assigned: { en: 'Request Assigned', ar: 'تم تعيين الطلب' },
|
|
163
|
+
request_pending_from: { en: 'Request Pending from {{name}}', ar: 'الطلب قيد الانتظار من {{name}}' },
|
|
164
|
+
request_pending: { en: 'Request Pending', ar: 'الطلب قيد الانتظار' },
|
|
165
|
+
};
|
|
166
|
+
function resolveAssignTasksEmpWorkflowTemplate(key, enParams = {}, arParams) {
|
|
167
|
+
const tpl = WORKFLOW_TEMPLATES[key] ?? ASSIGN_TASKS_EMP_WF_FALLBACKS[key];
|
|
168
|
+
const arabicParams = arParams ?? enParams;
|
|
169
|
+
return {
|
|
170
|
+
en: interpolate(tpl.en, enParams),
|
|
171
|
+
ar: interpolate(tpl.ar, arabicParams),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/** Create/submit step for assign-tasks-emp workflow logs. */
|
|
175
|
+
function buildAssignTasksEmpAssignedWorkflowFields() {
|
|
176
|
+
return resolveAssignTasksEmpWorkflowTemplate('request_assigned');
|
|
177
|
+
}
|
|
178
|
+
/** Approval step — pending from assigned employee. */
|
|
179
|
+
function buildAssignTasksEmpPendingFromWorkflowFields(params) {
|
|
180
|
+
const nameEn = params.userName.trim() || 'Unknown User';
|
|
181
|
+
const nameAr = resolveBilingualName(nameEn, params.userArabicName);
|
|
182
|
+
return resolveAssignTasksEmpWorkflowTemplate('request_pending_from', { name: nameEn }, { name: nameAr });
|
|
183
|
+
}
|
|
184
|
+
/** Approval step fallback when assignee name is unavailable. */
|
|
185
|
+
function buildAssignTasksEmpPendingWorkflowFields() {
|
|
186
|
+
return resolveAssignTasksEmpWorkflowTemplate('request_pending');
|
|
187
|
+
}
|
|
188
|
+
function resolveStoredAssignTasksEmpTemplateKey(content, actors) {
|
|
189
|
+
const normalized = content?.trim();
|
|
190
|
+
if (!normalized || !(normalized in ASSIGN_TASKS_EMP_WF_FALLBACKS))
|
|
191
|
+
return null;
|
|
192
|
+
if (normalized === 'request_pending_from') {
|
|
193
|
+
const nameEn = actors?.userName?.trim() || 'Unknown User';
|
|
194
|
+
const nameAr = resolveArabicWorkflowActorName(actors, nameEn);
|
|
195
|
+
return resolveAssignTasksEmpWorkflowTemplate('request_pending_from', { name: nameEn }, { name: nameAr });
|
|
196
|
+
}
|
|
197
|
+
return resolveAssignTasksEmpWorkflowTemplate(normalized);
|
|
198
|
+
}
|
|
157
199
|
function chatTemplate(key, params = {}, arParams) {
|
|
158
200
|
return buildBilingualFromTemplate(CHAT_TEMPLATES, key, params, arParams);
|
|
159
201
|
}
|
|
@@ -326,6 +368,19 @@ function buildRequestApprovedAssignedWorkflowFields(params) {
|
|
|
326
368
|
}
|
|
327
369
|
/** Standard workflow log UPDATE fields for all CAA module repositories. */
|
|
328
370
|
function buildWorkflowLogUpdateFields(params) {
|
|
371
|
+
if (params.approvalStatus === 'Closed') {
|
|
372
|
+
const closed = buildClosedWorkflowMessage({
|
|
373
|
+
roleName: params.roleName,
|
|
374
|
+
roleArabicName: params.roleArabicName,
|
|
375
|
+
comment: params.comment,
|
|
376
|
+
});
|
|
377
|
+
return {
|
|
378
|
+
content: closed.en,
|
|
379
|
+
content_ar: closed.ar,
|
|
380
|
+
status: params.workflowStatus,
|
|
381
|
+
status_ar: resolveWorkflowStatusAr(params.workflowStatus),
|
|
382
|
+
};
|
|
383
|
+
}
|
|
329
384
|
const isApprovedLike = params.approvalStatus === 'Approved' || params.approvalStatus === 'Assigned';
|
|
330
385
|
if (isApprovedLike) {
|
|
331
386
|
const assignment = tryParseRequestAssignedComment(params.comment);
|
|
@@ -1131,6 +1186,9 @@ function resolveWorkflowContentAr(content, actors) {
|
|
|
1131
1186
|
if (content == null || content.trim() === '')
|
|
1132
1187
|
return null;
|
|
1133
1188
|
const normalized = content.trim();
|
|
1189
|
+
const assignTasksEmpFromKey = resolveStoredAssignTasksEmpTemplateKey(normalized, actors);
|
|
1190
|
+
if (assignTasksEmpFromKey)
|
|
1191
|
+
return assignTasksEmpFromKey.ar;
|
|
1134
1192
|
const embeddedAssignment = tryParseRequestAssignedComment(normalized);
|
|
1135
1193
|
if (embeddedAssignment) {
|
|
1136
1194
|
return buildAssignmentWorkflowFieldsFromActors(embeddedAssignment, actors).ar;
|
|
@@ -1206,6 +1264,25 @@ function resolveWorkflowContentAr(content, actors) {
|
|
|
1206
1264
|
const nameAr = resolveArabicWorkflowActorName(actors, namePartEn);
|
|
1207
1265
|
return interpolate(WORKFLOW_TEMPLATES.request_approval_pending_from.ar, { name: nameAr });
|
|
1208
1266
|
}
|
|
1267
|
+
// Assign Tasks to Employee workflow (legacy EN strings)
|
|
1268
|
+
if (normalized === 'Request Assigned') {
|
|
1269
|
+
return WORKFLOW_TEMPLATES.request_assigned?.ar ?? null;
|
|
1270
|
+
}
|
|
1271
|
+
if (normalized === 'Request Pending') {
|
|
1272
|
+
return WORKFLOW_TEMPLATES.request_pending?.ar ?? null;
|
|
1273
|
+
}
|
|
1274
|
+
const assignTasksPendingPrefix = WORKFLOW_TEMPLATES.request_pending_from?.en.split('{{name}}')[0].trim();
|
|
1275
|
+
if (assignTasksPendingPrefix && normalized.startsWith(assignTasksPendingPrefix)) {
|
|
1276
|
+
const namePartEn = normalized.slice(assignTasksPendingPrefix.length).trim();
|
|
1277
|
+
const nameAr = resolveArabicWorkflowActorName(actors, namePartEn);
|
|
1278
|
+
return interpolate(WORKFLOW_TEMPLATES.request_pending_from.ar, { name: nameAr });
|
|
1279
|
+
}
|
|
1280
|
+
if (normalized.toLowerCase() === 'notification sent pending') {
|
|
1281
|
+
return WORKFLOW_TEMPLATES.notification_sent_pending?.ar ?? null;
|
|
1282
|
+
}
|
|
1283
|
+
if (normalized.toLowerCase() === 'notification sent successfully') {
|
|
1284
|
+
return WORKFLOW_TEMPLATES.notification_sent_successfully?.ar ?? null;
|
|
1285
|
+
}
|
|
1209
1286
|
if (normalized === 'Approval Pending from HR Section' ||
|
|
1210
1287
|
normalized === 'Approval Pending from Records Department') {
|
|
1211
1288
|
return WORKFLOW_TEMPLATES.request_approval_pending?.ar ?? null;
|
|
@@ -1237,9 +1314,11 @@ function isSystemGeneratedChatMessage(message, actors) {
|
|
|
1237
1314
|
/** Generic workflow log enricher — use in all module repositories. */
|
|
1238
1315
|
function enrichWorkflowLog(log) {
|
|
1239
1316
|
const status = log.status != null ? String(log.status) : null;
|
|
1240
|
-
const
|
|
1317
|
+
const rawContent = log.content != null ? String(log.content) : null;
|
|
1241
1318
|
const actors = extractBilingualActorsFromRecord(log);
|
|
1242
|
-
const
|
|
1319
|
+
const assignTasksEmpResolved = resolveStoredAssignTasksEmpTemplateKey(rawContent, actors);
|
|
1320
|
+
const content = assignTasksEmpResolved?.en ?? rawContent;
|
|
1321
|
+
const resolvedAr = assignTasksEmpResolved?.ar ?? resolveWorkflowContentAr(content, actors);
|
|
1243
1322
|
const existingAr = log.content_ar != null && String(log.content_ar).trim() !== ''
|
|
1244
1323
|
? String(log.content_ar)
|
|
1245
1324
|
: null;
|
|
@@ -1257,6 +1336,28 @@ function enrichWorkflowLog(log) {
|
|
|
1257
1336
|
content_ar = resolvedAr;
|
|
1258
1337
|
}
|
|
1259
1338
|
}
|
|
1339
|
+
const inProgressPrefix = WORKFLOW_TEMPLATES.request_approval_in_progress_from?.en.split('{{name}}')[0].trim();
|
|
1340
|
+
if (content &&
|
|
1341
|
+
inProgressPrefix &&
|
|
1342
|
+
content.startsWith(inProgressPrefix) &&
|
|
1343
|
+
existingAr &&
|
|
1344
|
+
resolvedAr &&
|
|
1345
|
+
existingAr !== resolvedAr) {
|
|
1346
|
+
const namePartEn = content.slice(inProgressPrefix.length).trim();
|
|
1347
|
+
if (namePartEn && existingAr.includes(namePartEn)) {
|
|
1348
|
+
content_ar = resolvedAr;
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
if (content &&
|
|
1352
|
+
existingAr &&
|
|
1353
|
+
resolvedAr &&
|
|
1354
|
+
existingAr !== resolvedAr &&
|
|
1355
|
+
/[A-Za-z]/.test(existingAr) &&
|
|
1356
|
+
(actors?.deptArabicName?.trim() ||
|
|
1357
|
+
actors?.sectionArabicName?.trim() ||
|
|
1358
|
+
actors?.roleArabicName?.trim())) {
|
|
1359
|
+
content_ar = resolvedAr;
|
|
1360
|
+
}
|
|
1260
1361
|
if (content &&
|
|
1261
1362
|
existingAr &&
|
|
1262
1363
|
resolvedAr &&
|
|
@@ -1287,8 +1388,12 @@ function enrichWorkflowLog(log) {
|
|
|
1287
1388
|
if (notificationAr)
|
|
1288
1389
|
content_ar = notificationAr;
|
|
1289
1390
|
}
|
|
1391
|
+
if (assignTasksEmpResolved) {
|
|
1392
|
+
content_ar = assignTasksEmpResolved.ar;
|
|
1393
|
+
}
|
|
1290
1394
|
return {
|
|
1291
1395
|
...log,
|
|
1396
|
+
...(content !== rawContent ? { content } : {}),
|
|
1292
1397
|
content_ar,
|
|
1293
1398
|
status_ar: log.status_ar ?? resolveWorkflowStatusAr(status),
|
|
1294
1399
|
};
|
package/package.json
CHANGED
|
@@ -183,6 +183,18 @@
|
|
|
183
183
|
"it_helpdesk_wf_l3_not_required_closed": {
|
|
184
184
|
"en": "L3 assignment not required, request closed by {{userName}}{{comment}}",
|
|
185
185
|
"ar": "تعيين المستوى الثالث (L3) غير مطلوب، تم إغلاق الطلب بواسطة {{userName}}{{comment}}"
|
|
186
|
+
},
|
|
187
|
+
"request_assigned": {
|
|
188
|
+
"en": "Request Assigned",
|
|
189
|
+
"ar": "تم تعيين الطلب"
|
|
190
|
+
},
|
|
191
|
+
"request_pending_from": {
|
|
192
|
+
"en": "Request Pending from {{name}}",
|
|
193
|
+
"ar": "الطلب قيد الانتظار من {{name}}"
|
|
194
|
+
},
|
|
195
|
+
"request_pending": {
|
|
196
|
+
"en": "Request Pending",
|
|
197
|
+
"ar": "الطلب قيد الانتظار"
|
|
186
198
|
}
|
|
187
199
|
},
|
|
188
200
|
"chatTemplates": {
|
|
@@ -199,6 +199,70 @@ export function workflowTemplate(
|
|
|
199
199
|
return buildBilingualFromTemplate(WORKFLOW_TEMPLATES, key, params, arParams);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
/** Assign-tasks-emp workflow templates (catalog + runtime fallback when dist JSON is stale). */
|
|
203
|
+
const ASSIGN_TASKS_EMP_WF_FALLBACKS = {
|
|
204
|
+
request_assigned: { en: 'Request Assigned', ar: 'تم تعيين الطلب' },
|
|
205
|
+
request_pending_from: { en: 'Request Pending from {{name}}', ar: 'الطلب قيد الانتظار من {{name}}' },
|
|
206
|
+
request_pending: { en: 'Request Pending', ar: 'الطلب قيد الانتظار' },
|
|
207
|
+
} as const;
|
|
208
|
+
|
|
209
|
+
type AssignTasksEmpWorkflowTemplateKey = keyof typeof ASSIGN_TASKS_EMP_WF_FALLBACKS;
|
|
210
|
+
|
|
211
|
+
function resolveAssignTasksEmpWorkflowTemplate(
|
|
212
|
+
key: AssignTasksEmpWorkflowTemplateKey,
|
|
213
|
+
enParams: Record<string, string> = {},
|
|
214
|
+
arParams?: Record<string, string>,
|
|
215
|
+
): BilingualText {
|
|
216
|
+
const tpl = WORKFLOW_TEMPLATES[key] ?? ASSIGN_TASKS_EMP_WF_FALLBACKS[key];
|
|
217
|
+
const arabicParams = arParams ?? enParams;
|
|
218
|
+
return {
|
|
219
|
+
en: interpolate(tpl.en, enParams),
|
|
220
|
+
ar: interpolate(tpl.ar, arabicParams),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** Create/submit step for assign-tasks-emp workflow logs. */
|
|
225
|
+
export function buildAssignTasksEmpAssignedWorkflowFields(): BilingualText {
|
|
226
|
+
return resolveAssignTasksEmpWorkflowTemplate('request_assigned');
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Approval step — pending from assigned employee. */
|
|
230
|
+
export function buildAssignTasksEmpPendingFromWorkflowFields(params: {
|
|
231
|
+
userName: string;
|
|
232
|
+
userArabicName?: string | null;
|
|
233
|
+
}): BilingualText {
|
|
234
|
+
const nameEn = params.userName.trim() || 'Unknown User';
|
|
235
|
+
const nameAr = resolveBilingualName(nameEn, params.userArabicName);
|
|
236
|
+
return resolveAssignTasksEmpWorkflowTemplate(
|
|
237
|
+
'request_pending_from',
|
|
238
|
+
{ name: nameEn },
|
|
239
|
+
{ name: nameAr },
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** Approval step fallback when assignee name is unavailable. */
|
|
244
|
+
export function buildAssignTasksEmpPendingWorkflowFields(): BilingualText {
|
|
245
|
+
return resolveAssignTasksEmpWorkflowTemplate('request_pending');
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function resolveStoredAssignTasksEmpTemplateKey(
|
|
249
|
+
content: string | null | undefined,
|
|
250
|
+
actors?: BilingualActorNames,
|
|
251
|
+
): BilingualText | null {
|
|
252
|
+
const normalized = content?.trim();
|
|
253
|
+
if (!normalized || !(normalized in ASSIGN_TASKS_EMP_WF_FALLBACKS)) return null;
|
|
254
|
+
if (normalized === 'request_pending_from') {
|
|
255
|
+
const nameEn = actors?.userName?.trim() || 'Unknown User';
|
|
256
|
+
const nameAr = resolveArabicWorkflowActorName(actors, nameEn);
|
|
257
|
+
return resolveAssignTasksEmpWorkflowTemplate(
|
|
258
|
+
'request_pending_from',
|
|
259
|
+
{ name: nameEn },
|
|
260
|
+
{ name: nameAr },
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
return resolveAssignTasksEmpWorkflowTemplate(normalized as AssignTasksEmpWorkflowTemplateKey);
|
|
264
|
+
}
|
|
265
|
+
|
|
202
266
|
export function chatTemplate(
|
|
203
267
|
key: string,
|
|
204
268
|
params: Record<string, string> = {},
|
|
@@ -476,6 +540,20 @@ export function buildWorkflowLogUpdateFields(params: {
|
|
|
476
540
|
roleArabicName?: string | null;
|
|
477
541
|
comment?: string | null;
|
|
478
542
|
}): { content: string; content_ar: string; status: string; status_ar: string | null } {
|
|
543
|
+
if (params.approvalStatus === 'Closed') {
|
|
544
|
+
const closed = buildClosedWorkflowMessage({
|
|
545
|
+
roleName: params.roleName,
|
|
546
|
+
roleArabicName: params.roleArabicName,
|
|
547
|
+
comment: params.comment,
|
|
548
|
+
});
|
|
549
|
+
return {
|
|
550
|
+
content: closed.en,
|
|
551
|
+
content_ar: closed.ar,
|
|
552
|
+
status: params.workflowStatus,
|
|
553
|
+
status_ar: resolveWorkflowStatusAr(params.workflowStatus),
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
|
|
479
557
|
const isApprovedLike =
|
|
480
558
|
params.approvalStatus === 'Approved' || params.approvalStatus === 'Assigned';
|
|
481
559
|
|
|
@@ -1732,6 +1810,9 @@ export function resolveWorkflowContentAr(
|
|
|
1732
1810
|
if (content == null || content.trim() === '') return null;
|
|
1733
1811
|
const normalized = content.trim();
|
|
1734
1812
|
|
|
1813
|
+
const assignTasksEmpFromKey = resolveStoredAssignTasksEmpTemplateKey(normalized, actors);
|
|
1814
|
+
if (assignTasksEmpFromKey) return assignTasksEmpFromKey.ar;
|
|
1815
|
+
|
|
1735
1816
|
const embeddedAssignment = tryParseRequestAssignedComment(normalized);
|
|
1736
1817
|
if (embeddedAssignment) {
|
|
1737
1818
|
return buildAssignmentWorkflowFieldsFromActors(embeddedAssignment, actors).ar;
|
|
@@ -1808,6 +1889,27 @@ export function resolveWorkflowContentAr(
|
|
|
1808
1889
|
const nameAr = resolveArabicWorkflowActorName(actors, namePartEn);
|
|
1809
1890
|
return interpolate(WORKFLOW_TEMPLATES.request_approval_pending_from.ar, { name: nameAr });
|
|
1810
1891
|
}
|
|
1892
|
+
|
|
1893
|
+
// Assign Tasks to Employee workflow (legacy EN strings)
|
|
1894
|
+
if (normalized === 'Request Assigned') {
|
|
1895
|
+
return WORKFLOW_TEMPLATES.request_assigned?.ar ?? null;
|
|
1896
|
+
}
|
|
1897
|
+
if (normalized === 'Request Pending') {
|
|
1898
|
+
return WORKFLOW_TEMPLATES.request_pending?.ar ?? null;
|
|
1899
|
+
}
|
|
1900
|
+
const assignTasksPendingPrefix = WORKFLOW_TEMPLATES.request_pending_from?.en.split('{{name}}')[0].trim();
|
|
1901
|
+
if (assignTasksPendingPrefix && normalized.startsWith(assignTasksPendingPrefix)) {
|
|
1902
|
+
const namePartEn = normalized.slice(assignTasksPendingPrefix.length).trim();
|
|
1903
|
+
const nameAr = resolveArabicWorkflowActorName(actors, namePartEn);
|
|
1904
|
+
return interpolate(WORKFLOW_TEMPLATES.request_pending_from.ar, { name: nameAr });
|
|
1905
|
+
}
|
|
1906
|
+
if (normalized.toLowerCase() === 'notification sent pending') {
|
|
1907
|
+
return WORKFLOW_TEMPLATES.notification_sent_pending?.ar ?? null;
|
|
1908
|
+
}
|
|
1909
|
+
if (normalized.toLowerCase() === 'notification sent successfully') {
|
|
1910
|
+
return WORKFLOW_TEMPLATES.notification_sent_successfully?.ar ?? null;
|
|
1911
|
+
}
|
|
1912
|
+
|
|
1811
1913
|
if (
|
|
1812
1914
|
normalized === 'Approval Pending from HR Section' ||
|
|
1813
1915
|
normalized === 'Approval Pending from Records Department'
|
|
@@ -1850,9 +1952,11 @@ export function isSystemGeneratedChatMessage(
|
|
|
1850
1952
|
/** Generic workflow log enricher — use in all module repositories. */
|
|
1851
1953
|
export function enrichWorkflowLog(log: Record<string, unknown>): Record<string, unknown> {
|
|
1852
1954
|
const status = log.status != null ? String(log.status) : null;
|
|
1853
|
-
const
|
|
1955
|
+
const rawContent = log.content != null ? String(log.content) : null;
|
|
1854
1956
|
const actors = extractBilingualActorsFromRecord(log);
|
|
1855
|
-
const
|
|
1957
|
+
const assignTasksEmpResolved = resolveStoredAssignTasksEmpTemplateKey(rawContent, actors);
|
|
1958
|
+
const content = assignTasksEmpResolved?.en ?? rawContent;
|
|
1959
|
+
const resolvedAr = assignTasksEmpResolved?.ar ?? resolveWorkflowContentAr(content, actors);
|
|
1856
1960
|
const existingAr =
|
|
1857
1961
|
log.content_ar != null && String(log.content_ar).trim() !== ''
|
|
1858
1962
|
? String(log.content_ar)
|
|
@@ -1873,6 +1977,32 @@ export function enrichWorkflowLog(log: Record<string, unknown>): Record<string,
|
|
|
1873
1977
|
content_ar = resolvedAr;
|
|
1874
1978
|
}
|
|
1875
1979
|
}
|
|
1980
|
+
const inProgressPrefix = WORKFLOW_TEMPLATES.request_approval_in_progress_from?.en.split('{{name}}')[0].trim();
|
|
1981
|
+
if (
|
|
1982
|
+
content &&
|
|
1983
|
+
inProgressPrefix &&
|
|
1984
|
+
content.startsWith(inProgressPrefix) &&
|
|
1985
|
+
existingAr &&
|
|
1986
|
+
resolvedAr &&
|
|
1987
|
+
existingAr !== resolvedAr
|
|
1988
|
+
) {
|
|
1989
|
+
const namePartEn = content.slice(inProgressPrefix.length).trim();
|
|
1990
|
+
if (namePartEn && existingAr.includes(namePartEn)) {
|
|
1991
|
+
content_ar = resolvedAr;
|
|
1992
|
+
}
|
|
1993
|
+
}
|
|
1994
|
+
if (
|
|
1995
|
+
content &&
|
|
1996
|
+
existingAr &&
|
|
1997
|
+
resolvedAr &&
|
|
1998
|
+
existingAr !== resolvedAr &&
|
|
1999
|
+
/[A-Za-z]/.test(existingAr) &&
|
|
2000
|
+
(actors?.deptArabicName?.trim() ||
|
|
2001
|
+
actors?.sectionArabicName?.trim() ||
|
|
2002
|
+
actors?.roleArabicName?.trim())
|
|
2003
|
+
) {
|
|
2004
|
+
content_ar = resolvedAr;
|
|
2005
|
+
}
|
|
1876
2006
|
if (
|
|
1877
2007
|
content &&
|
|
1878
2008
|
existingAr &&
|
|
@@ -1909,8 +2039,12 @@ export function enrichWorkflowLog(log: Record<string, unknown>): Record<string,
|
|
|
1909
2039
|
const notificationAr = resolveWorkflowContentAr(content, actors);
|
|
1910
2040
|
if (notificationAr) content_ar = notificationAr;
|
|
1911
2041
|
}
|
|
2042
|
+
if (assignTasksEmpResolved) {
|
|
2043
|
+
content_ar = assignTasksEmpResolved.ar;
|
|
2044
|
+
}
|
|
1912
2045
|
return {
|
|
1913
2046
|
...log,
|
|
2047
|
+
...(content !== rawContent ? { content } : {}),
|
|
1914
2048
|
content_ar,
|
|
1915
2049
|
status_ar: log.status_ar ?? resolveWorkflowStatusAr(status),
|
|
1916
2050
|
};
|