@platform-modules/civil-aviation-authority 2.3.310 → 2.3.312

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.
Files changed (79) hide show
  1. package/dist/data-source.js +2 -0
  2. package/dist/i18n/workflow-chat-i18n.json +8 -0
  3. package/dist/i18n/workflow-chat-message.builder.d.ts +1 -1
  4. package/dist/i18n/workflow-chat-message.builder.js +21 -3
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +1 -0
  7. package/dist/models/ChatbotQnsAnsMappingModel.d.ts +8 -0
  8. package/dist/models/ChatbotQnsAnsMappingModel.js +40 -0
  9. package/dist/models/DocumentMetadataModel.d.ts +45 -0
  10. package/dist/models/DocumentMetadataModel.js +171 -0
  11. package/dist/models/DocumentationDepartmentsModel.d.ts +13 -0
  12. package/dist/models/DocumentationDepartmentsModel.js +53 -0
  13. package/dist/models/FolderModel.d.ts +16 -0
  14. package/dist/models/FolderModel.js +85 -0
  15. package/dist/models/ImportExportMaterialModels.d.ts +92 -0
  16. package/dist/models/ImportExportMaterialModels.js +307 -0
  17. package/dist/models/PermissionModel.d.ts +18 -0
  18. package/dist/models/PermissionModel.js +68 -0
  19. package/dist/models/SecurityAccessApprovalModel.d.ts +23 -0
  20. package/dist/models/SecurityAccessApprovalModel.js +82 -0
  21. package/dist/models/SecurityAccessAttachmentModel.d.ts +12 -0
  22. package/dist/models/SecurityAccessAttachmentModel.js +56 -0
  23. package/dist/models/SecurityAccessChatModel.d.ts +12 -0
  24. package/dist/models/SecurityAccessChatModel.js +56 -0
  25. package/dist/models/SecurityAccessRequestModel.d.ts +25 -0
  26. package/dist/models/SecurityAccessRequestModel.js +80 -0
  27. package/dist/models/SecurityAccessWorkflowModel.d.ts +24 -0
  28. package/dist/models/SecurityAccessWorkflowModel.js +84 -0
  29. package/dist/models/ServiceExtensionAfterAge60Models.d.ts +93 -0
  30. package/dist/models/ServiceExtensionAfterAge60Models.js +312 -0
  31. package/dist/models/SlaApprovalsViewModel.js +54 -47
  32. package/dist/models/SlaMyRequestsViewModel.d.ts +3 -0
  33. package/dist/models/SlaMyRequestsViewModel.js +22 -2
  34. package/dist/models/UUIDBaseModel.d.ts +14 -0
  35. package/dist/models/UUIDBaseModel.js +66 -0
  36. package/dist/models/WorkingHoursExtensionModels.d.ts +88 -0
  37. package/dist/models/WorkingHoursExtensionModels.js +295 -0
  38. package/package.json +1 -1
  39. package/scripts/sync-sla-reports-sql.js +92 -92
  40. package/sql/README.md +21 -21
  41. package/sql/create_chatbot_qns_ans_mapping.sql +25 -0
  42. package/sql/sla_reports_admin_procedures.sql +323 -304
  43. package/sql/sla_reports_approvals_workbook.sql +430 -383
  44. package/sql/sla_reports_procedures.sql +886 -886
  45. package/sql/user_role_department_section_validation.sql +214 -0
  46. package/sql/vw_sla_approvals.sql +115 -108
  47. package/sql/vw_sla_my_requests.sql +58 -53
  48. package/src/data-source.ts +2 -0
  49. package/src/i18n/workflow-chat-i18n.json +8 -0
  50. package/src/i18n/workflow-chat-message.builder.ts +27 -3
  51. package/src/index.ts +1 -0
  52. package/src/models/AccessCardRequestModel.ts +135 -135
  53. package/src/models/AirportEntryPermitModel.ts +276 -276
  54. package/src/models/AnnualTrainingPlanRequestModel.ts +153 -153
  55. package/src/models/ChatbotQnsAnsMappingModel.ts +21 -0
  56. package/src/models/DocumentDriveModel.ts +28 -28
  57. package/src/models/DocumentFolderModel.ts +45 -45
  58. package/src/models/HotelApprovalModel.ts +83 -83
  59. package/src/models/HousingContractCancelApprovalModel.ts +64 -64
  60. package/src/models/HousingContractRenewalApprovalModel.ts +64 -64
  61. package/src/models/ITRequestAttachmentModel.ts +73 -73
  62. package/src/models/ItApprovalsModel.ts +84 -84
  63. package/src/models/LegalConsultationApprovalModel.ts +65 -65
  64. package/src/models/MissionTravelPassportExpiryNotificationConfigModel.ts +36 -36
  65. package/src/models/NotificationModel.ts +89 -89
  66. package/src/models/ResidentialUnitRentalApprovalModel.ts +143 -143
  67. package/src/models/ServiceExtensionAfter60ApprovalModel.ts +87 -87
  68. package/src/models/ServiceSlaApprovalModel.ts +64 -64
  69. package/src/models/ServicesNotificationConfigModel.ts +55 -55
  70. package/src/models/SlaApprovalsViewModel.ts +142 -135
  71. package/src/models/SlaMyRequestsViewModel.ts +21 -1
  72. package/src/models/StudyLeaveRequestModel.ts +144 -144
  73. package/src/models/TrainingRequestModel.ts +164 -164
  74. package/src/models/TrainingRoomBookingRequestModel.ts +142 -142
  75. package/src/models/TrainingRoomNotificationConfigModel.ts +30 -30
  76. package/src/models/role.ts +34 -34
  77. package/src/sla/sla-table-sync.service.ts +90 -90
  78. package/dist/helpers/cancellation-bilingual-persist.helper.d.ts +0 -37
  79. package/dist/helpers/cancellation-bilingual-persist.helper.js +0 -77
