false, 'ERROR' => 'missing_beacon_id', 'MESSAGE' => 'BeaconID is required']); } $qBeacon = queryOne(" SELECT ID, Name, UUID, BusinessID FROM Beacons WHERE ID = ? AND IsActive = 1 LIMIT 1 ", [$beaconId]); if (!$qBeacon) { apiAbort(['OK' => false, 'ERROR' => 'not_found', 'MESSAGE' => 'Beacon not found or inactive']); } // Get businesses assigned to this beacon (via service points or join table) $qAssignments = queryTimed(" SELECT sp.BusinessID, sp.ID AS ServicePointID, biz.Name AS BusinessName, biz.ParentBusinessID, sp.Name AS ServicePointName FROM ServicePoints sp INNER JOIN Businesses biz ON biz.ID = sp.BusinessID WHERE sp.BeaconID = ? AND sp.IsActive = 1 UNION SELECT lt.BusinessID, 0 AS ServicePointID, biz.Name AS BusinessName, biz.ParentBusinessID, '' AS ServicePointName FROM lt_BeaconsID_BusinessesID lt INNER JOIN Businesses biz ON biz.ID = lt.BusinessID WHERE lt.BeaconID = ? AND lt.BusinessID NOT IN ( SELECT sp2.BusinessID FROM ServicePoints sp2 WHERE sp2.BeaconID = ? AND sp2.IsActive = 1 ) ORDER BY ParentBusinessID IS NULL DESC, BusinessName ASC ", [$beaconId, $beaconId, $beaconId]); // Check if any assigned business is a parent $parentBusinessID = 0; foreach ($qAssignments as $a) { $childCount = queryOne(" SELECT COUNT(*) AS cnt FROM Businesses WHERE ParentBusinessID = ? ", [(int) $a['BusinessID']]); if ($childCount && (int) $childCount['cnt'] > 0) { $parentBusinessID = (int) $a['BusinessID']; break; } } $businesses = []; if ($parentBusinessID > 0) { $qParent = queryOne(" SELECT Name, HeaderImageExtension FROM Businesses WHERE ID = ? ", [$parentBusinessID]); $qChildren = queryTimed(" SELECT ID, Name, ParentBusinessID, HeaderImageExtension FROM Businesses WHERE ParentBusinessID = ? ORDER BY Name ASC ", [$parentBusinessID]); $firstAssignment = $qAssignments[0] ?? []; foreach ($qChildren as $child) { $businesses[] = [ 'BusinessID' => (int) $child['ID'], 'Name' => $child['Name'], 'ServicePointID' => (int) ($firstAssignment['ServicePointID'] ?? 0), 'ServicePointName' => $firstAssignment['ServicePointName'] ?? '', 'IsParent' => false, 'ParentBusinessID' => $parentBusinessID, ]; } } else { foreach ($qAssignments as $a) { $businesses[] = [ 'BusinessID' => (int) $a['BusinessID'], 'Name' => $a['BusinessName'], 'ServicePointID' => (int) $a['ServicePointID'], 'ServicePointName' => $a['ServicePointName'], 'IsParent' => empty($a['ParentBusinessID']) || (int) $a['ParentBusinessID'] === 0, ]; } } $response = [ 'OK' => true, 'ERROR' => '', 'BEACON' => [ 'BeaconID' => (int) $qBeacon['ID'], 'Name' => $qBeacon['Name'], 'UUID' => $qBeacon['UUID'], ], 'BUSINESSES' => $businesses, 'BUSINESS' => $businesses[0] ?? (object) [], 'SERVICEPOINT' => !empty($businesses) ? [ 'ServicePointID' => $businesses[0]['ServicePointID'], 'Name' => $businesses[0]['ServicePointName'], 'IsActive' => true, ] : (object) [], ]; if ($parentBusinessID > 0) { $response['PARENT'] = [ 'BusinessID' => $parentBusinessID, 'Name' => $qParent['Name'] ?? '', 'HeaderImageExtension' => trim($qParent['HeaderImageExtension'] ?? ''), ]; } jsonResponse($response);