Skip to main content
#P1808

GET /b2c/v1/wallet/ballance

Wallet Balance

این اندپوینت برای واکشی موجودی کیف‌پول کاربر در سیستم B2C طراحی شده است. بر اساس group (مقدار JWT احراز هویت)، نوع کاربر بین B2C و B2B (colleague) تشخیص داده می‌شود و سپس موجودی کیف پول از جدول wallet با استفاده از کنترلر مالی اصلی (AccountingController) فراخوانی می‌گردد.


Endpoint Info

URL: /b2c/v1/wallet/ballance
Method: GET
Controller: CreditDebitController@walletBalance
Middleware: authWithJwt
Related Method: AccountingController::getBalanceWallet()
Database Table: wallet

Query Parameters (JWT‑required)

پارامتر نوع الزامی توضیح
group string گروه کاربر: b2c یا colleague. هر مقدار دیگر منجر به خطای 1000 می‌شود.
operator object (JWT) شیء اپراتور احراز هویت‌شده شامل فیلدهای id، ceiling و deadline_month

Logic Flow

📥 ۱. بررسی ورودی JWT و تعیین نوع کاربر ($request->group)
اگر group مقدار b2c داشت → $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')
    ✅ باید باشد:
    if ($type == 'colleague')
    در غیر این صورت همیشه مقدار `'colleague'` ست شده و مسیر شرطی اشتباه عمل می‌کند.