private IEnumerable<Site> GetRequestedSites(CreateManyResponsibilityTaskFromWizardRequest request)
 {
     var requestedSiteIds = request.TaskDetails.Select(x => x.SiteId).Distinct().ToList();
     var requestedSites = _siteRepository.GetByIds(requestedSiteIds);
     if (requestedSites.Count() != requestedSiteIds.Count())
     {
         throw new ArgumentException("Requested Sites for generating Statutory Tasks could not be retrieved");
     }
     if (requestedSites.Any(x => x.ClientId != request.CompanyId))
     {
         throw new ArgumentException("Requested Sites are not from the requested Company");
     }
     return requestedSites;
 }
        public JsonResult BulkGenerateTasks(List<GenerateResponsibilityTaskViewModel> viewModel)
        {
            JsonResult result;

            ValidateGenerateResponsibilityTasks(viewModel);

            if (!ModelState.IsValid)
            {
                result = ModelStateErrorsAsJson();
            }
            else
            {
                var taskDetails = new List<CreateResponsibilityTasksFromWizardRequest>();
                var createdTaskGuids = new List<Guid>();

                foreach (var model in viewModel)
                {
                    var taskGuid = Guid.NewGuid();
                    createdTaskGuids.Add(taskGuid);
                   
                    taskDetails.Add(CreateResponsibilityTasksFromWizardRequest.Create(CurrentUser.CompanyId,
                        CurrentUser.UserId, 
                        model.SiteId,
                        model.ResponsibilityId,
                        model.TaskId, 
                        model.Frequency,
                        model.Owner, 
                        model.StartDate,
                        model.EndDate,
                        taskGuid));
                }

                var request = new CreateManyResponsibilityTaskFromWizardRequest
                              {
                                  TaskDetails = taskDetails,
                                  CreatingUserId = CurrentUser.UserId,
                                  CompanyId = CurrentUser.CompanyId
                              };
                
                using (var session = _businessSafeSessionManager.Session)
                {
                    _responsibilitiesService.CreateManyResponsibilityTaskFromWizard(request);
                    _businessSafeSessionManager.CloseSession();
                }

                foreach (var taskGuid in createdTaskGuids)
                {
                    _bus.Publish(new TaskAssigned { TaskGuid = taskGuid });
                }

                result = Json(new { Success = true });
            }

            return result;
        }
        public void CreateManyResponsibilityTaskFromWizard(CreateManyResponsibilityTaskFromWizardRequest request)
        {
            var responsibilitiesRequested = _responsibilityRepository.GetByIds(request.TaskDetails.Select(x => x.ResponsibilityId).Distinct().ToList());
           
            var creatingUser = _userForAuditingRepository.GetByIdAndCompanyId(request.CreatingUserId, request.CompanyId);
            var taskCategory = _taskCategoryRepository.GetResponsibilityTaskCategory();

            var requestedAssignees = GetRequestedAssignees(request);
            var requestedSites = GetRequestedSites(request);

            foreach (var responsibility in responsibilitiesRequested)
            {
                foreach (var detail in request.TaskDetails.Where(x => x.ResponsibilityId == responsibility.Id))
                {
                    var assignee = requestedAssignees.Single(x => x.Id == detail.AssigneeId);
                    var site = requestedSites.Single(x => x.Id == detail.SiteId);

                    var task = GetResponsibilityTask(
                        SaveResponsibilityTaskRequest.Create(
                            detail.CompanyId,
                            detail.ResponsibilityId,
                            default(long),
                            string.Empty,
                            string.Empty,
                            (int)detail.Frequency,
                            detail.StartDate.ToShortDateString(),
                            detail.EndDate,
                            detail.UserId,
                            detail.AssigneeId,
                            (int) TaskStatus.Outstanding,
                            detail.StartDate.ToShortDateString(),
                            true,
                            true,
                            true,
                            true,
                            detail.TaskGuid,
                            detail.SiteId,
                            new List<CreateDocumentRequest>(),
                            detail.TaskTemplateId),
                        assignee,
                        creatingUser,
                        taskCategory,
                        responsibility,
                        site,
                        new List<CreateDocumentParameters>()
                    );

                    if (detail.TaskTemplateId != default(long))
                    {
                        SetResponsibilityTaskValuesFromTemplate(detail.TaskTemplateId, task);
                    }
                }

                _responsibilityRepository.Save(responsibility);
            }
        }
        public void Setup()
        {
            _companyId = 234246L;
            
            _responsibilityA = new Responsibility { Id = 123L, CompanyId = _companyId };
            _responsibilityB = new Responsibility { Id = 456L, CompanyId = _companyId };

            _responsibilityRepository = new Mock<IResponsibilityRepository>();
            _responsibilityRepository.Setup(x => x.GetByIds(It.IsAny<List<long>>()));
            _responsibilityRepository.Setup(x => x.Save(It.IsAny<Responsibility>()));

            _taskAssignedTo = new Employee { Id = Guid.NewGuid(), CompanyId = _companyId };
            _employeeRepository = new Mock<IEmployeeRepository>();
            _employeeRepository
                .Setup(x => x.GetByIds(It.IsAny<List<Guid>>()))
                .Returns(new List<Employee>() {_taskAssignedTo });

            _site = new Site { Id = 1234L, ClientId = _companyId };
            _siteRepository = new Mock<ISiteRepository>();
            _siteRepository
                .Setup(x => x.GetByIds(It.IsAny<List<long>>()))
                .Returns(new List<Site> { _site });
            
            _statutoryResponsibilityTaskTemplateRepository = new Mock<IStatutoryResponsibilityTaskTemplateRepository>();
            _statutoryResponsibilityTaskTemplateRepository.Setup(x => x.GetById(It.IsAny<long>())).Returns(new StatutoryResponsibilityTaskTemplate());
            
            _creatingUser = new UserForAuditing { Id = Guid.NewGuid() };
            _userForAuditingRepository = new Mock<IUserForAuditingRepository>();
            _userForAuditingRepository
                .Setup(x => x.GetByIdAndCompanyId(_creatingUser.Id, _companyId))
                .Returns(_creatingUser);

            _taskCategory = new TaskCategory()
            {
                Id = 1L
            };

            _taskCategoryRepository = new Mock<ITaskCategoryRepository>();
            _taskCategoryRepository.Setup(x => x.GetResponsibilityTaskCategory())
                .Returns(_taskCategory);

            _documentParameterHelper = new Mock<IDocumentParameterHelper>();
            _log = new Mock<IPeninsulaLog>();

            _taskTemplateA = new StatutoryResponsibilityTaskTemplate { Id = 12345464252L, Title = "task template A title", Description = "task template A description"};
            _taskTemplateB = new StatutoryResponsibilityTaskTemplate { Id = 154764252L, Title = "task template B title", Description = "task template B description" };
            _taskTemplateC = new StatutoryResponsibilityTaskTemplate { Id = 123453252L, Title = "task template C title", Description = "task template C description",  };

            _taskTemplates = new List<StatutoryResponsibilityTaskTemplate> { _taskTemplateA, _taskTemplateB, _taskTemplateC };

            _task1ForResponsibilityA = CreateResponsibilityTasksFromWizardRequest.Create(_companyId, _creatingUser.Id, _site.Id, _responsibilityA.Id, _taskTemplateA.Id,
                                                                            TaskReoccurringType.Weekly, _taskAssignedTo.Id,
                                                                            DateTime.Now.ToShortDateString(),
                                                                            DateTime.Now.AddDays(1).ToShortDateString(),
                                                                            Guid.NewGuid());

            _task2ForResponsibilityA = CreateResponsibilityTasksFromWizardRequest.Create(_companyId, _creatingUser.Id, _site.Id, _responsibilityA.Id, _taskTemplateB.Id,
                                                                            TaskReoccurringType.Weekly, _taskAssignedTo.Id,
                                                                            DateTime.Now.ToShortDateString(),
                                                                            DateTime.Now.AddDays(1).ToShortDateString(),
                                                                            Guid.NewGuid());

            _task1ForResponsibilityB = CreateResponsibilityTasksFromWizardRequest.Create(_companyId, _creatingUser.Id, _site.Id, _responsibilityB.Id, _taskTemplateC.Id,
                                                                            TaskReoccurringType.Weekly, _taskAssignedTo.Id,
                                                                            DateTime.Now.ToShortDateString(),
                                                                            DateTime.Now.AddDays(1).ToShortDateString(),
                                                                            Guid.NewGuid());

            _manyTaskRequest = new CreateManyResponsibilityTaskFromWizardRequest()
            {
                CompanyId = _companyId,
                CreatingUserId = _creatingUser.Id
            };

           
        }