fallback handled

This commit is contained in:
2026-06-17 16:13:18 +03:30
parent 34298d3bc5
commit cc5808e755
7 changed files with 232 additions and 2 deletions
@@ -0,0 +1,98 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
if (! Schema::hasTable('products')) {
return;
}
if (! Schema::hasColumn('products', 'trade_by_quantity')) {
Schema::table('products', function (Blueprint $table) {
if (Schema::hasColumn('products', 'show_in_assets')) {
$table->boolean('trade_by_quantity')->default(false)->after('show_in_assets');
} else {
$table->boolean('trade_by_quantity')->default(false);
}
});
}
$this->backfillQuantityTradeForLegacyProducts();
}
public function down(): void
{
if (! Schema::hasTable('products') || ! Schema::hasColumn('products', 'trade_by_quantity')) {
return;
}
Schema::table('products', function (Blueprint $table) {
$table->dropColumn('trade_by_quantity');
});
}
private function backfillQuantityTradeForLegacyProducts(): void
{
$mainProductIds = $this->resolveMainProductIds();
DB::table('products')
->where(function ($query) use ($mainProductIds) {
$query->whereIn('group_type', ['آبشده', 'کاتد مس']);
if ($mainProductIds !== []) {
$query->orWhereIn('id', $mainProductIds);
}
})
->where(function ($query) {
$query->where('trade_by_quantity', false)
->orWhereNull('trade_by_quantity');
})
->update(['trade_by_quantity' => true]);
}
/** @return array<int, int> */
private function resolveMainProductIds(): array
{
$ids = [];
if (Schema::hasTable('settings')) {
$value = DB::table('settings')->where('key', 'main_product')->value('value');
$id = $this->parsePositiveInt($value);
if ($id !== null) {
$ids[] = $id;
}
}
if (Schema::hasTable('const')) {
$value = DB::table('const')->where('key', 'main_product')->value('value');
$id = $this->parsePositiveInt($value);
if ($id !== null) {
$ids[] = $id;
}
}
return array_values(array_unique($ids));
}
private function parsePositiveInt(mixed $value): ?int
{
if ($value === null) {
return null;
}
$value = trim((string) $value);
if ($value === '' || ! ctype_digit($value)) {
return null;
}
$id = (int) $value;
return $id > 0 ? $id : null;
}
};
@@ -0,0 +1,40 @@
-- معامله مقداری: UI «ارزش کل» + «مقدار» مستقل از دسته‌بندی
-- اجرا: mysql ... < add_trade_by_quantity_to_products.sql
--
-- بک‌فیل: محصولات قبلی دسته آبشده/کاتد مس + محصول main_product (معمولاً id=13)
SET @has_col := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'products'
AND COLUMN_NAME = 'trade_by_quantity'
);
SET @sql := IF(
@has_col = 0,
'ALTER TABLE `products` ADD COLUMN `trade_by_quantity` TINYINT(1) NOT NULL DEFAULT 0 AFTER `show_in_assets`',
'SELECT ''trade_by_quantity already exists'' AS info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- محصولات آبشده/کاتد مس + main_product از settings/const
UPDATE `products` p
LEFT JOIN `settings` s
ON s.`key` = 'main_product'
AND TRIM(s.`value`) REGEXP '^[0-9]+$'
AND CAST(TRIM(s.`value`) AS UNSIGNED) = p.`id`
LEFT JOIN `const` c
ON c.`key` = 'main_product'
AND TRIM(c.`value`) REGEXP '^[0-9]+$'
AND CAST(TRIM(c.`value`) AS UNSIGNED) = p.`id`
SET p.`trade_by_quantity` = 1
WHERE COALESCE(p.`trade_by_quantity`, 0) = 0
AND (
p.`group_type` IN ('آبشده', 'کاتد مس')
OR s.`id` IS NOT NULL
OR c.`id` IS NOT NULL
);
+24 -2
View File
@@ -317,6 +317,21 @@ INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `de
SELECT 'support_messenger_text', '', 'متن پشتیبانی پیام‌رسان', 1, 0, 'متن دکمه یا توضیح پشتیبانی در اپ کاربر'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'support_messenger_text' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'invite_link_text',
'⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
٪لینک',
'متن دعوتنامه اشتراک‌گذاری',
1, 1,
'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.',
'longtext'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'invite_link_text' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
SELECT 'support_messenger', '', 'پیام‌رسان پشتیبانی', 1, 1, 'bale,telegram,whatsapp,rubika,eitaa,soroush'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'support_messenger' LIMIT 1);
@@ -593,7 +608,7 @@ WHERE `key` = 'main_product';
-- =============================================================================
-- longtext
UPDATE `settings` SET `type` = 'longtext' WHERE `key` IN ('text_rule', 'text_about', 'support_messenger_text', 'montzar_order_response');
UPDATE `settings` SET `type` = 'longtext' WHERE `key` IN ('text_rule', 'text_about', 'support_messenger_text', 'invite_link_text', 'montzar_order_response');
-- select (+ گزینه‌ها در description)
UPDATE `settings` SET `type` = 'select', `description` = 'منبع فعال قیمت|montzar,zaarbox,main_product' WHERE `key` = 'price_provider';
@@ -633,7 +648,7 @@ UPDATE `settings` SET `type` = 'text' WHERE `key` IN (
'payping_fin_token', 'payping_gateway_item', 'tahesab_host', 'tahesab_token', 'tahesab_db',
'node_client_id', 'node_shared_secret',
'wss_path', 'wss_link', 'wss_trigger_path',
'tahesab_bank_account', 'telegram_bot_token', 'bale_bot_token', 'support_messenger_id', 'support_messenger_text', 'referral_limit',
'tahesab_bank_account', 'telegram_bot_token', 'bale_bot_token', 'support_messenger_id', 'support_messenger_text', 'invite_link_text', 'referral_limit',
'referral_bonus_amount', 'balance_report_exclude_customer_id', 'metal_type', 'montify_name', 'price_extreme_date',
'default_vc_number', 'liman_token'
);
@@ -809,6 +824,12 @@ UPDATE `settings` SET
`description` = 'متن دکمه یا توضیح پشتیبانی در اپ کاربر'
WHERE `key` = 'support_messenger_text';
UPDATE `settings` SET
`title_fa` = 'متن دعوتنامه اشتراک‌گذاری',
`type` = 'longtext',
`description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.'
WHERE `key` = 'invite_link_text';
UPDATE `settings` SET
`title_fa` = 'پیام‌رسان پشتیبانی',
`type` = 'select',
@@ -987,6 +1008,7 @@ UPDATE `settings` SET `description` = 'روشن: واریز و برداشت مش
UPDATE `settings` SET `description` = 'نوع پیام‌رسان برای دکمه پشتیبانی در اپ کاربر|bale,telegram,whatsapp,rubika,eitaa,soroush' WHERE `key` = 'support_messenger';
UPDATE `settings` SET `description` = 'شناسه تماس پشتیبانی: یوزرنیم (تلگرام)، شماره (واتساپ/بله) یا آیدی بسته به پیام‌رسان انتخاب‌شده.' WHERE `key` = 'support_messenger_id';
UPDATE `settings` SET `description` = 'متن دکمه یا توضیح کوتاه کنار لینک پشتیبانی در اپ کاربر.' WHERE `key` = 'support_messenger_text';
UPDATE `settings` SET `description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.' WHERE `key` = 'invite_link_text';
UPDATE `settings` SET `description` = 'شماره موبایل پشتیبانی واریز؛ در صفحه شارژ حساب دکمه پیامک با متن «شماره حساب» نمایش داده می‌شود.' WHERE `key` = 'deposit_sms_support_number';
UPDATE `settings` SET `description` = 'توکن ربات تلگرام برای ارسال اعلان‌ها. از BotFather دریافت می‌شود. محرمانه.' WHERE `key` = 'telegram_bot_token';
+29
View File
@@ -0,0 +1,29 @@
-- invite_link_text: متن دعوتنامه اشتراک‌گذاری (longtext)
-- اجرا روی DB موجود: INSERT اگر نبود + به‌روزرسانی type و description
START TRANSACTION;
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'invite_link_text',
'⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
٪لینک',
'متن دعوتنامه اشتراک‌گذاری',
1, 1,
'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.',
'longtext'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'invite_link_text' LIMIT 1);
UPDATE `settings` SET
`title_fa` = 'متن دعوتنامه اشتراک‌گذاری',
`type` = 'longtext',
`can_edit` = 1,
`is_active` = 1,
`description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.'
WHERE `key` = 'invite_link_text';
COMMIT;