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; } [DecimalEditor(Editable = Editable.Hidden)] public decimal Monday { get; set; } [DecimalEditor(Editable = Editable.Hidden)] public decimal Tuesday { get; set; } [DecimalEditor(Editable = Editable.Hidden)] public decimal Wednesday { get; set; } [DecimalEditor(Editable = Editable.Hidden)] public decimal Thursday { get; set; } [DecimalEditor(Editable = Editable.Hidden)] public decimal Friday { get; set; } [DecimalEditor(Editable = Editable.Hidden)] public decimal Saturday { get; set; } [DecimalEditor(Editable = Editable.Hidden)] public decimal Sunday { get; set; } private decimal WorkHours(DateTime date) { if (date.DayOfWeek.Equals(DayOfWeek.Sunday)) return ID.Equals(Guid.Empty) ? 0 : Sunday; if (date.DayOfWeek.Equals(DayOfWeek.Monday)) return ID.Equals(Guid.Empty) ? 8 : Monday; if (date.DayOfWeek.Equals(DayOfWeek.Tuesday)) return ID.Equals(Guid.Empty) ? 8 : Tuesday; if (date.DayOfWeek.Equals(DayOfWeek.Wednesday)) return ID.Equals(Guid.Empty) ? 8 : Wednesday; if (date.DayOfWeek.Equals(DayOfWeek.Thursday)) return ID.Equals(Guid.Empty) ? 8 : Thursday; if (date.DayOfWeek.Equals(DayOfWeek.Friday)) return ID.Equals(Guid.Empty) ? 8 : Friday; if (date.DayOfWeek.Equals(DayOfWeek.Saturday)) return ID.Equals(Guid.Empty) ? 0 : Saturday; return 0; } public int CalculateWorkDays(DateTime start, DateTime finish) { var result = 0; for (var date = start; date <= finish; date = date.AddDays(1)) if (WorkHours(date) > 0) 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) curdays--; } return result; } public decimal CalculateHours(DateTime start, DateTime end, decimal ratio) { var result = 0.0m; for (var date = start; date <= end; date = date.AddDays(1)) result += WorkHours(date) * ratio; return result; } public decimal CalculateWorkers(DateTime start, DateTime end, decimal hours) { if (hours == default) return default; var hoursperworker = 0.0m; for (var date = start; date <= end; date = date.AddDays(1)) hoursperworker += WorkHours(date); if (hoursperworker == default) return default; return hours / hoursperworker; } } [UserTracking(typeof(JobStage))] public class JobStageCalendar : Entity, IRemotable, IPersistent, ILicense { public string Name { get; set; } public decimal Monday { get; set; } = 8; public decimal Tuesday { get; set; } = 8; public decimal Wednesday { get; set; } = 8; public decimal Thursday { get; set; } = 8; public decimal Friday { get; set; } = 8; public decimal Saturday { get; set; } = 0; public decimal Sunday { get; set; } = 0; } }