This commit is contained in:
2026-04-21 15:06:57 +03:00
parent fc6ef8de7e
commit a4a7daa5e0
10 changed files with 1084 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
-module(logic_ticket).
-include("records.hrl").
-export([report_error/3, get_ticket/2, list_tickets/1, list_tickets_by_status/2]).
-export([update_status/3, assign_ticket/3, resolve_ticket/3, close_ticket/2]).
-export([get_statistics/1]).
%% Зарегистрировать ошибку (создать или обновить тикет)
report_error(ErrorMessage, Stacktrace, Context) ->
case core_ticket:create_or_update(ErrorMessage, Stacktrace, Context) of
{ok, Ticket} ->
% Если это новый тикет, уведомляем администраторов (заглушка)
case Ticket#ticket.count of
1 -> notify_admins(Ticket);
_ -> ok
end,
{ok, Ticket};
Error -> Error
end.
%% Получить тикет (только для админов)
get_ticket(AdminId, TicketId) ->
case is_admin(AdminId) of
true -> core_ticket:get_by_id(TicketId);
false -> {error, access_denied}
end.
%% Список всех тикетов (только для админов)
list_tickets(AdminId) ->
case is_admin(AdminId) of
true -> core_ticket:list_all();
false -> {error, access_denied}
end.
%% Список тикетов по статусу (только для админов)
list_tickets_by_status(AdminId, Status) ->
case is_admin(AdminId) of
true -> core_ticket:list_by_status(Status);
false -> {error, access_denied}
end.
%% Обновить статус тикета
update_status(AdminId, TicketId, Status) ->
case is_admin(AdminId) of
true -> core_ticket:update_status(TicketId, Status);
false -> {error, access_denied}
end.
%% Назначить тикет администратору
assign_ticket(AdminId, TicketId, AssignToId) ->
case is_admin(AdminId) of
true -> core_ticket:assign(TicketId, AssignToId);
false -> {error, access_denied}
end.
%% Отметить тикет как решённый с примечанием
resolve_ticket(AdminId, TicketId, ResolutionNote) ->
case is_admin(AdminId) of
true ->
case core_ticket:add_resolution(TicketId, ResolutionNote) of
{ok, Ticket} ->
core_ticket:update_status(TicketId, resolved);
Error -> Error
end;
false -> {error, access_denied}
end.
%% Закрыть тикет
close_ticket(AdminId, TicketId) ->
case is_admin(AdminId) of
true -> core_ticket:update_status(TicketId, closed);
false -> {error, access_denied}
end.
%% Получить статистику по тикетам
get_statistics(AdminId) ->
case is_admin(AdminId) of
true ->
{ok, AllTickets} = core_ticket:list_all(),
Open = length([T || T <- AllTickets, T#ticket.status =:= open]),
InProgress = length([T || T <- AllTickets, T#ticket.status =:= in_progress]),
Resolved = length([T || T <- AllTickets, T#ticket.status =:= resolved]),
Closed = length([T || T <- AllTickets, T#ticket.status =:= closed]),
TotalErrors = lists:sum([T#ticket.count || T <- AllTickets]),
#{
total_tickets => length(AllTickets),
open => Open,
in_progress => InProgress,
resolved => Resolved,
closed => Closed,
total_errors => TotalErrors
};
false -> {error, access_denied}
end.
%% ============ Вспомогательные функции ============
is_admin(UserId) ->
case core_user:get_by_id(UserId) of
{ok, User} -> User#user.role =:= admin;
_ -> false
end.
notify_admins(_Ticket) ->
% Заглушка для уведомлений администраторов
% В будущем здесь будет отправка email/websocket
ok.