From 67762e2a0eaebd6b5b5a289415f89926d72d735f Mon Sep 17 00:00:00 2001 From: adonis Date: Thu, 16 Jul 2026 17:29:18 +0330 Subject: [PATCH] fix bug 4 --- .../Controllers/Admin/WalletController.php | 117 +++++++++++++++--- app/Http/Controllers/Controller.php | 21 +++- .../Controllers/Customer/WalletController.php | 9 ++ 3 files changed, 123 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/Admin/WalletController.php b/app/Http/Controllers/Admin/WalletController.php index b445f3a..0c35c07 100644 --- a/app/Http/Controllers/Admin/WalletController.php +++ b/app/Http/Controllers/Admin/WalletController.php @@ -610,17 +610,98 @@ class WalletController extends Controller public function updateWithdraw(Request $request, $id) { - // پیدا کردن رکورد Withdraw با استفاده از شناسه - $withdraw = Withdraw::find($id); - // بررسی وجود رکورد + $withdraw = Withdraw::with(['Transaction.product', 'customer'])->find($id); if (!$withdraw) { return response()->json(['error' => 'Withdraw not found'], 404); } - $withdraw->sts = $request->sts; + + $newSts = (int) $request->sts; + $oldSts = (int) $withdraw->sts; + + if ( + Withdraw::isPhysicalWithdrawNote($withdraw->note) + && $newSts === 52 + && in_array($oldSts, [50, 51], true) + ) { + $this->refundPhysicalWithdrawGold($withdraw); + } + + $withdraw->sts = $newSts; $withdraw->save(); + + if ($withdraw->customer) { + $this->broadcastCustomerWalletAssets($withdraw->customer); + } + return response()->json(['message' => 'Withdraw updated successfully', 'withdraw' => $withdraw]); } + /** + * برگشت موجودی کسرشدهٔ برداشت فیزیکی هنگام لغو (sts=52). + */ + protected function refundPhysicalWithdrawGold(Withdraw $withdraw): void + { + $alreadyRefunded = Transaction::query() + ->where('withdraw_id', $withdraw->id) + ->where('note', 'like', '%لغو سند برداشت فیزیکی%') + ->exists(); + + if ($alreadyRefunded) { + return; + } + + $customer = $withdraw->customer ?: Customer::find($withdraw->customer_id); + if (!$customer) { + return; + } + + $assetSummaryService = app(AssetSummaryService::class); + + foreach ($withdraw->Transaction as $transaction) { + // فقط تراکنش‌های کسر (منفی) را برگردان — نه تراکنش‌های برگشت قبلی + $gold = (float) ($transaction->gold ?? 0); + if ($gold >= 0) { + continue; + } + + $amount = abs($gold); + if ($amount < 0.000001) { + continue; + } + + $product = $transaction->product; + $productId = (int) ($transaction->product_id ?? ($product->id ?? 0)); + if ($productId <= 0) { + continue; + } + + $effectiveProductId = $assetSummaryService->effectiveProductWalletIdForCustomer( + (int) $customer->id, + (int) $customer->type, + $productId + ); + + $walletInterface = new WalletInterface( + (int) $customer->id, + (int) $customer->type, + null, + $effectiveProductId + ); + + $title = $product->title ?? 'محصول'; + new TransactionInterface($walletInterface, [ + 'gold' => $amount, + 'number' => $transaction->number ?? null, + 'product_id' => $productId, + 'expire_at' => now(), + 'active' => true, + 'title' => "برگشت برداشت فیزیکی {$title}", + 'note' => "لغو سند برداشت فیزیکی شماره {$withdraw->id}", + 'withdraw_id' => $withdraw->id, + ], 6, true); + } + } + public function getWithdraw(Request $request, $id) { $withdraw = Withdraw::with(['customer', 'bank_account', 'Address', "Transaction"])->find($id); @@ -705,11 +786,9 @@ class WalletController extends Controller 'title' => (string) $product->title, 'wallet_id' => (int) $wallet->id, 'available' => $displayQty, - 'unit' => self::productQuantityUnit([ - 'unit' => $product->unit ?? null, - 'direct_price' => $product->direct_price ?? null, - 'group_type' => $product->group_type ?? null, - ]), + 'unit' => self::productQuantityUnit( + self::productUnitPayload($product) + ), 'is_main_wallet' => $representativeId !== null && (int) $product->id === $representativeId, ]; })->filter(function ($row) { @@ -851,8 +930,8 @@ class WalletController extends Controller continue; } - $tradeByQuantity = (bool) ($product->trade_by_quantity ?? false); - $minValue = $tradeByQuantity ? 1.0 : 0.001; + $isCountBased = self::isCountBasedProduct(self::productUnitPayload($product)); + $minValue = $isCountBased ? 1.0 : 0.001; if ($newValue < $minValue) { throw new UnprocessableEntityHttpException( @@ -860,7 +939,7 @@ class WalletController extends Controller ); } - if ($tradeByQuantity && abs($newValue - round($newValue)) > 0.000001) { + if ($isCountBased && abs($newValue - round($newValue)) > 0.000001) { throw new UnprocessableEntityHttpException( "مقدار {$product->title} باید عدد صحیح باشد" ); @@ -944,7 +1023,9 @@ class WalletController extends Controller (int) $product->id ) : 0.0; - $tradeByQuantity = (bool) ($product->trade_by_quantity ?? false); + $isCountBased = $product + ? self::isCountBasedProduct(self::productUnitPayload($product)) + : false; return [ 'transaction_id' => (int) $transaction->id, @@ -952,14 +1033,10 @@ class WalletController extends Controller 'current_value' => $current, 'available_add' => round((float) $availableAdd, 6), 'max_value' => round($current + (float) $availableAdd, 6), - 'min_value' => $tradeByQuantity ? 1 : 0.001, - 'allows_decimal' => !$tradeByQuantity, + 'min_value' => $isCountBased ? 1 : 0.001, + 'allows_decimal' => !$isCountBased, 'unit' => $product - ? self::productQuantityUnit([ - 'unit' => $product->unit ?? null, - 'direct_price' => $product->direct_price ?? null, - 'group_type' => $product->group_type ?? null, - ]) + ? self::productQuantityUnit(self::productUnitPayload($product)) : 'گرم', ]; })->values(); diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 5ea0dd5..5bbb3c3 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -492,10 +492,23 @@ class Controller extends BaseController return false; } + // معامله مقداری → نه تعدادی if (self::usesQuantityTrade($product)) { return false; } + // آبشده/کاتد همیشه وزنی است + if (self::isMeltedTradeGroup($product['group_type'] ?? null)) { + return false; + } + + // trade_by_quantity صراحتاً false/0 → تعدادی + // (حتی اگر unit=گرم فقط وزن هر عدد باشد) + if (array_key_exists('trade_by_quantity', $product) && $product['trade_by_quantity'] !== null) { + return true; + } + + // محصولات قدیمی بدون فلگ: واحد وزنی → مقداری if (self::isWeightBasedProductUnit($product['unit'] ?? null)) { return false; } @@ -594,15 +607,15 @@ class Controller extends BaseController public static function productQuantityUnit(?array $product): string { + if (self::isCountBasedProduct($product)) { + return 'عدد'; + } + $unit = trim((string) ($product['unit'] ?? '')); if ($unit !== '') { return $unit; } - if (self::isCountBasedProduct($product)) { - return 'عدد'; - } - return self::tradeWeightUnit(); } diff --git a/app/Http/Controllers/Customer/WalletController.php b/app/Http/Controllers/Customer/WalletController.php index 730244b..6127bad 100644 --- a/app/Http/Controllers/Customer/WalletController.php +++ b/app/Http/Controllers/Customer/WalletController.php @@ -507,6 +507,15 @@ class WalletController extends Controller ], 422); } + $requestValue = (float) $data['wallets'][$key]['value']; + if (Controller::isCountBasedProduct(Controller::productUnitPayload($walletProduct))) { + if (abs($requestValue - round($requestValue)) > 0.000001) { + return response()->json([ + 'message' => "برای {$walletProduct['title']} فقط تعداد صحیح مجاز است" + ], 422); + } + $data['wallets'][$key]['value'] = (int) round($requestValue); + } $data['wallets'][$key]['wallet_interface'] = new WalletInterface(auth('customer')->id(), auth('customer')->user()->type, null, $effectiveProductId); }