#P1744
PATCH /v2/core/hub/reservation/refund
Hub: Process Reservation Refund
این اندپوینت برای انجام عملیات استرداد (Refund) یک رزرو ثبتشده در سیستم هاب استفاده میشود. فرآیند شامل محاسبه مبلغ جریمه (به صورت درصدی یا مبلغ ثابت)، ثبت مبلغ قابل بازگشت به عنوان یک تراکنش بستانکار در کیف پول شعبه، و در نهایت بهروزرسانی وضعیت رزرو به "استرداد شده" است.
Request Overview
URL:
/v2/core/hub/reservation/refundMethod: PATCH
Controller: HubController@hubRefund
Middleware: authWithJwt
Access Control
- نیاز به توکن احراز هویت (JWT) دارد.
Request Body Parameters
| Field | Type | Description |
|---|---|---|
| id | integer | (الزامی) شناسه (ID) رزروی که باید استرداد شود. |
| value_type | string | (الزامی) نوع محاسبه جریمه. مقادیر مجاز:
|
| value | numeric | (الزامی) مقدار جریمه. اگر value_type برابر 'percent' باشد، این مقدار درصد است (مثلاً 10 برای ۱۰٪). در غیر این صورت، این مقدار مبلغ ریالی جریمه است. |
| description | string | (اختیاری) توضیحات اضافی که به انتهای توضیحات پیشفرض تراکنش کیف پول اضافه میشود. |
Logic Details
فرآیند استرداد در کنترلر به صورت گامبهگام زیر انجام میشود:
- یافتن رزرو:
- سیستم با استفاده از
idارسال شده، در جدولhub_reservationجستجو میکند تا رکورد رزرو مورد نظر را پیدا کند.
- سیستم با استفاده از
- محاسبه جریمه (Penalty):
- اگر
value_typeدر درخواست برابر با'percent'باشد، مبلغ جریمه از فرمول زیر محاسبه میشود:$penalty = ($reservation->buy * $request->value) / 100 - در غیر این صورت، مقدار
valueارسالی مستقیماً به عنوان مبلغ ثابت جریمه در نظر گرفته میشود.
- اگر
- ایجاد تراکنش کیف پول (Wallet Transaction):
- یک رکورد جدید برای درج در جدول
walletآماده میشود: - Mبلغ بستانکاری (credit): برابر است با مبلغ خرید اولیه رزرو منهای جریمه محاسبهشده (
$reservation->buy - $penalty). - توضیحات (description): یک رشته توصیفی به صورت خودکار ساخته میشود که شامل شناسه رزرو، مبلغ جریمه، و توضیحات اختیاری ارسال شده در درخواست است.
- این رکورد در جدول
walletدرج میشود و اعتبار به حساب شعبه بازمیگردد.
- یک رکورد جدید برای درج در جدول
- بهروزرسانی وضعیت رزرو:
- رکورد اصلی رزرو در جدول
hub_reservationبهروزرسانی میشود: - فیلد
refund_penaltyبا مبلغ جریمه محاسبهشده پر میشود. - فیلد
statusبه مقدار ثابت ۴ (به معنای استرداد شده) تغییر میکند. - فیلد
updated_atبا زمان فعلی بهروز میشود.
- رکورد اصلی رزرو در جدول
Response Structure
پاسخ موفق
- Status Code:
201 Created - Body: Empty (بدون محتوا).
پاسخ خطا
- Status Code:
400 Bad Request - این خطا زمانی رخ میدهد که رزروی با
idارسال شده پیدا نشود.
{
"error": {
"code": 1000,
"message": "رزرو یافت نشد."
}
}
Flowchart
Start Request (PATCH /.../refund)
↓
Query `hub_reservation` by `id`
↓
Reservation Found?
No
Return 400 - "رزرو یافت نشد."
↓ (Yes)
Is `value_type` == 'percent'?
↓ (Yes)
Calculate Penalty:
`buy_price * value / 100`
`buy_price * value / 100`
↓ (No)
Set Penalty = `value` (fixed amount)
↓
Create `wallet` transaction (credit = buy_price - penalty)
↓
Update `hub_reservation` (status=4, refund_penalty=penalty)
↓
Return 201 Created (Empty Body)