Skip to content

Timephased actual work series ends ~6 weeks before ActualFinish (follow-up to #926) #929

Description

@cupacheeno

Timephased actual work series ends ~6 weeks before ActualFinish (follow-up to #926)

Summary

For one assignment in the attached MPP, the timephased actual work series stops on
2025-05-14, although the assignment is 100% complete and its ActualFinish is
2025-06-26 17:30. MS Project itself shows actual work spread across the full range,
ending 2025-06-26.

The lifetime total is correct — the series sums to exactly assignment.ActualWork
(56.15h) — so the work is not lost, it is compressed into a window that ends six weeks
early
. Anything that reports timephased work per day, week or month therefore attributes
those hours to the wrong dates, while totals still reconcile and look healthy.

Relationship to #926

This is the same file that reproduced #926. We upgraded to 16.7.0 to pick up that fix, and it
does resolve the exception — GetTimephasedWork() now returns without throwing. We are
raising this as a follow-up rather than a regression, because 16.2.0 never produced a usable
series for this assignment at all.

Worth noting as evidence that the June data is present in the file: under 16.2.0
RawTimephasedActualRegularWork was readable and returned 321 blocks running through
2025-06-26
(it was the subsequent GetTimephasedWork() segmentation that threw, per #926).
Under 16.7.0 the same accessor returns 286 blocks ending 2025-05-14 — the June blocks are
no longer there.

Environment

Library MPXJ.Net 16.7.0
Host .NET Framework 4.7.2, Windows 10 x64, via IKVM
Reader MPPReader
File attached (MS Project .mpp, a single task with two resource assignments)

The assignment

Task Task 1 (ID=2), resource Resource 2:

Work         = 56.15h      ActualWork = 56.15h      RemainingWork = 0.0h
Start        = 2024-04-17 09:00
Finish       = 2025-06-26 17:30
ActualStart  = 2024-04-17 09:00
ActualFinish = 2025-06-26 17:30
Stop         = 2025-06-26 17:30
Resume       = 2025-06-26 17:30
Task PercentComplete = 100

Project EarliestStartDate = 2024-03-14 09:00, LatestFinishDate = 2025-06-26 17:30.

Steps to reproduce

C# against MPXJ.Net:

ReproMPP-Work.zip

var file = new MPPReader().Read("ABD_TimephasedWorkIssue.mpp");

var task = file.GetTaskByID(2);
var assignment = task.ResourceAssignments
    .First(a => a.Resource != null && a.Resource.Name == "Resource 2");

var raw = assignment.RawTimephasedActualRegularWork;

Console.WriteLine("blocks       = " + raw.Count);
Console.WriteLine("first        = " + raw[0].Start);
Console.WriteLine("last         = " + raw[raw.Count - 1].Finish);
Console.WriteLine("ActualWork   = " + assignment.ActualWork);
Console.WriteLine("ActualFinish = " + assignment.ActualFinish);

Actual vs expected

16.7.0 (actual)

blocks       = 286
first        = 17/04/2024 9:00:00 AM
last         = 14/05/2025 9:30:00 AM     <-- series ends here
ActualWork   = 56.15h
ActualFinish = 26/06/2025 5:30:00 PM

Sum of TotalAmount across the 286 blocks = 3369.0 min = 56.15h — matches
ActualWork exactly, despite the missing six weeks.

GetTimephasedWork(timescale, TimeUnit.Days) over a daily timescale spanning the project
agrees: last non-zero day is 2025-05-14, total 56.15h.

The missing blocks

These blocks were present in 16.2.0's raw list and are absent under 16.7.0:

2025-06-06 09:00 .. 2025-06-10 09:30  total=30.0m  amountPerHour=4.0m
2025-06-13 09:00 .. 2025-06-16 09:30  total=45.0m  amountPerHour=6.0m
2025-06-20 09:00 .. 2025-06-23 09:30  total=30.0m  amountPerHour=4.0m
2025-06-26 09:00 .. 2025-06-26 17:00  total= 8.4m  amountPerHour=1.2m

Expected

The actual work series should cover through ActualFinish (2025-06-26), as MS Project
displays it.

Impact

We extract per-day work from MPPs for downstream financial and effort reporting. Because the
lifetime totals still reconcile exactly against Work / ActualWork, this class of
problem is invisible to total-based validation and only surfaces when per-period figures are
compared against the MS Project GUI.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions