Пример #1
0
 private void MergeWorkTimes()
 {
     try
     {
         if (listView.SelectedItems.Count < 2)
         {
             return;
         }
         WorkTime baseEntry       = listView.SelectedItem as WorkTime;
         var      startTime       = baseEntry.StartTime;
         var      endTime         = baseEntry.EndTime;
         var      deleteWorkTimes = new List <WorkTime>();
         foreach (WorkTime wt in listView.SelectedItems)
         {
             if (wt.Id != baseEntry.Id)
             {
                 if (wt.StartTime < startTime)
                 {
                     startTime = wt.StartTime;
                 }
                 if (wt.EndTime > endTime)
                 {
                     endTime = wt.EndTime;
                 }
                 deleteWorkTimes.Add(wt);
             }
         }
         if (MessageBox.Show(
                 Properties.Resources.QUESTION_MERGE_ITEMS,
                 Title, MessageBoxButton.YesNo,
                 MessageBoxImage.Question,
                 MessageBoxResult.No) == MessageBoxResult.Yes)
         {
             var idx = listView.SelectedIndex;
             baseEntry.StartTime = startTime;
             baseEntry.EndTime   = endTime;
             database.UpdateWorkTime(baseEntry);
             foreach (var wt in deleteWorkTimes)
             {
                 database.DeleteWorkTime(wt);
                 workTimes.Remove(wt);
             }
             UpdateTotalHours();
             idx = Math.Min(idx, listView.Items.Count - 1);
             if (idx >= 0)
             {
                 listView.SelectedIndex = idx;
                 listView.FocusItem(idx);
             }
         }
     }
     catch (Exception ex)
     {
         HandleError(ex);
     }
 }
Пример #2
0
 public EditWindow(Window owner, string title, WorkTime wt, ObservableCollection <Project> projects, bool multipleSelection, DateTime?defaultDateTime = null, Project defaultProject = null)
 {
     Owner = owner;
     Title = title;
     InitializeComponent();
     WindowStartupLocation       = WindowStartupLocation.CenterOwner;
     comboBoxProject.ItemsSource = projects;
     if (wt != null)
     {
         WorkTime = wt;
         datePicker.SelectedDate = wt.StartTime;
         datePicker.IsEnabled    = false;
         textBoxStartHour.Text   = wt.StartTime.Hour.ToString("00");
         textBoxStartMinute.Text = wt.StartTime.Minute.ToString("00");
         textBoxEndHour.Text     = wt.EndTime.Hour.ToString("00");
         textBoxEndMinute.Text   = wt.EndTime.Minute.ToString("00");
         textBoxDescription.Text = wt.Description;
         foreach (var p in projects)
         {
             if (p.Name == wt.Project.Name)
             {
                 comboBoxProject.SelectedItem = p;
             }
         }
         if (multipleSelection)
         {
             textBoxStartHour.IsEnabled   = false;
             textBoxStartMinute.IsEnabled = false;
             textBoxEndHour.IsEnabled     = false;
             textBoxEndMinute.IsEnabled   = false;
             textBoxDescription.IsEnabled = false;
         }
     }
     else
     {
         WorkTime = new WorkTime();
         datePicker.SelectedDate      = defaultDateTime;
         comboBoxProject.SelectedItem = defaultProject;
         textBoxStartHour.Text        = "00";
         textBoxStartMinute.Text      = "00";
         textBoxEndHour.Text          = "00";
         textBoxEndMinute.Text        = "00";
     }
     if (multipleSelection)
     {
         comboBoxProject.Focus();
     }
     else
     {
         textBoxStartHour.Focus();
     }
     UpdateControls();
 }
Пример #3
0
 public void InsertWorkTime(WorkTime wt)
 {
     using (var cmd = new SQLiteCommand(con))
     {
         cmd.CommandText = "INSERT INTO worktime VALUES(@p1,@p2,@p3,@p4)";
         cmd.Parameters.Add(new SQLiteParameter("@p1", ((DateTimeOffset)wt.StartTime.ToUniversalTime()).ToUnixTimeSeconds()));
         cmd.Parameters.Add(new SQLiteParameter("@p2", ((DateTimeOffset)wt.EndTime.ToUniversalTime()).ToUnixTimeSeconds()));
         cmd.Parameters.Add(new SQLiteParameter("@p3", wt.Project.Id));
         cmd.Parameters.Add(new SQLiteParameter("@p4", wt.Description));
         cmd.ExecuteNonQuery();
         wt.Id = con.LastInsertRowId;
     }
 }
Пример #4
0
 public void UpdateWorkTime(WorkTime wt)
 {
     using (var cmd = new SQLiteCommand(con))
     {
         cmd.CommandText = "UPDATE worktime SET starttime=@p1,endtime=@p2,projectid=@p3,description=@p4 WHERE rowid=@p5";
         cmd.Parameters.Add(new SQLiteParameter("@p1", ((DateTimeOffset)wt.StartTime.ToUniversalTime()).ToUnixTimeSeconds()));
         cmd.Parameters.Add(new SQLiteParameter("@p2", ((DateTimeOffset)wt.EndTime.ToUniversalTime()).ToUnixTimeSeconds()));
         cmd.Parameters.Add(new SQLiteParameter("@p3", wt.Project.Id));
         cmd.Parameters.Add(new SQLiteParameter("@p4", wt.Description));
         cmd.Parameters.Add(new SQLiteParameter("@p5", wt.Id));
         cmd.ExecuteNonQuery();
     }
 }
Пример #5
0
 private void SelectWorkTime(WorkTime wt)
 {
     for (int idx = 0; idx < listView.Items.Count; idx++)
     {
         if (listView.Items[idx] is WorkTime w)
         {
             if (w.Id == wt.Id)
             {
                 listView.ScrollIntoView(w);
                 listView.SelectedIndex = idx;
                 listView.FocusItem(idx);
                 break;
             }
         }
     }
 }
Пример #6
0
 private void Stop()
 {
     try
     {
         var project = comboBoxProject.SelectedItem as Project;
         if (!currentStartTime.HasValue || project == null)
         {
             return;
         }
         var ts = DateTime.Now - currentStartTime.Value;
         // RemoveDisconnect and RemoteConnect events are fired twice
         // store working times only if longer than 1 minute
         if (ts.TotalMinutes >= 1.0)
         {
             var wt = new WorkTime
             {
                 StartTime   = currentStartTime.Value,
                 EndTime     = DateTime.Now,
                 Project     = project,
                 Description = string.Empty
             };
             // @TODO: add 2 work times if start time and end time is on a different day?
             database.InsertWorkTime(wt);
             if (!datePicker.SelectedDate.HasValue ||
                 !wt.EndTime.IsSameDay(datePicker.SelectedDate.Value))
             {
                 datePicker.SelectedDate = wt.EndTime;
             }
             else
             {
                 workTimes.Add(wt);
                 UpdateTotalHours();
             }
             SelectWorkTime(wt);
         }
         currentStartTime     = null;
         textBlockStatus.Text = Properties.Resources.TEXT_RECORD_STOP;
     }
     catch (Exception ex)
     {
         HandleError(ex);
     }
 }
Пример #7
0
        public List <WorkTime> SelectWorkTimes(DateTime day)
        {
            var st  = new DateTime(day.Year, day.Month, day.Day, 0, 0, 0).ToUniversalTime();
            var et  = new DateTime(day.Year, day.Month, day.Day, 23, 59, 59).ToUniversalTime();
            var ret = new List <WorkTime>();

            using (var cmd = new SQLiteCommand(con))
            {
                cmd.CommandText =
                    "SELECT wt.rowid, starttime, endtime, p.rowid, p.name, description " +
                    "FROM worktime wt, project p " +
                    "WHERE starttime >= @p1 AND starttime <= @p2 AND wt.projectid = p.rowid";
                cmd.Parameters.Add(new SQLiteParameter("@p1", ((DateTimeOffset)st).ToUnixTimeSeconds()));
                cmd.Parameters.Add(new SQLiteParameter("@p2", ((DateTimeOffset)et).ToUnixTimeSeconds()));
                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            var wt = new WorkTime
                            {
                                Id        = reader.GetInt64(0),
                                StartTime = DateTimeOffset.FromUnixTimeSeconds(reader.GetInt64(1)).DateTime.ToLocalTime(),
                                EndTime   = DateTimeOffset.FromUnixTimeSeconds(reader.GetInt64(2)).DateTime.ToLocalTime(),
                                Project   = new Project {
                                    Id = reader.GetInt64(3), Name = reader.GetString(4)
                                },
                                Description = reader.GetString(5)
                            };
                            ret.Add(wt);
                        }
                    }
                }
            }
            return(ret);
        }
Пример #8
0
        private void UpdateWorkTime()
        {
            WorkTime wt = listView.SelectedItem as WorkTime;

            UpdateWorkTime(wt, listView.SelectedItems.Count > 1);
        }
Пример #9
0
        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;
            }
        }