/// <summary>
        /// Retrieves  counter measure details of selected counter measure
        /// </summary>
        /// <param name="counterMeasureId">Counter Measure Id</param>
        /// <returns>Counter Measure DTO</returns>
        public CounterMeasureItem GetCounterMeasure(int counterMeasureId)
        {
            var counterMeasure = counterMeasureRepository.Get(counterMeasureId);

            if (counterMeasure != null)
            {
                return(CounterMeasureConverters.
                       ConvertCounterMeasureToCounterMeasureItemDTO(counterMeasure));
            }

            return(null);
        }
        /// <summary>
        /// Retrieves all counter measures related to a KPI of a particular scorecard for
        /// an year
        /// </summary>
        /// <param name="scorecardId">Scorecard Identifier</param>
        /// <param name="kpiId">KPI Identifier</param>
        /// <returns>All Counter Measures related to the KPI</returns>
        public IEnumerable <CounterMeasureItem> GetCounterMeasures(int scorecardId, int kpiId,
                                                                   bool isShowClosed)
        {
            DateTime currentDate = TimeZoneUtility.GetCurrentTimestamp().Date;

            // get all counter measures except the confirmed counter measure if isShowClosed is false
            // otherwise get all counter measures
            var counterMeasures = counterMeasureRepository.GetAll()
                                  .Where(x => x.ScorecardId == scorecardId &&
                                         x.KPIId == kpiId &&
                                         x.CounterMeasureStatusId != (isShowClosed ?
                                                                      -1 : Constants.CounterMeasureStatusConfirmed))
                                  .OrderByDescending(x => x.CreatedOn)
                                  .ToList().Select(x => CounterMeasureConverters.
                                                   ConvertCounterMeasureToCounterMeasureItemDTO(x));

            return(counterMeasures.ToList());
        }
        /// <summary>
        /// Add a new counter measure for a metric which belongs to a score card and KPI
        /// </summary>
        /// <param name="counterMeasureRequest">new counter measure entry</param>
        /// <param name="userName">Logged in user name</param>
        public void AddCounterMeasure(CounterMeasureAddRequest counterMeasureRequest,
                                      string userName)
        {
            ValidateCounterMeasureDueDate(counterMeasureRequest.DueDate);
            // Get logged in user id
            int loggedInUserId = userRepository.GetAll().FirstOrDefault(
                x => x.AccountName == userName).Id;

            // If the assigned user is not added to NDMS users table, add it here
            var assignedUserIds = userRepository.AddADUsersToNDMS(new List <string>()
            {
                counterMeasureRequest.AssignedTo
            });

            var counterMeasure = new CounterMeasure()
            {
                ScorecardId              = counterMeasureRequest.ScorecardId.Value,
                KPIId                    = counterMeasureRequest.KPIId.Value,
                MetricId                 = counterMeasureRequest.MetricId.Value,
                Issue                    = counterMeasureRequest.Issue,
                Action                   = counterMeasureRequest.Action,
                AssignedTo               = assignedUserIds.First(),
                DueDate                  = counterMeasureRequest.DueDate,
                CounterMeasureStatusId   = counterMeasureRequest.CounterMeasureStatusId.Value,
                CounterMeasurePriorityId = counterMeasureRequest.CounterMeasurePriorityId != null ?
                                           counterMeasureRequest.CounterMeasurePriorityId.Value:
                                           (int?)null,
                CreatedBy              = loggedInUserId,
                LastModifiedBy         = loggedInUserId,
                CreatedOn              = TimeZoneUtility.GetCurrentTimestamp(),
                LastModifiedOn         = TimeZoneUtility.GetCurrentTimestamp(),
                CounterMeasureComments = !string.IsNullOrEmpty(counterMeasureRequest.Comment) ?
                                         new List <CounterMeasureComment>()
                {
                    CounterMeasureConverters.
                    ConvertCommentToCounterMeasureComment(counterMeasureRequest.Comment,
                                                          loggedInUserId)
                } : null
            };

            counterMeasureRepository.AddOrUpdate(counterMeasure);
            counterMeasureRepository.Save();
        }
        /// <summary>
        /// Method to update existing counter measure
        /// </summary>
        /// <param name="counterMeasureRequest">counter measure to be updated</param>
        /// <param name="userName">logged in user name</param>
        public void EditCounterMeasure(CounterMeasureEditRequest counterMeasureRequest,
                                       string userName)
        {
            //get counter measure entity based on counter measure id
            var existingCounterMeasure = counterMeasureRepository.Get
                                             (counterMeasureRequest.CounterMeasureId.Value);

            if (existingCounterMeasure != null)
            {
                if (existingCounterMeasure.CounterMeasureStatusId ==
                    Constants.CounterMeasureStatusConfirmed)
                {
                    throw new NDMSBusinessException
                              (Constants.ConfirmedCounterMeasureEditErrorMessage);
                }

                if (existingCounterMeasure.DueDate != counterMeasureRequest.DueDate)
                {
                    ValidateCounterMeasureDueDate(counterMeasureRequest.DueDate);
                }

                // Get logged in user id
                int loggedInUserId = userRepository.GetAll().FirstOrDefault(
                    x => x.AccountName == userName).Id;

                // If the assigned user is not added to NDMS users table, add it here
                var assignedUserIds = userRepository.AddADUsersToNDMS(new List <string>()
                {
                    counterMeasureRequest.AssignedTo
                });

                //update changes to existing counter measure entity
                existingCounterMeasure.CounterMeasurePriorityId = counterMeasureRequest.CounterMeasurePriorityId != null ?
                                                                  counterMeasureRequest.CounterMeasurePriorityId.Value :
                                                                  (int?)null;
                existingCounterMeasure.Action                 = counterMeasureRequest.Action;
                existingCounterMeasure.AssignedTo             = assignedUserIds.First();
                existingCounterMeasure.DueDate                = counterMeasureRequest.DueDate;
                existingCounterMeasure.LastModifiedBy         = loggedInUserId;
                existingCounterMeasure.LastModifiedOn         = TimeZoneUtility.GetCurrentTimestamp();
                existingCounterMeasure.CounterMeasureStatusId = counterMeasureRequest
                                                                .CounterMeasureStatusId.Value;
                if (!string.IsNullOrEmpty(counterMeasureRequest.Comment))
                {
                    // Add new comment if there are no comments
                    if (existingCounterMeasure.CounterMeasureComments == null)
                    {
                        existingCounterMeasure.CounterMeasureComments =
                            new List <CounterMeasureComment>()
                        {
                            CounterMeasureConverters.ConvertCommentToCounterMeasureComment
                                (counterMeasureRequest.Comment, loggedInUserId)
                        };
                    }
                    else
                    {
                        //else add new comment.
                        existingCounterMeasure.CounterMeasureComments.Add(
                            CounterMeasureConverters.ConvertCommentToCounterMeasureComment
                                (counterMeasureRequest.Comment, loggedInUserId)
                            );
                    }
                }
                counterMeasureRepository.Save();
            }
        }