Skip to main content
#P1557

GET /api/v2/tasks/categories/list

Route Info

Method Endpoint Controller Middleware
GET /api/panel/v2/tasks/categories/listaccounting/account-bill OfficialController@listTasksCategoriesauthWithJwtAccountingController@accountBill

منطق دقیقشرح عملکرد (Code Logic)Functionality)

این متد لیستوظیفه دسته‌بندی‌هایتولید تسکصورتحساب (گردش حساب) و محاسبه تراز برای یک سرفصل حسابداری مشخص را بر عهده دارد و مراحل زیر را طی می‌کند:

  • تعیین بازه زمانی:
    • اگر پارامترهای advanced->from و to ارسال نشوند، سیستم به طور پیش‌فرض بازه ۳ ماه اخیر را در دونظر بخشمی‌گیرد.
    • مجزا
    («دسته‌های من» و «دسته‌های دیگران») بازمی‌گرداند. منطق فیلتر کردن به شرح زیر است:

    1. بخشتشخیص اولسطح (My Categories):حساب:
      • جستجوبر دراساس جدولطول رشته پارامتر tasks_categoriesid، سطح حساب تشخیص داده می‌شود: 2 رقم (گروه)، 4 رقم (کل)، 6 رقم (معین) و 9 رقم (تفضیل).
      • شرط:اطلاعات branchپایه برابرحساب باو شعبهساختار جاری و user برابر با id اپراتور لاگین شدهآن (مالکیتمانند مستقیم).
      • نوع
      • درماهیت) حلقه: تعداد تسک‌های فعال هر دسته شمرده می‌شود. اگر پارامتر tasks ارسال شده باشد، متد داخلی getTasks اجراواکشی می‌شود.
    2. بخشجمع‌آوری دوماسناد (Other Categories)Aggregation):
      • جستجواسناد درمالی جدولاز tasks_categoriesجداول کهمختلف بابر tasks_itemsاساس جویننوع (Join)حساب شدهجمع‌آوری است.می‌شوند:
      • فیلترجدول JSON:Pays: ازشامل دستوردریافت‌ها، whereRawپرداخت‌ها، استفادهتنخواه می‌کندو تاوام‌ها.
      • چک
      • Manual کندDocuments: آیااسناد idدستی اپراتور جاری در ستون JSON (به نامجز operators در جدول آیتم‌ها وجود دارد یا خیر (یعنی کاربر در تسک‌های آن دسته مشارکت دارد)افتتاحیه/اختتامیه).
      • ازCheck distinct()Operations: استفادهعملیات‌های می‌شودچک تا(وصول، ازواگذاری، تکرارخرج، دسته‌بندی‌ها جلوگیری شود.استرداد).
      • درPOS/Online: حلقه:اگر مجدداًحساب تعدادبانکی تسک‌هاییباشد، کهتراکنش‌های کاربرکارتخوان و آنلاین به صورت تجمیعی روزانه در آن‌هافیلد نقشsubset داردنمایش شمردهداده می‌شود.شوند.
  • اسناد افتتاحیه و اختتامیه:
    • با فراخوانی متد داخلی getFinancialPasts، مانده‌های انتقالی از دوره‌های قبل (تحت عنوان سند افتتاحیه) و اسناد بستن حساب (اختتامیه) محاسبه و به لیست اضافه می‌شوند.
  • محاسبه تراز نهایی:
    • مجموع بدهکار و بستانکار محاسبه شده و وضعیت تراز (بدهکار/بستانکار/تراز) در فیلد balance خروجی قرار می‌گیرد.

