#P1808
GET /b2c/v1/wallet/ballance
Wallet Balance
این اندپوینت برای واکشی موجودی کیفپول کاربر در سیستم B2C طراحی شده است. بر اساس group (مقدار JWT احراز هویت)، نوع کاربر بین B2C و B2B (colleague) تشخیص داده میشود و سپس موجودی کیف پول از جدول wallet با استفاده از کنترلر مالی اصلی (AccountingController) فراخوانی میگردد.
Endpoint Info
URL:
/b2c/v1/wallet/ballanceMethod: GET
Controller:
CreditDebitController@walletBalanceMiddleware:
authWithJwtRelated Method:
AccountingController::getBalanceWallet()Database Table:
walletQuery Parameters (JWT‑required)
| پارامتر | نوع | الزامی | توضیح |
|---|---|---|---|
| group | string | ✅ | گروه کاربر: b2c یا colleague. هر مقدار دیگر منجر به خطای 1000 میشود. |
| operator | object (JWT) | ✅ | شیء اپراتور احراز هویتشده شامل فیلدهای id، ceiling و deadline_month |
Logic Flow
📥 ۱. بررسی ورودی JWT و تعیین نوع کاربر (
$request->group)↓
اگر group مقدار b2c داشت →
اگر group مقدار colleague داشت →
در غیر این صورت → بازگشت خطا:
$userType='b2c'اگر group مقدار colleague داشت →
$userType='b2b'در غیر این صورت → بازگشت خطا:
{
"error": {
"code": 1000,
"message": "گروه کاربری یافت نشد"
},
"meta": { "timestamp": 1733763100 }
}
↓
📊 استخراج مقادیر زیر از JWT اپراتور:
ceiling→ سقف اعتبار (Credit Ceiling)deadline_month→ مهلت تسویه حساب ماهیانه
↓
💰 صدا زدن متد
AccountingController::getBalanceWallet(type, operator.id, 'website')↓
✅ بازگرداندن پاسخ با ساختار استاندارد شامل موجودی و متادیتا.
Response Samples
✅ پاسخ موفق (کاربر B2C)
{
"payload": {
"ceiling": 2000000,
"deadline": "2025-12",
"wallet": {
"credit": 5000000,
"debit": 2500000,
"balance": 2500000,
"diagnosis": "creditor"
}
},
"meta": { "timestamp": 1733763100 }
}
✅ پاسخ موفق (کاربر colleague/B2B)
{
"payload": {
"ceiling": 10000000,
"deadline": false,
"wallet": {
"credit": 3200000,
"debit": 3500000,
"balance": -300000,
"diagnosis": "debtor"
}
},
"meta": { "timestamp": 1733763120 }
}
❌ گروه اشتباه
{
"error": {
"code": 1000,
"message": "گروه کاربری یافت نشد"
},
"meta": { "timestamp": 1733763130 }
}
Internal Logic – AccountingController::getBalanceWallet()
static function getBalanceWallet($type, $id, $method='branch') {
// تعیین نوع اپراتور
if ($type == 'colleague') { $type = 'b2b'; } else { $type = 'erp'; }
// جمع مجموع بدهکار و بستانکار
$wallet = DB::table('wallet')
->selectRaw('SUM(credit) as credit, SUM(debit) as debit')
->where(function ($q) use ($type, $id, $method) {
if ($method == 'branch')
$q->where('operator_type', 'erp')->where('branch', $id);
else
$q->where('operator_type', $type)->where('operator', $id);
})
->where('status', '!=', 2)
->first();
return [
"credit" => (int)$wallet->credit,
"debit" => (int)$wallet->debit,
"balance" => ($wallet->credit - $wallet->debit),
"diagnosis" => ($wallet->credit - $wallet->debit) >= 0
? (($wallet->credit - $wallet->debit) == 0 ? 'neutral' : 'creditor')
: 'debtor'
];
}
Technical Notes
- منبع داده: جدول
walletبا فیلدهایcreditوdebit. - تمام رکوردهایی با وضعیت
status != 2در محاسبه لحاظ میشوند. - تشخیص نوع حساب:
- creditor: بستانکار (balance > 0)
- debtor: بدهکار (balance < 0)
- neutral: خنثی (balance = 0)
- در پاسخ نهایی، تمام مقادیر به ریال هستند و integer برگردانده میشوند.
- نکته مهم: در پیادهسازی فعلی خطای تایپی وجود دارد. خط زیر در متد AccountingController باید با `==` تصحیح گردد:
✅ باید باشد:if ($type = 'colleague')
در غیر این صورت همیشه مقدار `'colleague'` ست شده و مسیر شرطی اشتباه عمل میکند.if ($type == 'colleague')