|
| 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