285 lines
9.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Text.Json.Serialization;
namespace CORP_MAUI.Models;
/// <summary>
/// Модель заявления (отпуск, заявка и т.д.)
/// </summary>
public class Request
{
public int Id { get; set; }
/// <summary>
/// Тип заявления (vacation, sick_leave, business_trip и т.д.)
/// </summary>
[JsonPropertyName("type")]
public string Type { get; set; } = string.Empty;
/// <summary>
/// Заголовок заявления
/// </summary>
[JsonPropertyName("title")]
public string? Title { get; set; }
/// <summary>
/// Отображаемый заголовок
/// </summary>
[JsonPropertyName("display_title")]
public string? DisplayTitle { get; set; }
/// <summary>
/// Статус заявления (pending, approved, rejected и т.д.)
/// </summary>
[JsonPropertyName("status")]
public string Status { get; set; } = string.Empty;
/// <summary>
/// Дата создания заявления
/// </summary>
[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; }
/// <summary>
/// Дата последнего обновления
/// </summary>
[JsonPropertyName("updated_at")]
public DateTime? UpdatedAt { get; set; }
/// <summary>
/// Дата принятия решения
/// </summary>
[JsonPropertyName("decided_at")]
public DateTime? DecidedAt { get; set; }
/// <summary>
/// Дата начала (для отпуска, командировки и т.д.)
/// </summary>
[JsonPropertyName("date_from")]
public DateTime? DateFrom { get; set; }
/// <summary>
/// Дата окончания
/// </summary>
[JsonPropertyName("date_to")]
public DateTime? DateTo { get; set; }
/// <summary>
/// Сотрудник, подавший заявление
/// </summary>
[JsonPropertyName("employee")]
public User? Employee { get; set; }
/// <summary>
/// Сотрудник, принявший решение
/// </summary>
[JsonPropertyName("approver")]
public User? Approver { get; set; }
/// <summary>
/// Комментарий/описание к заявлению
/// </summary>
[JsonPropertyName("comment")]
public string? Comment { get; set; }
/// <summary>
/// Вложение (файл)
/// </summary>
[JsonPropertyName("attachment")]
public string? Attachment { get; set; }
/// <summary>
/// URL вложения
/// </summary>
[JsonPropertyName("attachment_url")]
public string? AttachmentUrl { get; set; }
/// <summary>
/// Отдел
/// </summary>
[JsonPropertyName("department")]
public Department? Department { get; set; }
/// <summary>
/// ID отделов
/// </summary>
[JsonPropertyName("departments")]
public List<int>? Departments { get; set; }
/// <summary>
/// Является ли решение финальным
/// </summary>
[JsonPropertyName("is_final")]
public bool IsFinal { get; set; }
/// <summary>
/// Является ли текущий пользователь получателем
/// </summary>
[JsonPropertyName("is_recipient")]
public bool IsRecipient { get; set; }
/// <summary>
/// Отправлено всему отделу
/// </summary>
[JsonPropertyName("sent_to_all_department")]
public bool SentToAllDepartment { get; set; }
/// <summary>
/// Количество получателей
/// </summary>
[JsonPropertyName("recipient_count")]
public int RecipientCount { get; set; }
/// <summary>
/// Количество в копии
/// </summary>
[JsonPropertyName("cc_count")]
public int CcCount { get; set; }
/// <summary>
/// Количество комментариев
/// </summary>
[JsonPropertyName("comments_count")]
public int CommentsCount { get; set; }
/// <summary>
/// Получатели заявления
/// </summary>
[JsonPropertyName("recipients")]
public List<User>? Recipients { get; set; }
/// <summary>
/// Пользователи в копии
/// </summary>
[JsonPropertyName("cc_users")]
public List<User>? CcUsers { get; set; }
// ================================
// Вспомогательные свойства для UI
// ================================
/// <summary>
/// Отображаемый тип/заголовок заявления
/// </summary>
[JsonIgnore]
public string DisplayType =>
!string.IsNullOrEmpty(DisplayTitle) ? DisplayTitle :
!string.IsNullOrEmpty(Title) ? Title :
GetTypeDisplayName(Type);
/// <summary>
/// Отображаемый статус
/// </summary>
[JsonIgnore]
public string DisplayStatus => GetStatusDisplayName(Status);
/// <summary>
/// Цвет статуса для UI
/// </summary>
[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") // Серый
};
/// <summary>
/// Иконка типа заявления
/// </summary>
[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" => "📝",
_ => "📋"
};
/// <summary>
/// Отображаемый период (для заявлений с датами)
/// </summary>
[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;
}
}
/// <summary>
/// Отображаемая дата создания
/// </summary>
[JsonIgnore]
public string DisplayCreatedAt => CreatedAt.ToString("dd.MM.yyyy HH:mm");
/// <summary>
/// Отображаемое описание (из поля comment)
/// </summary>
[JsonIgnore]
public string DisplayDescription =>
!string.IsNullOrEmpty(Comment) ? Comment :
"Без описания";
/// <summary>
/// Имя сотрудника, подавшего заявление
/// </summary>
[JsonIgnore]
public string EmployeeName => Employee?.FullName ?? "Неизвестный сотрудник";
/// <summary>
/// Имя сотрудника, принявшего решение
/// </summary>
[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 ?? "Неизвестно"
};
}