Scheduling Engine improvements for v8.3

Sharing Tasks and Schedules

  • Single tasks or entire schedules can now only be shared among workspaces.
    • As of v8.3 they cannot be shared with specific users. Fixed in bfd 3444.
  • Tasks are shared as individual items.
  • Schedules are shared as a single, "summary" task.
    • They appear in the importing work plan as a single task with start date, end date and overall progress derived from the originating schedule
  • Allowed Actions while sharing are:
    • Individual tasks or entire schedules can be shared read-only with other workspaces
      • As of v8.3, objects can be shared in read-only mode only, which means, in the dependent schedule, the only changes to an shared (imported) task is to its name or description. These changes are not reflected back to the exporting work plan, but are unique to the dependent work plan.
      • Further, one cannot add assignments to these shared objects or capture work against them in the imported schedule.
    • Individual tasks or entire schedules can be copied to another workspace
      • This copies the chosen object into the importing schedule. Thus, such imported objects will act like any regular task created in the importing schedule.
    • As of v8.3, the option to move an object (copy it to the importing work plan and delet it from the original) is no longer available.
      • If an appropriate use-case is developed, then it can be implemented as part of a future release).

Adding (importing) external Tasks and Schedule

Exporting (sharing) of individual tasks or an entire schedule is controlled by the exporting (independent) workspace.

  • This workspace must specify which tasks (or the entire schedule) will be exportable to other workspaces.
  • It must specify whether the object can only be shared ("Share objects between multiple workspaces"), copied ("Allow other workspaces to make a copy of this object") or both by the importing workplan.
    • Again, shared objects are read-only.
  • It must specify which workspaces are allowed to import or copy the shared object.
    • If an task or schedule is not made sharable to a workspace, it will not appear on the list of available items to import for that workspace.

Restrictions on sharing of tasks and schedules

  • It does not make sense to import a task into a work plan multiple times (at multiple places).
  • When an entire schedule is imported into another work plan, it does not make sense to import any of that schedule's tasks to the same plan.
  • On the flip-side, the system should not let you import the schedule if you have already imported any of the schedule's tasks.
  • If a parent (summary) task is imported into a work plan, it does not make sense to import any of its child tasks to the same work plan.
  • Likewise, the system should not let you import a summary task if you have already imported one of its children.

Implementation:
As implemented in 8.3, when users select multiple shareable tasks these tasks are submited to the create external processing handler. Any tasks that cannot be added, due to whatever reason, are displayed as error messages in red on top of the page. (This is the usual handling or error messages in project.net) The rest of the tasks are successfully added.

Restrictions on indenting and linking of tasks in a work plan

  • Native tasks in the importing work plan can be dependent upon any imported task.
  • Imported tasks cannot be dependent upon tasks in the importing work plan.
  • Imported tasks can be a child of a summary task in the importing work plan (summary tasks are dependent upon its children, which are indented below it).
  • Imported tasks cannot have any children tasks in the importing work plan.

Task End-Point Calculations (TEC) of shared schedules

  • Shared tasks and schedules are always read-only for the importing work plans.
  • When the user changes/recalculates a work plan, the Task End-Point Calculations (TEC) is done only for that work plan and not any dependent work plans. All dependent work plans (those that import a work plan or task from the changed work plan) will not be recalculated; rather the dependent work plans will be marked as "dirty".
  • "Dirty" work plans will be clearly indicated as such on the UI when viewing that work plan.
  • Firing the "recalculate" from the toolbar for that work plan will recalculate the TEC for that schedule.

Implementation:
When calculating the TEC of a schedule we will not trigger the TEC of any dependent schedules. If the work plan has tasks shared to any schedule, those tasks are modified in the dependent schedule by simply copying the original task, that schedule is marked dirty, and the user sees a warning message (when the user views the work plan of that schedule) that this (the dependent) schedule needs to recalculate its end points.

Summary of Functionality changes in scheduling engine due to introduction of time sheet feature

