prepare("SELECT name, email, phone, avatar FROM clients WHERE client_id = ? LIMIT 1"); $bStmt->bind_param('i', $ses_id); $bStmt->execute(); $bRow = $bStmt->get_result()->fetch_assoc(); $bStmt->close(); if ($bRow && (!empty($bRow['name']) || !empty($bRow['email']))) { $broker = $bRow; } } $shareUrl = 'https://' . ($_SERVER['HTTP_HOST'] ?? 'findestate.ai') . '?p=mvp&i=9&id=' . $id; $isSaved = false; $comments = []; $today = date('Y-m-d'); if (!empty($ses_id)) { $cartChk = $conn->prepare("SELECT id FROM cart WHERE user=? AND post_id=? LIMIT 1"); $cartChk->bind_param('ii', $ses_id, $id); $cartChk->execute(); $isSaved = (bool)$cartChk->get_result()->fetch_row(); $cartChk->close(); $cmtRes = $conn->prepare("SELECT id, comment, reminder_date, created_at FROM estate_comments WHERE user_id=? AND post_id=? ORDER BY created_at DESC LIMIT 20"); $cmtRes->bind_param('ii', $ses_id, $id); $cmtRes->execute(); $comments = $cmtRes->get_result()->fetch_all(MYSQLI_ASSOC); $cmtRes->close(); } if (($_GET['format'] ?? '') === 'json') { header('Content-Type: application/json; charset=utf-8'); echo json_encode((new ScoreExplainer($conn))->explain($id), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); exit; } $explainer = new ScoreExplainer($conn); $data = $explainer->explain($id); if (isset($data['error'])) { http_response_code(404); die(htmlspecialchars($data['error'])); } $e = $data['estate']; $sc = $data['score']; $mkt = $data['market']; $comp = $data['comparables']; // COMPARABLES FOTO while ($conn->more_results()) { $conn->next_result(); } if (!empty($comp)) { $compIds = array_filter(array_column($comp, 'id')); if (!empty($compIds)) { $placeholders = implode(',', array_fill(0, count($compIds), '?')); $imgStmt = $conn->prepare("SELECT id, image_url FROM estates WHERE id IN ({$placeholders}) AND image_url IS NOT NULL AND image_url != ''"); $imgTypes = str_repeat('i', count($compIds)); $imgStmt->bind_param($imgTypes, ...$compIds); $imgStmt->execute(); $imgResult = $imgStmt->get_result(); $imgMap = []; while ($imgRow = $imgResult->fetch_assoc()) { $imgMap[$imgRow['id']] = $imgRow['image_url']; } $imgResult->free(); $imgStmt->close(); $comp = array_map(function($c) use ($imgMap) { $c['image_url'] = $imgMap[$c['id'] ?? 0] ?? null; return $c; }, $comp); } } $related = $data['related'] ?? []; $mods = $data['modules']; $verd = $data['verdict']; $mapData = $data['map_data'] ?? []; function fe_fmt(float|int|null $n): string { return number_format((float)($n ?? 0), 0, ',', ' '); } function fe_esc(?string $s): string { return htmlspecialchars((string)($s ?? ''), ENT_QUOTES, 'UTF-8'); } $discColor = match($mkt['color'] ?? 'neutral') { 'green' => 'success', 'orange' => 'warning', 'red' => 'danger', default => 'secondary' }; $confColor = match($sc['confidence']) { 'high' => 'success', 'medium' => 'warning', default => 'danger' }; $verdColor = match($verd['level']) { 'positive' => 'success', 'negative' => 'danger', default => 'secondary' }; $scoreColor = match(true) { $sc['value'] >= 65 => 'success', $sc['value'] >= 50 => 'info', $sc['value'] >= 35 => 'warning', default => 'danger' }; $barPct = 50; if ($mkt['market_price'] > 0) { $barPct = max(5, min(95, (int)(($mkt['actual_price'] / $mkt['market_price']) * 50))); } $otypeIcon = match($e['otype']) { 'apartment' => 'building', 'house' => 'home', 'land' => 'map', default => 'building' }; $otypeLabel = match($e['otype']) { 'apartment' => 'Butas', 'house' => 'Namas', 'land' => 'Sklypas', 'commercial' => 'Komercinis', default => $e['otype'] }; $statusIcons = ['chart' => 'database', 'pin' => 'map-pin', 'building' => 'building', 'signal' => 'trending-up', 'tag' => 'tag']; $mapCenter = $mapData['center'] ?? null; // Jei center nėra iš ScoreExplainer, bandome gauti iš estate if (empty($mapCenter['lat']) || empty($mapCenter['lng'])) { $mapCenter = [ 'lat' => (float)($data['estate']['latitude'] ?? $data['estate']['lat'] ?? 0), 'lng' => (float)($data['estate']['longitude'] ?? $data['estate']['lng'] ?? 0), ]; } // Fallback į Vilnių jei visai nėra if (empty($mapCenter['lat'])) { $mapCenter = ['lat' => 54.6872, 'lng' => 25.2797]; $hasMap = false; } else { $hasMap = true; } // $mapNearby: ScoreExplainer grąžina GeoJSON Feature masyvą. // Paduodame tiesiai į JS — jis pats pasiims geometry.coordinates. // Papildomai į properties pridedame 'id' ir 'price' jei jų nėra. $mapNearbyRaw = $mapData['nearby'] ?? []; $mapNearby = array_map(function($nr) { if (!isset($nr['type'])) return $nr; // jau plokščias // GeoJSON Feature — papildinome properties $p = $nr['properties'] ?? []; // Įsitikinome kad yra 'id' ir 'price' (popup naudoja) if (!isset($p['id'])) { $p['id'] = $p['estate_id'] ?? 0; } if (!isset($p['price'])) { $p['price'] = $p['price_eur'] ?? 0; } if (!isset($p['address'])){ $p['address'] = $p['title'] ?? ''; } if (!isset($p['image'])) { $p['image'] = $p['img'] ?? null; } // 'type' reiškia 'sold'/'active' if (!isset($p['type'])) { $p['type'] = !empty($p['sold']) ? 'sold' : 'active'; } $nr['properties'] = $p; return $nr; }, $mapNearbyRaw); $anomaly = !empty($data['estate']['anomaly_flag'] ?? false); $r = 42; $circ = 2 * M_PI * $r; $dash = $circ * ($sc['value'] / 100); $strokeColor = match($scoreColor) { 'success' => '#2fb344', 'info' => '#0ea5e9', 'warning' => '#f59f00', default => '#d63939' }; $flagLabels = [ 'high_ceilings' => ['Aukštos lubos','success'], 'terrace_or_balcony' => ['Terasa / balkonas','success'], 'fireplace' => ['Židinys','success'], 'solar_panels' => ['Saulės baterijos','success'], 'renovated_recently' => ['Renovuotas per 5m.','success'], 'smart_home' => ['Smart home','success'], 'storage_room' => ['Rūsys / sandėliukas','success'], 'parking_included' => ['Parkavimas','success'], 'noise_issue' => ['Triukšminga aplinka','warning'], 'north_facing' => ['Langai į šiaurę','warning'], 'needs_repair' => ['Reikalingas remontas','danger'], 'no_elevator' => ['Nėra lifto','warning'], 'electric_only_heating' => ['Tik elektrinis šildymas','warning'], 'problematic_building' => ['Probleminė aplinka','danger'], ]; $flags = $mkt['description_flags'] ?? []; $hasFlags = !empty(array_filter($flags ?? [], fn($v, $k) => isset($flagLabels[$k]), ARRAY_FILTER_USE_BOTH)); // Investicinis rodiklis $rentalYield = null; $rentalData = null; if (in_array($e['otype'], ['apartment', 'house']) && ($mkt['actual_price'] ?? 0) > 0) { $rOtype = $e['otype']; $rCity = $e['city'] ?? ''; $rSize = (float)($data['estate']['size_sqm'] ?? 0); $rRooms = (int)($data['estate']['room_number'] ?? 0); $rLat = (float)($mapCenter['lat'] ?? 0); $rLng = (float)($mapCenter['lng'] ?? 0); $sizeMin = $rSize > 0 ? $rSize * 0.60 : 0; $sizeMax = $rSize > 0 ? $rSize * 1.40 : 99999; $rentalRows = []; foreach (['radius_1' => 1.0, 'radius_3' => 3.0, 'city' => null] as $mode => $km) { if (!empty($rentalRows)) break; if ($km !== null && $rLat && $rLng) { $sql = "SELECT e.price_eur AS rent_monthly, e.size_sqm, ROUND(6371000 * ACOS(GREATEST(-1, LEAST(1, COS(RADIANS(?)) * COS(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) * COS(RADIANS(CAST(e.longitude AS DECIMAL(11,8))) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) )))) AS dist_m FROM estates e WHERE e.sell_rent = 2 AND e.otype = ? AND e.done = 1 AND e.price_eur BETWEEN 50 AND 8000 " . ($rSize > 0 ? "AND e.size_sqm BETWEEN ? AND ?" : "") . " " . ($rRooms > 0 ? "AND (e.room_number = ? OR e.room_number IS NULL)" : "") . " AND (6371 * ACOS(GREATEST(-1, LEAST(1, COS(RADIANS(?)) * COS(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) * COS(RADIANS(CAST(e.longitude AS DECIMAL(11,8))) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) )))) <= ? ORDER BY dist_m ASC LIMIT 25"; $st = $conn->prepare($sql); if (!$st) continue; $t = 'ddd'; $p = [$rLat, $rLng, $rLat]; $t .= 's'; $p[] = $rOtype; if ($rSize > 0) { $t .= 'dd'; $p[] = $sizeMin; $p[] = $sizeMax; } if ($rRooms > 0) { $t .= 'i'; $p[] = $rRooms; } $t .= 'dddd'; $p[] = $rLat; $p[] = $rLng; $p[] = $rLat; $p[] = $km; } else { $sql = "SELECT e.price_eur AS rent_monthly, e.size_sqm, NULL AS dist_m FROM estates e WHERE e.sell_rent = 2 AND e.otype = ? AND e.city = ? AND e.done = 1 AND e.price_eur BETWEEN 50 AND 8000 " . ($rSize > 0 ? "AND e.size_sqm BETWEEN ? AND ?" : "") . " ORDER BY e.created_at DESC LIMIT 25"; $st = $conn->prepare($sql); if (!$st) continue; $t = 'ss'; $p = [$rOtype, $rCity]; if ($rSize > 0) { $t .= 'dd'; $p[] = $sizeMin; $p[] = $sizeMax; } } $st->bind_param($t, ...$p); $st->execute(); $rows_tmp = $st->get_result()->fetch_all(MYSQLI_ASSOC); $st->close(); if (count($rows_tmp) >= 3) $rentalRows = $rows_tmp; } if (count($rentalRows) >= 3) { $rents = array_column($rentalRows, 'rent_monthly'); sort($rents); $mid = (int)(count($rents) / 2); $medianRent = count($rents) % 2 === 0 ? ($rents[$mid-1] + $rents[$mid]) / 2 : $rents[$mid]; $buyPrice = (float)$mkt['actual_price']; $annualRent = $medianRent * 12; $grossYield = $buyPrice > 0 ? ($annualRent / $buyPrice) * 100 : 0; $netYield = $grossYield * 0.75; $payback = $annualRent > 0 ? $buyPrice / $annualRent : 0; $rentalData = [ 'median_rent' => (int)round($medianRent), 'gross_yield' => round($grossYield, 2), 'net_yield' => round($netYield, 2), 'payback_years' => round($payback, 1), 'sample_count' => count($rentalRows), 'buy_price' => $buyPrice, 'annual_rent' => (int)round($annualRent), ]; $rentalYield = match(true) { $grossYield >= 7 => ['label' => 'Puikus', 'color' => 'success', 'icon' => 'trending-up'], $grossYield >= 5 => ['label' => 'Geras', 'color' => 'teal', 'icon' => 'trending-up'], $grossYield >= 3.5 => ['label' => 'Vidutinis', 'color' => 'warning', 'icon' => 'minus'], default => ['label' => 'Žemas', 'color' => 'danger', 'icon' => 'trending-down'], }; } } // ADMIN if ($ses_id == 1) { $isAdmin = true; } $isHidden = false; if ($isAdmin) { $conn->query("ALTER TABLE estates ADD COLUMN IF NOT EXISTS `hide` TINYINT(1) NOT NULL DEFAULT 0"); $hideRes = $conn->query("SELECT `hide` FROM estates WHERE id = $id LIMIT 1"); if ($hideRes) { $hideRow = $hideRes->fetch_assoc(); $isHidden = (bool)($hideRow['hide'] ?? false); } } $ajaxUrl = '/score_card_ajax.php'; $scoreCronUrl = 'https://data.rasknt.lt/config/score_cron.php?id=' . $id; // Suggestions (taip pat gali dominti) $suggestions = []; $suggestionRadius = null; if (!empty($e['otype'])) { $sOtype = $e['otype']; $sId = (int)($data['estate']['id'] ?? 0); $sLat = (float)($mapCenter['lat'] ?? 0); $sLng = (float)($mapCenter['lng'] ?? 0); $sizeField = ($sOtype === 'land') ? 'land_size_are' : 'size_sqm'; $sizeVal = ($sOtype === 'land') ? (float)($data['estate']['land_size_are'] ?? 0) : (float)($data['estate']['size_sqm'] ?? 0); $sRooms = (int)($data['estate']['room_number'] ?? 0); $sYear = (int)($data['estate']['year'] ?? 0); $yearMin = ($sYear > 0 && $sYear <= 2000) ? 1900 : max(1900, $sYear - 10); $yearMax = ($sYear > 0 && $sYear <= 2000) ? 2000 : ($sYear > 0 ? $sYear + 10 : 2100); $excludeIds = [$sId]; if (!empty($comp)) { foreach ($comp as $c) { if (!empty($c['id'])) $excludeIds[] = (int)$c['id']; } } if (!empty($related)) { foreach ($related as $r) { if (!empty($r['id'])) $excludeIds[] = (int)$r['id']; } } $excludeIds = array_unique($excludeIds); $sizeMin = $sizeVal > 0 ? $sizeVal * 0.70 : 0; $sizeMax = $sizeVal > 0 ? $sizeVal * 1.30 : 99999; // Saugiai statome WHERE sąlygas — be tarpų problemų $extraWhere = ''; if ($sizeVal > 0) { $extraWhere .= " AND e.{$sizeField} BETWEEN ? AND ?"; } if ($sYear > 0) { $extraWhere .= " AND (e.year BETWEEN ? AND ? OR e.year IS NULL)"; } if ($sRooms > 0 && in_array($sOtype, ['apartment','house'])) { $extraWhere .= " AND (e.room_number = ? OR e.room_number IS NULL)"; } foreach ([1,3,5,10] as $km) { if (count($suggestions) >= 15) break; if (!$sLat || !$sLng) break; $ph = implode(',', array_fill(0, count($excludeIds), '?')); $sql = "SELECT e.id, e.otype, e.city, e.address, e.price_eur, e.image_url, e.url, e.size_sqm, e.land_size_are, e.room_number, e.year, e.build_status, e.findestate_score, e.deal_score, e.market_price_eur, e.is_hot_deal, ROUND(6371 * ACOS(GREATEST(-1, LEAST(1, COS(RADIANS(?)) * COS(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) * COS(RADIANS(CAST(e.longitude AS DECIMAL(11,8))) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) ))), 2) AS dist_km, CASE WHEN e.size_sqm > 0 THEN ROUND(e.price_eur / e.size_sqm) ELSE NULL END AS price_sqm FROM estates e WHERE e.id NOT IN ({$ph}) AND e.otype = ? AND e.price_eur > 0 AND e.findestate_score IS NOT NULL {$extraWhere} AND (6371 * ACOS(GREATEST(-1, LEAST(1, COS(RADIANS(?)) * COS(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) * COS(RADIANS(CAST(e.longitude AS DECIMAL(11,8))) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(CAST(e.latitude AS DECIMAL(10,8)))) )))) <= ? ORDER BY e.findestate_score DESC, e.price_eur ASC LIMIT 15"; $stmt = $conn->prepare($sql); if (!$stmt) continue; $types = 'ddd'; $params = [$sLat, $sLng, $sLat]; $types .= str_repeat('i', count($excludeIds)); $params = array_merge($params, $excludeIds); $types .= 's'; $params[] = $sOtype; if ($sizeVal > 0) { $types .= 'dd'; $params[] = $sizeMin; $params[] = $sizeMax; } if ($sYear > 0) { $types .= 'ii'; $params[] = $yearMin; $params[] = $yearMax; } if ($sRooms > 0 && in_array($sOtype, ['apartment','house'])) { $types .= 'i'; $params[] = $sRooms; } $types .= 'dddd'; $params[] = $sLat; $params[] = $sLng; $params[] = $sLat; $params[] = (float)$km; $stmt->bind_param($types, ...$params); $stmt->execute(); $rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); $stmt->close(); foreach ($rows as $row) { if (!isset($suggestions[$row['id']])) { $row['radius_km'] = $km; $suggestions[$row['id']] = $row; if (count($suggestions) >= 15) break; } } if (count($suggestions) >= 10) { $suggestionRadius = $km; break; } $suggestionRadius = $km; } if (count($suggestions) < 10 && !empty($e['city'])) { $alreadyFound = array_keys($suggestions); $excludeAll = array_unique(array_merge($excludeIds, $alreadyFound)); $ph = implode(',', array_fill(0, count($excludeAll), '?')); $limit = 15 - count($suggestions); // Fallback: tik miesto filtras be koordinačių $extraWhereCity = ''; if ($sizeVal > 0) { $extraWhereCity .= " AND e.{$sizeField} BETWEEN ? AND ?"; } if ($sYear > 0) { $extraWhereCity .= " AND (e.year BETWEEN ? AND ? OR e.year IS NULL)"; } $sql = "SELECT e.id, e.otype, e.city, e.address, e.price_eur, e.image_url, e.url, e.size_sqm, e.land_size_are, e.room_number, e.year, e.build_status, e.findestate_score, e.deal_score, e.market_price_eur, e.is_hot_deal, NULL AS dist_km, CASE WHEN e.size_sqm > 0 THEN ROUND(e.price_eur / e.size_sqm) ELSE NULL END AS price_sqm FROM estates e WHERE e.id NOT IN ({$ph}) AND e.otype = ? AND e.city = ? AND e.price_eur > 0 AND e.findestate_score IS NOT NULL {$extraWhereCity} ORDER BY e.findestate_score DESC, e.price_eur ASC LIMIT {$limit}"; $stmt = $conn->prepare($sql); if ($stmt) { $types = str_repeat('i', count($excludeAll)) . 'ss'; $params = array_merge($excludeAll, [$sOtype, $e['city']]); if ($sizeVal > 0) { $types .= 'dd'; $params[] = $sizeMin; $params[] = $sizeMax; } if ($sYear > 0) { $types .= 'ii'; $params[] = $yearMin; $params[] = $yearMax; } $stmt->bind_param($types, ...$params); $stmt->execute(); $rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); $stmt->close(); foreach ($rows as $row) { $row['radius_km'] = null; $suggestions[$row['id']] = $row; } } $suggestionRadius = null; } $suggestions = array_values($suggestions); } $sgMarketPrice = (float)($mkt['market_price'] ?? 0); // Suggestions JSON $sgJson = '[]'; if (!empty($suggestions)) { $sgJson = json_encode(array_map(function($s) use ($sgMarketPrice) { $vsPct = ($sgMarketPrice > 0 && $s['price_eur'] > 0) ? round(($sgMarketPrice - $s['price_eur']) / $sgMarketPrice * 100, 1) : null; $img = !empty($s['image_url']) ? 'https://findestate.eu/f.php?u=' . $s['image_url'] : null; return [ 'id' => (int)$s['id'], 'address' => mb_substr($s['address'] ?? '', 0, 45), 'city' => $s['city'] ?? '', 'price' => (float)$s['price_eur'], 'price_sqm' => $s['price_sqm'] ? (int)$s['price_sqm'] : null, 'score' => $s['findestate_score'] !== null ? round((float)$s['findestate_score'], 1) : null, 'vs_market' => $vsPct, 'dist_km' => $s['dist_km'] !== null ? (float)$s['dist_km'] : null, 'size' => $s['otype'] === 'land' ? ($s['land_size_are'] ? number_format((float)$s['land_size_are'], 0, ',', '.') . ' a' : null) : ($s['size_sqm'] ? number_format((float)$s['size_sqm'], 0, ',', '.') . ' m²' : null), 'rooms' => $s['room_number'] ? (int)$s['room_number'] : null, 'year' => $s['year'] ? (int)$s['year'] : null, 'build_status' => $s['build_status'] ?? null, 'image' => $img, 'url' => '/?p=analysis&id=' . (int)$s['id'], 'ext_url' => $s['url'] ?? null, 'is_hot' => !empty($s['is_hot_deal']), 'land_size' => (!empty($s['land_size_are']) && $s['land_size_are'] > 0) ? number_format((float)$s['land_size_are'], 0, ',', '.') . ' a' : null, 'floor' => (!empty($s['floor']) && $s['floor'] > 0) ? (int)$s['floor'] : null, 'days_market' => !empty($s['created_at']) ? (int)((time() - strtotime($s['created_at'])) / 86400) : null, ]; }, $suggestions), JSON_UNESCAPED_UNICODE); } ?> RaskNT · <?= fe_esc($e['address']) ?> · <?= fe_fmt($mkt['actual_price'] ?? 0) ?> €
Išimtas Hot Deal Didelė nuolaida — tikrink

