diff --git a/src/database/migrations/20251225065401-update-reports-queries-with-tenant-code.js b/src/database/migrations/20251225065401-update-reports-queries-with-tenant-code.js index 1a08b3320..211678ecd 100644 --- a/src/database/migrations/20251225065401-update-reports-queries-with-tenant-code.js +++ b/src/database/migrations/20251225065401-update-reports-queries-with-tenant-code.js @@ -8,7 +8,7 @@ module.exports = { 'report_queries', { query: `SELECT - COUNT(*) AS total_count, + COUNT(*) AS total_count, CASE WHEN 'All' = 'All' THEN COUNT(*) FILTER (WHERE Session.type = 'PUBLIC') -- Count for Public sessions @@ -26,7 +26,7 @@ module.exports = { ON sa.session_id = Session.id AND Session.tenant_code = sa.tenant_code WHERE - Session.tenant_code = :tenantCode + Session.tenant_code = :tenantCode AND (CASE WHEN :userId IS NOT NULL THEN sa.mentee_id = :userId ELSE TRUE END) AND sa.joined_at IS NOT NULL AND (CASE WHEN :start_date IS NOT NULL THEN Session.start_date > :start_date ELSE TRUE END) @@ -52,27 +52,27 @@ module.exports = { 'report_queries', { query: `SELECT - TO_CHAR( - INTERVAL '1 hour' * FLOOR(SUM(duration) / 3600) + - INTERVAL '1 minute' * FLOOR((SUM(duration) / 60)::BIGINT % 60) + - INTERVAL '1 second' * FLOOR(SUM(duration)::BIGINT % 60), - 'HH24:MI:SS' - ) AS total_hours, -- Total duration of all sessions - - TO_CHAR( - INTERVAL '1 hour' * FLOOR(SUM(CASE WHEN type = 'PUBLIC' THEN duration ELSE 0 END) / 3600) + - INTERVAL '1 minute' * FLOOR((SUM(CASE WHEN type = 'PUBLIC' THEN duration ELSE 0 END) / 60)::BIGINT % 60) + - INTERVAL '1 second' * FLOOR(SUM(CASE WHEN type = 'PUBLIC' THEN duration ELSE 0 END)::BIGINT % 60), - 'HH24:MI:SS' - ) AS public_hours, -- Total duration of public sessions - - TO_CHAR( - INTERVAL '1 hour' * FLOOR(SUM(CASE WHEN type = 'PRIVATE' THEN duration ELSE 0 END) / 3600) + - INTERVAL '1 minute' * FLOOR((SUM(CASE WHEN type = 'PRIVATE' THEN duration ELSE 0 END) / 60)::BIGINT % 60) + - INTERVAL '1 second' * FLOOR(SUM(CASE WHEN type = 'PRIVATE' THEN duration ELSE 0 END)::BIGINT % 60), - 'HH24:MI:SS' - ) AS private_hours -- Total duration of private sessions - + COALESCE(TO_CHAR( + INTERVAL '1 hour' * FLOOR(SUM(duration) / 3600) + + INTERVAL '1 minute' * FLOOR((SUM(duration) / 60)::BIGINT % 60) + + INTERVAL '1 second' * FLOOR(SUM(duration)::BIGINT % 60), + 'HH24:MI:SS' + ), '00:00:00') AS total_hours, + + COALESCE(TO_CHAR( + INTERVAL '1 hour' * FLOOR(SUM(CASE WHEN type = 'PUBLIC' THEN duration ELSE 0 END) / 3600) + + INTERVAL '1 minute' * FLOOR((SUM(CASE WHEN type = 'PUBLIC' THEN duration ELSE 0 END) / 60)::BIGINT % 60) + + INTERVAL '1 second' * FLOOR(SUM(CASE WHEN type = 'PUBLIC' THEN duration ELSE 0 END)::BIGINT % 60), + 'HH24:MI:SS' + ), '00:00:00') AS public_hours, + + COALESCE(TO_CHAR( + INTERVAL '1 hour' * FLOOR(SUM(CASE WHEN type = 'PRIVATE' THEN duration ELSE 0 END) / 3600) + + INTERVAL '1 minute' * FLOOR((SUM(CASE WHEN type = 'PRIVATE' THEN duration ELSE 0 END) / 60)::BIGINT % 60) + + INTERVAL '1 second' * FLOOR(SUM(CASE WHEN type = 'PRIVATE' THEN duration ELSE 0 END)::BIGINT % 60), + 'HH24:MI:SS' + ), '00:00:00') AS private_hours + FROM ( SELECT sa.session_id, @@ -85,23 +85,22 @@ module.exports = { ON sa.session_id = Session.id AND Session.tenant_code = sa.tenant_code WHERE - Session.tenant_code = :tenantCode + Session.tenant_code = :tenantCode AND (CASE WHEN :userId IS NOT NULL THEN sa.mentee_id = :userId ELSE TRUE END) - AND sa.joined_at IS NOT NULL - AND (CASE WHEN :start_date IS NOT NULL THEN Session.start_date > :start_date ELSE TRUE END) - AND (CASE WHEN :end_date IS NOT NULL THEN Session.end_date < :end_date ELSE TRUE END) - AND ( - CASE - WHEN :session_type = 'All' THEN Session.type IN ('PUBLIC', 'PRIVATE') - WHEN :session_type = 'Public' THEN Session.type = 'PUBLIC' - WHEN :session_type = 'Private' THEN Session.type = 'PRIVATE' - ELSE TRUE - END - ) - AND Session.deleted_at IS NULL - DYNAMIC_AND_CLAUSE - ) AS session_durations - `, + AND sa.joined_at IS NOT NULL + AND (CASE WHEN :start_date IS NOT NULL THEN Session.start_date > :start_date ELSE TRUE END) + AND (CASE WHEN :end_date IS NOT NULL THEN Session.end_date < :end_date ELSE TRUE END) + AND ( + CASE + WHEN :session_type = 'All' THEN Session.type IN ('PUBLIC', 'PRIVATE') + WHEN :session_type = 'Public' THEN Session.type = 'PUBLIC' + WHEN :session_type = 'Private' THEN Session.type = 'PRIVATE' + ELSE TRUE + END + ) + AND Session.deleted_at IS NULL + DYNAMIC_AND_CLAUSE + ) AS session_durations`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), }, { report_code: 'total_hours_of_learning' }, @@ -112,57 +111,57 @@ module.exports = { 'report_queries', { query: `SELECT - :start_date AS startDate, - :end_date AS endDate, - -- Enrolled session counts + :start_date AS startDate, + :end_date AS endDate, + -- Enrolled session counts COUNT( - CASE - WHEN (sa.type = 'ENROLLED' OR sa.type = 'INVITED') - AND Session.type = 'PUBLIC' - AND (:session_type = 'All' OR :session_type = 'Public') - THEN 1 - END - ) AS public_session_enrolled, + CASE + WHEN (sa.type = 'ENROLLED' OR sa.type = 'INVITED') + AND Session.type = 'PUBLIC' + AND (:session_type = 'All' OR :session_type = 'Public') + THEN 1 + END + ) AS public_session_enrolled, - -- Private session enrolled count - COUNT( - CASE - WHEN (sa.type = 'ENROLLED' OR sa.type = 'INVITED') - AND Session.type = 'PRIVATE' - AND (:session_type = 'All' OR :session_type = 'Private') - THEN 1 - END - ) AS private_session_enrolled, + -- Private session enrolled count + COUNT( + CASE + WHEN (sa.type = 'ENROLLED' OR sa.type = 'INVITED') + AND Session.type = 'PRIVATE' + AND (:session_type = 'All' OR :session_type = 'Private') + THEN 1 + END + ) AS private_session_enrolled, - -- Public session attended count - COUNT( - CASE - WHEN sa.joined_at IS NOT NULL - AND Session.type = 'PUBLIC' - AND (:session_type = 'All' OR :session_type = 'Public') - THEN 1 - END - ) AS public_session_attended, + -- Public session attended count + COUNT( + CASE + WHEN sa.joined_at IS NOT NULL + AND Session.type = 'PUBLIC' + AND (:session_type = 'All' OR :session_type = 'Public') + THEN 1 + END + ) AS public_session_attended, - -- Private session attended count - COUNT( - CASE - WHEN sa.joined_at IS NOT NULL - AND Session.type = 'PRIVATE' - AND (:session_type = 'All' OR :session_type = 'Private') - THEN 1 - END - ) AS private_session_attended + -- Private session attended count + COUNT( + CASE + WHEN sa.joined_at IS NOT NULL + AND Session.type = 'PRIVATE' + AND (:session_type = 'All' OR :session_type = 'Private') + THEN 1 + END + ) AS private_session_attended FROM public.session_attendees AS sa JOIN public.sessions AS Session ON sa.session_id = Session.id AND Session.tenant_code = sa.tenant_code WHERE - Session.tenant_code = :tenantCode - AND (CASE WHEN :userId IS NOT NULL THEN sa.mentee_id = :userId ELSE TRUE END) - AND (CASE WHEN :start_date IS NOT NULL THEN Session.start_date > :start_date ELSE TRUE END) - AND (CASE WHEN :end_date IS NOT NULL THEN Session.end_date < :end_date ELSE TRUE END) - AND Session.deleted_at IS NULL - DYNAMIC_AND_CLAUSE;`, + Session.tenant_code = :tenantCode + AND (CASE WHEN :userId IS NOT NULL THEN sa.mentee_id = :userId ELSE TRUE END) + AND (CASE WHEN :start_date IS NOT NULL THEN Session.start_date > :start_date ELSE TRUE END) + AND (CASE WHEN :end_date IS NOT NULL THEN Session.end_date < :end_date ELSE TRUE END) + AND Session.deleted_at IS NULL + DYNAMIC_AND_CLAUSE;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), }, @@ -175,70 +174,36 @@ module.exports = { await queryInterface.bulkUpdate( 'report_queries', { - query: `WITH Session AS ( - SELECT - id, - title, - created_by, - mentor_name, - start_date, - end_date, - type, - categories, - recommended_for, - deleted_at, - tenant_code - FROM - public.sessions - ), - UserExtensions AS ( - SELECT - user_id, - name, - tenant_code - FROM - public.user_extensions - ), - SessionAttendees AS ( - SELECT - session_id, - mentee_id, - joined_at, - created_at, - tenant_code - FROM - public.session_attendees + query: `SELECT + s.title AS "sessions_title", + ue.name AS "sessions_created_by", + s.mentor_name AS "mentor_name", + TO_TIMESTAMP(s.start_date)::DATE AS "date_of_session", + s.type AS "session_type", + s.categories AS "categories", + s.recommended_for AS "recommended_for", + s.deleted_at, + CASE WHEN sa.joined_at IS NOT NULL THEN 'Yes' ELSE 'No' END AS "session_attended", + ROUND(EXTRACT(EPOCH FROM (TO_TIMESTAMP(s.end_date) - TO_TIMESTAMP(s.start_date))) / 60) AS "duration_of_sessions_attended_in_minutes", + s.tenant_code + FROM + public.sessions s + LEFT JOIN + public.user_extensions ue ON s.created_by = ue.user_id AND s.tenant_code = ue.tenant_code + JOIN + public.session_attendees sa ON sa.session_id = s.id AND sa.tenant_code = s.tenant_code + WHERE + s.tenant_code = :tenantCode + AND (:userId IS NULL OR sa.mentee_id = :userId) + AND (:start_date IS NULL OR s.start_date > :start_date) + AND (:end_date IS NULL OR s.end_date < :end_date) + AND ( + (:session_type = 'All' AND s.type IN ('PUBLIC', 'PRIVATE')) + OR (:session_type = 'Public' AND s.type = 'PUBLIC') + OR (:session_type = 'Private' AND s.type = 'PRIVATE') ) - SELECT - Session.title AS "sessions_title", - ue.name AS "sessions_created_by", - Session.mentor_name AS "mentor_name", - TO_TIMESTAMP(Session.start_date)::DATE AS "date_of_session", - Session.type AS "session_type", - Session.categories AS "categories", - Session.recommended_for AS "recommended_for", - CASE WHEN sa.joined_at IS NOT NULL THEN 'Yes' ELSE 'No' END AS "session_attended", - ROUND(EXTRACT(EPOCH FROM (TO_TIMESTAMP(Session.end_date)-TO_TIMESTAMP(Session.start_date)))/60) AS "duration_of_sessions_attended_in_minutes", - sa.created_at, - Session.tenant_code - FROM - Session - LEFT JOIN - UserExtensions AS ue ON Session.created_by = ue.user_id AND Session.tenant_code = ue.tenant_code - JOIN - SessionAttendees AS sa ON sa.session_id = Session.id AND sa.tenant_code = Session.tenant_code - WHERE - Session.tenant_code = :tenantCode - AND (:userId IS NULL OR sa.mentee_id = :userId) - AND (:start_date IS NULL OR Session.start_date > :start_date) - AND (:end_date IS NULL OR Session.end_date < :end_date) - AND ( - :session_type = 'All' AND Session.type IN ('PUBLIC', 'PRIVATE') - OR :session_type = 'PUBLIC' AND Session.type = 'PUBLIC' - OR :session_type = 'PRIVATE' AND Session.type = 'PRIVATE' - ) - AND Session.deleted_at IS NULL - DYNAMIC_AND_CLAUSE order by Session.start_date ASC`, + AND s.deleted_at IS NULL + DYNAMIC_AND_CLAUSE;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), }, { @@ -251,33 +216,24 @@ module.exports = { 'report_queries', { query: `SELECT - COUNT(*) AS total_count, - COUNT(CASE WHEN Session.type = 'PUBLIC' AND ('All' = 'All' OR 'All' = 'PUBLIC') THEN 1 END) AS public_count, - COUNT(CASE WHEN Session.type = 'PRIVATE' AND ('All' = 'All' OR 'All' = 'PRIVATE') THEN 1 END) AS private_count - FROM ( - SELECT - * - FROM - public.sessions AS Session - WHERE - Session.started_at IS NOT NULL - AND Session.start_date > :start_date - AND Session.end_date < :end_date - AND ( - CASE - WHEN :session_type = 'All' THEN Session.type IN ('PUBLIC', 'PRIVATE') - WHEN :session_type = 'PUBLIC' THEN Session.type = 'PUBLIC' - WHEN :session_type = 'PRIVATE' THEN Session.type = 'PRIVATE' - ELSE TRUE - END - ) - ) AS Session - JOIN - public.session_ownerships AS so ON so.session_id = Session.id + COUNT(*) AS total_count, + COUNT(CASE WHEN Session.type = 'PUBLIC' THEN 1 END) AS public_count, + COUNT(CASE WHEN Session.type = 'PRIVATE' THEN 1 END) AS private_count + FROM public.sessions AS Session WHERE Session.tenant_code = :tenantCode - AND so.user_id = :userId - AND ('MENTOR' IS NULL OR so.type = 'MENTOR') + AND Session.mentor_id = :userId + AND Session.status = 'COMPLETED' + AND (:start_date IS NULL OR Session.start_date > :start_date) + AND (:end_date IS NULL OR Session.end_date < :end_date) + AND ( + CASE + WHEN :session_type = 'All' THEN Session.type IN ('PUBLIC', 'PRIVATE') + WHEN :session_type = 'Public' THEN Session.type = 'PUBLIC' + WHEN :session_type = 'Private' THEN Session.type = 'PRIVATE' + ELSE TRUE + END + ) AND Session.deleted_at IS NULL DYNAMIC_AND_CLAUSE;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), @@ -291,117 +247,108 @@ module.exports = { await queryInterface.bulkUpdate( 'report_queries', { - query: `WITH filtered_ownerships AS ( - SELECT so.session_id - FROM public.session_ownerships so - WHERE - so.user_id = :userId - AND so.type = 'MENTOR' - ) - - SELECT - -- Total duration (sum of both public and private sessions) - COALESCE( - TO_CHAR( - INTERVAL '1 hour' * FLOOR(SUM( - CASE - WHEN Session.type IN ('PUBLIC', 'PRIVATE') - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - ) / 3600) + - INTERVAL '1 minute' * FLOOR((SUM( - CASE - WHEN Session.type IN ('PUBLIC', 'PRIVATE') - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - ) / 60)::BIGINT % 60) + - INTERVAL '1 second' * FLOOR(SUM( - CASE - WHEN Session.type IN ('PUBLIC', 'PRIVATE') - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - )::BIGINT % 60), - 'HH24:MI:SS' - ), - '00:00:00' - ) AS total_hours, - - -- Duration for public sessions - COALESCE( - TO_CHAR( - INTERVAL '1 hour' * FLOOR(SUM( - CASE - WHEN Session.type = 'PUBLIC' - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - ) / 3600) + - INTERVAL '1 minute' * FLOOR((SUM( - CASE - WHEN Session.type = 'PUBLIC' - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - ) / 60)::BIGINT % 60) + - INTERVAL '1 second' * FLOOR(SUM( - CASE - WHEN Session.type = 'PUBLIC' - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - )::BIGINT % 60), - 'HH24:MI:SS' - ), - '00:00:00' - ) AS public_hours, - - -- Duration for private sessions - COALESCE( - TO_CHAR( - INTERVAL '1 hour' * FLOOR(SUM( - CASE - WHEN Session.type = 'PRIVATE' - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - ) / 3600) + - INTERVAL '1 minute' * FLOOR((SUM( - CASE - WHEN Session.type = 'PRIVATE' - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - ) / 60)::BIGINT % 60) + - INTERVAL '1 second' * FLOOR(SUM( - CASE - WHEN Session.type = 'PRIVATE' - THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) - ELSE 0 - END - )::BIGINT % 60), - 'HH24:MI:SS' - ), - '00:00:00' - ) AS private_hours - - FROM filtered_ownerships fo - JOIN public.sessions Session ON Session.id = fo.session_id -- Renamed alias from session to Session - WHERE - Session.tenant_code = :tenantCode - AND Session.started_at IS NOT NULL - AND Session.start_date > :start_date -- Start date filter - AND Session.end_date < :end_date -- End date filter + query: `SELECT + -- Total duration (sum of both public and private sessions) + COALESCE( + TO_CHAR( + INTERVAL '1 hour' * FLOOR(SUM( + CASE + WHEN Session.type IN ('PUBLIC', 'PRIVATE') + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + ) / 3600) + + INTERVAL '1 minute' * FLOOR((SUM( + CASE + WHEN Session.type IN ('PUBLIC', 'PRIVATE') + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + ) / 60)::BIGINT % 60) + + INTERVAL '1 second' * FLOOR(SUM( + CASE + WHEN Session.type IN ('PUBLIC', 'PRIVATE') + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + )::BIGINT % 60), + 'HH24:MI:SS' + ), + '00:00:00' + ) AS total_hours, + + -- Duration for public sessions + COALESCE( + TO_CHAR( + INTERVAL '1 hour' * FLOOR(SUM( + CASE + WHEN Session.type = 'PUBLIC' + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + ) / 3600) + + INTERVAL '1 minute' * FLOOR((SUM( + CASE + WHEN Session.type = 'PUBLIC' + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + ) / 60)::BIGINT % 60) + + INTERVAL '1 second' * FLOOR(SUM( + CASE + WHEN Session.type = 'PUBLIC' + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + )::BIGINT % 60), + 'HH24:MI:SS' + ), + '00:00:00' + ) AS public_hours, + + -- Duration for private sessions + COALESCE( + TO_CHAR( + INTERVAL '1 hour' * FLOOR(SUM( + CASE + WHEN Session.type = 'PRIVATE' + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + ) / 3600) + + INTERVAL '1 minute' * FLOOR((SUM( + CASE + WHEN Session.type = 'PRIVATE' + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + ) / 60)::BIGINT % 60) + + INTERVAL '1 second' * FLOOR(SUM( + CASE + WHEN Session.type = 'PRIVATE' + THEN EXTRACT(EPOCH FROM (Session.completed_at - Session.started_at)) + ELSE 0 + END + )::BIGINT % 60), + 'HH24:MI:SS' + ), + '00:00:00' + ) AS private_hours + + FROM public.sessions Session + WHERE Session.tenant_code = :tenantCode + AND Session.mentor_id = :userId + AND Session.status = 'COMPLETED' + AND (:start_date IS NULL OR Session.start_date > :start_date) + AND (:end_date IS NULL OR Session.end_date < :end_date) AND ( - CASE - WHEN :session_type = 'All' THEN Session.type IN ('PUBLIC', 'PRIVATE') -- If all types, include both - WHEN :session_type = 'PUBLIC' THEN Session.type = 'PUBLIC' -- If PUBLIC, only include public - WHEN :session_type = 'PRIVATE' THEN Session.type = 'PRIVATE' -- If PRIVATE, only include private - ELSE TRUE -- Default condition - END - ) + CASE + WHEN :session_type = 'All' THEN Session.type IN ('PUBLIC', 'PRIVATE') + WHEN :session_type = 'Public' THEN Session.type = 'PUBLIC' + WHEN :session_type = 'Private' THEN Session.type = 'PRIVATE' + ELSE TRUE + END + ) AND Session.deleted_at IS NULL DYNAMIC_AND_CLAUSE;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), @@ -416,104 +363,83 @@ module.exports = { 'report_queries', { query: `SELECT - :start_date AS startDate, - :end_date AS endDate, - - -- Total sessions created - COUNT(DISTINCT CASE - WHEN ( - (so.type = 'CREATOR' OR so.type = 'MENTOR') - AND ( - :session_type = 'All' - OR (:session_type = 'Public' AND session.type = 'PUBLIC') - OR (:session_type = 'Private' AND session.type = 'PRIVATE') - ) - AND ( - (session.created_by!= :userId AND session.mentor_id = :userId) - OR (session.created_by = :userId AND session.mentor_id = :userId) - ) - ) - THEN session.id - END) AS total_sessions_created, - - -- PUBLIC sessions created - COUNT(DISTINCT CASE - WHEN ( - (so.type = 'CREATOR' OR so.type = 'MENTOR') - AND session.type = 'PUBLIC' - AND (:session_type = 'All' OR :session_type = 'Public') - AND ( - (session.created_by!= :userId AND session.mentor_id = :userId) - OR (session.created_by = :userId AND session.mentor_id = :userId) - ) - ) - THEN session.id - END) AS public_sessions_created, - - -- PRIVATE sessions created - COUNT(DISTINCT CASE - WHEN ( - (so.type = 'CREATOR' OR so.type = 'MENTOR') - AND session.type = 'PRIVATE' - AND (:session_type = 'All' OR :session_type = 'Private') - AND ( - (session.created_by!= :userId AND session.mentor_id = :userId) - OR (session.created_by = :userId AND session.mentor_id = :userId) - ) - ) - THEN session.id - END) AS private_sessions_created, - - -- Total sessions conducted - COUNT(DISTINCT CASE - WHEN ( - so.type = 'MENTOR' - AND session.started_at IS NOT NULL - AND ( - :session_type = 'All' - OR (:session_type = 'Public' AND session.type = 'PUBLIC') - OR (:session_type = 'Private' AND session.type = 'PRIVATE') - ) - ) - THEN session.id - END) AS total_sessions_conducted, - - -- PUBLIC sessions conducted - COUNT(DISTINCT CASE - WHEN ( - so.type = 'MENTOR' - AND session.started_at IS NOT NULL - AND session.type = 'PUBLIC' - AND (:session_type = 'All' OR :session_type = 'Public') + :start_date AS startDate, + :end_date AS endDate, + + -- Total sessions created + COUNT(DISTINCT CASE + WHEN ( + (session.created_by = :userId OR session.mentor_id = :userId) + AND ( + :session_type = 'All' + OR (:session_type = 'Public' AND session.type = 'PUBLIC') + OR (:session_type = 'Private' AND session.type = 'PRIVATE') ) - THEN session.id - END) AS public_sessions_conducted, - - -- PRIVATE sessions conducted - COUNT(DISTINCT CASE - WHEN ( - so.type = 'MENTOR' - AND session.started_at IS NOT NULL - AND session.type = 'PRIVATE' - AND (:session_type = 'All' OR :session_type = 'Private') + ) + THEN session.id + END) AS total_sessions_created, + + -- PUBLIC sessions created + COUNT(DISTINCT CASE + WHEN ( + (session.created_by = :userId OR session.mentor_id = :userId) + AND session.type = 'PUBLIC' + AND (:session_type = 'All' OR :session_type = 'Public') + ) + THEN session.id + END) AS public_sessions_created, + + -- PRIVATE sessions created + COUNT(DISTINCT CASE + WHEN ( + (session.created_by = :userId OR session.mentor_id = :userId) + AND session.type = 'PRIVATE' + AND (:session_type = 'All' OR :session_type = 'Private') + ) + THEN session.id + END) AS private_sessions_created, + + -- Total sessions conducted + COUNT(DISTINCT CASE + WHEN ( + session.mentor_id = :userId + AND session.status = 'COMPLETED' + AND ( + :session_type = 'All' + OR (:session_type = 'Public' AND session.type = 'PUBLIC') + OR (:session_type = 'Private' AND session.type = 'PRIVATE') ) - THEN session.id - END) AS private_sessions_conducted - - FROM ( - SELECT - * - FROM - public.sessions - WHERE - (public.sessions.start_date > :start_date OR :start_date IS NULL) - AND (public.sessions.end_date < :end_date OR :end_date IS NULL) - ) AS session - JOIN - public.session_ownerships AS so ON so.session_id = session.id + ) + THEN session.id + END) AS total_sessions_conducted, + + -- PUBLIC sessions conducted + COUNT(DISTINCT CASE + WHEN ( + session.mentor_id = :userId + AND session.status = 'COMPLETED' + AND session.type = 'PUBLIC' + AND (:session_type = 'All' OR :session_type = 'Public') + ) + THEN session.id + END) AS public_sessions_conducted, + + -- PRIVATE sessions conducted + COUNT(DISTINCT CASE + WHEN ( + session.mentor_id = :userId + AND session.status = 'COMPLETED' + AND session.type = 'PRIVATE' + AND (:session_type = 'All' OR :session_type = 'Private') + ) + THEN session.id + END) AS private_sessions_conducted + + FROM public.sessions AS session WHERE session.tenant_code = :tenantCode - AND (:userId IS NOT NULL AND so.user_id = :userId OR :userId IS NULL) + AND (session.start_date > :start_date OR :start_date IS NULL) + AND (session.end_date < :end_date OR :end_date IS NULL) AND session.deleted_at IS NULL DYNAMIC_AND_CLAUSE;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), @@ -528,30 +454,31 @@ module.exports = { 'report_queries', { query: `SELECT - session.title AS "sessions_title", - ue.name AS "sessions_created_by", - session.seats_limit-session.seats_remaining AS "number_of_mentees", - TO_TIMESTAMP(session.start_date)::DATE AS "date_of_session", - session.type AS "session_type", - CASE WHEN session.started_at IS NOT NULL THEN 'Yes' ELSE 'No' END AS "session_conducted", - ROUND(EXTRACT(EPOCH FROM(TO_TIMESTAMP(session.end_date)-TO_TIMESTAMP(session.start_date)))/60) AS "duration_of_sessions_attended_in_minutes" - FROM (SELECT * FROM public.sessions WHERE start_date > :start_date AND end_date < :end_date) AS session - JOIN - (SELECT * FROM public.session_ownerships WHERE user_id = :userId AND type = 'MENTOR') AS so ON session.id = so.session_id + session.title AS "sessions_title", + ue.name AS "sessions_created_by", + session.seats_limit-session.seats_remaining AS "number_of_mentees", + TO_TIMESTAMP(session.start_date)::DATE AS "date_of_session", + session.type AS "session_type", + CASE WHEN session.started_at IS NOT NULL THEN 'Yes' ELSE 'No' END AS "session_conducted", + ROUND(EXTRACT(EPOCH FROM(TO_TIMESTAMP(session.end_date)-TO_TIMESTAMP(session.start_date)))/60) AS "duration_of_sessions_attended_in_minutes" + FROM public.sessions AS session LEFT JOIN public.user_extensions AS ue ON session.created_by = ue.user_id AND session.tenant_code = ue.tenant_code WHERE session.tenant_code = :tenantCode + AND session.mentor_id = :userId + AND (:start_date IS NULL OR session.start_date > :start_date) + AND (:end_date IS NULL OR session.end_date < :end_date) AND ( CASE WHEN :session_type = 'All' THEN session.type IN ('PUBLIC', 'PRIVATE') - WHEN :session_type = 'PUBLIC' THEN session.type = 'PUBLIC' - WHEN :session_type = 'PRIVATE' THEN session.type = 'PRIVATE' + WHEN :session_type = 'Public' THEN session.type = 'PUBLIC' + WHEN :session_type = 'Private' THEN session.type = 'PRIVATE' ELSE TRUE END ) AND session.deleted_at IS NULL - DYNAMIC_AND_CLAUSE`, + DYNAMIC_AND_CLAUSE;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), }, { @@ -564,40 +491,33 @@ module.exports = { 'report_queries', { query: `SELECT - TO_CHAR( - INTERVAL '1 second' * FLOOR(SUM(EXTRACT(EPOCH FROM (completed_at - started_at)))), - 'HH24:MI:SS' - ) AS total_hours, - - TO_CHAR( - INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PUBLIC' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), - 'HH24:MI:SS' - ) AS total_public_hours, - - TO_CHAR( - INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PRIVATE' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), - 'HH24:MI:SS' - ) AS total_private_hours - - FROM - (SELECT * FROM public.sessions - WHERE - public.sessions.start_date > :start_date - AND public.sessions.end_date < :end_date) AS Session - JOIN - (SELECT * - FROM public.session_ownerships - WHERE public.session_ownerships.user_id = :userId - AND public.session_ownerships.type = 'CREATOR') AS so - ON Session.id = so.session_id + COALESCE(TO_CHAR( + INTERVAL '1 second' * FLOOR(SUM(EXTRACT(EPOCH FROM (completed_at - started_at)))), + 'HH24:MI:SS' + ), '00:00:00') AS total_hours, + + COALESCE(TO_CHAR( + INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PUBLIC' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), + 'HH24:MI:SS' + ), '00:00:00') AS total_public_hours, + + COALESCE(TO_CHAR( + INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PRIVATE' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), + 'HH24:MI:SS' + ), '00:00:00') AS total_private_hours + + FROM public.sessions AS Session WHERE - -- Simplified the CASE logic for filtering session types Session.tenant_code = :tenantCode + AND Session.created_by = :userId + AND Session.status = 'COMPLETED' + AND (:start_date IS NULL OR Session.start_date > :start_date) + AND (:end_date IS NULL OR Session.end_date < :end_date) AND ( CASE WHEN :session_type = 'All' THEN TRUE - WHEN :session_type = 'PUBLIC' THEN Session.type = 'PUBLIC' - WHEN :session_type = 'PRIVATE' THEN Session.type = 'PRIVATE' + WHEN :session_type = 'Public' THEN Session.type = 'PUBLIC' + WHEN :session_type = 'Private' THEN Session.type = 'PRIVATE' ELSE TRUE END ) @@ -615,40 +535,33 @@ module.exports = { 'report_queries', { query: `SELECT - TO_CHAR( - INTERVAL '1 second' * FLOOR(SUM(EXTRACT(EPOCH FROM (completed_at - started_at)))), - 'HH24:MI:SS' - ) AS total_hours, - - TO_CHAR( - INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PUBLIC' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), - 'HH24:MI:SS' - ) AS public_hours, - - TO_CHAR( - INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PRIVATE' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), - 'HH24:MI:SS' - ) AS private_hours - - FROM - (SELECT * FROM public.sessions - WHERE public.sessions.started_at IS NOT NULL - AND public.sessions.start_date > :start_date - AND public.sessions.end_date < :end_date) AS Session - JOIN - (SELECT * - FROM public.session_ownerships - WHERE public.session_ownerships.user_id = :userId - AND public.session_ownerships.type = 'MENTOR') AS so - ON Session.id = so.session_id + COALESCE(TO_CHAR( + INTERVAL '1 second' * FLOOR(SUM(EXTRACT(EPOCH FROM (completed_at - started_at)))), + 'HH24:MI:SS' + ), '00:00:00') AS total_hours, + + COALESCE(TO_CHAR( + INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PUBLIC' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), + 'HH24:MI:SS' + ), '00:00:00') AS public_hours, + + COALESCE(TO_CHAR( + INTERVAL '1 second' * FLOOR(SUM(CASE WHEN Session.type = 'PRIVATE' THEN EXTRACT(EPOCH FROM (completed_at - started_at)) ELSE 0 END)), + 'HH24:MI:SS' + ), '00:00:00') AS private_hours + + FROM public.sessions AS Session WHERE - -- Simplified the CASE logic for filtering session types - Session.tenant_code = :tenantCode - AND( + Session.tenant_code = :tenantCode + AND Session.mentor_id = :userId + AND Session.status = 'COMPLETED' + AND (:start_date IS NULL OR Session.start_date > :start_date) + AND (:end_date IS NULL OR Session.end_date < :end_date) + AND ( CASE WHEN :session_type = 'All' THEN TRUE - WHEN :session_type = 'PUBLIC' THEN Session.type = 'PUBLIC' - WHEN :session_type = 'PRIVATE' THEN Session.type = 'PRIVATE' + WHEN :session_type = 'Public' THEN Session.type = 'PUBLIC' + WHEN :session_type = 'Private' THEN Session.type = 'PRIVATE' ELSE TRUE END ) @@ -666,78 +579,71 @@ module.exports = { 'report_queries', { query: `SELECT - :start_date AS startDate, - :end_date AS endDate, - - -- Count session_created - COUNT(*) FILTER ( - WHERE so.type = 'CREATOR' - AND ( - :session_type = 'All' - OR (:session_type = 'Public' AND session.type = 'PUBLIC') - OR (:session_type = 'Private' AND session.type = 'PRIVATE') - ) - ) AS total_session_created, - - -- Total sessions conducted (all types combined) - COUNT(*) FILTER ( - WHERE so.type = 'MENTOR' - AND session.started_at IS NOT NULL - AND ( - :session_type = 'All' - OR :session_type = 'Public' AND session.type = 'PUBLIC' - OR :session_type = 'Private' AND session.type = 'PRIVATE' - ) - ) AS total_sessions_conducted, - - -- Public sessions conducted - COUNT(*) FILTER ( - WHERE so.type = 'MENTOR' - AND session.started_at IS NOT NULL - AND :session_type IN ('All', 'Public') - AND session.type = 'PUBLIC' - ) AS public_sessions_conducted, - - -- Private sessions conducted - COUNT(*) FILTER ( - WHERE so.type = 'MENTOR' - AND session.started_at IS NOT NULL - AND :session_type IN ('All', 'Private') - AND session.type = 'PRIVATE' - ) AS private_sessions_conducted, - - -- Public sessions created - COUNT(*) FILTER ( - WHERE so.type = 'CREATOR' - AND :session_type IN ('All', 'Public') - AND session.type = 'PUBLIC' - ) AS public_sessions_created, - - -- Private sessions created - COUNT(*) FILTER ( - WHERE so.type = 'CREATOR' - AND :session_type IN ('All', 'Private') - AND session.type = 'PRIVATE' - ) AS private_sessions_created + :start_date AS startDate, + :end_date AS endDate, - FROM - (SELECT * FROM public.sessions WHERE (public.sessions.start_date > :start_date OR :start_date IS NULL) AND (public.sessions.end_date < :end_date OR :end_date IS NULL)) AS session - JOIN - (SELECT * - FROM public.session_ownerships - WHERE (:userId IS NOT NULL AND user_id = :userId OR :userId IS NULL) - AND type IN ('CREATOR', 'MENTOR') - ORDER BY public.session_ownerships.session_id, public.session_ownerships.user_id, public.session_ownerships.type -- Updated to match DISTINCT ON - ) AS so - ON session.id = so.session_id + -- Total sessions created + COUNT(*) FILTER ( + WHERE ( + :session_type = 'All' + OR (:session_type = 'Public' AND s.type = 'PUBLIC') + OR (:session_type = 'Private' AND s.type = 'PRIVATE') + ) + AND (:userId IS NULL OR s.created_by = :userId) + ) AS total_session_created, + + -- Total sessions conducted + COUNT(*) FILTER ( + WHERE s.status = 'COMPLETED' + AND ( + :session_type = 'All' + OR (:session_type = 'Public' AND s.type = 'PUBLIC') + OR (:session_type = 'Private' AND s.type = 'PRIVATE') + ) + AND (:userId IS NULL OR s.mentor_id = :userId) + ) AS total_sessions_conducted, + + -- Public sessions conducted + COUNT(*) FILTER ( + WHERE s.status = 'COMPLETED' + AND s.type = 'PUBLIC' + AND :session_type IN ('All', 'Public') + AND (:userId IS NULL OR s.mentor_id = :userId) + ) AS public_sessions_conducted, + + -- Private sessions conducted + COUNT(*) FILTER ( + WHERE s.status = 'COMPLETED' + AND s.type = 'PRIVATE' + AND :session_type IN ('All', 'Private') + AND (:userId IS NULL OR s.mentor_id = :userId) + ) AS private_sessions_conducted, + + -- Public sessions created + COUNT(*) FILTER ( + WHERE s.type = 'PUBLIC' + AND :session_type IN ('All', 'Public') + AND (:userId IS NULL OR s.created_by = :userId) + ) AS public_sessions_created, + + -- Private sessions created + COUNT(*) FILTER ( + WHERE s.type = 'PRIVATE' + AND :session_type IN ('All', 'Private') + AND (:userId IS NULL OR s.created_by = :userId) + ) AS private_sessions_created + + FROM public.sessions s WHERE - session.tenant_code = :tenantCode - AND ( + s.tenant_code = :tenantCode + AND (:start_date IS NULL OR s.start_date > :start_date) + AND (:end_date IS NULL OR s.end_date < :end_date) + AND ( :session_type = 'All' OR :session_type = 'Public' OR :session_type = 'Private' ) - AND session.deleted_at IS NULL + AND s.deleted_at IS NULL DYNAMIC_AND_CLAUSE;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), }, @@ -751,34 +657,44 @@ module.exports = { 'report_queries', { query: `WITH - session_count AS ( + session_count AS ( SELECT - session.tenant_code, - session.mentor_id, session.mentor_name, COUNT(*) AS number_of_sessions, - TO_CHAR( INTERVAL '1 second' * ROUND(SUM(EXTRACT(EPOCH FROM (session.completed_at - session.started_at)))), - 'HH24:MI:SS' - ) AS "hours_of_mentoring_sessions" - FROM public.sessions AS session WHERE - session.tenant_code = :tenantCode AND deleted_at IS NULL AND session.created_by = :userId AND session.started_at IS NOT NULL AND session.completed_at IS NOT NULL AND session.start_date > :start_date AND session.end_date < :end_date AND (CASE - WHEN :session_type = 'All' THEN session.type IN ('PUBLIC', 'PRIVATE') - WHEN :session_type = 'Public' THEN session.type = 'PUBLIC' - WHEN :session_type = 'Private' THEN session.type = 'PRIVATE' - ELSE TRUE - END - ) + session.tenant_code, + session.mentor_id, + session.mentor_name, + COUNT(*) AS number_of_sessions, + TO_CHAR( + INTERVAL '1 second' * ROUND(SUM(EXTRACT(EPOCH FROM (session.completed_at - session.started_at)))), + 'HH24:MI:SS' + ) AS "hours_of_mentoring_sessions" + FROM public.sessions AS session + WHERE session.tenant_code = :tenantCode + AND session.created_by = :userId + AND session.started_at IS NOT NULL + AND session.completed_at IS NOT NULL + AND (:start_date IS NULL OR session.start_date > :start_date) + AND (:end_date IS NULL OR session.end_date < :end_date) + AND ( + CASE + WHEN :session_type = 'All' THEN session.type IN ('PUBLIC', 'PRIVATE') + WHEN :session_type = 'Public' THEN session.type = 'PUBLIC' + WHEN :session_type = 'Private' THEN session.type = 'PRIVATE' + ELSE TRUE + END + ) + AND session.deleted_at IS NULL GROUP BY session.tenant_code, session.mentor_id, session.mentor_name ) SELECT - sc.tenant_code, - sc.mentor_name as mentor_name , - sc.number_of_sessions as number_of_mentoring_sessions, - sc.hours_of_mentoring_sessions as hours_of_mentoring_sessions, - COALESCE(CAST(ue.rating ->>'average'AS NUMERIC),0) AS avg_mentor_rating + sc.tenant_code, + sc.mentor_name as mentor_name , + sc.number_of_sessions as number_of_mentoring_sessions, + sc.hours_of_mentoring_sessions as hours_of_mentoring_sessions, + COALESCE(CAST(ue.rating ->>'average' AS NUMERIC),0) AS avg_mentor_rating FROM session_count AS sc - JOIN public.user_extensions AS ue ON sc.mentor_id = ue.user_id AND sc.tenant_code = ue.tenant_code + LEFT JOIN public.user_extensions AS ue ON sc.mentor_id = ue.user_id AND sc.tenant_code = ue.tenant_code DYNAMIC_WHERE_CLAUSE - ORDER BY sc.mentor_name - ;`, + ORDER BY sc.mentor_name;`, updated_at: Sequelize.literal('CURRENT_TIMESTAMP'), }, { diff --git a/src/helpers/getOrgIdAndEntityTypewithEntitiesBasedOnPolicy.js b/src/helpers/getOrgIdAndEntityTypewithEntitiesBasedOnPolicy.js index 428312393..7b9e6fbda 100644 --- a/src/helpers/getOrgIdAndEntityTypewithEntitiesBasedOnPolicy.js +++ b/src/helpers/getOrgIdAndEntityTypewithEntitiesBasedOnPolicy.js @@ -261,7 +261,7 @@ module.exports = class OrganizationAndEntityTypePolicyHelper { } } if (modelName) { - filter.model_names = { [Op.contains]: modelName } + filter.model_names = { [Op.contains]: Array.isArray(modelName) ? modelName : [modelName] } } //fetch entity types and entities // Handle both array and string cases for tenantCodes