From c7ca410b3148d3a519bb8f77f0a5fc2d77b13f06 Mon Sep 17 00:00:00 2001 From: adonis Date: Sun, 6 Sep 2026 13:40:52 +0330 Subject: [PATCH] fix(wallet): allow discharging leftover fractional count-product gold Admin charge can now wipe the exact remaining balance when a count product has a leftover decimal amount. Co-authored-by: Cursor --- app/Http/Controllers/Admin/WalletController.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/WalletController.php b/app/Http/Controllers/Admin/WalletController.php index f3519ea..fcabfc2 100644 --- a/app/Http/Controllers/Admin/WalletController.php +++ b/app/Http/Controllers/Admin/WalletController.php @@ -560,10 +560,6 @@ class WalletController extends Controller $deposit = $value > 0; $payload = Controller::productUnitPayload($product); - if (Controller::isCountBasedProduct($payload) && abs($value - round($value)) > 0.000001) { - throw new UnprocessableEntityHttpException('برای محصول تعدادی فقط عدد صحیح مجاز است'); - } - $isMainWalletProduct = Controller::isMainWalletProduct($productId); if (!$deposit && $isMainWalletProduct) { $this->consolidateOrphanedMainWalletGold((int) $customer->id, (int) $customer->type); @@ -577,6 +573,18 @@ class WalletController extends Controller $effectiveProductId ); $wallet = $wallet_interface->wallet; + $availableGold = is_null($wallet) ? 0.0 : (float) $wallet->gold; + $wipingRemainder = !$deposit + && $availableGold > 0 + && abs($availableGold - abs($value)) <= 1e-6; + + if ( + Controller::isCountBasedProduct($payload) + && abs($value - round($value)) > 0.000001 + && ! $wipingRemainder + ) { + throw new UnprocessableEntityHttpException('برای محصول تعدادی فقط عدد صحیح مجاز است'); + } if (!$deposit) { $available = is_null($wallet) ? 0.0 : (float) $wallet->gold;