diff --git a/CHANGELOG.md b/CHANGELOG.md index 75b295b8c4..5dc9eafeea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,27 @@ # Changelog -## 12.4.1 (unreleased) +## 12.5.1 (unreleased) + +## 12.5.0 (2023-12-18) +* Add support for the following Resource Assignment attributes: Remaining Early Start, Remaining Early Finish, Remaining Late Start, and Remaining Late Finish. +* Ensure that the Resource Assignment attributes Remaining Early Start and Remaining Early Finish are read from and written to PMXML files. +* Ensure that the Resource Assignment attributes Remaining Early Start, Remaining Early Finish, Remaining Late Start, and Remaining Late Finish are read from and written to XER files. * Improve accuracy of reading and writing the `ProjectProperties` Relationship Lag Calendar attribute for PMXML files. +* All P6 scheduling and leveling options which were previously made available via the `ProjectProperties` custom properties map are now deprecated. These properties now have individual getter and setter methods available on the `ProjectProperties` class. Note: this may be a breaking change if you were creating schedules from scratch, populating the custom properties map, then writing PMXML or XER files. In this case you will need to update your code, for all other use cases your code will continue to work unchanged until the next major version of MPXJ. +* Added support for reading and writing the `ProjectProperties` attributes Baseline Type Name, Baseline Type Unique ID, and Last Baseline Update Date for baseline projects in PMXML files. +* When reading projects from PMXML files, if the creation date attribute is not present in the file fall back to populating the `ProjectProperties` creation date attribute with the PMXML date added attribute. +* When writing PMXML files, ensure the date added attribute for projects is populated with the creation date. +* Add the `CustomFieldContainer.remove` method to allow field configurations to be removed. +* Updated the `UserDefinedFieldContainer.remove` method to ensure that any associated field configuration is removed from the `CustomFieldContainer`. +* Ensure that Microsoft Project's "unknown" resource (with Unique ID zero) is not exported to XER files. +* Ensure that resource assignments which are not associated with an Activity or a Resource are not written to XER files. +* Durations are written to PMXML files in hours. We now round to 2 decimal places to allow minutes to be represented, and avoid unnecessary precision. +* Currency amounts written to PMXML files are now rounded to 8 decimal places to more closely match the behavior of P6, and avoid unnecessary precision. +* Decimal amounts other than currency and duration are written to PMXML files with 15 decimal places to more closely match the behavior of P6. +* Fix an issue reading ConceptDraw calendars. +* Fixed a misspelled field name in the JSON output (Contributed by Daniel Taylor). +* Improved handling of the Resource Assignment Planned and Remaining Units and Units per Time attributes read from and written to P6 schedules. +* Added support for the following project properties: Activity ID Prefix, Activity ID Suffix, Activity ID Increment and Activity ID Based On Selected Activity, and ensure these are read from and written to P6 schedules. ## 12.4.0 (2023-11-23) * Added support for the WBS Code Separator attribute to `ProjectProperties`. @@ -539,7 +559,7 @@ * When reading resource assignments from an MPP file, don't record Project's internal representation of a null resource ID (-65535), record the resource ID explicitly as null. * For MPX and Planner files, don't write resource assignments for the "null" resource. * Handle missing status date when reading P6 schedules from XER files or database. -* When reading MPP files, treat UUID's which are all zeros as null. +* When reading MPP files, treat UUIDs which are all zeros as null. * Deprecate the 10 Resource Outline Code get and set methods and replace with get and set methods which take an index argument. * Provide a helper method (PrimaveraHelper.baselineKey) to encapsulate key generation for setting Primavera baselines. @@ -560,7 +580,7 @@ * Preserve multiple assignments between an activity and a resource when reading P6 schedules. * Renamed WorkContour.isFlat to isContourFlat and WorkContour.isContoured to isContourManual. * Include an entry for 0% in the WorkContour curve definition. -* Fix an issue where non working days were not being treated correctly in date calculations if they happen to still have time ranges attached. +* Fix an issue where non-working days were not being treated correctly in date calculations if they happen to still have time ranges attached. ## 9.3.0 (2021-05-06) * Add support for reading roles from P6 databases, XER and PMXML files, and for writing roles to PMXML files. Roles are represented as resources. The new resource Boolean attribute "Role" is used to distinguish between Resource instances which represent resources and those which represent roles. @@ -715,7 +735,7 @@ * Correctly determine the constraint type for tasks with ALAP placement with or without predecessors when reading from Asta schedules (Contributed by Dave McKay) * Gracefully handle a missing table name when reading an XER file. * Gracefully handle an unexpected calendar data when reading an XER file. -* Correctly handle XER files with multi-byte character encoding. +* Correctly handle XER files with multibyte character encoding. * Import all schedule and leveling options from XER files. * Ensure project calendars are read from PMXML files. * Added readAll methods to PrimaveraPMFileReader to allow all projects contained in a PMXML file to be read in a single pass. @@ -997,7 +1017,7 @@ * Further improvements to task pruning for Asta PP files. ## 7.0.1 (2017-11-20) -* Improve robustness when reading MPP files when using certain 64 bit Java runtimes. +* Improve robustness when reading MPP files when using certain 64-bit Java runtimes. * Populate the project's comments property when reading an MSPDI file. * Ensure that tasks are not discarded when reading PP files from older Asta versions. * Fixed [Issue 319](https://sourceforge.net/p/mpxj/bugs/319): Wrong date ranges for split tasks @@ -1740,7 +1760,7 @@ * Updated to automatically generate WBS for tasks read from MPP files when no WBS information is present in the file. * Fixed a bug when reading MPP files where task finish dates appeared before the start date where a "start no later than" constraint was in use. * Fixed a bug which resulted in invalid MPX files being generated when a project either had no tasks, or it had no resources. -* Fixed a long standing bug where the calendar records were being written into MPX files after they were referred to in the project summary record. +* Fixed a long-standing bug where the calendar records were being written into MPX files after they were referred to in the project summary record. * Fixed a bug where WBS and Outline Levels were not being auto generated correctly when an MPP file contained a project summary task. * Fixed a bug where split tasks were not being reported correctly. @@ -1807,7 +1827,7 @@ * Updated MpqjQuery to parse MSPDI files as well as MPP and MPX files. * Added support for early start, early finish, late start, late finish to MPP files. * Updated MPP9 file support to handle start as late as possible constraints. -* Added support for sub project file information in MPP9 files. +* Added support for subproject file information in MPP9 files. * Fixed a bug where occasionally a task in MPP9 files were not being read. * Fixed a NegativeArrayIndexException thrown when reading certain MPP8 files. * Reduced the memory used by MPXJ by anything up to 60%, particularly when reading large MPP files. @@ -1820,9 +1840,9 @@ ## 0.0.24 (2005-01-10) * Fixed a bug (again!) where deleted resource assignments in MPP9 files were still seen by MPXJ. * Updated to use class instances instead of primitives to represent some enumerated types. -* Updated to implement support for reading and writing all of the basic Resource attributes found in MSPDI files. -* Updated to implement support for reading and writing all of the basic Task attributes found in MSPDI files. -* Updated to implement support for reading and writing all of the basic Project Header attributes from MPP8 and MPP9 files. +* Updated to implement support for reading and writing all the basic Resource attributes found in MSPDI files. +* Updated to implement support for reading and writing all the basic Task attributes found in MSPDI files. +* Updated to implement support for reading and writing all the basic Project Header attributes from MPP8 and MPP9 files. * Made MSPDI file parsing more robust to allow it by default to cope with non-schema-compliant XML in the same manner as MS Project. Implemented a new compatibility flag to allow this behaviour to be disabled in favour of strict parsing. * Merged DateTimeSettings, CurrencySettings, and DefaultSettings into the ProjectHeader class. This change makes the project header data easier to use as it is in a single place. It also makes the entities used to describe a project consistent with the contents of the MPP and MSPDI file formats. @@ -1838,7 +1858,7 @@ * Fixed a bug where MPXFile attributes were not being correctly copied by the copy constructor. * Fixed a rounding error in MPXCalendar.getDaysInRange (contributed by Wade Golden) * Updated to make MPXJ more robust in the face of unexpected offsets in MPP8 file format. -* Updated support for password protected files to allow write reserved files to be read. +* Updated support for password-protected files to allow write-reserved files to be read. * Updated to use the latest version of JAXB, as shipped in Sun's Java Web Services Developer Pack (JWSDP) version 1.4. * Updated the distribution to include the redistributable files from the JWSDP JAXB implementation. Users will no longer need to download JWSDP separately in order to make use of MPXJ's MSPDI functionality. * Updated to prevent empty notes records being added to tasks and resources when reading an MSPDI file. diff --git a/build.xml b/build.xml index 75d8729b13..e9447185ef 100644 --- a/build.xml +++ b/build.xml @@ -7,7 +7,7 @@ - + diff --git a/pom.xml b/pom.xml index b634faa2fd..c2a58988e0 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ mpxj - 12.4.0 + 12.5.0 MPXJ http://mpxj.org diff --git a/src.net/samples/MpxjConvert/Properties/AssemblyInfo.cs b/src.net/samples/MpxjConvert/Properties/AssemblyInfo.cs index 03afca6b32..ea0e1febf6 100644 --- a/src.net/samples/MpxjConvert/Properties/AssemblyInfo.cs +++ b/src.net/samples/MpxjConvert/Properties/AssemblyInfo.cs @@ -31,6 +31,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyFileVersion("12.4.0.0")] +// [assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyFileVersion("12.5.0.0")] diff --git a/src.net/samples/MpxjCreate/Properties/AssemblyInfo.cs b/src.net/samples/MpxjCreate/Properties/AssemblyInfo.cs index 9dcbf6979f..7ed3030db2 100644 --- a/src.net/samples/MpxjCreate/Properties/AssemblyInfo.cs +++ b/src.net/samples/MpxjCreate/Properties/AssemblyInfo.cs @@ -31,6 +31,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyFileVersion("12.4.0.0")] +// [assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyFileVersion("12.5.0.0")] diff --git a/src.net/samples/MpxjPrimaveraConvert/Properties/AssemblyInfo.cs b/src.net/samples/MpxjPrimaveraConvert/Properties/AssemblyInfo.cs index 5bc6e5ed31..288d0e50e9 100644 --- a/src.net/samples/MpxjPrimaveraConvert/Properties/AssemblyInfo.cs +++ b/src.net/samples/MpxjPrimaveraConvert/Properties/AssemblyInfo.cs @@ -31,6 +31,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyFileVersion("12.4.0.0")] +// [assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyFileVersion("12.5.0.0")] diff --git a/src.net/samples/MpxjQuery/Properties/AssemblyInfo.cs b/src.net/samples/MpxjQuery/Properties/AssemblyInfo.cs index 6e659c1a6e..348821cabc 100644 --- a/src.net/samples/MpxjQuery/Properties/AssemblyInfo.cs +++ b/src.net/samples/MpxjQuery/Properties/AssemblyInfo.cs @@ -31,6 +31,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyFileVersion("12.4.0.0")] +// [assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyFileVersion("12.5.0.0")] diff --git a/src.net/samples/MpxjTest/Properties/AssemblyInfo.cs b/src.net/samples/MpxjTest/Properties/AssemblyInfo.cs index d1137e7c1c..8d02bfd24d 100644 --- a/src.net/samples/MpxjTest/Properties/AssemblyInfo.cs +++ b/src.net/samples/MpxjTest/Properties/AssemblyInfo.cs @@ -32,6 +32,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyFileVersion("12.4.0.0")] +// [assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyFileVersion("12.5.0.0")] diff --git a/src.net/utilities/AssemblyInfo.cs b/src.net/utilities/AssemblyInfo.cs index c3c9f838ee..b9f66d0bbb 100644 --- a/src.net/utilities/AssemblyInfo.cs +++ b/src.net/utilities/AssemblyInfo.cs @@ -32,6 +32,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyVersion("12.4.0.0")] -[assembly: AssemblyFileVersion("12.4.0.0")] +// [assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyVersion("12.5.0.0")] +[assembly: AssemblyFileVersion("12.5.0.0")] diff --git a/src.net/utilities/MpxjUtilities.nca31.csproj b/src.net/utilities/MpxjUtilities.nca31.csproj index bb29a50189..f8de464afa 100644 --- a/src.net/utilities/MpxjUtilities.nca31.csproj +++ b/src.net/utilities/MpxjUtilities.nca31.csproj @@ -6,7 +6,7 @@ netcoreapp3.1 true ..\mpxj.snk - 12.4.0.0 + 12.5.0.0 Copyright © Packwood Software diff --git a/src.python/mpxj/setup.py b/src.python/mpxj/setup.py index 31018dc6be..77fb623a71 100644 --- a/src.python/mpxj/setup.py +++ b/src.python/mpxj/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="mpxj", - version="12.4.0", + version="12.5.0", author="Jon Iles", author_email="jon.iles@bcs.org.uk", description="Python wrapper for the MPXJ Java library for manipulating project files", diff --git a/src.ruby/mpxj/lib/mpxj/assignment_methods.rb b/src.ruby/mpxj/lib/mpxj/assignment_methods.rb index 20f6dd1d7d..7cb320348d 100644 --- a/src.ruby/mpxj/lib/mpxj/assignment_methods.rb +++ b/src.ruby/mpxj/lib/mpxj/assignment_methods.rb @@ -2825,6 +2825,34 @@ def remaining_cost get_float_value(attribute_values['remaining_cost']) end + # Retrieve the Remaining Early Finish value + # + # @return Remaining Early Finish value + def remaining_early_finish + get_date_value(attribute_values['remaining_early_finish']) + end + + # Retrieve the Remaining Early Start value + # + # @return Remaining Early Start value + def remaining_early_start + get_date_value(attribute_values['remaining_early_start']) + end + + # Retrieve the Remaining Late Finish value + # + # @return Remaining Late Finish value + def remaining_late_finish + get_date_value(attribute_values['remaining_late_finish']) + end + + # Retrieve the Remaining Late Start value + # + # @return Remaining Late Start value + def remaining_late_start + get_date_value(attribute_values['remaining_late_start']) + end + # Retrieve the Remaining Overtime Cost value # # @return Remaining Overtime Cost value @@ -3901,6 +3929,10 @@ def work_variance 'rate_source' => :rate_source, 'regular_work' => :work, 'remaining_cost' => :currency, + 'remaining_early_finish' => :date, + 'remaining_early_start' => :date, + 'remaining_late_finish' => :date, + 'remaining_late_start' => :date, 'remaining_overtime_cost' => :currency, 'remaining_overtime_work' => :work, 'remaining_work' => :work, diff --git a/src.ruby/mpxj/lib/mpxj/property_methods.rb b/src.ruby/mpxj/lib/mpxj/property_methods.rb index 4fe65535ca..d693d8b44c 100644 --- a/src.ruby/mpxj/lib/mpxj/property_methods.rb +++ b/src.ruby/mpxj/lib/mpxj/property_methods.rb @@ -4,6 +4,34 @@ def self.included(base) base.extend(PropertyClassMethods) end + # Retrieve the Activity ID Increment value + # + # @return Activity ID Increment value + def activity_id_increment + get_integer_value(attribute_values['activity_id_increment']) + end + + # Retrieve the Activity ID Increment Based On Selected Activity value + # + # @return Activity ID Increment Based On Selected Activity value + def activity_id_increment_based_on_selected_activity + get_boolean_value(attribute_values['activity_id_increment_based_on_selected_activity']) + end + + # Retrieve the Activity ID Prefix value + # + # @return Activity ID Prefix value + def activity_id_prefix + attribute_values['activity_id_prefix'] + end + + # Retrieve the Activity ID Suffix value + # + # @return Activity ID Suffix value + def activity_id_suffix + get_integer_value(attribute_values['activity_id_suffix']) + end + # Retrieve the Actuals In Sync value # # @return Actuals In Sync value @@ -221,6 +249,20 @@ def baseline_start get_date_value(attribute_values['baseline_start']) end + # Retrieve the Baseline Type Name value + # + # @return Baseline Type Name value + def baseline_type_name + attribute_values['baseline_type_name'] + end + + # Retrieve the Baseline Type Name value + # + # @return Baseline Type Name value + def baseline_type_unique_id + get_integer_value(attribute_values['baseline_type_unique_id']) + end + # Retrieve the Baseline Work value # # @return Baseline Work value @@ -228,6 +270,27 @@ def baseline_work get_duration_value(attribute_values['baseline_work']) end + # Retrieve the Calculate Float on Finish Date of Each Project value + # + # @return Calculate Float on Finish Date of Each Project value + def calculate_float_based_on_finish_date_of_each_project + get_boolean_value(attribute_values['calculate_float_based_on_finish_date_of_each_project']) + end + + # Retrieve the Calculate Multiple Float Paths value + # + # @return Calculate Multiple Float Paths value + def calculate_multiple_float_paths + get_boolean_value(attribute_values['calculate_multiple_float_paths']) + end + + # Retrieve the Calculate Multiple Paths Using Total Float value + # + # @return Calculate Multiple Paths Using Total Float value + def calculate_multiple_float_paths_using_total_float + get_boolean_value(attribute_values['calculate_multiple_float_paths_using_total_float']) + end + # Retrieve the Category value # # @return Category value @@ -249,6 +312,27 @@ def company attribute_values['company'] end + # Retrieve the Compute Start to Start Lag From Early Start value + # + # @return Compute Start to Start Lag From Early Start value + def compute_start_to_start_lag_from_early_start + get_boolean_value(attribute_values['compute_start_to_start_lag_from_early_start']) + end + + # Retrieve the Consider Assignments In Other Projects value + # + # @return Consider Assignments In Other Projects value + def consider_assignments_in_other_projects + get_boolean_value(attribute_values['consider_assignments_in_other_projects']) + end + + # Retrieve the Consider Assignments In Other Project With Priority Equal or Higher Than value + # + # @return Consider Assignments In Other Project With Priority Equal or Higher Than value + def consider_assignments_in_other_projects_with_priority_equal_higher_than + get_integer_value(attribute_values['consider_assignments_in_other_projects_with_priority_equal_higher_than']) + end + # Retrieve the Content Status value # # @return Content Status value @@ -333,6 +417,13 @@ def custom_properties attribute_values['custom_properties'] end + # Retrieve the Date Date and Planned Start Set To Project Forecast Start value + # + # @return Date Date and Planned Start Set To Project Forecast Start value + def data_date_and_planned_start_set_to_project_forecast_start + get_boolean_value(attribute_values['data_date_and_planned_start_set_to_project_forecast_start']) + end + # Retrieve the Date Format value # # @return Date Format value @@ -445,6 +536,13 @@ def default_work_units attribute_values['default_work_units'] end + # Retrieve the Calculate Multiple Float Paths Ending With Activity Unique ID value + # + # @return Calculate Multiple Float Paths Ending With Activity Unique ID value + def display_multiple_float_paths_ending_with_activity_unique_id + get_integer_value(attribute_values['display_multiple_float_paths_ending_with_activity_unique_id']) + end + # Retrieve the Document Version value # # @return Document Version value @@ -564,6 +662,13 @@ def hyperlink_base attribute_values['hyperlink_base'] end + # Retrieve the Ignore Relationships To And From Other Projects value + # + # @return Ignore Relationships To And From Other Projects value + def ignore_relationships_to_and_from_other_projects + get_boolean_value(attribute_values['ignore_relationships_to_and_from_other_projects']) + end + # Retrieve the Inserted Projects Like Summary value # # @return Inserted Projects Like Summary value @@ -599,6 +704,13 @@ def last_author attribute_values['last_author'] end + # Retrieve the Last Baseline Update Date value + # + # @return Last Baseline Update Date value + def last_baseline_update_date + get_date_value(attribute_values['last_baseline_update_date']) + end + # Retrieve the Last Saved value # # @return Last Saved value @@ -606,6 +718,34 @@ def last_saved get_date_value(attribute_values['last_saved']) end + # Retrieve the Leveling Priorities value + # + # @return Leveling Priorities value + def leveling_priorities + attribute_values['leveling_priorities'] + end + + # Retrieve the Level All Resources value + # + # @return Level All Resources value + def level_all_resources + get_boolean_value(attribute_values['level_all_resources']) + end + + # Retrieve the Level Resources Only Within Activity Total Float value + # + # @return Level Resources Only Within Activity Total Float value + def level_resources_only_within_activity_total_float + get_boolean_value(attribute_values['level_resources_only_within_activity_total_float']) + end + + # Retrieve the Limit Number of Float Paths to Calculate value + # + # @return Limit Number of Float Paths to Calculate value + def limit_number_of_float_paths_to_calculate + get_boolean_value(attribute_values['limit_number_of_float_paths_to_calculate']) + end + # Retrieve the Location Unique ID value # # @return Location Unique ID value @@ -613,6 +753,13 @@ def location_unique_id get_integer_value(attribute_values['location_unique_id']) end + # Retrieve the Make Open Ended Activities Critical value + # + # @return Make Open Ended Activities Critical value + def make_open_ended_activities_critical + get_boolean_value(attribute_values['make_open_ended_activities_critical']) + end + # Retrieve the Manager value # # @return Manager value @@ -620,6 +767,20 @@ def manager attribute_values['manager'] end + # Retrieve the Number of Float Paths to Calculate value + # + # @return Number of Float Paths to Calculate value + def maximum_number_of_float_paths_to_calculate + get_integer_value(attribute_values['maximum_number_of_float_paths_to_calculate']) + end + + # Retrieve the Maximum Percentage to Overallocate Resources value + # + # @return Maximum Percentage to Overallocate Resources value + def max_percent_to_overallocate_resources + get_float_value(attribute_values['max_percent_to_overallocate_resources']) + end + # Retrieve the Microsoft Project Server URL value # # @return Microsoft Project Server URL value @@ -795,6 +956,20 @@ def presentation_format attribute_values['presentation_format'] end + # Retrieve the Preserve Minimum Float When Leveling value + # + # @return Preserve Minimum Float When Leveling value + def preserve_minimum_float_when_leveling + get_duration_value(attribute_values['preserve_minimum_float_when_leveling']) + end + + # Retrieve the Preserve Scheduled Early and Late Dates value + # + # @return Preserve Scheduled Early and Late Dates value + def preserve_scheduled_early_and_late_dates + get_boolean_value(attribute_values['preserve_scheduled_early_and_late_dates']) + end + # Retrieve the Project Externally Edited value # # @return Project Externally Edited value @@ -865,6 +1040,13 @@ def schedule_from attribute_values['schedule_from'] end + # Retrieve the When Scheduling Progressed Activities Use value + # + # @return When Scheduling Progressed Activities Use value + def scheduling_progressed_activities + attribute_values['scheduling_progressed_activities'] + end + # Retrieve the Short Application Name value # # @return Short Application Name value @@ -977,6 +1159,13 @@ def updating_task_status_updates_resource_status get_boolean_value(attribute_values['updating_task_status_updates_resource_status']) end + # Retrieve the Use Expected Finish Dates value + # + # @return Use Expected Finish Dates value + def use_expected_finish_dates + get_boolean_value(attribute_values['use_expected_finish_dates']) + end + # Retrieve the WBS Code Separator value # # @return WBS Code Separator value @@ -1006,6 +1195,10 @@ def work2 end ATTRIBUTE_TYPES = { + 'activity_id_increment' => :integer, + 'activity_id_increment_based_on_selected_activity' => :boolean, + 'activity_id_prefix' => :string, + 'activity_id_suffix' => :integer, 'actuals_in_sync' => :boolean, 'actual_cost' => :currency, 'actual_duration' => :duration, @@ -1037,10 +1230,18 @@ def work2 'baseline_for_earned_value' => :integer, 'baseline_project_unique_id' => :integer, 'baseline_start' => :date, + 'baseline_type_name' => :string, + 'baseline_type_unique_id' => :integer, 'baseline_work' => :work, + 'calculate_float_based_on_finish_date_of_each_project' => :boolean, + 'calculate_multiple_float_paths' => :boolean, + 'calculate_multiple_float_paths_using_total_float' => :boolean, 'category' => :string, 'comments' => :string, 'company' => :string, + 'compute_start_to_start_lag_from_early_start' => :boolean, + 'consider_assignments_in_other_projects' => :boolean, + 'consider_assignments_in_other_projects_with_priority_equal_higher_than' => :integer, 'content_status' => :string, 'content_type' => :string, 'cost' => :currency, @@ -1053,6 +1254,7 @@ def work2 'currency_symbol_position' => :currency_symbol_position, 'current_date' => :date, 'custom_properties' => :map, + 'data_date_and_planned_start_set_to_project_forecast_start' => :boolean, 'date_format' => :project_date_format, 'date_order' => :date_order, 'date_separator' => :char, @@ -1069,6 +1271,7 @@ def work2 'default_task_earned_value_method' => :earned_value_method, 'default_task_type' => :task_type, 'default_work_units' => :time_units, + 'display_multiple_float_paths_ending_with_activity_unique_id' => :integer, 'document_version' => :string, 'duration' => :duration, 'earned_value_method' => :earned_value_method, @@ -1086,14 +1289,23 @@ def work2 'guid' => :guid, 'honor_constraints' => :boolean, 'hyperlink_base' => :string, + 'ignore_relationships_to_and_from_other_projects' => :boolean, 'inserted_projects_like_summary' => :boolean, 'keywords' => :string, 'language' => :string, 'lastprinted' => :date, 'last_author' => :string, + 'last_baseline_update_date' => :date, 'last_saved' => :date, + 'leveling_priorities' => :string, + 'level_all_resources' => :boolean, + 'level_resources_only_within_activity_total_float' => :boolean, + 'limit_number_of_float_paths_to_calculate' => :boolean, 'location_unique_id' => :integer, + 'make_open_ended_activities_critical' => :boolean, 'manager' => :string, + 'maximum_number_of_float_paths_to_calculate' => :integer, + 'max_percent_to_overallocate_resources' => :numeric, 'microsoft_project_server_url' => :boolean, 'minutes_per_day' => :integer, 'minutes_per_month' => :integer, @@ -1119,6 +1331,8 @@ def work2 'planned_start' => :date, 'pm_text' => :string, 'presentation_format' => :string, + 'preserve_minimum_float_when_leveling' => :duration, + 'preserve_scheduled_early_and_late_dates' => :boolean, 'project_externally_edited' => :boolean, 'project_file_path' => :string, 'project_id' => :string, @@ -1129,6 +1343,7 @@ def work2 'revision' => :integer, 'scheduled_finish' => :date, 'schedule_from' => :schedule_from, + 'scheduling_progressed_activities' => :scheduling_progressed_activities, 'short_application_name' => :string, 'show_project_summary_task' => :boolean, 'split_in_progress_tasks' => :boolean, @@ -1145,6 +1360,7 @@ def work2 'total_slack_calculation_type' => :total_slack_type, 'unique_id' => :integer, 'updating_task_status_updates_resource_status' => :boolean, + 'use_expected_finish_dates' => :boolean, 'wbs_code_separator' => :string, 'week_start_day' => :day, 'work' => :work, diff --git a/src.ruby/mpxj/lib/mpxj/version.rb b/src.ruby/mpxj/lib/mpxj/version.rb index fe3f3e97e0..11f3946b80 100644 --- a/src.ruby/mpxj/lib/mpxj/version.rb +++ b/src.ruby/mpxj/lib/mpxj/version.rb @@ -1,5 +1,5 @@ # MPXJ gem module module MPXJ # MPXJ gem version number - VERSION = "12.4.0" + VERSION = "12.5.0" end diff --git a/src/changes/changes.xml b/src/changes/changes.xml index fd4617d636..8c910fdc5b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -5,7 +5,9 @@ Jon Iles - + + + Add support for the following Resource Assignment attributes: Remaining Early Start, Remaining Early Finish, Remaining Late Start, and Remaining Late Finish. Ensure that the Resource Assignment attributes Remaining Early Start and Remaining Early Finish are read from and written to PMXML files. Ensure that the Resource Assignment attributes Remaining Early Start, Remaining Early Finish, Remaining Late Start, and Remaining Late Finish are read from and written to XER files. diff --git a/src/main/java/net/sf/mpxj/MPXJ.java b/src/main/java/net/sf/mpxj/MPXJ.java index 8fd9555886..26046d0a7b 100644 --- a/src/main/java/net/sf/mpxj/MPXJ.java +++ b/src/main/java/net/sf/mpxj/MPXJ.java @@ -28,5 +28,5 @@ */ public final class MPXJ { - public static final String VERSION = "12.4.0"; + public static final String VERSION = "12.5.0"; }