setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); return $pdo; } function initDB() { $pdo = getDB(); // Create Issues Table $pdo->exec("CREATE TABLE IF NOT EXISTS issues ( id INTEGER PRIMARY KEY AUTOINCREMENT, tracking_code TEXT UNIQUE NOT NULL, title TEXT NOT NULL, category TEXT NOT NULL, description TEXT NOT NULL, address TEXT NOT NULL, district INTEGER NOT NULL, priority TEXT NOT NULL, status TEXT NOT NULL, lat REAL NOT NULL, lng REAL NOT NULL, image_url TEXT, resolved_image_url TEXT, reporter_name TEXT, reporter_phone TEXT, official_response TEXT, upvotes INTEGER DEFAULT 0, created_at TEXT NOT NULL, resolved_at TEXT )"); // Create Comments Table $pdo->exec("CREATE TABLE IF NOT EXISTS comments ( id INTEGER PRIMARY KEY AUTOINCREMENT, issue_id INTEGER NOT NULL, author_name TEXT NOT NULL, content TEXT NOT NULL, created_at TEXT NOT NULL, FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE )"); // Create Timeline Table $pdo->exec("CREATE TABLE IF NOT EXISTS timeline ( id INTEGER PRIMARY KEY AUTOINCREMENT, issue_id INTEGER NOT NULL, status TEXT NOT NULL, title TEXT NOT NULL, description TEXT, created_at TEXT NOT NULL, FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE )"); // Check count and seed if empty $stmt = $pdo->query("SELECT COUNT(*) FROM issues"); $count = (int)$stmt->fetchColumn(); if ($count === 0) { seedInitialData($pdo); } } function seedInitialData(PDO $pdo) { $now = new DateTime(); $sampleIssues = [ [ 'tracking_code' => 'SHR-78214', 'title' => 'فرونشست و چاله عمیق در لاین کندرو', 'category' => 'آسفالت و معابر', 'description' => 'وجود چاله عمیق با قطر حدود ۱ متر پس از بارندگی اخیر که باعث خسارت به لاستیک خودروها و ترمزهای ناگهانی خطرناک می‌شود.', 'address' => 'بزرگراه شهید همت، نرسیده به خروجی گاندی، لاین کندرو', 'district' => 3, 'priority' => 'emergency', 'status' => 'in_progress', 'lat' => 35.7538, 'lng' => 51.4172, 'image_url' => 'https://images.unsplash.com/photo-1515162816999-a0c47dc192f7?auto=format&fit=crop&w=800&q=80', 'resolved_image_url' => null, 'reporter_name' => 'علی رضایی', 'reporter_phone' => '09121112233', 'official_response' => 'اکیپ آسفالت‌ریزی ناحیه ۲ شهرداری منطقه ۳ اعزام گردیده و عملیات زیرسازی و لکه‌گیری در حال انجام است.', 'upvotes' => 42, 'days_ago' => 2, 'resolved_at' => null, 'timeline' => [ ['pending', 'ثبت گزارش توسط شهروند', 'گزارش در سامانه ۱۳۷ با موفقیت ثبت شد.'], ['reviewing', 'تایید کارشناس و ارجاع به معاونت فنی و عمران', 'موضوع به ناحیه ۲ ارجاع داده شد.'], ['in_progress', 'اعزام اکیپ عملیاتی لکه‌گیری', 'تیم فنی با تجهیزات در محل مستقر شد.'] ], 'comments' => [ ['سارا محمدی', 'دیروز لاستیک ماشین من هم اینجا آسیب دید، ممنون که پیگیری می‌کنید.'], ['حسین کاظمی', 'امیدوارم امشب تا قبل از ترافیک صبحگاهی تموم بشه.'] ] ], [ 'tracking_code' => 'SHR-65109', 'title' => 'خاموشی کامل پایه چراغ‌های روشنایی بوستان', 'category' => 'روشنایی و برق', 'description' => 'کل مسیر پیاده‌روی شرقی بوستان ملت در تاریکی مطلق است که باعث کاهش امنیت خانواده‌ها و ورزشکاران شبانه شده است.', 'address' => 'خیابان ولیعصر، بوستان ملت، ضلع شرقی جنب دریاچه', 'district' => 3, 'priority' => 'high', 'status' => 'resolved', 'lat' => 35.7801, 'lng' => 51.4116, 'image_url' => 'https://images.unsplash.com/photo-1509114397022-ed747cca3f65?auto=format&fit=crop&w=800&q=80', 'resolved_image_url' => 'https://images.unsplash.com/photo-1517457373958-b7bdd4587205?auto=format&fit=crop&w=800&q=80', 'reporter_name' => 'مریم احمدی', 'reporter_phone' => '09123334455', 'official_response' => 'کابل‌کشی زیرزمینی و تعویض پروژکتورهای معیوب توسط اداره زیباسازی و تاسیسات منطقه انجام و روشنایی کامل برقرار گردید.', 'upvotes' => 68, 'days_ago' => 5, 'resolved_at' => (clone $now)->modify('-1 day')->format('Y-m-d H:i'), 'timeline' => [ ['pending', 'ثبت گزارش توسط شهروند', 'گزارش دریافت شد.'], ['reviewing', 'بررسی میدانی اداره تاسیسات', 'نقص کابل اصلی تایید شد.'], ['in_progress', 'تعمیرات و تعویض کابل', 'تیم تاسیسات در حال اجرای خط جدید.'], ['resolved', 'تکمیل و رفع نقص روشنایی', 'چراغ‌ها روشن و مدار به طور کامل تست شد.'] ], 'comments' => [ ['امیر رستمی', 'خیلی سریع درستش کردن، واقعا تشکر از عوامل شهرداری.'], ['نگار توکلی', 'دیشب رفتم پارک، همه چراغ‌ها درست شده بود.'] ] ], [ 'tracking_code' => 'SHR-91203', 'title' => 'انباشت پسماند و سرریز مخزن زباله شهری', 'category' => 'نظافت و پسماند', 'description' => 'مخزن مکانیزه زباله شکسته شده و زباله‌ها در پیاده‌رو پخش شده که باعث بوی نامطبوع و تجمع حشرات شده است.', 'address' => 'خیابان آزادی، تقاطع خیابان استاد معین، پلاک ۴۲', 'district' => 9, 'priority' => 'medium', 'status' => 'pending', 'lat' => 35.6997, 'lng' => 51.3486, 'image_url' => 'https://images.unsplash.com/photo-1532996122724-e3c354a0b15b?auto=format&fit=crop&w=800&q=80', 'resolved_image_url' => null, 'reporter_name' => 'سعید کریمی', 'reporter_phone' => '09355556677', 'official_response' => 'گزارش در نوبت بررسی ناظر پسماند منطقه قرار گرفته است.', 'upvotes' => 19, 'days_ago' => 1, 'resolved_at' => null, 'timeline' => [ ['pending', 'ثبت گزارش در سامانه', 'منتظر بازرسی و تخصیص سطل جدید مکانیزه.'] ], 'comments' => [ ['مهدی بهرامی', 'لطفا سطل‌های پدال‌دار بگذارید که درش بسته بمونه.'] ] ], [ 'tracking_code' => 'SHR-44390', 'title' => 'آسیب دیدگی و شکستن شاخه‌های درخت کهنسال بر اثر طوفان', 'category' => 'فضای سبز و بوستان‌ها', 'description' => 'شاخه‌های سنگین درخت چنار شکسته و روی سیم‌های برق و پیاده‌رو معلق مانده است، احتمال سقوط روی عابرین وجود دارد.', 'address' => 'خیابان شریعتی، بالاتر از پل رومی، نبش کوچه یاس', 'district' => 1, 'priority' => 'emergency', 'status' => 'in_progress', 'lat' => 35.7985, 'lng' => 51.4332, 'image_url' => 'https://images.unsplash.com/photo-1542601906990-b4d3fb778b09?auto=format&fit=crop&w=800&q=80', 'resolved_image_url' => null, 'reporter_name' => 'پویا سرمدی', 'reporter_phone' => '09124445566', 'official_response' => 'اکیپ سازمان بوستان‌ها و آتش‌نشانی با جرثقیل در حال هرس ایمن و رفع خطر هستند.', 'upvotes' => 54, 'days_ago' => 1, 'resolved_at' => null, 'timeline' => [ ['pending', 'ثبت فوری گزارش خطر', 'هشدار سقوط شاخه دریافت شد.'], ['reviewing', 'هماهنگی با سازمان آتش‌نشانی و فضای سبز', 'اعلام وضعیت اضطراری.'], ['in_progress', 'عملیات رفع خطر و هرس', 'حصارکشی پیاده‌رو و استقرار بالابر.'] ], 'comments' => [ ['رویا صبوری', 'خدا رو شکر سریع اومدن نوار خطر کشیدن.'] ] ], [ 'tracking_code' => 'SHR-33219', 'title' => 'سد معبر طولانی مصالح ساختمانی و تخریب پیاده‌رو', 'category' => 'ساختمان‌سازی و سد معبر', 'description' => 'یک پروژه ساختمانی بیش از سه هفته است که تمام پیاده‌رو و بخشی از خیابان را با نخاله و داربست بدون راه عبور ایمن مسدود کرده است.', 'address' => 'سعادت‌آباد، میدان کاج، خیابان مروارید، پلاک ۱۸', 'district' => 2, 'priority' => 'high', 'status' => 'reviewing', 'lat' => 35.7794, 'lng' => 51.3758, 'image_url' => 'https://images.unsplash.com/photo-1541888946425-d0fbb18086f6?auto=format&fit=crop&w=800&q=80', 'resolved_image_url' => null, 'reporter_name' => 'فرشید نادری', 'reporter_phone' => '09127778899', 'official_response' => 'اخطاریه ماده ۱۰۰ و رفع سد معبر برای مالک صادر شد. مهلت رفع ۴۸ ساعت می‌باشد.', 'upvotes' => 37, 'days_ago' => 3, 'resolved_at' => null, 'timeline' => [ ['pending', 'ثبت گزارش تخلف ساختمانی', 'ثبت شد.'], ['reviewing', 'بازدید مامور اجرای احکام شهرداری', 'صدور اخطاریه رسمی رفع انسداد معبر.'] ], 'comments' => [ ['کامران شمس', 'مادر من با ویلچر مجبور شد بره توی خیابان که خیلی خطرناک بود!'] ] ], [ 'tracking_code' => 'SHR-55821', 'title' => 'خرابی و چشمک‌زن ماندن چراغ راهنمایی تقاطع پرتردد', 'category' => 'ترافیک و حمل‌ونقل', 'description' => 'چراغ راهنمایی تقاطع به مدت دو روز چشمک‌زن زرد مانده که باعث گره کور ترافیکی و تصادفات مکرر شده است.', 'address' => 'میدان فاطمی (جهاد)، تقاطع خیابان جویبار و شهید گمنام', 'district' => 6, 'priority' => 'high', 'status' => 'resolved', 'lat' => 35.7208, 'lng' => 51.4082, 'image_url' => 'https://images.unsplash.com/photo-1517649763962-0c623266ddc0?auto=format&fit=crop&w=800&q=80', 'resolved_image_url' => 'https://images.unsplash.com/photo-1508873696983-2df5703bc275?auto=format&fit=crop&w=800&q=80', 'reporter_name' => 'ندا زمانی', 'reporter_phone' => '09191113355', 'official_response' => 'برد الکترونیکی کنترلر چراغ توسط شرکت کنترل ترافیک تهران تعویض و زمان‌بندی هوشمند مجدداً فعال گردید.', 'upvotes' => 85, 'days_ago' => 4, 'resolved_at' => (clone $now)->modify('-2 days')->format('Y-m-d H:i'), 'timeline' => [ ['pending', 'ثبت گزارش خرابی علائم ترافیکی', 'گزارش دریافت گردید.'], ['reviewing', 'ارجاع به شرکت کنترل ترافیک', 'تایید خرابی سخت‌افزاری کنترلر.'], ['in_progress', 'تعویض برد فرمان و سنسورها', 'عملیات فنی در محل انجام شد.'], ['resolved', 'راه‌اندازی و اتصال به مرکز کنترل', 'چراغ طبق برنامه زمان‌بندی هوشمند شروع به کار کرد.'] ], 'comments' => [ ['سامان یوسفی', 'دست مریزاد، امروز صبح ترافیک خیلی روان‌تر بود.'] ] ] ]; $insertIssue = $pdo->prepare("INSERT INTO issues ( tracking_code, title, category, description, address, district, priority, status, lat, lng, image_url, resolved_image_url, reporter_name, reporter_phone, official_response, upvotes, created_at, resolved_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); $insertTimeline = $pdo->prepare("INSERT INTO timeline (issue_id, status, title, description, created_at) VALUES (?, ?, ?, ?, ?)"); $insertComment = $pdo->prepare("INSERT INTO comments (issue_id, author_name, content, created_at) VALUES (?, ?, ?, ?)"); foreach ($sampleIssues as $item) { $createdTime = (clone $now)->modify("-{$item['days_ago']} days")->format('Y-m-d H:i'); $insertIssue->execute([ $item['tracking_code'], $item['title'], $item['category'], $item['description'], $item['address'], $item['district'], $item['priority'], $item['status'], $item['lat'], $item['lng'], $item['image_url'], $item['resolved_image_url'], $item['reporter_name'], $item['reporter_phone'], $item['official_response'], $item['upvotes'], $createdTime, $item['resolved_at'] ]); $issueId = $pdo->lastInsertId(); foreach ($item['timeline'] as $tl) { $insertTimeline->execute([$issueId, $tl[0], $tl[1], $tl[2], $createdTime]); } foreach ($item['comments'] as $cm) { $insertComment->execute([$issueId, $cm[0], $cm[1], $createdTime]); } } }