Reschedule work items in a Release / Iteration / Team Iteration
The number of entities that can be updated is limited. See the detailed information in the article Limits and Timeouts
How to apply this rule?
How to set Planned Dates based on Iteration/Release/Team Iteration dates?
Reschedule work items in a Release

[
{
"type": "source:targetprocess:EntityChanged",
"entityTypes": [
"Release"
],
"modifications": {
"created": false,
"deleted": false,
"updated": [
"StartDate"
]
}
},
{
"type": "action:JavaScript",
"script": "const MILLISECONDS_IN_DAY = 1000 * 3600 * 24;\n\nfunction differenceInDays(dateLeft, dateRight) {\n dateLeft = new Date(dateLeft);\n dateRight = new Date(dateRight);\n return Math.round((dateLeft.getTime() - dateRight.getTime()) / MILLISECONDS_IN_DAY);\n}\n\nfunction addDays(date, days) {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\nconst api = context.getService(\"targetprocess/api/v2\");\nconst assignables = await api.queryAsync(\"Assignable\", {\n select: \"{ id, plannedStartDate, plannedEndDate, entityType:entityType.Name }\",\n where: \"release.id = \" + args.ResourceId + \" and (plannedStartDate != null or plannedEndDate != null)\"\n});\n\nconst shift = differenceInDays(args.Current.StartDate, args.Previous.StartDate);\n\nreturn assignables.map(assignable => {\n const { id, entityType, plannedStartDate, plannedEndDate } = assignable;\n const start = plannedStartDate ? addDays(plannedStartDate, shift) : undefined;\n const end = plannedEndDate ? addDays(plannedEndDate, shift) : undefined;\n\n return {\n command: \"targetprocess:UpdateResource\",\n payload: {\n resourceId: id,\n resourceType: entityType,\n fields: {\n PlannedStartDate: start,\n PlannedEndDate: end\n }\n }\n }\n});"
}
]
Reschedule work items in an Iteration
The filter by Project.Name
is optional.

[
{
"type": "source:targetprocess:EntityChanged",
"entityTypes": [
"Iteration"
],
"modifications": {
"created": false,
"deleted": false,
"updated": [
"StartDate"
]
}
},
{
"type": "filter:Relational",
"or": [
{
"and": [
{
"target": {
"type": "field",
"name": "Name",
"target": {
"type": "field",
"name": "Project",
"target": {
"type": "pipelineBlockOutput"
}
}
},
"value": {
"type": "constant",
"value": "Custom Development"
},
"operator": {
"type": "is"
}
}
]
}
]
},
{
"type": "action:JavaScript",
"script": "const MILLISECONDS_IN_DAY = 1000 * 3600 * 24;\n\nfunction differenceInDays(dateLeft, dateRight) {\n dateLeft = new Date(dateLeft);\n dateRight = new Date(dateRight);\n return Math.round((dateLeft.getTime() - dateRight.getTime()) / MILLISECONDS_IN_DAY);\n}\n\nfunction addDays(date, days) {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\nconst api = context.getService(\"targetprocess/api/v2\");\nconst assignables = await api.queryAsync(\"Assignable\", {\n select: \"{ id, plannedStartDate, plannedEndDate, entityType:entityType.Name }\",\n where: \"iteration.id = \" + args.ResourceId + \" and (plannedStartDate != null or plannedEndDate != null)\"\n});\n\nconst shift = differenceInDays(args.Current.StartDate, args.Previous.StartDate);\n\nreturn assignables.map(assignable => {\n const { id, entityType, plannedStartDate, plannedEndDate } = assignable;\n const start = plannedStartDate ? addDays(plannedStartDate, shift) : undefined;\n const end = plannedEndDate ? addDays(plannedEndDate, shift) : undefined;\n\n return {\n command: \"targetprocess:UpdateResource\",\n payload: {\n resourceId: id,\n resourceType: entityType,\n fields: {\n PlannedStartDate: start,\n PlannedEndDate: end\n }\n }\n }\n});"
}
]
Reschedule work items in a Team Iteration
The filter by Team.Name
is optional.

[
{
"type": "source:targetprocess:EntityChanged",
"entityTypes": [
"TeamIteration"
],
"modifications": {
"created": false,
"deleted": false,
"updated": [
"StartDate"
]
}
},
{
"or": [
{
"and": [
{
"value": {
"type": "constant",
"value": "Scrum Team"
},
"target": {
"name": "Name",
"type": "field",
"target": {
"name": "Team",
"type": "field",
"target": {
"type": "pipelineBlockOutput"
}
}
},
"operator": {
"type": "is"
}
}
]
}
],
"type": "filter:Relational"
},
{
"type": "action:JavaScript",
"script": "const MILLISECONDS_IN_DAY = 1000 * 3600 * 24;\n\nfunction differenceInDays(dateLeft, dateRight) {\n dateLeft = new Date(dateLeft);\n dateRight = new Date(dateRight);\n return Math.round((dateLeft.getTime() - dateRight.getTime()) / MILLISECONDS_IN_DAY);\n}\n\nfunction addDays(date, days) {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\nconst api = context.getService(\"targetprocess/api/v2\");\nconst assignables = await api.queryAsync(\"Assignable\", {\n select: \"{ id, plannedStartDate, plannedEndDate, entityType:entityType.Name }\",\n where: \"teamIteration.id = \" + args.ResourceId + \" and (plannedStartDate != null or plannedEndDate != null)\"\n});\n\nconst shift = differenceInDays(args.Current.StartDate, args.Previous.StartDate);\n\nreturn assignables.map(assignable => {\n const { id, entityType, plannedStartDate, plannedEndDate } = assignable;\n const start = plannedStartDate ? addDays(plannedStartDate, shift) : undefined;\n const end = plannedEndDate ? addDays(plannedEndDate, shift) : undefined;\n\n return {\n command: \"targetprocess:UpdateResource\",\n payload: {\n resourceId: id,\n resourceType: entityType,\n fields: {\n PlannedStartDate: start,\n PlannedEndDate: end\n }\n }\n }\n});"
}
]
Updated almost 6 years ago