diff options
| author | matin <matin.kaufmann@gmail.com> | 2025-09-12 10:41:32 +0200 |
|---|---|---|
| committer | matin <matin.kaufmann@gmail.com> | 2025-09-12 10:41:32 +0200 |
| commit | 5d8131ca9cc982488da34c97022132532bf19868 (patch) | |
| tree | ef2d05a992a4108cbf49a208c699ac7801ceb475 | |
| parent | 7f11bb5218e56d26f02e1272ed66e9dfdbfe4fff (diff) | |
adjust_periods instead of merge_periods... funktioniert nicht fuer full / half projects
| -rw-r--r-- | date_calculator.py | 55 |
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: |
