Content
View differences
Updated by Parimal Satyal about 4 years ago
**As** an OpenProject user
**I want** to calculate the work package start and end dates based on the duration
**so** that I only have to set the duration.
# **Acceptance criteria:**
The duration feature affects a range of views and modules:
### Work package attributes and date picker
* In the date picker modal there is a text field `duration`.
* When the user enters a duration, the dates are derived.
* The contrary is also true: when a user enters dates, the duration is derived.
* More precise scenarios for what is derived/calculated as a result of what input (in which order), are [presented below](https://community.openproject.org/#scenarios).
* The duration represents the amount of days between the start and the finish date (inclusive):
* Monday to Tuesday: 2 days
* Monday to Monday (same day): 1 day
* Duration is always in full days (never floating point values).
* Once configuring non-working days is implemented (<mention class="mention" data-id="18416" data-type="work_package" data-text="#18416">#18416</mention>), these non-working days are _skipped_ _over_ and do not count towards the total duration:
* Friday to Monday: 2 days _(Saturday and Sunday are skipped over)_
* **\[open\]** The user is able to override configured non-working days per work package; this means non-working can be optionally included, in which case they are _not_ skipped and count towards the date and duration count.
* ~~**\[open\]** This requires manual scheduling to be checked (to be explored)~~
* In all cases, the duration is consistent with the start and the finish date. Updating dates will update duration, and updating duration will update dates.
* It will not possible, for example, to specify a duration of 8 days for a task that starts and finishes the same week.
* The duration as well as start and due dates can not be configured via the form configuration. They are always present at the same place within the work package show page and form.
* This will be defined in <mention class="mention" data-id="40539" data-type="work_package" data-text="#40539">#40539</mention>.
* Work packages have an empty (not set) default duration.
* Setting start _and_ end dates automatically sets duration.
* Setting only one of the dates does not automatically set duration (unable to derive).
* Setting only one of the dates and duration derives the other date.
* It is possible to have _only one attribute_ (only start date, only finish date or only duration) or all three. It is not possible to have just two (since the third will be derived from the other two). Concretely:
* Duration specified; no start date; no finish dates is possible.
* A start date specified; no finish date; no duration is possible.
* A finish date specified; no start date; no duration is possible
but...
* A start date specified; duration specified; no end date is _not possible_. (End date is derived)
* A finish date specified; duration specified; no start date is _not possible_. (Start date is derived)
* A duration specified, start date specified, no finish date is _not possible_. (End date is derived)
* A duration specified, finish date specified, no start date is _not possible_. (Start date is derived).
* Milestone-typed work packages don't have a duration field.
* **\[open\]** On the GANNT and Team planner, they represent 1 day.
* Still displayed as a diamond in the GANTT. In the team planner = 1 day.
* **\[open\]** Should it "take" a day, when scheduling? Currently it does, but perhaps it's wrong? In which case, it would need to have a date, but no duration.
* The user has to to be informed when:
* Dates are automatically derived from relations (notably from parents or children),
* **\[open\]** The user must be given a way to view relations (a link to a GANTT view?)
* these automatically derived dates can not be modified, _unless:_
* Manual scheduling is enabled, and thus relations are ignored and
* Configured non-working days maybe optionally included in the calculation of total duration and start/end dates.
### Work package table view
* In the work packages list there is a column "duration". When clicking on this the date modal with the date picker is opened.
* **\[open\]** With the focus on the duration field.
* Filtering by duration is possible
* Sorting by duration is possible
### GANTT chart
* For work packages without start/finish dates but _with_ duration, the width of a "strip" representing such a work package on hover on a GANTT view has a width that is relative to its total duration.
* "Relative" because width depends on the zoom level of the GANTT chart.
* On click, end date is calculated based on the the start date selected.
* **\[open\]** If it's a very long one (end date is outside of current view)...
* If the user modifies a work package via the drag handles on the left/right edges of the strips the in Gantt chart, both the start/finish date as well as the duration are altered in lockstep.
* **\[open\]** Might be complicated to handle cases where the non-working days needs to be skipped, sometimes not; the facility with which we can implement this on drag is to be determined...
### Team planner
* For work packages without start/finish dates but _with_ duration, the width of a card that is dragged onto the team planner (from the left-hand "Add Existing" panel, for example) is relative to the total duration of that work package.
* "Relative" because width depends on the zoom level/view of the team planner calendar.
* If the user modifies a work package via the drag handles on the left/right edges of the cards on the Team planner, both the start/finish date as well as the duration are altered in lockstep.
* **\[open\]** The user is able to modify the view such that weekends are not displayed on the team planner.
* Even when weekends are not displayed, they are nevertheless represented (although with much narrower column widths and without a header).
* This is especially important because manual scheduling nevertheless allows users to include non-working days into the date and duration count.
# Open
* Visuals for the rework of the dates & duration to be a fixed (not configurable) part of the work package show page and form (<mention class="mention" data-id="40539" data-type="work_package" data-text="#40539">#40539</mention>)
* Inheritance of the duration between a work package and its children
* e.g. can a work package have a duration that is less than the duration of its child. Only with manually scheduled.
* Normally a parent cannot have its own date values set by the user (unless manually scheduled).
* How will the duration be reflected in the activity, assuming that duration should be part of the activity? Naively the attributes start/finish and duration would all be displayed individually which might not be ideal.
* The duration would also be an additional activity that is displayed, if the duration is altered.
# Visuals needed
* [x] Date picker with duration field
* [x] Warning/information when dates are derived from relations
* [x] Warning/information about manual scheduling
* [x] Warning/information when dates affect total project duration
* [x] Warning/information when changes will affect the scheduling of other (related) work packages
* [x] Option to include configured non-working days
* [ ] Simple date picker with only a single _date_ field (in progress)
* [x] Work package table view with duration column
* [x] Illustration of scenarios 1–13 (outside GANTT and Team planner)
* [ ] GANTT view\*\*(\*\* view**(**
* [ ] Team planner
* [ ] **\[open\]** with option to switch on and off the display of non-working days in week/2-week view
# Scenarios
## Scenario 1:
* Setup
* Start date: Monday, February 8, 2021
* Finish date: empty
* Duration: empty
* Change
* User enters a duration of 10 days
* Expected result:
* The finish date is set Friday, February 19 2021 (derived)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28335/content"></div></figure>
## Scenario 2
* Setup
* Start date: empty
* Finish date: empty
* Duration: empty
* Change
* User enters a duration of 10 days
* Expected result:
* No date is added
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28336/content"></div></figure>
## Scenario 3
* Setup
* Start date: empty
* Finish date: Friday, February 19, 2021
* Duration: empty
* Change
* User enters a duration of 10 days
* Expected result:
* The start date is set to Monday, February 8, 2021 (derived)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28337/content"></div></figure>
## Scenario 4
* Setup
* Start date: Monday, February 8, 2021
* Finish date: Friday, February 19, 2021
* Duration: 10
* Change
* User changes duration to 11 days
* Expected result:
* The finish date is changed to Monday, February, 22 2021
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28338/content"></div></figure>
## Scenario 5
* Setup
* Start date: Monday, February 8, 2021
* Finish date: Monday, February 22, 2021
* Duration: 11
* Change
* User changes duration to 10 days
* Expected result:
* The finish date is changed to Friday, February, 19, 2021
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28339/content"></div></figure>
## Scenario 6
* Setup
* Start date: Tuesday, February 9, 2021
* Finish date: Friday, February 12, 2021
* Change
* Remove duration.
* Expected result
* Finish date is also removed, start date is maintained as is.
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28340/content"></div></figure>
## Scenario 7
* Setup
* Start date: Monday, February 8, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 4
* Change
* User alters the start date to Tuesday, February 9, 2021
* Expected result
* **\[behaviour updated\]** Finish date is maintained, duration is automatically adjusted to 3 days (derived; logic = changing date affects duration)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28341/content"></div></figure>
## Scenario 8
* Setup
* Start date: Tuesday, February 9, 2021
* Finish date: Friday, February 12, 2021
* Duration: 4
* Change
* User alters the finish date to Feb 11, 2021.
* Expected result
* **\[behaviour updated\]** Start date is unaffected, duration is now set to 3 days (derived from dates).
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28342/content"></div></figure>
## Scenario 9
* Setup
* Start date: empty
* Finish date: empty
* Duration: 4
* Change
* User enters the finish date of Friday, February 12, 2021.
* Expected result
* The start date is set to Tuesday, February 9, 2021 (derived from duration).
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28343/content"></div></figure>
## Scenario 10
* Setup
* Start date: empty
* Finish date: Thursday, February 11, 2021
* Duration: empty
* Change
* User enters the start date of Tuesday, February 09, 2021
* Expected result
* Duration is set to 3 (derived from start date)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28344/content"></div></figure>
## Scenario 11
* Setup
* Two work packages
* Task 1:
* Start date: Monday, 15 February, 2021
* End date: Wednesday, 17 February, 2021
* Duration: 3
* Task 2:
* Start date: empty
* End date: empty
* Change
* Change relations such that Task 2 preceeds Task 1.
* Expected result
* Dates for Task 2 are derived from this "proceeds" relation.
* Start date: Friday, 12 February, 2021 (dates including and after the work package this one preceedes are blocked)
* Duration: 1 (automatic)
* End date: Friday, 12 February, 2021 (derived from duration)
* Warning: Reminder the start and end dates need to be before the dates of the work package this one is preceeding. Invalid dates are disabled.
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28355/content"></div></figure>
## Scenario 12
* Setup
* Two work packages
* Task 1:
* Start date: Monday, 8 February, 2021
* End date: Wednesday, 10 February, 2021
* Duration: 3
* Task 2:
* Start date: empty
* End date: empty
* Change
* Change relations such that Task 2 follows Task 1.
* Expected result
* Dates for Task 2 are derived from this "follows" relation.
* Start date: Thursday, 11 February, 2021
* Duration: 1 (automatic)
* End date: Thursday, 11 February, 2021 (derived from duration)
* Warning: Reminder the start and end dates need to be after the work package this one following. Invalid dates are disabled.
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28348/content"></div></figure>
## Scenario 13
* Setup
* Two work packages
* Task 1:
* Start date: Monday, 8 February, 2021
* End date: Wednesday, 10 February, 2021
* Duration: 3
* Task 2:
* Start date: empty
* End date: empty
* Change
* Change relations such that Task 2 is a child of Task 1.
* Expected result
* Dates and duration for Task 2 are derived from the parent (when the child work package itself does not have date information; if it does, it is retained, but the date range is limited by the range of the parent. _For when the child tasks is already scheduled outside of this range before the relationship is created, this will be handled in the error handling section when that is defined_).
* Start date: Monday, 8 February, 2021
* End date: Wednesday, 10 February, 2021
* Duration: 3
* Information: Reminder that this work package is now automatically scheduled, and that start and end dates are derived. The dates are not modifiable (unless manual scheduling is selected, which will ignore relations).
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28349/content"></div></figure>
## Scenario 14
* Setup
* Start date: Monday, February 9, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 3
* Change
* The user moves the drag handle on the left border (start date) of the box representing the work package in Gantt chart and Team planner one day to the right (to Feb 10, 2021)
* Expected result
* The duration is reduced to 2. The start date is set to Feb 10, 2021. The finish date is left unchanged.
_(Visual will be added when ready)_
## Scenario 15
* Setup
* Start date: Monday, February 9, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 3
* Change
* The user moves the work package by dragging it to the right so start date is Wednesday, Feb 11, 2021.
* Expected result
* The duration is maintained. Start state is now Wednesday, Febuary 11, 2021 (as set by drag), end date is set to Friday, February 13 (derived based on duration).
_(Visual will be added when ready)_
## Scenario 16
(Added in response to <mention class="mention" data-id="42086" data-type="user" data-text="@Wieland Lindenthal">@Wieland Lindenthal</mention>'s [comment on the Datepicker feature](https://community.openproject.org/projects/openproject/work_packages/41341#activity-5)).
* Setup
* Start date: Monday, February 9, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 3
* Change
* The user moves the start day to Wednesday, March 3, 2021
* Expected result
* Duration is maintained and the finish date is now moved to Friday, March 5, 2021.
* _Note: In this case, since the date is_ after _the original finish date, behaviour is different from Scenario 7 (where the new start date is_ before _the finish date, and therefore duration is affected and finish date remains unaffected)_
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29660/content"></div></figure>
_(Visual will be added when ready)_
# Visuals
#### **The new date picker drop modal**
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29240/content"></div></figure>
Additional visuals for the date picker are in the related work package describing the date picker <mention class="mention" data-id="41341" data-type="work_package" data-text="#41341">#41341</mention>.
#### Duration column in a work package table view
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29244/content"></div></figure>
#### The date picker drop modal in the work package table view (duration)
Note that the "duration" field is focused when opening the drop modal by clicking on a duration value.
<figure class="image op-uc-figure" style="width:75%;"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29243/content"></div></figure>
#### The duration column can also be used to adjust the GANTT chart
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29242/content"></div></figure>
# Seed Data
**Static queries in section "Default data":**
* Gantt chart: Add duration column after column finish date:
**Queries in section favorite views**
* Project plan (Query ID 1): Add duration column after column finish date
* Project plan (Query ID 14): Add duration column after column finish date
# Full screen view
* Currently the status selection is below the subject at the same position for all work package types.
* We also move the dates and the curation to this area (visuals tbd).
* For milestones there is no duration by definition.
# Out-of-Scope
* Consider weekends and holidays (for this ticket, will normally already have been dealth by <mention class="mention" data-id="18416" data-type="work_package" data-text="#18416">#18416</mention>)
* Summing duration _(need clarification)_
* Grouping by durations _(need clarification)_
# Implementation notes
* Frontend:
* include duration in date picker
* There is no duration form field for milestones.
* Restyling dates section (start & due date & duration) so that dates are always visible (no longer configurable via form configuration) similar to status
* Adapt specs that break by doing this
* Display longer bar in gantt chart and planning board while dragging a work package without start & end dates
* Backend:
* Introduce into data layer & contracts
* Disallow setting duration for milestone typed work packages
* Services
* **Open** inheritance within hierarchy
* Include in API
* Exclude for milestone typed work packages (should be covered by non writable property in contract)
* Calculates start/end dates on scheduling and on setting duration/start/end-dates
* Filter for duration ("Everything longer than")
* Sort
* Seeding and default configurations
* Migration for removing the dates from existing form configurations as they can no longer be configured.
* Migration for setting a duration for all work packages having start and end date set.
**I want** to calculate the work package start and end dates based on the duration
**so** that I only have to set the duration.
# **Acceptance criteria:**
The duration feature affects a range of views and modules:
### Work package attributes and date picker
* In the date picker modal there is a text field `duration`.
* When the user enters a duration, the dates are derived.
* The contrary is also true: when a user enters dates, the duration is derived.
* More precise scenarios for what is derived/calculated as a result of what input (in which order), are [presented below](https://community.openproject.org/#scenarios).
* The duration represents the amount of days between the start and the finish date (inclusive):
* Monday to Tuesday: 2 days
* Monday to Monday (same day): 1 day
* Duration is always in full days (never floating point values).
* Once configuring non-working days is implemented (<mention class="mention" data-id="18416" data-type="work_package" data-text="#18416">#18416</mention>), these non-working days are _skipped_ _over_ and do not count towards the total duration:
* Friday to Monday: 2 days _(Saturday and Sunday are skipped over)_
* **\[open\]** The user is able to override configured non-working days per work package; this means non-working can be optionally included, in which case they are _not_ skipped and count towards the date and duration count.
* ~~**\[open\]** This requires manual scheduling to be checked (to be explored)~~
* In all cases, the duration is consistent with the start and the finish date. Updating dates will update duration, and updating duration will update dates.
* It will not possible, for example, to specify a duration of 8 days for a task that starts and finishes the same week.
* The duration as well as start and due dates can not be configured via the form configuration. They are always present at the same place within the work package show page and form.
* This will be defined in <mention class="mention" data-id="40539" data-type="work_package" data-text="#40539">#40539</mention>.
* Work packages have an empty (not set) default duration.
* Setting start _and_ end dates automatically sets duration.
* Setting only one of the dates does not automatically set duration (unable to derive).
* Setting only one of the dates and duration derives the other date.
* It is possible to have _only one attribute_ (only start date, only finish date or only duration) or all three. It is not possible to have just two (since the third will be derived from the other two). Concretely:
* Duration specified; no start date; no finish dates is possible.
* A start date specified; no finish date; no duration is possible.
* A finish date specified; no start date; no duration is possible
but...
* A start date specified; duration specified; no end date is _not possible_. (End date is derived)
* A finish date specified; duration specified; no start date is _not possible_. (Start date is derived)
* A duration specified, start date specified, no finish date is _not possible_. (End date is derived)
* A duration specified, finish date specified, no start date is _not possible_. (Start date is derived).
* Milestone-typed work packages don't have a duration field.
* **\[open\]** On the GANNT and Team planner, they represent 1 day.
* Still displayed as a diamond in the GANTT. In the team planner = 1 day.
* **\[open\]** Should it "take" a day, when scheduling? Currently it does, but perhaps it's wrong? In which case, it would need to have a date, but no duration.
* The user has to to be informed when:
* Dates are automatically derived from relations (notably from parents or children),
* **\[open\]** The user must be given a way to view relations (a link to a GANTT view?)
* these automatically derived dates can not be modified, _unless:_
* Manual scheduling is enabled, and thus relations are ignored and
* Configured non-working days maybe optionally included in the calculation of total duration and start/end dates.
### Work package table view
* In the work packages list there is a column "duration". When clicking on this the date modal with the date picker is opened.
* **\[open\]** With the focus on the duration field.
* Filtering by duration is possible
* Sorting by duration is possible
### GANTT chart
* For work packages without start/finish dates but _with_ duration, the width of a "strip" representing such a work package on hover on a GANTT view has a width that is relative to its total duration.
* "Relative" because width depends on the zoom level of the GANTT chart.
* On click, end date is calculated based on the the start date selected.
* **\[open\]** If it's a very long one (end date is outside of current view)...
* If the user modifies a work package via the drag handles on the left/right edges of the strips the in Gantt chart, both the start/finish date as well as the duration are altered in lockstep.
* **\[open\]** Might be complicated to handle cases where the non-working days needs to be skipped, sometimes not; the facility with which we can implement this on drag is to be determined...
### Team planner
* For work packages without start/finish dates but _with_ duration, the width of a card that is dragged onto the team planner (from the left-hand "Add Existing" panel, for example) is relative to the total duration of that work package.
* "Relative" because width depends on the zoom level/view of the team planner calendar.
* If the user modifies a work package via the drag handles on the left/right edges of the cards on the Team planner, both the start/finish date as well as the duration are altered in lockstep.
* **\[open\]** The user is able to modify the view such that weekends are not displayed on the team planner.
* Even when weekends are not displayed, they are nevertheless represented (although with much narrower column widths and without a header).
* This is especially important because manual scheduling nevertheless allows users to include non-working days into the date and duration count.
# Open
* Visuals for the rework of the dates & duration to be a fixed (not configurable) part of the work package show page and form (<mention class="mention" data-id="40539" data-type="work_package" data-text="#40539">#40539</mention>)
* Inheritance of the duration between a work package and its children
* e.g. can a work package have a duration that is less than the duration of its child. Only with manually scheduled.
* Normally a parent cannot have its own date values set by the user (unless manually scheduled).
* How will the duration be reflected in the activity, assuming that duration should be part of the activity? Naively the attributes start/finish and duration would all be displayed individually which might not be ideal.
* The duration would also be an additional activity that is displayed, if the duration is altered.
# Visuals needed
* [x] Date picker with duration field
* [x] Warning/information when dates are derived from relations
* [x] Warning/information about manual scheduling
* [x] Warning/information when dates affect total project duration
* [x] Warning/information when changes will affect the scheduling of other (related) work packages
* [x] Option to include configured non-working days
* [ ] Simple date picker with only a single _date_ field (in progress)
* [x] Work package table view with duration column
* [x] Illustration of scenarios 1–13 (outside GANTT and Team planner)
* [ ] GANTT view\*\*(\*\*
* [ ] Team planner
* [ ] **\[open\]** with option to switch on and off the display of non-working days in week/2-week view
# Scenarios
## Scenario 1:
* Setup
* Start date: Monday, February 8, 2021
* Finish date: empty
* Duration: empty
* Change
* User enters a duration of 10 days
* Expected result:
* The finish date is set Friday, February 19 2021 (derived)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28335/content"></div></figure>
## Scenario 2
* Setup
* Start date: empty
* Finish date: empty
* Duration: empty
* Change
* User enters a duration of 10 days
* Expected result:
* No date is added
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28336/content"></div></figure>
## Scenario 3
* Setup
* Start date: empty
* Finish date: Friday, February 19, 2021
* Duration: empty
* Change
* User enters a duration of 10 days
* Expected result:
* The start date is set to Monday, February 8, 2021 (derived)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28337/content"></div></figure>
## Scenario 4
* Setup
* Start date: Monday, February 8, 2021
* Finish date: Friday, February 19, 2021
* Duration: 10
* Change
* User changes duration to 11 days
* Expected result:
* The finish date is changed to Monday, February, 22 2021
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28338/content"></div></figure>
## Scenario 5
* Setup
* Start date: Monday, February 8, 2021
* Finish date: Monday, February 22, 2021
* Duration: 11
* Change
* User changes duration to 10 days
* Expected result:
* The finish date is changed to Friday, February, 19, 2021
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28339/content"></div></figure>
## Scenario 6
* Setup
* Start date: Tuesday, February 9, 2021
* Finish date: Friday, February 12, 2021
* Change
* Remove duration.
* Expected result
* Finish date is also removed, start date is maintained as is.
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28340/content"></div></figure>
## Scenario 7
* Setup
* Start date: Monday, February 8, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 4
* Change
* User alters the start date to Tuesday, February 9, 2021
* Expected result
* **\[behaviour updated\]** Finish date is maintained, duration is automatically adjusted to 3 days (derived; logic = changing date affects duration)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28341/content"></div></figure>
## Scenario 8
* Setup
* Start date: Tuesday, February 9, 2021
* Finish date: Friday, February 12, 2021
* Duration: 4
* Change
* User alters the finish date to Feb 11, 2021.
* Expected result
* **\[behaviour updated\]** Start date is unaffected, duration is now set to 3 days (derived from dates).
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28342/content"></div></figure>
## Scenario 9
* Setup
* Start date: empty
* Finish date: empty
* Duration: 4
* Change
* User enters the finish date of Friday, February 12, 2021.
* Expected result
* The start date is set to Tuesday, February 9, 2021 (derived from duration).
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28343/content"></div></figure>
## Scenario 10
* Setup
* Start date: empty
* Finish date: Thursday, February 11, 2021
* Duration: empty
* Change
* User enters the start date of Tuesday, February 09, 2021
* Expected result
* Duration is set to 3 (derived from start date)
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28344/content"></div></figure>
## Scenario 11
* Setup
* Two work packages
* Task 1:
* Start date: Monday, 15 February, 2021
* End date: Wednesday, 17 February, 2021
* Duration: 3
* Task 2:
* Start date: empty
* End date: empty
* Change
* Change relations such that Task 2 preceeds Task 1.
* Expected result
* Dates for Task 2 are derived from this "proceeds" relation.
* Start date: Friday, 12 February, 2021 (dates including and after the work package this one preceedes are blocked)
* Duration: 1 (automatic)
* End date: Friday, 12 February, 2021 (derived from duration)
* Warning: Reminder the start and end dates need to be before the dates of the work package this one is preceeding. Invalid dates are disabled.
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28355/content"></div></figure>
## Scenario 12
* Setup
* Two work packages
* Task 1:
* Start date: Monday, 8 February, 2021
* End date: Wednesday, 10 February, 2021
* Duration: 3
* Task 2:
* Start date: empty
* End date: empty
* Change
* Change relations such that Task 2 follows Task 1.
* Expected result
* Dates for Task 2 are derived from this "follows" relation.
* Start date: Thursday, 11 February, 2021
* Duration: 1 (automatic)
* End date: Thursday, 11 February, 2021 (derived from duration)
* Warning: Reminder the start and end dates need to be after the work package this one following. Invalid dates are disabled.
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28348/content"></div></figure>
## Scenario 13
* Setup
* Two work packages
* Task 1:
* Start date: Monday, 8 February, 2021
* End date: Wednesday, 10 February, 2021
* Duration: 3
* Task 2:
* Start date: empty
* End date: empty
* Change
* Change relations such that Task 2 is a child of Task 1.
* Expected result
* Dates and duration for Task 2 are derived from the parent (when the child work package itself does not have date information; if it does, it is retained, but the date range is limited by the range of the parent. _For when the child tasks is already scheduled outside of this range before the relationship is created, this will be handled in the error handling section when that is defined_).
* Start date: Monday, 8 February, 2021
* End date: Wednesday, 10 February, 2021
* Duration: 3
* Information: Reminder that this work package is now automatically scheduled, and that start and end dates are derived. The dates are not modifiable (unless manual scheduling is selected, which will ignore relations).
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/28349/content"></div></figure>
## Scenario 14
* Setup
* Start date: Monday, February 9, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 3
* Change
* The user moves the drag handle on the left border (start date) of the box representing the work package in Gantt chart and Team planner one day to the right (to Feb 10, 2021)
* Expected result
* The duration is reduced to 2. The start date is set to Feb 10, 2021. The finish date is left unchanged.
_(Visual will be added when ready)_
## Scenario 15
* Setup
* Start date: Monday, February 9, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 3
* Change
* The user moves the work package by dragging it to the right so start date is Wednesday, Feb 11, 2021.
* Expected result
* The duration is maintained. Start state is now Wednesday, Febuary 11, 2021 (as set by drag), end date is set to Friday, February 13 (derived based on duration).
_(Visual will be added when ready)_
## Scenario 16
(Added in response to <mention class="mention" data-id="42086" data-type="user" data-text="@Wieland Lindenthal">@Wieland Lindenthal</mention>'s [comment on the Datepicker feature](https://community.openproject.org/projects/openproject/work_packages/41341#activity-5)).
* Setup
* Start date: Monday, February 9, 2021
* Finish date: Wednesday, February 11, 2021
* Duration: 3
* Change
* The user moves the start day to Wednesday, March 3, 2021
* Expected result
* Duration is maintained and the finish date is now moved to Friday, March 5, 2021.
* _Note: In this case, since the date is_ after _the original finish date, behaviour is different from Scenario 7 (where the new start date is_ before _the finish date, and therefore duration is affected and finish date remains unaffected)_
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29660/content"></div></figure>
_(Visual will be added when ready)_
# Visuals
#### **The new date picker drop modal**
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29240/content"></div></figure>
Additional visuals for the date picker are in the related work package describing the date picker <mention class="mention" data-id="41341" data-type="work_package" data-text="#41341">#41341</mention>.
#### Duration column in a work package table view
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29244/content"></div></figure>
#### The date picker drop modal in the work package table view (duration)
Note that the "duration" field is focused when opening the drop modal by clicking on a duration value.
<figure class="image op-uc-figure" style="width:75%;"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29243/content"></div></figure>
#### The duration column can also be used to adjust the GANTT chart
<figure class="image op-uc-figure"><div class="op-uc-figure--content"><img class="op-uc-image" src="/api/v3/attachments/29242/content"></div></figure>
# Seed Data
**Static queries in section "Default data":**
* Gantt chart: Add duration column after column finish date:
**Queries in section favorite views**
* Project plan (Query ID 1): Add duration column after column finish date
* Project plan (Query ID 14): Add duration column after column finish date
# Full screen view
* Currently the status selection is below the subject at the same position for all work package types.
* We also move the dates and the curation to this area (visuals tbd).
* For milestones there is no duration by definition.
# Out-of-Scope
* Consider weekends and holidays (for this ticket, will normally already have been dealth by <mention class="mention" data-id="18416" data-type="work_package" data-text="#18416">#18416</mention>)
* Summing duration _(need clarification)_
* Grouping by durations _(need clarification)_
# Implementation notes
* Frontend:
* include duration in date picker
* There is no duration form field for milestones.
* Restyling dates section (start & due date & duration) so that dates are always visible (no longer configurable via form configuration) similar to status
* Adapt specs that break by doing this
* Display longer bar in gantt chart and planning board while dragging a work package without start & end dates
* Backend:
* Introduce into data layer & contracts
* Disallow setting duration for milestone typed work packages
* Services
* **Open** inheritance within hierarchy
* Include in API
* Exclude for milestone typed work packages (should be covered by non writable property in contract)
* Calculates start/end dates on scheduling and on setting duration/start/end-dates
* Filter for duration ("Everything longer than")
* Sort
* Seeding and default configurations
* Migration for removing the dates from existing form configurations as they can no longer be configured.
* Migration for setting a duration for all work packages having start and end date set.