Stage 7
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user