EnVisageOnline/Main/Source/EnVisage/Models/NonProjectTimeModel.cs

362 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using EnVisage.Code;
using EnVisage.Models.ValidationAttributes.NonProjectTime;
using System.Linq;
namespace EnVisage.Models
{
public class NonProjectTimeModel : IBaseModel<NonProjectTime>
{
#region Private Variables
private bool _isPercentsMode = true;
#endregion
public Guid Id { get; set; }
[Required]
[Display(Name = "Start Date")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:MM/dd/yy}", ApplyFormatInEditMode = true)]
public DateTime NonProjectTimeStartDate { get; set; }
private DateTime? _npTimeStartDateOld = null;
public DateTime NonProjectTimeStartDateOld
{
get
{
return _npTimeStartDateOld ?? NonProjectTimeStartDate;
}
set { _npTimeStartDateOld = value; }
}
[RequiredIf("Permanent", false, ErrorMessage = "The End Date field is required.")]
[Display(Name = "End Date")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:MM/dd/yy}", ApplyFormatInEditMode = true)]
[DateGreaterThanOrEqual("NonProjectTimeStartDate", "End Date must be later or equal to Start Date", ValidateIfEmpty = false)]
public DateTime? NonProjectTimeEndDate { get; set; }
[Required]
[Display(Name = "Name")]
public string NonProjectTimeName { get; set; }
[Required]
[Display(Name = "Allocation Category")]
public Guid? NonProjectTimeCategoryId { get; set; }
[Required]
[StringLength(255)]
[Display(Name = "Allocation Category")]
public string NonProjectTimeCategoryName { get; set; }
[Required]
[Display(Name = "Cost")]
[DisplayFormat(DataFormatString = "{0:0.00}", ApplyFormatInEditMode = true)]
public decimal NonProjectTimeCost { get; set; }
[Display(Name = "Duration")]
public string NonProjectTimeDuration
{
get
{
return Utils.FormatDateRange(NonProjectTimeStartDate, NonProjectTimeEndDate, true);
}
}
[Required]
[Display(Name = "Assign To")]
public bool IsTeamAssignmentMode { get; set; }
#region NPT Resources
[Display(Name = "Resources")]
public List<Guid> Resources { get; set; }
// SA: To store the Resource selection order in UI form, we must get selected resources list
// from client as a comma separated string of GUIDs.
// NPT Edit form saves selected resources to ResourcesAsText field of the model.
// To make Resources property of the model operable, we should parse ResourcesAsText value
// and push GUIDs to Resources property of the model
[Display(Name = "Resources")]
[RequiredIf("IsTeamAssignmentMode", false, ErrorMessage = "Resources must be specified")]
public string ResourcesAsText
{
get
{
string result = (this.Resources != null) ? String.Join(",", this.Resources) : String.Empty;
return result;
}
set
{
if (!String.IsNullOrEmpty(value))
{
string[] selectedResources = value.Split(new char[] { ',' });
this.Resources = selectedResources.Select(x => new Guid(x)).ToList();
}
else
this.Resources = new List<Guid>();
}
}
#endregion
#region NPT Teams
[Display(Name = "Teams")]
public List<Guid> Teams { get; set; }
[Display(Name = "Teams")]
[RequiredIf("IsTeamAssignmentMode", true, ErrorMessage = "Teams must be specified")]
public string TeamsAsText
{
get
{
string result = (this.Teams != null) ? String.Join(",", this.Teams) : String.Empty;
return result;
}
set
{
if (!String.IsNullOrEmpty(value))
{
string[] selectedTeams = value.Split(new char[] { ',' });
this.Teams = selectedTeams.Select(x => new Guid(x)).ToList();
}
else
this.Teams = new List<Guid>();
}
}
#endregion
[Display(Name = "Details")]
[StringLength(500)]
public string Details { get; set; }
[Display(Name = "Time Allocated")]
public bool IsPercentsMode
{
get { return _isPercentsMode; }
set { _isPercentsMode = value; }
}
[NPTimeEffectiveDate(ErrorMessage = "The Effective Date of Change must be equal to Start Date")]
[NPTimeEffectiveDateRequired(ErrorMessage = "The Effective Date of Change field is required.")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:MM/dd/yy}", ApplyFormatInEditMode = true)]
[Display(Name = "Effective Date of Change")]
[DateGreaterThanOrEqual("NonProjectTimeStartDate", "Effective Date of Change must be later or equal to Start Date", ValidateIfEmpty = false)]
public DateTime? EffectiveDateOfChange { get; set; }
public bool IsHistory { get; set; }
public bool Permanent { get; set; }
private bool? _permanentOld = null;
public bool PermanentOld
{
get
{
return _permanentOld ?? Permanent;
}
set { _permanentOld = value; }
}
public Guid? TeamId { get; set; }
public decimal UOMValue { get; set; }
public bool IsCurveConstant { get; set; }
public List<NonProjectTimeAllocationModel> NonProjectTimeAllocations { get; set; }
#region Constructors
public NonProjectTimeModel()
{
NonProjectTimeAllocations = new List<NonProjectTimeAllocationModel>();
}
#endregion
#region Overrides
public void CopyTo(NonProjectTime obj)
{
if (obj == null || !NonProjectTimeCategoryId.HasValue)
throw new ArgumentNullException();
obj.StartDate = NonProjectTimeStartDate;
obj.EndDate = NonProjectTimeEndDate;
obj.Name = NonProjectTimeName;
obj.NonProjectTimeCategoryId = NonProjectTimeCategoryId.Value;
obj.Cost = NonProjectTimeCost;
obj.Details = Details;
obj.Permanent = Permanent;
obj.IsPercentsMode = IsPercentsMode;
obj.IsTeamMode = IsTeamAssignmentMode;
}
public static explicit operator NonProjectTimeModel(NonProjectTime obj)
{
if (obj == null)
return null;
NonProjectTimeModel model = new NonProjectTimeModel()
{
Id = obj.Id,
NonProjectTimeName = obj.Name,
NonProjectTimeCategoryId = obj.NonProjectTimeCategoryId,
NonProjectTimeCategoryName = obj.NonProjectTimeCategory.Name,
NonProjectTimeStartDate = obj.StartDate,
NonProjectTimeEndDate = obj.EndDate,
NonProjectTimeCost = obj.Cost,
Permanent = obj.Permanent,
Details = obj.Details,
IsPercentsMode = obj.IsPercentsMode,
IsTeamAssignmentMode = obj.IsTeamMode,
IsHistory = (obj.EndDate.HasValue && obj.EndDate.Value < DateTime.Today)
};
if (obj.NonProjectTime2Team != null)
{
model.Teams = obj.NonProjectTime2Team.Select(x => x.TeamId).ToList();
}
if (obj.NonProjectTime2Resource != null)
{
model.Resources = obj.NonProjectTime2Resource.Select(x => x.PeopleResourceId).ToList();
}
return model;
}
#endregion
}
public class NonProjectTimeAllocationModel
{
[Display(Name = "Time Off")]
[Range(0, int.MaxValue, ErrorMessage = "The field Time Off must be more than 0.")]
public int HoursOff { get; set; }
public DateTime WeekStartDate { get; set; }
public DateTime WeekEndingDate { get; set; }
}
public class NonProjectTimeListItemModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public string CategoryName { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public string Duration
{
get
{
return Utils.FormatDateRange(StartDate, EndDate, true);
}
}
public string CostFormatted
{
get
{
if (!IsInvalid)
return string.Format("{0:C2}", Cost);
else
return "-";
}
}
public string DateInterval
{
get
{
return StartDate.ToShortDateString() + " - " + (EndDate.HasValue ? EndDate.Value.ToShortDateString() : "");
}
}
public decimal Cost { get; set; }
public string Details { get; set; }
public decimal TotalHours { get; set; }
public decimal TotalUOMHours { get; set; }
public decimal TotalPercents { get; set; }
public decimal MinPercents { get; set; }
public decimal MaxPercents { get; set; }
public bool ApproximatePercents { get; set; }
public decimal ActualHours4Today { get; set; }
public decimal ActualPercents4Today { get; set; }
public bool IsPercentMode { get; set; }
public bool Permanent { get; set; }
public bool IsFromTeam { get; set; }
public bool IsInvalid { get; set; }
}
public class NonProjectTimeDistributionModel
{
public long StartDate { get; set; }
public long EndDate { get; set; }
public int HoursOff { get; set; }
public int PercentOff { get; set; }
public decimal UOMValue { get; set; }
}
public class NonProjectTimeRecalculationModel
{
public long? StartDate { get; set; }
public long? EndDate { get; set; }
/// <summary>
/// Gets or sets an array of Team.Id values for teams whose HoursOff/PercentOff system should recalculate.
/// </summary>
public Guid[] TeamIds { get; set; }
/// <summary>
/// Gets or sets an array of Resource.Id values for resources whose HoursOff/PercentOff system should recalculate.
/// </summary>
public Guid[] ResourceIds { get; set; }
}
public class NonProjectTimeSummaryItem
{
public Guid NonProjectTimeId { get; set; }
public string NonProjectTimeName { get; set; }
public Guid PeopleResourceId { get; set; }
public Guid ExpenditureCategoryId { get; set; }
public Guid NonProjectTimeCategoryId { get; set; }
public string NonProjectTimeCategoryName { get; set; }
public DateTime WeekEndingDate { get; set; }
public int HoursOff { get; set; }
public decimal Cost { get; set; }
public bool IsFromTeam { get; set; }
}
public class NonProjectTimeDatesCheckResultModel
{
public enum ViolationType
{
NoViolation = 0,
NptCompletlyBeforeResourceStartDate = 1,
NptCompletlyAfterResourceEndDate = 2,
NptPartiallyBeforeResourceStartDate = 3,
NptPartiallyAfterResourceEndDate = 4,
NptOutBothResourceDates = 5,
NotMemberOfAnyTeam = 6,
IsInactive = 7
}
public class ResourceCheckModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public ViolationType ViolationType { get; set; }
}
public class TeamCheckModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<NonProjectTimeDatesCheckResultModel.ResourceCheckModel> Resources { get; set; }
}
public bool HasViolation { get; set; }
public List<NonProjectTimeDatesCheckResultModel.TeamCheckModel> Teams { get; set; }
public NonProjectTimeDatesCheckResultModel()
{
Teams = new List<NonProjectTimeDatesCheckResultModel.TeamCheckModel>();
}
}
}