using System; using System.Collections.Generic; using System.Linq; using InABox.Core; namespace Comal.Classes { public class EmployeeRosterItem : BaseObject, IImportable, IExportable { private static readonly Dictionary> times = new Dictionary>() { { "Start", x => x.Start }, { "Finish", x => x.Finish }, { "Break", x => x.Break }, { "Start2", x => x.Start2 }, { "Finish2", x => x.Finish2 }, { "Break2", x => x.Break2 } }; [IntegerEditor(Alignment = Alignment.MiddleCenter, Editable = Editable.Disabled)] [EditorSequence(1)] [Caption("Day")] public int Day { get; set; } [TextBoxEditor(Editable = Editable.Disabled)] [EditorSequence(2)] public string Description { get; set; } [CheckBoxEditor] [EditorSequence(3)] [Caption("Rostered On?")] public bool Enabled { get; set; } [TimeOfDayEditor(Format = "hh:mm", Width = 70)] [EditorSequence(4)] public TimeSpan Start { get; set; } [TimeOfDayEditor(Format = "hh:mm", Width = 70)] [EditorSequence(5)] public TimeSpan Finish { get; set; } [DurationEditor(Format = "hh:mm", Visible = Visible.Default, Editable = Editable.Enabled, Width = 70)] [EditorSequence(6)] public TimeSpan Break { get; set; } [CheckBoxEditor] [EditorSequence(7)] [Caption("Split")] public bool SplitShift { get; set; } [TimeOfDayEditor(Format = "hh:mm", Width = 70)] [EditorSequence(8)] [Caption("Start 2")] public TimeSpan Start2 { get; set; } [TimeOfDayEditor(Format = "hh:mm", Width = 70)] [EditorSequence(9)] [Caption("Finish 2")] public TimeSpan Finish2 { get; set; } [DurationEditor(Format = "hh:mm", Visible = Visible.Default, Editable = Editable.Enabled, Width = 70)] [EditorSequence(10)] [Caption("Break 2")] public TimeSpan Break2 { get; set; } [DoubleEditor(Format = "F2", Visible = Visible.Default, Editable = Editable.Disabled, Summary = Summary.Sum, Width = 70, Alignment = Alignment.MiddleCenter)] [EditorSequence(12)] [Caption("Total")] public double Duration { get; set; } protected override void DoPropertyChanged(string name, object before, object after) { base.DoPropertyChanged(name, before, after); if (times.ContainsKey(name)) Duration = RecalculateTimes(name, (TimeSpan)after); } private double RecalculateTimes(string name, TimeSpan after) { double result = 0.0F; result = GetTime("Finish", name, after) - (GetTime("Start", name, after) + GetTime("Break", name, after)); result = result + GetTime("Finish2", name, after) - (GetTime("Start2", name, after) + GetTime("Break2", name, after)); return result; } private double GetTime(string column, string name, TimeSpan after) { if (string.Equals(column, name)) return after.TotalHours; return times[column].Invoke(this).TotalHours; } public static EmployeeRosterItem[] FromJSON(String? json) { return !String.IsNullOrWhiteSpace(json) ? Serialization.Deserialize>(json)?.OrderBy(x => x.Day).ToArray() ?? new EmployeeRosterItem[] { } : new EmployeeRosterItem[] { }; } public static String ToJSON(EmployeeRosterItem[] items) { return Serialization.Serialize(items); } } }