Refactor goals_progress_alert_renderer for improved date handling and department target calculations

- Replace immutable/mutable `DateTime` conversions with safer handling in target and progress calculations.
- Update `getDailyTarget` to normalize timeframes and improve operating day computations.
- Refine department-specific target calculation logic for enhanced accuracy in multi-department setups.
This commit is contained in:
Jeppe Bundgaard
2026-01-29 20:24:47 +01:00
parent cd2190d976
commit 4f9c91dceb
@@ -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