fix some bugs
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if (! DB::table('settings')->where('key', 'permision__enabled')->exists()) {
|
||||
DB::table('settings')->insert([
|
||||
'key' => 'permision__enabled',
|
||||
'value' => 'false',
|
||||
'title_fa' => 'نمایش منوی مجوزها',
|
||||
'type' => 'switch',
|
||||
'can_edit' => 0,
|
||||
'is_active' => 1,
|
||||
'description' => 'روشن: آیتم «مجوز ها» در منوی تنظیمات اپ خانگی (تم جدید) نمایش داده میشود. خاموش: مخفی است.',
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
DB::table('settings')->where('key', 'permision__enabled')->delete();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
/**
|
||||
* پکیج قدیمی wallet فقط fund_id دارد؛ ماژول جدید product_id (و چند ستون دیگر) میخواهد.
|
||||
* روی DB قدیمی بدون DROP/TRUNCATE — فقط ADD اگر ستون نباشد.
|
||||
* کیفهای موجود → product_id=NULL (= کیف اصلی) — رفتار قدیم حفظ میشود.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if (Schema::hasTable('wallets')) {
|
||||
$this->addColumnIfMissing('wallets', 'product_id', 'INT NULL DEFAULT NULL', 'fund_id');
|
||||
$this->addColumnIfMissing('wallets', 'number', 'INT NOT NULL DEFAULT 0', 'product_id');
|
||||
}
|
||||
|
||||
if (Schema::hasTable('transactions')) {
|
||||
$this->addColumnIfMissing('transactions', 'product_id', 'INT NULL DEFAULT NULL', 'type');
|
||||
$this->addColumnIfMissing('transactions', 'order_id', 'INT NULL DEFAULT NULL', 'customer_id');
|
||||
$this->addColumnIfMissing('transactions', 'title', 'VARCHAR(255) NULL DEFAULT NULL', null);
|
||||
$this->addColumnIfMissing('transactions', 'unit', 'VARCHAR(255) NULL DEFAULT NULL', 'title');
|
||||
$this->addColumnIfMissing('transactions', 'balance_cash', 'BIGINT NULL DEFAULT NULL', 'gold');
|
||||
$this->addColumnIfMissing('transactions', 'balance_gold', 'INT NULL DEFAULT NULL', 'balance_cash');
|
||||
$this->addColumnIfMissing('transactions', 'withdraw_id', 'INT UNSIGNED NULL DEFAULT NULL', 'balance_gold');
|
||||
$this->addColumnIfMissing('transactions', 'active', 'TINYINT(1) NULL DEFAULT NULL', 'withdraw_id');
|
||||
$this->addColumnIfMissing('transactions', 'number', 'INT NULL DEFAULT NULL', 'active');
|
||||
}
|
||||
|
||||
DB::purge();
|
||||
DB::reconnect();
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
// عمداً خالی — rollback ستونهای سازگاری را حذف نمیکند
|
||||
}
|
||||
|
||||
private function physicalTable(string $logical): string
|
||||
{
|
||||
return DB::getTablePrefix().$logical;
|
||||
}
|
||||
|
||||
private function columnExists(string $table, 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->physicalTable($table), $column]
|
||||
);
|
||||
|
||||
return (int) $result->cnt > 0;
|
||||
}
|
||||
|
||||
private function addColumnIfMissing(
|
||||
string $table,
|
||||
string $column,
|
||||
string $definition,
|
||||
?string $after = null
|
||||
): void {
|
||||
if ($this->columnExists($table, $column)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$physical = $this->physicalTable($table);
|
||||
$afterClause = ($after !== null && $this->columnExists($table, $after))
|
||||
? " AFTER `{$after}`"
|
||||
: '';
|
||||
|
||||
DB::statement("ALTER TABLE `{$physical}` ADD COLUMN `{$column}` {$definition}{$afterClause}");
|
||||
}
|
||||
};
|
||||
@@ -102,6 +102,8 @@ mysql ... < database/sql/deploy_settings_const.sql
|
||||
| `Unknown host HOST` | از `.env` بخوان نه placeholder |
|
||||
| `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) |
|
||||
| `Unknown column 'product_id'` روی `wallets` / `/customer/me` | `mysql ... < database/sql/gholaktala_upgrade.sql` سپس merge settings |
|
||||
| upgrade کامل قلک طلا | `bash database/sql/run_gholaktala_upgrade.sh` |
|
||||
| `Nothing to migrate` ولی ستون نیست | baseline فقط در جدول migrations ثبت کرده — migrationهای `ensure_*` را deploy و `migrate` بزنید |
|
||||
|
||||
---
|
||||
@@ -113,5 +115,31 @@ mysql ... < database/sql/deploy_settings_const.sql
|
||||
| `baseline_migrations.sql` | ۱۱ migration یکجا |
|
||||
| `fake_package_migrations.sql` | فقط 2019 + 2021 |
|
||||
| `deploy_settings_const.sql` | settings + const |
|
||||
| `ensure_wallet_module_columns.sql` | `wallets.product_id` + ستونهای transactions برای DB قدیمی |
|
||||
| `deploy_safe_schema.sql` | ALTERهای idempotent (شامل wallets.product_id) |
|
||||
| `fix_migrations_after_failed_migrate.sql` | reset کامل migrations |
|
||||
| `run_deploy_existing_db.sh` | اجرای خودکار + چک |
|
||||
|
||||
---
|
||||
|
||||
## فوری — gholaktala /customer/me شکسته
|
||||
|
||||
```bash
|
||||
cd /opt/gholak/server # یا مسیر واقعی پروژه
|
||||
|
||||
# بکاپ
|
||||
mysqldump -h ... -u ... -p DB_NAME > /tmp/gholak_before_wallet_cols.sql
|
||||
|
||||
# فقط ستونهای گمشده (داده موجود دست نخورده؛ product_id=NULL = کیف اصلی قدیم)
|
||||
mysql -h ... -u ... -p DB_NAME < database/sql/ensure_wallet_module_columns.sql
|
||||
|
||||
php artisan migrate # ثبت مایگریشن ensure_wallet_module_columns
|
||||
php artisan config:clear
|
||||
```
|
||||
|
||||
چک:
|
||||
|
||||
```sql
|
||||
SHOW COLUMNS FROM wallets LIKE 'product_id';
|
||||
-- باید یک ردیف برگردد
|
||||
```
|
||||
|
||||
@@ -425,11 +425,86 @@ PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- wallets / transactions — ستونهای ماژول جدید روی پکیج قدیمی wallet
|
||||
-- (خطای /customer/me: Unknown column 'product_id' ... from `wallets`)
|
||||
-- جزئیات کامل: ensure_wallet_module_columns.sql
|
||||
-- ---------------------------------------------------------------------------
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'product_id') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'fund_id') > 0,
|
||||
'ALTER TABLE `wallets` ADD COLUMN `product_id` INT NULL DEFAULT NULL AFTER `fund_id`',
|
||||
'ALTER TABLE `wallets` ADD COLUMN `product_id` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip wallets.product_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'number') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'product_id') > 0,
|
||||
'ALTER TABLE `wallets` ADD COLUMN `number` INT NOT NULL DEFAULT 0 AFTER `product_id`',
|
||||
'ALTER TABLE `wallets` ADD COLUMN `number` INT NOT NULL DEFAULT 0'
|
||||
),
|
||||
'SELECT ''skip wallets.number'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'product_id') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'type') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `product_id` INT NULL DEFAULT NULL AFTER `type`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `product_id` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.product_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'order_id') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'customer_id') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `order_id` INT NULL DEFAULT NULL AFTER `customer_id`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `order_id` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.order_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- پایان — برای بورسمس (اختیاری، جدا اجرا کنید):
|
||||
-- UPDATE `settings` SET `value` = 'کیلوگرم' WHERE `key` = 'unit';
|
||||
--
|
||||
-- بذر طلا — merge settings + const (modular + legacy):
|
||||
-- SOURCE bazre_tala_settings_update.sql;
|
||||
--
|
||||
-- wallet کاملتر (title/unit/balance/...): SOURCE ensure_wallet_module_columns.sql;
|
||||
-- ---------------------------------------------------------------------------
|
||||
SELECT 'deploy_safe_schema.sql finished' AS status;
|
||||
|
||||
@@ -817,7 +817,7 @@ UPDATE `settings` SET `type` = 'switch' WHERE `key` IN (
|
||||
'payping_fin_sync_enabled', 'external_order_api_enabled', 'is_store', 'wss_enabled', 'tracking_systems_enabled',
|
||||
'register_referral_sms_to_referrer', 'register_referral_bonus_message',
|
||||
'referral_gift_on_first_order',
|
||||
'banner_enabled'
|
||||
'banner_enabled', 'permision__enabled'
|
||||
);
|
||||
|
||||
-- price (مبالغ ریالی)
|
||||
@@ -924,6 +924,11 @@ SELECT 'banner_enabled', 'true', 'نمایش بنرها', 0, 1,
|
||||
'روشن: اسلایدر بنر صفحه اصلی در اپ کاربر نمایش داده میشود. خاموش: بنرها مخفی میمانند (محتوای بنر از پنل «بنرها» مدیریت میشود).', 'switch'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'banner_enabled' LIMIT 1);
|
||||
|
||||
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||
SELECT 'permision__enabled', 'false', 'نمایش منوی مجوزها', 0, 1,
|
||||
'روشن: آیتم «مجوز ها» در منوی تنظیمات اپ خانگی (تم جدید) نمایش داده میشود. خاموش: مخفی است.', 'switch'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'permision__enabled' LIMIT 1);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- const — کلیدهای اضافی
|
||||
-- ---------------------------------------------------------------------------
|
||||
@@ -1186,6 +1191,7 @@ UPDATE `settings` SET `description` = 'پاسخ JSON آخرین سفارش ار
|
||||
UPDATE `settings` SET `description` = 'لاگ JSON آخرین محصول دریافتشده از API همکار. توسط سیستم پر میشود.' WHERE `key` = 'montzar_last_product_log';
|
||||
UPDATE `settings` SET `description` = 'آدرس کامل فایل APK اندروید (https). اگر خالی باشد لینک دانلود در اپ نمایش داده نمیشود.' WHERE `key` = 'apk_download_link';
|
||||
UPDATE `settings` SET `description` = 'روشن: اسلایدر بنر صفحه اصلی در اپ کاربر نمایش داده میشود. خاموش: بنرها مخفی میمانند (محتوای بنر از پنل «بنرها» مدیریت میشود).' WHERE `key` = 'banner_enabled';
|
||||
UPDATE `settings` SET `description` = 'روشن: آیتم «مجوز ها» در منوی تنظیمات اپ خانگی (تم جدید) نمایش داده میشود. خاموش: مخفی است.' WHERE `key` = 'permision__enabled';
|
||||
|
||||
UPDATE `settings` SET `description` = 'شناسه کلاینت برای API سفارش خارجی (هدر X-Client-Id). باید با مقدار تنظیمشده در سرویس مقصد یکسان باشد.' WHERE `key` = 'node_client_id';
|
||||
UPDATE `settings` SET `description` = 'کلید مشترک امضای HMAC برای احراز درخواستهای API سفارش خارجی. محرمانه نگه دارید.' WHERE `key` = 'node_shared_secret';
|
||||
@@ -1408,6 +1414,7 @@ UPDATE `settings` SET `title_fa` = 'بیشترین قیمت امروز' WHERE `k
|
||||
UPDATE `settings` SET `title_fa` = 'قیمت لحظهای (SSE)' WHERE `key` = 'wss_enabled';
|
||||
UPDATE `settings` SET `title_fa` = 'سامانههای ردیابی' WHERE `key` = 'tracking_systems';
|
||||
UPDATE `settings` SET `title_fa` = 'نمایش سامانههای ردیابی' WHERE `key` = 'tracking_systems_enabled';
|
||||
UPDATE `settings` SET `title_fa` = 'نمایش منوی مجوزها' WHERE `key` = 'permision__enabled';
|
||||
UPDATE `settings` SET `title_fa` = 'آدرس API تابلو Zaarbox' WHERE `key` = 'zaarbox_api_url';
|
||||
UPDATE `settings` SET `title_fa` = 'شناسه ردیف تابلو (key یا UUID)' WHERE `key` = 'zaarbox_price_key';
|
||||
|
||||
@@ -1437,6 +1444,7 @@ UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN (
|
||||
'payping_fin_customer_id', 'payping_fin_sync_enabled', 'payping_fin_token', 'payping_fin_url',
|
||||
'payping_gateway_items', 'payping_gateway_name',
|
||||
'payping_round_toman', 'payping_start_url', 'payping_strict_failed_withdraw', 'payping_verify_url',
|
||||
'permision__enabled',
|
||||
'price_extreme_date', 'price_provider', 'profit_gold_api_enabled',
|
||||
'send_to_tahesab', 'service_charge_percentage',
|
||||
'sse_path',
|
||||
|
||||
@@ -147,7 +147,6 @@ INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `de
|
||||
SELECT 'has_page_earn_money', 'false', 'صفحه کسب درآمد', 1, 1, NULL, 'switch'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'has_page_earn_money' LIMIT 1);
|
||||
|
||||
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||
SELECT 'montzar_order_response', '[]', 'پاسخ سفارش همکار', 0, 1, NULL, 'longtext'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'montzar_order_response' LIMIT 1);
|
||||
@@ -255,6 +254,11 @@ SELECT 'tracking_systems_enabled', 'false', 'نمایش سامانههای ر
|
||||
'روشن: اسکریپتهای tracking_systems در اپ مشتری بارگذاری میشوند؛ خاموش: هیچ ردیابی فعال نیست', 'switch'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'tracking_systems_enabled' LIMIT 1);
|
||||
|
||||
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||
SELECT 'permision__enabled', 'false', 'نمایش منوی مجوزها', 0, 1,
|
||||
'روشن: آیتم «مجوز ها» در منوی تنظیمات اپ خانگی (تم جدید) نمایش داده میشود. خاموش: مخفی است.', 'switch'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'permision__enabled' LIMIT 1);
|
||||
|
||||
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||
SELECT 'montify_name', '', 'نام فروشگاه در درگاه', 1, 1, NULL, 'text'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'montify_name' LIMIT 1);
|
||||
@@ -696,7 +700,8 @@ UPDATE `settings` SET `type` = 'switch' WHERE `key` IN (
|
||||
'montzar_closed', 'montzar_open_buy', 'montzar_open_sell',
|
||||
'payping_fin_sync_enabled', 'external_order_api_enabled', 'is_store', 'wss_enabled', 'tracking_systems_enabled',
|
||||
'register_referral_sms_to_referrer', 'register_referral_bonus_message',
|
||||
'referral_gift_on_first_order'
|
||||
'referral_gift_on_first_order',
|
||||
'permision__enabled'
|
||||
);
|
||||
|
||||
-- price (مبالغ ریالی)
|
||||
@@ -1099,6 +1104,7 @@ UPDATE `settings` SET `description` = 'روشن: اپ به SSE (sse_path) وصل
|
||||
UPDATE `settings` SET `description` = 'مسیر GET لاراول برای استریم قیمت — پیشفرض /api/price/stream' WHERE `key` = 'sse_path';
|
||||
UPDATE `settings` SET `description` = 'JSON لیست سامانههای آنالیتیکس — هر مورد: type (gtag|gtm|clarity|custom)، id، enabled. فقط دیپلوی.' WHERE `key` = 'tracking_systems';
|
||||
UPDATE `settings` SET `description` = 'روشن: اسکریپتهای JSON در tracking_systems در اپ مشتری بارگذاری میشوند؛ خاموش: هیچ سامانه ردیابی فعال نیست.' WHERE `key` = 'tracking_systems_enabled';
|
||||
UPDATE `settings` SET `description` = 'روشن: آیتم «مجوز ها» در منوی تنظیمات اپ خانگی (تم جدید) نمایش داده میشود. خاموش: مخفی است.' WHERE `key` = 'permision__enabled';
|
||||
UPDATE `settings` SET `description` = 'نام فروشگاه که در درگاه پرداخت و رسید بانکی به کاربر نمایش داده میشود.' WHERE `key` = 'montify_name';
|
||||
|
||||
UPDATE `settings` SET `description` = 'روشن: پس از واریز/برداشت، تراکنش به سامانه حسابداری fin همگامسازی میشود.' WHERE `key` = 'payping_fin_sync_enabled';
|
||||
@@ -1193,6 +1199,7 @@ UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN (
|
||||
'payping_fin_customer_id', 'payping_fin_sync_enabled', 'payping_fin_token', 'payping_fin_url',
|
||||
'payping_gateway_items', 'payping_gateway_name',
|
||||
'payping_round_toman', 'payping_start_url', 'payping_strict_failed_withdraw', 'payping_verify_url',
|
||||
'permision__enabled',
|
||||
'price_extreme_date', 'price_provider', 'profit_gold_api_enabled',
|
||||
'send_to_tahesab', 'service_charge_percentage',
|
||||
'sse_path',
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
-- =============================================================================
|
||||
-- پچ اضطراری: wallets/transactions برای DB قدیمی بدون product_id
|
||||
-- امن و idempotent — چند بار قابل اجرا؛ داده موجود را تغییر نمیدهد
|
||||
--
|
||||
-- علت خطای /customer/me:
|
||||
-- Unknown column 'product_id' in 'where clause' ... from `wallets`
|
||||
--
|
||||
-- بعد از اجرا:
|
||||
-- php artisan config:clear
|
||||
-- (اختیاری) php artisan migrate — مایگریشن همنام را هم ثبت میکند
|
||||
-- =============================================================================
|
||||
|
||||
SET @db = DATABASE();
|
||||
|
||||
-- wallets.product_id
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'product_id') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'fund_id') > 0,
|
||||
'ALTER TABLE `wallets` ADD COLUMN `product_id` INT NULL DEFAULT NULL AFTER `fund_id`',
|
||||
'ALTER TABLE `wallets` ADD COLUMN `product_id` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip wallets.product_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- wallets.number
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'number') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'product_id') > 0,
|
||||
'ALTER TABLE `wallets` ADD COLUMN `number` INT NOT NULL DEFAULT 0 AFTER `product_id`',
|
||||
'ALTER TABLE `wallets` ADD COLUMN `number` INT NOT NULL DEFAULT 0'
|
||||
),
|
||||
'SELECT ''skip wallets.number'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.product_id
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'product_id') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'type') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `product_id` INT NULL DEFAULT NULL AFTER `type`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `product_id` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.product_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.order_id
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'order_id') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'customer_id') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `order_id` INT NULL DEFAULT NULL AFTER `customer_id`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `order_id` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.order_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.title
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'title') = 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `title` VARCHAR(255) NULL DEFAULT NULL',
|
||||
'SELECT ''skip transactions.title'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.unit
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'unit') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'title') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `unit` VARCHAR(255) NULL DEFAULT NULL AFTER `title`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `unit` VARCHAR(255) NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.unit'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.balance_cash
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'balance_cash') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'gold') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `balance_cash` BIGINT NULL DEFAULT NULL AFTER `gold`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `balance_cash` BIGINT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.balance_cash'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.balance_gold
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'balance_gold') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'balance_cash') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `balance_gold` INT NULL DEFAULT NULL AFTER `balance_cash`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `balance_gold` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.balance_gold'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.withdraw_id
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'withdraw_id') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'balance_gold') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `withdraw_id` INT UNSIGNED NULL DEFAULT NULL AFTER `balance_gold`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `withdraw_id` INT UNSIGNED NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.withdraw_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.active
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'active') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'withdraw_id') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `active` TINYINT(1) NULL DEFAULT NULL AFTER `withdraw_id`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `active` TINYINT(1) NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.active'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- transactions.number
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions') > 0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'number') = 0,
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'active') > 0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `number` INT NULL DEFAULT NULL AFTER `active`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `number` INT NULL DEFAULT NULL'
|
||||
),
|
||||
'SELECT ''skip transactions.number'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
SELECT
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'wallets' AND COLUMN_NAME = 'product_id') AS wallets_product_id,
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'transactions' AND COLUMN_NAME = 'product_id') AS transactions_product_id,
|
||||
'ensure_wallet_module_columns.sql finished' AS status;
|
||||
@@ -0,0 +1,529 @@
|
||||
-- =============================================================================
|
||||
-- gholaktala_upgrade.sql — ارتقای DB قلک طلا برای برنچ ماژولار
|
||||
-- =============================================================================
|
||||
-- قبل از اجرا:
|
||||
-- 1) بکاپ: mysqldump DB_NAME > backup.sql
|
||||
-- 2) USE `نام_دیتابیس`;
|
||||
--
|
||||
-- اصول:
|
||||
-- • فقط ADD / CREATE IF NOT EXISTS — هیچ DROP نیست
|
||||
-- • دادهٔ موجود (مشتری، کیف، سفارش، settings، const) حفظ میشود
|
||||
-- • تهحساب: جداول قدیمی tahesab_* دست نخورده — جدول tahesab ساخته نمیشود
|
||||
-- • ستونهای legacy قلک طلا نگه داشته میشوند: sum_cash, permission, description, auto_buy, ...
|
||||
--
|
||||
-- بعد از این فایل حتماً merge settings/const:
|
||||
-- mysql ... < database/sql/deploy_settings_const_preserve_value_sync_can_edit.sql
|
||||
-- یا: bash database/sql/run_gholaktala_upgrade.sh
|
||||
--
|
||||
-- سپس:
|
||||
-- php artisan migrate
|
||||
-- php artisan config:clear
|
||||
-- =============================================================================
|
||||
|
||||
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
SET @db = DATABASE();
|
||||
|
||||
-- =============================================================================
|
||||
-- ۱) جداول جدید ماژولار (بدون تهحساب)
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `addresses` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`city` varchar(255) DEFAULT NULL,
|
||||
`province` varchar(255) DEFAULT NULL,
|
||||
`phone` varchar(15) DEFAULT NULL,
|
||||
`address` varchar(2028) DEFAULT NULL,
|
||||
`zip` varchar(15) DEFAULT NULL,
|
||||
`customer_id` int unsigned DEFAULT NULL,
|
||||
`default_address` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`created_at` timestamp NULL DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL,
|
||||
`major_id` int DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `files` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`original_name` varchar(100) DEFAULT NULL,
|
||||
`title` varchar(255) DEFAULT NULL,
|
||||
`ext` varchar(40) DEFAULT NULL,
|
||||
`src` varchar(1024) DEFAULT NULL,
|
||||
`size` int unsigned DEFAULT NULL,
|
||||
`user_id` int unsigned DEFAULT NULL,
|
||||
`document_id` int unsigned DEFAULT NULL,
|
||||
`type` tinyint unsigned DEFAULT NULL,
|
||||
`has_thumb` tinyint(1) DEFAULT NULL,
|
||||
`created_at` timestamp NULL DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL,
|
||||
`url` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `customers_settings` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`agent_id` int DEFAULT NULL,
|
||||
`customer_id` int DEFAULT NULL,
|
||||
`product_id` int DEFAULT NULL,
|
||||
`group` varchar(255) DEFAULT NULL,
|
||||
`lvl` int DEFAULT NULL,
|
||||
`profit_buy` int DEFAULT NULL,
|
||||
`profit_sell` int DEFAULT NULL,
|
||||
`auto_buy` int DEFAULT NULL,
|
||||
`auto_sell` int DEFAULT NULL,
|
||||
`credit_buy` int DEFAULT NULL,
|
||||
`credit_sell` int DEFAULT NULL,
|
||||
`created_at` timestamp NULL DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL,
|
||||
`deleted_at` timestamp NULL DEFAULT NULL,
|
||||
`title` varchar(255) DEFAULT NULL,
|
||||
`is_active` varchar(255) DEFAULT '1',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `categories` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`active` tinyint(1) NOT NULL DEFAULT 1,
|
||||
`show_in_filter` tinyint(1) NOT NULL DEFAULT 1,
|
||||
`show_in_select` tinyint(1) NOT NULL DEFAULT 1,
|
||||
`sort_order` smallint unsigned NOT NULL DEFAULT 0,
|
||||
`created_at` timestamp NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `categories_name_unique` (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `price_sync_logs` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`source` varchar(32) NOT NULL,
|
||||
`source_url` varchar(512) DEFAULT NULL,
|
||||
`liquid_gold_price` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`products_updated` smallint unsigned NOT NULL DEFAULT 0,
|
||||
`created_at` timestamp NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `price_sync_log_items` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`log_id` bigint unsigned NOT NULL,
|
||||
`product_id` bigint unsigned DEFAULT NULL,
|
||||
`product_title` varchar(255) DEFAULT NULL,
|
||||
`reading_method` varchar(128) DEFAULT NULL,
|
||||
`source_name` varchar(255) DEFAULT NULL,
|
||||
`base_price` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`base_profit` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`offset_percent` decimal(8,2) NOT NULL DEFAULT 0.00,
|
||||
`stored_price` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`previous_price` bigint unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `price_sync_log_items_log_id_index` (`log_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۲) wallets + transactions (رفع /customer/me)
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='wallets')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='wallets' AND COLUMN_NAME='product_id')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='wallets' AND COLUMN_NAME='fund_id')>0,
|
||||
'ALTER TABLE `wallets` ADD COLUMN `product_id` INT NULL DEFAULT NULL AFTER `fund_id`',
|
||||
'ALTER TABLE `wallets` ADD COLUMN `product_id` INT NULL DEFAULT NULL'),
|
||||
'SELECT ''skip wallets.product_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='wallets')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='wallets' AND COLUMN_NAME='number')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='wallets' AND COLUMN_NAME='product_id')>0,
|
||||
'ALTER TABLE `wallets` ADD COLUMN `number` INT NOT NULL DEFAULT 0 AFTER `product_id`',
|
||||
'ALTER TABLE `wallets` ADD COLUMN `number` INT NOT NULL DEFAULT 0'),
|
||||
'SELECT ''skip wallets.number'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='transactions')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='transactions' AND COLUMN_NAME='title')=0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `title` VARCHAR(255) NULL DEFAULT NULL',
|
||||
'SELECT ''skip transactions.title'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='transactions')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='transactions' AND COLUMN_NAME='unit')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='transactions' AND COLUMN_NAME='title')>0,
|
||||
'ALTER TABLE `transactions` ADD COLUMN `unit` VARCHAR(255) NULL DEFAULT NULL AFTER `title`',
|
||||
'ALTER TABLE `transactions` ADD COLUMN `unit` VARCHAR(255) NULL DEFAULT NULL'),
|
||||
'SELECT ''skip transactions.unit'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۳) customers (ستونهای جدید — sum_cash قدیمی نگه داشته میشود)
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='gold')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='sum_gold')>0,
|
||||
'ALTER TABLE `customers` ADD COLUMN `gold` DECIMAL(10,4) NULL DEFAULT NULL AFTER `sum_gold`',
|
||||
'ALTER TABLE `customers` ADD COLUMN `gold` DECIMAL(10,4) NULL DEFAULT NULL'),
|
||||
'SELECT ''skip customers.gold'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='total_referrals')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='referral_to_id')>0,
|
||||
'ALTER TABLE `customers` ADD COLUMN `total_referrals` INT UNSIGNED NOT NULL DEFAULT 0 AFTER `referral_to_id`',
|
||||
'ALTER TABLE `customers` ADD COLUMN `total_referrals` INT UNSIGNED NOT NULL DEFAULT 0'),
|
||||
'SELECT ''skip customers.total_referrals'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='moshtari_code')=0,
|
||||
'ALTER TABLE `customers` ADD COLUMN `moshtari_code` INT NULL DEFAULT NULL',
|
||||
'SELECT ''skip customers.moshtari_code'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='referral_id')>0
|
||||
AND (SELECT CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='referral_id' LIMIT 1) < 12,
|
||||
'ALTER TABLE `customers` MODIFY COLUMN `referral_id` VARCHAR(12) NOT NULL',
|
||||
'SELECT ''skip customers.referral_id widen'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='referral_to_id')>0
|
||||
AND (SELECT CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='customers' AND COLUMN_NAME='referral_to_id' LIMIT 1) < 12,
|
||||
'ALTER TABLE `customers` MODIFY COLUMN `referral_to_id` VARCHAR(12) NULL DEFAULT NULL',
|
||||
'SELECT ''skip customers.referral_to_id widen'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۴) users (permission قدیمی نگه — gold جدید اضافه)
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='users')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='users' AND COLUMN_NAME='gold')=0,
|
||||
'ALTER TABLE `users` ADD COLUMN `gold` INT NULL DEFAULT NULL',
|
||||
'SELECT ''skip users.gold'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۵) products — ستونهای ماژولار (auto_buy/kalhor_name/... قدیمی حفظ)
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products')>0
|
||||
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='amount')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `amount` FLOAT NOT NULL DEFAULT 1',
|
||||
'SELECT ''skip products.amount'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='metal_id')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `metal_id` INT NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.metal_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='group_type')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `group_type` VARCHAR(255) NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.group_type'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='price')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `price` BIGINT NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.price'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='price_profit')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `price_profit` INT NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.price_profit'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='price_offset_percent')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `price_offset_percent` DECIMAL(8,2) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.price_offset_percent'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='show_in_assets')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `show_in_assets` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.show_in_assets'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='use_last_price_if_zero')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `use_last_price_if_zero` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.use_last_price_if_zero'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='auto_open_at')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `auto_open_at` TIME NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.auto_open_at'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='auto_close_at')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `auto_close_at` TIME NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.auto_close_at'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='override_trading_hours')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `override_trading_hours` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.override_trading_hours'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='percent_fee_buy')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `percent_fee_buy` FLOAT NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.percent_fee_buy'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='percent_fee_sell')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `percent_fee_sell` FLOAT NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.percent_fee_sell'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='order_limit_enabled')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `order_limit_enabled` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.order_limit_enabled'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='min_order_cash')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `min_order_cash` BIGINT UNSIGNED NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.min_order_cash'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='max_order_cash')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `max_order_cash` BIGINT UNSIGNED NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.max_order_cash'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='cash_fee_buy')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `cash_fee_buy` DECIMAL(14,4) NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.cash_fee_buy'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='cash_fee_buy_is_percent')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `cash_fee_buy_is_percent` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.cash_fee_buy_is_percent'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='cash_fee_sell')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `cash_fee_sell` DECIMAL(14,4) NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.cash_fee_sell'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='cash_fee_sell_is_percent')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `cash_fee_sell_is_percent` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.cash_fee_sell_is_percent'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='bubble')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `bubble` TINYINT NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.bubble'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='direct_price')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `direct_price` TINYINT NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.direct_price'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='app_price')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `app_price` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.app_price'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='trade_by_quantity')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `trade_by_quantity` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.trade_by_quantity'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='has_physical_delivery')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `has_physical_delivery` TINYINT(1) NOT NULL DEFAULT 0',
|
||||
'SELECT ''skip products.has_physical_delivery'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' AND COLUMN_NAME='min_physical_delivery_quantity')=0,
|
||||
'ALTER TABLE `products` ADD COLUMN `min_physical_delivery_quantity` DECIMAL(12,3) NULL DEFAULT NULL',
|
||||
'SELECT ''skip products.min_physical_delivery_quantity'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۶) orders
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='orders' AND COLUMN_NAME='provider_id')=0,
|
||||
'ALTER TABLE `orders` ADD COLUMN `provider_id` BIGINT UNSIGNED NULL AFTER `id`, ADD INDEX `orders_provider_id_index` (`provider_id`)',
|
||||
'SELECT ''skip orders.provider_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='orders' AND COLUMN_NAME='total_price_montzar')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='orders' AND COLUMN_NAME='total_price')>0,
|
||||
'ALTER TABLE `orders` ADD COLUMN `total_price_montzar` DECIMAL(20,4) NULL DEFAULT NULL AFTER `total_price`',
|
||||
'ALTER TABLE `orders` ADD COLUMN `total_price_montzar` DECIMAL(20,4) NULL DEFAULT NULL'),
|
||||
'SELECT ''skip orders.total_price_montzar'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='orders' AND COLUMN_NAME='fee_asset')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='orders' AND COLUMN_NAME='service_charge_price')>0,
|
||||
'ALTER TABLE `orders` ADD COLUMN `fee_asset` VARCHAR(8) NULL DEFAULT NULL AFTER `service_charge_price`',
|
||||
'ALTER TABLE `orders` ADD COLUMN `fee_asset` VARCHAR(8) NULL DEFAULT NULL'),
|
||||
'SELECT ''skip orders.fee_asset'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۷) withdraws (description قدیمی حفظ — extra_note جدید)
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='withdraws' AND COLUMN_NAME='extra_note')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='withdraws' AND COLUMN_NAME='note')>0,
|
||||
'ALTER TABLE `withdraws` ADD COLUMN `extra_note` TEXT NULL DEFAULT NULL AFTER `note`',
|
||||
'ALTER TABLE `withdraws` ADD COLUMN `extra_note` TEXT NULL DEFAULT NULL'),
|
||||
'SELECT ''skip withdraws.extra_note'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='withdraws' AND COLUMN_NAME='address_id')=0,
|
||||
'ALTER TABLE `withdraws` ADD COLUMN `address_id` BIGINT NULL DEFAULT NULL',
|
||||
'SELECT ''skip withdraws.address_id'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۸) settings / const — فقط schema (merge داده در فایل بعدی)
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='settings' AND COLUMN_NAME='type')=0,
|
||||
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='settings' AND COLUMN_NAME='description')>0,
|
||||
'ALTER TABLE `settings` ADD COLUMN `type` VARCHAR(50) NULL DEFAULT NULL AFTER `description`',
|
||||
'ALTER TABLE `settings` ADD COLUMN `type` VARCHAR(50) NULL DEFAULT NULL'),
|
||||
'SELECT ''skip settings.type'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='const' AND COLUMN_NAME='value_json')=0,
|
||||
'ALTER TABLE `const` ADD COLUMN `value_json` LONGTEXT NULL DEFAULT NULL',
|
||||
'SELECT ''skip const.value_json'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
ALTER TABLE `settings`
|
||||
MODIFY COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL,
|
||||
MODIFY COLUMN `title_fa` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL;
|
||||
|
||||
ALTER TABLE `const`
|
||||
MODIFY COLUMN `title_fa` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL;
|
||||
|
||||
-- =============================================================================
|
||||
-- ۹) backfill داده — محصولات قلک طلا (گوی/مکعب)
|
||||
-- =============================================================================
|
||||
|
||||
UPDATE `products`
|
||||
SET
|
||||
`metal_id` = COALESCE(`metal_id`, 1),
|
||||
`group_type` = COALESCE(NULLIF(`group_type`, ''), `title`),
|
||||
`amount` = CASE WHEN `amount` IS NULL OR `amount` = 0 THEN 1 ELSE `amount` END,
|
||||
`price` = COALESCE(`price`, 0),
|
||||
`show_in_assets` = COALESCE(`show_in_assets`, 1),
|
||||
`active` = COALESCE(`active`, 1),
|
||||
`show` = COALESCE(`show`, 1)
|
||||
WHERE `deleted_at` IS NULL;
|
||||
|
||||
INSERT IGNORE INTO `categories` (`name`, `active`, `show_in_filter`, `show_in_select`, `sort_order`, `created_at`)
|
||||
SELECT DISTINCT `group_type`, 1, 1, 1, 0, NOW()
|
||||
FROM `products`
|
||||
WHERE `group_type` IS NOT NULL AND `group_type` <> '';
|
||||
|
||||
INSERT IGNORE INTO `categories` (`name`, `active`, `show_in_filter`, `show_in_select`, `sort_order`, `created_at`) VALUES
|
||||
('گوی', 1, 1, 1, 1, NOW()),
|
||||
('مکعب', 1, 1, 1, 2, NOW());
|
||||
|
||||
-- =============================================================================
|
||||
-- ۱۰) InnoDB (اختیاری ولی توصیهشده)
|
||||
-- =============================================================================
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='products' LIMIT 1) = 'MyISAM',
|
||||
'ALTER TABLE `products` ENGINE=InnoDB',
|
||||
'SELECT ''skip products engine'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA=@db AND TABLE_NAME='settings' LIMIT 1) = 'MyISAM',
|
||||
'ALTER TABLE `settings` ENGINE=InnoDB',
|
||||
'SELECT ''skip settings engine'' AS info'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================================================
|
||||
SELECT 'gholaktala_upgrade.sql schema done — now run deploy_settings_const_preserve_value_sync_can_edit.sql' AS next_step;
|
||||
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env bash
|
||||
# ارتقای DB قلک طلا — schema + merge settings/const
|
||||
# استفاده: cd /opt/gholak/server && bash database/sql/run_gholaktala_upgrade.sh
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
||||
cd "$ROOT"
|
||||
|
||||
read_env() {
|
||||
grep "^${1}=" .env | cut -d= -f2- | tr -d '\r"' | head -1
|
||||
}
|
||||
|
||||
DB_HOST=$(read_env DB_HOST)
|
||||
DB_PORT=$(read_env DB_PORT)
|
||||
DB_DATABASE=$(read_env DB_DATABASE)
|
||||
DB_USERNAME=$(read_env DB_USERNAME)
|
||||
DB_PASSWORD=$(read_env DB_PASSWORD)
|
||||
|
||||
mysql_cmd() {
|
||||
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USERNAME" -p"$DB_PASSWORD" "$DB_DATABASE" "$@"
|
||||
}
|
||||
|
||||
mysqldump_cmd() {
|
||||
mysqldump -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USERNAME" -p"$DB_PASSWORD" \
|
||||
--single-transaction --routines --triggers "$DB_DATABASE" "$@"
|
||||
}
|
||||
|
||||
BACKUP_FILE="/tmp/gholaktala_before_upgrade_$(date +%Y%m%d_%H%M%S).sql"
|
||||
echo "==> 0/5 backup -> $BACKUP_FILE"
|
||||
mysqldump_cmd > "$BACKUP_FILE"
|
||||
echo " backup size: $(du -h "$BACKUP_FILE" | cut -f1)"
|
||||
|
||||
echo "==> 1/5 gholaktala_upgrade.sql (schema + backfill)"
|
||||
mysql_cmd < database/sql/gholaktala_upgrade.sql
|
||||
|
||||
echo "==> 2/5 deploy_settings_const_preserve_value_sync_can_edit.sql (merge settings + const)"
|
||||
mysql_cmd < database/sql/deploy_settings_const_preserve_value_sync_can_edit.sql
|
||||
|
||||
echo "==> 3/5 baseline_migrations.sql (اگر قبلاً نزدهاید)"
|
||||
if mysql_cmd -N -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='migrations';" | grep -q '^1$'; then
|
||||
PKG=$(mysql_cmd -N -e "SELECT COUNT(*) FROM migrations WHERE migration IN (
|
||||
'2019_12_14_000001_create_personal_access_tokens_table',
|
||||
'2021_12_02_065938_create_wallet_moudle_table'
|
||||
);" 2>/dev/null || echo 0)
|
||||
if [[ "$PKG" != "2" ]]; then
|
||||
echo " running baseline_migrations.sql ..."
|
||||
mysql_cmd < database/sql/baseline_migrations.sql
|
||||
else
|
||||
echo " skip — baseline already applied"
|
||||
fi
|
||||
else
|
||||
echo " skip — no migrations table"
|
||||
fi
|
||||
|
||||
echo "==> 4/5 php artisan migrate"
|
||||
php artisan migrate --force
|
||||
echo "==> 5/5 php artisan config:clear"
|
||||
php artisan config:clear
|
||||
|
||||
echo "==> done — backup: $BACKUP_FILE"
|
||||
echo "==> test: GET /server/customer/me"
|
||||
Reference in New Issue
Block a user