false, 'ERROR' => 'ID is required']); } // Validate status if provided $validStatuses = ['active', 'paused', 'done', 'cancelled']; if ($status !== '' && !in_array($status, $validStatuses, true)) { http_response_code(400); apiAbort(['OK' => false, 'ERROR' => 'Status must be one of: ' . implode(', ', $validStatuses)]); } try { // Verify task exists $task = queryOne("SELECT ID, Status FROM TeamTasks WHERE ID = ?", [$id]); if (!$task) { http_response_code(404); apiAbort(['OK' => false, 'ERROR' => 'Task not found']); } // Build dynamic update $sets = []; $params = []; if ($status !== '') { $sets[] = "Status = ?"; $params[] = $status; // Auto-set timestamp columns based on status transitions if ($status === 'paused') { $sets[] = "PausedOn = NOW()"; } elseif ($status === 'done' || $status === 'cancelled') { $sets[] = "CompletedOn = NOW()"; } elseif ($status === 'active' && $task['Status'] === 'paused') { // Resuming from pause — clear PausedOn $sets[] = "PausedOn = NULL"; } } if ($notes !== null) { $sets[] = "Notes = ?"; $params[] = trim($notes); } if ($channel !== null) { $sets[] = "Channel = ?"; $params[] = trim($channel); } if (empty($sets)) { http_response_code(400); apiAbort(['OK' => false, 'ERROR' => 'Nothing to update — provide Status, Notes, or Channel']); } $params[] = $id; queryTimed("UPDATE TeamTasks SET " . implode(', ', $sets) . " WHERE ID = ?", $params); jsonResponse(['OK' => true]); } catch (Throwable $e) { http_response_code(500); apiAbort(['OK' => false, 'ERROR' => 'Failed to update task: ' . $e->getMessage()]); }