2026-06-10 09:49:35 +03:30
|
|
|
-- =============================================================================
|
|
|
|
|
-- اسکریپت امن deploy — چند بار قابل اجرا؛ اگر ستون/جدول باشد خطا نمیدهد
|
|
|
|
|
-- =============================================================================
|
|
|
|
|
-- قبل از اجرا:
|
|
|
|
|
-- USE `نام_دیتابیس`;
|
|
|
|
|
-- (اختیاری) mysqldump بکاپ
|
|
|
|
|
--
|
|
|
|
|
-- الگو: فقط وقتی جدول هست و ستون نیست → ALTER
|
|
|
|
|
-- =============================================================================
|
|
|
|
|
|
|
|
|
|
SET @db = DATABASE();
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products.show_in_assets (صفحه داراییها)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'show_in_assets') = 0,
|
|
|
|
|
IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'show') > 0,
|
2026-06-10 13:11:51 +03:30
|
|
|
'ALTER TABLE `products` ADD COLUMN `show_in_assets` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''نمایش در صفحه داراییها'' AFTER `show`',
|
|
|
|
|
'ALTER TABLE `products` ADD COLUMN `show_in_assets` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''نمایش در صفحه داراییها'''
|
2026-06-10 09:49:35 +03:30
|
|
|
),
|
|
|
|
|
'SELECT ''skip products.show_in_assets'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
2026-06-10 13:11:51 +03:30
|
|
|
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` MODIFY COLUMN `show_in_assets` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''نمایش در صفحه داراییها''',
|
|
|
|
|
'SELECT ''skip products.show_in_assets modify'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
|
|
|
|
-- یکبار برای اصلاح سرورهایی که قبلاً DEFAULT 1 داشتند:
|
|
|
|
|
-- UPDATE `products` SET `show_in_assets` = 0;
|
|
|
|
|
|
2026-08-18 17:17:01 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products.show_on_tv (تابلو قیمت /tv)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'show_on_tv') = 0,
|
|
|
|
|
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_on_tv` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''نمایش در تابلو /tv'' AFTER `show_in_assets`',
|
|
|
|
|
IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'show') > 0,
|
|
|
|
|
'ALTER TABLE `products` ADD COLUMN `show_on_tv` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''نمایش در تابلو /tv'' AFTER `show`',
|
|
|
|
|
'ALTER TABLE `products` ADD COLUMN `show_on_tv` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''نمایش در تابلو /tv'''
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
'SELECT ''skip products.show_on_tv'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
2026-06-10 13:11:51 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products.use_last_price_if_zero (fallback وقتی provider صفر است)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'use_last_price_if_zero') = 0,
|
|
|
|
|
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 `use_last_price_if_zero` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''استفاده از آخرین قیمت وقتی provider صفر است'' AFTER `show_in_assets`',
|
|
|
|
|
'ALTER TABLE `products` ADD COLUMN `use_last_price_if_zero` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''استفاده از آخرین قیمت وقتی provider صفر است'''
|
|
|
|
|
),
|
|
|
|
|
'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 = 'use_last_price_if_zero') > 0,
|
|
|
|
|
'ALTER TABLE `products` MODIFY COLUMN `use_last_price_if_zero` TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''استفاده از آخرین قیمت وقتی provider صفر است''',
|
|
|
|
|
'SELECT ''skip products.use_last_price_if_zero modify'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
2026-06-10 09:49:35 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products — محدودیت مبلغ سفارش
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'order_limit_enabled') = 0,
|
|
|
|
|
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 `order_limit_enabled` TINYINT(1) NOT NULL DEFAULT 0 AFTER `percent_fee_buy`',
|
|
|
|
|
'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.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 = 'min_order_cash') = 0,
|
|
|
|
|
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 `min_order_cash` BIGINT UNSIGNED NULL DEFAULT NULL AFTER `order_limit_enabled`',
|
|
|
|
|
'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.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 = 'max_order_cash') = 0,
|
|
|
|
|
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 `max_order_cash` BIGINT UNSIGNED NULL DEFAULT NULL AFTER `min_order_cash`',
|
|
|
|
|
'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;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products.price_offset_percent
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'price_offset_percent') = 0,
|
|
|
|
|
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_offset_percent` DECIMAL(8,2) NOT NULL DEFAULT 0 AFTER `price_profit`',
|
|
|
|
|
'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;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- customers.total_referrals
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- orders — فیلدهای provider (Montzar و ...)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'orders') > 0
|
|
|
|
|
AND (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.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'orders') > 0
|
|
|
|
|
AND (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;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- withdraws — ستونهای اختیاری (روی بعضی سرورها دستی اضافه شده)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'withdraws') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'withdraws' AND COLUMN_NAME = 'type') = 0,
|
|
|
|
|
'ALTER TABLE `withdraws` ADD COLUMN `type` TINYINT UNSIGNED NULL DEFAULT NULL',
|
|
|
|
|
'SELECT ''skip withdraws.type'' 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 = 'withdraws') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'withdraws' AND COLUMN_NAME = 'note') = 0,
|
|
|
|
|
'ALTER TABLE `withdraws` ADD COLUMN `note` VARCHAR(255) NULL DEFAULT NULL',
|
|
|
|
|
'SELECT ''skip withdraws.note'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
2026-06-18 19:32:28 +03:30
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'withdraws') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'withdraws' AND COLUMN_NAME = 'extra_note') = 0,
|
|
|
|
|
'ALTER TABLE `withdraws` ADD COLUMN `extra_note` TEXT NULL DEFAULT NULL AFTER `note`',
|
|
|
|
|
'SELECT ''skip withdraws.extra_note'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
2026-06-10 09:49:35 +03:30
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'withdraws') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'withdraws' AND COLUMN_NAME = 'bank_account_id') = 0,
|
|
|
|
|
'ALTER TABLE `withdraws` ADD COLUMN `bank_account_id` INT UNSIGNED NULL DEFAULT NULL',
|
|
|
|
|
'SELECT ''skip withdraws.bank_account_id'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- logs.data → LONGTEXT (اگر جدول logs باشد)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'logs') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'logs' AND COLUMN_NAME = 'data') > 0,
|
|
|
|
|
'ALTER TABLE `logs` MODIFY COLUMN `data` LONGTEXT NULL',
|
|
|
|
|
'SELECT ''skip logs.data'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- settings.type (پنل ادمین — نوع فیلد)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'settings') > 0
|
|
|
|
|
AND (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(64) NULL DEFAULT NULL COMMENT ''نوع فیلد در پنل ادمین'' AFTER `description`',
|
|
|
|
|
'ALTER TABLE `settings` ADD COLUMN `type` VARCHAR(64) NULL DEFAULT NULL COMMENT ''نوع فیلد در پنل ادمین'''
|
|
|
|
|
),
|
|
|
|
|
'SELECT ''skip settings.type'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- settings — ردیف unit (بدون overwrite مقدار موجود)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
|
|
|
|
SELECT
|
|
|
|
|
'unit',
|
|
|
|
|
'',
|
|
|
|
|
'واحد وزن دارایی و معاملات',
|
|
|
|
|
1,
|
|
|
|
|
1,
|
|
|
|
|
'واحد نمایش وزن فلز در داراییها، کیف پول و تراکنشها|گرم,کیلوگرم',
|
|
|
|
|
'select'
|
|
|
|
|
FROM DUAL
|
|
|
|
|
WHERE EXISTS (
|
|
|
|
|
SELECT 1 FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'settings'
|
|
|
|
|
)
|
|
|
|
|
AND NOT EXISTS (
|
|
|
|
|
SELECT 1 FROM `settings` WHERE `key` = 'unit' LIMIT 1
|
|
|
|
|
);
|
|
|
|
|
|
2026-06-10 16:57:31 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- settings — main_wallet_products: محصولات متصل به کیف اصلی (غیرقابل ادیت در پنل)
|
|
|
|
|
-- موجودی این محصولات = gold کیف اصلی. خالی = غیرفعال (رفتار پیشفرض چندکیفه)
|
|
|
|
|
-- مثال گلد علی: UPDATE settings SET value='13,25' WHERE `key`='main_wallet_products';
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
|
|
|
|
|
SELECT
|
|
|
|
|
'main_wallet_products',
|
|
|
|
|
'',
|
|
|
|
|
'محصولات متصل به کیف اصلی',
|
|
|
|
|
0,
|
|
|
|
|
1,
|
|
|
|
|
'idهای محصول با کاما (مثل 13,25). موجودی این محصولات = gold کیف اصلی. خالی = غیرفعال'
|
|
|
|
|
FROM DUAL
|
|
|
|
|
WHERE EXISTS (
|
|
|
|
|
SELECT 1 FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'settings'
|
|
|
|
|
)
|
|
|
|
|
AND NOT EXISTS (
|
|
|
|
|
SELECT 1 FROM `settings` WHERE `key` = 'main_wallet_products' LIMIT 1
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
UPDATE `settings` SET `can_edit` = 0 WHERE `key` = 'main_wallet_products';
|
|
|
|
|
|
2026-07-04 22:06:20 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products — نوع هزینه خرید/فروش: نقدی (ریال) یا درصدی
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'cash_fee_buy_is_percent') = 0,
|
|
|
|
|
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_is_percent` TINYINT(1) NOT NULL DEFAULT 0 AFTER `cash_fee_buy`',
|
|
|
|
|
'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.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 = 'cash_fee_sell_is_percent') = 0,
|
|
|
|
|
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_is_percent` TINYINT(1) NOT NULL DEFAULT 0 AFTER `cash_fee_sell`',
|
|
|
|
|
'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;
|
|
|
|
|
|
2026-07-04 22:14:18 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products — cash_fee_buy/sell: INT → DECIMAL برای درصدهای اعشاری (مثل 0.5%)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'cash_fee_buy') > 0,
|
2026-07-05 21:15:24 +03:30
|
|
|
'ALTER TABLE `products` MODIFY COLUMN `cash_fee_buy` DECIMAL(14,4) NULL DEFAULT NULL',
|
2026-07-04 22:14:18 +03:30
|
|
|
'SELECT ''skip products.cash_fee_buy decimal'' 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 = 'products') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'cash_fee_sell') > 0,
|
2026-07-05 21:15:24 +03:30
|
|
|
'ALTER TABLE `products` MODIFY COLUMN `cash_fee_sell` DECIMAL(14,4) NULL DEFAULT NULL',
|
2026-07-04 22:14:18 +03:30
|
|
|
'SELECT ''skip products.cash_fee_sell decimal'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- products — اعشار برای درصد (مثلاً 0.5%) و مبالغ دقیق
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
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 = 'cash_fee_buy') > 0
|
|
|
|
|
AND (SELECT DATA_TYPE FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'cash_fee_buy' LIMIT 1) <> 'decimal',
|
2026-07-05 21:15:24 +03:30
|
|
|
'ALTER TABLE `products` MODIFY COLUMN `cash_fee_buy` DECIMAL(14,4) NULL DEFAULT NULL',
|
2026-07-04 22:14:18 +03:30
|
|
|
'SELECT ''skip products.cash_fee_buy decimal'' 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 = 'products') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'cash_fee_sell') > 0
|
|
|
|
|
AND (SELECT DATA_TYPE FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'cash_fee_sell' LIMIT 1) <> 'decimal',
|
2026-07-05 21:15:24 +03:30
|
|
|
'ALTER TABLE `products` MODIFY COLUMN `cash_fee_sell` DECIMAL(14,4) NULL DEFAULT NULL',
|
2026-07-04 22:14:18 +03:30
|
|
|
'SELECT ''skip products.cash_fee_sell decimal'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
2026-07-14 22:03:39 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- 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;
|
|
|
|
|
|
2026-08-18 22:23:20 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- price_triggers.product_id (هشدار قیمت روی محصول)
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.TABLES
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'price_triggers') > 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'price_triggers' AND COLUMN_NAME = 'product_id') = 0,
|
|
|
|
|
IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'price_triggers' AND COLUMN_NAME = 'customer_id') > 0,
|
|
|
|
|
'ALTER TABLE `price_triggers` ADD COLUMN `product_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT ''محصول هشدار'' AFTER `customer_id`',
|
|
|
|
|
'ALTER TABLE `price_triggers` ADD COLUMN `product_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT ''محصول هشدار'''
|
|
|
|
|
),
|
|
|
|
|
'SELECT ''skip price_triggers.product_id'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
|
|
|
|
SET @sql = IF(
|
|
|
|
|
(SELECT COUNT(*) FROM information_schema.STATISTICS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'price_triggers' AND INDEX_NAME = 'price_triggers_product_id_index') = 0
|
|
|
|
|
AND (SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
|
|
|
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'price_triggers' AND COLUMN_NAME = 'product_id') > 0,
|
|
|
|
|
'ALTER TABLE `price_triggers` ADD INDEX `price_triggers_product_id_index` (`product_id`)',
|
|
|
|
|
'SELECT ''skip price_triggers.product_id index'' AS info'
|
|
|
|
|
);
|
|
|
|
|
PREPARE stmt FROM @sql;
|
|
|
|
|
EXECUTE stmt;
|
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
2026-06-10 09:49:35 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
-- پایان — برای بورسمس (اختیاری، جدا اجرا کنید):
|
|
|
|
|
-- UPDATE `settings` SET `value` = 'کیلوگرم' WHERE `key` = 'unit';
|
2026-06-10 13:11:51 +03:30
|
|
|
--
|
|
|
|
|
-- بذر طلا — merge settings + const (modular + legacy):
|
|
|
|
|
-- SOURCE bazre_tala_settings_update.sql;
|
2026-07-14 22:03:39 +03:30
|
|
|
--
|
|
|
|
|
-- wallet کاملتر (title/unit/balance/...): SOURCE ensure_wallet_module_columns.sql;
|
2026-06-10 09:49:35 +03:30
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
SELECT 'deploy_safe_schema.sql finished' AS status;
|