285 lines
9.0 KiB
C#
285 lines
9.0 KiB
C#
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 ?? "Неизвестно"
|
||
};
|
||
}
|