0) ? (int) $data['CategoryID'] : null; $icon = !empty(trim($data['Icon'] ?? '')) ? trim($data['Icon']) : 'add_box'; $color = !empty(trim($data['Color'] ?? '')) ? trim($data['Color']) : '#6366f1'; if ($businessID <= 0) { apiAbort(['OK' => false, 'ERROR' => 'missing_params', 'MESSAGE' => 'BusinessID is required']); } if ($name === '') { apiAbort(['OK' => false, 'ERROR' => 'missing_params', 'MESSAGE' => 'Name is required']); } if ($title === '') { apiAbort(['OK' => false, 'ERROR' => 'missing_params', 'MESSAGE' => 'Title is required']); } if ($categoryID === null) { apiAbort(['OK' => false, 'ERROR' => 'missing_params', 'MESSAGE' => 'Please select a category']); } try { if ($templateID > 0) { // UPDATE $existing = queryOne("SELECT ID FROM QuickTaskTemplates WHERE ID = ? AND BusinessID = ?", [$templateID, $businessID]); if (!$existing) { apiAbort(['OK' => false, 'ERROR' => 'not_found', 'MESSAGE' => 'Template not found']); } queryTimed(" UPDATE QuickTaskTemplates SET Name = ?, Title = ?, Details = ?, TaskCategoryID = ?, Icon = ?, Color = ? WHERE ID = ? ", [$name, $title, $details ?: null, $categoryID, $icon, $color, $templateID]); jsonResponse([ 'OK' => true, 'TEMPLATE_ID' => $templateID, 'MESSAGE' => 'Template updated', ]); } else { // INSERT $nextSort = queryOne("SELECT COALESCE(MAX(SortOrder), 0) + 1 AS nextSort FROM QuickTaskTemplates WHERE BusinessID = ?", [$businessID]); queryTimed(" INSERT INTO QuickTaskTemplates (BusinessID, Name, Title, Details, TaskCategoryID, Icon, Color, SortOrder) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ", [$businessID, $name, $title, $details ?: null, $categoryID, $icon, $color, (int) $nextSort['nextSort']]); $newID = (int) lastInsertId(); jsonResponse([ 'OK' => true, 'TEMPLATE_ID' => $newID, 'MESSAGE' => 'Template created', ]); } } catch (Exception $e) { jsonResponse(['OK' => false, 'ERROR' => 'server_error', 'MESSAGE' => $e->getMessage()]); }