Exemplo n.º 1
0
        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
                    }
                        );
                }
            }
        }
Exemplo n.º 2
0
        /// <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.");
        }