false, 'ERROR' => 'missing_params', 'MESSAGE' => 'TaskID is required.']); } try { $qTask = queryOne(" SELECT ID, ClaimedByUserID, CompletedOn, OrderID, TaskTypeID FROM Tasks WHERE ID = ? ", [$taskID]); if (!$qTask) { apiAbort(['OK' => false, 'ERROR' => 'not_found', 'MESSAGE' => 'Task not found.']); } if ((int) $qTask['TaskTypeID'] !== 2) { apiAbort(['OK' => false, 'ERROR' => 'not_chat', 'MESSAGE' => 'This endpoint is only for chat tasks.']); } if (!empty(trim($qTask['CompletedOn'] ?? ''))) { apiAbort(['OK' => false, 'ERROR' => 'already_completed', 'MESSAGE' => 'Chat has already been closed.']); } queryTimed("UPDATE Tasks SET CompletedOn = NOW() WHERE ID = ?", [$taskID]); jsonResponse([ 'OK' => true, 'ERROR' => '', 'MESSAGE' => 'Chat closed successfully.', 'TaskID' => $taskID, ]); } catch (Exception $e) { jsonResponse(['OK' => false, 'ERROR' => 'server_error', 'MESSAGE' => 'Error closing chat', 'DETAIL' => $e->getMessage()]); }