پارامترهای ورودی (QueryInput Params)Parameters)

  • (الزامی-معمولا در هدر یا بادی): واکشیودر آرایه خروجی قرار می‌گیرد. در غیر این صورت مقدار false برمی‌گردد.
    نام پارامترنوعالزامی؟توضیحات
    branch Integer بله شناسه شعبه جهتفعال.
    idString/Intبلهکد حساب مورد نظر (مثلاً کد معین یا تفضیل).
    typeStringخیرنوع حساب (مثلاً account).
    jsonJSON Stringبلهحاوی تنظیمات صفحه‌بندی و فیلتر کردن داده‌ها.
  • tasksزمانی (اختیاری - Boolean): اگر مقدارآبجکت true یا 1 ارسال شود، علاوه بر اطلاعات دسته، لیست ریز تسک‌های آن دسته نیز (توسط متد getTasksadvanced).
  • خروجی‌ها

    ساختار

    موفقپارامتر (200 OK)json:

    {
        "status"start": true,0,
        "time"length": 1732045000,50,
        "data"advanced": {
            "my"from": [ // دسته‌بندی‌هایی که کاربر سازنده آن‌هاست
          {
            "id": 10,
            "user": {...}1403-01-01", // آبجکت اطلاعات سازنده (از StaticController)اختیاری
            "title"to": "Project A",
            "color": "#FF0000",
            "icon": "fa-check",
            "status": 1,
            "created": "2023-01-01 12:00:00",
            "counter": 5,1403-12-29"   // تعداد تسک‌های فعال داخل این دسته
            "tasks": false  // یا آرایه‌ای از تسک‌ها اگر درخواست شده باشد
          }
        ],
        "other": [ // دسته‌بندی‌هایی که کاربر در آن‌ها مشارکت دارد (توسط JSON Check)
          {
            "id": 12,
            "title": "Team Work B",
            ...
          }
        ]اختیاری
        }
    }
    

    تحلیلنمونه ریسکخروجی (Response)

    ساختار کلی پاسخ:

    {
        "details": {
            "title": "عنوان حساب (مثلاً بانک ملت)",
            "code": "101001"
        },
        "filtered": {
            "from": "1403-01-01",
            "to": "1403-12-29"
        },
        "account": {
            "id": 15,
            "type": "moeen",
            "title": "بانک ها",
            "nature": 1
        },
        "data": [
            {
                "serial_id": 10550,
                "system_serial": 550,
                "datetime": "1403/08/01 10:30:00",
                "credit": 0,
                "debit": 5000000,
                "description": {
                     "html": "...",
                     "text": "..."
                },
                "details": {
                    "title": {
                        "html": "شرح سند...",
                        "text": "شرح سند..."
                    },
                    "type": {
                        "subject": "pay", // pay, check, pos, wage, etc.
                        "title": "سندمالی"
                    }
                },
                "subset": [] // آرایه ریزتراکنش‌ها (برای POS و پرفورمنسOnline)
            (Critical)}
        
    • مشکل عملکردی (N+1 Query Problem): در هر دو حلقه foreach، به ازای هر دسته‌بندی پیدا شده، حداقل یک کوئری count و یک کوئری StaticController::getOperators اجرا می‌شود. با افزایش تعداد دسته‌ها، تعداد کوئری‌ها به شدت زیاد شده و سرعت پاسخ‌دهی افت می‌کند.
    • تزریق متغیر در Raw SQL: در خطی که whereRaw("JSON_CONTAINS(...], '\"$operatorId\balance": { "')credit": 250000000, ")debit": استفاده180000000, شده،"balance": متغیر-70000000, operatorId$"diagnosis": مستقیماً"Creditor" داخل// رشتهCreditor, SQLDebtor, قرارNeutral گرفته} است.} اگرچه این متغیر از میدل‌ور (Token) می‌آید و قابل اعتماد است، اما استاندارد این است که از Binding (علامت سوال ?) استفاده شود تا از هرگونه خطر احتمالی و سربار روی دیتابیس جلوگیری شود.
    • وابستگی داخلی نامشخص: متد $this->getTasks() فراخوانی می‌شود که کد آن در کنترلر موجود نیست. هرگونه باگ یا کندی در آن متد مستقیماً روی این اندپوینت تاثیر می‌گذارد.