public XDocument Fix(TwProject twProject) { logger.Info("start fixing '{0}' project", twProject.Name); // try match ms proj Task with Tw Lists and Items by name // may be many tasks var tasksPerList = twProject.Lists.Select(x => new TasksOfItemList() { List = x, Tasks = msProject.Tasks .Where(z => z.Assignments.Count == 0) .Where(z => z.Name == x.Name).ToList() }) .ToList(); foreach (var tsPL in tasksPerList) { var listname = tsPL.List.Name; if (tsPL.Tasks.Count == 1) { var listTask = tsPL.Tasks[0]; logger.Info("= fixing list {0}", listname); var nextListTaskId = GetNextListTaskId(tasksPerList, tsPL); var tasksPerItem = tsPL.List.Items.Select(x => new TasksOfItem() { Item = x, // may be same name of items, but in diff lists // ms tasks follows grouping task, id by id // hope there is no samenamed in each list Tasks = msProject.Tasks .Where(z => listTask.ID < z.ID && z.ID < nextListTaskId) .Where(z => z.Name == x.Name).ToList() }) .ToList(); foreach (var tsPI in tasksPerItem) { var itemName = tsPI.Item.Name; if (tsPI.Tasks.Count == 1) { logger.Info("== fixing item {0} - {1}%", itemName, tsPI.Item.Progress); FixItem(tsPI.Tasks[0], tsPI.Item.Progress); } else if (tsPI.Tasks.Count == 0) { logger.Debug("== no tasks for item {0}", itemName); } else { logger.Warn("== many tasks for item {0} - {1}", itemName, tsPI.Tasks.Count); } } } else if (tsPL.Tasks.Count == 0) { logger.Debug("= no tasks for list {0}", listname); } else { logger.Warn("= many tasks for list {0} - {1}", listname, tsPL.Tasks.Count); } } return new XDocument(msProject.Xml); }
public XDocument Fix(TwProject twProject) { logger.Info("start fixing '{0}' project", twProject.Name); // try match ms proj Task with Tw Lists and Items by name // may be many tasks var tasksPerList = twProject.Lists.Select(x => new TasksOfItemList() { List = x, Tasks = msProject.Tasks .Where(z => z.Assignments.Count == 0) .Where(z => z.Name == x.Name).ToList() }) .ToList(); foreach (var tsPL in tasksPerList) { var listname = tsPL.List.Name; if (tsPL.Tasks.Count == 1) { var listTask = tsPL.Tasks[0]; logger.Info("= fixing list {0}", listname); var nextListTaskId = GetNextListTaskId(tasksPerList, tsPL); var tasksPerItem = tsPL.List.Items.Select(x => new TasksOfItem() { Item = x, // may be same name of items, but in diff lists // ms tasks follows grouping task, id by id // hope there is no samenamed in each list Tasks = msProject.Tasks .Where(z => listTask.ID < z.ID && z.ID < nextListTaskId) .Where(z => z.Name == x.Name).ToList() }) .ToList(); foreach (var tsPI in tasksPerItem) { var itemName = tsPI.Item.Name; if (tsPI.Tasks.Count == 1) { logger.Info("== fixing item {0} - {1}%", itemName, tsPI.Item.Progress); FixItem(tsPI.Tasks[0], tsPI.Item.Progress); } else if (tsPI.Tasks.Count == 0) { logger.Debug("== no tasks for item {0}", itemName); } else { logger.Warn("== many tasks for item {0} - {1}", itemName, tsPI.Tasks.Count); } } } else if (tsPL.Tasks.Count == 0) { logger.Debug("= no tasks for list {0}", listname); } else { logger.Warn("= many tasks for list {0} - {1}", listname, tsPL.Tasks.Count); } } return(new XDocument(msProject.Xml)); }