Skip to main content
#P1739

GET /v2/core/bill/{type}

Hub: Get Branch Bills

این اندپوینت برای دریافت لیست صورتحساب‌های پرداخت نشده (`status = 1`) یک شعبه خاص طراحی شده است.
کلاینت می‌تواند با ارسال نوع سرویس (مانند `hotel`, `flight` و...)، فقط صورتحساب‌های مربوط به آن سرویس را فیلتر و دریافت کند. خروجی شامل جزئیات کامل هر صورتحساب به همراه مبلغ نهایی قابل پرداخت است.

Request Overview

URL: /v2/core/bill/{type}
Method: GET
Controller: HubController@indexBranchBill
Middleware: authWithJwt

Access Control

  • نیاز به توکن احراز هویت (JWT) دارد.
  • شناسه شعبه (`branch`) به صورت خودکار از توکن کاربر استخراج و در کوئری استفاده می‌شود.

URL Parameters

Field Type Description
type string (الزامی) نوع سرویسی که صورتحساب برای آن صادر شده است. مقادیر ممکن: 'hotel', 'flight', 'tour' و غیره.

Logic Details

فرآیند دریافت صورتحساب‌ها به شرح زیر است:

  1. استخراج اطلاعات: شناسه شعبه (`branch`) از توکن JWT و نوع سرویس (`type`) از URL خوانده می‌شود.
  2. کوئری از دیتابیس:
    • یک کوئری به جدول airplus_bills ارسال می‌شود.
    • این کوئری نتایج را بر اساس سه شرط اصلی فیلتر می‌کند:
      1. branch: باید با شناسه شعبه کاربر لاگین کرده مطابقت داشته باشد.
      2. status: باید دقیقاً برابر با 1 باشد (فقط صورتحساب‌های در انتظار پرداخت).
      3. object_type: باید با پارامتر type ارسال شده در URL مطابقت داشته باشد.
  3. پردازش و تبدیل داده‌ها (`map`):
    • اگر یک یا چند صورتحساب پیدا شود، سیستم روی هرکدام از آن‌ها یک فرآیند تبدیل اجرا می‌کند:
    • یک فیلد جدید به نام total با استفاده از فرمول `(((amount + tax) - discount) + markup)` محاسبه و به خروجی اضافه می‌شود.
    • یک آبجکت details ساخته می‌شود که حاوی month_title است. این فیلد با استفاده از تابع CalendarUtils::strftime نام فارسی ماه (مانند "آذر ماه") را از روی تاریخ ایجاد صورتحساب استخراج می‌کند.
    • ساختار نهایی هر آیتم برای خوانایی بیشتر در پاسخ API بازآرایی می‌شود.
  4. ساختار پاسخ نهایی:
    • اگر هیچ صورتحسابی یافت نشود، پاسخ با کد 200 OK بازگردانده شده و مقدار فیلد items برابر با false خواهد بود.
    • نکته مهم: بلوک کد مربوط به خطای 404 در کنترلر به دلیل نحوه عملکرد تابع get()، عملاً اجرا نمی‌شود و پاسخ همیشه 200 است.
    • اگر صورتحساب‌ها پیدا شوند، آرایه‌ای از آبجکت‌های تبدیل شده در فیلد items قرار می‌گیرد.

Response Structure

پاسخ موفق (در صورت یافتن صورتحساب)

  • Status Code: 200 OK
{
    "items": [
        {
            "id": 101,
            "details": {
                "month_title": "آذر ماه"
            },
            "description": "بابت رزرو هتل اسپیناس پالاس",
            "amount": 5000000,
            "tax": 450000,
            "discount": 0,
            "markup": 0,
            "total": 5450000,
            "created_at": "2025-12-09 10:00:00",
            "updated_at": "2025-12-09 10:00:00",
            "expired_at": "2025-12-11 10:00:00"
        }
    ],
    "meta": {
        "timestamp": 1733735400
    }
}

پاسخ موفق (در صورت عدم وجود صورتحساب)

  • Status Code: 200 OK
  • توجه کنید که در این حالت، فیلد items به جای آرایه خالی، مقدار false دارد.
{
    "items": false,
    "meta": {
        "timestamp": 1733735400
    }
}

Flowchart

Start Request (GET /v2/core/bill/{type})
Extract `branch` from JWT & `type` from URL
Query `airplus_bills` WHERE:
- `branch` = user_branch
- `status` = 1
- `object_type` = {type}
Bills Collection is Empty?
Yes
Set `items` field to `false`
Return 200 OK
↓ (No)
Map over results:
- Calculate `total`
- Generate `month_title`
- Format structure
Return 200 OK with `items` array