fix bug 4
This commit is contained in:
@@ -610,17 +610,98 @@ class WalletController extends Controller
|
|||||||
|
|
||||||
public function updateWithdraw(Request $request, $id)
|
public function updateWithdraw(Request $request, $id)
|
||||||
{
|
{
|
||||||
// پیدا کردن رکورد Withdraw با استفاده از شناسه
|
$withdraw = Withdraw::with(['Transaction.product', 'customer'])->find($id);
|
||||||
$withdraw = Withdraw::find($id);
|
|
||||||
// بررسی وجود رکورد
|
|
||||||
if (!$withdraw) {
|
if (!$withdraw) {
|
||||||
return response()->json(['error' => 'Withdraw not found'], 404);
|
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();
|
$withdraw->save();
|
||||||
|
|
||||||
|
if ($withdraw->customer) {
|
||||||
|
$this->broadcastCustomerWalletAssets($withdraw->customer);
|
||||||
|
}
|
||||||
|
|
||||||
return response()->json(['message' => 'Withdraw updated successfully', 'withdraw' => $withdraw]);
|
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)
|
public function getWithdraw(Request $request, $id)
|
||||||
{
|
{
|
||||||
$withdraw = Withdraw::with(['customer', 'bank_account', 'Address', "Transaction"])->find($id);
|
$withdraw = Withdraw::with(['customer', 'bank_account', 'Address', "Transaction"])->find($id);
|
||||||
@@ -705,11 +786,9 @@ class WalletController extends Controller
|
|||||||
'title' => (string) $product->title,
|
'title' => (string) $product->title,
|
||||||
'wallet_id' => (int) $wallet->id,
|
'wallet_id' => (int) $wallet->id,
|
||||||
'available' => $displayQty,
|
'available' => $displayQty,
|
||||||
'unit' => self::productQuantityUnit([
|
'unit' => self::productQuantityUnit(
|
||||||
'unit' => $product->unit ?? null,
|
self::productUnitPayload($product)
|
||||||
'direct_price' => $product->direct_price ?? null,
|
),
|
||||||
'group_type' => $product->group_type ?? null,
|
|
||||||
]),
|
|
||||||
'is_main_wallet' => $representativeId !== null && (int) $product->id === $representativeId,
|
'is_main_wallet' => $representativeId !== null && (int) $product->id === $representativeId,
|
||||||
];
|
];
|
||||||
})->filter(function ($row) {
|
})->filter(function ($row) {
|
||||||
@@ -851,8 +930,8 @@ class WalletController extends Controller
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tradeByQuantity = (bool) ($product->trade_by_quantity ?? false);
|
$isCountBased = self::isCountBasedProduct(self::productUnitPayload($product));
|
||||||
$minValue = $tradeByQuantity ? 1.0 : 0.001;
|
$minValue = $isCountBased ? 1.0 : 0.001;
|
||||||
|
|
||||||
if ($newValue < $minValue) {
|
if ($newValue < $minValue) {
|
||||||
throw new UnprocessableEntityHttpException(
|
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(
|
throw new UnprocessableEntityHttpException(
|
||||||
"مقدار {$product->title} باید عدد صحیح باشد"
|
"مقدار {$product->title} باید عدد صحیح باشد"
|
||||||
);
|
);
|
||||||
@@ -944,7 +1023,9 @@ class WalletController extends Controller
|
|||||||
(int) $product->id
|
(int) $product->id
|
||||||
)
|
)
|
||||||
: 0.0;
|
: 0.0;
|
||||||
$tradeByQuantity = (bool) ($product->trade_by_quantity ?? false);
|
$isCountBased = $product
|
||||||
|
? self::isCountBasedProduct(self::productUnitPayload($product))
|
||||||
|
: false;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'transaction_id' => (int) $transaction->id,
|
'transaction_id' => (int) $transaction->id,
|
||||||
@@ -952,14 +1033,10 @@ class WalletController extends Controller
|
|||||||
'current_value' => $current,
|
'current_value' => $current,
|
||||||
'available_add' => round((float) $availableAdd, 6),
|
'available_add' => round((float) $availableAdd, 6),
|
||||||
'max_value' => round($current + (float) $availableAdd, 6),
|
'max_value' => round($current + (float) $availableAdd, 6),
|
||||||
'min_value' => $tradeByQuantity ? 1 : 0.001,
|
'min_value' => $isCountBased ? 1 : 0.001,
|
||||||
'allows_decimal' => !$tradeByQuantity,
|
'allows_decimal' => !$isCountBased,
|
||||||
'unit' => $product
|
'unit' => $product
|
||||||
? self::productQuantityUnit([
|
? self::productQuantityUnit(self::productUnitPayload($product))
|
||||||
'unit' => $product->unit ?? null,
|
|
||||||
'direct_price' => $product->direct_price ?? null,
|
|
||||||
'group_type' => $product->group_type ?? null,
|
|
||||||
])
|
|
||||||
: 'گرم',
|
: 'گرم',
|
||||||
];
|
];
|
||||||
})->values();
|
})->values();
|
||||||
|
|||||||
@@ -492,10 +492,23 @@ class Controller extends BaseController
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// معامله مقداری → نه تعدادی
|
||||||
if (self::usesQuantityTrade($product)) {
|
if (self::usesQuantityTrade($product)) {
|
||||||
return false;
|
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)) {
|
if (self::isWeightBasedProductUnit($product['unit'] ?? null)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -594,15 +607,15 @@ class Controller extends BaseController
|
|||||||
|
|
||||||
public static function productQuantityUnit(?array $product): string
|
public static function productQuantityUnit(?array $product): string
|
||||||
{
|
{
|
||||||
|
if (self::isCountBasedProduct($product)) {
|
||||||
|
return 'عدد';
|
||||||
|
}
|
||||||
|
|
||||||
$unit = trim((string) ($product['unit'] ?? ''));
|
$unit = trim((string) ($product['unit'] ?? ''));
|
||||||
if ($unit !== '') {
|
if ($unit !== '') {
|
||||||
return $unit;
|
return $unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self::isCountBasedProduct($product)) {
|
|
||||||
return 'عدد';
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::tradeWeightUnit();
|
return self::tradeWeightUnit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -507,6 +507,15 @@ class WalletController extends Controller
|
|||||||
], 422);
|
], 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);
|
$data['wallets'][$key]['wallet_interface'] = new WalletInterface(auth('customer')->id(), auth('customer')->user()->type, null, $effectiveProductId);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user