@@ -0,0 +1,214 @@
1
+ -- =============================================================================
2
+ -- User Role – Department / Section Data Validation
3
+ -- =============================================================================
4
+ -- Purpose:
5
+ -- Identify user_role rows whose department_id and/or section_id reference
6
+ -- master records that are missing or soft-deleted (is_deleted = true).
7
+ --
8
+ -- Database: PostgreSQL (CAA / FM User Service schema)
9
+ -- Tables: user_role, departments, sections
10
+ --
11
+ -- Usage:
12
+ -- psql -U <user> -d <database> -f shared_models/sql/user_role_department_section_validation.sql
13
+ --
14
+ -- Notes:
15
+ -- * department_id / section_id may be NULL on user_role; NULL is treated as
16
+ -- "not assigned" and is not flagged unless an ID is present but invalid.
17
+ -- * Soft-deleted user_role rows are included by default (see filter comment).
18
+ -- =============================================================================
19
+
20
+ -- -----------------------------------------------------------------------------
21
+ -- 1) Detailed invalid records with reason
22
+ -- -----------------------------------------------------------------------------
23
+ WITH validated AS (
24
+ SELECT
25
+ ur.id AS user_role_id,
26
+ ur.role_id,
27
+ ur.user_id,
28
+ ur.department_id,
29
+ ur.section_id,
30
+ ur.is_active,
31
+ COALESCE(ur.is_deleted, false) AS user_role_is_deleted,
32
+ ur.created_at,
33
+ ur.updated_at,
34
+
35
+ r.name AS role_name,
36
+ u.employee_name AS user_name,
37
+ u.email AS user_email,
38
+
39
+ d.id AS department_master_id,
40
+ d.department_name,
41
+ COALESCE(d.is_deleted, false) AS department_is_deleted,
42
+
43
+ s.id AS section_master_id,
44
+ s.section_name,
45
+ COALESCE(s.is_deleted, false) AS section_is_deleted,
46
+
47
+ CASE
48
+ WHEN ur.department_id IS NULL THEN 'NOT_APPLICABLE'
49
+ WHEN d.id IS NULL THEN 'DEPARTMENT_NOT_FOUND'
50
+ WHEN COALESCE(d.is_deleted, false) = true THEN 'DEPARTMENT_DELETED'
51
+ ELSE 'VALID'
52
+ END AS department_status,
53
+
54
+ CASE
55
+ WHEN ur.section_id IS NULL THEN 'NOT_APPLICABLE'
56
+ WHEN s.id IS NULL THEN 'SECTION_NOT_FOUND'
57
+ WHEN COALESCE(s.is_deleted, false) = true THEN 'SECTION_DELETED'
58
+ ELSE 'VALID'
59
+ END AS section_status
60
+
61
+ FROM user_role ur
62
+ LEFT JOIN role r
63
+ ON r.id = ur.role_id
64
+ LEFT JOIN users u
65
+ ON u.id = ur.user_id
66
+ LEFT JOIN departments d
67
+ ON d.id = ur.department_id
68
+ LEFT JOIN sections s
69
+ ON s.id = ur.section_id
70
+ -- Uncomment to restrict to active user_role rows only:
71
+ -- WHERE COALESCE(ur.is_deleted, false) = false
72
+ )
73
+ SELECT
74
+ user_role_id,
75
+ role_id,
76
+ role_name,
77
+ user_id,
78
+ user_name,
79
+ user_email,
80
+ department_id,
81
+ department_name,
82
+ section_id,
83
+ section_name,
84
+ is_active,
85
+ user_role_is_deleted,
86
+ department_status,
87
+ section_status,
88
+ CASE
89
+ WHEN department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
90
+ AND section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
91
+ THEN 'INVALID_DEPARTMENT_AND_SECTION'
92
+ WHEN department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
93
+ THEN 'INVALID_DEPARTMENT'
94
+ WHEN section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
95
+ THEN 'INVALID_SECTION'
96
+ END AS invalid_reason,
97
+ CASE
98
+ WHEN department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
99
+ AND section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
100
+ THEN department_status || ' | ' || section_status
101
+ WHEN department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
102
+ THEN department_status
103
+ WHEN section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
104
+ THEN section_status
105
+ END AS invalid_reason_detail,
106
+ created_at,
107
+ updated_at
108
+ FROM validated
109
+ WHERE
110
+ department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
111
+ OR section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
112
+ ORDER BY
113
+ invalid_reason,
114
+ user_role_id;
115
+
116
+
117
+ -- -----------------------------------------------------------------------------
118
+ -- 2) Summary counts by invalidity category
119
+ -- -----------------------------------------------------------------------------
120
+ WITH validated AS (
121
+ SELECT
122
+ ur.id AS user_role_id,
123
+ CASE
124
+ WHEN ur.department_id IS NULL THEN 'NOT_APPLICABLE'
125
+ WHEN d.id IS NULL THEN 'DEPARTMENT_NOT_FOUND'
126
+ WHEN COALESCE(d.is_deleted, false) = true THEN 'DEPARTMENT_DELETED'
127
+ ELSE 'VALID'
128
+ END AS department_status,
129
+ CASE
130
+ WHEN ur.section_id IS NULL THEN 'NOT_APPLICABLE'
131
+ WHEN s.id IS NULL THEN 'SECTION_NOT_FOUND'
132
+ WHEN COALESCE(s.is_deleted, false) = true THEN 'SECTION_DELETED'
133
+ ELSE 'VALID'
134
+ END AS section_status
135
+ FROM user_role ur
136
+ LEFT JOIN departments d ON d.id = ur.department_id
137
+ LEFT JOIN sections s ON s.id = ur.section_id
138
+ -- Uncomment to restrict to active user_role rows only:
139
+ -- WHERE COALESCE(ur.is_deleted, false) = false
140
+ ),
141
+ invalid AS (
142
+ SELECT
143
+ user_role_id,
144
+ CASE
145
+ WHEN department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
146
+ AND section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
147
+ THEN 'INVALID_DEPARTMENT_AND_SECTION'
148
+ WHEN department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
149
+ THEN 'INVALID_DEPARTMENT'
150
+ WHEN section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
151
+ THEN 'INVALID_SECTION'
152
+ END AS invalid_reason,
153
+ department_status,
154
+ section_status
155
+ FROM validated
156
+ WHERE
157
+ department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
158
+ OR section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
159
+ )
160
+ SELECT
161
+ invalid_reason,
162
+ COUNT(*) AS record_count
163
+ FROM invalid
164
+ GROUP BY invalid_reason
165
+
166
+ UNION ALL
167
+
168
+ SELECT
169
+ 'TOTAL_INVALID_RECORDS' AS invalid_reason,
170
+ COUNT(*) AS record_count
171
+ FROM invalid
172
+
173
+ ORDER BY
174
+ CASE invalid_reason
175
+ WHEN 'INVALID_DEPARTMENT' THEN 1
176
+ WHEN 'INVALID_SECTION' THEN 2
177
+ WHEN 'INVALID_DEPARTMENT_AND_SECTION' THEN 3
178
+ WHEN 'TOTAL_INVALID_RECORDS' THEN 4
179
+ ELSE 5
180
+ END;
181
+
182
+
183
+ -- -----------------------------------------------------------------------------
184
+ -- 3) Breakdown by underlying master-table status (optional drill-down)
185
+ -- -----------------------------------------------------------------------------
186
+ WITH validated AS (
187
+ SELECT
188
+ ur.id AS user_role_id,
189
+ CASE
190
+ WHEN ur.department_id IS NULL THEN 'NOT_APPLICABLE'
191
+ WHEN d.id IS NULL THEN 'DEPARTMENT_NOT_FOUND'
192
+ WHEN COALESCE(d.is_deleted, false) = true THEN 'DEPARTMENT_DELETED'
193
+ ELSE 'VALID'
194
+ END AS department_status,
195
+ CASE
196
+ WHEN ur.section_id IS NULL THEN 'NOT_APPLICABLE'
197
+ WHEN s.id IS NULL THEN 'SECTION_NOT_FOUND'
198
+ WHEN COALESCE(s.is_deleted, false) = true THEN 'SECTION_DELETED'
199
+ ELSE 'VALID'
200
+ END AS section_status
201
+ FROM user_role ur
202
+ LEFT JOIN departments d ON d.id = ur.department_id
203
+ LEFT JOIN sections s ON s.id = ur.section_id
204
+ )
205
+ SELECT
206
+ department_status,
207
+ section_status,
208
+ COUNT(*) AS record_count
209
+ FROM validated
210
+ WHERE
211
+ department_status IN ('DEPARTMENT_NOT_FOUND', 'DEPARTMENT_DELETED')
212
+ OR section_status IN ('SECTION_NOT_FOUND', 'SECTION_DELETED')
213
+ GROUP BY department_status, section_status
214
+ ORDER BY record_count DESC, department_status, section_status;
@@ -1,108 +1,115 @@
1
- -- SLA approvals read model: joined display names for approval routing.
2
-
3
- -- Approver-scope filtering is applied in Reports_Service (TypeORM), not in this view.
4
-
5
- -- Run once against the EmpPortal PostgreSQL database:
6
-
7
- -- psql -U <user> -d <database> -f sql/vw_sla_approvals.sql
8
-
9
-
10
-
11
- DROP VIEW IF EXISTS vw_sla_approvals CASCADE;
12
-
13
-
14
-
15
- CREATE VIEW vw_sla_approvals AS
16
-
17
- SELECT
18
-
19
- sa.id AS sla_approval_id,
20
-
21
- sa.source_approval_id,
22
-
23
- sa.request_id,
24
-
25
- sa.service_id AS service_id,
26
-
27
- sa.sub_service_id AS sub_service_id,
28
-
29
- TRIM(COALESCE(svc.name, ''))::TEXT AS service_name,
30
-
31
- TRIM(COALESCE(subsvc.sub_service_name, ''))::TEXT AS sub_service_name,
32
-
33
- sa.approver_role_id AS approval_role_id,
34
-
35
- TRIM(COALESCE(ar.name, ''))::TEXT AS approval_role_name,
36
-
37
- sa.department_id AS approval_department_id,
38
-
39
- TRIM(COALESCE(adpt.department_name, ''))::TEXT AS approval_department_name,
40
-
41
- sa.section_id AS approval_section_id,
42
-
43
- TRIM(COALESCE(asec.section_name, ''))::TEXT AS approval_section_name,
44
-
45
- sa.approval_status::TEXT AS approval_status,
46
-
47
- sr.status::TEXT AS request_status,
48
-
49
- sa.level AS level,
50
-
51
- sa.approver_user_id AS approver_user_id,
52
-
53
- TRIM(COALESCE(au.employee_name, ''))::TEXT AS approver_user_name,
54
-
55
- sa.delegate_user_id AS delegate_user_id,
56
-
57
- TRIM(COALESCE(du.employee_name, ''))::TEXT AS delegate_user_name,
58
-
59
- sa.approved_by AS approved_by,
60
-
61
- TRIM(COALESCE(ab.employee_name, ''))::TEXT AS approved_by_name,
62
-
63
- sa.comment::TEXT AS comment,
64
-
65
- sa.created_at AS created_at,
66
-
67
- sa.updated_at AS updated_at
68
-
69
- FROM sla_approval sa
70
-
71
- INNER JOIN sla_requests sr
72
-
73
- ON sr.request_id = sa.request_id AND COALESCE(sr.is_deleted, false) = false
74
-
75
- LEFT JOIN caa_services svc
76
-
77
- ON svc.id = sa.service_id AND COALESCE(svc.is_deleted, false) = false
78
-
79
- LEFT JOIN caa_sub_services subsvc
80
-
81
- ON subsvc.id = sa.sub_service_id AND COALESCE(subsvc.is_deleted, false) = false
82
-
83
- LEFT JOIN departments adpt
84
-
85
- ON adpt.id = sa.department_id AND COALESCE(adpt.is_deleted, false) = false
86
-
87
- LEFT JOIN sections asec
88
-
89
- ON asec.id = sa.section_id AND COALESCE(asec.is_deleted, false) = false
90
-
91
- LEFT JOIN role ar
92
-
93
- ON ar.id = sa.approver_role_id AND COALESCE(ar.is_deleted, false) = false
94
-
95
- LEFT JOIN users au
96
-
97
- ON au.id = sa.approver_user_id AND COALESCE(au.is_deleted, false) = false
98
-
99
- LEFT JOIN users du
100
-
101
- ON du.id = sa.delegate_user_id AND COALESCE(du.is_deleted, false) = false
102
-
103
- LEFT JOIN users ab
104
-
105
- ON ab.id = sa.approved_by AND COALESCE(ab.is_deleted, false) = false
106
-
107
- WHERE COALESCE(sa.is_deleted, false) = false;
108
-
1
+ -- SLA approvals read model: joined display names for approval routing.
2
+
3
+ -- Approver-scope filtering is applied in Reports_Service (TypeORM), not in this view.
4
+
5
+ -- Run once against the EmpPortal PostgreSQL database:
6
+
7
+ -- psql -U <user> -d <database> -f sql/vw_sla_approvals.sql
8
+
9
+
10
+
11
+ DROP VIEW IF EXISTS vw_sla_approvals CASCADE;
12
+
13
+
14
+
15
+ CREATE VIEW vw_sla_approvals AS
16
+
17
+ SELECT
18
+
19
+ sa.id AS sla_approval_id,
20
+
21
+ sa.source_approval_id,
22
+
23
+ sa.request_id,
24
+
25
+ sa.service_id AS service_id,
26
+
27
+ sa.sub_service_id AS sub_service_id,
28
+
29
+ TRIM(COALESCE(svc.name, ''))::TEXT AS service_name,
30
+
31
+ TRIM(COALESCE(subsvc.sub_service_name, ''))::TEXT AS sub_service_name,
32
+
33
+ sa.approver_role_id AS approval_role_id,
34
+
35
+ TRIM(COALESCE(ar.name, ''))::TEXT AS approval_role_name,
36
+
37
+ sa.department_id AS approval_department_id,
38
+
39
+ TRIM(COALESCE(adpt.department_name, ''))::TEXT AS approval_department_name,
40
+
41
+ sa.section_id AS approval_section_id,
42
+
43
+ TRIM(COALESCE(asec.section_name, ''))::TEXT AS approval_section_name,
44
+
45
+ sa.approval_status::TEXT AS approval_status,
46
+
47
+ sr.status::TEXT AS request_status,
48
+
49
+ sa.level AS level,
50
+
51
+ sa.approver_user_id AS approver_user_id,
52
+
53
+ TRIM(COALESCE(au.employee_name, ''))::TEXT AS approver_user_name,
54
+
55
+ sa.delegate_user_id AS delegate_user_id,
56
+
57
+ TRIM(COALESCE(du.employee_name, ''))::TEXT AS delegate_user_name,
58
+
59
+ sa.approved_by AS approved_by,
60
+
61
+ TRIM(COALESCE(ab.employee_name, ''))::TEXT AS approved_by_name,
62
+
63
+ sa.comment::TEXT AS comment,
64
+
65
+ sa.created_at AS created_at,
66
+
67
+ sa.updated_at AS updated_at
68
+
69
+ FROM sla_approval sa
70
+
71
+ INNER JOIN sla_requests sr
72
+
73
+ ON sr.id = (
74
+ SELECT MIN(sr2.id)
75
+ FROM sla_requests sr2
76
+ WHERE sr2.request_id = sa.request_id
77
+ AND COALESCE(sr2.is_deleted, false) = false
78
+ AND (sa.service_id IS NULL OR sr2.service_id = sa.service_id)
79
+ AND (sa.sub_service_id IS NULL OR sr2.sub_service_id = sa.sub_service_id)
80
+ )
81
+
82
+ LEFT JOIN caa_services svc
83
+
84
+ ON svc.id = sa.service_id AND COALESCE(svc.is_deleted, false) = false
85
+
86
+ LEFT JOIN caa_sub_services subsvc
87
+
88
+ ON subsvc.id = sa.sub_service_id AND COALESCE(subsvc.is_deleted, false) = false
89
+
90
+ LEFT JOIN departments adpt
91
+
92
+ ON adpt.id = sa.department_id AND COALESCE(adpt.is_deleted, false) = false
93
+
94
+ LEFT JOIN sections asec
95
+
96
+ ON asec.id = sa.section_id AND COALESCE(asec.is_deleted, false) = false
97
+
98
+ LEFT JOIN role ar
99
+
100
+ ON ar.id = sa.approver_role_id AND COALESCE(ar.is_deleted, false) = false
101
+
102
+ LEFT JOIN users au
103
+
104
+ ON au.id = sa.approver_user_id AND COALESCE(au.is_deleted, false) = false
105
+
106
+ LEFT JOIN users du
107
+
108
+ ON du.id = sa.delegate_user_id AND COALESCE(du.is_deleted, false) = false
109
+
110
+ LEFT JOIN users ab
111
+
112
+ ON ab.id = sa.approved_by AND COALESCE(ab.is_deleted, false) = false
113
+
114
+ WHERE COALESCE(sa.is_deleted, false) = false;
115
+
@@ -1,53 +1,58 @@
1
- -- SLA "my requests" read model: joined display names + filtered request_obj payload.
2
- -- Applied via: npm run sync:sla-sql (shared_models)
3
-
4
- CREATE OR REPLACE VIEW vw_sla_my_requests AS
5
- SELECT
6
- sr.id AS sla_request_id,
7
- sr.user_id,
8
- sr.service_id AS service_id,
9
- sr.sub_service_id AS sub_service_id,
10
- TRIM(COALESCE(creator.employee_name, ''))::TEXT AS created_by,
11
- sr.created_at,
12
- TRIM(COALESCE(dept.department_name, ''))::TEXT AS req_user_department_id,
13
- TRIM(COALESCE(sec.section_name, ''))::TEXT AS req_user_section_id,
14
- TRIM(COALESCE(svc.name, ''))::TEXT AS service_name,
15
- TRIM(COALESCE(subsvc.sub_service_name, ''))::TEXT AS sub_service_name,
16
- sr.status::TEXT AS status,
17
- sr.request_id,
18
- (
19
- COALESCE(sr.request_obj, '{}'::jsonb)
20
- - 'id'
21
- - 'status'
22
- - 'role_id'
23
- - 'user_id'
24
- - 'createdBy'
25
- - 'created_at'
26
- - 'updated_by'
27
- - 'updated_at'
28
- - 'req_user_department_id'
29
- - 'workflow_execution_id'
30
- - 'department_id'
31
- - 'req_user_section_id'
32
- - 'service_type_id'
33
- - 'service_type'
34
- - 'created_by'
35
- - 'service_id'
36
- - 'sub_service_id'
37
- - 'attachments'
38
- - 'is_deleted'
39
- - 'sla_request'
40
- - 'sla_request_id'
41
- ) AS request_fields
42
- FROM sla_requests sr
43
- LEFT JOIN users creator
44
- ON creator.id = sr.created_by AND COALESCE(creator.is_deleted, false) = false
45
- LEFT JOIN departments dept
46
- ON dept.id = sr.req_user_department_id AND COALESCE(dept.is_deleted, false) = false
47
- LEFT JOIN sections sec
48
- ON sec.id = sr.req_user_section_id AND COALESCE(sec.is_deleted, false) = false
49
- LEFT JOIN caa_services svc
50
- ON svc.id = sr.service_id AND COALESCE(svc.is_deleted, false) = false
51
- LEFT JOIN caa_sub_services subsvc
52
- ON subsvc.id = sr.sub_service_id AND COALESCE(subsvc.is_deleted, false) = false
53
- WHERE COALESCE(sr.is_deleted, false) = false;
1
+ -- SLA "my requests" read model: joined display names + filtered request_obj payload.
2
+ -- Applied via: npm run sync:sla-sql (shared_models)
3
+
4
+ CREATE OR REPLACE VIEW vw_sla_my_requests AS
5
+ SELECT
6
+ sr.id AS sla_request_id,
7
+ sr.user_id,
8
+ sr.service_id AS service_id,
9
+ sr.sub_service_id AS sub_service_id,
10
+ TRIM(COALESCE(creator.employee_name, ''))::TEXT AS created_by,
11
+ sr.created_at,
12
+ TRIM(COALESCE(dept.department_name, ''))::TEXT AS req_user_department_id,
13
+ TRIM(COALESCE(sec.section_name, ''))::TEXT AS req_user_section_id,
14
+ TRIM(COALESCE(svc.name, ''))::TEXT AS service_name,
15
+ TRIM(COALESCE(subsvc.sub_service_name, ''))::TEXT AS sub_service_name,
16
+ sr.status::TEXT AS status,
17
+ sr.request_id,
18
+ (
19
+ COALESCE(sr.request_obj, '{}'::jsonb)
20
+ - 'id'
21
+ - 'status'
22
+ - 'role_id'
23
+ - 'user_id'
24
+ - 'createdBy'
25
+ - 'created_at'
26
+ - 'updated_by'
27
+ - 'updated_at'
28
+ - 'req_user_department_id'
29
+ - 'workflow_execution_id'
30
+ - 'department_id'
31
+ - 'req_user_section_id'
32
+ - 'service_type_id'
33
+ - 'service_type'
34
+ - 'created_by'
35
+ - 'service_id'
36
+ - 'sub_service_id'
37
+ - 'attachments'
38
+ - 'is_deleted'
39
+ - 'sla_request'
40
+ - 'sla_request_id'
41
+ ) AS request_fields,
42
+ TRIM(COALESCE(req_owner.employee_arabic_name, ''))::TEXT AS req_user_arabicname,
43
+ TRIM(COALESCE(dept.department_arabic_name, ''))::TEXT AS req_user_department_arabicname,
44
+ TRIM(COALESCE(sec.section_arabic_name, ''))::TEXT AS req_user_section_arabicname
45
+ FROM sla_requests sr
46
+ LEFT JOIN users req_owner
47
+ ON req_owner.id = sr.user_id AND COALESCE(req_owner.is_deleted, false) = false
48
+ LEFT JOIN users creator
49
+ ON creator.id = sr.created_by AND COALESCE(creator.is_deleted, false) = false
50
+ LEFT JOIN departments dept
51
+ ON dept.id = sr.req_user_department_id AND COALESCE(dept.is_deleted, false) = false
52
+ LEFT JOIN sections sec
53
+ ON sec.id = sr.req_user_section_id AND COALESCE(sec.is_deleted, false) = false
54
+ LEFT JOIN caa_services svc
55
+ ON svc.id = sr.service_id AND COALESCE(svc.is_deleted, false) = false
56
+ LEFT JOIN caa_sub_services subsvc
57
+ ON subsvc.id = sr.sub_service_id AND COALESCE(subsvc.is_deleted, false) = false
58
+ WHERE COALESCE(sr.is_deleted, false) = false;
@@ -254,6 +254,7 @@ import { SlaMyRequestsView } from './models/SlaMyRequestsViewModel';
254
254
  import { SlaApprovalsView } from './models/SlaApprovalsViewModel';
