diff --git a/handlers/clients.php b/handlers/clients.php index 77d776d..92fb4c3 100644 --- a/handlers/clients.php +++ b/handlers/clients.php @@ -64,43 +64,6 @@ case 'GET': case 'POST': $body = read_json_body(); - if (($body['action'] ?? '') === 'reset') { - $clientCode = trim((string)($body['clientCode'] ?? '')); - if ($clientCode === '') { - json_error('MISSING_FIELDS', 'clientCode is required', 400); - } - - try { - [$pdo, $tmpDb, $lockFp] = qdb_open_write_or_fail(); - - [$clause, $params] = rbac_client_filter($tokenRec, 'cl', 'all'); - $chk = $pdo->prepare( - "SELECT clientCode FROM client cl WHERE cl.clientCode = :cc AND ($clause)" - ); - $chk->execute(array_merge([':cc' => $clientCode], $params)); - if (!$chk->fetch()) { - qdb_discard($tmpDb, $lockFp); - json_error('NOT_FOUND', 'Client not found or not authorized', 404); - } - - require_once __DIR__ . '/../lib/submissions.php'; - - $pdo->beginTransaction(); - $cleared = qdb_delete_client_response_data($pdo, [$clientCode]); - $pdo->commit(); - - qdb_save($tmpDb, $lockFp); - json_success([ - 'clientCode' => $clientCode, - 'reset' => true, - 'cleared' => $cleared, - ]); - } catch (Throwable $e) { - qdb_handler_fail($e, 'clients', $pdo ?? null, $tmpDb ?? null, $lockFp ?? null); - } - break; - } - $coachID = trim($body['coachID'] ?? ''); $bulk = !empty($body['bulk']); diff --git a/tests/Integration/ClientsLifecycleTest.php b/tests/Integration/ClientsLifecycleTest.php index c95d363..5870053 100644 --- a/tests/Integration/ClientsLifecycleTest.php +++ b/tests/Integration/ClientsLifecycleTest.php @@ -91,43 +91,6 @@ final class ClientsLifecycleTest extends QdbTestCase $this->assertContains($code, array_column($activeAgain['data']['clients'], 'clientCode')); } - public function testAdminResetsClient(): void - { - $this->submitFixtureQuestionnaire(); - $token = $this->api()->loginWebAndGetToken( - DatabaseSeeder::ADMIN_USERNAME, - DatabaseSeeder::PASSWORD - )['token']; - $code = $this->fixture()->clientCode; - - $reset = $this->api()->withToken($token, 'POST', 'clients', [ - 'action' => 'reset', - 'clientCode' => $code, - ]); - $this->assertApiOk($reset); - $this->assertTrue($reset['data']['reset'] ?? false); - - $detail = $this->api()->withToken($token, 'GET', 'clients', null, [ - 'clientCode' => $code, - 'detail' => '1', - ]); - $this->assertApiOk($detail); - $this->assertSame($code, $detail['data']['client']['clientCode'] ?? ''); - $this->assertSame([], $detail['data']['questionnaires'] ?? null); - - $list = $this->api()->withToken($token, 'GET', 'clients'); - $this->assertApiOk($list); - $row = null; - foreach ($list['data']['clients'] as $client) { - if (($client['clientCode'] ?? '') === $code) { - $row = $client; - break; - } - } - $this->assertNotNull($row); - $this->assertSame(0, (int)($row['hasResponseData'] ?? 1)); - } - public function testAdminDeletesClient(): void { $token = $this->api()->loginWebAndGetToken( diff --git a/website/js/client-archive.js b/website/js/client-archive.js index 6a0fa25..35bbd66 100644 --- a/website/js/client-archive.js +++ b/website/js/client-archive.js @@ -34,19 +34,15 @@ export async function confirmAndPatchClientArchive(clientCode, archived) { * @param {string} opts.clientCode Escaped client code for data-code attributes * @param {boolean} opts.archived * @param {boolean} [opts.showDelete] - * @param {boolean} [opts.showReset] * @param {string} [opts.rawCode] Unescaped code for button labels (optional) */ -export function clientTableActionsHTML({ clientCode, archived, showDelete = false, showReset = false }) { +export function clientTableActionsHTML({ clientCode, archived, showDelete = false }) { const archiveBtn = archived ? `` : ``; - const resetBtn = showReset - ? `` - : ''; const deleteBtn = showDelete ? `` : ''; - return `