public static UpdateFurtherControlMeasureTaskRequest Create(
            string title,
            string description, 
            string reference, 
            string taskCompletionDueDate, 
            int taskStatusId, 
            long companyId, 
            long id, 
            Guid taskAssignedToId, 
            int taskReoccurringTypeId, 
            string taskReoccurringFirstDueDate, 
            DateTime? taskReoccurringEndDate, 
            Guid userId, 
            List<CreateDocumentRequest> createDocumentRequests, 
            List<long> deleteDocumentRequests,
            bool sendTaskNotification,
            bool sendTaskCompletedNotification,
            bool sendTaskOverdueNotification,
            bool sendTaskDueTomorrowNotification
        )
        {
            var request = new UpdateFurtherControlMeasureTaskRequest
                          {
                              Title = title,
                              Description = description,
                              Reference = reference,
                              TaskStatus = (TaskStatus)taskStatusId,
                              CompanyId = companyId,
                              Id = id,
                              TaskAssignedToId = taskAssignedToId,
                              TaskReoccurringTypeId = taskReoccurringTypeId,
                              TaskReoccurringEndDate = taskReoccurringEndDate,
                              UserId = userId,
                              CreateDocumentRequests = createDocumentRequests,
                              DocumentLibraryIdsToDelete = deleteDocumentRequests,
                              SendTaskCompletedNotification = sendTaskCompletedNotification,
                              SendTaskNotification = sendTaskNotification,
                              SendTaskOverdueNotification = sendTaskOverdueNotification,
                              SendTaskDueTomorrowNotification = sendTaskDueTomorrowNotification
                          };


            if (request.IsReoccurringTask)
            {
                request.TaskCompletionDueDate = string.IsNullOrEmpty(taskReoccurringFirstDueDate)
                                        ? (DateTime?)null
                                        : DateTime.Parse(taskReoccurringFirstDueDate);
            }
            else
            {
                request.TaskCompletionDueDate = string.IsNullOrEmpty(taskCompletionDueDate)
                                            ? (DateTime?)null
                                            : DateTime.Parse(taskCompletionDueDate);
            }

            return request;
        }
        public void Given_that_update_further_action_task_to_risk_assessment_is_called_with_no_task_assigned_to_Then_should_call_correct_methods()
        {
            //Given
            var target = CreateRiskAssessmentFurtherActionService();

            var request = new UpdateFurtherControlMeasureTaskRequest()
            {
                TaskAssignedToId = Guid.Empty
            };

            _userRepository
                .Setup(x => x.GetByIdAndCompanyId(request.UserId, request.CompanyId))
                .Returns(_user);

            var mockFurtherActionTask = new Mock<MultiHazardRiskAssessmentFurtherControlMeasureTask>();

            _furtherControlMeasureTaskRepository
                .Setup(x => x.GetById(request.Id))
                .Returns(mockFurtherActionTask.Object);

            //When
            target.Update(request);

            //Then
            _furtherControlMeasureTaskRepository.Verify(x => x.SaveOrUpdate(mockFurtherActionTask.Object));
            _userRepository.VerifyAll();
            _employeeRepository.Verify(x => x.GetByIdAndCompanyId(request.TaskAssignedToId, request.CompanyId), Times.Never());
            mockFurtherActionTask.Verify(x => x.Update(
                It.IsAny<string>(),
                It.IsAny<string>(),
                It.IsAny<string>(),
                It.IsAny<DateTime?>(),
                It.IsAny<TaskStatus>(),
                It.IsAny<List<CreateDocumentParameters>>(),
                It.IsAny<List<long>>(),
                It.IsAny<int>(),
                It.IsAny<DateTime?>(),
                It.IsAny<Employee>(),
                It.IsAny<UserForAuditing>(),
                It.IsAny<bool>(),
                It.IsAny<bool>(),
                It.IsAny<bool>(),
                It.IsAny<bool>()
                ));
        }
        public void Update(UpdateFurtherControlMeasureTaskRequest request)
        {
            _log.Add(request);

            var furtherControlMeasureTask = _taskRepository.GetById(request.Id);
            Employee assignedTo = null;

            if (request.TaskAssignedToId != default(Guid))
                assignedTo = _employeeRepository.GetByIdAndCompanyId(request.TaskAssignedToId, request.CompanyId);

            var user = _userForAuditingRepository.GetByIdAndCompanyId(request.UserId, request.CompanyId);
            var createDocumentParameterObjects =
                _documentParameterHelper.GetCreateDocumentParameters(request.CreateDocumentRequests,
                                                                    request.CompanyId);

            furtherControlMeasureTask.Update(request.Reference,
                                             request.Title,
                                             request.Description,
                                             request.TaskCompletionDueDate,
                                             request.TaskStatus,
                                             createDocumentParameterObjects,
                                             request.DocumentLibraryIdsToDelete,
                                             request.TaskReoccurringTypeId,
                                             request.TaskReoccurringEndDate,
                                             assignedTo,
                                             user,
                                             request.SendTaskCompletedNotification,
                                             request.SendTaskNotification,
                                             request.SendTaskOverdueNotification,
                                             request.SendTaskDueTomorrowNotification);

            _taskRepository.SaveOrUpdate(furtherControlMeasureTask);

            // flush so when bus checks the task to see if have to send notification, it is up to date
            _taskRepository.Flush();

        }
        public void When_Update_Then_fields_mapped_to_Task_Update()
        {
            //Given
            var target = CreateRiskAssessmentFurtherActionService();

            var request = new UpdateFurtherControlMeasureTaskRequest()
            {
                CompanyId = 1234L,
                CompletedComments = "completed comments",
                CreateDocumentRequests = new List<CreateDocumentRequest>(),
                Description = "description",
                DocumentLibraryIdsToDelete = new List<long>(),
                Id = 5678L,
                Reference = "reference",
                SendTaskCompletedNotification = true,
                SendTaskNotification = true,
                SendTaskOverdueNotification = true,
                TaskAssignedToId = Guid.NewGuid(),
                TaskCompletionDueDate = DateTime.Now,
                TaskReoccurringEndDate = DateTime.Now,
                TaskReoccurringTypeId = 123,
                TaskStatus = TaskStatus.Completed,
                Title = "title",
                UserId = Guid.NewGuid()
            };

            _userRepository
                .Setup(x => x.GetByIdAndCompanyId(request.UserId, request.CompanyId))
                .Returns(_user);

            var mockFurtherActionTask = new Mock<MultiHazardRiskAssessmentFurtherControlMeasureTask>();

            _furtherControlMeasureTaskRepository
                .Setup(x => x.GetById(request.Id))
                .Returns(mockFurtherActionTask.Object);

            //When
            target.Update(request);

            //Then
            _furtherControlMeasureTaskRepository.Verify(x => x.SaveOrUpdate(mockFurtherActionTask.Object));
            _userRepository.VerifyAll();
            mockFurtherActionTask.Verify(x => x.Update(
                request.Reference,
                request.Title,
                request.Description,
                request.TaskCompletionDueDate,
                request.TaskStatus,
                It.IsAny<List<CreateDocumentParameters>>(),
                request.DocumentLibraryIdsToDelete,
                request.TaskReoccurringTypeId,
                request.TaskReoccurringEndDate,
                It.IsAny<Employee>(),
                It.IsAny<UserForAuditing>(),
                request.SendTaskCompletedNotification,
                request.SendTaskNotification,
                request.SendTaskOverdueNotification,
                request.SendTaskDueTomorrowNotification
            ));
        }
        public void Given_that_update_further_action_task_to_risk_assessment_is_called_with_task_assigned_to_Then_flush_task_repo()
        {
            //Given
            var target = CreateRiskAssessmentFurtherActionService();

            var request = new UpdateFurtherControlMeasureTaskRequest()
            {
                TaskAssignedToId = Guid.NewGuid()
            };

            _userRepository
                .Setup(x => x.GetByIdAndCompanyId(request.UserId, request.CompanyId))
                .Returns(_user);

            var mockFurtherActionTask = new Mock<MultiHazardRiskAssessmentFurtherControlMeasureTask>();
            _furtherControlMeasureTaskRepository
                .Setup(x => x.GetById(request.Id))
                .Returns(mockFurtherActionTask.Object);

            //When
            target.Update(request);

            //Then
            _furtherControlMeasureTaskRepository.Verify(x => x.Flush(), Times.Once());

        }