false, 'ERROR' => 'no_business_selected']); } $spName = trim($data['Name'] ?? ''); if ($spName === '') { apiAbort(['OK' => false, 'ERROR' => 'missing_name', 'MESSAGE' => 'Name is required']); } $servicePointId = (int) ($data['ServicePointID'] ?? 0); $spCode = trim($data['Code'] ?? ''); $spTypeID = (int) ($data['TypeID'] ?? 1); $sortOrder = (int) ($data['SortOrder'] ?? 0); $beaconMinor = isset($data['BeaconMinor']) && is_numeric($data['BeaconMinor']) ? (int) $data['BeaconMinor'] : -1; $isActive = 1; if (isset($data['IsActive'])) { $v = $data['IsActive']; if (is_bool($v)) $isActive = $v ? 1 : 0; elseif (is_numeric($v)) $isActive = (int) $v; elseif (is_string($v)) $isActive = (strtolower(trim($v)) === 'true') ? 1 : 0; } try { if ($servicePointId > 0) { // Update $sql = "UPDATE ServicePoints SET Name = ?, Code = ?, TypeID = ?, IsActive = ?, SortOrder = ?"; $params = [$spName, $spCode ?: null, $spTypeID, $isActive, $sortOrder]; if ($beaconMinor >= 0) { $sql .= ", BeaconMinor = ?"; $params[] = $beaconMinor; } $sql .= " WHERE ID = ? AND BusinessID = ?"; $params[] = $servicePointId; $params[] = $businessId; queryTimed($sql, $params); $qCheck = queryOne("SELECT ID FROM ServicePoints WHERE ID = ? AND BusinessID = ? LIMIT 1", [$servicePointId, $businessId]); if (!$qCheck) { apiAbort(['OK' => false, 'ERROR' => 'not_found']); } } else { // Auto-allocate BeaconMinor if not provided if ($beaconMinor < 0) { $qMaxMinor = queryOne(" SELECT COALESCE(MAX(BeaconMinor), -1) AS MaxMinor FROM ServicePoints WHERE BusinessID = ? ", [$businessId]); $beaconMinor = (int) $qMaxMinor['MaxMinor'] + 1; } queryTimed(" INSERT INTO ServicePoints (BusinessID, Name, Code, TypeID, IsActive, SortOrder, BeaconMinor) VALUES (?, ?, ?, ?, ?, ?, ?) ", [$businessId, $spName, $spCode ?: null, $spTypeID, $isActive, $sortOrder, $beaconMinor]); $servicePointId = (int) lastInsertId(); } $qOut = queryOne(" SELECT ID, BusinessID, Name, Code, TypeID, IsActive, SortOrder, BeaconMinor FROM ServicePoints WHERE ID = ? AND BusinessID = ? LIMIT 1 ", [$servicePointId, $businessId]); jsonResponse([ 'OK' => true, 'ERROR' => '', 'SERVICEPOINT' => [ 'ServicePointID' => (int) $qOut['ID'], 'BusinessID' => (int) $qOut['BusinessID'], 'Name' => $qOut['Name'], 'Code' => $qOut['Code'] ?? '', 'TypeID' => (int) $qOut['TypeID'], 'IsActive' => (int) $qOut['IsActive'], 'SortOrder' => (int) $qOut['SortOrder'], 'BeaconMinor' => $qOut['BeaconMinor'] !== null ? (int) $qOut['BeaconMinor'] : '', ], ]); } catch (Exception $e) { jsonResponse(['OK' => false, 'ERROR' => 'server_error', 'MESSAGE' => $e->getMessage()]); }