summaryrefslogtreecommitdiff
path: root/date_calculator.py
diff options
context:
space:
mode:
authormatin <matin.kaufmann@gmail.com>2025-09-12 10:41:32 +0200
committermatin <matin.kaufmann@gmail.com>2025-09-12 10:41:32 +0200
commit5d8131ca9cc982488da34c97022132532bf19868 (patch)
treeef2d05a992a4108cbf49a208c699ac7801ceb475 /date_calculator.py
parent7f11bb5218e56d26f02e1272ed66e9dfdbfe4fff (diff)
adjust_periods instead of merge_periods... funktioniert nicht fuer full / half projects
Diffstat (limited to 'date_calculator.py')
-rw-r--r--date_calculator.py55
1 files changed, 34 insertions, 21 deletions
diff --git a/date_calculator.py b/date_calculator.py
index aaae928..befccfc 100644
--- a/date_calculator.py
+++ b/date_calculator.py
@@ -34,25 +34,38 @@ class DateCalculator:
return rounded_periods, total_months
@staticmethod
- def merge_periods(periods):
+ def adjust_periods(periods):
+ """Adjust overlapping periods without merging.
+ - Later periods overlapping with a previous one have their start moved to the previous end + 1 day.
+ - Periods fully contained in a previous one are discarded.
+ """
if not periods:
return []
- periods.sort()
- merged_periods = []
-
- current_start, current_end, current_id = periods[0]
-
- for start, end, id in periods[1:]:
- if start <= current_end + timedelta(days=1):
- current_end = max(current_end, end)
+ # Sort by start date, then end date for stability
+ periods = sorted(periods, key=lambda p: (p[0], p[1]))
+
+ adjusted = []
+ for start, end, pid in periods:
+ if not adjusted:
+ adjusted.append((start, end, pid))
+ continue
+
+ last_start, last_end, last_pid = adjusted[-1]
+
+ if start <= last_end:
+ # Fully contained in previous period → discard
+ if end <= last_end:
+ continue
+ # Overlaps head; push start to the day after last_end
+ new_start = last_end + timedelta(days=1)
+ if new_start <= end:
+ adjusted.append((new_start, end, pid))
+ # else new_start > end → discard
else:
- merged_periods.append((current_start, current_end, current_id))
- current_start, current_end, current_id = start, end, id
-
- merged_periods.append((current_start, current_end, current_id))
-
- return merged_periods
+ adjusted.append((start, end, pid))
+
+ return adjusted
@staticmethod
def find_non_overlapping_periods(existing_periods, test_period):
@@ -110,9 +123,9 @@ class DateCalculator:
considered_full_projects = self.truncate_periods(full_projects, launch_date, prediction)
considered_half_projects = self.truncate_periods(half_projects, launch_date, prediction)
- considered_full_projects_merged = self.merge_periods(considered_full_projects)
+ considered_full_projects_merged = self.adjust_periods(considered_full_projects)
considered_full_projects_rounded, months = self.round_periods(considered_full_projects_merged)
- considered_full_projects_merged2 = self.merge_periods(considered_full_projects_rounded)
+ considered_full_projects_merged2 = self.adjust_periods(considered_full_projects_rounded)
considered_full_projects_rounded2, months = self.round_periods(considered_full_projects_merged2)
non_overlapping_half_projects = []
@@ -121,15 +134,15 @@ class DateCalculator:
self.find_non_overlapping_periods(considered_full_projects_rounded2, test_interval)
)
- considered_half_projects_merged = self.merge_periods(non_overlapping_half_projects)
+ considered_half_projects_merged = self.adjust_periods(non_overlapping_half_projects)
considered_half_projects_rounded, months2 = self.round_periods(considered_half_projects_merged)
- considered_half_projects_merged2 = self.merge_periods(considered_half_projects_rounded)
+ considered_half_projects_merged2 = self.adjust_periods(considered_half_projects_rounded)
considered_half_projects_rounded2, months2 = self.round_periods(considered_half_projects_merged2)
- all_projects_merged = self.merge_periods(
+ all_projects_merged = self.adjust_periods(
considered_full_projects_rounded2 + considered_half_projects_rounded2
)
- merged_event_periods = self.merge_periods(considered_events)
+ merged_event_periods = self.adjust_periods(considered_events)
non_overlapping_event_periods = []
for test_interval in merged_event_periods: