false, 'error' => 'Method not allowed'], 405); } $body = readJsonBody(); $personId = isset($body['personId']) ? trim((string) $body['personId']) : ''; $pin = isset($body['pin']) ? (string) $body['pin'] : ''; if ($personId === '') { sendJson(['success' => false, 'error' => 'personId is required'], 400); } $people = normalizePeopleList(readJsonFile('people.json')); $person = findPersonById($people, $personId); if ($person === null) { sendJson(['success' => false, 'error' => 'Person not found'], 404); } $role = $person['role'] ?? ''; $pinHash = $person['pin_hash'] ?? null; if ($role === ROLE_HEAD && is_string($pinHash) && $pinHash !== '') { if ($pin === '' || !password_verify($pin, $pinHash)) { sendJson(['success' => false, 'error' => 'PIN required or incorrect'], 403); } setSessionPerson($personId, true); } else { setSessionPerson($personId, false); } sendJson(['success' => true]);