255
255
  import { ServiceSlaApproval } from './models/ServiceSlaApprovalModel';
256
256
  import { SlaConfig } from './models/SlaConfigModel';
257
+ import { ChatbotQnsAnsMapping } from './models/ChatbotQnsAnsMappingModel';
257
258
  import { CSRMBusinessImpactRatingMaster } from './models/CSRMBusinessImpactRatingMasterModel';
258
259
  import { CSRMLikelihoodMaster } from './models/CSRMLikelihoodMasterModel';
259
260
  import { Location } from './models/LocationModel';
@@ -579,6 +580,7 @@ export const AppDataSource = new DataSource({
579
580
  SlaApprovalsView,
580
581
  ServiceSlaApproval,
581
582
  SlaConfig,
583
+ ChatbotQnsAnsMapping,
582
584
  CSRMBusinessImpactRatingMaster,
583
585
  CSRMLikelihoodMaster,
584
586
  Location,
@@ -309,6 +309,14 @@
309
309
  "logistics_actual_return_updated": {
310
310
  "en": "{{roleName}} updated the Vehicle Actual Return Date, Time, and Reason. Actual Return Date: {{date}}, Actual Return Time: {{time}}, Reason: {{reason}}",
311
311
  "ar": "قام {{roleName}} بتحديث تاريخ الإرجاع الفعلي للمركبة والوقت والسبب. تاريخ الإرجاع الفعلي: {{date}}، وقت الإرجاع الفعلي: {{time}}، السبب: {{reason}}"
312
+ },
313
+ "pending_with_user": {
314
+ "en": "Pending with {{userName}} ({{employeeId}})",
315
+ "ar": "قيد الانتظار لدى {{userName}} ({{employeeId}})"
316
+ },
317
+ "pending_with_role": {
318
+ "en": "Pending with {{roleName}}",
319
+ "ar": "قيد الانتظار لدى {{roleName}}"
312
320
  }
313
321
  },
314
322
  "notificationTemplates": {
@@ -1545,9 +1545,33 @@ export function resolveWorkflowStatusAr(status: string | null | undefined): stri
1545
1545
  return WORKFLOW_STATUS_LABELS[status] ?? status;
1546
1546
  }
1547
1547
 
1548
- export function resolveChatStatusAr(status: string | null | undefined): string | null {
1548
+ export function resolveChatStatusAr(
1549
+ status: string | null | undefined,
1550
+ actors?: BilingualActorNames,
1551
+ ): string | null {
1549
1552
  if (status == null || status === '') return null;
1550
- return CHAT_STATUS_LABELS[status] ?? status;
1553
+
1554
+ const labeled = CHAT_STATUS_LABELS[status];
1555
+ if (labeled) return labeled;
1556
+
1557
+ const normalized = status.trim();
1558
+ const pendingWithUserTpl = CHAT_TEMPLATES.pending_with_user;
1559
+ if (pendingWithUserTpl) {
1560
+ const params = matchTemplateMessage(pendingWithUserTpl.en, normalized);
1561
+ if (params) {
1562
+ return interpolate(pendingWithUserTpl.ar, buildArabicChatTemplateParams(params, actors));
1563
+ }
1564
+ }
1565
+
1566
+ const pendingWithRoleTpl = CHAT_TEMPLATES.pending_with_role;
1567
+ if (pendingWithRoleTpl) {
1568
+ const params = matchTemplateMessage(pendingWithRoleTpl.en, normalized);
1569
+ if (params) {
1570
+ return interpolate(pendingWithRoleTpl.ar, buildArabicChatTemplateParams(params, actors));
1571
+ }
1572
+ }
1573
+
1574
+ return status;
1551
1575
  }
1552
1576
 
1553
1577
  // ─── Legacy row enrichment (read API) ────────────────────────────────────────
@@ -2310,7 +2334,7 @@ export function enrichChatMessage(chat: Record<string, unknown>): Record<string,
2310
2334
  return {
2311
2335
  ...chat,
2312
2336
  message_ar: chat.message_ar ?? resolveChatMessageAr(message, actors),
2313
- status_ar: chat.status_ar ?? resolveChatStatusAr(status),
2337
+ status_ar: chat.status_ar ?? resolveChatStatusAr(status, actors),
2314
2338
  };
2315
2339
  }
2316
2340
 
package/src/index.ts CHANGED
@@ -504,6 +504,7 @@ export * from './models/RequestTenderAnalysisRequestModel';
504
504
  export * from './models/ContractServiceRequestModel';
505
505
  export * from './models/ContractServiceRequestDocumentModel';
506
506
  export * from './models/SlaConfigModel';
507
+ export * from './models/ChatbotQnsAnsMappingModel';
507
508
  export * from './models/SlaRequestModel';
508
509
  export * from './models/SlaMyRequestsViewModel';
509
510
  export * from './models/SlaApprovalsViewModel';