m. 0): ?> a 0): $_daysCls = $_daysInMarket > 60 ? 'warning' : ($_daysInMarket > 30 ? 'yellow' : 'success'); ?> d. rinkoje Peržiūrėti skelbimą
/100
Admin · ID: Debug JSON Paslėptas
Padidinti

Nepakanka duomenų tiksliai analizei

Koordinatės nenustatytos — analizė pagrįsta miesto vidurkiu. Rasta tik panašių objektų. Mažai palyginamų objektų — vertinimas apytikris. Rekomenduojame patikrinti rankiniu būdu.

Kainos analizė

Kaina skelbime
€/m²
0): ?>
Rinkos vidurkis
€/m²
=0?'−':'+' ?>%
0&&$mkt['percentile']!==null): ?>
Pigiausi rinkojeBrangiausi rinkoje
Pigesnis nei % panašių objektų ·
0 && !empty($e['otype'])) { $avgSql = "SELECT AVG(DATEDIFF(COALESCE(updated_at, NOW()), created_at)) AS avg_days, COUNT(*) AS cnt FROM estates WHERE otype = ? AND city = ? AND price_eur > 0 AND created_at > DATE_SUB(NOW(), INTERVAL 12 MONTH) AND (sold = 1 OR created_at < DATE_SUB(NOW(), INTERVAL 7 DAY)) LIMIT 1"; $avgStmt = $conn->prepare($avgSql); if ($avgStmt) { $avgStmt->bind_param('ss', $e['otype'], $e['city']); $avgStmt->execute(); $avgRow = $avgStmt->get_result()->fetch_assoc(); $avgStmt->close(); if ($avgRow && $avgRow['avg_days'] > 0) { $_avgDays = (int)round($avgRow['avg_days']); $_avgDaysSample = (int)$avgRow['cnt']; } } } ?> 0): ?>

