142 lines
3.6 KiB
C#
142 lines
3.6 KiB
C#
using System;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
using System.Web.Mvc;
|
|
using AutoMapper;
|
|
using MileageTraker.Web.Attributes;
|
|
|
|
namespace MileageTraker.Web.ViewModels.Vehicle
|
|
{
|
|
public class VehicleViewModel
|
|
{
|
|
[Required]
|
|
[InputSize("mini")]
|
|
public int Key { get; set; }
|
|
|
|
[Key]
|
|
[Required]
|
|
[StringLength(6, MinimumLength = 4, ErrorMessage = "Must be at least a 4 digit number")]
|
|
[Display(Name = "EHTRA ID")]
|
|
[RegularExpression(@"\d+", ErrorMessage = "Vehicle ID must be all numbers")]
|
|
[InputSize("mini")]
|
|
public string VehicleId { get; set; }
|
|
|
|
[Required]
|
|
[RegularExpression(@"\d{4}", ErrorMessage = "Must be 4 numbers")]
|
|
[InputSize("mini")]
|
|
public string ModelYear { get; set; }
|
|
|
|
[Required]
|
|
[InputSize("medium")]
|
|
public string Make { get; set; }
|
|
|
|
[Display(Name = "Model")]
|
|
[Required]
|
|
[InputSize("medium")]
|
|
public string CarModel { get; set; }
|
|
|
|
[InputSize("small")]
|
|
public string Color { get; set; }
|
|
|
|
[Required]
|
|
[RegularExpression(@"Car|Truck|SUV|Van", ErrorMessage = "Must be Car, Truck, SUV, or Van")]
|
|
[FormatHint("Car, Truck, SUV or Van")]
|
|
[InputSize("mini")]
|
|
public string Type { get; set; }
|
|
|
|
[Required]
|
|
[Display(Name = "VIN")]
|
|
[RegularExpression(@"[0-9A-HJ-NPR-Z]{17}", ErrorMessage = "VIN must be 17-characters, not including letters I, O or Q")]
|
|
[InputSize("large")]
|
|
public string Vin { get; set; }
|
|
|
|
[Required]
|
|
[InputSize("small")]
|
|
[Currency]
|
|
public decimal Price { get; set; }
|
|
|
|
[Required]
|
|
[RegularExpression(@"\d{1,2}/\d{2}", ErrorMessage = "PurDate must be in mm/yy format")]
|
|
[InputSize("small")]
|
|
[FormatHint("mm/yy")]
|
|
public string PurDate { get; set; }
|
|
|
|
[DataType(DataType.DateTime)]
|
|
[DisplayFormat(NullDisplayText = "Currently Active", DataFormatString = @"{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
|
|
[InputSize("small")]
|
|
[FormatHint("mm/dd/yyyy")]
|
|
public DateTime? InactiveDate { get; set; }
|
|
|
|
[Required]
|
|
[Display(Name = "Tag#")]
|
|
[InputSize("small")]
|
|
public string TagNumber { get; set; }
|
|
|
|
[Required]
|
|
[InputSize("medium")]
|
|
public string Prog { get; set; }
|
|
|
|
[RegularExpression(@"Unassigned|[A-Za-z().]+(\s+[A-Za-z().]+)+", ErrorMessage = "Please enter the full name")]
|
|
[DisplayFormat(NullDisplayText = "Unassigned")]
|
|
[FormatHint("Blank for Unassigned")]
|
|
public string Assigned { get; set; }
|
|
|
|
[InputSize("medium")]
|
|
public string Notes { get; set; }
|
|
|
|
[Display(Name = "Current Odometer", ShortName= "ODO")]
|
|
[DisplayFormat(NullDisplayText = "?")]
|
|
[InputSize("small")]
|
|
public int? CurrentOdometer { get; set; }
|
|
|
|
[HiddenInput(DisplayValue = true)]
|
|
public int? NextServiceOdometer { get; set; }
|
|
|
|
[HiddenInput(DisplayValue = false)]
|
|
public bool IsNextServiceOverdue
|
|
{
|
|
get { return NextServiceDueInMiles <= 0; }
|
|
}
|
|
|
|
[HiddenInput(DisplayValue = false)]
|
|
public int NextServiceDueInMiles
|
|
{
|
|
get
|
|
{
|
|
return CurrentOdometer.HasValue && NextServiceOdometer.HasValue
|
|
? NextServiceOdometer.Value - CurrentOdometer.Value
|
|
: int.MaxValue;
|
|
}
|
|
}
|
|
|
|
|
|
static VehicleViewModel()
|
|
{
|
|
Mapper.CreateMap<VehicleViewModel, Models.Vehicle>();
|
|
Mapper.CreateMap<Models.Vehicle, VehicleViewModel>()
|
|
.ForMember(dest => dest.NextServiceOdometer,
|
|
opt => opt.ResolveUsing(v =>
|
|
v.ServiceReminders
|
|
.OrderBy(s => s.TargetOdometer)
|
|
.Select(s => (int?) s.TargetOdometer)
|
|
.FirstOrDefault()
|
|
));
|
|
}
|
|
|
|
public VehicleViewModel(Models.Vehicle vehicle)
|
|
{
|
|
Mapper.Map(vehicle, this);
|
|
}
|
|
|
|
public VehicleViewModel()
|
|
{
|
|
}
|
|
|
|
public Models.Vehicle GetVehicle()
|
|
{
|
|
var vehicle = new Models.Vehicle();
|
|
Mapper.Map(this, vehicle);
|
|
return vehicle;
|
|
}
|
|
}
|
|
} |