diff --git a/services/nginx/app/modules/goals/services/goals_progress_alert_renderer.php b/services/nginx/app/modules/goals/services/goals_progress_alert_renderer.php index 82c4c93d..d96309c2 100644 --- a/services/nginx/app/modules/goals/services/goals_progress_alert_renderer.php +++ b/services/nginx/app/modules/goals/services/goals_progress_alert_renderer.php @@ -198,15 +198,14 @@ class goals_progress_alert_renderer [$rs, $re] = $range; $base = $criteria->withDepartmentFilter((int)$deptId); $c = clone $base; - // goals_criteria timeframe expects \DateTimeInterface - $c->start = $rs; - $c->end = $re; + // goals_criteria timeframe expects mutable \DateTime + $c->start = \DateTime::createFromImmutable($rs); + $c->end = \DateTime::createFromImmutable($re); $count = self::getProgress($c); } if ($includeTargets && isset($criteria->target)) { - // Set the target to (days since start of period) * (daily target) - $target = self::getDailyTarget($criteria); + // Set the target to (operating days in period) * (daily target) $target = self::getTargetForDepartmentInTimeframe( $criteria, $rs, @@ -265,10 +264,24 @@ class goals_progress_alert_renderer private static function getDailyTarget(goals_criteria $criteria): float { + // Normalize criteria start/end to immutable safely (supports both DateTime and DateTimeImmutable) + $s = $criteria->start ?? null; + $e = $criteria->end ?? null; + $sImm = $s instanceof \DateTimeImmutable + ? $s + : ($s instanceof \DateTime + ? \DateTimeImmutable::createFromMutable($s) + : new \DateTimeImmutable('now')); + $eImm = $e instanceof \DateTimeImmutable + ? $e + : ($e instanceof \DateTime + ? \DateTimeImmutable::createFromMutable($e) + : new \DateTimeImmutable('now')); + $operatingDays = (new goals_progress_alert_renderer)->countOperatingDaysInTimeframe( $criteria, - $criteria->start instanceof \DateTimeInterface ? \DateTimeImmutable::createFromMutable($criteria->start) : new \DateTimeImmutable('now'), - $criteria->end instanceof \DateTimeInterface ? \DateTimeImmutable::createFromMutable($criteria->end) : new \DateTimeImmutable('now') + $sImm, + $eImm ); if ($operatingDays <= 0) { return 0.0; @@ -297,7 +310,7 @@ class goals_progress_alert_renderer $rs, $re ); - return (int)round($dailyTarget * $operatingDays); + return (int)round(($dailyTarget * $operatingDays) / count($criteria->departments?->listIDs() ?? [1])); } private static function getYesterdayRange(): array