From d27520ec0fb12c57d775eb7513ad9f75405ceb5e Mon Sep 17 00:00:00 2001 From: Antigravity Bot Date: Sun, 30 Aug 2026 14:13:11 +0330 Subject: [PATCH] feat: enhance admin control panel with KPI charts, inline inventory editing, lead CRM and settings --- admin/index.php | 842 +++++++++++++++++++++++++++++++++++------------- api.php | 6 + includes/db.php | 40 +++ 3 files changed, 670 insertions(+), 218 deletions(-) diff --git a/admin/index.php b/admin/index.php index 8ebf26a..38c716d 100644 --- a/admin/index.php +++ b/admin/index.php @@ -1,25 +1,44 @@ 0) { + TireStore::updateTire($id, [ + "price" => $price, + "stock" => $stock, + "discount_percent" => $discount + ]); + $message = "مشخصات تایر {$id} با موفقیت به‌روزرسانی شد."; + } + } + if ($action === 'delete_tire') { $delId = $_POST['tire_id'] ?? ''; if ($delId) { @@ -72,257 +107,628 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $message = "تایر با شناسه {$delId} حذف گردید."; } } + + if ($action === 'update_consultation') { + $cId = $_POST['consultation_id'] ?? ''; + $cStatus = $_POST['status'] ?? 'جدید'; + $cNote = trim($_POST['admin_note'] ?? ''); + if ($cId) { + TireStore::updateConsultationStatus($cId, $cStatus, $cNote); + $message = "وضعیت استعلام {$cId} به‌روز شد."; + } + } + + if ($action === 'delete_consultation') { + $cId = $_POST['consultation_id'] ?? ''; + if ($cId) { + TireStore::deleteConsultation($cId); + $message = "درخواست مشاوره حذف گردید."; + } + } + + if ($action === 'update_settings') { + $sitePhone = trim($_POST['site_phone'] ?? ''); + $emergencyPhone = trim($_POST['emergency_phone'] ?? ''); + $announcement = trim($_POST['announcement'] ?? ''); + $centralAddress = trim($_POST['central_address'] ?? ''); + + TireStore::updateSettings([ + "site_phone" => $sitePhone, + "emergency_phone" => $emergencyPhone, + "announcement" => $announcement, + "central_address" => $centralAddress + ]); + $message = "تنظیمات و اطلاعات تماس فروشگاه ذخیره گردید."; + } } $tires = TireStore::getTires(); $consultations = TireStore::getConsultations(); +$settings = TireStore::getSettings(); + +// Inventory calculations +$totalStockCount = array_sum(array_column($tires, 'stock')); +$totalInventoryValue = 0; +foreach ($tires as $t) { + $totalInventoryValue += ($t['price'] * $t['stock']); +} + +// Brand distribution +$brandCounts = []; +foreach ($tires as $t) { + $b = $t['brand']; + $brandCounts[$b] = ($brandCounts[$b] ?? 0) + $t['stock']; +} ?> - پنل مدیریت و انبارداری | تایر قاسمی - + پنل مدیریت هوشمند و انبارداری | تایر قاسمی + - + - -
-
-
-
- + + +
+
+
+
-

داشبورد مدیریت تایر قاسمی

-

انبارداری، استعلام‌ها و کاتالوگ محصولات

+

ورود به پنل مدیریت تایر قاسمی

+

جهت دسترسی به انبار، قیمت‌ها و استعلام‌ها رمز عبور را وارد کنید.

-
- -
-
-
- - -
- -
- + +
+ +
+ - -
- -
- +
+
+ + + رمز پیش‌فرض سیستم: admin123 +
- -
-
- تنوع کل تایرها در انبار -
مدل
-
+ + -
- مجموع موجودی حلقه‌ها -
حلقه
-
- -
- درخواست‌های مشاوره و استعلام -
مورد
-
- -
- وضعیت سرور و اتصال گیت -
+ - -
-

- - افزودن تایر جدید به انبار و کاتالوگ -

+ +
+ + +
+
+
+
+ +
+
+
+

سامانه مدیریت تایر قاسمی

+ ادمین فعال +
+

انبارداری، استعلام‌ها، قیمت‌گذاری و تنظیمات

