Split assignment work#
Hand one task's work to several people, for example one developer for the first two days and another for the rest, without changing the task's dates.
Use the offset and duration fields of AssignmentData to do this. Each assignment books only its own part of the task, called a slice. For how slices affect load, see Resources and assignments.
Steps#
-
Book each person on their part of the task. Both fields are worked time in the task's
duration_unit, counted from the task start:offset: where the slice starts. Absent ornullmeans the task start.duration: how much work the slice books. Absent ornullmeans up to the task end.
Anna works the first 2 days of
build. Ben starts after 2 days of work and finishes the task. -
Pass the assignments to
solve(dataJson, …)as usual. Then check the booked load withloadProfile:const = ; const = ; -
To move the handover in a live project, send an
assignments.updateentry for each slice in aSchedulingChangespayload. Pass it toapply, then callsolve(undefined, "{}"): -
To book the whole task again, set the field to
nullin the update entry."offset": nullgoes back to the task start, and"duration": nullgoes up to the task end. A field you leave out stays as it is.
The full example splits the 4-day build task between Anna and Ben, prints their daily load, then moves the handover one day later:
const = ;
const = ;
const = new;
loadProfile needs a solved project. After apply it returns a project error with code no-baseline, so call solve(undefined, "{}") before you read the load again.
Things to check#
-
Slices never move tasks. A slice edit leaves every task date as it was, but it changes the
baselineId. A change set that still carries the old token returns aprojecterror with codestale-baseline. -
The engine clips the slice to the task's work when it books load. A slice that runs past the task end books only up to the end. An
offsetat or past the task's duration books nothing. If the task gets shorter later, the slice follows it. -
Non-working time and leveling pauses don't count as worked time. A pause or a
leveling_delaymoves the slice together with the work. -
Two slices of the same resource on the same task add up where they overlap.
-
Strict validation rejects an
offsetbelow0or not finite, and adurationof0or less or not finite.solve(dataJson, …)returns avalidationerror envelope with the path:In
apply, the same values show up as rejected operations inrejected, at paths likeassignments.update[0], and setneedsResync. See Recover from rejected changes. -
A project created with
new JsonProject('{"validation":"repair"}')clears an invalid value and adds arepairednote, so the assignment books the whole task. See Accept messy input. -
An assignment on an unscheduled task keeps its slice and books it again when the task is scheduled.
Result#
Run the example with node. It prints each person's load for Monday to Friday, before and after the handover moves:
handover after day 2
anna: [1,1,0,0,0]
ben: [0,0,1,1,0]
handover after day 3, moved tasks: 0
anna: [1,1,1,0,0]
ben: [0,0,0,1,0]
The load moves from Ben to Anna on Wednesday. build keeps its dates, so solve without data reports no moved tasks.