Files
Siro/backend/bot/generate_price_tasks.php
2026-06-21 18:58:13 +03:00

113 lines
3.7 KiB
PHP

<?php
// =========================================================
// backend/bot/generate_price_tasks.php
// Cron Job: Runs every 15 minutes
// Generates random Short & Long trips in Damascus
// =========================================================
// CLI or Web execution
require_once __DIR__ . '/../core/bootstrap.php';
require_once __DIR__ . '/../functions.php';
try {
$con = Database::get('main');
} catch (Exception $e) {
die("Database connection failed\n");
}
// 1. Ensure Table Exists
$sql = "
CREATE TABLE IF NOT EXISTS competitor_prices (
id INT AUTO_INCREMENT PRIMARY KEY,
competitor_name VARCHAR(50) NOT NULL,
from_latitude VARCHAR(30) NOT NULL,
from_longitude VARCHAR(30) NOT NULL,
to_latitude VARCHAR(30) NOT NULL,
to_longitude VARCHAR(30) NOT NULL,
distance_km DECIMAL(8,2) NOT NULL,
total_price DECIMAL(10,2) NOT NULL,
price_per_km DECIMAL(8,2) NOT NULL,
country_code VARCHAR(5) NOT NULL DEFAULT 'SY',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_competitor_country (competitor_name, country_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
";
$con->exec($sql);
// 2. Ten Key Regions in Damascus
$regions = [
['name' => 'Umayyad Square', 'lat' => 33.5138, 'lng' => 36.2765],
['name' => 'Mezzeh', 'lat' => 33.5074, 'lng' => 36.2530],
['name' => 'Malki', 'lat' => 33.5220, 'lng' => 36.2840],
['name' => 'Kafersouseh', 'lat' => 33.4981, 'lng' => 36.2730],
['name' => 'Al-Midan', 'lat' => 33.4947, 'lng' => 36.2995],
['name' => 'Bab Tuma', 'lat' => 33.5126, 'lng' => 36.3150],
['name' => 'Rukneddine', 'lat' => 33.5350, 'lng' => 36.2950],
['name' => 'Dummar', 'lat' => 33.5385, 'lng' => 36.2250],
['name' => 'Baramkeh', 'lat' => 33.5100, 'lng' => 36.2885],
['name' => 'Muhajireen', 'lat' => 33.5320, 'lng' => 36.2720],
];
$competitors = ['yallago', 'zaken', 'tufaddal'];
// Helper to generate a random point within a radius (in km)
function generateRandomPoint($lat, $lng, $radius) {
$radiusInDegrees = $radius / 111.0; // 1 degree is ~111km
$u = lcg_value();
$v = lcg_value();
$w = $radiusInDegrees * sqrt($u);
$t = 2 * pi() * $v;
$x = $w * cos($t);
$y = $w * sin($t);
// Adjust longitude based on latitude
$new_lng = $x / cos(deg2rad($lat));
$new_lat = $y;
return [
'lat' => $lat + $new_lat,
'lng' => $lng + $new_lng
];
}
$tasksCreated = 0;
foreach ($regions as $region) {
// A. Generate Start Point (within 2km of region center)
$start = generateRandomPoint($region['lat'], $region['lng'], 2);
// B. Generate Short Trip (2-5 km from start)
$shortDist = rand(20, 50) / 10.0;
$shortEnd = generateRandomPoint($start['lat'], $start['lng'], $shortDist);
// C. Generate Long Trip (10-15 km from start)
$longDist = rand(100, 150) / 10.0;
$longEnd = generateRandomPoint($start['lat'], $start['lng'], $longDist);
$trips = [$shortEnd, $longEnd];
foreach ($trips as $end) {
foreach ($competitors as $app) {
$taskId = "prc_" . uniqid();
$taskData = [
"task_id" => $taskId,
"type" => "price_check",
"app" => $app,
"payload" => [
"start_lat" => $start['lat'],
"start_lng" => $start['lng'],
"end_lat" => $end['lat'],
"end_lng" => $end['lng']
]
];
// Push to Redis Queue
$redis->lpush('queue:bot:tasks', json_encode($taskData));
$tasksCreated++;
}
}
}
echo "Successfully generated and queued $tasksCreated pricing tasks.\n";