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 ?? "Неизвестно" }; }