+
+
-
- + -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- + + +
-
+
+ +
+ + +
+ +
+ + + +
+ +
+ + + +
+ + +
+ +
+
+ تنوع مدل‌های تایر +
+ +
+
+
مدل فعال
+
+ ۱۰۰٪ کاتالوگ آنلاین +
+
+ +
+
+ کل موجودی انبار +
+ +
+
+
حلقه
+
میانگین حلقه به ازای هر مدل
+
+ +
+
+ ارزش کل موجودی انبار +
+ +
+
+
میلیون تومان
+
تومان
+
+ +
+
+ درخواست‌های مشاوره +
+ +
+
+
لید دریافتی
+
نیازمند پیگیری تلفنی
+
+ +
+ + +
+ + +
+

+ + سهم موجودی انبار بر اساس برند +

+ +
+ $bCount): + $pct = $totalStockCount > 0 ? round(($bCount / $totalStockCount) * 100) : 0; + ?> +
+
+ + حلقه (%) +
+
+
+
+
+ +
+
+ + +
+
+

+ + آخرین استعلام‌ها جهت پیگیری +

+ +
+ +
+ +
+
+
()
+
+
+ + تماس + +
+ +
+
+ +
+ +
+ + + + + + + + + + +
+ + +
+ سامانه مدیریت یکپارچه تایر قاسمی • نسخه ۲.۰ • سرور پایدار PHP 8 +
+
- -
-

- - مدیریت موجودی و قیمت تایرها -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
کدنام و مدل تایربرندسایزقیمت مصوبموجودیگارانتیعملیات
تومان حلقه ماه -
- - - -
-
-
-
- - -
-

- - درخواست‌های استعلام قیمت و مشاوره کاربران -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
کدنام مشتریشماره تماسخودرومتن پیامتاریخ ثبتوضعیت
-
-
- -
+ diff --git a/api.php b/api.php index 3a37ad9..147a6a7 100644 --- a/api.php +++ b/api.php @@ -60,6 +60,12 @@ switch ($action) { echo json_encode(["status" => "success", "message" => "درخواست مشاوره شما با موفقیت ثبت شد. کارشناسان ما به زودی با شما تماس خواهند گرفت.", "data" => $res], JSON_UNESCAPED_UNICODE); break; + case 'export_backup': + $data = TireStore::getData(); + header('Content-Disposition: attachment; filename="gasemi_tier_backup_' . date('Y-m-d_H-i') . '.json"'); + echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + exit; + default: echo json_encode(["status" => "error", "message" => "Invalid action"], JSON_UNESCAPED_UNICODE); break; diff --git a/includes/db.php b/includes/db.php index cfd516d..0e055ba 100644 --- a/includes/db.php +++ b/includes/db.php @@ -55,11 +55,35 @@ class TireStore { $entry['id'] = 'CNS-' . (count($data['consultations'] ?? []) + 101); $entry['created_at'] = date('Y-m-d H:i'); $entry['status'] = 'جدید'; + $entry['admin_note'] = ''; $data['consultations'][] = $entry; self::saveData($data); return $entry; } + public static function updateConsultationStatus($id, $status, $note = '') { + $data = self::getData(); + foreach ($data['consultations'] as &$c) { + if ($c['id'] === $id) { + $c['status'] = $status; + if ($note !== '') { + $c['admin_note'] = $note; + } + self::saveData($data); + return true; + } + } + return false; + } + + public static function deleteConsultation($id) { + $data = self::getData(); + $data['consultations'] = array_values(array_filter($data['consultations'], function($c) use ($id) { + return $c['id'] !== $id; + })); + return self::saveData($data); + } + public static function addTire($tire) { $data = self::getData(); $data['tires'][] = $tire; @@ -86,4 +110,20 @@ class TireStore { })); return self::saveData($data); } + + public static function getSettings() { + $data = self::getData(); + return $data['settings'] ?? [ + "site_phone" => "021-88889900", + "emergency_phone" => "09123456789", + "announcement" => "تضمین اصالت کالا و گارانتی معتبر شرکتی تا ۶۰ ماه | تاریخ تولید روز (2026)", + "central_address" => "تهران، خیابان آزادی، تقاطع یادگار امام، مجتمع تایر قاسمی" + ]; + } + + public static function updateSettings($settings) { + $data = self::getData(); + $data['settings'] = array_merge($data['settings'] ?? [], $settings); + return self::saveData($data); + } }