Загрузка данных


using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace AutoServiceApp.Models
{
    /// <summary>
    /// Перечисление статусов заявки
    /// </summary>
    public enum RequestStatus
    {
        [Display(Name = "Новая")]
        New = 0,

        [Display(Name = "Принята в работу")]
        Accepted = 1,

        [Display(Name = "В работе")]
        InProgress = 2,

        [Display(Name = "Ожидание запчастей")]
        WaitingParts = 3,

        [Display(Name = "Контроль качества")]
        QualityControl = 4,

        [Display(Name = "Готова к выдаче")]
        Ready = 5,

        [Display(Name = "Выдана клиенту")]
        Issued = 6,

        [Display(Name = "Закрыта")]
        Closed = 7,

        [Display(Name = "Отменена")]
        Cancelled = 8
    }

    /// <summary>
    /// Модель заявки на обслуживание
    /// </summary>
    public class ServiceRequest
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Display(Name = "Номер заявки")]
        public string RequestNumber { get; set; } = string.Empty;

        [Required(ErrorMessage = "Описание работ обязательно")]
        [Display(Name = "Описание работ / неисправности")]
        [StringLength(1000, MinimumLength = 10, ErrorMessage = "Описание должно содержать от 10 до 1000 символов")]
        public string Description { get; set; } = string.Empty;

        [Display(Name = "Дополнительная информация")]
        [StringLength(2000, ErrorMessage = "Дополнительная информация не должна превышать 2000 символов")]
        public string? AdditionalInfo { get; set; }

        [Required(ErrorMessage = "Статус обязателен")]
        [Display(Name = "Статус")]
        public RequestStatus Status { get; set; } = RequestStatus.New;

        [Display(Name = "Предварительная стоимость (₽)")]
        [Range(0, 9999999.99, ErrorMessage = "Неверная стоимость")]
        [Column(TypeName = "decimal(18, 2)")]
        public decimal EstimatedCost { get; set; }

        [Display(Name = "Фактическая стоимость (₽)")]
        [Range(0, 9999999.99, ErrorMessage = "Неверная стоимость")]
        [Column(TypeName = "decimal(18, 2)")]
        public decimal? ActualCost { get; set; }

        [Display(Name = "Дата создания")]
        public DateTime CreatedAt { get; set; } = DateTime.Now;

        [Display(Name = "Желаемая дата выполнения")]
        public DateTime? DesiredDate { get; set; }

        [Display(Name = "Дата начала работ")]
        public DateTime? StartedAt { get; set; }

        [Display(Name = "Дата завершения")]
        public DateTime? CompletedAt { get; set; }

        [Display(Name = "Примечания мастера")]
        [StringLength(1000, ErrorMessage = "Примечания не должны превышать 1000 символов")]
        public string? MasterNotes { get; set; }

        // Внешние ключи
        [Required(ErrorMessage = "Транспортное средство обязательно")]
        [Display(Name = "Транспортное средство")]
        public int VehicleId { get; set; }

        [Display(Name = "Ответственный мастер")]
        public int? AssignedMasterId { get; set; }

        // Навигационные свойства
        [ForeignKey("VehicleId")]
        public virtual Vehicle? Vehicle { get; set; }

        // Генерация номера заявки
        public void GenerateRequestNumber()
        {
            RequestNumber = $"AS-{DateTime.Now:yyyyMMdd}-{Id:D4}";
        }
    }
}