using System; using System.Collections.Generic; using System.Linq; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Threading; using C4IT.FASD.Base; using static C4IT.Logging.cLogManager; namespace FasdDesktopUi.Basics.UserControls { public partial class TimerView : UserControl { #region Fields public event EventHandler OnPauseStarted; private static List startTimes = new List(); private static List endTimes = new List(); private static List pausedTimesStart = new List(); private static List pausedTimesEnd = new List(); public static List caseTimes = new List(); private static Dictionary finalWorkingTimes = new Dictionary(); private static DispatcherTimer timer; private static TimeSpan elapsedTime; private static TimeSpan totalPausedTime = TimeSpan.Zero; private static TimeSpan pauseDuration; #endregion #region public TimerView() { InitializeComponent(); } public static void ResetTimer() { startTimes.Clear(); endTimes.Clear(); pausedTimesEnd.Clear(); pausedTimesStart.Clear(); finalWorkingTimes.Clear(); elapsedTime = TimeSpan.Zero; caseTimes.Clear(); StartTimer(); } public static void StartTimer() { try { startTimes?.Add(DateTime.UtcNow); timer?.Start(); } catch (Exception E) { LogException(E); } } public void StopTimer() { try { endTimes?.Add(DateTime.UtcNow); timer?.Stop(); UpdateTimerControl(); } catch (Exception E) { LogException(E); } } private void UserControl_Initialized(object sender, EventArgs e) { try { ResetTimer(); timer = new DispatcherTimer(TimeSpan.FromSeconds(1.0), DispatcherPriority.Loaded, new EventHandler((s, args) => { try { UpdateTimerControl(); } catch { } }), Dispatcher.CurrentDispatcher); } catch (Exception E) { LogException(E); } } private void UpdateTimerControl() { try { TimerControl.Text = elapsedTime.ToString(@"hh\:mm\:ss"); elapsedTime = elapsedTime.Add(TimeSpan.FromSeconds(1.0)); } catch (Exception E) { LogException(E); } } public static Dictionary GetWorkTimes() { try { var currentDate = DateTime.Now.Date.ToString("d"); var startDateTime = startTimes.First(); var endDateTime = DateTime.UtcNow; var bruttoWorkingTime = TimeSpan.Zero; var nettoWorkingTime = TimeSpan.Zero; if (pausedTimesStart.Count == 0) { totalPausedTime = TimeSpan.Zero; } if (pausedTimesEnd.Count > 0) { totalPausedTime = TimeSpan.Zero; for (int i = 0; i < pausedTimesStart.Count; i++) { var start = pausedTimesStart[i]; var end = pausedTimesEnd[i]; pauseDuration = end - start; totalPausedTime += pauseDuration; } } bruttoWorkingTime = endDateTime - startDateTime; nettoWorkingTime = bruttoWorkingTime - totalPausedTime; finalWorkingTimes = new Dictionary() { {"CurrentDate", currentDate}, {"StartTime", startTimes.First()}, {"EndTime", endDateTime }, {"BruttoWorkingTime", bruttoWorkingTime }, {"NettoWorkingTime", nettoWorkingTime.TotalSeconds }, {"TotalPausedTime", totalPausedTime } }; } catch (Exception E) { LogException(E); } return finalWorkingTimes; } #endregion #region Click-Events public void EndPause() { try { if (timer?.IsEnabled == true) return; timer?.Start(); pausedTimesEnd?.Add(DateTime.UtcNow); caseTimes.Add(new cF4SDCaseTime() { StatusId = CaseStatus.InProgress, CaseTime = DateTime.UtcNow }); } catch (Exception E) { LogException(E); } } private void PauseButton_Click() { try { timer?.Stop(); pausedTimesStart?.Add(DateTime.UtcNow); caseTimes.Add(new cF4SDCaseTime() { StatusId = CaseStatus.OnHold, CaseTime = DateTime.UtcNow }); if (OnPauseStarted != null) OnPauseStarted?.Invoke(this, new EventArgs()); } catch (Exception E) { LogException(E); } } private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { PauseButton_Click(); } #endregion private void Border_TouchDown(object sender, TouchEventArgs e) { PauseButton_Click(); } } }