Laikas rinkoje

vidurkis iš obj.
Šis objektas
($_avgDays ?: 60) ? 'danger' : ($_daysInMarket > 30 ? 'warning' : 'success'); ?>
dienų
Rinkos vidurkis
dienų
Naujas objektas — mažiau nei pusė vidutinio laiko rinkoje Rinkoje trumpiau nei vidurkis — geras laikas derėtis Rinkoje ilgiau nei vidurkis — pardavėjas gali būti lankstesnis Rinkoje × ilgiau nei vidurkis — didelė derybų erdvė

Vertinami panašūs objektai

objektai ·
0?'warning':'success')) : null; $cDist = $c['distance_m']!==null ? ($c['distance_m']<1000?(int)$c['distance_m'].' m':number_format($c['distance_m']/1000,1,',','').' km') : '—'; $cImg = !empty($c['image_url']) ? 'https://findestate.eu/f.php?u='.fe_esc($c['image_url']) : null; ?>
Adresas ir parametrai Kaina vs. vid. Atstumas
parduotas išimtas
0) echo ''.(int)$c['room_number'].' k.'; // Plotas m² if (!empty($c['size_sqm']) && $c['size_sqm'] > 0) echo ''.fe_fmt($c['size_sqm']).' m²'; // Sklypo plotas if (!empty($c['land_size_are']) && $c['land_size_are'] > 0) echo ''.fe_fmt($c['land_size_are']).' a'; // Aukštas if (!empty($c['floor']) && $c['floor'] > 0 && $cOtype === 'apartment') echo ''.(int)$c['floor'].'-as a.'; // Metai if (!empty($c['year'])) echo ''.$c['year'].' m.'; // Įrengimas if (!empty($c['build_status'])) echo ''.fe_esc($c['build_status']).''; // Dienos rinkoje if (!empty($c['days_listed']) && $c['days_listed'] > 0) echo ''.$c['days_listed'].' d.'; ?>
€/m²
0?'+':'').number_format($c['diff_pct'],1,',','') ?>%

