public List <KISTime> generateKISTimes(WorktimeStatistics wts, DateTime startDay) { var totalWorkTime = wts.totalWorktime; var currentStartTime = startDay.Date + DayStartTime; groupByKisProjectsTimes(wts); var kisTimeSpans = generateKisTimeSpans(wts); quantizeKisTimeSpansToQuarter(kisTimeSpans, wts.totalWorktime); var kisTimes = generateKisTimes(kisTimeSpans, currentStartTime); kisTimes = addLunchBreak(kisTimes); return(kisTimes); }
private List <KISTimeSpan> generateKisTimeSpans(WorktimeStatistics wts) { var kisTimeSpans = new List <KISTimeSpan>(); foreach (var project in wts.relativeProjectTimes) { string projectName = project.Key; float projectFraction = project.Value; TimeSpan projectSpan = TimeSpan.FromTicks(Convert.ToInt64(wts.totalWorktime.Ticks * (projectFraction / 100))); kisTimeSpans.Add(new KISTimeSpan( projectSpan, projectName, wts.projectComments.ContainsKey(projectName) ? new HashSet <string>(wts.projectComments[projectName].Keys.ToArray()) : null) ); } return(kisTimeSpans); }
private void groupByKisProjectsTimes(WorktimeStatistics wts) { var newRelativeProjectTimes = new Dictionary <string, float>(); var newComments = new Dictionary <string, Dictionary <string, TimeSpan> >(); foreach (var project in wts.relativeProjectTimes) { string projectName = project.Key; string kisProjectName = mapToKisProject(projectName); float projectFraction = project.Value; if (!newRelativeProjectTimes.ContainsKey(kisProjectName)) { newRelativeProjectTimes[kisProjectName] = 0.0f; } newRelativeProjectTimes[kisProjectName] += projectFraction; if (!newComments.ContainsKey(kisProjectName)) { newComments[kisProjectName] = wts.projectComments[projectName]; } else { foreach (var comment in wts.projectComments[projectName]) { if (!newComments[kisProjectName].ContainsKey(comment.Key)) { newComments[kisProjectName][comment.Key] = new TimeSpan(); } newComments[kisProjectName][comment.Key] += comment.Value; } } } wts.relativeProjectTimes = newRelativeProjectTimes; wts.projectComments = newComments; }
public void WorkOvertime2Project() { var mainHandler = new ProjectChangeHandler(); var projectAnalysisHandler = new ProjectChangeNotifierAnalysis(mainHandler); var wtanalyzer = new WorktimeAnalyzer(new WorktimeRecordStorageInMemory(), mainHandler); var obj = new PrivateObject(wtanalyzer); var origOvertime = ProjectTracker.Properties.Settings.Default.maxWorktime; var availableProject = ProjectTracker.Properties.Settings.Default.AvailableProjects; if (availableProject.Count < 2) { throw new Exception("Project must have at least 2 available projects for this test to run"); } try { ProjectTracker.Properties.Settings.Default.maxWorktime = "04:00"; var originalWts = new WorktimeStatistics(); originalWts.projectTimes = new System.Collections.Generic.Dictionary <string, TimeSpan> { { availableProject[0], new TimeSpan(2, 0, 0) }, { availableProject[1], new TimeSpan(6, 0, 0) } }; originalWts.totalTime = new TimeSpan(8, 0, 0); originalWts.totalWorktime = new TimeSpan(8, 0, 0); originalWts.totalProjectTime = new TimeSpan(8, 0, 0); var expectedStats = new WorktimeStatistics(); expectedStats.projectTimes = new System.Collections.Generic.Dictionary <string, TimeSpan> { { availableProject[0], new TimeSpan(0, 0, 0) }, { availableProject[1], new TimeSpan(4, 0, 0) } }; expectedStats.relativeProjectTimes = new System.Collections.Generic.Dictionary <string, float> { { availableProject[0], 0f }, { availableProject[1], 100f } }; expectedStats.totalTime = new TimeSpan(4, 0, 0); expectedStats.totalWorktime = new TimeSpan(4, 0, 0); expectedStats.totalProjectTime = new TimeSpan(4, 0, 0); var originalOvertime = new Dictionary <string, TimeSpan> { { availableProject[0], new TimeSpan(1, 0, 0) }, { availableProject[1], new TimeSpan(1, 0, 0) } }; var expectedOvertime = new Dictionary <string, TimeSpan> { { availableProject[0], new TimeSpan(3, 0, 0) }, { availableProject[1], new TimeSpan(3, 0, 0) } }; object[] args = new object[] { originalWts, originalOvertime }; var ret = (Tuple <WorktimeStatistics, Dictionary <string, TimeSpan> >)obj.Invoke("calculateOvertimeUndertimeForTesting", args); var retStats = ret.Item1; var retOvertime = ret.Item2; CollectionComparer.AssertDictionaryEqual(retStats.projectTimes, expectedStats.projectTimes); CollectionComparer.AssertDictionaryEqual(retStats.relativeProjectTimes, expectedStats.relativeProjectTimes); Assert.AreEqual(expectedStats.totalTime, retStats.totalTime); Assert.AreEqual(expectedStats.totalWorktime, retStats.totalWorktime); Assert.AreEqual(expectedStats.totalProjectTime, retStats.totalProjectTime); CollectionComparer.AssertDictionaryEqual(retOvertime, expectedOvertime); } finally { ProjectTracker.Properties.Settings.Default.maxWorktime = origOvertime; } }