public SaveResponsibilityTaskResponse SaveResponsibilityTask(SaveResponsibilityTaskRequest request)
        {
            _log.Add(request);

            try 
            {                
                var responsibility = _responsibilityRepository.GetByIdAndCompanyId(request.ResponsibilityId, request.CompanyId);
                var user = _userForAuditingRepository.GetById(request.UserId);
                var employee = _employeeRepository.GetByIdAndCompanyId(request.TaskAssignedToId, request.CompanyId);
                var taskCategory = _taskCategoryRepository.GetResponsibilityTaskCategory();
                var site = _siteRepository.GetByIdAndCompanyId(request.SiteId, request.CompanyId);
                var createDocumentParameterObjects = _documentParameterHelper.GetCreateDocumentParameters(request.CreateDocumentRequests, request.CompanyId);
                var hasMultipleFrequencyChangeToTrue = false;

                responsibility.HasMultipleFrequencyChangeToTrue += delegate(object sender, EventArgs e)
                {
                    hasMultipleFrequencyChangeToTrue = true;
                };

                var task = GetResponsibilityTask(request, employee, user, taskCategory, responsibility, site, createDocumentParameterObjects);

                if (request.StatutoryResponsibilityTaskTemplateId != default(long))
                {
                    SetResponsibilityTaskValuesFromTemplate(request.StatutoryResponsibilityTaskTemplateId, task);
                }

                _responsibilityRepository.SaveOrUpdate(responsibility);

                return new SaveResponsibilityTaskResponse
                           {
                               ResponsibilityTaskId = task != null ? task.Id : default(long),
                               HasMultipleFrequencyChangeToTrue = hasMultipleFrequencyChangeToTrue
                           };
            }
            catch (Exception ex)
            {
                _log.Add(ex);
                throw;
            }
        }
 private static ResponsibilityTask GetResponsibilityTask(
     SaveResponsibilityTaskRequest request,
     Employee employee,
     UserForAuditing user,
     TaskCategory taskCategory,
     Responsibility responsibility,
     Site site,
     IEnumerable<CreateDocumentParameters> createDocumentParameters)
 {
     ResponsibilityTask task;
     if (request.TaskId != default(long))
     {
         task = responsibility.ResponsibilityTasks.FirstOrDefault(t => t.Id == request.TaskId);
         if (task != null)
         {
             task.Update(
                 request.Title,
                 request.Description,
                 request.TaskCompletionDueDate,
                 request.TaskStatus,
                 employee,
                 user,
                 createDocumentParameters,
                 taskCategory,
                 request.TaskReoccurringTypeId,
                 request.TaskReoccurringEndDate,
                 request.SendTaskNotification,
                 request.SendTaskCompletedNotification,
                 request.SendTaskOverdueNotification,
                 request.SendTaskDueTomorrowNotification,
                 request.TaskGuid,
                 site
                 );
         }
     }
     else
     {
         task = ResponsibilityTask.Create(
             request.Title,
             request.Description,
             request.TaskCompletionDueDate,
             request.TaskStatus,
             employee,
             user,
             createDocumentParameters,
             taskCategory,
             request.TaskReoccurringTypeId,
             request.TaskReoccurringEndDate,
             request.SendTaskNotification,
             request.SendTaskCompletedNotification,
             request.SendTaskOverdueNotification,
             request.SendTaskDueTomorrowNotification,
             request.TaskGuid,
             site,
             responsibility
             );
     }
     return task;
 }
        public static SaveResponsibilityTaskRequest Create(long companyId, long responsibilityId, long taskId,
                                                           string title, string description, int taskReoccurringTypeId,
                                                           string taskCompletionDueDate,
                                                           DateTime? taskReoccurringEndDate, Guid userId,
                                                           Guid taskAssignedToId, int taskStatusId,
                                                           string taskReoccurringFirstDueDate, bool sendTaskNotification,
                                                           bool sendTaskCompleteNotification,
                                                           bool sendTaskOverdueNotification,
                                                           bool sendTaskDueTomorrowNotification,Guid taskGuid, long siteId,
                                                           List<CreateDocumentRequest> createDocumentRequests,
                                                           long statutoryResponsibilityTaskTemplateId)
        {
            var request = new SaveResponsibilityTaskRequest
                          {
                              CompanyId = companyId,
                              ResponsibilityId = responsibilityId,
                              TaskId = taskId,
                              Title = title,
                              Description = description,
                              TaskStatus = (TaskStatus)taskStatusId,
                              TaskAssignedToId = taskAssignedToId,
                              TaskReoccurringTypeId = taskReoccurringTypeId,
                              TaskReoccurringEndDate = taskReoccurringEndDate,
                              UserId = userId,
                              SendTaskNotification = sendTaskNotification,
                              SendTaskCompletedNotification = sendTaskCompleteNotification,
                              SendTaskOverdueNotification = sendTaskOverdueNotification,
                              SendTaskDueTomorrowNotification = sendTaskDueTomorrowNotification,
                              TaskGuid = taskGuid,
                              SiteId = siteId,
                              CreateDocumentRequests = createDocumentRequests,
                              StatutoryResponsibilityTaskTemplateId = statutoryResponsibilityTaskTemplateId
                          };

            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;
        }