Статистика для дашборда, расширенная #7

This commit is contained in:
2026-04-28 23:04:17 +03:00
parent c87d56bb49
commit 3da4ee28d4
11 changed files with 261 additions and 70 deletions
+74 -21
View File
@@ -1,29 +1,82 @@
-module(logic_stats).
-export([get_stats/2]).
-export([get_stats/2, get_stats/4]).
-include("records.hrl").
%% ========== Точка входа (без дат) =============================
-spec get_stats(Role :: atom(), AdminId :: binary()) -> map().
get_stats(superadmin, _AdminId) ->
get_stats(Role, AdminId) ->
{{Y, _, _}, _} = calendar:universal_time(),
From = {{Y, 1, 1}, {0, 0, 0}}, % начало текущего года
To = calendar:universal_time(),
get_stats(Role, AdminId, From, To).
%% ========== Точка входа (с фильтром по датам) =================
-spec get_stats(Role :: atom(), AdminId :: binary(),
From :: calendar:datetime(), To :: calendar:datetime()) -> map().
get_stats(superadmin, _AdminId, From, To) ->
build_superadmin_stats(From, To);
get_stats(moderator, AdminId, From, To) ->
build_moderator_stats(AdminId, From, To);
get_stats(support, AdminId, From, To) ->
build_support_stats(AdminId, From, To);
get_stats(_, _, _, _) ->
#{}.
%% ========== Суперадмин =========================================
build_superadmin_stats(From, To) ->
#{
users => core_user:count_users(),
calendars => core_calendar:count_calendars(),
events => core_event:count_events(),
bookings => core_booking:count_bookings(),
reviews => core_review:count_reviews(),
reports_total => core_report:count_reports_by_status(pending),
tickets_open => core_ticket:count_tickets_by_status(open),
subscriptions => core_subscription:count_subscription()
};
get_stats(moderator, AdminId) ->
users_total => core_user:count_users(),
events_total => core_event:count_events(),
calendars_total => core_calendar:count_calendars(),
reviews_total => core_review:count_reviews(),
reports_total => core_report:count_reports_by_status(pending),
tickets_open => core_ticket:count_tickets_by_status(open),
tickets_total => length(core_ticket:list_all()),
avg_ticket_resolution_h => trunc_hours(core_ticket:avg_resolution_time()),
registrations_by_day => date_list_to_json(core_user:count_users_by_date(From, To)),
events_by_day => date_list_to_json(core_event:count_events_by_date(From, To)),
admin_activity => collect_admin_activity()
}.
%% ========== Модератор ==========================================
build_moderator_stats(AdminId, _From, _To) ->
#{
reports_reviewed => core_report:count_reports_by_admin(AdminId, reviewed),
events_moderated => 0 % пока заглушка, можно добавить позже
};
get_stats(support, AdminId) ->
reports_reviewed => core_report:count_reports_resolved_by_admin(AdminId, reviewed),
reports_dismissed => core_report:count_reports_resolved_by_admin(AdminId, dismissed),
avg_report_resolution_h => trunc_hours(core_report:avg_resolution_time(reviewed)),
events_moderated => 0 % заглушка, можно доработать
}.
%% ========== Поддержка ==========================================
build_support_stats(AdminId, _From, _To) ->
#{
tickets_assigned => core_ticket:count_tickets_by_admin(AdminId, open),
reports_pending => core_report:count_reports_by_status(pending)
};
get_stats(_, _) ->
#{}.
tickets_assigned_open => core_ticket:count_tickets_by_admin(AdminId, open),
tickets_assigned_total => core_ticket:count_tickets_by_admin(AdminId, closed) +
core_ticket:count_tickets_by_admin(AdminId, in_progress),
reports_pending => core_report:count_reports_by_status(pending)
}.
%% ========== Вспомогательные функции ============================
date_list_to_json(List) ->
[ #{<<"date">> => iso8601_date(Date), <<"count">> => Count} || {Date, Count} <- List ].
iso8601_date({{Y, M, D}, _}) ->
iolist_to_binary(io_lib:format("~4..0B-~2..0B-~2..0B", [Y, M, D]));
iso8601_date({Y, M, D}) ->
iolist_to_binary(io_lib:format("~4..0B-~2..0B-~2..0B", [Y, M, D])).
trunc_hours(Value) ->
round(Value * 10) / 10.0.
collect_admin_activity() ->
Admins = core_admin:list_all(),
lists:map(fun(A) ->
Actions = length(core_admin_audit:list([{admin_id, A#admin.id}])),
#{
admin_id => A#admin.id,
email => A#admin.email,
actions => Actions
}
end, Admins).