@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 content = log.content != null ? String(log.content) : null;
1317
+ const rawContent = log.content != null ? String(log.content) : null;
1241
1318
  const actors = extractBilingualActorsFromRecord(log);
1242
- const resolvedAr = resolveWorkflowContentAr(content, actors);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platform-modules/civil-aviation-authority",
3
- "version": "2.3.297",
3
+ "version": "2.3.299",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -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 content = log.content != null ? String(log.content) : null;
1955
+ const rawContent = log.content != null ? String(log.content) : null;
1854
1956
  const actors = extractBilingualActorsFromRecord(log);
1855
- const resolvedAr = resolveWorkflowContentAr(content, actors);
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
  };