using System; using InABox.Core; namespace Comal.Classes { public class JobStageCalendarLink : EntityLink { [LookupEditor(typeof(JobStageCalendar))] public override Guid ID { get; set; } [TextBoxEditor(Editable = Editable.Hidden)] public string Name { get; set; } [DoubleEditor(Editable = Editable.Hidden)] public double Monday { get; set; } [DoubleEditor(Editable = Editable.Hidden)] public double Tuesday { get; set; } [DoubleEditor(Editable = Editable.Hidden)] public double Wednesday { get; set; } [DoubleEditor(Editable = Editable.Hidden)] public double Thursday { get; set; } [DoubleEditor(Editable = Editable.Hidden)] public double Friday { get; set; } [DoubleEditor(Editable = Editable.Hidden)] public double Saturday { get; set; } [DoubleEditor(Editable = Editable.Hidden)] public double Sunday { get; set; } protected override void Init() { base.Init(); } private double WorkHours(DateTime date) { if (date.DayOfWeek.Equals(DayOfWeek.Sunday)) return ID.Equals(Guid.Empty) ? 0.0F : Sunday; if (date.DayOfWeek.Equals(DayOfWeek.Monday)) return ID.Equals(Guid.Empty) ? 8.0F : Monday; if (date.DayOfWeek.Equals(DayOfWeek.Tuesday)) return ID.Equals(Guid.Empty) ? 8.0F : Tuesday; if (date.DayOfWeek.Equals(DayOfWeek.Wednesday)) return ID.Equals(Guid.Empty) ? 8.0F : Wednesday; if (date.DayOfWeek.Equals(DayOfWeek.Thursday)) return ID.Equals(Guid.Empty) ? 8.0F : Thursday; if (date.DayOfWeek.Equals(DayOfWeek.Friday)) return ID.Equals(Guid.Empty) ? 8.0F : Friday; if (date.DayOfWeek.Equals(DayOfWeek.Saturday)) return ID.Equals(Guid.Empty) ? 0.0F : Saturday; return 0.0F; } public int CalculateWorkDays(DateTime start, DateTime finish) { var result = 0; for (var date = start; date <= finish; date = date.AddDays(1)) if (WorkHours(date) > 0.0F) result++; return result; } public DateTime CalculateEndDate(DateTime start, int days) { var result = start.AddDays(-1); var curdays = days; while (curdays > 0) { result = result.AddDays(1); var hours = WorkHours(result); if (hours > 0.0F) curdays--; } return result; } public double CalculateHours(DateTime start, DateTime end, double ratio) { double result = 0.0F; for (var date = start; date <= end; date = date.AddDays(1)) result += WorkHours(date) * ratio; return result; } public double CalculateWorkers(DateTime start, DateTime end, double hours) { if (hours == 0.0F) return 0.0F; double hoursperworker = 0.0F; for (var date = start; date <= end; date = date.AddDays(1)) hoursperworker += WorkHours(date); if (hoursperworker == 0.0F) return 0.0F; return hours / hoursperworker; } } [UserTracking(typeof(JobStage))] public class JobStageCalendar : Entity, IRemotable, IPersistent, ILicense { public string Name { get; set; } public double Monday { get; set; } public double Tuesday { get; set; } public double Wednesday { get; set; } public double Thursday { get; set; } public double Friday { get; set; } public double Saturday { get; set; } public double Sunday { get; set; } protected override void Init() { base.Init(); Monday = 8.0F; Tuesday = 8.0F; Wednesday = 8.0F; Thursday = 8.0F; Friday = 8.0F; Saturday = 0.0F; Sunday = 0.0F; } } }