Susiję skelbimai

portaluose
0 && $rel['price_eur'] > 0) ? round(($rel['price_eur'] - $mainPrice) / $mainPrice * 100, 1) : null; $relCls = $relDiff === null ? null : ($relDiff > 2 ? 'danger' : ($relDiff < -2 ? 'success' : 'secondary')); $relImg = !empty($rel['image_url']) ? 'https://findestate.eu/f.php?u='.fe_esc($rel['image_url']) : null; ?>
Portalas ir parametrai Kaina vs. šis
išimtas
0) echo ''.(int)$rel['room_number'].' k.'; // Plotas m² if (!empty($rel['size_sqm']) && $rel['size_sqm'] > 0) echo ''.fe_fmt($rel['size_sqm']).' m²'; // Sklypo plotas if (!empty($rel['land_size_are']) && $rel['land_size_are'] > 0) echo ''.fe_fmt($rel['land_size_are']).' a'; // Metai if (!empty($rel['year'])) echo ''.$rel['year'].' m.'; // Dienos rinkoje if ($relDays > 0) echo ''.$relDays.' d.'; // Score if ($relScore !== null) echo 'Score: '.$relScore.''; ?>
0?'+':'').$relDiff ?>%

Vertinimo išvada

Aplinka žemėlapyje

panašių objektų 2km spinduliu

