public WorkMonth(int year, int month, GermanSpecialDays specialDays, WorkDayParserSettings parserSettings, float hoursPerDay) { this.parserSettings = parserSettings; this.year = year; this.month = month; this.hoursPerDay = hoursPerDay; this.Weeks = new ObservableCollection<WorkWeek>(); this.Days = new ObservableCollection<WorkDay>(); this.ShortCutStatistic = new QuickFillObservableCollection<ShortCutStatistic>(); // TODO which date should i take? this.ReloadShortcutStatistic(parserSettings.ShortCuts); var cal = new GregorianCalendar(); WorkWeek lastWeek = null; for (int day = 1; day <= cal.GetDaysInMonth(year, month); day++) { var dt = new DateTime(year, month, day); WorkDay wd = new WorkDay(year, month, day, specialDays); this.Days.Add(wd); var weekOfYear = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday); if (lastWeek == null || lastWeek.WeekOfYear != weekOfYear) { lastWeek = new WorkWeek(this, weekOfYear); lastWeek.PropertyChanged += new PropertyChangedEventHandler(this.WeekPropertyChanged); this.Weeks.Add(lastWeek); } lastWeek.AddDay(wd); } }
public WorkYear(int year, WorkDayParserSettings parserSettings, int hitListLookBackInWeeks, float hoursPerDay, PNSearchViewModel pnSearch, PositionSearchViewModel positionSearch) { this.hitListLookBackInWeeks = hitListLookBackInWeeks; this.pnSearch = pnSearch; this.positionSearch = positionSearch; this.Year = year; this.Months = new ObservableCollection <WorkMonth>(); var germanSpecialDays = SpecialDaysUtils.GetGermanSpecialDays(year); var calendar = new GregorianCalendar(); for (var month = 1; month <= calendar.GetMonthsInYear(year); month++) { var workMonth = new WorkMonth(year, month, germanSpecialDays, parserSettings, hoursPerDay); this.Months.Add(workMonth); } this.ProjectHitlist = new QuickFillObservableCollection <HitlistInfo>(); this.PositionHitlist = new QuickFillObservableCollection <HitlistInfo>(); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => { this.UpdateProjectHitlistAsync().SafeFireAndForget(onException: exception => { logger.Error(exception, "Error while updating the Project Hitlist."); }); this.UpdatePositionHitlistAsync().SafeFireAndForget(onException: exception => { logger.Error(exception, "Error while updating the Position Hitlist."); }); foreach (var month in this.Months) { foreach (var week in month.Weeks) { week.PropertyChanged += this.WorkWeek_PropertyChanged; } } })); }
public WorkMonth(int year, int month, GermanSpecialDays specialDays, WorkDayParserSettings parserSettings, float hoursPerDay) { this.year = year; this.month = month; this.hoursPerDay = hoursPerDay; this.Weeks = new ObservableCollection <WorkWeek>(); this.Days = new ObservableCollection <WorkDay>(); this.ShortCutStatistic = new QuickFillObservableCollection <ShortCutStatistic>(); // TODO which date should i take? this.ReloadShortcutStatistic(parserSettings.ShortCuts); var cal = CultureInfo.CurrentCulture.Calendar; WorkWeek lastWeek = null; for (int day = 1; day <= cal.GetDaysInMonth(year, month); day++) { var dt = new DateTime(year, month, day); WorkDay wd = new WorkDay(year, month, day, specialDays); this.Days.Add(wd); var weekOfYear = cal.GetWeekOfYear(dt); if (lastWeek == null || lastWeek.WeekOfYear != weekOfYear) { lastWeek = new WorkWeek(this, weekOfYear); lastWeek.PropertyChanged += new PropertyChangedEventHandler(this.WeekPropertyChanged); this.Weeks.Add(lastWeek); } lastWeek.AddDay(wd); } }
public WorkYear(int year, WorkDayParserSettings parserSettings, int hitListLookBackInWeeks, float hoursPerDay, PNSearchViewModel pnSearch, PositionSearchViewModel positionSearch) { this.hitListLookBackInWeeks = hitListLookBackInWeeks; this.pnSearch = pnSearch; this.positionSearch = positionSearch; this.Year = year; this.Months = new ObservableCollection <WorkMonth>(); this.Weeks = new ObservableCollection <WorkWeek>(); var germanSpecialDays = SpecialDaysUtils.GetGermanSpecialDays(year); var cal = new GregorianCalendar(); for (int month = 1; month <= cal.GetMonthsInYear(year); month++) { WorkMonth wm = new WorkMonth(year, month, germanSpecialDays, parserSettings, hoursPerDay); this.Months.Add(wm); foreach (var workWeek in wm.Weeks) { this.Weeks.Add(workWeek); workWeek.PropertyChanged += this.workWeek_PropertyChanged; } } this.ProjectHitlist = new QuickFillObservableCollection <HitlistInfo>(); this.PositionHitlist = new QuickFillObservableCollection <HitlistInfo>(); this.UpdateProjectHitlistAsync(); this.UpdatePositionHitlistAsync(); }
public void WDParser_HoleDayExpansionAndNormalExpansionShareSameKey_ReturnBothExpansions() { var abbr = new List<ShortCut>(); abbr.Add(new ShortCut("a", "11111-111(b)") { WholeDayExpansion = false }); abbr.Add(new ShortCut("a", "8,8;11111-111(b)") { WholeDayExpansion = true }); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); // find wholeday expansion WorkDay wd = new WorkDay(1, 1, 1, null); var workItemParserResult = wdp.Parse("a", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(8), new TimeItem(16), "11111", "111", "b") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); Assert.AreEqual(8, wd.HoursDuration); // find normal expansion wd = new WorkDay(1, 1, 2, null); workItemParserResult = wdp.Parse("8,8;a", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(8), new TimeItem(16), "11111", "111", "b") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); Assert.AreEqual(8, wd.HoursDuration); }
public WorkYear(int year, WorkDayParserSettings parserSettings, int hitListLookBackInWeeks, float hoursPerDay, PNSearchViewModel pnSearch, PositionSearchViewModel positionSearch) { this.hitListLookBackInWeeks = hitListLookBackInWeeks; this.pnSearch = pnSearch; this.positionSearch = positionSearch; this.Year = year; this.Months = new ObservableCollection<WorkMonth>(); this.Weeks = new ObservableCollection<WorkWeek>(); var germanSpecialDays = SpecialDaysUtils.GetGermanSpecialDays(year); var cal = new GregorianCalendar(); for (int month = 1; month <= cal.GetMonthsInYear(year); month++) { WorkMonth wm = new WorkMonth(year, month, germanSpecialDays, parserSettings, hoursPerDay); this.Months.Add(wm); foreach (var workWeek in wm.Weeks) { this.Weeks.Add(workWeek); workWeek.PropertyChanged += this.workWeek_PropertyChanged; } } this.ProjectHitlist = new QuickFillObservableCollection<HitlistInfo>(); this.PositionHitlist = new QuickFillObservableCollection<HitlistInfo>(); this.UpdateProjectHitlistAsync(); this.UpdatePositionHitlistAsync(); }
public void WDParser_DestroyBreakWithAbsolutTimes_ShouldGiveError() { WorkDay wd = new WorkDay(1, 1, 1, null); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { DayBreakDurationInMinutes = 30, InsertDayBreak = true, DayBreakTime = new TimeItem(12) }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("7:30,-11;11111-111,-11:45;11111-111,-12:15;11111-111,-15;11111-111", ref wd); Assert.IsFalse(workItemParserResult.Success, workItemParserResult.Error); }
public void WDParser_BrokenHoursWithBreak_CalculateCorrectly() { WorkDay wd = new WorkDay(1, 1, 1, null); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { DayBreakDurationInMinutes = 30, InsertDayBreak = true, DayBreakTime = new TimeItem(12) }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("8:15,-15:30;11111-111,1;11111-111", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(8, 15), new TimeItem(12, 00), "11111", "111"), new WorkItem(new TimeItem(12, 30), new TimeItem(15, 30), "11111", "111"), new WorkItem(new TimeItem(15, 30), new TimeItem(16, 30), "11111", "111") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); Assert.AreEqual(7.75, wd.HoursDuration); }
public void ShortCutStatistic_OnAMonth_ShouldSumCorrect() { var abbr = new List<ShortCut>(); abbr.Add(new ShortCut("ctb", "11111-111")); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr, InsertDayBreak = false }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); WorkDayParser.Instance = wdp; WorkMonth wm = new WorkMonth(2011, 1, null, workDayParserSettings, 1); WorkDay wd = wm.Days.First(); wd.OriginalString = "8,8;ctb"; wm.CalcShortCutStatistic(); var scs = wm.ShortCutStatistic.FirstOrDefault(s => s.Key == "ctb"); Assert.NotNull(scs); Assert.AreEqual(8, scs.UsedInMonth); }
public void WDParser_HoleDayExpansion_UseCompleteString() { WorkDay wd = new WorkDay(1, 1, 1, null); var abbr = new List<ShortCut>(); abbr.Add(new ShortCut("krank", "8,8;11111-111(krank)") { WholeDayExpansion = true }); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("krank", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(8), new TimeItem(16), "11111", "111", "krank") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); Assert.AreEqual(8, wd.HoursDuration); }
public void WDParser_PartEndsAtBreakTime_AddBreakCorrectly() { WorkDay wd = new WorkDay(1, 1, 1, null); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { DayBreakDurationInMinutes = 30, InsertDayBreak = true, DayBreakTime = new TimeItem(12) }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("8,4;11111-111,4;11111-111", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(8), new TimeItem(12, 00), "11111", "111"), new WorkItem(new TimeItem(12, 30), new TimeItem(16, 30), "11111", "111") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); Assert.AreEqual(8, wd.HoursDuration); }
public void WDParser_ShortcutLinkInWorkItem_WholeDayShortcut() { WorkDay wd = new WorkDay(1, 1, 1, null); var abbr = new List<ShortCut>(); var shortCut = new ShortCut("a", "8,8;11111-111(aa)") { WholeDayExpansion = true }; abbr.Add(shortCut); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("a", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(8), new TimeItem(16), "11111", "111", "aa") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); Assert.AreEqual(8, wd.HoursDuration); Assert.AreEqual(shortCut, wd.Items.First().ShortCut); }
public WorkDayParser(WorkDayParserSettings settings) { this.settings = settings; }
public void WriteJson() { var parserSettings = new WorkDayParserSettings(); parserSettings.ShortCuts.Add(new ShortCut("ctbn", "25482-420(features)")); parserSettings.ShortCuts.Add(new ShortCut("ctbp", "25482-811(performanceverbesserungen)")); parserSettings.ShortCuts.Add(new ShortCut("ctbf", "25482-811(tracker)")); parserSettings.ShortCuts.Add(new ShortCut("ctbm", "25482-140(meeting)")); parserSettings.ShortCuts.Add(new ShortCut("ctbr", "25482-050(ac-hh-ac)")); parserSettings.ShortCuts.Add(new ShortCut("ktln", "25710-420(feature)")); parserSettings.ShortCuts.Add(new ShortCut("ktlf", "25710-811(tracker)")); parserSettings.ShortCuts.Add(new ShortCut("ktlm", "25710-140(meeting)")); parserSettings.ShortCuts.Add(new ShortCut("ktlr", "25710-050(reise)")); parserSettings.ShortCuts.Add(new ShortCut("u", "20030-000(urlaub)")); parserSettings.ShortCuts.Add(new ShortCut("krank", "20020-000(krank/doc)")); parserSettings.ShortCuts.Add(new ShortCut("tm", "20018-140(terminalmeeting)")); parserSettings.ShortCuts.Add(new ShortCut("mm", "20018-140(tess/monatsmeeting)")); parserSettings.ShortCuts.Add(new ShortCut("swe", "20308-000(swe projekt)")); parserSettings.ShortCuts.Add(new ShortCut("jmb", "20308-000(jean-marie ausbildungsbetreuung)")); parserSettings.ShortCuts.Add(new ShortCut("w", "20180-000(weiterbildung)")); parserSettings.InsertDayBreak = true; parserSettings.DayBreakTime = new TimeItem(12); parserSettings.DayBreakDurationInMinutes = 30; var mainSettings = new MainSettings(); MoniSettings ms = new MoniSettings(); ms.ParserSettings = parserSettings; ms.MainSettings = mainSettings; var serializeObject = JsonConvert.SerializeObject(ms, Formatting.Indented); File.WriteAllText("settings.json.test", serializeObject); }
public void WDParser_UseAbbreviationsAndDesc_ExpandAbbreviationsAndOverwriteDescFromAbbr() { WorkDay wd = new WorkDay(1, 1, 1, null); var abbr = new List<ShortCut>(); abbr.Add(new ShortCut("ctb", "11111-111(donotuseme)")); abbr.Add(new ShortCut("ktl", "22222-222(useme)")); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("9:00,2;ctb(useme),2;ktl", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(9, 0), new TimeItem(11, 0), "11111", "111", "useme", null, string.Empty), new WorkItem(new TimeItem(11, 0), new TimeItem(13, 0), "22222", "222", "useme", null, string.Empty) }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); }
public void WDParser_UseAbbreviations_ExpandAbbreviations() { WorkDay wd = new WorkDay(1, 1, 1, null); var abbr = new List<ShortCut>(); abbr.Add(new ShortCut("ctb", "11111-111")); abbr.Add(new ShortCut("ktl", "22222-222")); abbr.Add(new ShortCut("u", "33333-333")); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("9:00,2;ctb,1;u", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(9, 0), new TimeItem(11, 0), "11111", "111"), new WorkItem(new TimeItem(11, 0), new TimeItem(12, 00), "33333", "333") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); }
public void WDParser_InsteadOfHoursICanTellAnEndTime_UseEndTime() { WorkDay wd = new WorkDay(1, 1, 1, null); var abbr = new List<ShortCut>(); abbr.Add(new ShortCut("ctb", "11111-111")); abbr.Add(new ShortCut("ktl", "22222-222")); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("9:00,-12;ctb,-15;ktl", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(9, 0), new TimeItem(12, 0), "11111", "111"), new WorkItem(new TimeItem(12, 0), new TimeItem(15, 0), "22222", "222") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); }
public void WDParser_UsingEndTimeAndBreak_CalculateBreak() { WorkDay wd = new WorkDay(1, 1, 1, null); var abbr = new List<ShortCut>(); abbr.Add(new ShortCut("ctb", "11111-111")); abbr.Add(new ShortCut("ktl", "22222-222")); WorkDayParserSettings workDayParserSettings = new WorkDayParserSettings { ShortCuts = abbr, DayBreakDurationInMinutes = 30, InsertDayBreak = true, DayBreakTime = new TimeItem(12) }; WorkDayParser wdp = new WorkDayParser(workDayParserSettings); var workItemParserResult = wdp.Parse("9:00,-14;ctb,-16;ktl", ref wd); Assert.IsTrue(workItemParserResult.Success, workItemParserResult.Error); CollectionAssert.IsNotEmpty(wd.Items); CollectionAssert.AreEqual(new[] { new WorkItem(new TimeItem(9, 0), new TimeItem(12, 0), "11111", "111"), new WorkItem(new TimeItem(12, 30), new TimeItem(14, 0), "11111", "111"), new WorkItem(new TimeItem(14, 0), new TimeItem(16, 0), "22222", "222") }, wd.Items); Assert.IsEmpty(workItemParserResult.Error); }