fix bug in 22/4

This commit is contained in:
2026-07-13 13:31:44 +03:30
parent 82691cdf2c
commit 7eb4650b80
4 changed files with 145 additions and 0 deletions
@@ -681,6 +681,28 @@ class ProductController extends SuperController
$data['override_trading_hours'] = !empty($data['override_trading_hours']);
}
if (!Product::hasPhysicalDeliveryColumns()) {
unset($data['has_physical_delivery'], $data['min_physical_delivery_grams']);
} else {
$hasDelivery = array_key_exists('has_physical_delivery', $data)
? filter_var($data['has_physical_delivery'], FILTER_VALIDATE_BOOLEAN)
: false;
$data['has_physical_delivery'] = $hasDelivery;
if (!$hasDelivery) {
$data['min_physical_delivery_grams'] = null;
} else {
$rawMin = $data['min_physical_delivery_grams'] ?? null;
$min = $this->normalizeCashFeeValue($rawMin);
if ($min <= 0) {
throw new UnprocessableEntityHttpException(
'برای فعال کردن تحویل فیزیکی باید حداقل گرم معتبر وارد شود'
);
}
$data['min_physical_delivery_grams'] = $min;
}
}
$data['cash_fee_buy'] = $this->normalizeCashFeeValue($data['cash_fee_buy'] ?? 0);
$data['cash_fee_sell'] = $this->normalizeCashFeeValue($data['cash_fee_sell'] ?? 0);
@@ -417,6 +417,16 @@ class WalletController extends Controller
return response()->json($Withdraw);
}
private function formatGramsNumber(float $value): string
{
$rounded = round($value, 3);
if (fmod($rounded, 1.0) === 0.0) {
return number_format($rounded, 0);
}
return rtrim(rtrim(number_format($rounded, 3, '.', ''), '0'), '.');
}
public function withdraw_physical(Request $request)
{
$data = $request->all();
@@ -456,6 +466,33 @@ class WalletController extends Controller
$availableGold = $assetSummaryService
->productDisplayQuantity($customerId, $ownerType, $productId);
// گیت تحویل فیزیکی per-product — سوییچ محصول و حداقل گرم
$walletProduct = $data['wallets'][$key]['wallet']['product'];
if (Product::hasPhysicalDeliveryColumns() && !$walletProduct->physicalDeliveryEnabled()) {
return response()->json([
'message' => "امکان تحویل فیزیکی برای {$walletProduct['title']} وجود ندارد"
], 422);
}
$minDeliveryGrams = Product::hasPhysicalDeliveryColumns()
? $walletProduct->minPhysicalDeliveryGrams()
: 0.0;
if ($minDeliveryGrams > 0) {
$card = $assetSummaryService->productInventoryCard($customerId, $ownerType, $productId);
$isCount = ($card['display_type'] ?? null) === 'count';
$unitWeight = (float) ($walletProduct['amount'] ?? 0);
$availableGrams = $isCount ? $availableGold * $unitWeight : $availableGold;
if ($availableGrams + 0.0001 < $minDeliveryGrams) {
$remaining = max(0, $minDeliveryGrams - $availableGrams);
return response()->json([
'message' => $this->formatGramsNumber($remaining)
. " گرم مانده تا رسیدن به حداقل تحویل فیزیکی "
. "{$walletProduct['title']}"
], 422);
}
}
if ($data['wallets'][$key]['value'] > $availableGold){
return response()->json([
'message' => "شما به اندازه کافی از {$data['wallets'][$key]['wallet']['product']['title']} ندارید"