@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.
- package/dist/data-source.js +2 -0
- package/dist/i18n/workflow-chat-i18n.json +8 -0
- package/dist/i18n/workflow-chat-message.builder.d.ts +1 -1
- package/dist/i18n/workflow-chat-message.builder.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/models/ChatbotQnsAnsMappingModel.d.ts +8 -0
- package/dist/models/ChatbotQnsAnsMappingModel.js +40 -0
- package/dist/models/DocumentMetadataModel.d.ts +45 -0
- package/dist/models/DocumentMetadataModel.js +171 -0
- package/dist/models/DocumentationDepartmentsModel.d.ts +13 -0
- package/dist/models/DocumentationDepartmentsModel.js +53 -0
- package/dist/models/FolderModel.d.ts +16 -0
- package/dist/models/FolderModel.js +85 -0
- package/dist/models/ImportExportMaterialModels.d.ts +92 -0
- package/dist/models/ImportExportMaterialModels.js +307 -0
- package/dist/models/PermissionModel.d.ts +18 -0
- package/dist/models/PermissionModel.js +68 -0
- package/dist/models/SecurityAccessApprovalModel.d.ts +23 -0
- package/dist/models/SecurityAccessApprovalModel.js +82 -0
- package/dist/models/SecurityAccessAttachmentModel.d.ts +12 -0
- package/dist/models/SecurityAccessAttachmentModel.js +56 -0
- package/dist/models/SecurityAccessChatModel.d.ts +12 -0
- package/dist/models/SecurityAccessChatModel.js +56 -0
- package/dist/models/SecurityAccessRequestModel.d.ts +25 -0
- package/dist/models/SecurityAccessRequestModel.js +80 -0
- package/dist/models/SecurityAccessWorkflowModel.d.ts +24 -0
- package/dist/models/SecurityAccessWorkflowModel.js +84 -0
- package/dist/models/ServiceExtensionAfterAge60Models.d.ts +93 -0
- package/dist/models/ServiceExtensionAfterAge60Models.js +312 -0
- package/dist/models/SlaApprovalsViewModel.js +54 -47
- package/dist/models/SlaMyRequestsViewModel.d.ts +3 -0
- package/dist/models/SlaMyRequestsViewModel.js +22 -2
- package/dist/models/UUIDBaseModel.d.ts +14 -0
- package/dist/models/UUIDBaseModel.js +66 -0
- package/dist/models/WorkingHoursExtensionModels.d.ts +88 -0
- package/dist/models/WorkingHoursExtensionModels.js +295 -0
- package/package.json +1 -1
- package/scripts/sync-sla-reports-sql.js +92 -92
- package/sql/README.md +21 -21
- package/sql/create_chatbot_qns_ans_mapping.sql +25 -0
- package/sql/sla_reports_admin_procedures.sql +323 -304
- package/sql/sla_reports_approvals_workbook.sql +430 -383
- package/sql/sla_reports_procedures.sql +886 -886
- package/sql/user_role_department_section_validation.sql +214 -0
- package/sql/vw_sla_approvals.sql +115 -108
- package/sql/vw_sla_my_requests.sql +58 -53
- package/src/data-source.ts +2 -0
- package/src/i18n/workflow-chat-i18n.json +8 -0
- package/src/i18n/workflow-chat-message.builder.ts +27 -3
- package/src/index.ts +1 -0
- package/src/models/AccessCardRequestModel.ts +135 -135
- package/src/models/AirportEntryPermitModel.ts +276 -276
- package/src/models/AnnualTrainingPlanRequestModel.ts +153 -153
- package/src/models/ChatbotQnsAnsMappingModel.ts +21 -0
- package/src/models/DocumentDriveModel.ts +28 -28
- package/src/models/DocumentFolderModel.ts +45 -45
- package/src/models/HotelApprovalModel.ts +83 -83
- package/src/models/HousingContractCancelApprovalModel.ts +64 -64
- package/src/models/HousingContractRenewalApprovalModel.ts +64 -64
- package/src/models/ITRequestAttachmentModel.ts +73 -73
- package/src/models/ItApprovalsModel.ts +84 -84
- package/src/models/LegalConsultationApprovalModel.ts +65 -65
- package/src/models/MissionTravelPassportExpiryNotificationConfigModel.ts +36 -36
- package/src/models/NotificationModel.ts +89 -89
- package/src/models/ResidentialUnitRentalApprovalModel.ts +143 -143
- package/src/models/ServiceExtensionAfter60ApprovalModel.ts +87 -87
- package/src/models/ServiceSlaApprovalModel.ts +64 -64
- package/src/models/ServicesNotificationConfigModel.ts +55 -55
- package/src/models/SlaApprovalsViewModel.ts +142 -135
- package/src/models/SlaMyRequestsViewModel.ts +21 -1
- package/src/models/StudyLeaveRequestModel.ts +144 -144
- package/src/models/TrainingRequestModel.ts +164 -164
- package/src/models/TrainingRoomBookingRequestModel.ts +142 -142
- package/src/models/TrainingRoomNotificationConfigModel.ts +30 -30
- package/src/models/role.ts +34 -34
- package/src/sla/sla-table-sync.service.ts +90 -90
- package/dist/helpers/cancellation-bilingual-persist.helper.d.ts +0 -37
- 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;
|
package/sql/vw_sla_approvals.sql
CHANGED
|
@@ -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.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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;
|
package/src/data-source.ts
CHANGED
|
@@ -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(
|
|
1548
|
+
export function resolveChatStatusAr(
|
|
1549
|
+
status: string | null | undefined,
|
|
1550
|
+
actors?: BilingualActorNames,
|
|
1551
|
+
): string | null {
|
|
1549
1552
|
if (status == null || status === '') return null;
|
|
1550
|
-
|
|
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';
|