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.
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
ActualFinishis2025-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 areraising 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
RawTimephasedActualRegularWorkwas readable and returned 321 blocks running through2025-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
MPPReader.mpp, a single task with two resource assignments)The assignment
Task
Task 1(ID=2), resourceResource 2:Project
EarliestStartDate= 2024-03-14 09:00,LatestFinishDate= 2025-06-26 17:30.Steps to reproduce
C# against MPXJ.Net:
ReproMPP-Work.zip
Actual vs expected
16.7.0 (actual)
Sum of
TotalAmountacross the 286 blocks = 3369.0 min = 56.15h — matchesActualWorkexactly, despite the missing six weeks.GetTimephasedWork(timescale, TimeUnit.Days)over a daily timescale spanning the projectagrees: 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:
Expected
The actual work series should cover through
ActualFinish(2025-06-26), as MS Projectdisplays 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 ofproblem is invisible to total-based validation and only surfaces when per-period figures are
compared against the MS Project GUI.