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); } }
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(); }
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; } }
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(); } }
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; } } } }
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); } }
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); }
private void UpdateWorkTime() { WorkTime wt = listView.SelectedItem as WorkTime; UpdateWorkTime(wt, listView.SelectedItems.Count > 1); }
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; } }