Skip to content

Releases: joniles/mpxj

Version 16.4.0

10 Jun 14:39

Choose a tag to compare

  • Ensure that Expected Finish is rolled up from activities to WBS entries when reading P6 schedules.
  • Improve accuracy of reading relationships between tasks for certain MPP files.
  • Improve handling of different duration formats used in BK3 files.
  • Correct the logic used to set the critical flag on tasks when reading BK3 files.
  • Infer start and finish slack when reading BK3 files.
  • Ignore predecessor/succesor relations involving the project summary task when reading MPP files.

Version 16.3.0

01 Jun 07:49

Choose a tag to compare

  • Improve handling of role hierarchy when reading and writing P6 projects.
  • Add support for the Update Units When Costs Change On Resource Assignment project property when reading and writing P6 projects.
  • Add support for the Activity Default Price Per Unit project property when reading and writing P6 projects.
  • Improve handling of different duration formats used in BK3 files.
  • PrimaveraScheduler now has experimental support for populating the Driving flag on Relation and the Longest Path flag on Task when used to schedule a project.
  • Improve alignment of results from PrimaveraScheduler with projects scheduled in P6.

Version 16.2.0

12 May 07:59

Choose a tag to compare

  • Ensure numeric values are correctly formatted using decimal separator and digit grouping symbols when writing XER files.
  • Marked the GanttChartView#getProgressLinesBeginAtDate method as deprecated. Use the getProgressLinesBeginAt method instead.
  • Marked the GanttChartView#getProgressLinesDisplaySelectedDates method as deprecated. Use the getProgressLineDates method instead.
  • Improve handling of values which are rolled up from the project's tasks to the ProjectProperties class.
  • Improve handling of irregular timephased data.

Version 16.1.0

04 Apr 06:20

Choose a tag to compare

  • Provided additional attributes as part of the MsPlannerProject class, populated when retrieving a list of projects from Microsoft Planner (Contributed by Gevork Aslanov).
  • Added the MsPlannerReader#getPortfolios method to retrieve a list of portfolios defined in Microsoft Planner (Contributed by Gevork Aslanov).
  • Updated to ensure that decimal values for hours per day, week, month and year are not truncated when writing calendars to XER files.
  • Added support for reading timephased budget cost and work from MPP files.
  • Improve identification of Budget resources when reading certain MPP files.
  • Added the following methods to the ResourceAssignment class to retrieve raw timephased budget cost and work: getRawTimephasedBudgetCost, getRawTimephasedBudgetWork, getRawTimephasedBaselineBudgetWork, and getRawTimephasedBaselineBudgetCost.
  • Added the following methods to the ResourceAssignment class to retrieve timephased budget cost and work: getTimephasedBudgetCost, getTimephasedBudgetWork, getTimephasedBaselineBudgetCost, and getTimephasedBaselineBudgetWork.
  • Added the following methods to the Task class to retrieve timephased budget cost and work: getTimephasedBudgetCost, getTimephasedBudgetWork, getTimephasedBaselineBudgetCost, and getTimephasedBaselineBudgetWork.
  • Added support for accessing labor, non-labor and material costs from the task hierarchy for Primavera schedules.
  • Added ResourceType.NON_LABOR to represent Non-Labor resources in Primavera P6 schedules.
  • When reading Primavera P6 schedules Planned, Actual and Remaining Labor, Non-Labor, Material and Expense costs are now rolled up from resource assignments to the task hierarchy.
  • The following Planned Cost attributes have been added to the Task class: Planned Cost Labor, Planned Cost Non Labor, Planned Cost Material, Planned Cost Expense.
  • The following Actual Cost attributes have been added to the Task class: Actual Cost Labor, Actual Cost Non Labor, Actual Cost Material, Actual Cost Expense.
  • The following Remaining Cost attributes have been added to the Task class: Remaining Cost Labor, Remaining Cost Non Labor, Remaining Cost Material, Remaining Cost Expense.
  • For consistency, the Task#setActualWorkNonlabor method has been marked as deprecated, use Task#setActualWorkNonLabor instead.
  • For consistency, the Task#getActualWorkNonlabor method has been marked as deprecated, use Task#getActualWorkNonLabor instead.
  • For consistency, the Task#setPlannedWorkNonlabor method has been marked as deprecated, use Task#setPlannedWorkNonLabor instead.
  • For consistency, the Task#getPlannedWorkNonlabor method has been marked as deprecated, use Task#getPlannedWorkNonLabor instead.
  • For consistency, the Task#setRemainingWorkNonlabor method has been marked as deprecated, use Task#setRemainingWorkNonLabor instead.
  • For consistency, the Task#getRemainingWorkNonlabor method has been marked as deprecated, use Task#getRemainingWorkNonLabor instead.

