From 239736aefd70c3d7dd4e6e662a4b894cb468b258 Mon Sep 17 00:00:00 2001 From: adonis Date: Wed, 8 Jul 2026 17:13:04 +0330 Subject: [PATCH] fixed some bugs 2 --- .../Controllers/Admin/ProductController.php | 10 ++ ...00001_ensure_products_baseline_columns.php | 95 +++++++++++++++++++ database/sql/DEPLOY_CHECKLIST.md | 4 +- database/sql/baseline_migrations.sql | 4 + .../fix_missing_total_referrals_column.sql | 8 +- 5 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 database/migrations/2026_07_08_000001_ensure_products_baseline_columns.php diff --git a/app/Http/Controllers/Admin/ProductController.php b/app/Http/Controllers/Admin/ProductController.php index 5d1beea..4f26caa 100644 --- a/app/Http/Controllers/Admin/ProductController.php +++ b/app/Http/Controllers/Admin/ProductController.php @@ -610,6 +610,16 @@ class ProductController extends SuperController } if (!Product::hasOrderLimitColumns()) { + $requestedLimit = filter_var($data['order_limit_enabled'] ?? false, FILTER_VALIDATE_BOOLEAN) + || $this->normalizeOrderLimitCash($data['min_order_cash'] ?? null) !== null + || $this->normalizeOrderLimitCash($data['max_order_cash'] ?? null) !== null; + + if ($requestedLimit) { + throw new UnprocessableEntityHttpException( + 'ستون‌های محدودیت مبلغ سفارش در دیتابیس وجود ندارد. مایگریشن را اجرا کنید: php artisan migrate — یا اسکریپت database/sql/add_product_order_limit_columns.sql' + ); + } + unset($data['order_limit_enabled'], $data['min_order_cash'], $data['max_order_cash']); } else { $min = $this->normalizeOrderLimitCash($data['min_order_cash'] ?? null); diff --git a/database/migrations/2026_07_08_000001_ensure_products_baseline_columns.php b/database/migrations/2026_07_08_000001_ensure_products_baseline_columns.php new file mode 100644 index 0000000..0406be3 --- /dev/null +++ b/database/migrations/2026_07_08_000001_ensure_products_baseline_columns.php @@ -0,0 +1,95 @@ +addProductColumnIfMissing( + 'price_offset_percent', + 'DECIMAL(8,2) NOT NULL DEFAULT 0', + 'price_profit' + ); + + $this->addProductColumnIfMissing( + 'order_limit_enabled', + 'TINYINT(1) NOT NULL DEFAULT 0', + 'percent_fee_buy' + ); + + $this->addProductColumnIfMissing( + 'min_order_cash', + 'BIGINT UNSIGNED NULL DEFAULT NULL', + 'order_limit_enabled' + ); + + $this->addProductColumnIfMissing( + 'max_order_cash', + 'BIGINT UNSIGNED NULL DEFAULT NULL', + 'min_order_cash' + ); + + $this->addProductColumnIfMissing( + 'show_in_assets', + 'TINYINT(1) NOT NULL DEFAULT 0', + 'show' + ); + + $this->addProductColumnIfMissing( + 'use_last_price_if_zero', + 'TINYINT(1) NOT NULL DEFAULT 0', + 'show_in_assets' + ); + + DB::purge(); + DB::reconnect(); + } + + public function down(): void + { + // عمداً خالی — rollback ستون‌های baseline را حذف نمی‌کند + } + + private function productsTable(): string + { + return DB::getTablePrefix().'products'; + } + + private function productColumnExists(string $column): bool + { + $result = DB::selectOne( + 'SELECT COUNT(*) AS cnt FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME = ?', + [DB::connection()->getDatabaseName(), $this->productsTable(), $column] + ); + + return (int) $result->cnt > 0; + } + + private function addProductColumnIfMissing(string $column, string $definition, ?string $after = null): void + { + if ($this->productColumnExists($column)) { + return; + } + + $table = $this->productsTable(); + $afterClause = ($after !== null && $this->productColumnExists($after)) + ? " AFTER `{$after}`" + : ''; + + DB::statement("ALTER TABLE `{$table}` ADD COLUMN `{$column}` {$definition}{$afterClause}"); + } +}; diff --git a/database/sql/DEPLOY_CHECKLIST.md b/database/sql/DEPLOY_CHECKLIST.md index ba09120..a8cc8d2 100644 --- a/database/sql/DEPLOY_CHECKLIST.md +++ b/database/sql/DEPLOY_CHECKLIST.md @@ -100,7 +100,9 @@ mysql ... < database/sql/deploy_settings_const.sql | `Loading stored database schema` | کد قدیمی — `git pull` (دیگر رخ نمی‌دهد). اگر شد: restore بکاپ | | `2019`/`2021` No بعد از baseline | baseline قدیمی → `fake_package_migrations.sql` | | `Unknown host HOST` | از `.env` بخوان نه placeholder | -| `Unknown column 'is_exist'` | `git pull` + دوباره `deploy_settings_const.sql` (نسخه جدید ستون را اضافه می‌کند) | +| `Unknown column 'total_referrals'` | `git pull` + `php artisan migrate` (ensure_total_referrals) | +| `Unknown column 'order_limit_enabled'` / محدودیت سفارش ذخیره نمی‌شود | `git pull` + `php artisan migrate` (ensure_products_baseline_columns) | +| `Nothing to migrate` ولی ستون نیست | baseline فقط در جدول migrations ثبت کرده — migrationهای `ensure_*` را deploy و `migrate` بزنید | --- diff --git a/database/sql/baseline_migrations.sql b/database/sql/baseline_migrations.sql index fdf6b34..e6d8d48 100644 --- a/database/sql/baseline_migrations.sql +++ b/database/sql/baseline_migrations.sql @@ -1,5 +1,9 @@ -- baseline_migrations.sql — قبل از php artisan migrate روی DB موجود -- USE `نام_دیتابیس`; +-- +-- توجه: این فایل migrationها را «اجرا شده» علامت می‌زند. اگر ALTER واقعی قبلاً نخورده، +-- migrate می‌گوید Nothing to migrate. برای پر کردن شکاف schema از migrationهای ensure_* استفاده کنید +-- (مثلاً 2026_06_25_000001_ensure_total_referrals_* و 2026_07_08_000001_ensure_products_baseline_columns). TRUNCATE TABLE `migrations`; diff --git a/database/sql/fix_missing_total_referrals_column.sql b/database/sql/fix_missing_total_referrals_column.sql index 509e26a..c145f8f 100644 --- a/database/sql/fix_missing_total_referrals_column.sql +++ b/database/sql/fix_missing_total_referrals_column.sql @@ -6,11 +6,13 @@ -- علت: baseline_migrations.sql این migration را در جدول migrations ثبت کرده -- بدون اینکه ALTER TABLE واقعاً اجرا شود. -- --- راه‌حل: این فایل را مستقیم روی MySQL اجرا کنید (migrate کافی نیست). +-- راه‌حل ترجیحی (بدون SQL دستی): +-- git pull +-- php artisan migrate +-- (migration: 2026_06_25_000001_ensure_total_referrals_column_on_customers_table.php) -- +-- فقط اگر migrate در دسترس نیست، این فایل را مستقیم روی MySQL اجرا کنید: -- mysql -u USER -p DATABASE_NAME < database/sql/fix_missing_total_referrals_column.sql --- --- یا از phpMyAdmin / Adminer همین کوئری‌ها را بزنید. START TRANSACTION;