private void UpdateStatus()
 {
     if (currentStartTime.HasValue)
     {
         var ts = DateTime.Now - currentStartTime.Value;
         textBlockStatus.Text = String.Format(Properties.Resources.TEXT_RECORD_START_0_1_2, currentStartTime.Value.ToShortDateString(), currentStartTime.Value.ToShortTimeString(), DurationValueConverter.Convert(ts));
     }
 }
        private void UpdateTotalHours()
        {
            double dur = WorkTime.CalculateTotalHours(workTimes);

            textBlockTotal.Text = string.Format(Properties.Resources.TEXT_TOTAL_0_1, datePicker.SelectedDate.Value.ToLongDateString(), DurationValueConverter.Convert(dur));
        }
        private void Calculate()
        {
            var oldcursor = Cursor;

            Cursor = Cursors.Wait;
            try
            {
                textBlockResult.Text = "";
                textBlockInfo.Text   = "";
                weekOvertimes.Clear();
                if (!datePickerStartDay.SelectedDate.HasValue ||
                    !double.TryParse(textBoxHoursPerWeek.Text, out double hoursPerWeek) ||
                    !double.TryParse(textBoxStartOverTimeHours.Text, out double overTimeBefore))
                {
                    return;
                }
                var from = datePickerStartDay.SelectedDate.Value.GetDayDateTime();
                var to   = DateTime.Today;
                textBlockInfo.Text = string.Format(Properties.Resources.TEXT_OVERTIME_0_1, from.ToLongDateString(), to.ToLongDateString());
                var freeDays = new HashSet <DateTime>();
                var halfDays = new HashSet <DateTime>();
                foreach (var nwd in database.SelectAllNonWorkingDays())
                {
                    for (var day = nwd.StartDay; day <= nwd.EndDay; day = day.AddDays(1.0))
                    {
                        freeDays.Add(day);
                        if (nwd.Hours == 4)
                        {
                            halfDays.Add(day);
                        }
                    }
                }
                var    weekInfo    = new Dictionary <Tuple <int, int>, Tuple <double, double> >();
                double overTime    = overTimeBefore;
                double hoursPerDay = hoursPerWeek / 5.0;
                var    dfi         = DateTimeFormatInfo.CurrentInfo;
                var    cal         = dfi.Calendar;
                var    dt          = from;
                while (dt < to)
                {
                    var hours      = WorkTime.CalculateTotalHours(database.SelectWorkTimes(dt));
                    var weekofyear = cal.GetWeekOfYear(dt, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
                    var key        = Tuple.Create(dt.Year, weekofyear);
                    if (!weekInfo.TryGetValue(key, out Tuple <double, double> t))
                    {
                        t             = Tuple.Create(0.0, 0.0);
                        weekInfo[key] = t;
                    }
                    if (!dt.IsWorkDay() || freeDays.Contains(dt))
                    {
                        if (dt.IsWorkDay() && halfDays.Contains(dt))
                        {
                            overTime     += hours - hoursPerDay / 2;
                            weekInfo[key] = Tuple.Create(t.Item1 + hours, t.Item2 + hoursPerDay / 2);
                        }
                        else
                        {
                            overTime     += hours;
                            weekInfo[key] = Tuple.Create(t.Item1 + hours, t.Item2);
                        }
                    }
                    else
                    {
                        overTime     += hours - hoursPerDay;
                        weekInfo[key] = Tuple.Create(t.Item1 + hours, t.Item2 + hoursPerDay);
                    }
                    dt = dt.AddDays(1.0);
                }
                textBlockResult.Text = string.Format(Properties.Resources.TEXT_TOTAL_OVERTIME_0, DurationValueConverter.Convert(overTime));
                var items = new List <WeekOvertime>();
                foreach (var elem in weekInfo)
                {
                    var weekovertime = new WeekOvertime(
                        elem.Key.Item1,
                        elem.Key.Item2,
                        elem.Value.Item1,
                        elem.Value.Item2);
                    items.Add(weekovertime);
                }
                items.Reverse();
                foreach (var item in items)
                {
                    weekOvertimes.Add(item);
                }
            }
            catch (Exception ex)
            {
                Cursor = oldcursor;
                HandleError(ex);
            }
            finally
            {
                Cursor = oldcursor;
            }
        }