Files
intaleq/backend/Admin/geofence/add_zone.php
T
Hamza-AyedandClaude Opus 5 92dc6b3641 chore: استيراد أولي من سيرو (ecfe7568) — بلا أي تعديل
نسخة كاملة من مستودع سيرو عند ecfe7568 لتكون أساس تطبيق «انطلق».
نُسخ المتعقَّب في git فقط (12,509 ملفاً / 302 م.ب) بـ git archive، لا
`cp -r` — فاستُثنيت تلقائياً مخلفات البناء (build · node_modules ·
.dart_tool · .gradle · Pods ≈ 10.7 غ.ب) وكل ما يستثنيه .gitignore.

هذا الكوميت **بلا أي تعديل عمداً** حتى يكون كل ما يليه فرقاً مقروءاً
مقابل سيرو الأصلي. سيرو نفسه لم يُمسّ.

⚠️ لا يبني بعد: `.env` و`lib/env/env.g.dart` غير متعقَّبين في سيرو (وهذا
صحيح — أسرار لكل مستأجر). كل تطبيق فلاتر هنا يحتاج .env خاصاً بانطلق ثم
توليد env.g.dart عبر build_runner. لا تُنسخ أسرار سيرو.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 05:10:29 +03:00

77 lines
2.8 KiB
PHP

<?php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../../connect.php'; // Includes db connection
$zone_name = filterRequest('zone_name');
$latitude = filterRequest('latitude');
$longitude = filterRequest('longitude');
$radius_meters = filterRequest('radius_meters');
$country_code = filterRequest('country_code');
$priority = filterRequest('priority') ?? 1;
if (empty($zone_name) || empty($latitude) || empty($longitude) || empty($radius_meters) || empty($country_code)) {
echo json_encode(["status" => "error", "message" => "Missing required fields"]);
exit;
}
try {
// 1. Check for overlapping zones
// Using Haversine formula directly in SQL to find any zone where distance < (new_radius + existing_radius)
$sql = "
SELECT id, zone_name, radius_meters,
(
6371000 * acos(
cos(radians(:new_lat)) * cos(radians(latitude)) *
cos(radians(longitude) - radians(:new_lng)) +
sin(radians(:new_lat)) * sin(radians(latitude))
)
) AS distance_meters
FROM geofence_zones
WHERE is_active = 1 AND country_code = :country_code
HAVING distance_meters < (radius_meters + :new_radius)
LIMIT 1
";
$stmt = $con->prepare($sql);
$stmt->bindValue(':new_lat', (float) $latitude);
$stmt->bindValue(':new_lng', (float) $longitude);
$stmt->bindValue(':new_radius', (int) $radius_meters, PDO::PARAM_INT);
$stmt->bindValue(':country_code', $country_code);
$stmt->execute();
$overlapping_zone = $stmt->fetch(PDO::FETCH_ASSOC);
if ($overlapping_zone) {
echo json_encode([
"status" => "error",
"message" => "Zone overlaps with existing zone: " . $overlapping_zone['zone_name'],
"overlap_details" => $overlapping_zone
]);
exit;
}
// 2. Insert new zone
$insert_sql = "INSERT INTO geofence_zones (zone_name, latitude, longitude, radius_meters, priority, country_code)
VALUES (:zone_name, :lat, :lng, :radius, :priority, :country)";
$insert_stmt = $con->prepare($insert_sql);
$insert_stmt->bindValue(':zone_name', $zone_name);
$insert_stmt->bindValue(':lat', (float) $latitude);
$insert_stmt->bindValue(':lng', (float) $longitude);
$insert_stmt->bindValue(':radius', (int) $radius_meters, PDO::PARAM_INT);
$insert_stmt->bindValue(':priority', (int) $priority, PDO::PARAM_INT);
$insert_stmt->bindValue(':country', $country_code);
$insert_stmt->execute();
echo json_encode([
"status" => "success",
"message" => "Geofence zone added successfully",
"zone_id" => $con->lastInsertId()
]);
} catch (Exception $e) {
error_log("Error adding geofence zone: " . $e->getMessage());
echo json_encode(["status" => "error", "message" => "Server error"]);
}
?>