private PersonReport GetPersonReport(PersonWorkMonth personWorkMonth)
        {
            var tasksReport = new List<TaskReport>();

            foreach (var day in personWorkMonth.WorkDays)
            {
                foreach (var task in day.Tasks)
                {
                    var reportTask = new TaskReport
                    {
                        Task = task,
                        WorkingHours = task.Hours.Value,
                        Date = day.Date
                    };

                    tasksReport.Add(reportTask);
                }
            }

            var personWorkDayReport = new PersonReport
            {
                Person = personWorkMonth.Person,
                ReportTasks = tasksReport
            };

            return personWorkDayReport;
        }
        public TimeSpan FullWorkTime(PersonWorkMonth personWorkMonth)
        {
            var result = TimeSpan.Zero;

            if (personWorkMonth.WorkDays == null)
                return result;

            foreach (var workDay in personWorkMonth.WorkDays)
            {
                result = result.Add(workDay.WorkingHours);
            }

            return result;
        }
        public TimeSpan ActualWorkTime(PersonWorkMonth personWorkMonth)
        {
            var result = TimeSpan.Zero;

            if (personWorkMonth.PersonTasks == null)
                return result;

            foreach (var personTasks in personWorkMonth.PersonTasks)
            {
                if (personTasks.Hours != null)
                    result = result.Add(personTasks.Hours.Value);
            }

            return result;
        }
        public void FillWorkDays(PersonWorkMonth personWorkMonth)
        {
            var currentDate = new DateTime(personWorkMonth.Year, personWorkMonth.Month, 1);
               var workDays = GetWorkDays(personWorkMonth.Person.EmployeeCode, currentDate);

            if (workDays == null)
            {
                Trace.TraceWarning("Cannot get work days for {0}", personWorkMonth.Person.LastName);
                return;
            }

            foreach (var workDay in workDays)
            {
                var personWorkDay = personWorkMonth.WorkDays.FirstOrDefault(item => item.Date.Equals(workDay.Date));
                if (personWorkDay == null)
                {
                    personWorkMonth.WorkDays.Add(workDay);
                }
            }
        }
        public PersonWorkMonth TimeManager_GetPersonWorkMonthWithoutData()
        {
            const int year = 2015;
            const int month = 11;

            var projects = new ProjectFactory().GetProjects();
            var products = new ProductFactory().GetProducts();
            var person = new PersonFactory().GetPersons(projects[0], products[0]);

            var personWorkMonth = new PersonWorkMonth
            {
                Person = person[0],
                Year = year,
                Month = month,
                PersonTasks = null,
                WorkDays = null
            };

            return personWorkMonth;
        }
        public PersonWorkMonth TimeManager_GetPersonWorkMonthWithData(int daysCount, int tasksCount)
        {
            var projects = new ProjectFactory().GetProjects();
            var products = new ProductFactory().GetProducts();
            var person = new PersonFactory().GetPersons(projects[0], products[0]);
            var workDaysFactory = new WorkDayFactory();
            var tasksFactory = new TaskFactory();

            var personWorkMonth = new PersonWorkMonth
            {
                Person = person[0],
                Year = Year,
                Month = Month,
                PersonTasks = tasksFactory.GetJiraTasks(tasksCount),
                WorkDays = workDaysFactory.GetWorkDays(Year, Month, daysCount)
            };

            var timeManager = new PersonTimeManager(new TimeSpan(8, 0, 0));
            personWorkMonth.PersonTasks = timeManager.GetPersonTasksWithTime(personWorkMonth.PersonTasks, personWorkMonth.WorkDays);

            return personWorkMonth;
        }
        public void FillTasks(PersonWorkMonth personWorkMonth)
        {
            var tasks = GetTasks(personWorkMonth.Person.TaskQuery);

            var personJiraTasks = personWorkMonth.PersonTasks.Where(item => item is JiraPersonTask).ToList();

            if (tasks == null)
            {
                Trace.TraceWarning("Cannot get tasks for {0}", personWorkMonth.Person.LastName);
                return;
            }

            foreach (var task in tasks)
            {
                var jiraTask = personJiraTasks.FirstOrDefault(item => item.Name == task.Name);
                if (jiraTask == null)
                {
                    task.Project = personWorkMonth.Person.Project;
                    task.WorkMonthId = personWorkMonth.Id;
                    personWorkMonth.PersonTasks.Add(task);
                }
            }
        }
        public void TimeManager_GetPersonTasksWithTime_NullableInput_ResultShouldBeNull()
        {
            var projects = new ProjectFactory().GetProjects();
            var products = new ProductFactory().GetProducts();
            var person = new PersonFactory().GetPersons(projects[0], products[0]);

            var personWorkMonth = new PersonWorkMonth
            {
                Person = person[0],
                Year = Year,
                Month = Month,
                PersonTasks = null,
                WorkDays = null,
            };

            var timeManager = new PersonTimeManager(new TimeSpan(8, 0, 0));
            var result = timeManager.GetPersonTasksWithTime(personWorkMonth.PersonTasks, personWorkMonth.WorkDays);

            Assert.IsNull(result);
        }