Calculations and inputs corrected

This commit is contained in:
marijo 2026-06-09 08:27:18 +00:00
parent 2ea0d9363e
commit 9b717ee6d6
4 changed files with 174 additions and 54 deletions

90
api.php
View file

@ -20,6 +20,8 @@ try {
'settings' => get_settings($db),
'entries' => get_entries($db),
'corrections' => get_corrections($db),
'feriefridage_overrides' => get_feriefridage_overrides($db),
'flex_overrides' => get_flex_overrides($db),
]);
}
fail('Unknown GET action', 404);
@ -39,10 +41,20 @@ try {
break;
case 'saveCorrection':
save_correction($db, (int)($payload['year'] ?? 0), (int)($payload['month'] ?? 0), (float)($payload['value'] ?? 0));
save_correction($db, (int)($payload['year'] ?? 0), (int)($payload['month'] ?? 0), $payload['value'] ?? null);
respond(['ok' => true, 'corrections' => get_corrections($db)]);
break;
case 'saveFeriefridageOverride':
save_feriefridage_override($db, (int)($payload['year'] ?? 0), (int)($payload['month'] ?? 0), $payload['value'] ?? null);
respond(['ok' => true, 'feriefridage_overrides' => get_feriefridage_overrides($db)]);
break;
case 'saveFlexOverride':
save_flex_override($db, (int)($payload['year'] ?? 0), (int)($payload['month'] ?? 0), $payload['value'] ?? null);
respond(['ok' => true, 'flex_overrides' => get_flex_overrides($db)]);
break;
case 'createEntry':
$id = save_entry($db, $payload['entry'] ?? []);
respond(['ok' => true, 'id' => $id, 'entries' => get_entries($db)]);
@ -117,6 +129,20 @@ function migrate(PDO $db): void
PRIMARY KEY (year, month)
)");
$db->exec("CREATE TABLE IF NOT EXISTS monthly_feriefridage_overrides (
year INTEGER NOT NULL,
month INTEGER NOT NULL,
feriefridage_days REAL NOT NULL DEFAULT 0,
PRIMARY KEY (year, month)
)");
$db->exec("CREATE TABLE IF NOT EXISTS monthly_flex_overrides (
year INTEGER NOT NULL,
month INTEGER NOT NULL,
flex_hours REAL NOT NULL DEFAULT 0,
PRIMARY KEY (year, month)
)");
$defaults = [
'planning_start_year' => '2026',
'planning_start_month' => '1',
@ -191,13 +217,13 @@ function get_corrections(PDO $db): array
return $corrections;
}
function save_correction(PDO $db, int $year, int $month, float $value): void
function save_correction(PDO $db, int $year, int $month, mixed $value): void
{
if ($year < 1900 || $year > 2200 || $month < 1 || $month > 12) {
fail('Invalid correction year/month', 400);
}
if (abs($value) < 0.000001) {
if ($value === null || $value === '') {
$stmt = $db->prepare('DELETE FROM monthly_corrections WHERE year = :year AND month = :month');
$stmt->execute([':year' => $year, ':month' => $month]);
return;
@ -206,7 +232,63 @@ function save_correction(PDO $db, int $year, int $month, float $value): void
$stmt = $db->prepare('INSERT INTO monthly_corrections (year, month, vacation_days)
VALUES (:year, :month, :value)
ON CONFLICT(year, month) DO UPDATE SET vacation_days = excluded.vacation_days');
$stmt->execute([':year' => $year, ':month' => $month, ':value' => $value]);
$stmt->execute([':year' => $year, ':month' => $month, ':value' => (float)$value]);
}
function get_feriefridage_overrides(PDO $db): array
{
$rows = $db->query('SELECT year, month, feriefridage_days FROM monthly_feriefridage_overrides ORDER BY year, month')->fetchAll();
$overrides = [];
foreach ($rows as $row) {
$overrides[$row['year'] . '-' . str_pad((string)$row['month'], 2, '0', STR_PAD_LEFT)] = (float)$row['feriefridage_days'];
}
return $overrides;
}
function save_feriefridage_override(PDO $db, int $year, int $month, mixed $value): void
{
if ($year < 1900 || $year > 2200 || $month < 1 || $month > 12) {
fail('Invalid feriefridage override year/month', 400);
}
if ($value === null || $value === '') {
$stmt = $db->prepare('DELETE FROM monthly_feriefridage_overrides WHERE year = :year AND month = :month');
$stmt->execute([':year' => $year, ':month' => $month]);
return;
}
$stmt = $db->prepare('INSERT INTO monthly_feriefridage_overrides (year, month, feriefridage_days)
VALUES (:year, :month, :value)
ON CONFLICT(year, month) DO UPDATE SET feriefridage_days = excluded.feriefridage_days');
$stmt->execute([':year' => $year, ':month' => $month, ':value' => (float)$value]);
}
function get_flex_overrides(PDO $db): array
{
$rows = $db->query('SELECT year, month, flex_hours FROM monthly_flex_overrides ORDER BY year, month')->fetchAll();
$overrides = [];
foreach ($rows as $row) {
$overrides[$row['year'] . '-' . str_pad((string)$row['month'], 2, '0', STR_PAD_LEFT)] = (float)$row['flex_hours'];
}
return $overrides;
}
function save_flex_override(PDO $db, int $year, int $month, mixed $value): void
{
if ($year < 1900 || $year > 2200 || $month < 1 || $month > 12) {
fail('Invalid FLEX override year/month', 400);
}
if ($value === null || $value === '') {
$stmt = $db->prepare('DELETE FROM monthly_flex_overrides WHERE year = :year AND month = :month');
$stmt->execute([':year' => $year, ':month' => $month]);
return;
}
$stmt = $db->prepare('INSERT INTO monthly_flex_overrides (year, month, flex_hours)
VALUES (:year, :month, :value)
ON CONFLICT(year, month) DO UPDATE SET flex_hours = excluded.flex_hours');
$stmt->execute([':year' => $year, ':month' => $month, ':value' => (float)$value]);
}
function get_entries(PDO $db): array