Version 16.0.0

11 Mar 22:32

Choose a tag to compare

  • NEW FEATURES
  • JsonWriter now provides getWriteTimephasedData and setWriteTimephasedData methods. Setting this property to true will include timephased data in the JSON output. This property is set to false by default.
  • Classes implementing the FieldContainer interface (Task, Resource, ResourceAssignment) now provide the getTimephasedDurationValuesandgetTimephasedNumericValuesto allow access to timephased data using aFieldType` instance to determine the type of data required.
  • The Resource class now supports the following work methods: getPlannedWork, getActualRegularWork, getRemainingRegularWork.
  • The Resource class now supports the following cost methods: getPlannedCost, getActualRegularCost, getRemainingRegularCost.
  • The Resource class now supports the following material methods: getPlannedMaterial, getActualMaterial, getRemainingMaterial, getMaterial, getBaselineMaterial.
  • The Resource class now supports the following timephased work methods: getTimephasedPlannedWork, getTimephasedActualRegularWork, getTimephasedActualOvertimeWork, getTimephasedActualWork, getTimephasedRemainingRegularWork, getTimephasedRemainingOvertimeWork, getTimephasedRemainingWork, getTimephasedWork, getTimephasedBaselineWork.
  • The Resource class now supports the following timephased cost methods: getTimephasedPlannedCost, getTimephasedActualRegularCost, getTimephasedActualOvertimeCost, getTimephasedActualCost, getTimephasedRemainingRegularCost, getTimephasedRemainingOvertimeCost, getTimephasedRemainingCost, getTimephasedCost, getTimephasedBaselineCost.
  • The Resource class now supports the following timephased material methods: getTimephasedActualMaterial, getTimephasedRemainingMaterial, getTimephasedMaterial and getTimephasedBaselineMaterial.
  • The ResourceAssignment class now supports the following work methods: getActualRegularWork, getRemainingRegularWork.
  • The ResourceAssignment class now supports the following cost methods: getActualRegularCost, getRemainingRegularCost.
  • The ResourceAssignment class now supports the following material methods: getPlannedMaterial, getActualMaterial, getRemainingMaterial, getMaterial, getBaselineMaterial.
  • The ResourceAssignment class now supports the following methods to retrieve the raw representation of timephased work: getRawTimephasedPlannedWork, getRawTimephasedActualRegularWork, getRawTimephasedRemainingRegularWork, getRawTimephasedRemainingOvertimeWork, getRawTimephasedActualOvertimeWork
  • The ResourceAssignment class now supports the following timephased work methods: getTimephasedPlannedWork, getTimephasedActualRegularWork, getTimephasedActualOvertimeWork, getTimephasedActualWork, getTimephasedRemainingRegularWork, getTimephasedRemainingOvertimeWork, getTimephasedRemainingWork, getTimephasedWork, getTimephasedBaselineWork
  • The ResourceAssignment class now supports the following timephased cost methods: getTimephasedPlannedCost, getTimephasedRemainingRegularCost, getTimephasedRemainingOvertimeCost, getTimephasedRemainingCost, getTimephasedActualRegularCost, getTimephasedActualOvertimeCost, getTimephasedActualCost, getTimephasedCost, getTimephasedBaselineCost
  • The ResourceAssignment class now supports the following timephased material methods: getTimephasedActualMaterial, getTimephasedRemainingMaterial, getTimephasedMaterial and getTimephasedBaselineMaterial.
  • The ResourceAssignment class now supports the getWorkSplits method, which summarises timephased work into contiguous working periods.
  • The Task class now supports the following work methods: getPlannedWork, getActualRegularWork, getRemainingRegularWork.
  • The Task class now supports the following cost methods: getActualRegularCost, getRemainingRegularCost.
  • The Task class now supports the getWorkSplits method, which summarises timephased work into contiguous working periods.
  • The Task class now supports the following timephased work methods: getTimephasedPlannedWork, getTimephasedActualRegularWork, getTimephasedActualOvertimeWork, getTimephasedActualWork, getTimephasedRemainingRegularWork, getTimephasedRemainingOvertimeWork, getTimephasedRemainingWork, getTimephasedWork, getTimephased BaselineWork.
  • The Task class now supports the following timephased cost methods: getTimephasedPlannedCost, getTimephasedActualRegularCost, getTimephasedActualOvertimeCost, getTimephasedActualCost, getTimephasedRemainingRegularCost, getTimephasedRemainingOvertimeCost, getTimephasedRemainingCost, getTimephasedCost, getTimephasedBaselineCost, getTimephasedActualFixedCost, getTimephasedRemainingFixedCost, getTimephasedFixedCost.
  • The TimephasedItem, TimephasedWork, and TimephasedCost classes have a new getAmountPerHour method, which replaces the original getAmountPerDay method.
  • A new version of the TimescaleHelper#createTimescale (previously TimescaleUtility#createTimescale) method has been provided which takes and end date rather than a number of ranges.
  • BREAKING CHANGES
  • MSPDIWriter no longer provides the setSplitTimephasedAsDays and getSplitTimephasedAsDays methods. Timephased data is always written to the file exactly as MPXJ originally read it.
  • The TimescaleUtility class has been renamed TimescaleHelper and has been moved to the org.mpxj.common package.
  • The TimescaleHelper#createTimescale method now returns a List<LocalDateTimeRange> rather than an ArrayList<LocalDateTimeRange>
  • The TimescaleHelper#createTimescale method now returns half open ranges, for example a range representing 1st January 2026 would be expressed as 2026-01-01 00:00 to 2026-01-02 00:00 rather than 2026-01-01 00:00 to 2026-01-01 23:59.
  • The following ResourceAssignment timephased work methods have been removed and replaced by the getRaw methods noted above: getTimephasedPlannedWork, getTimephasedActualWork, getTimephasedWork, getTimephasedOvertimeWork, getTimephasedActualOvertimeWork, getTimephasedBaselineWork, getTimephasedBaselineCost
  • The following ResourceAssignment timephased work methods have been removed without replacement: setTimephasedPlannedWork, setTimephasedActualWork, setTimephasedWork, setTimephasedActualOvertimeWork, setTimephasedBaselineWork, setTimephasedBaselineCost.
  • The following ResourceAssignment timephased cost methods have been removed and replaced by the cost methods noted above: getTimephasedCost, getTimephasedActualCost.
  • The Task#getSplits method has been removed, used the Task#getWorkSplits method instead. Note that Task#getWorkSplits only returns ranges representing working time.
  • The getAmountPerDay method on the TimephasedItem, TimephasedWork, and TimephasedCost classes has been removed. Use the new getAmountPerHour method instead.
  • The getModified method on the TimephasedItem, TimephasedWork, and TimephasedCost classes has been removed. There is currently no replacement.
  • The TaskField.SPLITS enumeration value has been removed, use TaskField.WORK_SPLITS instead.
  • The AssignmentField.TIMEPHASED_WORK enumeration value has been removed, use TaskField.TIMEPHASED_REMAINING_REGULAR_WORK instead.
  • The AssignmentField.TIMEPHASED_ACTUAL_WORK enumeration value has been removed, use TaskField.TIMEPHASED_ACTUAL_REGULAR_WORK instead.
  • The order of the arguments supplied to the TimescaleUtility#createTimescale method has been changed.
  • The order of the arguments supplied to the TimescaleHelper#createTimescale method has been changed.
  • The alignment of the ranges returned by TimescaleHelper#createTimescale has changed when MINUTES or HOURS is specified as the required timescale units..
  • CHANGES
  • Updated to sqlite-jdbc 3.51.2.0
  • Updated to jsoup 1.22.1.
  • Updated to Jackson 2.21.1.
  • Updated to JUnit 5.14.3

Version 15.3.1

06 Feb 14:53

Choose a tag to compare

  • Fix a NullPointerException raised when a PMXML file does not have a default calendar defined.

Version 15.3.0

02 Feb 15:14

Choose a tag to compare

  • Updated PMXML schema to version 25.12.
  • Improve handling of timephased actual work, baseline work, and baseline cost when reading MPP files.
  • When reading XER files and P6 databases, ensure that calendar days are set as non-working if no working hours are present.
  • Updated MPXJ.Net to avoid an InvalidCastException when attempting to wrap an empty list attribute with ProxyList.
  • Fixed an issue writing JSON using JsonWriter when the Write Attribute Types option was set to true.

Version 15.2.0

13 Jan 12:52

Choose a tag to compare

  • Implemented support for reading projects from Microsoft Planner.
  • Improve handling of elapsed durations in ProjectCalendar calculations.
  • Improve Free Slack and Total Slack calculations.
  • Updated the TaskContainer#synchronizeTaskIDToHierarchy method to ensure that the task Outline Level attribute is also updated appropriately. (Based on a contribution by Šimon Macharáček)
  • Ensure that when reading MPP files and an attribute value from a lookup table is not recognised, null is returned rather than the GUID representing the value.

Version 15.1.0

08 Dec 19:28

Choose a tag to compare

  • Improve selection of the default calendar when reading Asta Powerproject PP files.
  • Added support for the calculated task attribute Schedule Percent Complete. Note that at present this is not calculated for WBS/Summary Tasks.
  • Added support for the Task attributes Estimated Weight, Auto Compute Actuals, and Original Budget. (Based on a contribution by danielfromCL)
  • Ensure that the Estimated Weight attribute is read from and written to WBS entries and Activities for P6 schedules. (Based on a contribution by danielfromCL)
  • Ensure that the Original Budget attribute is read from and written to WBS entries for P6 schedules. (Based on a contribution by danielfromCL)
  • Ensure that the Auto Compute Actuals flag is read from and written to Activities in P6 scheudles. (Based on a contribution by danielfromCL)
  • Fix an issue where the Activity attribute Longest Path was not being written to XER files. (Based on a contribution by danielfromCL)
  • Updated to POI 5.5.1.
  • Updated to Jackson 2.20.1.
  • Updated to jsoup 1.21.2.
  • Updated to sqlite-jdbc 3.51.1.0

Version 15.0.0

24 Nov 19:59

Choose a tag to compare

  • NEW FEATURES
  • Updated PrimaveraXERFileWriter to allow a list of projects to be written to an XER file.
  • Updated PrimaveraPMFileWriter to allow a list of projects to be written to a PMXML file.
  • CHANGES
  • Include all available baselines when reading Asta Powerproject PP files (Contributed by gitgood88).
  • MPXJ will now store an arbitrary number of baselines rather than the hard limit of 11 previously in place. Only baselines numbered 0-10 will be interpreted by MPXJ, other baselines can just be stored and retrieved.
  • Added the Last Scheduled Date and Activity Percent Complete Based On Activity Steps attributes to ProjectProperties and ensured these are read from and written to P6 schedules (Based on a contribution by danielfromCL).
  • Header rows for empty tables are no longer written to XER files.
  • Add support for the Project attribute Activity Default Calendar Unique ID.
  • Added the ProjectCalendar#getDefault method. This returns true if the current calendar is the default calendar for the project file (e.g. MPP files) or project database (e.g. P6 database).
  • Added the ProjectCalendar#setDefault method. Calling this method sets the calendar as the default for the project file or project database.
  • Added the ProjectCalendar#isParent method.
  • Added the ProjectCalendar#getDerivedCalendarsForProject method.
  • Added the ProjectCalendar#getProjectUniqueID and ProjectCalendar#setProjectUniqueIDmethods. This attribute is used to indicate that a calendar belongs to a specific project.
  • When writing PMXML files, ensure that OriginalProjectObjectId is populated for baseline projects.
  • Added the ProjectContext class to represent common context data which can (depending on the source application) be shared across multiple projects.
  • Added the ProjectFile#getProjectContext method to retrieve the ProjectContext instance to which a project belongs.
  • Added the Resource#getProjectContext method to retrieve the ProjectContext instance to which a resource belongs.
  • Added the ProjectCalendar#getProjectContext method to retrieve the ProjectContext instance to which a calendar belongs.
  • Added the ProjectFile#getCalendarsForProject method. This retrieves global calendars, and any project-specific calendars relevant for this project.
  • Added the Rate#valueOf method.
  • Added the TimeUnitDefaults class to allow time unit related default values to be held as part of the ProjectContext class.
  • Updated to POI 5.5.0
  • Updated to Jackcess 4.0.10. Removed explicit Commons Lang 3 dependency.
  • Updated to JUnit 5.14.1
  • BREAKING CHANGES
  • The ProjectFile#getBaselines method now returns a Map instance keyed by baseline index.
  • When using the readAll method to read PMXML files, only projects will now be returned. Any baseline ProjectFile instances will now only be linked to their parent projects, and will not be present in the list returned by readAll.
  • For P6 projects the ProjectFile#getCalendars method will include all calendars from the file or database being read. To retrieve only calendars relevant to the project use the ProjectFile#getCalendarsForProject method.
  • For P6 projects the ProjectCalendar#getDerivedCalendars method will include all derived calendars from the file or database being read. To retrieve derived calendars relevant to a specific project use the ProjectCalendar#getDerivedCalendarsForProject method.
  • Removed the ProjectEntity class. The ProjectProperties, Resource, ResourceAssignment and Task classes no longer inherit from this class. The ProjectProperties, ResourceAssignment and Task classes provide a replacement for the ProjectEntity#getParentFile method. The Resource class no longer has a getParentFile method.
  • Removed the ProjectCalendar#getParentFile method. Calendars no longer belong directly to projects, but instead belong to a ProjectContext instance.
  • Removed the Resource#addResourceAssignment method. This method was originally only intended for internal use within MPXJ.
  • The ResourceAssignment class no longer provides a public constructor. The Task#addResourceAssignment method should be used instead.
  • Removed the Task#addResourceAssignment(ResourceAssignment) method. Use the Task#addResourceAssignment(Resource) method instead.
  • Removed the Task#setSplits method. This method was originally only intended for internal use.