|
2 | 2 |
|
3 | 3 | from __future__ import annotations |
4 | 4 |
|
| 5 | +import logging |
5 | 6 | import random |
6 | 7 | from dataclasses import asdict, dataclass |
7 | 8 | from datetime import date, timedelta |
|
33 | 34 | from yearly_budget import YearlyBudget |
34 | 35 | from modules.validation import validate_week |
35 | 36 |
|
| 37 | +logger = logging.getLogger(__name__) |
| 38 | + |
36 | 39 | __all__ = [ |
37 | 40 | "EngineMK2", |
38 | 41 | "DayPlan", |
@@ -281,6 +284,14 @@ def _generate_week_activities( |
281 | 284 | weekday_index, profile.base_waste_factor, profile.friction_variance |
282 | 285 | ) |
283 | 286 |
|
| 287 | + logger.debug( |
| 288 | + "[SLEEP-DEBUG] level=budget profile=%s day=%s minutes=%s weekly_hours=%s", |
| 289 | + profile.name, |
| 290 | + day_name, |
| 291 | + sleep_minutes, |
| 292 | + profile.budget.sleep_hours, |
| 293 | + ) |
| 294 | + |
284 | 295 | unique_day: Optional[UniqueDay] = None |
285 | 296 | if yearly_budget: |
286 | 297 | unique_day = yearly_budget.get_day_type(current_date) |
@@ -334,6 +345,14 @@ def _generate_week_activities( |
334 | 345 |
|
335 | 346 | for activity in activities: |
336 | 347 | self._apply_friction(activity, daily_friction) |
| 348 | + if activity.name == "sleep": |
| 349 | + logger.debug( |
| 350 | + "[SLEEP-DEBUG] level=activity profile=%s day=%s base=%s actual=%s", |
| 351 | + profile.name, |
| 352 | + day_name, |
| 353 | + activity.base_duration_minutes, |
| 354 | + activity.actual_duration, |
| 355 | + ) |
337 | 356 |
|
338 | 357 | week_schedule.append(DayPlan(current_date, day_name, day_type, activities)) |
339 | 358 |
|
@@ -551,6 +570,29 @@ def generate_complete_week( |
551 | 570 | ) |
552 | 571 |
|
553 | 572 | events_payload = normalize_mk2_events(normalized_inputs, week_start=start_date) |
| 573 | + sleep_totals: Dict[str, int] = {} |
| 574 | + total_sleep_minutes = 0 |
| 575 | + for event in events_payload: |
| 576 | + if str(event.get("activity")) != "sleep": |
| 577 | + continue |
| 578 | + minutes = int(event.get("duration_minutes", 0)) |
| 579 | + day_label = str(event.get("day") or "") |
| 580 | + sleep_totals[day_label] = sleep_totals.get(day_label, 0) + minutes |
| 581 | + total_sleep_minutes += minutes |
| 582 | + if total_sleep_minutes: |
| 583 | + logger.debug( |
| 584 | + "[SLEEP-DEBUG] level=events profile=%s total_minutes=%s total_hours=%.2f per_day=%s", |
| 585 | + profile.name, |
| 586 | + total_sleep_minutes, |
| 587 | + total_sleep_minutes / 60.0, |
| 588 | + sleep_totals, |
| 589 | + ) |
| 590 | + else: |
| 591 | + logger.debug( |
| 592 | + "[SLEEP-DEBUG] level=events profile=%s total_minutes=0 total_hours=0.00 per_day=%s", |
| 593 | + profile.name, |
| 594 | + sleep_totals, |
| 595 | + ) |
554 | 596 | summary_hours = self._generate_summary(events_payload) |
555 | 597 |
|
556 | 598 | return { |
|
0 commit comments