false, 'error' => 'Unauthorized']); exit; } $requestMethod = strtoupper((string) ($_SERVER['REQUEST_METHOD'] ?? 'GET')); if ($requestMethod === 'POST') { $csrf = (string) ($_SERVER['HTTP_X_CSRF_TOKEN'] ?? ''); if (!auth_validate_csrf_token($csrf)) { http_response_code(419); echo json_encode(['ok' => false, 'error' => 'Ungültiges Sicherheits-Token']); exit; } $payload = json_decode((string) file_get_contents('php://input'), true); if (!is_array($payload)) { http_response_code(400); echo json_encode(['ok' => false, 'error' => 'Ungültige Anfrage']); exit; } try { if (($payload['action'] ?? '') === 'create') { $fields = is_array($payload['fields'] ?? null) ? $payload['fields'] : []; $occurrence = market_management_create_occurrence($pdo, [ 'market_definition_id' => $fields['market_definition_id'] ?? null, 'days' => [['date' => $fields['date'] ?? null]], ]); echo json_encode(['ok' => true, 'occurrence_id' => (int) $occurrence['id']], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } $scope = (string) ($payload['scope'] ?? ''); $id = market_management_require_positive_id($payload['id'] ?? null, 'id'); $fields = is_array($payload['fields'] ?? null) ? $payload['fields'] : []; if (($payload['action'] ?? '') === 'delete') { if (($payload['confirmation'] ?? '') !== 'DELETE') { throw new InvalidArgumentException('Die Löschbestätigung muss exakt DELETE lauten.'); } market_management_set_occurrence_archive($pdo, $id, true); } elseif (($payload['action'] ?? '') === 'create_day') { $fields['occurrence_id'] = $id; $day = market_management_create_day($pdo, $fields); echo json_encode(['ok' => true, 'day' => $day]); exit; } elseif (($payload['action'] ?? '') === 'delete_day') { if (($payload['confirmation'] ?? '') !== 'DELETE') { throw new InvalidArgumentException('Bestätigung muss exakt DELETE lauten.'); } $day = market_management_delete_day($pdo, $id); echo json_encode(['ok' => true, 'day' => $day]); exit; } elseif ($scope === 'day') { market_management_update_day($pdo, $id, $fields); } elseif (in_array($scope, ['occurrence', 'status', 'overview', 'participation', 'infrastructure', 'travel', 'notes'], true)) { $contactFields = []; foreach (['contact_person_name', 'contact_email', 'contact_phone'] as $contactField) { if (array_key_exists($contactField, $fields)) { $contactFields[$contactField] = $fields[$contactField]; unset($fields[$contactField]); } } $existingOccurrence = null; if ($contactFields !== []) { $existingOccurrence = market_management_get_occurrence($pdo, $id, true); } if ($contactFields !== []) { $contactFields['occurrence_id'] = $id; market_management_set_occurrence_contact($pdo, $contactFields); } if ($fields !== []) { $simpleCostFields = []; foreach (['gross_cost', 'cost_items_text'] as $costField) { if (array_key_exists($costField, $fields)) { $simpleCostFields[$costField] = $fields[$costField]; unset($fields[$costField]); } } if ($simpleCostFields !== []) { market_management_update_occurrence_simple_costs($pdo, $id, $simpleCostFields); } if ($fields !== []) { market_management_update_occurrence($pdo, $id, $fields); } } } else { throw new InvalidArgumentException('Ungültiger Bearbeitungsbereich.'); } echo json_encode(['ok' => true]); exit; } catch (Throwable $error) { http_response_code(422); echo json_encode(['ok' => false, 'error' => $error->getMessage()], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } } if (($requestMethod === 'GET') && ($_GET['action'] ?? '') === 'create_options') { echo json_encode([ 'ok' => true, 'market_definitions' => market_management_list_active_market_definitions($pdo), ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } $occurrenceId = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); if (!is_int($occurrenceId) || $occurrenceId <= 0) { http_response_code(400); echo json_encode(['ok' => false, 'error' => 'Invalid occurrence id']); exit; } $occurrence = market_management_get_occurrence($pdo, $occurrenceId); if ($occurrence === null) { http_response_code(404); echo json_encode(['ok' => false, 'error' => 'Occurrence not found']); exit; } $market = market_management_get_market($pdo, (int) $occurrence['market_definition_id']); if ($market === null) { http_response_code(404); echo json_encode(['ok' => false, 'error' => 'Market not found']); exit; } echo json_encode(['ok' => true, 'market' => $market, 'occurrence' => $occurrence], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);