@platform-modules/civil-aviation-authority 2.3.265 → 2.3.266
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/.env +0 -15
- package/dist/models/AnnualIncrementRequestEmployeeModel.d.ts +2 -1
- package/dist/models/AnnualIncrementRequestEmployeeModel.js +7 -2
- package/dist/models/AnnualIncrementRequestModel.d.ts +2 -1
- package/dist/models/AnnualIncrementRequestModel.js +7 -2
- package/dist/models/SlaApprovalsViewModel.js +47 -47
- package/dist/models/SlaMyRequestsViewModel.js +50 -50
- package/package.json +1 -1
- package/scripts/sync-sla-reports-sql.js +98 -94
- package/sql/README.md +21 -25
- package/sql/sla-reports-sync.manifest.json +7 -7
- package/sql/sla_reports_admin_procedures.sql +283 -283
- package/sql/sla_reports_approvals_workbook.sql +383 -383
- package/sql/sla_reports_procedures.sql +874 -874
- package/sql/vw_sla_approvals.sql +108 -108
- package/sql/vw_sla_my_requests.sql +53 -53
- package/src/data-source.ts +517 -517
- package/src/index.ts +495 -495
- package/src/models/AccessCardRequestModel.ts +135 -135
- package/src/models/AirportEntryPermitModel.ts +276 -276
- package/src/models/AnnualIncrementRequestEmployeeModel.ts +6 -1
- package/src/models/AnnualIncrementRequestModel.ts +6 -1
- package/src/models/AnnualTrainingPlanRequestModel.ts +153 -153
- package/src/models/DepartmentsModel.ts +25 -25
- 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/HousingContractCancelChatModel.ts +56 -56
- package/src/models/HousingContractRenewalApprovalModel.ts +64 -64
- package/src/models/HousingContractRenewalChatModel.ts +59 -59
- package/src/models/ITRequestAttachmentModel.ts +73 -73
- package/src/models/ITRequestChatModel.ts +74 -74
- package/src/models/ItApprovalsModel.ts +84 -84
- package/src/models/ItWorkflowModel.ts +55 -55
- 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/ResidentialUnitRentalChatModel.ts +56 -56
- package/src/models/ResidentialUnitRentalRequestModel.ts +218 -218
- 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 +135 -135
- package/src/models/SlaMyRequestsViewModel.ts +170 -170
- package/src/models/SlaRequestModel.ts +65 -65
- 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/models/user.ts +233 -233
- package/src/sla/sla-table-sync.service.ts +90 -90
- package/dist/models/DocumentMetadataModel.d.ts +0 -45
- package/dist/models/DocumentMetadataModel.js +0 -171
- package/dist/models/DocumentationDepartmentsModel.d.ts +0 -13
- package/dist/models/DocumentationDepartmentsModel.js +0 -53
- package/dist/models/FolderModel.d.ts +0 -16
- package/dist/models/FolderModel.js +0 -85
- package/dist/models/ImportExportMaterialModels.d.ts +0 -92
- package/dist/models/ImportExportMaterialModels.js +0 -307
- package/dist/models/PermissionModel.d.ts +0 -18
- package/dist/models/PermissionModel.js +0 -68
- package/dist/models/SecurityAccessApprovalModel.d.ts +0 -23
- package/dist/models/SecurityAccessApprovalModel.js +0 -82
- package/dist/models/SecurityAccessAttachmentModel.d.ts +0 -12
- package/dist/models/SecurityAccessAttachmentModel.js +0 -56
- package/dist/models/SecurityAccessChatModel.d.ts +0 -12
- package/dist/models/SecurityAccessChatModel.js +0 -56
- package/dist/models/SecurityAccessRequestModel.d.ts +0 -25
- package/dist/models/SecurityAccessRequestModel.js +0 -80
- package/dist/models/SecurityAccessWorkflowModel.d.ts +0 -24
- package/dist/models/SecurityAccessWorkflowModel.js +0 -84
- package/dist/models/ServiceExtensionAfterAge60Models.d.ts +0 -93
- package/dist/models/ServiceExtensionAfterAge60Models.js +0 -312
- package/dist/models/UUIDBaseModel.d.ts +0 -14
- package/dist/models/UUIDBaseModel.js +0 -66
- package/dist/models/WorkingHoursExtensionModels.d.ts +0 -88
- package/dist/models/WorkingHoursExtensionModels.js +0 -295
|
@@ -1,283 +1,283 @@
|
|
|
1
|
-
-- Admin SLA reports + approvals Excel export
|
|
2
|
-
-- Prerequisites: sla_reports_procedures.sql, vw_sla_my_requests.sql, vw_sla_approvals.sql
|
|
3
|
-
-- Applied via: npm run sync:sla-sql (after sla_reports_procedures.sql in manifest)
|
|
4
|
-
|
|
5
|
-
CREATE OR REPLACE FUNCTION sla_filtered_request_fields(p_request_obj JSONB)
|
|
6
|
-
RETURNS JSONB
|
|
7
|
-
LANGUAGE sql
|
|
8
|
-
IMMUTABLE
|
|
9
|
-
AS $$
|
|
10
|
-
SELECT
|
|
11
|
-
COALESCE(p_request_obj, '{}'::jsonb)
|
|
12
|
-
- 'id' - 'status' - 'role_id' - 'user_id' - 'createdBy' - 'created_at'
|
|
13
|
-
- 'updated_by' - 'updated_at' - 'req_user_department_id' - 'workflow_execution_id'
|
|
14
|
-
- 'department_id' - 'req_user_section_id' - 'service_type_id' - 'service_type'
|
|
15
|
-
- 'created_by' - 'service_id' - 'sub_service_id' - 'attachments'
|
|
16
|
-
- 'is_deleted' - 'sla_request' - 'sla_request_id';
|
|
17
|
-
$$;
|
|
18
|
-
|
|
19
|
-
-- Admin list views: served by Reports_Service TypeORM (sla-my-requests-view.query.ts, sla-approvals-view.query.ts)
|
|
20
|
-
|
|
21
|
-
-- ---------------------------------------------------------------------------
|
|
22
|
-
-- ADMIN — my requests Excel (optional p_target_user_id)
|
|
23
|
-
-- Per sub-service Requests + Approvals sheets (same as user my-requests download)
|
|
24
|
-
-- ---------------------------------------------------------------------------
|
|
25
|
-
CREATE OR REPLACE FUNCTION sp_sla_admin_my_requests_excel_export(
|
|
26
|
-
p_target_user_id INT DEFAULT NULL,
|
|
27
|
-
p_service_ids INT[] DEFAULT NULL,
|
|
28
|
-
p_sub_service_ids INT[] DEFAULT NULL,
|
|
29
|
-
p_statuses TEXT[] DEFAULT ARRAY['Pending','In Progress','Approved','Rejected'],
|
|
30
|
-
p_from_date DATE DEFAULT NULL,
|
|
31
|
-
p_to_date DATE DEFAULT NULL,
|
|
32
|
-
p_search_text TEXT DEFAULT NULL,
|
|
33
|
-
p_sort_by TEXT DEFAULT 'created_at',
|
|
34
|
-
p_sort_order TEXT DEFAULT 'DESC'
|
|
35
|
-
)
|
|
36
|
-
RETURNS TABLE (
|
|
37
|
-
sheet_order INT,
|
|
38
|
-
sub_service_id INT,
|
|
39
|
-
sub_service_name TEXT,
|
|
40
|
-
sheet_name TEXT,
|
|
41
|
-
headers JSONB,
|
|
42
|
-
rows JSONB
|
|
43
|
-
)
|
|
44
|
-
LANGUAGE plpgsql
|
|
45
|
-
STABLE
|
|
46
|
-
AS $$
|
|
47
|
-
DECLARE
|
|
48
|
-
v_sort_col TEXT;
|
|
49
|
-
v_sort_dir TEXT;
|
|
50
|
-
v_sub RECORD;
|
|
51
|
-
v_row RECORD;
|
|
52
|
-
v_dyn_keys TEXT[];
|
|
53
|
-
v_dyn_labels TEXT[];
|
|
54
|
-
v_common_labels TEXT[] := ARRAY[
|
|
55
|
-
'SLA Request ID', 'Request ID', 'User', 'Status', 'Created At',
|
|
56
|
-
'Created By', 'Department', 'Section'
|
|
57
|
-
];
|
|
58
|
-
v_headers_labels TEXT[];
|
|
59
|
-
v_headers_json JSONB;
|
|
60
|
-
v_cells TEXT[];
|
|
61
|
-
v_all_rows JSONB;
|
|
62
|
-
v_k TEXT;
|
|
63
|
-
v_sheet_order INT := 0;
|
|
64
|
-
v_user_filter TEXT;
|
|
65
|
-
BEGIN
|
|
66
|
-
v_user_filter := CASE WHEN p_target_user_id IS NULL THEN 'TRUE' ELSE format('v.user_id = %s', p_target_user_id) END;
|
|
67
|
-
|
|
68
|
-
v_sort_col := CASE lower(trim(p_sort_by))
|
|
69
|
-
WHEN 'updated_at' THEN 'v.created_at'
|
|
70
|
-
WHEN 'id' THEN 'v.sla_request_id'
|
|
71
|
-
WHEN 'status' THEN 'v.status'
|
|
72
|
-
WHEN 'request_id' THEN 'v.request_id'
|
|
73
|
-
ELSE 'v.created_at'
|
|
74
|
-
END;
|
|
75
|
-
v_sort_dir := CASE WHEN upper(trim(p_sort_order)) = 'ASC' THEN 'ASC' ELSE 'DESC' END;
|
|
76
|
-
|
|
77
|
-
FOR v_sub IN
|
|
78
|
-
EXECUTE format($q$
|
|
79
|
-
SELECT DISTINCT
|
|
80
|
-
COALESCE(sr.sub_service_id, 0) AS sub_service_id_num,
|
|
81
|
-
COALESCE(NULLIF(trim(subsvc.sub_service_name), ''), NULLIF(trim(v.sub_service_name), ''), 'Uncategorized') AS sub_service_name
|
|
82
|
-
FROM vw_sla_my_requests v
|
|
83
|
-
INNER JOIN sla_requests sr ON sr.id = v.sla_request_id AND COALESCE(sr.is_deleted, false) = false
|
|
84
|
-
LEFT JOIN caa_sub_services subsvc ON subsvc.id = sr.sub_service_id
|
|
85
|
-
WHERE %s
|
|
86
|
-
AND v.status = ANY($1)
|
|
87
|
-
AND ($2 IS NULL OR cardinality($2) = 0 OR sr.service_id = ANY($2))
|
|
88
|
-
AND ($3 IS NULL OR cardinality($3) = 0 OR sr.sub_service_id = ANY($3))
|
|
89
|
-
AND ($4 IS NULL OR v.created_at::date >= $4)
|
|
90
|
-
AND ($5 IS NULL OR v.created_at::date <= $5)
|
|
91
|
-
AND ($6 IS NULL OR trim($6) = '' OR CAST(v.request_id AS TEXT) ILIKE '%%' || trim($6) || '%%')
|
|
92
|
-
ORDER BY sub_service_name ASC
|
|
93
|
-
$q$, v_user_filter)
|
|
94
|
-
USING p_statuses, p_service_ids, p_sub_service_ids, p_from_date, p_to_date, p_search_text
|
|
95
|
-
LOOP
|
|
96
|
-
v_sheet_order := v_sheet_order + 1;
|
|
97
|
-
|
|
98
|
-
EXECUTE format($q$
|
|
99
|
-
SELECT COALESCE(array_agg(DISTINCT keys.k ORDER BY keys.k), ARRAY[]::TEXT[])
|
|
100
|
-
FROM vw_sla_my_requests v
|
|
101
|
-
INNER JOIN sla_requests sr ON sr.id = v.sla_request_id AND COALESCE(sr.is_deleted, false) = false
|
|
102
|
-
CROSS JOIN LATERAL jsonb_object_keys(COALESCE(v.request_fields, '{}'::jsonb)) AS keys(k)
|
|
103
|
-
WHERE %s
|
|
104
|
-
AND v.status = ANY($1)
|
|
105
|
-
AND ($2 IS NULL OR cardinality($2) = 0 OR sr.service_id = ANY($2))
|
|
106
|
-
AND ($3 IS NULL OR cardinality($3) = 0 OR sr.sub_service_id = ANY($3))
|
|
107
|
-
AND ($4 IS NULL OR v.created_at::date >= $4)
|
|
108
|
-
AND ($5 IS NULL OR v.created_at::date <= $5)
|
|
109
|
-
AND ($6 IS NULL OR trim($6) = '' OR CAST(v.request_id AS TEXT) ILIKE '%%' || trim($6) || '%%')
|
|
110
|
-
AND COALESCE(sr.sub_service_id, 0) = %s
|
|
111
|
-
$q$, v_user_filter, v_sub.sub_service_id_num)
|
|
112
|
-
INTO v_dyn_keys
|
|
113
|
-
USING p_statuses, p_service_ids, p_sub_service_ids, p_from_date, p_to_date, p_search_text;
|
|
114
|
-
|
|
115
|
-
v_dyn_labels := ARRAY[]::TEXT[];
|
|
116
|
-
IF v_dyn_keys IS NOT NULL THEN
|
|
117
|
-
FOREACH v_k IN ARRAY v_dyn_keys LOOP
|
|
118
|
-
v_dyn_labels := array_append(v_dyn_labels, sla_excel_header_label(v_k));
|
|
119
|
-
END LOOP;
|
|
120
|
-
END IF;
|
|
121
|
-
|
|
122
|
-
v_headers_labels := ARRAY(
|
|
123
|
-
SELECT sla_excel_header_label(lbl)
|
|
124
|
-
FROM unnest(v_common_labels || COALESCE(v_dyn_labels, ARRAY[]::TEXT[])) AS u(lbl)
|
|
125
|
-
);
|
|
126
|
-
v_headers_json := to_jsonb(v_headers_labels);
|
|
127
|
-
v_all_rows := '[]'::jsonb;
|
|
128
|
-
|
|
129
|
-
FOR v_row IN
|
|
130
|
-
EXECUTE format($q$
|
|
131
|
-
SELECT
|
|
132
|
-
v.sla_request_id, v.request_id, v.status, v.created_at, v.created_by,
|
|
133
|
-
v.req_user_department_id, v.req_user_section_id, v.request_fields,
|
|
134
|
-
TRIM(COALESCE(u.employee_name, '')) AS user_name
|
|
135
|
-
FROM vw_sla_my_requests v
|
|
136
|
-
INNER JOIN sla_requests sr ON sr.id = v.sla_request_id AND COALESCE(sr.is_deleted, false) = false
|
|
137
|
-
LEFT JOIN users u ON u.id = v.user_id AND COALESCE(u.is_deleted, false) = false
|
|
138
|
-
WHERE %s
|
|
139
|
-
AND v.status = ANY($1)
|
|
140
|
-
AND ($2 IS NULL OR cardinality($2) = 0 OR sr.service_id = ANY($2))
|
|
141
|
-
AND ($3 IS NULL OR cardinality($3) = 0 OR sr.sub_service_id = ANY($3))
|
|
142
|
-
AND ($4 IS NULL OR v.created_at::date >= $4)
|
|
143
|
-
AND ($5 IS NULL OR v.created_at::date <= $5)
|
|
144
|
-
AND ($6 IS NULL OR trim($6) = '' OR CAST(v.request_id AS TEXT) ILIKE '%%' || trim($6) || '%%')
|
|
145
|
-
AND COALESCE(sr.sub_service_id, 0) = %s
|
|
146
|
-
ORDER BY %s %s, v.sla_request_id ASC
|
|
147
|
-
$q$, v_user_filter, v_sub.sub_service_id_num, v_sort_col, v_sort_dir)
|
|
148
|
-
USING p_statuses, p_service_ids, p_sub_service_ids, p_from_date, p_to_date, p_search_text
|
|
149
|
-
LOOP
|
|
150
|
-
v_cells := ARRAY[
|
|
151
|
-
COALESCE(v_row.sla_request_id::TEXT, ''),
|
|
152
|
-
COALESCE(v_row.request_id::TEXT, ''),
|
|
153
|
-
COALESCE(v_row.user_name, ''),
|
|
154
|
-
COALESCE(v_row.status, ''),
|
|
155
|
-
COALESCE(to_char(v_row.created_at AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS'), ''),
|
|
156
|
-
COALESCE(v_row.created_by, ''),
|
|
157
|
-
COALESCE(v_row.req_user_department_id, ''),
|
|
158
|
-
COALESCE(v_row.req_user_section_id, '')
|
|
159
|
-
];
|
|
160
|
-
IF v_dyn_keys IS NOT NULL THEN
|
|
161
|
-
FOREACH v_k IN ARRAY v_dyn_keys LOOP
|
|
162
|
-
v_cells := array_append(v_cells, COALESCE(sla_request_field_cell(v_row.request_fields, v_k), ''));
|
|
163
|
-
END LOOP;
|
|
164
|
-
END IF;
|
|
165
|
-
v_all_rows := v_all_rows || jsonb_build_array(to_jsonb(v_cells));
|
|
166
|
-
END LOOP;
|
|
167
|
-
|
|
168
|
-
sheet_order := v_sheet_order;
|
|
169
|
-
sub_service_id := NULLIF(v_sub.sub_service_id_num, 0);
|
|
170
|
-
sub_service_name := v_sub.sub_service_name;
|
|
171
|
-
sheet_name := sla_excel_sheet_name(v_sub.sub_service_name);
|
|
172
|
-
headers := v_headers_json;
|
|
173
|
-
rows := v_all_rows;
|
|
174
|
-
RETURN NEXT;
|
|
175
|
-
END LOOP;
|
|
176
|
-
|
|
177
|
-
RETURN QUERY
|
|
178
|
-
SELECT *
|
|
179
|
-
FROM sla_my_requests_approvals_excel_sheet(
|
|
180
|
-
v_user_filter,
|
|
181
|
-
p_statuses,
|
|
182
|
-
p_service_ids,
|
|
183
|
-
p_sub_service_ids,
|
|
184
|
-
p_from_date,
|
|
185
|
-
p_to_date,
|
|
186
|
-
p_search_text,
|
|
187
|
-
v_sheet_order + 1
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
RETURN;
|
|
191
|
-
END;
|
|
192
|
-
$$;
|
|
193
|
-
|
|
194
|
-
-- ---------------------------------------------------------------------------
|
|
195
|
-
-- APPROVALS — Excel export (approver-scoped; user download)
|
|
196
|
-
-- Workbook: per sub-service Requests + Approvals (see sla_reports_approvals_workbook.sql)
|
|
197
|
-
-- ---------------------------------------------------------------------------
|
|
198
|
-
DROP FUNCTION IF EXISTS sp_sla_approvals_excel_export_internal(
|
|
199
|
-
TEXT, BOOLEAN, INT, INT[], INT[], TEXT[], TEXT[], DATE, DATE, TEXT, TEXT, TEXT
|
|
200
|
-
);
|
|
201
|
-
|
|
202
|
-
CREATE OR REPLACE FUNCTION sp_sla_approvals_excel_export(
|
|
203
|
-
p_approver_user_id INT,
|
|
204
|
-
p_service_ids INT[] DEFAULT NULL,
|
|
205
|
-
p_sub_service_ids INT[] DEFAULT NULL,
|
|
206
|
-
p_request_statuses TEXT[] DEFAULT ARRAY['Pending','In Progress','Approved','Rejected'],
|
|
207
|
-
p_approval_statuses TEXT[] DEFAULT ARRAY['In Progress','Approved','Rejected'],
|
|
208
|
-
p_from_date DATE DEFAULT NULL,
|
|
209
|
-
p_to_date DATE DEFAULT NULL,
|
|
210
|
-
p_search_text TEXT DEFAULT NULL,
|
|
211
|
-
p_sort_by TEXT DEFAULT 'created_at',
|
|
212
|
-
p_sort_order TEXT DEFAULT 'DESC'
|
|
213
|
-
)
|
|
214
|
-
RETURNS TABLE (
|
|
215
|
-
sheet_order INT, sub_service_id INT, sub_service_name TEXT, sheet_name TEXT, headers JSONB, rows JSONB
|
|
216
|
-
)
|
|
217
|
-
LANGUAGE plpgsql
|
|
218
|
-
STABLE
|
|
219
|
-
AS $$
|
|
220
|
-
DECLARE
|
|
221
|
-
v_exists TEXT := sla_approval_queue_exists_sql(p_approver_user_id);
|
|
222
|
-
v_own TEXT := format('sr.user_id != %s', p_approver_user_id);
|
|
223
|
-
BEGIN
|
|
224
|
-
RETURN QUERY
|
|
225
|
-
SELECT * FROM sp_sla_approvals_workbook_excel_export(
|
|
226
|
-
v_exists,
|
|
227
|
-
v_own,
|
|
228
|
-
p_service_ids,
|
|
229
|
-
p_sub_service_ids,
|
|
230
|
-
p_request_statuses,
|
|
231
|
-
p_approval_statuses,
|
|
232
|
-
p_from_date,
|
|
233
|
-
p_to_date,
|
|
234
|
-
p_search_text,
|
|
235
|
-
p_sort_by,
|
|
236
|
-
p_sort_order
|
|
237
|
-
);
|
|
238
|
-
END;
|
|
239
|
-
$$;
|
|
240
|
-
|
|
241
|
-
-- ---------------------------------------------------------------------------
|
|
242
|
-
-- ADMIN — approvals Excel
|
|
243
|
-
-- Per sub-service Requests + Approvals; optional approver_user_id (NULL = all queues)
|
|
244
|
-
-- Does not exclude own requests (unlike user approvals download)
|
|
245
|
-
-- ---------------------------------------------------------------------------
|
|
246
|
-
CREATE OR REPLACE FUNCTION sp_sla_admin_approvals_excel_export(
|
|
247
|
-
p_target_approver_user_id INT DEFAULT NULL,
|
|
248
|
-
p_service_ids INT[] DEFAULT NULL,
|
|
249
|
-
p_sub_service_ids INT[] DEFAULT NULL,
|
|
250
|
-
p_request_statuses TEXT[] DEFAULT ARRAY['Pending','In Progress','Approved','Rejected'],
|
|
251
|
-
p_approval_statuses TEXT[] DEFAULT ARRAY['In Progress','Approved','Rejected'],
|
|
252
|
-
p_from_date DATE DEFAULT NULL,
|
|
253
|
-
p_to_date DATE DEFAULT NULL,
|
|
254
|
-
p_search_text TEXT DEFAULT NULL,
|
|
255
|
-
p_sort_by TEXT DEFAULT 'created_at',
|
|
256
|
-
p_sort_order TEXT DEFAULT 'DESC'
|
|
257
|
-
)
|
|
258
|
-
RETURNS TABLE (
|
|
259
|
-
sheet_order INT, sub_service_id INT, sub_service_name TEXT, sheet_name TEXT, headers JSONB, rows JSONB
|
|
260
|
-
)
|
|
261
|
-
LANGUAGE plpgsql
|
|
262
|
-
STABLE
|
|
263
|
-
AS $$
|
|
264
|
-
DECLARE
|
|
265
|
-
v_exists TEXT := sla_approval_queue_exists_sql_optional(p_target_approver_user_id);
|
|
266
|
-
v_own TEXT := 'TRUE';
|
|
267
|
-
BEGIN
|
|
268
|
-
RETURN QUERY
|
|
269
|
-
SELECT * FROM sp_sla_approvals_workbook_excel_export(
|
|
270
|
-
v_exists,
|
|
271
|
-
v_own,
|
|
272
|
-
p_service_ids,
|
|
273
|
-
p_sub_service_ids,
|
|
274
|
-
p_request_statuses,
|
|
275
|
-
p_approval_statuses,
|
|
276
|
-
p_from_date,
|
|
277
|
-
p_to_date,
|
|
278
|
-
p_search_text,
|
|
279
|
-
p_sort_by,
|
|
280
|
-
p_sort_order
|
|
281
|
-
);
|
|
282
|
-
END;
|
|
283
|
-
$$;
|
|
1
|
+
-- Admin SLA reports + approvals Excel export
|
|
2
|
+
-- Prerequisites: sla_reports_procedures.sql, vw_sla_my_requests.sql, vw_sla_approvals.sql
|
|
3
|
+
-- Applied via: npm run sync:sla-sql (after sla_reports_procedures.sql in manifest)
|
|
4
|
+
|
|
5
|
+
CREATE OR REPLACE FUNCTION sla_filtered_request_fields(p_request_obj JSONB)
|
|
6
|
+
RETURNS JSONB
|
|
7
|
+
LANGUAGE sql
|
|
8
|
+
IMMUTABLE
|
|
9
|
+
AS $$
|
|
10
|
+
SELECT
|
|
11
|
+
COALESCE(p_request_obj, '{}'::jsonb)
|
|
12
|
+
- 'id' - 'status' - 'role_id' - 'user_id' - 'createdBy' - 'created_at'
|
|
13
|
+
- 'updated_by' - 'updated_at' - 'req_user_department_id' - 'workflow_execution_id'
|
|
14
|
+
- 'department_id' - 'req_user_section_id' - 'service_type_id' - 'service_type'
|
|
15
|
+
- 'created_by' - 'service_id' - 'sub_service_id' - 'attachments'
|
|
16
|
+
- 'is_deleted' - 'sla_request' - 'sla_request_id';
|
|
17
|
+
$$;
|
|
18
|
+
|
|
19
|
+
-- Admin list views: served by Reports_Service TypeORM (sla-my-requests-view.query.ts, sla-approvals-view.query.ts)
|
|
20
|
+
|
|
21
|
+
-- ---------------------------------------------------------------------------
|
|
22
|
+
-- ADMIN — my requests Excel (optional p_target_user_id)
|
|
23
|
+
-- Per sub-service Requests + Approvals sheets (same as user my-requests download)
|
|
24
|
+
-- ---------------------------------------------------------------------------
|
|
25
|
+
CREATE OR REPLACE FUNCTION sp_sla_admin_my_requests_excel_export(
|
|
26
|
+
p_target_user_id INT DEFAULT NULL,
|
|
27
|
+
p_service_ids INT[] DEFAULT NULL,
|
|
28
|
+
p_sub_service_ids INT[] DEFAULT NULL,
|
|
29
|
+
p_statuses TEXT[] DEFAULT ARRAY['Pending','In Progress','Approved','Rejected'],
|
|
30
|
+
p_from_date DATE DEFAULT NULL,
|
|
31
|
+
p_to_date DATE DEFAULT NULL,
|
|
32
|
+
p_search_text TEXT DEFAULT NULL,
|
|
33
|
+
p_sort_by TEXT DEFAULT 'created_at',
|
|
34
|
+
p_sort_order TEXT DEFAULT 'DESC'
|
|
35
|
+
)
|
|
36
|
+
RETURNS TABLE (
|
|
37
|
+
sheet_order INT,
|
|
38
|
+
sub_service_id INT,
|
|
39
|
+
sub_service_name TEXT,
|
|
40
|
+
sheet_name TEXT,
|
|
41
|
+
headers JSONB,
|
|
42
|
+
rows JSONB
|
|
43
|
+
)
|
|
44
|
+
LANGUAGE plpgsql
|
|
45
|
+
STABLE
|
|
46
|
+
AS $$
|
|
47
|
+
DECLARE
|
|
48
|
+
v_sort_col TEXT;
|
|
49
|
+
v_sort_dir TEXT;
|
|
50
|
+
v_sub RECORD;
|
|
51
|
+
v_row RECORD;
|
|
52
|
+
v_dyn_keys TEXT[];
|
|
53
|
+
v_dyn_labels TEXT[];
|
|
54
|
+
v_common_labels TEXT[] := ARRAY[
|
|
55
|
+
'SLA Request ID', 'Request ID', 'User', 'Status', 'Created At',
|
|
56
|
+
'Created By', 'Department', 'Section'
|
|
57
|
+
];
|
|
58
|
+
v_headers_labels TEXT[];
|
|
59
|
+
v_headers_json JSONB;
|
|
60
|
+
v_cells TEXT[];
|
|
61
|
+
v_all_rows JSONB;
|
|
62
|
+
v_k TEXT;
|
|
63
|
+
v_sheet_order INT := 0;
|
|
64
|
+
v_user_filter TEXT;
|
|
65
|
+
BEGIN
|
|
66
|
+
v_user_filter := CASE WHEN p_target_user_id IS NULL THEN 'TRUE' ELSE format('v.user_id = %s', p_target_user_id) END;
|
|
67
|
+
|
|
68
|
+
v_sort_col := CASE lower(trim(p_sort_by))
|
|
69
|
+
WHEN 'updated_at' THEN 'v.created_at'
|
|
70
|
+
WHEN 'id' THEN 'v.sla_request_id'
|
|
71
|
+
WHEN 'status' THEN 'v.status'
|
|
72
|
+
WHEN 'request_id' THEN 'v.request_id'
|
|
73
|
+
ELSE 'v.created_at'
|
|
74
|
+
END;
|
|
75
|
+
v_sort_dir := CASE WHEN upper(trim(p_sort_order)) = 'ASC' THEN 'ASC' ELSE 'DESC' END;
|
|
76
|
+
|
|
77
|
+
FOR v_sub IN
|
|
78
|
+
EXECUTE format($q$
|
|
79
|
+
SELECT DISTINCT
|
|
80
|
+
COALESCE(sr.sub_service_id, 0) AS sub_service_id_num,
|
|
81
|
+
COALESCE(NULLIF(trim(subsvc.sub_service_name), ''), NULLIF(trim(v.sub_service_name), ''), 'Uncategorized') AS sub_service_name
|
|
82
|
+
FROM vw_sla_my_requests v
|
|
83
|
+
INNER JOIN sla_requests sr ON sr.id = v.sla_request_id AND COALESCE(sr.is_deleted, false) = false
|
|
84
|
+
LEFT JOIN caa_sub_services subsvc ON subsvc.id = sr.sub_service_id
|
|
85
|
+
WHERE %s
|
|
86
|
+
AND v.status = ANY($1)
|
|
87
|
+
AND ($2 IS NULL OR cardinality($2) = 0 OR sr.service_id = ANY($2))
|
|
88
|
+
AND ($3 IS NULL OR cardinality($3) = 0 OR sr.sub_service_id = ANY($3))
|
|
89
|
+
AND ($4 IS NULL OR v.created_at::date >= $4)
|
|
90
|
+
AND ($5 IS NULL OR v.created_at::date <= $5)
|
|
91
|
+
AND ($6 IS NULL OR trim($6) = '' OR CAST(v.request_id AS TEXT) ILIKE '%%' || trim($6) || '%%')
|
|
92
|
+
ORDER BY sub_service_name ASC
|
|
93
|
+
$q$, v_user_filter)
|
|
94
|
+
USING p_statuses, p_service_ids, p_sub_service_ids, p_from_date, p_to_date, p_search_text
|
|
95
|
+
LOOP
|
|
96
|
+
v_sheet_order := v_sheet_order + 1;
|
|
97
|
+
|
|
98
|
+
EXECUTE format($q$
|
|
99
|
+
SELECT COALESCE(array_agg(DISTINCT keys.k ORDER BY keys.k), ARRAY[]::TEXT[])
|
|
100
|
+
FROM vw_sla_my_requests v
|
|
101
|
+
INNER JOIN sla_requests sr ON sr.id = v.sla_request_id AND COALESCE(sr.is_deleted, false) = false
|
|
102
|
+
CROSS JOIN LATERAL jsonb_object_keys(COALESCE(v.request_fields, '{}'::jsonb)) AS keys(k)
|
|
103
|
+
WHERE %s
|
|
104
|
+
AND v.status = ANY($1)
|
|
105
|
+
AND ($2 IS NULL OR cardinality($2) = 0 OR sr.service_id = ANY($2))
|
|
106
|
+
AND ($3 IS NULL OR cardinality($3) = 0 OR sr.sub_service_id = ANY($3))
|
|
107
|
+
AND ($4 IS NULL OR v.created_at::date >= $4)
|
|
108
|
+
AND ($5 IS NULL OR v.created_at::date <= $5)
|
|
109
|
+
AND ($6 IS NULL OR trim($6) = '' OR CAST(v.request_id AS TEXT) ILIKE '%%' || trim($6) || '%%')
|
|
110
|
+
AND COALESCE(sr.sub_service_id, 0) = %s
|
|
111
|
+
$q$, v_user_filter, v_sub.sub_service_id_num)
|
|
112
|
+
INTO v_dyn_keys
|
|
113
|
+
USING p_statuses, p_service_ids, p_sub_service_ids, p_from_date, p_to_date, p_search_text;
|
|
114
|
+
|
|
115
|
+
v_dyn_labels := ARRAY[]::TEXT[];
|
|
116
|
+
IF v_dyn_keys IS NOT NULL THEN
|
|
117
|
+
FOREACH v_k IN ARRAY v_dyn_keys LOOP
|
|
118
|
+
v_dyn_labels := array_append(v_dyn_labels, sla_excel_header_label(v_k));
|
|
119
|
+
END LOOP;
|
|
120
|
+
END IF;
|
|
121
|
+
|
|
122
|
+
v_headers_labels := ARRAY(
|
|
123
|
+
SELECT sla_excel_header_label(lbl)
|
|
124
|
+
FROM unnest(v_common_labels || COALESCE(v_dyn_labels, ARRAY[]::TEXT[])) AS u(lbl)
|
|
125
|
+
);
|
|
126
|
+
v_headers_json := to_jsonb(v_headers_labels);
|
|
127
|
+
v_all_rows := '[]'::jsonb;
|
|
128
|
+
|
|
129
|
+
FOR v_row IN
|
|
130
|
+
EXECUTE format($q$
|
|
131
|
+
SELECT
|
|
132
|
+
v.sla_request_id, v.request_id, v.status, v.created_at, v.created_by,
|
|
133
|
+
v.req_user_department_id, v.req_user_section_id, v.request_fields,
|
|
134
|
+
TRIM(COALESCE(u.employee_name, '')) AS user_name
|
|
135
|
+
FROM vw_sla_my_requests v
|
|
136
|
+
INNER JOIN sla_requests sr ON sr.id = v.sla_request_id AND COALESCE(sr.is_deleted, false) = false
|
|
137
|
+
LEFT JOIN users u ON u.id = v.user_id AND COALESCE(u.is_deleted, false) = false
|
|
138
|
+
WHERE %s
|
|
139
|
+
AND v.status = ANY($1)
|
|
140
|
+
AND ($2 IS NULL OR cardinality($2) = 0 OR sr.service_id = ANY($2))
|
|
141
|
+
AND ($3 IS NULL OR cardinality($3) = 0 OR sr.sub_service_id = ANY($3))
|
|
142
|
+
AND ($4 IS NULL OR v.created_at::date >= $4)
|
|
143
|
+
AND ($5 IS NULL OR v.created_at::date <= $5)
|
|
144
|
+
AND ($6 IS NULL OR trim($6) = '' OR CAST(v.request_id AS TEXT) ILIKE '%%' || trim($6) || '%%')
|
|
145
|
+
AND COALESCE(sr.sub_service_id, 0) = %s
|
|
146
|
+
ORDER BY %s %s, v.sla_request_id ASC
|
|
147
|
+
$q$, v_user_filter, v_sub.sub_service_id_num, v_sort_col, v_sort_dir)
|
|
148
|
+
USING p_statuses, p_service_ids, p_sub_service_ids, p_from_date, p_to_date, p_search_text
|
|
149
|
+
LOOP
|
|
150
|
+
v_cells := ARRAY[
|
|
151
|
+
COALESCE(v_row.sla_request_id::TEXT, ''),
|
|
152
|
+
COALESCE(v_row.request_id::TEXT, ''),
|
|
153
|
+
COALESCE(v_row.user_name, ''),
|
|
154
|
+
COALESCE(v_row.status, ''),
|
|
155
|
+
COALESCE(to_char(v_row.created_at AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS'), ''),
|
|
156
|
+
COALESCE(v_row.created_by, ''),
|
|
157
|
+
COALESCE(v_row.req_user_department_id, ''),
|
|
158
|
+
COALESCE(v_row.req_user_section_id, '')
|
|
159
|
+
];
|
|
160
|
+
IF v_dyn_keys IS NOT NULL THEN
|
|
161
|
+
FOREACH v_k IN ARRAY v_dyn_keys LOOP
|
|
162
|
+
v_cells := array_append(v_cells, COALESCE(sla_request_field_cell(v_row.request_fields, v_k), ''));
|
|
163
|
+
END LOOP;
|
|
164
|
+
END IF;
|
|
165
|
+
v_all_rows := v_all_rows || jsonb_build_array(to_jsonb(v_cells));
|
|
166
|
+
END LOOP;
|
|
167
|
+
|
|
168
|
+
sheet_order := v_sheet_order;
|
|
169
|
+
sub_service_id := NULLIF(v_sub.sub_service_id_num, 0);
|
|
170
|
+
sub_service_name := v_sub.sub_service_name;
|
|
171
|
+
sheet_name := sla_excel_sheet_name(v_sub.sub_service_name);
|
|
172
|
+
headers := v_headers_json;
|
|
173
|
+
rows := v_all_rows;
|
|
174
|
+
RETURN NEXT;
|
|
175
|
+
END LOOP;
|
|
176
|
+
|
|
177
|
+
RETURN QUERY
|
|
178
|
+
SELECT *
|
|
179
|
+
FROM sla_my_requests_approvals_excel_sheet(
|
|
180
|
+
v_user_filter,
|
|
181
|
+
p_statuses,
|
|
182
|
+
p_service_ids,
|
|
183
|
+
p_sub_service_ids,
|
|
184
|
+
p_from_date,
|
|
185
|
+
p_to_date,
|
|
186
|
+
p_search_text,
|
|
187
|
+
v_sheet_order + 1
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
RETURN;
|
|
191
|
+
END;
|
|
192
|
+
$$;
|
|
193
|
+
|
|
194
|
+
-- ---------------------------------------------------------------------------
|
|
195
|
+
-- APPROVALS — Excel export (approver-scoped; user download)
|
|
196
|
+
-- Workbook: per sub-service Requests + Approvals (see sla_reports_approvals_workbook.sql)
|
|
197
|
+
-- ---------------------------------------------------------------------------
|
|
198
|
+
DROP FUNCTION IF EXISTS sp_sla_approvals_excel_export_internal(
|
|
199
|
+
TEXT, BOOLEAN, INT, INT[], INT[], TEXT[], TEXT[], DATE, DATE, TEXT, TEXT, TEXT
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
CREATE OR REPLACE FUNCTION sp_sla_approvals_excel_export(
|
|
203
|
+
p_approver_user_id INT,
|
|
204
|
+
p_service_ids INT[] DEFAULT NULL,
|
|
205
|
+
p_sub_service_ids INT[] DEFAULT NULL,
|
|
206
|
+
p_request_statuses TEXT[] DEFAULT ARRAY['Pending','In Progress','Approved','Rejected'],
|
|
207
|
+
p_approval_statuses TEXT[] DEFAULT ARRAY['In Progress','Approved','Rejected'],
|
|
208
|
+
p_from_date DATE DEFAULT NULL,
|
|
209
|
+
p_to_date DATE DEFAULT NULL,
|
|
210
|
+
p_search_text TEXT DEFAULT NULL,
|
|
211
|
+
p_sort_by TEXT DEFAULT 'created_at',
|
|
212
|
+
p_sort_order TEXT DEFAULT 'DESC'
|
|
213
|
+
)
|
|
214
|
+
RETURNS TABLE (
|
|
215
|
+
sheet_order INT, sub_service_id INT, sub_service_name TEXT, sheet_name TEXT, headers JSONB, rows JSONB
|
|
216
|
+
)
|
|
217
|
+
LANGUAGE plpgsql
|
|
218
|
+
STABLE
|
|
219
|
+
AS $$
|
|
220
|
+
DECLARE
|
|
221
|
+
v_exists TEXT := sla_approval_queue_exists_sql(p_approver_user_id);
|
|
222
|
+
v_own TEXT := format('sr.user_id != %s', p_approver_user_id);
|
|
223
|
+
BEGIN
|
|
224
|
+
RETURN QUERY
|
|
225
|
+
SELECT * FROM sp_sla_approvals_workbook_excel_export(
|
|
226
|
+
v_exists,
|
|
227
|
+
v_own,
|
|
228
|
+
p_service_ids,
|
|
229
|
+
p_sub_service_ids,
|
|
230
|
+
p_request_statuses,
|
|
231
|
+
p_approval_statuses,
|
|
232
|
+
p_from_date,
|
|
233
|
+
p_to_date,
|
|
234
|
+
p_search_text,
|
|
235
|
+
p_sort_by,
|
|
236
|
+
p_sort_order
|
|
237
|
+
);
|
|
238
|
+
END;
|
|
239
|
+
$$;
|
|
240
|
+
|
|
241
|
+
-- ---------------------------------------------------------------------------
|
|
242
|
+
-- ADMIN — approvals Excel
|
|
243
|
+
-- Per sub-service Requests + Approvals; optional approver_user_id (NULL = all queues)
|
|
244
|
+
-- Does not exclude own requests (unlike user approvals download)
|
|
245
|
+
-- ---------------------------------------------------------------------------
|
|
246
|
+
CREATE OR REPLACE FUNCTION sp_sla_admin_approvals_excel_export(
|
|
247
|
+
p_target_approver_user_id INT DEFAULT NULL,
|
|
248
|
+
p_service_ids INT[] DEFAULT NULL,
|
|
249
|
+
p_sub_service_ids INT[] DEFAULT NULL,
|
|
250
|
+
p_request_statuses TEXT[] DEFAULT ARRAY['Pending','In Progress','Approved','Rejected'],
|
|
251
|
+
p_approval_statuses TEXT[] DEFAULT ARRAY['In Progress','Approved','Rejected'],
|
|
252
|
+
p_from_date DATE DEFAULT NULL,
|
|
253
|
+
p_to_date DATE DEFAULT NULL,
|
|
254
|
+
p_search_text TEXT DEFAULT NULL,
|
|
255
|
+
p_sort_by TEXT DEFAULT 'created_at',
|
|
256
|
+
p_sort_order TEXT DEFAULT 'DESC'
|
|
257
|
+
)
|
|
258
|
+
RETURNS TABLE (
|
|
259
|
+
sheet_order INT, sub_service_id INT, sub_service_name TEXT, sheet_name TEXT, headers JSONB, rows JSONB
|
|
260
|
+
)
|
|
261
|
+
LANGUAGE plpgsql
|
|
262
|
+
STABLE
|
|
263
|
+
AS $$
|
|
264
|
+
DECLARE
|
|
265
|
+
v_exists TEXT := sla_approval_queue_exists_sql_optional(p_target_approver_user_id);
|
|
266
|
+
v_own TEXT := 'TRUE';
|
|
267
|
+
BEGIN
|
|
268
|
+
RETURN QUERY
|
|
269
|
+
SELECT * FROM sp_sla_approvals_workbook_excel_export(
|
|
270
|
+
v_exists,
|
|
271
|
+
v_own,
|
|
272
|
+
p_service_ids,
|
|
273
|
+
p_sub_service_ids,
|
|
274
|
+
p_request_statuses,
|
|
275
|
+
p_approval_statuses,
|
|
276
|
+
p_from_date,
|
|
277
|
+
p_to_date,
|
|
278
|
+
p_search_text,
|
|
279
|
+
p_sort_by,
|
|
280
|
+
p_sort_order
|
|
281
|
+
);
|
|
282
|
+
END;
|
|
283
|
+
$$;
|