Widen order price columns so current gold rial quotes persist.

Gold gram prices now exceed the old DECIMAL/INT range and MySQL 1264 aborted buys; store money fields as DECIMAL(20,4) and hide the raw SQL error from the app.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-31 16:14:02 +03:30
co-authored by Cursor
parent 5537cd7086
commit 4c2200a0e0
4 changed files with 251 additions and 0 deletions
+13
View File
@@ -37,5 +37,18 @@ class Handler extends ExceptionHandler
$this->reportable(function (Throwable $e) {
//
});
$this->renderable(function (\Illuminate\Database\QueryException $e, $request) {
if ((int) ($e->errorInfo[1] ?? 0) !== 1264) {
return null;
}
if (! $request->expectsJson()) {
return null;
}
return response()->json([
'message' => 'ثبت سفارش به‌خاطر محدودیت فیلد قیمت ممکن نشد. لطفاً دوباره تلاش کنید.',
], 422);
});
}
}
@@ -1801,6 +1801,30 @@ class SingleOrderController extends Controller
$data['_fee_uses_app_price'],
$data['_fee_base_price']
);
$this->roundOrderMoneyFields($data);
}
/** اعداد پولی سفارش را قبل از INSERT گرد کن تا با DECIMAL(20,4) سازگار باشد. */
private function roundOrderMoneyFields(array &$data): void
{
foreach ([
'price',
'price_original',
'total_price',
'total_price_original',
'total_price_liman',
'fee',
'total_fee',
'service_charge_price',
'payment_amount',
'payment_remind',
] as $key) {
if (!isset($data[$key]) || !is_numeric($data[$key])) {
continue;
}
$data[$key] = round((float) $data[$key], 4);
}
}
private function bonusGift($customer, $referrer)