Refer to Time sheet for more information on this feature.

  • The work complete for an assignment has been decoupled from the task work complete.
  • Updating the work complete field of any task does not re-distributes that among its assignments.
  • Adding, modifying and removing assignments from/to a task, does not alter their work complete.
  • Work complete of an assignment is derived from the actual work done by the resource for that task, which is captured as part of a time card entry, using the capture work page.
  • Work done by an unassigned resource for a task does not add the work and work complete for that resource to that task work and work complete.
  • We always maintain the rule: work for a task = sum of the work of all its assignments.
  • Keeping the above rule, when an unassigned resource that did some previous work on that task, is added then its work and work complete gets added to that task work.
  • Similarly, if an assigned resource has completed some work for a task then is unassigned, its work and work complete is reduced from the overall task work and work complete.
  • Any work complete directly updated in the task is stored as unallocated work complete.
  • Any unassigned assignment work complete is added to that task as unassociated work complete.
  • A task's work complete is equal to the sum of work complete of its assignments + its unallocated work complete.
  • Following rule is always maintained for any task: work >= work complete. So, if the task work complete (as derived from above) becomes greater than task work, the task work is made equal to its work complete.
  • Following rule is always maintained for any assignment: work >= work complete. So in the assignments page, one cannot set a work for any assignment which is less then its work complete. This in some way also ensures that the above mentioned rule also holds true.

Task and its Assignments handling of work, work complete and duration with respect to various actions

Task work modified:
The new work is re-distributed among its assignments.
The duration is modified accordingly.

Task work complete modified:
If the new work complete is more than the previous work complete the delta work is added to the task unassociated work complete.
If the new work complete is less than the previous work complete the delta work is subtracted from the task unassociated work complete.

Note*: In second case unassociated work complete may become less than zero. Not sure if we allow this or what would be its impact. Further if the work complete is made less than the actual work complete by its assignment, then again not sure what would be the impact if assignments are changed.

Capture work by unassigned resource:
The amount of work gets added to that task unassociated work complete.
There is no change in the task work or work complete.

Capture work by assigned resource:
If new work captured is greater than the unallocated work complete, then unallocated work complete is made to zero. Further the task work complete is incremented by previous work complete less unallocated work complete plus new work captured.

Note*: Here again not sure that, why are we not simply subtracting new work captured from task unallocated work complete rather than making it zero.

If new work captured is less than the unallocated work complete but greater than zero, then we simply subtract new work captured from task unallocated work complete. Here work complete is unchanged.
If new work captured is less than zero, then we reduce work complete by new work captured.
If new work plus all the previous work captured is greater than the task work, then we increment the task work by the delta amount and update the work complete accordingly (as mentioned above).
The duration is modified accordingly.

Adding a resource:
If the task had done some previous work for that task, its gets added to the task work and work complete, and reduced from the task unassociated work complete by that amount. The work is re distributed among its assignments.
The duration is modified accordingly.

Note*: Here again when reducing the unassociated work complete we don't make it less than zero. If that is the case then we set it to zero. Not sure if this handling is correct.

Removing a resource:
If the task had done some previous work for that task, its gets reduce from the task work and work complete, and added to the task unassociated work complete by that amount. The work is re distributed among its assignments.
The duration is modified accordingly.

Modifying work for an assigned resource:
The work for the task is modified accordingly.
The duration is modified accordingly.

Further note that*: while adding/removing/modifying assignments if the task work is changed such that new work is less than the old work then we subtract that delta work from task work complete and unallocated work complete. Here again we don't allow unallocated work complete be less than zero.

Notes of v8.3 scheduling engine on schedules created in prior versions

  • As of v8.3 we have ensured that work complete = unallocated work complete + work captured by assigned resources
  • Unassociated work complete = work captured by the unassigned resources.
  • So for schedules created in previous versions we need to write a fixer which would go to each task and ensure this relationship. Otherwise we we used new scheduling engine on old schedules, since this relationship is not maintained, we might not get right results for assignment actions on its task.