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;
        }
Esempio n. 4
0
        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;
            }
        }