internal static WorkItemVerificationResult VerifyEstimatePresence(WorkItem workItem)
 {
     double? estimate = workItem.Estimate();
     if (estimate != null)
         return new WorkItemVerificationResult { Result = VerificationResult.Ok };
     return new WorkItemVerificationResult
     {
         Result = VerificationResult.Error,
         Messages = new List<string>(1) { Messages.NoEstimate() },
     };
 }
        internal void FillTaskInfo(
			ViewFiltersBuilder viewFiltersBuilder,
			WorkItem task,
			List<WorkItem> siblings,
			WorkItem leadTask,
			DataGridViewRow taskRow,
			DataContainer data,
			Dictionary<int, string> planningAssignments,
			List<string> allUsers,
			List<int> blockerIds)
        {
            var priorityCell = taskRow.Cells[m_viewColumnsIndexes.PriorityColumnIndex];
            priorityCell.Value = task.Priority();
            priorityCell.SetColorByState(task);
            priorityCell.ToolTipText = task.State;

            var idCell = taskRow.Cells[m_viewColumnsIndexes.IdColumnIndex];
            idCell.Value = task.Id;
            var verificationResult = WorkItemVerifier.VerifyTaskPriority(task, leadTask.Priority());
            if (verificationResult.Result != VerificationResult.Ok)
            {
                idCell.SetColorByVerification(verificationResult.Result);
                idCell.ToolTipText = verificationResult.AllMessagesString;
            }
            else
            {
                verificationResult = WorkItemVerifier.VerifyTaskWithParentOnSameIteration(task, leadTask);
                if (verificationResult.Result != VerificationResult.Ok)
                {
                    idCell.SetColorByVerification(verificationResult.Result);
                    idCell.ToolTipText = verificationResult.AllMessagesString;
                }
            }

            var titleCell = taskRow.Cells[m_viewColumnsIndexes.TitleColumnIndex];
            titleCell.Value = task.Title;
            titleCell.ToolTipText = task.Discipline() + " " + task.Title;
            titleCell.Style.BackColor = priorityCell.Style.BackColor;

            var blockersCell = taskRow.Cells[m_viewColumnsIndexes.BlockersColumnIndex];
            if (blockerIds != null)
            {
                string blockerIdsStr = string.Join(",", blockerIds);
                blockersCell.Value = blockerIdsStr;

                verificationResult = WorkItemVerifier.VerifyNonChildBlockerExistance(blockerIds, siblings);
                if (verificationResult.Result == VerificationResult.Ok)
                    verificationResult = WorkItemVerifier.VerifyActiveTaskBlocking(task, blockerIds);
                if (verificationResult.Result == VerificationResult.Ok)
                {
                    blockerIdsStr = string.Join(Environment.NewLine, blockerIds.Select(b => data.WiDict[b].Title));
                    blockersCell.ToolTipText = blockerIdsStr;
                }
                else
                {
                    blockersCell.SetColorByVerification(verificationResult.Result);
                    blockersCell.ToolTipText = verificationResult.AllMessagesString;
                }
            }
            if (!string.IsNullOrEmpty(task.BlockingReason()))
            {
                if (!string.IsNullOrEmpty(blockersCell.ToolTipText))
                    blockersCell.ToolTipText += Environment.NewLine;
                else
                    blockersCell.Value = task.BlockingReason();
                blockersCell.ToolTipText += "Blocking Reason: " + task.BlockingReason();
            }

            var assignedCell = taskRow.Cells[m_viewColumnsIndexes.AssignedToColumnIndex];
            var comboBoxCell = assignedCell as DataGridViewComboBoxCell;
            if (comboBoxCell != null)
                comboBoxCell.DataSource = allUsers;
            assignedCell.Value = planningAssignments.GetAssignee(task);
            verificationResult = WorkItemVerifier.VerifyAssignation(task);
            if (verificationResult.Result != VerificationResult.Ok)
            {

                assignedCell.SetColorByVerification(verificationResult.Result);
                assignedCell.ToolTipText = verificationResult.AllMessagesString;
            }

            var workCell = taskRow.Cells[m_viewColumnsIndexes.WorkColumnIndex];
            workCell.Value = task.IsActive()
                ? task.Remaining()
                : task.Estimate();
            workCell.Style.BackColor = priorityCell.Style.BackColor;
        }
        private static int? GetFinishDay(
			WorkItem task,
			Dictionary<int, string> planningAssignments,
			FocusFactorCalculator focusFactorCalculator,
			Dictionary<int, Tuple<int?, int>> scheduledTasksDict)
        {
            int? result = null;
            if (scheduledTasksDict.ContainsKey(task.Id))
            {
                var blockerSchedule = scheduledTasksDict[task.Id];
                if (blockerSchedule.Item1 != null)
                    result = blockerSchedule.Item1.Value + blockerSchedule.Item2;
            }
            else
            {
                double? remaining = task.IsProposed()
                    ? task.Estimate()
                    : task.Remaining();
                if (remaining != null)
                    result = focusFactorCalculator.CalculateDaysByTime(
                        remaining.Value,
                        planningAssignments.GetAssignee(task));
            }
            return result;
        }
        private static int GetDaysCount(
			WorkItem task,
			string user,
			Dictionary<int, Tuple<int?, int>> scheduledTasksDict,
			FreeDaysCalculator freeDaysCalculator,
			FocusFactorCalculator focusFactorCalculator)
        {
            if (task.IsActive())
            {
                DateTime? finishDate = task.FinishDate();
                int finish = scheduledTasksDict.ContainsKey(task.Id)
                    ? scheduledTasksDict[task.Id].Item2
                    : (finishDate == null
                        ? 0
                        : freeDaysCalculator.GetDaysCount(finishDate.Value, user));
                double? remaining = task.Remaining();
                if (remaining != null && remaining > 0)
                {
                    int finishByRemaining = focusFactorCalculator.CalculateDaysByTime(remaining.Value, user);
                    if (finish < finishByRemaining)
                        finish = finishByRemaining;
                }
                return finish;
            }
            double? estimate = task.Estimate();
            return estimate == null
                ? 0
                : focusFactorCalculator.CalculateDaysByTime(estimate.Value, user);
        }
        internal static int AddDatesProposed(
			ViewColumnsIndexes viewColumnsIndexes,
			FreeDaysCalculator freeDaysCalculator,
			FocusFactorCalculator focusFactorCalculator,
			WorkItem task,
			DataGridViewRow taskRow,
			int startInd,
			string user,
			string userMark,
			bool shouldCheckEstimate)
        {
            var verificationResult = WorkItemVerifier.VerifyEstimatePresence(task);
            if (verificationResult.Result != VerificationResult.Ok)
            {
                if (shouldCheckEstimate)
                {
                    var estimateCell = taskRow.Cells[viewColumnsIndexes.FirstDateColumnIndex - 1];
                    estimateCell.SetColorByVerification(verificationResult.Result);
                    estimateCell.ToolTipText = verificationResult.AllMessagesString;
                }
                return viewColumnsIndexes.FirstDateColumnIndex;
            }

            double? estimate = task.Estimate();

            var length = focusFactorCalculator.CalculateDaysByTime(estimate.Value, user);
            DateTime? finish = task.FinishDate();
            if (finish != null)
            {
                verificationResult = WorkItemVerifier.VerifyFinishDate(task);
                var estimateCell = taskRow.Cells[viewColumnsIndexes.FirstDateColumnIndex - 1];
                estimateCell.SetColorByVerification(verificationResult.Result);
                estimateCell.ToolTipText = verificationResult.AllMessagesString;
                estimateCell.Value = finish.Value.ToString("dd.MM");

                int finishShift = length - 1;
                DateTime startDate = finish.Value.Date;
                DateTime today = DateTime.Now.Date;
                while (finishShift > 0 && startDate >= today)
                {
                    startDate = startDate.AddDays(-1);
                    if (freeDaysCalculator.GetDayType(startDate, user) == DayType.WorkDay)
                        --finishShift;
                }
                if (finishShift == 0)
                {
                    var startShift = (int) startDate.Subtract(today).TotalDays;
                    startInd = Math.Max(startInd, startShift + viewColumnsIndexes.FirstDateColumnIndex);
                }
                else
                {
                    length -= finishShift;
                }
            }

            return AddDates(
                viewColumnsIndexes,
                freeDaysCalculator,
                taskRow,
                startInd,
                length,
                false,
                user,
                userMark);
        }
 private static double GetWork(WorkItem workItem)
 {
     if (workItem.State == WorkItemState.Active)
         return workItem.Remaining().Value;
     return workItem.Estimate() ?? 0;
 }