Reitingo sudėtis

['success','#2fb344'],'quality'=>['primary','#0054a6'],'location'=>['info','#0ea5e9'],'signals'=>['warning','#f59f00'],'market'=>['secondary','#6c7a8d']]; foreach($mods as $mi=>$mod): $pct=$mod['score']??0; [$modCls,$hex]=$modColorMap[$mod['key']]??['secondary','#6c7a8d']; $icon=$statusIcons[$mod['icon']]??'circle'; ?>
/100
=10?'#2fb344':($compN>=5?'#f59f00':'#d63939'); $lbl=$compN>=10?'Patikimas':($compN>=5?'Pakankamas':'Mažai duomenų'); ?>
0 obj. — 15+

Objekto ypatybės

AI analizė
$val): if(!isset($flagLabels[$key]))continue; [$label,$color]=$flagLabels[$key]; $ac=$val?$color:'secondary'; ?>

Investicinis rodiklis

Pirkimo kaina
Nuoma/mėn. ( skelb. vidurkis)
Metinė nuoma
Gross yield%
Net yield (~75%)%
Atsipirkimo laikotarpis m.
0%3.5%5%7%+

Duomenys

Patikimumas
Palyginamų objektų
Paieškos spindulys
Susiję portaluose
Atnaujinta
Pardavėjas
Kaina >30% žemiau rinkos medianos.

Pastabos ir priminimai

Kalendorius Išsaugota!
Komentaro išsaugojimas automatiškai prideda į išsaugotus

Taip pat gali dominti

km spinduliu objektai
Rūšiuoti:
Tas pats tipas · plotas ±30%0?' · '.$sRooms.' kamb.':'' ?>0?' · '.$yearMin.'–'.$yearMax.' m.':'' ?>
RaskNT ·