Name
global.ShadowTaskHandler
Description
One of the PostEngineHandlers called by Recalculation Engine It checks if a Shadow Task in project is modified (this will happen in predecessor project) or it checks if a Shadow Task in project is deleted (this will happen in successor project) For updates, we raise events and notifications For deletes, we perform cleanup by deleting relations in other projects, external relations, and other project shadow tasks
Script
ShadowTaskHandler = Class.create();
ShadowTaskHandler.prototype = {
initialize: function() {
this.topTask = new GlideRecord('planned_task');
},
process: function(topTaskId, jsonData) {
PPMDebug.log("Into ShadowTaskHandler: process -> " + topTaskId + " | jsonData -> " + jsonData);
if(this.topTask.get(topTaskId) && JSUtil.notNil(jsonData)) {
var jsonDataObj = (new JSON()).decode(jsonData);
// we only need to trigger recalculate on hard depdencies for updated tasks
this.triggerRecalculateOnShadowTasks(topTaskId, jsonDataObj);
// delete of task(s) will delete the relations
this.checkAndDeleteExternalRelations(topTaskId, jsonDataObj);
}
},
checkAndDeleteExternalRelations: function (topTaskId, jsonDataObj) {
PPMDebug.log("Into ShadowTaskHandler: checkAndDeleteExternalRelations -> " + topTaskId);
var data = {};
data.tasks = [];
data.relations = [];
var links = jsonDataObj.links || [];
var tasks = jsonDataObj.tasks || [];
var deletedTasks = tasks.filter(function(task) {
PPMDebug.log(task.short_description + ' ' +task.is_deleted + ' ' +task.orig_sys_id);
return task.is_deleted;
});
var deletedRelations = links.filter(function(link) { return link.is_deleted && JSUtil.notNil(link.orig_sys_id); });
data.tasks = deletedTasks;
data.relations = deletedRelations;
PPMDebug.log('Into ShadowTaskHandler: '+ deletedTasks.length + ' ' + deletedRelations.length);
PPMDebug.log('Into ShadowTaskHandler tasks: ' + JSON.stringify(deletedTasks));
PPMDebug.log('Into ShadowTaskHandler relations: ' + JSON.stringify(deletedRelations));
if( deletedTasks.length > 0 ) {
PPMDebug.log("Into ShadowTaskHandler: shadows deleted -> " + JSON.stringify(data));
(new InterProjectTaskDeletionHandler()).process(JSON.stringify(data));
} else if(deletedRelations.length > 0) {
PPMDebug.log("Into ShadowTaskHandler: relations deleted -> " + JSON.stringify(deletedRelations));
this.processDeletedRelations(deletedRelations);
}
},
triggerRecalculateOnShadowTasks: function(topTaskId, jsonDataObj) {
PPMDebug.log("Into ShadowTaskHandler: triggerRecalculateOnShadowTasks -> " + topTaskId);
var shadowTaskIds = this.shadowTaskIds(jsonDataObj);
PPMDebug.log("Into ShadowTaskHandler: shadowTaskIds -> " + JSON.stringify(shadowTaskIds));
if(shadowTaskIds.length > 0) {
(new ProjectChangeNotifier()).broadcastDownStream(shadowTaskIds);
}
},
shadowTaskIds: function (jsonDataObj) {
PPMDebug.log("Into ShadowTaskHandler: shadowTaskIds");
var shadowTaskIds = [];
var tasks = jsonDataObj.tasks;
if(JSUtil.notNil(tasks) && tasks.length > 0) {
for (var i = 0; i < tasks.length; i++) {
var task = tasks[i];
if(!task.is_deleted && (task.shadow == "true" || task.shadow == "1")) {
// Only Hard depdencies has to handles - ideally new/dirty once reaches here
PPMDebug.log("shadowTask -> " + JSON.stringify(task));
if(!task.is_new) {
shadowTaskIds.push({ sys_id: task.id || task.sys_id,
orig_sys_id: task.orig_sys_id,
orig_top_task_id: task.orig_top_task_id,
relation_applied: task.relation_applied,
previous_start_date: task.previous_start_date,
previous_end_date: task.previous_end_date,
start_date: task.start_date,
end_date: task.end_date
});
}
}
}
}
PPMDebug.log("shadowTaskIds -> " + JSON.stringify(shadowTaskIds));
return shadowTaskIds;
},
processDeletedRelations: function (relations) {
PPMDebug.log("Into ShadowTaskHandler: processDeletedRelations -> " + JSON.stringify(relations));
if(relations && relations.length > 0) {
var origRelations = [];
for (var i = 0; i < relations.length; i++) {
var rel = relations[i];
PPMDebug.log("Into ShadowTaskHandler: deletedRelation -> " + JSON.stringify(relations[i]));
if(JSUtil.notNil(rel.orig_sys_id)) {
var origRel = PlannedTaskRelation.get(rel.orig_sys_id);
if(origRel.isValidRecord()) {
PPMDebug.log("Into ShadowTaskHandler: deleting origRel -> " + rel.orig_sys_id);
origRel.deleteRecord(true);
}
}
}
}
},
type: 'ShadowTaskHandler'
};
Sys ID
3193cd349f122200598a5bb0657fcf34