diff --git a/app/Http/Controllers/Customer/OrderController.php b/app/Http/Controllers/Customer/OrderController.php index a17fc00..753bc29 100644 --- a/app/Http/Controllers/Customer/OrderController.php +++ b/app/Http/Controllers/Customer/OrderController.php @@ -8,7 +8,6 @@ use App\Http\Controllers\Single\SingleOrderController; use App\Models\Customer; use App\Models\Order; use App\Models\Price; -use App\Models\Setting; use App\Services\WalletBalanceService; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; @@ -55,8 +54,8 @@ class OrderController extends Controller return (int) $order->direction === 1 ? $profitPerMoment : -$profitPerMoment; }); - $feeSingle = (float) (Setting::where('key', 'fee_single')->value('value') ?? config('fee.single', 0)); - $currentPriceWithFee = $lastPrice + $feeSingle; + $buyFee = app(\App\Services\ConfigService::class)->displayBuyPriceDiffRial(); + $currentPriceWithFee = $lastPrice + $buyFee; $averagePriceWithFee = $averagePrice + $averageFee; return response()->json([ diff --git a/app/Http/Controllers/Single/SingleOrderController.php b/app/Http/Controllers/Single/SingleOrderController.php index 83cc986..7d11fc2 100644 --- a/app/Http/Controllers/Single/SingleOrderController.php +++ b/app/Http/Controllers/Single/SingleOrderController.php @@ -78,7 +78,7 @@ class SingleOrderController extends Controller $data['all_price'] = $latestPrice; $data['price'] = $basePrice; $data['price_id'] = $latestPrice?->id; - $data['difference'] = $config->orderPriceDiffRial(); + $data['difference'] = $config->orderPriceDiffRial(isset($data['direction']) ? (int) $data['direction'] : null); $data['service_charge_percentage'] = $config->orderServiceChargePercentage(); $fee_free = Setting::where('key', 'fee_free')->where('is_active', true)->value('value'); @@ -1265,8 +1265,8 @@ class SingleOrderController extends Controller /** * اختلاف قیمت سفارش: - * - محصول با «قیمت اپ»: اختلاف پایه تنظیمات (sell_fee/buy_fee/fee_single) + تب اختلاف محصول - * - بدون قیمت اپ: فقط تب اختلاف محصول (cash_fee) — بدون ۱M تنظیمات اپ + * - محصول با «قیمت اپ»: buy_fee / sell_fee + تب اختلاف محصول + * - بدون قیمت اپ: فقط تب اختلاف محصول (cash_fee) * * @return array{ * amount: float, @@ -1302,21 +1302,14 @@ class SingleOrderController extends Controller $keys = []; if ($usesAppPrice) { - $feeSingle = (float) $config->get('fee_single', 0); if ($isBuy) { - $buyFee = (float) $config->get('buy_fee', $feeSingle); - $settingsAmt = $buyFee > 0 ? $buyFee : $feeSingle; - $settingsKey = $buyFee > 0 ? 'buy_fee' : 'fee_single'; - $settingsTitle = $buyFee > 0 - ? 'اختلاف پایه اپ · اضافه قیمت خرید (buy_fee)' - : 'اختلاف پایه اپ · اختلاف پایه (fee_single)'; + $settingsAmt = $config->displayBuyPriceDiffRial(); + $settingsKey = 'buy_fee'; + $settingsTitle = 'اختلاف پایه اپ · اضافه قیمت خرید (buy_fee)'; } else { - $sellFee = (float) $config->get('sell_fee', $feeSingle); - $settingsAmt = $sellFee > 0 ? $sellFee : $feeSingle; - $settingsKey = $sellFee > 0 ? 'sell_fee' : 'fee_single'; - $settingsTitle = $sellFee > 0 - ? 'اختلاف پایه اپ · کسر قیمت فروش (sell_fee)' - : 'اختلاف پایه اپ · اختلاف پایه (fee_single)'; + $settingsAmt = $config->displaySellPriceDiffRial(); + $settingsKey = 'sell_fee'; + $settingsTitle = 'اختلاف پایه اپ · کسر قیمت فروش (sell_fee)'; } if ($settingsAmt > 0) { diff --git a/app/Http/Controllers/Site/ReportController.php b/app/Http/Controllers/Site/ReportController.php index 4299330..d9abe5d 100644 --- a/app/Http/Controllers/Site/ReportController.php +++ b/app/Http/Controllers/Site/ReportController.php @@ -51,7 +51,7 @@ class ReportController extends Controller public function updatePrise() { - $difference = (float) (Setting::where('key', 'fee_single')->value('value') ?? config('fee.single', 0)); + $config = app(ConfigService::class); $lastPrice = Price::latest()->first(); if (!$lastPrice) { @@ -60,9 +60,12 @@ class ReportController extends Controller $PriceTriggers = PriceTrigger::where("is_active", true)->get(); foreach ($PriceTriggers as $PriceTrigger) { + $diff = $PriceTrigger->dirction == 1 + ? $config->displaySellPriceDiffRial() + : ($PriceTrigger->dirction == 2 ? $config->displayBuyPriceDiffRial() : 0.0); $priseGold = $PriceTrigger->dirction == 1 - ? $lastPrice->price - $difference - : ($PriceTrigger->dirction == 2 ? $lastPrice->price + $difference : $lastPrice->price); + ? $lastPrice->price - $diff + : ($PriceTrigger->dirction == 2 ? $lastPrice->price + $diff : $lastPrice->price); if (eval('return $priseGold ' . $PriceTrigger->price_condition . ' $PriceTrigger->target_price;')) { $customer = Customer::find($PriceTrigger->customer_id); diff --git a/app/Models/Order.php b/app/Models/Order.php index b6e6f99..4c019e8 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -24,7 +24,7 @@ class Order extends Model 'fee',//سود هر گرم 'total_fee',//سود کل 'fee_source',//settings|product|app+product|none - 'fee_source_key',//sell_fee|buy_fee|fee_single|cash_fee_sell|... + 'fee_source_key',//sell_fee|buy_fee|cash_fee_sell|... 'fee_source_label', 'fee_breakdown',//فاکتور اقلام سود (JSON) 'service_charge_percentage',//درصد کارمزد diff --git a/app/Services/BalanceReportService.php b/app/Services/BalanceReportService.php index f0af36d..fe2f877 100644 --- a/app/Services/BalanceReportService.php +++ b/app/Services/BalanceReportService.php @@ -773,8 +773,8 @@ class BalanceReportService } if ($source === 'settings') { return $direction === 2 - ? 'تنظیمات سراسری (sell_fee / fee_single)' - : 'تنظیمات سراسری (buy_fee / fee_single)'; + ? 'تنظیمات سراسری (sell_fee)' + : 'تنظیمات سراسری (buy_fee)'; } return $direction === 2 diff --git a/app/Services/ConfigService.php b/app/Services/ConfigService.php index 4530186..0b9671a 100644 --- a/app/Services/ConfigService.php +++ b/app/Services/ConfigService.php @@ -101,38 +101,35 @@ class ConfigService return $fromDb !== '' ? $fromDb : (string) env('NODE_SHARED_SECRET', ''); } - /** اختلاف خرید نمایش (/api/price/last) — fee_single / buy_fee */ + /** اختلاف خرید نمایش (/api/price/last) — فقط buy_fee (صفر یعنی بدون اختلاف) */ public function displayBuyPriceDiffRial(): float { - $feeSingle = (float) $this->get('fee_single', 0); - $buyFee = (float) $this->get('buy_fee', $feeSingle); + $raw = $this->getString('buy_fee', ''); - return $buyFee > 0 ? $buyFee : $feeSingle; + return $raw === '' ? 0.0 : (float) $raw; } - /** اختلاف فروش نمایش — fee_single / sell_fee */ + /** اختلاف فروش نمایش — فقط sell_fee (صفر یعنی بدون اختلاف) */ public function displaySellPriceDiffRial(): float { - $feeSingle = (float) $this->get('fee_single', 0); - $sellFee = (float) $this->get('sell_fee', $feeSingle); + $raw = $this->getString('sell_fee', ''); - return $sellFee > 0 ? $sellFee : $feeSingle; + return $raw === '' ? 0.0 : (float) $raw; } - /** اختلاف ریالی سفارش — fee_single، بعد fee_cash (legacy)، بعد config/fee.php */ - public function orderPriceDiffRial(): float + /** + * اختلاف ریالی سفارش — فقط buy_fee / sell_fee بر اساس جهت. + * fee_single دیگر منبع نیست. + * + * @param int|null $direction 1=خرید، 2=فروش، null=خرید (برای سازگاری) + */ + public function orderPriceDiffRial(?int $direction = null): float { - $feeSingle = $this->getString('fee_single', ''); - if ($feeSingle !== '') { - return (float) $feeSingle; + if ($direction === 2) { + return $this->displaySellPriceDiffRial(); } - $legacyCash = $this->getString('fee_cash', ''); - if ($legacyCash !== '') { - return (float) $legacyCash; - } - - return (float) config('fee.single', 0); + return $this->displayBuyPriceDiffRial(); } /** درصد کارمزد سفارش — fee_service_charge_percentage، service_charge_percentage، config/fee.php */ @@ -172,7 +169,6 @@ class ConfigService ): array { $diffBuy = (float) $this->displayBuyPriceDiffRial(); $diffSell = (float) $this->displaySellPriceDiffRial(); - $feeSingle = (float) $this->get('fee_single', 0); $openBuy = true; $openSell = true; @@ -191,16 +187,9 @@ class ConfigService return compact('sell', 'buy', 'priceLast'); } - $sell = $openSell ? (int) ceil($priceValue - $feeSingle) : 0; - $buy = $openBuy ? (int) ceil($priceValue + $feeSingle) : 0; - $priceLast = (int) ceil($priceValue + $feeSingle); - - $provider = $this->priceProvider(); - if (in_array($provider, ['main_product', 'zaarbox'], true)) { - $sell = $openSell ? (int) ceil($priceValue - $diffSell) : 0; - $buy = $openBuy ? (int) ceil($priceValue + $diffBuy) : 0; - $priceLast = (int) ceil($priceValue + $diffBuy); - } + $sell = $openSell ? (int) ceil($priceValue - $diffSell) : 0; + $buy = $openBuy ? (int) ceil($priceValue + $diffBuy) : 0; + $priceLast = (int) ceil($priceValue + $diffBuy); return compact('sell', 'buy', 'priceLast'); } diff --git a/database/sql/deploy_settings_const.sql b/database/sql/deploy_settings_const.sql index bd156d6..dc976ed 100644 --- a/database/sql/deploy_settings_const.sql +++ b/database/sql/deploy_settings_const.sql @@ -754,9 +754,7 @@ INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `de SELECT 'referral_id', 'required', 'کد معرف اجباری', 1, 1, 'روشن = اجباری در ثبت‌نام | خاموش = اختیاری', 'switch' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'referral_id' LIMIT 1); -INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'fee_single', '500000', 'اختلاف پایه نمایش', 0, 1, NULL, 'price' -WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'fee_single' LIMIT 1); +-- fee_single حذف شد — اختلاف فقط buy_fee / sell_fee (خالی = صفر) INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) SELECT 'buy_fee', '', 'سود خرید نمایش', 1, 1, NULL, 'price' @@ -865,9 +863,6 @@ WHERE `key` = 'zaarbox_api_url'; UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'شناسه ردیف Zaarbox') WHERE `key` = 'zaarbox_price_key'; -UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'اختلاف پایه نمایش') -WHERE `key` = 'fee_single'; - UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'سود خرید نمایش') WHERE `key` = 'buy_fee'; @@ -980,7 +975,7 @@ UPDATE `settings` SET `type` = 'switch' WHERE `key` IN ( -- price (مبالغ ریالی) UPDATE `settings` SET `type` = 'price' WHERE `key` IN ( - 'fee_single', 'buy_fee', 'sell_fee', + 'buy_fee', 'sell_fee', 'min_withdraw', 'min_deposit', 'min_first_buy', 'minimum_sell', 'up_price', 'down_price' ); @@ -1127,6 +1122,7 @@ DELETE FROM `settings` WHERE `key` IN ( 'name_en', 'bace_url', 'server_url', 'key', 'color_primary', 'color_secondary', 'price_from_nasiryan', 'montzar_price', + 'fee_single', 'goldir_base_url', 'fee_cash', 'default_vc_number', 'payping_gateway_item', 'wss_path', 'wss_link', 'wss_trigger_path', 'wss_trigger_host', 'wss_trigger_scheme', 'wss_http_port', 'wss_socket_port' @@ -1307,9 +1303,8 @@ UPDATE `settings` SET `description` = 'روشن: بعد از انتخاب محص UPDATE `settings` SET `description` = 'روشن: خارج از بازه «ساعت شروع» تا «ساعت پایان» معامله و نمایش قیمت بسته می‌شود. خاموش: محدودیت ساعتی سراسری اعمال نمی‌شود.' WHERE `key` = 'close_price'; UPDATE `settings` SET `description` = 'ساعت شروع فعالیت روزانه. فقط وقتی «بستن خودکار خارج از ساعت کاری» روشن باشد اعمال می‌شود (مثلاً ۰۹:۰۰).' WHERE `key` = 'startDay'; UPDATE `settings` SET `description` = 'ساعت پایان فعالیت روزانه. فقط وقتی «بستن خودکار خارج از ساعت کاری» روشن باشد اعمال می‌شود (مثلاً ۲۲:۰۰).' WHERE `key` = 'endDay'; -UPDATE `settings` SET `description` = 'اختلاف پایه (ریال) بین قیمت خرید و فروش روی مظنه. معمولاً نصف مجموع اختلاف قیمت خرید و فروش است.' WHERE `key` = 'fee_single'; -UPDATE `settings` SET `description` = 'مبلغ اضافه (ریال) روی قیمت پایه برای سمت خرید. خالی = استفاده از «اختلاف پایه».' WHERE `key` = 'buy_fee'; -UPDATE `settings` SET `description` = 'مبلغ کسر (ریال) از قیمت پایه برای سمت فروش. خالی = استفاده از «اختلاف پایه».' WHERE `key` = 'sell_fee'; +UPDATE `settings` SET `description` = 'مبلغ اضافه (ریال) روی قیمت پایه برای سمت خرید. خالی یا صفر = بدون اختلاف.' WHERE `key` = 'buy_fee'; +UPDATE `settings` SET `description` = 'مبلغ کسر (ریال) از قیمت پایه برای سمت فروش. خالی یا صفر = بدون اختلاف.' WHERE `key` = 'sell_fee'; UPDATE `settings` SET `description` = 'درصد کارمزد هر سفارش از مبلغ معامله (اعشاری؛ مثلاً ۰٫۰۰۵ یعنی نیم در هزار).' WHERE `key` = 'fee_service_charge_percentage'; UPDATE `settings` SET `title_fa` = 'اعمال مبلغ دقیق در معامله مشتری', @@ -1529,7 +1524,6 @@ UPDATE `settings` SET `title_fa` = 'کارمزد (قدیمی — درصد)' WHER UPDATE `settings` SET `title_fa` = 'تعداد سفارش اول بدون کارمزد' WHERE `key` = 'fee_free'; UPDATE `settings` SET `title_fa` = 'درصد کارمزد سفارش' WHERE `key` = 'fee_service_charge_percentage'; UPDATE `settings` SET `title_fa` = 'اعمال مبلغ دقیق در معامله مشتری' WHERE `key` = 'fee_deduct_from_gold'; -UPDATE `settings` SET `title_fa` = 'اختلاف پایه نمایش' WHERE `key` = 'fee_single'; UPDATE `settings` SET `title_fa` = 'پاداش معرف‌شونده' WHERE `key` = 'gift_for_referral'; UPDATE `settings` SET `title_fa` = 'پاداش معرف' WHERE `key` = 'gift_for_referrer'; UPDATE `settings` SET `title_fa` = 'پیامک گروهی' WHERE `key` = 'group_sms'; @@ -1647,7 +1641,6 @@ UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN ( 'chart_id', 'chart_use_local_data', 'external_order_api_enabled', 'fee_deduct_from_gold', - 'fee_single', 'referral_bonus_amount', 'group_sms', 'customer_direct_sms', @@ -1723,7 +1716,7 @@ UPDATE `settings` SET `can_edit` = 1 WHERE `key` IN ( -- تفکیک نهایی type (بعد از همه batchها — override روی دیتابیس موجود) UPDATE `settings` SET `type` = 'price' WHERE `key` IN ( - 'fee_single', 'buy_fee', 'sell_fee', + 'buy_fee', 'sell_fee', 'min_withdraw', 'min_deposit', 'min_first_buy', 'minimum_sell', 'up_price', 'down_price' ); diff --git a/database/sql/deploy_settings_const_preserve_value_sync_can_edit.sql b/database/sql/deploy_settings_const_preserve_value_sync_can_edit.sql index d5f157b..b012a6b 100644 --- a/database/sql/deploy_settings_const_preserve_value_sync_can_edit.sql +++ b/database/sql/deploy_settings_const_preserve_value_sync_can_edit.sql @@ -627,9 +627,7 @@ INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `de SELECT 'referral_id', 'required', 'کد معرف اجباری', 1, 1, 'روشن = اجباری در ثبت‌نام | خاموش = اختیاری', 'switch' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'referral_id' LIMIT 1); -INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'fee_single', '500000', 'اختلاف پایه نمایش', 0, 1, NULL, 'price' -WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'fee_single' LIMIT 1); +-- fee_single حذف شد — اختلاف فقط buy_fee / sell_fee (خالی = صفر) INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) SELECT 'buy_fee', '', 'سود خرید نمایش', 1, 1, NULL, 'price' @@ -738,9 +736,6 @@ WHERE `key` = 'zaarbox_api_url'; UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'شناسه ردیف Zaarbox') WHERE `key` = 'zaarbox_price_key'; -UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'اختلاف پایه نمایش') -WHERE `key` = 'fee_single'; - UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'سود خرید نمایش') WHERE `key` = 'buy_fee'; @@ -850,7 +845,7 @@ UPDATE `settings` SET `type` = 'switch' WHERE `key` IN ( -- price (مبالغ ریالی) UPDATE `settings` SET `type` = 'price' WHERE `key` IN ( - 'fee_single', 'buy_fee', 'sell_fee', + 'buy_fee', 'sell_fee', 'min_withdraw', 'min_deposit', 'min_first_buy', 'minimum_sell', 'up_price', 'down_price' ); @@ -973,6 +968,7 @@ DELETE FROM `settings` WHERE `key` IN ( 'name_en', 'bace_url', 'server_url', 'key', 'color_primary', 'color_secondary', 'price_from_nasiryan', 'montzar_price', + 'fee_single', 'goldir_base_url', 'fee_cash', 'default_vc_number', @@ -1194,9 +1190,8 @@ UPDATE `settings` SET `description` = 'روشن: بعد از انتخاب محص UPDATE `settings` SET `description` = 'روشن: خارج از بازه «ساعت شروع» تا «ساعت پایان» معامله و نمایش قیمت بسته می‌شود. خاموش: محدودیت ساعتی سراسری اعمال نمی‌شود.' WHERE `key` = 'close_price'; UPDATE `settings` SET `description` = 'ساعت شروع فعالیت روزانه. فقط وقتی «بستن خودکار خارج از ساعت کاری» روشن باشد اعمال می‌شود (مثلاً ۰۹:۰۰).' WHERE `key` = 'startDay'; UPDATE `settings` SET `description` = 'ساعت پایان فعالیت روزانه. فقط وقتی «بستن خودکار خارج از ساعت کاری» روشن باشد اعمال می‌شود (مثلاً ۲۲:۰۰).' WHERE `key` = 'endDay'; -UPDATE `settings` SET `description` = 'اختلاف پایه (ریال) بین قیمت خرید و فروش روی مظنه. معمولاً نصف مجموع اختلاف قیمت خرید و فروش است.' WHERE `key` = 'fee_single'; -UPDATE `settings` SET `description` = 'مبلغ اضافه (ریال) روی قیمت پایه برای سمت خرید. خالی = استفاده از «اختلاف پایه».' WHERE `key` = 'buy_fee'; -UPDATE `settings` SET `description` = 'مبلغ کسر (ریال) از قیمت پایه برای سمت فروش. خالی = استفاده از «اختلاف پایه».' WHERE `key` = 'sell_fee'; +UPDATE `settings` SET `description` = 'مبلغ اضافه (ریال) روی قیمت پایه برای سمت خرید. خالی یا صفر = بدون اختلاف.' WHERE `key` = 'buy_fee'; +UPDATE `settings` SET `description` = 'مبلغ کسر (ریال) از قیمت پایه برای سمت فروش. خالی یا صفر = بدون اختلاف.' WHERE `key` = 'sell_fee'; UPDATE `settings` SET `description` = 'درصد کارمزد هر سفارش از مبلغ معامله (اعشاری؛ مثلاً ۰٫۰۰۵ یعنی نیم در هزار).' WHERE `key` = 'fee_service_charge_percentage'; UPDATE `settings` SET `title_fa` = 'اعمال مبلغ دقیق در معامله مشتری', @@ -1354,7 +1349,6 @@ UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN ( 'bale_bot_token', 'chart_id', 'chart_use_local_data', 'external_order_api_enabled', - 'fee_single', 'referral_bonus_amount', 'group_sms', 'customer_direct_sms', @@ -1426,7 +1420,7 @@ UPDATE `settings` SET `title_fa` = 'حداقل واریز کیف پول (ریا -- تفکیک نهایی type (بعد از همه batchها — override روی دیتابیس موجود) UPDATE `settings` SET `type` = 'price' WHERE `key` IN ( - 'fee_single', 'buy_fee', 'sell_fee', + 'buy_fee', 'sell_fee', 'min_withdraw', 'min_deposit', 'min_first_buy', 'minimum_sell', 'up_price', 'down_price' );