void AddNewTaskOrder(Guid projectID, TaskOrderImportDTO taskOrderToImport) { //add the task order var taskOrder = db.Activities.Add( new Activity { Name = taskOrderToImport.ID, Acronym = taskOrderToImport.ID, Description = string.Empty, TaskLevel = 1, ProjectID = projectID, DisplayOrder = 0 } ); //add the activities for the task order foreach (var ati in taskOrderToImport.Activities) { ActivityImportDTO activityToImport = ati; string activityName = string.IsNullOrWhiteSpace(activityToImport.Name) ? activityToImport.Acronym : activityToImport.Name; Activity childActivity = new Activity { ProjectID = projectID, ParentActivityID = taskOrder.ID, Name = activityName, Acronym = activityToImport.Acronym, Description = string.Empty, TaskLevel = 2, DisplayOrder = 0, ExternalKey = activityToImport.Key }; taskOrder.DependantActivities.Add(childActivity); //add the activity projects for the activity foreach (var apti in activityToImport.Activities) { var activityProjectToImport = apti; string projectName = string.IsNullOrWhiteSpace(activityProjectToImport.Name) ? activityProjectToImport.Acronym : activityProjectToImport.Name; childActivity.DependantActivities.Add( new Activity { ProjectID = projectID, ParentActivityID = childActivity.ID, Name = projectName, Acronym = activityProjectToImport.Acronym, Description = string.Empty, TaskLevel = 3, DisplayOrder = 0, ExternalKey = activityProjectToImport.Key } ); } } }
/// <summary> /// Executes the update of the activities for the specified project. /// </summary> /// <param name="projectID">The ID of the project.</param> /// <returns></returns> public async Task DoUpdate(Guid projectID) { List <DTO.TaskOrderImportDTO> importList = await LoadImport(); if (importList.Count == 0) { return; } Logger.Debug("Loading existing activities and determining if each activity is associated with one or more requests."); IEnumerable <Activity> existingActivities = await db.Activities.Where(a => a.ProjectID == projectID).ToArrayAsync(); IEnumerable <KeyValuePair <Guid, bool> > hasRequests = (await( from a in db.Activities let request = db.Requests.Where(r => (r.ActivityID.HasValue && r.ActivityID.Value == a.ID) || (r.SourceActivityID.HasValue && r.SourceActivityID.Value == a.ID) || (r.SourceActivityProjectID.HasValue && r.SourceActivityProjectID.Value == a.ID) || (r.SourceTaskOrderID.HasValue && r.SourceTaskOrderID.Value == a.ID)).FirstOrDefault() where a.ProjectID == projectID select new { a.ID, HasRequests = request != null } ).ToArrayAsync()).Select(p => new KeyValuePair <Guid, bool>(p.ID, p.HasRequests)).ToArray(); Logger.Debug("Deleting task orders that do not exist in update list."); //delete task order that do not exist in update list var taskOrdersToDelete = (from a in existingActivities where a.ParentActivityID == null && a.TaskLevel == 1 && !importList.Any(i => string.Equals(a.Name, i.ID, StringComparison.OrdinalIgnoreCase)) select a).ToArray(); DeleteTaskOrders(taskOrdersToDelete, existingActivities, hasRequests); Logger.Debug("Beginning of update for " + importList.Count + " task orders."); //now import/update everything foreach (var to in importList) { var taskOrderToImport = to; Logger.Debug("Updating/importing task order: " + taskOrderToImport.ID); var taskOrder = existingActivities.Where(a => string.Equals(taskOrderToImport.ID, a.Name, StringComparison.OrdinalIgnoreCase) && a.TaskLevel == 1).FirstOrDefault(); if (taskOrder == null) { AddNewTaskOrder(projectID, taskOrderToImport); continue; } //make sure the acronym is set for the taskorder, and marked as not deleted taskOrder.Acronym = taskOrderToImport.ID; taskOrder.Deleted = false; List <Activity> toDelete = new List <Activity>(); //determine the ones that need to be deleted IEnumerable <Activity> activitiesToDelete = (from a in existingActivities where a.ParentActivityID == taskOrder.ID && a.TaskLevel == 2 && !taskOrderToImport.Activities.Any(aa => string.Equals((string.IsNullOrWhiteSpace(aa.Name) ? aa.Acronym : aa.Name), a.Name, StringComparison.OrdinalIgnoreCase)) select a).ToArray(); DeleteActivities(activitiesToDelete, existingActivities, hasRequests, toDelete.Add, null); //confirm the task orders child activities exist and their activity projects are up to date. foreach (var ati in taskOrderToImport.Activities) { ActivityImportDTO activityToImport = ati; Activity childActivity = FindActivity(existingActivities, 2, taskOrder.ID, activityToImport.Key, activityToImport.Name, activityToImport.Acronym); if (childActivity == null) { childActivity = new Activity { ParentActivityID = taskOrder.ID, ProjectID = projectID, Name = string.IsNullOrWhiteSpace(activityToImport.Name) ? activityToImport.Acronym : activityToImport.Name, Acronym = activityToImport.Acronym, Description = string.Empty, DisplayOrder = 0, TaskLevel = 2, ExternalKey = activityToImport.Key }; taskOrder.DependantActivities.Add(childActivity); } else { childActivity.Name = activityToImport.Name; childActivity.Acronym = activityToImport.Acronym; childActivity.ExternalKey = activityToImport.Key; childActivity.Deleted = false; } //remove the sub-activities that do not exist in the update. IEnumerable <Activity> activityProjectsToDelete = (from a in existingActivities where a.ParentActivityID == childActivity.ID && a.TaskLevel == 3 && !activityToImport.Activities.Any(aa => string.Equals((string.IsNullOrWhiteSpace(aa.Name) ? aa.Acronym : aa.Name), a.Name, StringComparison.OrdinalIgnoreCase)) select a).ToArray(); DeleteActivityProjects(activityProjectsToDelete, existingActivities, hasRequests, toDelete.Add, null); //add/update the project activities foreach (var apti in activityToImport.Activities) { var subActivityToImport = apti; Activity activityProject = FindActivity(existingActivities, 3, childActivity.ID, subActivityToImport.Key, subActivityToImport.Name, subActivityToImport.Acronym); if (activityProject == null) { childActivity.DependantActivities.Add( new Activity { ParentActivityID = childActivity.ID, ProjectID = projectID, Name = string.IsNullOrWhiteSpace(subActivityToImport.Name) ? subActivityToImport.Acronym : subActivityToImport.Name, Acronym = subActivityToImport.Acronym, Description = string.Empty, DisplayOrder = 0, TaskLevel = 3, ExternalKey = subActivityToImport.Key } ); } else { activityProject.Name = subActivityToImport.Name; activityProject.Acronym = subActivityToImport.Acronym; activityProject.ExternalKey = subActivityToImport.Key; activityProject.Deleted = false; } } } if (toDelete.Any()) { db.Activities.RemoveRange(toDelete); } }//end of taskorder loop Logger.Debug("Finished processing import items, saving changes."); await db.SaveChangesAsync(); Logger.Debug("Finished saving import of activities."); }