Skip to content

Commit 8e13fc6

Browse files
authored
MMI-244 Updated cbra functions (bcgov#2378)
- updated the cbra functions to convert input dates to utc date time
1 parent d58261f commit 8e13fc6

File tree

4 files changed

+8211
-0
lines changed

4 files changed

+8211
-0
lines changed
Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
1+
DO $$
2+
BEGIN
3+
4+
-- CBRA report view --
5+
CREATE OR REPLACE VIEW public.vw_cbra_published_contents AS
6+
SELECT DISTINCT
7+
c.id
8+
, c.source
9+
, c.source_id
10+
, c.series_id
11+
, c.media_type_id
12+
, timezone('utc'::text, timezone('America/Vancouver'::text, c.published_on)) AS published_on
13+
, COALESCE(ss.name, '') AS series_name
14+
FROM content c
15+
LEFT JOIN source s ON c.source_id = s.id
16+
LEFT JOIN series ss ON c.series_id = ss.id
17+
JOIN (
18+
SELECT unnest(string_to_array(setting.value::TEXT, ','::TEXT)::INTEGER[]) AS media_type_id
19+
FROM setting
20+
WHERE setting.name::text = 'CBRAReportMediaTypeIds'::TEXT
21+
) m ON c.media_type_id = m.media_type_id
22+
WHERE ((ss.id IS NOT NULL AND ss.is_cbra_source = true)
23+
OR (ss.id IS NULL AND s.is_cbra_source = true))
24+
AND c.status = 2;
25+
26+
DROP FUNCTION IF EXISTS public.fn_cbra_report_total_entries(date, date);
27+
DROP FUNCTION IF EXISTS public.fn_cbra_report_totals_by_broadcaster(date, date);
28+
DROP FUNCTION IF EXISTS public.fn_cbra_report_totals_by_program(date, date);
29+
DROP FUNCTION IF EXISTS public.fn_cbra_report_staff_summary(date, date);
30+
DROP FUNCTION IF EXISTS public.fn_cbra_report_total_excerpts(date, date);
31+
32+
-- Function: fn_cbra_report_total_excerpts
33+
CREATE OR REPLACE FUNCTION public.fn_cbra_report_total_excerpts (
34+
f_from_date DATE
35+
, f_to_date DATE
36+
)
37+
RETURNS TABLE(category CHARACTER varying, totals numeric)
38+
LANGUAGE 'plpgsql'
39+
AS $BODY$
40+
DECLARE cbra_unqualified integer;
41+
DECLARE cbra_totals integer;
42+
DECLARE cbra_action_id integer;
43+
BEGIN
44+
45+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_content_total_excerpts (
46+
content_id NUMERIC
47+
);
48+
INSERT INTO temp_table_content_total_excerpts
49+
SELECT DISTINCT c.id
50+
FROM public.vw_cbra_published_contents c
51+
WHERE c.published_on >= f_from_date
52+
AND c.published_on < f_to_date + '1 day'::interval;
53+
54+
SELECT
55+
CAST("value" AS INTEGER) INTO cbra_action_id
56+
FROM setting
57+
WHERE "name" = 'CBRAUnqualifiedActionId'
58+
LIMIT 1;
59+
60+
SELECT COUNT(*) INTO cbra_unqualified
61+
FROM content_action ca
62+
JOIN temp_table_content_total_excerpts c ON ca.content_id = c.content_id
63+
WHERE ca.action_id = cbra_action_id
64+
AND CASE WHEN ca.value = ''
65+
THEN false
66+
ELSE CAST(ca.value AS BOOLEAN)
67+
END = true;
68+
69+
SELECT COUNT(*) INTO cbra_totals
70+
FROM temp_table_content_total_excerpts;
71+
72+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_total_excerpts (
73+
category VARCHAR(255)
74+
, totals NUMERIC
75+
);
76+
INSERT INTO temp_table_total_excerpts
77+
SELECT
78+
'Total Number of Excerpts'
79+
, (cbra_totals - cbra_unqualified);
80+
81+
INSERT INTO temp_table_total_excerpts
82+
SELECT
83+
'Total Number of Excerpts which do not meet the definition of Qualified Subject Matter'
84+
, cbra_unqualified;
85+
86+
INSERT iNto temp_table_total_excerpts
87+
SELECT
88+
'Total Number of Excerpts over 10 min.'
89+
, (
90+
SELECT COUNT(*)
91+
FROM temp_table_content_total_excerpts c
92+
LEFT JOIN file_reference f ON f.content_id = c.content_id
93+
WHERE COALESCE(f.running_time,0)/60000 >= 10
94+
);
95+
96+
INSERT INTO temp_table_total_excerpts
97+
SELECT
98+
'Total'
99+
, cbra_totals;
100+
101+
RETURN query
102+
SELECT
103+
tt.category
104+
, CAST(tt.totals AS DECIMAL) AS totals
105+
FROM temp_table_total_excerpts tt;
106+
107+
DROP TABLE IF EXISTS temp_table_content_total_excerpts;
108+
DROP TABLE IF EXISTS temp_table_total_excerpts;
109+
110+
END;
111+
$BODY$;
112+
113+
-- Function: fn_cbra_report_staff_summary
114+
CREATE OR REPLACE FUNCTION public.fn_cbra_report_staff_summary (
115+
f_from_date DATE
116+
, f_to_date DATE
117+
)
118+
RETURNS TABLE(staff TEXT, cbra_hours TEXT)
119+
LANGUAGE 'plpgsql'
120+
AS $BODY$
121+
BEGIN
122+
123+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_staff_summary AS
124+
SELECT
125+
tt.user_id
126+
, TO_CHAR((CAST(SUM(COALESCE(tt.Effort,0))*60 AS DECIMAL))*'1 SECOND'::INTERVAL, 'HH24:MI:SS') AS cbra_hours
127+
FROM time_tracking tt
128+
JOIN public.vw_cbra_published_contents c ON tt.content_id = c.id
129+
WHERE c.published_on >= f_from_date
130+
AND c.published_on < f_to_date + '1 day'::interval
131+
GROUP BY tt.user_id;
132+
133+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_user_table_staff_summary AS
134+
SELECT DISTINCT
135+
id
136+
, first_name
137+
, last_name
138+
FROM public.user;
139+
140+
RETURN query
141+
142+
SELECT
143+
u.first_name || ' ' || u.last_name
144+
, tt.cbra_hours
145+
FROM temp_table_staff_summary tt
146+
JOIN temp_user_table_staff_summary u ON tt.user_id = u.id;
147+
148+
DROP TABLE temp_table_staff_summary;
149+
DROP TABLE temp_user_table_staff_summary;
150+
END;
151+
$BODY$;
152+
153+
-- Function: fn_cbra_report_total_entries
154+
CREATE OR REPLACE FUNCTION public.fn_cbra_report_total_entries (
155+
f_from_date DATE
156+
, f_to_date DATE
157+
)
158+
RETURNS TABLE (
159+
day_of_week TEXT
160+
, total_count NUMERIC
161+
, total_cbra NUMERIC
162+
)
163+
LANGUAGE 'plpgsql'
164+
AS $BODY$
165+
BEGIN
166+
167+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_total_table_total_entries AS
168+
SELECT
169+
DATE_PART('dow', published_on) AS day_of_week
170+
, COUNT(*) AS total_count
171+
FROM content
172+
WHERE timezone('utc'::text, timezone('America/Vancouver'::text, published_on)) >= f_from_date
173+
AND timezone('utc'::text, timezone('America/Vancouver'::text, published_on)) < f_to_date + '1 day'::interval
174+
GROUP BY DATE_PART('dow', published_on);
175+
176+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_cbra_total_table_total_entries AS
177+
SELECT
178+
DATE_PART('dow', c.published_on) AS day_of_week
179+
, COUNT(c.*) AS total_count
180+
FROM public.vw_cbra_published_contents c
181+
WHERE c.published_on >= f_from_date
182+
AND c.published_on < f_to_date + '1 day'::interval
183+
GROUP BY DATE_PART('dow', c.published_on);
184+
185+
RETURN query
186+
SELECT
187+
CASE
188+
WHEN tt.day_of_week=0 THEN 'Sunday'
189+
WHEN tt.day_of_week=1 THEN 'Monday'
190+
WHEN tt.day_of_week=2 THEN 'Tuesday'
191+
WHEN tt.day_of_week=3 THEN 'Wednesday'
192+
WHEN tt.day_of_week=4 THEN 'Thursday'
193+
WHEN tt.day_of_week=5 THEN 'Friday'
194+
WHEN tt.day_of_week=6 THEN 'Saturday'
195+
ELSE 'other'
196+
END AS day_of_week
197+
, CAST(COALESCE(tt.total_count,0) AS DECIMAL) AS total_count
198+
, CAST(COALESCE(c.total_count, 0) AS DECIMAL) AS total_cbra
199+
FROM temp_total_table_total_entries tt
200+
LEFT JOIN temp_cbra_total_table_total_entries c ON tt.day_of_week = c.day_of_week;
201+
202+
DROP TABLE IF EXISTS temp_total_table_total_entries;
203+
DROP TABLE IF EXISTS temp_cbra_total_table_total_entries;
204+
END;
205+
$BODY$;
206+
207+
-- Function: fn_cbra_report_totals_by_broadcaster
208+
CREATE OR REPLACE FUNCTION public.fn_cbra_report_totals_by_broadcaster (
209+
f_from_date DATE,
210+
f_to_date DATE
211+
)
212+
RETURNS TABLE (
213+
source_type CHARACTER varying
214+
, total_running_time TEXT
215+
, percentage_of_total_running_time NUMERIC
216+
)
217+
LANGUAGE 'plpgsql'
218+
AS $BODY$
219+
DECLARE sum_total_running_time NUMERIC;
220+
begin
221+
222+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_content_by_broadcaster (
223+
content_id NUMERIC,
224+
source CHARACTER varying(100)
225+
);
226+
INSERT INTO temp_table_content_by_broadcaster
227+
SELECT DISTINCT c.id, c.source
228+
FROM public.vw_cbra_published_contents c
229+
WHERE c.published_on >= f_from_date
230+
AND c.published_on < f_to_date + '1 day'::interval;
231+
232+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_by_broadcaster AS
233+
SELECT
234+
c.source,
235+
SUM(COALESCE(f.running_time,0)) AS total_running_time
236+
FROM temp_table_content_by_broadcaster c
237+
LEFT JOIN file_reference f ON f.content_id = c.content_id
238+
GROUP BY c.source;
239+
240+
select sum(COALESCE(tt.total_running_time,0)) INTO sum_total_running_time
241+
from temp_table_by_broadcaster tt;
242+
243+
RETURN query
244+
SELECT
245+
tt.source
246+
, TO_CHAR((CAST(COALESCE(tt.total_running_time,0) AS DECIMAL)/1000)*'1 SECOND'::INTERVAL, 'HH24:MI:SS') AS total_running_time
247+
, COALESCE(tt.total_running_time,0) / CASE COALESCE(sum_total_running_time,0)
248+
WHEN 0 THEN 1
249+
ELSE COALESCE(sum_total_running_time,0)
250+
END AS percentage_of_total_running_time
251+
FROM temp_table_by_broadcaster tt;
252+
253+
DROP TABLE IF EXISTS temp_table_content_by_broadcaster;
254+
DROP TABLE IF EXISTS temp_table_by_broadcaster;
255+
256+
END;
257+
$BODY$;
258+
259+
-- Function: fn_cbra_report_totals_by_program
260+
CREATE OR REPLACE FUNCTION public.fn_cbra_report_totals_by_program(
261+
f_from_date DATE,
262+
f_to_date DATE)
263+
RETURNS TABLE(
264+
media_type CHARACTER varying
265+
, source_type CHARACTER varying
266+
, series CHARACTER varying
267+
, total_count BIGINT
268+
, total_running_time TEXT
269+
, percentage_of_total_running_time NUMERIC
270+
)
271+
LANGUAGE 'plpgsql'
272+
AS $BODY$
273+
DECLARE sum_total_running_time NUMERIC;
274+
BEGIN
275+
276+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_content_by_program (
277+
content_id NUMERIC,
278+
source CHARACTER VARYING(100),
279+
source_id NUMERIC,
280+
series_id NUMERIC,
281+
series_name CHARACTER VARYING(100),
282+
media_type_id INTEGER,
283+
media_type_name CHARACTER VARYING(100));
284+
INSERT INTO temp_table_content_by_program
285+
SELECT DISTINCT
286+
c.id
287+
, c.source
288+
, c.source_id
289+
, c.series_id
290+
, c.series_name
291+
, c.media_type_id
292+
, COALESCE(mm.name, '')
293+
FROM public.vw_cbra_published_contents c
294+
JOIN media_type mm ON mm.id = c.media_type_id
295+
WHERE c.published_on >= f_from_date
296+
AND c.published_on < f_to_date + '1 day'::interval;
297+
298+
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_by_program AS
299+
SELECT
300+
c.media_type_id,
301+
c.source,
302+
c.source_id,
303+
c.series_id,
304+
c.series_name,
305+
c.media_type_name,
306+
COUNT(*) AS total_count,
307+
SUM(COALESCE(f.running_time,0)) AS total_running_time
308+
FROM temp_table_content_by_program c
309+
LEFT JOIN file_reference f ON f.content_id = c.content_id
310+
GROUP BY c.media_type_id, c.source, c.source_id, c.series_id, c.series_name, c.media_type_name;
311+
312+
SELECT SUM(COALESCE(tt.total_running_time,0)) INTO sum_total_running_time
313+
FROM temp_table_by_program tt;
314+
315+
RETURN query
316+
SELECT
317+
tt.media_type_name AS media_type,
318+
tt.source,
319+
tt.series_name,
320+
tt.total_count,
321+
TO_CHAR((cast(COALESCE(tt.total_running_time,0) AS DECIMAL)/1000)*'1 SECOND'::INTERVAL, 'HH24:MI:SS') AS total_running_time,
322+
COALESCE(tt.total_running_time,0) / CASE COALESCE(sum_total_running_time,0)
323+
WHEN 0 THEN 1
324+
ELSE COALESCE(sum_total_running_time,0)
325+
END AS percentage_of_total_running_time
326+
FROM temp_table_by_program tt;
327+
328+
DROP TABLE IF EXISTS temp_table_content_by_program;
329+
DROP TABLE IF EXISTS temp_table_by_program;
330+
331+
END;
332+
$BODY$;
333+
334+
END $$;

0 commit comments

Comments
 (0)