| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | 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<string, Func<EmployeeRosterItem, TimeSpan>> times = new  Dictionary<string, Func<EmployeeRosterItem, TimeSpan>>()        {            { "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<List<EmployeeRosterItem>>(json)?.OrderBy(x => x.Day).ToArray()                   ?? new EmployeeRosterItem[] { }                : new EmployeeRosterItem[] { };        }        public static String ToJSON(EmployeeRosterItem[] items)        {            return Serialization.Serialize(items);        }    }}
 |