diff --git a/app/Http/Controllers/Admin/ProductController.php b/app/Http/Controllers/Admin/ProductController.php index 0046b15..18ec0dc 100644 --- a/app/Http/Controllers/Admin/ProductController.php +++ b/app/Http/Controllers/Admin/ProductController.php @@ -150,6 +150,8 @@ class ProductController extends SuperController $product = Product::findOrFail($id); $oldOffsetPercent = (float) ($product->price_offset_percent ?? 0); + unset($data['trade_by_quantity']); + if ( Product::hasPriceOffsetColumn() && $product->reading_method diff --git a/app/Services/WebsocketBroadcastService.php b/app/Services/WebsocketBroadcastService.php index 4a6c9ce..c737e5e 100644 --- a/app/Services/WebsocketBroadcastService.php +++ b/app/Services/WebsocketBroadcastService.php @@ -11,19 +11,38 @@ class WebsocketBroadcastService public function triggerBaseUrl(): ?string { - $fromEnv = trim((string) (env('WSS_LINK') ?: env('wssLink', ''))); - if ($fromEnv !== '') { - return rtrim($fromEnv, '/'); + $config = app(ConfigService::class); + $port = $config->getInt('wss_http_port', 0); + + if ($port > 0) { + $host = trim($config->getString('wss_trigger_host', '127.0.0.1')); + if ($host === '') { + $host = '127.0.0.1'; + } + + $scheme = trim($config->getString('wss_trigger_scheme', 'http')); + if ($scheme === '') { + $scheme = 'http'; + } + + return rtrim("{$scheme}://{$host}:{$port}", '/'); } - $fromSetting = trim((string) app(ConfigService::class)->getString('wss_link', '')); - if ($fromSetting !== '') { - return rtrim($fromSetting, '/'); + // سازگاری با دیپلوی‌های قدیمی (wss_link کامل) + $legacyLink = trim($config->getString('wss_link', '')); + if ($legacyLink !== '') { + return rtrim($legacyLink, '/'); } return null; } + /** پورت WebSocket داخلی — برای دیپلوی لایت‌اسپید/docker (همان پروژه) */ + public function socketPort(): int + { + return app(ConfigService::class)->getInt('wss_socket_port', 0); + } + public function triggerPath(): string { $path = trim((string) app(ConfigService::class)->getString('wss_trigger_path', '')); diff --git a/database/sql/bourcecu_merge_goldali_catalog.sql b/database/sql/bourcecu_merge_goldali_catalog.sql index a76a29d..b1eab91 100644 --- a/database/sql/bourcecu_merge_goldali_catalog.sql +++ b/database/sql/bourcecu_merge_goldali_catalog.sql @@ -312,7 +312,7 @@ INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `de SELECT 'product_auto_close_open_on_list', '', 'باز/بسته خودکار محصول', 1, 0, NULL, 'switch' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'product_auto_close_open_on_list' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'metal_type', 'کاتد مس', 'عنوان فلز در UI', 1, 1, NULL, 'text' +SELECT 'metal_type', 'کاتد مس', 'عنوان فلز در UI', 0, 1, NULL, 'text' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'metal_type' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) SELECT 'payping_fin_sync_enabled', '', 'همگام‌سازی fin لیمان', 1, 0, NULL, 'switch' @@ -1183,7 +1183,7 @@ UPDATE `settings` SET WHERE `key` = 'product_auto_close_open_on_list'; UPDATE `settings` SET `title_fa` = 'عنوان فلز در UI', - `can_edit` = 1, + `can_edit` = 0, `type` = 'text', `description` = NULL, `value` = 'کاتد مس', diff --git a/database/sql/deploy_settings_const.sql b/database/sql/deploy_settings_const.sql index 9ab7682..a660f77 100644 --- a/database/sql/deploy_settings_const.sql +++ b/database/sql/deploy_settings_const.sql @@ -26,6 +26,18 @@ SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; SET @db = DATABASE(); +-- متن پیش‌فرض invite_link_text (تک‌خطی با CHAR(10) — سازگار با همه کلاینت‌های SQL) +SET @invite_link_default_text = CONCAT( + '⭐️الان طلا بخر؛ آخر ماه سودشو ببر!', CHAR(10), + 'با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!', CHAR(10), + CHAR(10), + 'این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.', CHAR(10), + 'روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.', CHAR(10), + CHAR(10), + '٪لینک' +); +SET @invite_link_desc = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی استفاده می‌کند.'; + -- ستون‌های اختیاری settings (بعضی DBهای قدیمی ندارند) SET @sql = IF( (SELECT COUNT(*) FROM information_schema.COLUMNS @@ -195,19 +207,31 @@ WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'external_order_api_ena -- WebSocket قیمت (برادکست last/list) INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'wss_enabled', 'true', 'قیمت لحظه‌ای از WebSocket', 1, 1, 'روشن = کلاینت از /prc/ws استفاده می‌کند؛ خاموش = polling', 'switch' +SELECT 'wss_enabled', 'true', 'قیمت لحظه‌ای از WebSocket', 0, 1, 'روشن = کلاینت از /prc/ws استفاده می‌کند؛ خاموش = polling', 'switch' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_enabled' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'wss_path', '/prc/ws', 'مسیر WebSocket قیمت', 1, 1, 'مسیر پروکسی لایت‌اسپید — مثال: /prc/ws', 'text' +SELECT 'wss_path', '/prc/ws', 'مسیر WebSocket قیمت', 0, 1, 'مسیر پروکسی لایت‌اسپید — مثال: /prc/ws', 'text' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_path' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'wss_link', '', 'آدرس trigger وب‌سوکت (سرور)', 1, 1, 'مثال: http://localhost:2090 — اگر خالی باشد از env WSS_LINK/wssLink', 'text' +SELECT 'wss_trigger_host', '127.0.0.1', 'هاست trigger وب‌سوکت', 0, 1, 'معمولاً 127.0.0.1 — همان سرور لاراول و docker ws', 'text' +WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_trigger_host' LIMIT 1); + +INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) +SELECT 'wss_http_port', '', 'پورت HTTP trigger وب‌سوکت', 0, 1, 'مثال طباطبایی: 2010 — لاراول POST برادکست؛ لایت‌اسپید External App /prc', 'number' +WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_http_port' LIMIT 1); + +INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) +SELECT 'wss_socket_port', '', 'پورت WebSocket داخلی', 0, 1, 'مثال طباطبایی: 2011 — لایت‌اسپید WebSocket Proxy /prc/ws و WS_SOCKET_PORT در docker', 'number' +WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_socket_port' LIMIT 1); + +INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) +SELECT 'wss_link', '', 'آدرس trigger وب‌سوکت (قدیمی)', 0, 0, 'منسوخ — از wss_http_port استفاده کنید. فقط اگر http_port خالی باشد.', 'text' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_link' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'wss_trigger_path', '/prc/api/trigger-update', 'مسیر trigger برادکست', 1, 1, 'POST برای ارسال last/list به سرویس ws', 'text' +SELECT 'wss_trigger_path', '/prc/api/trigger-update', 'مسیر trigger برادکست', 0, 1, 'POST برای ارسال last/list به سرویس ws', 'text' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_trigger_path' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) @@ -282,7 +306,7 @@ SELECT 'tahesab_host', '', 'آدرس IP سرور ته‌حساب', 1, 1, NULL WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'tahesab_host' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`) -SELECT 'tahesab_port', '', 'پورت سرور ته‌حساب', 1, 1, NULL +SELECT 'tahesab_port', '', 'پورت سرور ته‌حساب', 0, 1, NULL WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'tahesab_port' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`) @@ -318,18 +342,7 @@ SELECT 'support_messenger_text', '', 'متن پشتیبانی پیام‌رسا 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' +SELECT 'invite_link_text', @invite_link_default_text, 'متن دعوتنامه اشتراک‌گذاری', 1, 1, @invite_link_desc, '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`) @@ -355,7 +368,7 @@ SELECT 'price_extreme_date', '', 'تاریخ min/max روز', 0, 1, NULL WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'price_extreme_date' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`) -SELECT 'metal_type', 'طلای آبشده', 'عنوان فلز در UI', 1, 1, NULL +SELECT 'metal_type', 'طلای آبشده', 'عنوان فلز در UI', 0, 1, NULL WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'metal_type' LIMIT 1); -- درگاه — کلیدهای اختیاری payping @@ -551,7 +564,16 @@ WHERE `key` = 'wss_enabled'; UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'مسیر WebSocket قیمت') WHERE `key` = 'wss_path'; -UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'آدرس trigger وب‌سوکت') +UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'هاست trigger وب‌سوکت') +WHERE `key` = 'wss_trigger_host'; + +UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'پورت HTTP trigger وب‌سوکت') +WHERE `key` = 'wss_http_port'; + +UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'پورت WebSocket داخلی') +WHERE `key` = 'wss_socket_port'; + +UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'آدرس trigger وب‌سوکت (قدیمی)') WHERE `key` = 'wss_link'; UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'مسیر trigger برادکست') @@ -634,6 +656,7 @@ UPDATE `settings` SET `type` = 'number' WHERE `key` IN ( 'min_withdraw', 'min_first_buy', 'minimum_sell', 'montzar_product_id', 'gift_for_referrer', 'gift_for_referral', 'up_price', 'down_price', 'payping_fin_customer_id', 'tahesab_port', + 'wss_http_port', 'wss_socket_port', 'deposit_sms_support_number' ); @@ -647,8 +670,8 @@ UPDATE `settings` SET `type` = 'text' WHERE `key` IN ( 'payping_start_url', 'payping_verify_url', 'payping_gateway_items', 'payping_fin_url', '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', 'invite_link_text', 'referral_limit', + 'wss_path', 'wss_trigger_host', 'wss_link', 'wss_trigger_path', + 'tahesab_bank_account', 'telegram_bot_token', 'bale_bot_token', 'support_messenger_id', 'referral_limit', 'referral_bonus_amount', 'balance_report_exclude_customer_id', 'metal_type', 'montify_name', 'price_extreme_date', 'default_vc_number', 'liman_token' ); @@ -827,9 +850,13 @@ WHERE `key` = 'support_messenger_text'; UPDATE `settings` SET `title_fa` = 'متن دعوتنامه اشتراک‌گذاری', `type` = 'longtext', - `description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.' + `description` = @invite_link_desc WHERE `key` = 'invite_link_text'; +UPDATE `settings` SET `value` = @invite_link_default_text +WHERE `key` = 'invite_link_text' + AND (`value` IS NULL OR TRIM(`value`) = ''); + UPDATE `settings` SET `title_fa` = 'پیام‌رسان پشتیبانی', `type` = 'select', @@ -873,9 +900,18 @@ WHERE `key` = 'send_to_tahesab' AND TRIM(COALESCE(`value`, '')) = ''; -- is_store فقط از دیتابیس/دیپلوی — در پنل قابل ویرایش نیست UPDATE `settings` SET `can_edit` = 0 WHERE `key` = 'is_store'; +-- metal_type فقط از دیپلوی/SQL (مثلاً «کاتد مس» برای بورس مس) +UPDATE `settings` SET `can_edit` = 0 WHERE `key` = 'metal_type'; + -- fee_cash legacy — فقط از دیپلوی/SQL UPDATE `settings` SET `can_edit` = 0 WHERE `key` = 'fee_cash'; +-- WebSocket و پورت — فقط سرور (env / docker / لایت‌اسپید) +UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN ( + 'wss_enabled', 'wss_path', 'wss_trigger_host', 'wss_http_port', 'wss_socket_port', + 'wss_link', 'wss_trigger_path', 'tahesab_port' +); + -- لوگو / PWA / favicon — فقط از دیپلوی؛ در پنل نمایش داده نمی‌شوند UPDATE `settings` SET `can_edit` = 0, `is_active` = 0 WHERE `key` IN ('logo_login', 'logo_register', 'title_pwa', 'title_fav'); @@ -914,7 +950,7 @@ UPDATE `settings` SET `description` = 'آدرس تصویر لوگو در صفح UPDATE `settings` SET `description` = 'آدرس تصویر لوگو در صفحه ثبت‌نام. معمولاً از طریق دیپلوی تنظیم می‌شود؛ در پنل قابل ویرایش نیست.' WHERE `key` = 'logo_register'; UPDATE `settings` SET `description` = 'عنوان کوتاه برای نصب PWA روی موبایل. از دیپلوی مدیریت می‌شود.' WHERE `key` = 'title_pwa'; UPDATE `settings` SET `description` = 'عنوان نمایش‌داده‌شده در تب مرورگر (favicon). از دیپلوی مدیریت می‌شود.' WHERE `key` = 'title_fav'; -UPDATE `settings` SET `description` = 'عنوان فلز اصلی در رابط کاربر (مثلاً «طلای آبشده»). در دارایی، کیف پول و برچسب‌های معامله دیده می‌شود.' WHERE `key` = 'metal_type'; +UPDATE `settings` SET `description` = 'عنوان فلز اصلی در رابط کاربر (مثلاً «طلای آبشده» یا «کاتد مس»). در دارایی، کیف پول و برچسب‌های معامله دیده می‌شود. فقط از دیپلوی/SQL تغییر می‌کند.' WHERE `key` = 'metal_type'; UPDATE `settings` SET `description` = 'واحد نمایش وزن در دارایی‌ها، کیف پول و جزئیات معاملات|گرم,کیلوگرم' WHERE `key` = 'unit'; UPDATE `settings` SET `description` = 'روشن: کاربران جدید می‌توانند ثبت‌نام کنند. خاموش: فقط ورود کاربران موجود مجاز است.' WHERE `key` = 'open_register'; UPDATE `settings` SET `description` = 'روشن: حساب کاربر بلافاصله پس از ثبت‌نام فعال می‌شود. خاموش: نیاز به تأیید دستی ادمین دارد.' WHERE `key` = 'auto_active_customer'; @@ -981,8 +1017,12 @@ UPDATE `settings` SET `description` = 'شناسه کلاینت برای API سف UPDATE `settings` SET `description` = 'کلید مشترک امضای HMAC برای احراز درخواست‌های API سفارش خارجی. محرمانه نگه دارید.' WHERE `key` = 'node_shared_secret'; UPDATE `settings` SET `description` = 'روشن: API دریافت کیف پول و ثبت سفارش از سرویس فروشگاه خارجی فعال است. نیاز به node_client_id و node_shared_secret دارد.' WHERE `key` = 'external_order_api_enabled'; UPDATE `settings` SET `description` = 'روشن: اپ کاربر به‌جای polling مکرر /api/price/last و /customer/product/list از WebSocket استفاده می‌کند. نیاز به سرویس ws و پروکسی لایت‌اسپید دارد.' WHERE `key` = 'wss_enabled'; -UPDATE `settings` SET `description` = 'مسیر WebSocket روی دامنه اپ — معمولاً /prc/ws (پروکسی به پورت داخلی ws).' WHERE `key` = 'wss_path'; -UPDATE `settings` SET `description` = 'آدرس HTTP سرویس ws برای trigger برادکست از سرور لاراول — مثال: http://localhost:2090. اولویت با env WSS_LINK/wssLink است.' WHERE `key` = 'wss_link'; +UPDATE `settings` SET `description` = 'مسیر WebSocket روی دامنه اپ — معمولاً /prc/ws (پروکسی به wss_socket_port).' WHERE `key` = 'wss_path'; +UPDATE `settings` SET `description` = 'هاست داخلی سرویس ws برای trigger لاراول — معمولاً 127.0.0.1.' WHERE `key` = 'wss_trigger_host'; +UPDATE `settings` SET `description` = 'پورت HTTP trigger هر پروژه (ماژولار). لاراول: {host}:{port}/prc/api/trigger-update. لایت‌اسپید External App /prc.' WHERE `key` = 'wss_http_port'; +UPDATE `settings` SET `description` = 'پورت WebSocket داخلی هر پروژه. لایت‌اسپید /prc/ws و WS_SOCKET_PORT در docker همان پروژه.' WHERE `key` = 'wss_socket_port'; +UPDATE `settings` SET `description` = 'منسوخ — فقط اگر wss_http_port خالی باشد. ترجیح: wss_trigger_host + wss_http_port.' WHERE `key` = 'wss_link'; +UPDATE `settings` SET `is_active` = 0 WHERE `key` = 'wss_link'; UPDATE `settings` SET `description` = 'مسیر POST برای ارسال رویداد last/list به سرویس ws — پیش‌فرض: /prc/api/trigger-update' WHERE `key` = 'wss_trigger_path'; UPDATE `settings` SET `description` = 'نام فروشگاه که در درگاه پرداخت و رسید بانکی به کاربر نمایش داده می‌شود.' WHERE `key` = 'montify_name'; @@ -1008,7 +1048,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` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم 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'; @@ -1021,6 +1061,28 @@ UPDATE `settings` SET `description` = 'شناسه‌های عددی محصول ( UPDATE `settings` SET `description` = 'روشن: در حالت فروشگاهی قیمت از API نصیریان خوانده می‌شود (در صورت پیکربندی). فقط برای برخی نصب‌ها.' WHERE `key` = 'price_from_nasiryan'; UPDATE `settings` SET `description` = 'روشن: API محاسبه سود طلا فعال است. در اکثر نصب‌ها خاموش می‌ماند.' WHERE `key` = 'profit_gold_api_enabled'; +-- --------------------------------------------------------------------------- +-- ensure — کلیدهای longtext (INSERT نهایی + تثبیت type بعد از batchهای type=text) +-- --------------------------------------------------------------------------- +INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) +SELECT 'invite_link_text', @invite_link_default_text, 'متن دعوتنامه اشتراک‌گذاری', 1, 1, @invite_link_desc, '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` = @invite_link_desc +WHERE `key` = 'invite_link_text'; + +UPDATE `settings` SET `value` = @invite_link_default_text +WHERE `key` = 'invite_link_text' + AND (`value` IS NULL OR TRIM(`value`) = ''); + +UPDATE `settings` SET `type` = 'longtext' +WHERE `key` IN ('text_rule', 'text_about', 'support_messenger_text', 'invite_link_text', 'montzar_order_response'); + COMMIT; SELECT 'deploy_settings_const.sql finished' AS status; diff --git a/database/sql/invite_link_text_setting.sql b/database/sql/invite_link_text_setting.sql index 4c7d41e..cfebda7 100644 --- a/database/sql/invite_link_text_setting.sql +++ b/database/sql/invite_link_text_setting.sql @@ -3,19 +3,21 @@ START TRANSACTION; +SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; + +SET @invite_link_default_text = CONCAT( + '⭐️الان طلا بخر؛ آخر ماه سودشو ببر!', CHAR(10), + 'با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!', CHAR(10), + CHAR(10), + 'این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.', CHAR(10), + 'روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.', CHAR(10), + CHAR(10), + '٪لینک' +); +SET @invite_link_desc = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی استفاده می‌کند.'; + INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'invite_link_text', -'⭐️الان طلا بخر؛ آخر ماه سودشو ببر! -با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر! - -این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید. -روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید. - -٪لینک', -'متن دعوتنامه اشتراک‌گذاری', -1, 1, -'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.', -'longtext' +SELECT 'invite_link_text', @invite_link_default_text, 'متن دعوتنامه اشتراک‌گذاری', 1, 1, @invite_link_desc, 'longtext' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'invite_link_text' LIMIT 1); UPDATE `settings` SET @@ -23,7 +25,15 @@ UPDATE `settings` SET `type` = 'longtext', `can_edit` = 1, `is_active` = 1, - `description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.' + `description` = @invite_link_desc WHERE `key` = 'invite_link_text'; +UPDATE `settings` SET `value` = @invite_link_default_text +WHERE `key` = 'invite_link_text' + AND (`value` IS NULL OR TRIM(`value`) = ''); + COMMIT; + +SELECT `key`, `title_fa`, LEFT(`value`, 80) AS value_preview, `type`, `is_active` +FROM `settings` +WHERE `key` = 'invite_link_text';