diff --git a/app/database/services/analytics/analysis_service.py b/app/database/services/analytics/analysis_service.py index 25740ea..7291518 100644 --- a/app/database/services/analytics/analysis_service.py +++ b/app/database/services/analytics/analysis_service.py @@ -36,6 +36,7 @@ get_patients_most_commonly_visited_screens, get_patients_retention_rate_in_specific_time_interval, get_patients_retention_rate_on_specific_days, + get_user_engagement_over_last_8_days, get_weekly_active_patients, get_most_fired_events ) @@ -105,8 +106,8 @@ async def calculate( saved_analytics = await save_analytics(analysis_code, metrics) print(f"Saved analytics -> {analysis_code}") - await generate_reports(analysis_code, metrics) - print(f"Generated reports -> {analysis_code}") + # await generate_reports(analysis_code, metrics) + # print(f"Generated reports -> {analysis_code}") return metrics @@ -199,7 +200,8 @@ async def calculate_generic_engagement_metrics(filters: AnalyticsFilters | None get_patients_most_commonly_used_features(filters), get_patients_most_commonly_visited_screens(filters), get_most_fired_events(filters), - get_most_fired_events_by_event_category(filters) + get_most_fired_events_by_event_category(filters), + get_user_engagement_over_last_8_days(filters) ) daily_active_users = results[0] @@ -212,8 +214,9 @@ async def calculate_generic_engagement_metrics(filters: AnalyticsFilters | None stickiness_ratio = results[7] most_common_features = results[8] most_commonly_visited_screens = results[9] - most_fired_events = results[10] - most_fired_events_by_event_category = results[11] + most_fired_events = results[10] + most_fired_events_by_event_category = results[11] + user_engagement_over_last_8_days = results[12] generic_engagement_metrics = GenericEngagementMetrics( TenantId = filters.TenantId, @@ -231,7 +234,8 @@ async def calculate_generic_engagement_metrics(filters: AnalyticsFilters | None MostCommonlyVisitedFeatures = most_common_features, MostCommonlyVisitedScreens = most_commonly_visited_screens, MostFiredEvents = most_fired_events, - MostFiredEventsByEventCategory = most_fired_events_by_event_category + MostFiredEventsByEventCategory = most_fired_events_by_event_category, + UserEngagementOverLast8Days = user_engagement_over_last_8_days ) return generic_engagement_metrics diff --git a/app/database/services/analytics/generic_engagement.py b/app/database/services/analytics/generic_engagement.py index 3c953f5..243e59d 100644 --- a/app/database/services/analytics/generic_engagement.py +++ b/app/database/services/analytics/generic_engagement.py @@ -917,3 +917,48 @@ async def get_most_fired_events_by_event_category(filters: AnalyticsFilters) -> print(e) return [] +async def get_user_engagement_over_last_8_days(filters) -> list: + try: + + tenant_id = filters.TenantId + start_date = filters.StartDate + end_date = filters.EndDate + role_id = filters.RoleId + + connector = get_analytics_db_connector() + + query = f""" + SELECT + EventCategory as event_category, + EventName as event_name, + COUNT(*) AS event_count + FROM + events e + JOIN + users user ON e.UserId = user.id + WHERE + e.Timestamp >= NOW() - INTERVAL 8 DAY + AND + e.Timestamp BETWEEN '{start_date}' AND '{end_date}' + __CHECKS__ + GROUP BY + EventCategory, + EventName + ORDER BY + EventCategory, + event_count DESC + """ + + checks_str = add_common_checks(tenant_id, role_id) + if len(checks_str) > 0: + checks_str = "AND " + checks_str + query = query.replace("__CHECKS__", checks_str) + + result = connector.execute_read_query(query) + + return result + + except Exception as e: + print(e) + return [] + diff --git a/app/domain_types/schemas/analytics.py b/app/domain_types/schemas/analytics.py index 89d09b1..f7c6561 100644 --- a/app/domain_types/schemas/analytics.py +++ b/app/domain_types/schemas/analytics.py @@ -65,6 +65,8 @@ class GenericEngagementMetrics(BaseModel): MostCommonlyVisitedScreens : list|dict|None = Field(description="Most common screens visited by users") MostFiredEvents : list|dict|None = Field(description="Most frequently fired events") MostFiredEventsByEventCategory : list|dict|None = Field(description="Most frequently fired events by event category") + UserEngagementOverLast8Days : list|dict|None = Field(description="User engagement over last 8 days") + class FeatureEngagementMetrics(BaseModel): Feature : str = Field(description="Name of the feature")