Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[59539] Migrate scheduling mode and lags #17235

Draft
wants to merge 21 commits into
base: dev
Choose a base branch
from

Conversation

cbliard
Copy link
Member

@cbliard cbliard commented Nov 20, 2024

Ticket

https://community.openproject.org/wp/59539

(Part of https://community.openproject.org/wp/42388)

Pull preview

Available here: https://pr-17235-42388-new-autom-ip-3-70-132-70.my.preview.run/

What works:

  • work packages are manually scheduled by default
  • work packages being automatically scheduled are always moved to their soonest start date
    • unless they are parent, in which case they follow their children's dates. If children are automatically scheduled, it behaves as expected
  • work package switches to automatic mode when becoming a successor
  • work package switches to manual mode when no longer a successor

What's next:

  • switch scheduling mode to automatic when becoming a parent.

What's missing:

  • forbid dates modifications when in automatic scheduling mode
    • disable inputs in date picker
  • automatic rescheduling of a successor manually scheduled when switching to automatic
  • automatic rescheduling of a successor with 2 predecessor when the closest relation is deleted

What are you trying to accomplish?

Implement new automatic scheduling mode

Migration:

  • Work packages are manually scheduled by default
  • Data migration in a separate job
    • All non-successor and non-parent work packages are switched to manual scheduling mode to preserve their dates
    • Closest follows relations have lag adjusted to preserve their dates if a rescheduling happens

Logic changes:

  • Parent dates and ignore non-working days attribute are derived from all children regardless of their scheduling mode (before, only automatically scheduled children were considered)
    Feature implementation:
  • When scheduling happens, a work package is moved to its soonest date.
  • When some non-working days are removed, successor need to be rescheduled if the relation from predecessor to successor covers a removed non-working day
  • When last predecessor is removed, the successor switches to manual if it has dates, and keeps automatic if it does not have dates (spec/services/work_packages/set_schedule_service_working_days_spec.rb:374)

Screenshots

TBD

What approach did you choose and why?

TBD

Merge checklist

  • Added/updated tests
  • Added/updated documentation in Lookbook (patterns, previews, etc)
  • Tested major browsers (Chrome, Firefox, Edge, ...)

@cbliard cbliard marked this pull request as draft November 20, 2024 11:43
@cbliard cbliard force-pushed the feature/42388-new-automatic-scheduling-mode branch 3 times, most recently from 46a22d1 to 391d65b Compare November 27, 2024 11:18
@cbliard cbliard changed the title [42388] Migrate scheduling mode and lags [59539] Migrate scheduling mode and lags Nov 27, 2024
@cbliard cbliard force-pushed the feature/42388-new-automatic-scheduling-mode branch 3 times, most recently from a6f2955 to e62c9e6 Compare December 11, 2024 07:57
https://community.openproject.org/wp/42388

Scheduling mode is now manual by default. Only successors will be in
automatic mode.

WIP
To preserve dates, a lag is set for follows relations when both the
predecessor and the follower have dates.
`lag` is the number of _working_ days between predecessor and successor
dates.
The rule is: it never switches from manual to automatic scheduling mode.
It only switches from automatic to manual, and only if keeping automatic
is not possible because it would mean losing the dates.

The code and specs have been updated to reflect this.

A materialized view is used to reuse the data in multiple different
queries.
The `schedule_manually` column is also non-nullable now.

This includes the following changes:

- Automatically scheduled parent dates are and `ignore_non_working_days`
  attributes are now always derived from children's values, even if the
  children are scheduled manually.

  It's more natural. Without that, adding a child to a work package
  would not change the parent's dates.

  As a consequence, the parent can start on a non-working day if one of
  its children is manually scheduled, ignores non-working days, and
  starts on a non-working day. That's why the parent's
  `ignore_non_working_days` attribute is now also derived from all its
  children regardless of the scheduling mode.

  If the parent is manually scheduled, its dates and it's ability to
  ignore non-working days will still be defined independently from its
  children.

- Fix tests broken by scheduling mode being manual by default.

  The tests had to be adapted to explicitly set scheduling mode to
  automatic for followers and parents, and sometimes even follower's
  children. Without it, work packages would not be rescheduled
  automatically.

- Replace schedule helpers with table helpers.

  Schedule helpers helped well, but table helpers are more flexible and
  support more column types.

- Add "days counting" and "scheduling mode" columns to table helpers.

  "days counting" to set `ignore_non_working_days` attribute.
    - "all days" value maps to `ignore_non_working_days: true`.
    - "working days" value maps to `ignore_non_working_days: false`.
  "scheduling mode" to set `schedule_manually` attribute.
    - "manual" value maps to `schedule_manually: true`.
    - "automatic" value maps to `schedule_manually: false`.
The original start date of the work package is discarded. The soonest
start date is always used instead.
State is stored in instance variables instead of being passed around as parameters and return values.
@cbliard cbliard force-pushed the feature/42388-new-automatic-scheduling-mode branch from 5f715b3 to 13755a0 Compare December 16, 2024 10:19
It was only used to specify predecessors, so it makes more sense, and it
now allows a shorter syntax: "follows wp1, wp2, wp3".
Edge case not detected by the previous algorithm: relation has no lag
but covers non-working days changed into working days. The successors
need to be rescheduled, which is done by rescheduling from the
predecessor.
Before changing them for a new behavior.
@cbliard cbliard force-pushed the feature/42388-new-automatic-scheduling-mode branch from ec01bc0 to 7923850 Compare December 17, 2024 08:12
@github-actions github-actions bot temporarily deployed to gh-6899875-pr-17235 December 17, 2024 10:34 Inactive
When a work package becomes a successor of another work package, its
scheduling mode is switched to automatic if it has no children so that
it can be scheduled as soon as possible automatically.

Similarly, when a work package is no longer a successor of any other
work package, its scheduling mode is switched to manual if it has no
children and no dates so that it can keep its current dates.
@github-actions github-actions bot temporarily deployed to gh-6899875-pr-17235 December 17, 2024 15:52 Inactive
@github-actions github-actions bot temporarily deployed to gh-6899875-pr-17235 December 17, 2024 17:32 Inactive
@github-actions github-actions bot temporarily deployed to gh-6899875-pr-17235 December 24, 2024 09:48 Inactive
@github-actions github-actions bot temporarily deployed to gh-6899875-pr-17235 December 24, 2024 11:14 Inactive
And I spotted one wrong test that will need to be updated.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

Successfully merging this pull request may close these issues.

1 participant