using System.Text.Json.Serialization;
namespace CORP_MAUI.Models;
///
/// Модель заявления (отпуск, заявка и т.д.)
///
public class Request
{
public int Id { get; set; }
///
/// Тип заявления (vacation, sick_leave, business_trip и т.д.)
///
[JsonPropertyName("type")]
public string Type { get; set; } = string.Empty;
///
/// Заголовок заявления
///
[JsonPropertyName("title")]
public string? Title { get; set; }
///
/// Отображаемый заголовок
///
[JsonPropertyName("display_title")]
public string? DisplayTitle { get; set; }
///
/// Статус заявления (pending, approved, rejected и т.д.)
///
[JsonPropertyName("status")]
public string Status { get; set; } = string.Empty;
///
/// Дата создания заявления
///
[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; }
///
/// Дата последнего обновления
///
[JsonPropertyName("updated_at")]
public DateTime? UpdatedAt { get; set; }
///
/// Дата принятия решения
///
[JsonPropertyName("decided_at")]
public DateTime? DecidedAt { get; set; }
///
/// Дата начала (для отпуска, командировки и т.д.)
///
[JsonPropertyName("date_from")]
public DateTime? DateFrom { get; set; }
///
/// Дата окончания
///
[JsonPropertyName("date_to")]
public DateTime? DateTo { get; set; }
///
/// Сотрудник, подавший заявление
///
[JsonPropertyName("employee")]
public User? Employee { get; set; }
///
/// Сотрудник, принявший решение
///
[JsonPropertyName("approver")]
public User? Approver { get; set; }
///
/// Комментарий/описание к заявлению
///
[JsonPropertyName("comment")]
public string? Comment { get; set; }
///
/// Вложение (файл)
///
[JsonPropertyName("attachment")]
public string? Attachment { get; set; }
///
/// URL вложения
///
[JsonPropertyName("attachment_url")]
public string? AttachmentUrl { get; set; }
///
/// Отдел
///
[JsonPropertyName("department")]
public Department? Department { get; set; }
///
/// ID отделов
///
[JsonPropertyName("departments")]
public List? Departments { get; set; }
///
/// Является ли решение финальным
///
[JsonPropertyName("is_final")]
public bool IsFinal { get; set; }
///
/// Является ли текущий пользователь получателем
///
[JsonPropertyName("is_recipient")]
public bool IsRecipient { get; set; }
///
/// Отправлено всему отделу
///
[JsonPropertyName("sent_to_all_department")]
public bool SentToAllDepartment { get; set; }
///
/// Количество получателей
///
[JsonPropertyName("recipient_count")]
public int RecipientCount { get; set; }
///
/// Количество в копии
///
[JsonPropertyName("cc_count")]
public int CcCount { get; set; }
///
/// Количество комментариев
///
[JsonPropertyName("comments_count")]
public int CommentsCount { get; set; }
///
/// Получатели заявления
///
[JsonPropertyName("recipients")]
public List? Recipients { get; set; }
///
/// Пользователи в копии
///
[JsonPropertyName("cc_users")]
public List? CcUsers { get; set; }
// ================================
// Вспомогательные свойства для UI
// ================================
///
/// Отображаемый тип/заголовок заявления
///
[JsonIgnore]
public string DisplayType =>
!string.IsNullOrEmpty(DisplayTitle) ? DisplayTitle :
!string.IsNullOrEmpty(Title) ? Title :
GetTypeDisplayName(Type);
///
/// Отображаемый статус
///
[JsonIgnore]
public string DisplayStatus => GetStatusDisplayName(Status);
///
/// Цвет статуса для UI
///
[JsonIgnore]
public Color StatusColor => Status?.ToLower() switch
{
"approved" or "accepted" => Color.FromArgb("#22C55E"), // Зелёный
"rejected" or "declined" or "cancelled" => Color.FromArgb("#EF4444"), // Красный
"pending" or "waiting" => Color.FromArgb("#F59E0B"), // Оранжевый
"in_progress" or "processing" => Color.FromArgb("#3B82F6"), // Синий
_ => Color.FromArgb("#6B7280") // Серый
};
///
/// Иконка типа заявления
///
[JsonIgnore]
public string TypeIcon => Type?.ToLower() switch
{
"vacation" or "отпуск" => "🏖️",
"sick_leave" or "больничный" => "🏥",
"business_trip" or "командировка" => "✈️",
"day_off" or "отгул" => "📅",
"remote_work" or "удаленная работа" => "🏠",
"overtime" or "сверхурочные" => "⏰",
"equipment" or "оборудование" => "💻",
"document" or "документ" => "📄",
"other" => "📝",
_ => "📋"
};
///
/// Отображаемый период (для заявлений с датами)
///
[JsonIgnore]
public string? DisplayPeriod
{
get
{
if (DateFrom.HasValue && DateTo.HasValue)
{
if (DateFrom.Value.Date == DateTo.Value.Date)
return DateFrom.Value.ToString("dd.MM.yyyy");
return $"{DateFrom.Value:dd.MM.yyyy} — {DateTo.Value:dd.MM.yyyy}";
}
if (DateFrom.HasValue)
return $"с {DateFrom.Value:dd.MM.yyyy}";
return null;
}
}
///
/// Отображаемая дата создания
///
[JsonIgnore]
public string DisplayCreatedAt => CreatedAt.ToString("dd.MM.yyyy HH:mm");
///
/// Отображаемое описание (из поля comment)
///
[JsonIgnore]
public string DisplayDescription =>
!string.IsNullOrEmpty(Comment) ? Comment :
"Без описания";
///
/// Имя сотрудника, подавшего заявление
///
[JsonIgnore]
public string EmployeeName => Employee?.FullName ?? "Неизвестный сотрудник";
///
/// Имя сотрудника, принявшего решение
///
[JsonIgnore]
public string ApproverName => Approver?.FullName ?? "";
// ================================
// Вспомогательные методы
// ================================
private static string GetTypeDisplayName(string? type) => type?.ToLower() switch
{
"vacation" => "Отпуск",
"sick_leave" => "Больничный",
"business_trip" => "Командировка",
"day_off" => "Отгул",
"remote_work" => "Удалённая работа",
"overtime" => "Сверхурочные",
"equipment" => "Запрос оборудования",
"document" => "Запрос документа",
"other" => "Другое",
_ => type ?? "Заявление"
};
private static string GetStatusDisplayName(string? status) => status?.ToLower() switch
{
"pending" => "На рассмотрении",
"waiting" => "Ожидает",
"approved" => "Одобрено",
"accepted" => "Принято",
"rejected" => "Отклонено",
"declined" => "Отклонено",
"cancelled" => "Отменено",
"in_progress" => "В обработке",
"processing" => "Обрабатывается",
"completed" => "Завершено",
_ => status ?? "Неизвестно"
};
}