From 4dea2fb212f536a55bfef7dbfe376b56d702f773 Mon Sep 17 00:00:00 2001 From: adonis Date: Sat, 4 Jul 2026 12:06:56 +0330 Subject: [PATCH] fix amount --- .../Single/SingleOrderController.php | 51 ++++++++++++++++++- ...crease_orders_amount_decimal_precision.php | 17 +++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2026_07_04_000001_increase_orders_amount_decimal_precision.php diff --git a/app/Http/Controllers/Single/SingleOrderController.php b/app/Http/Controllers/Single/SingleOrderController.php index 5eed59f..b83867a 100644 --- a/app/Http/Controllers/Single/SingleOrderController.php +++ b/app/Http/Controllers/Single/SingleOrderController.php @@ -239,6 +239,19 @@ class SingleOrderController extends Controller $feeFromGold = $config->feeDeductFromGold(); $targetCash = $this->resolveTargetCash($data); $data['price'] += $data['difference']; + + if ($targetCash !== null) { + $data['amount'] = $this->resolveBuyAmountFromTargetCash( + $targetCash, + (float) $data['price'], + (float) ($data['service_charge_percentage'] ?? 0), + $feeFromGold, + isset($data['fee_free']) && $data['fee_free'] === true + ); + } else { + $data['amount'] = $this->normalizeGoldAmount((float) ($data['amount'] ?? 0)); + } + $data['total_price'] = $data['amount'] * $data['price']; $this->enforceProductOrderLimits($data, (float) $data['total_price']); @@ -256,6 +269,7 @@ class SingleOrderController extends Controller } else { $data['payment_amount'] = $data['total_price']; $data['amount'] -= $data['service_charge']; + $data['amount'] = $this->normalizeGoldAmount((float) $data['amount']); } if ($targetCash !== null) { @@ -441,7 +455,18 @@ class SingleOrderController extends Controller $response = []; $config = app(ConfigService::class); $feeFromGold = $config->feeDeductFromGold(); + $targetCash = $this->resolveTargetCash($data); $data['price'] -= $data['difference']; + + if ($targetCash !== null && $feeFromGold) { + $price = (float) $data['price']; + $data['amount'] = $price > 0 + ? $this->normalizeGoldAmount($targetCash / $price) + : 0.0; + } else { + $data['amount'] = $this->normalizeGoldAmount((float) ($data['amount'] ?? 0)); + } + $grossTotal = $data['amount'] * $data['price']; $this->enforceProductOrderLimits($data, (float) $grossTotal); $data['service_charge'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : $data['service_charge_percentage'] * $data['amount']; @@ -456,7 +481,6 @@ class SingleOrderController extends Controller $goldDebit = $data['amount']; } - $targetCash = $this->resolveTargetCash($data); if ($targetCash !== null) { $data['payment_amount'] = $targetCash; $data['total_price'] = $targetCash; @@ -893,6 +917,31 @@ class SingleOrderController extends Controller return $target > 0 ? $target : null; } + private function normalizeGoldAmount(float $amount): float + { + return round($amount, 10); + } + + private function resolveBuyAmountFromTargetCash( + int $targetCash, + float $unitPrice, + float $serviceChargePercentage, + bool $feeFromGold, + bool $feeFree + ): float { + if ($unitPrice <= 0 || $targetCash <= 0) { + return 0.0; + } + + $feeRate = $feeFree ? 0.0 : $serviceChargePercentage; + + if ($feeFromGold) { + return $this->normalizeGoldAmount($targetCash / ($unitPrice * (1 + $feeRate))); + } + + return $this->normalizeGoldAmount($targetCash / $unitPrice); + } + private function resolveGoldPaymentProductId(array $data): ?int { if (!empty($data['payment_product_id'])) { diff --git a/database/migrations/2026_07_04_000001_increase_orders_amount_decimal_precision.php b/database/migrations/2026_07_04_000001_increase_orders_amount_decimal_precision.php new file mode 100644 index 0000000..a873dfc --- /dev/null +++ b/database/migrations/2026_07_04_000001_increase_orders_amount_decimal_precision.php @@ -0,0 +1,17 @@ +