using System; using System.Collections.Generic; using System.Linq; using System.Windows; using Comal.Classes; using InABox.Clients; using InABox.Configuration; using InABox.Core; using InABox.Wpf; namespace PRSDesktop { /// /// Interaction logic for WindowTrackerSummary.xaml /// public partial class WindowTrackerSummary : ThemableWindow { private readonly DailyActivityHistory ActivityHistory; private readonly WindowTrackerHistoryGrid history = new(); private readonly Dictionary> settingsmap = new(); private readonly WindowTracker[] trackers; public WindowTrackerSummary(Guid employeeid, DateTime date) { EmployeeID = employeeid; Date = date; InitializeComponent(); grid.Children.Add(history); trackers = ClientFactory.IsSupported() ? new Client().Load(new Filter(x => x.Employee.ID).IsEqualTo(employeeid)) : new WindowTracker[] { }; var timestamps = new List(); ActivityHistory = new LocalConfiguration().Load(); var consolidated = new Dictionary(); var curact = ""; var curstart = DateTime.MinValue; var curend = DateTime.MinValue; foreach (var activity in ActivityHistory.Activities.Where(x => x.Key.Date.Equals(date)).OrderBy(x => x.Key)) { var act = string.IsNullOrWhiteSpace(activity.Value) ? "" : activity.Value; if (!act.Equals(curact)) { if (curstart != DateTime.MinValue && curend.Subtract(curstart) > new TimeSpan(0, 1, 0)) { CreateSummary(curstart, curend, curact, timestamps); timestamps = new List(); } curstart = curend != DateTime.MinValue ? curend : activity.Key; curact = act; } curend = activity.Key; timestamps.Add(activity.Key); } if (curstart != DateTime.MinValue && curend.Subtract(curstart) > new TimeSpan(0, 1, 0)) CreateSummary(curstart, curend, curact, timestamps); history.Refresh(true, true); } public DateTime Date { get; } public Guid EmployeeID { get; } private void CreateSummary(DateTime start, DateTime finish, string title, List timestamps) { var tracker = trackers.FirstOrDefault(x => x.Window.Equals(title)); var item = new WindowTrackerHistory { Start = start.TimeOfDay, Finish = finish.TimeOfDay, Window = title, Tracker = tracker != null ? tracker.ID : Guid.Empty }; item.Employee.ID = EmployeeID; item.Job.ID = tracker != null ? tracker.Job.ID : Guid.Empty; item.ITP.ID = tracker != null ? tracker.ITP.ID : Guid.Empty; item.Activity.ID = tracker != null ? tracker.Activity.ID : Guid.Empty; history.History.Add(item); settingsmap[item] = timestamps; } private void Cancel_Click(object sender, RoutedEventArgs e) { DialogResult = false; } private void OK_Click(object sender, RoutedEventArgs e) { var updates = new List(); var bFirst = true; var start = new TimeSpan(0); var finish = new TimeSpan(0); var activities = new List(); var jobid = CoreUtils.FullGuid; var itpid = CoreUtils.FullGuid; var actid = CoreUtils.FullGuid; foreach (var item in history.History) { if (item.Job.ID != jobid || item.Activity.ID != actid) { if (!bFirst) { var update = CreateAssignment(start, finish, activities, jobid, itpid, actid); updates.Add(update); } bFirst = false; start = item.Start; jobid = item.Job.ID; itpid = item.ITP.ID; actid = item.Activity.ID; } if (!activities.Contains(item.Window)) activities.Add(item.Window); finish = item.Finish; foreach (var timestamp in settingsmap[item]) if (ActivityHistory.Activities.ContainsKey(timestamp)) ActivityHistory.Activities.Remove(timestamp); } if (jobid != Guid.Empty || actid != Guid.Empty) { var update = CreateAssignment(start, finish, activities, jobid, itpid, actid); updates.Add(update); } if (updates.Any()) { new LocalConfiguration().Save(ActivityHistory); new Client().Save(updates, "Added by Daily Report Window Tracker"); DialogResult = true; Close(); } else { MessageBox.Show("Nothing to Update!"); } } private Assignment CreateAssignment(TimeSpan start, TimeSpan finish, List activities, Guid jobid, Guid itpid, Guid actid) { var update = new Assignment(); update.JobLink.ID = jobid; update.ITP.ID = itpid; update.ActivityLink.ID = actid; update.EmployeeLink.ID = EmployeeID; update.Date = Date; update.Actual.Start = start; update.Actual.Finish = finish; update.Actual.Duration = finish.Subtract(start); update.Title = activities.First(); update.Description = string.Join("\n", activities.Skip(1)); activities.Clear(); return update; } } }