$_POST['order_id'] ?? '', 'date' => $_POST['date'] ?? '', 'start' => ($_POST['start'] ?? '') !== '' ? $_POST['start'] . ':00' : '', 'end' => ($_POST['end'] ?? '') !== '' ? $_POST['end'] . ':00' : '', 'breakDuration' => sprintf('%02d:%02d:00', intdiv((int)($_POST['break_minutes'] ?? 0), 60), (int)($_POST['break_minutes'] ?? 0) % 60), 'nightHours' => (float)($_POST['night_hours'] ?? 0), 'saturdayHours' => (float)($_POST['saturday_hours'] ?? 0), 'sundayHours' => (float)($_POST['sunday_hours'] ?? 0), 'holidayHours' => (float)($_POST['holiday_hours'] ?? 0), ]; if ($payload['orderId'] === '' || $payload['date'] === '' || $payload['start'] === '' || $payload['end'] === '') { $error = 'Auftrag, Datum, Beginn und Ende sind erforderlich.'; $editId = $mode === 'edit' ? ($_POST['time_entry_id'] ?? null) : null; } elseif ($mode === 'edit') { if (!$canEdit) { // Server lehnt das ohnehin über [RequirePermission(TimeEntries, Edit)] ab - dieser Zweig // greift nur, wenn jemand das Formular manuell postet, obwohl es clientseitig gar nicht // angezeigt wurde. $error = 'Keine Berechtigung, diese Zeiterfassung zu bearbeiten.'; } else { $timeEntryId = $_POST['time_entry_id'] ?? ''; $result = omsorgcore_time_entries_update(_omsorgcore_config(), $_SESSION['omsorgcore_access_token'], $timeEntryId, $payload); if ($result['ok']) { header('Location: stundenerfassung.php?updated=1'); exit; } $editId = $timeEntryId; $error = $result['status'] === 403 ? 'Keine Berechtigung, diese Zeiterfassung zu bearbeiten.' : (is_string($result['data'] ?? null) ? $result['data'] : 'Zeiterfassung konnte nicht gespeichert werden.'); } } elseif (!$canCreate) { $error = 'Keine Berechtigung, eine Zeiterfassung anzulegen.'; } else { $result = omsorgcore_time_entries_create(_omsorgcore_config(), $_SESSION['omsorgcore_access_token'], $payload); if ($result['ok']) { $success = true; } elseif ($result['status'] === 403) { $error = 'Keine Berechtigung, eine Zeiterfassung anzulegen.'; } else { $error = is_string($result['data'] ?? null) ? $result['data'] : 'Zeiterfassung konnte nicht gespeichert werden.'; } } } } elseif (isset($_GET['edit'])) { $editId = $_GET['edit']; } $listResult = omsorgcore_time_entries_list(_omsorgcore_config(), $_SESSION['omsorgcore_access_token']); $timeEntries = $listResult['ok'] ? ($listResult['data']['items'] ?? []) : []; // Statuswerte mit einer Selbst-Einreichungs-Kante (requiresApproval=false, siehe // TimeEntryService.GetSelfServiceTransitionAsync in omsorgCore) - nur für diese Einträge zeigt die // Liste den "Einreichen"-Button, damit er nicht auch bei bereits eingereichten Einträgen (die zwar // noch isEditableByOwner sind, aber keine ausgehende Selbst-Einreichungs-Kante mehr haben) erscheint. $transitionsResult = omsorgcore_value_list_transitions(_omsorgcore_config(), $_SESSION['omsorgcore_access_token'], 'TimeEntryStatus'); $transitions = $transitionsResult['ok'] ? ($transitionsResult['data'] ?? []) : []; $submittableStatusIds = array_column(array_filter($transitions, fn($t) => empty($t['requiresApproval'])), 'fromItemId'); $editTimeEntry = null; if ($editId !== null) { foreach ($timeEntries as $timeEntry) { if ($timeEntry['id'] === $editId) { $editTimeEntry = $timeEntry; break; } } // Fremder/ungültiger/nicht mehr bearbeitbarer Eintrag - Own-Scope-Filterung passiert serverseitig // in omsorgcore_time_entries_list, hier nur zusätzlich: nicht (mehr) bearbeitbar zurück zu "Neuer Eintrag". if ($editTimeEntry === null || empty($editTimeEntry['isEditableByOwner'])) { $editId = null; $editTimeEntry = null; } } function order_label(array $order): string { return substr($order['id'], 0, 8) . ' (' . ($order['requiredQualification'] ?? 'Auftrag') . ')'; } layout_start('Zeiterfassung – Mitarbeiter-App', 'stundenerfassung'); ?>
Noch keine Zeiterfassung angelegt.
Keine Berechtigung, eine Zeiterfassung anzulegen.