#P1745
PATCH /v2/core/hub/reservation/refund/undo
Hub: Undo Reservation Refund
این اندپوینت برای لغو یک عملیات استرداد (Refund) که قبلاً انجام شده، استفاده میشود. فرآیند شامل پیدا کردن تراکنش بستانکاری مربوط به استرداد، بررسی کافی بودن موجودی کیف پول شعبه برای بازگرداندن آن مبلغ، ایجاد یک تراکنش بدهکاری جدید برای خنثی کردن تراکنش قبلی، و در نهایت بازگرداندن وضعیت رزرو به حالت اولیه (فعال) است.
Request Overview
URL:
/v2/core/hub/reservation/refund/undoMethod: PATCH
Controller: HubController@hubUndoRefund
Middleware: authWithJwt
Access Control
- نیاز به توکن احراز هویت (JWT) دارد.
- شناسه شعبه (`branch`) به صورت خودکار از درخواست (احتمالاً توسط میدلور) استخراج شده و برای بررسی موجودی استفاده میشود.
Request Body Parameters
| Field | Type | Description |
|---|---|---|
| id | integer | (الزامی) شناسه (ID) رزروی که عملیات استرداد آن باید لغو شود. سیستم از این شناسه برای یافتن تراکنش استرداد مرتبط در جدول wallet استفاده میکند. |
Logic Details
فرآیند لغو استرداد به صورت گامبهگام زیر است:
- یافتن تراکنش استرداد:
- سیستم در جدول
walletبه دنبال تراکنشی میگردد که شرایط زیر را داشته باشد:target_type == 'refund'target == request('id')(شناسه رزرو)credit > 0(تراکنش بستانکاری که پول را به شعبه بازگردانده است)
- اگر چنین تراکنشی یافت نشود، خطای 400 با پیام "استرداد یافت نشد" بازگردانده میشود.
- سیستم در جدول
- بررسی موجودی کیف پول (Critical Step):
- قبل از برداشت وجه، سیستم با فراخوانی متد
AccountingController::getCheckWalletموجودی شعبه را بررسی میکند. - این متد چک میکند که آیا موجودی فعلی شعبه (با در نظر گرفتن حد اعتبار یا
credit_limit) برای پوشش مبلغ استرداد شده ($transaction->credit) کافی است یا خیر. - اگر موجودی کافی نباشد، خطای 400 با پیام "موجودی کیف پول جهت برگشت این آیتم کافی نیست" بازگردانده میشود.
- قبل از برداشت وجه، سیستم با فراخوانی متد
- ایجاد تراکنش بدهکاری (Debit Transaction):
- یک رکورد جدید در جدول
walletبرای برداشت مبلغ استرداد شده از حساب شعبه ایجاد میشود: - Mبلغ بدهکاری (debit): برابر است با مبلغ
creditتراکنش استرداد اولیه. - توضیحات (description): متنی مانند "برگشت استرداد [شناسه تراکنش]" ثبت میشود.
- این رکورد بدهکاری، تراکنش بستانکاری قبلی را خنثی میکند.
- یک رکورد جدید در جدول
- بازگردانی وضعیت رزرو:
- رکورد اصلی رزرو در جدول
hub_reservationبهروزرسانی میشود: - فیلد
refund_penaltyبهnullتغییر میکند. - فیلد
statusبه مقدار ۱ (به معنای فعال/صادر شده) بازمیگردد. - فیلد
updated_atبهروز میشود.
- رکورد اصلی رزرو در جدول
Response Structure
پاسخ موفق
- Status Code:
201 Created - Body: Empty (بدون محتوا).
پاسخهای خطا
- Status Code:
400 Bad Request - این خطا در سه حالت ممکن است رخ دهد:
۱. تراکنش استرداد یافت نشد:
{
"error": {
"code": 1000,
"message": "استرداد یافت نشد"
}
}
۲. موجودی کیف پول ناکافی است:
{
"error": {
"code": 1000,
"message": "موجودی کیف پول جهت برگشت این آیتم کافی نیست."
},
"meta": {
"timestamp": 1733737200
}
}
۳. بروز خطای عمومی (Exception):
{
"error": {
"code": 1000,
"message": "General exception message..."
},
"meta": {
"timestamp": 1733737200
}
}
Flowchart
Start Request (PATCH /.../refund/undo)
↓
Find Refund Transaction in `wallet` table
↓
Transaction Found?
No
Return 400 - "استرداد یافت نشد"
↓ (Yes)
Check Wallet Balance (getCheckWallet)
No (Insufficient)
Return 400 - "موجودی ناکافی"
↓ (Yes)
Create Reversal `Debit` Transaction in `wallet`
↓
Update `hub_reservation` (status=1, refund_penalty=null)
↓
Return 201 Created