| 1234567891011121314151617181920212223242526272829303132333435 |
- <?php
- declare(strict_types=1);
- namespace App;
- final class InventoryService
- {
- public function calculate(array $slot, float $distanceMm): array
- {
- $full = (float) ($slot['full_distance_mm'] ?? 0);
- $empty = (float) ($slot['empty_distance_mm'] ?? 0);
- $perUnit = max(0.01, (float) ($slot['distance_per_unit'] ?? 1));
- $denominator = $full - $empty;
- $ratio = $denominator === 0.0 ? 0.0 : (($distanceMm - $empty) / $denominator);
- $ratio = max(0.0, min(1.0, $ratio));
- $maxUnits = (int) max(0, round(abs($full - $empty) / $perUnit));
- $unitsEstimated = (int) max(0, min($maxUnits, round($ratio * $maxUnits)));
- $fillPercent = (int) round($ratio * 100);
- $alertBelowUnits = (int) ($slot['alert_below_units'] ?? 0);
- $state = $unitsEstimated < $alertBelowUnits ? 'critical' : 'ok';
- return [
- 'distance_mm' => round($distanceMm, 2),
- 'fill_ratio' => $ratio,
- 'fill_percent' => $fillPercent,
- 'units_estimated' => $unitsEstimated,
- 'max_units' => $maxUnits,
- 'alert_below_units' => $alertBelowUnits,
- 'state' => $state,
- ];
- }
- }
|