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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user