18 lines
773 B
PHP
18 lines
773 B
PHP
<?php
|
|||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
function calculate_duration_hours(?string $start, ?string $end, ?float $manualHours = null): ?float
|
||
|
|
{
|
||
|
|
if ($manualHours !== null) {
|
||
|
|
return $manualHours >= 0 ? round($manualHours, 2) : null;
|
||
|
|
}
|
||
|
|
if ($start === null || $end === null || !preg_match('/^\d{2}:\d{2}$/', $start) || !preg_match('/^\d{2}:\d{2}$/', $end)) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
[$startHour, $startMinute] = array_map('intval', explode(':', $start));
|
||
|
|
[$endHour, $endMinute] = array_map('intval', explode(':', $end));
|
||
|
|
if ($startHour > 23 || $endHour > 23 || $startMinute > 59 || $endMinute > 59) return null;
|
||
|
|
$minutes = ($endHour * 60 + $endMinute) - ($startHour * 60 + $startMinute);
|
||
|
|
return $minutes > 0 ? round($minutes / 60, 2) : null;
|
||
|
|
}
|