#P1581
POST /v2/account/bill2
Route Info
| Method | Endpoint | Controller |
| POST | /v2/account/bill2 | AccountingController@accountBill2 |
شرح عملکرد دقیق (Deep Logic Analysis)
این متد صورتحساب، برخلاف نسخه ساده قبلی، دارای منطق "تفسیر و تجمیع" است که وابستگی شدیدی به توابع استاتیک کمکی دارد:
- باگ حیاتی (Bug Alert): همچنان تاکید میکنم خط اول تابع حاوی
dd($request->all())است که باید حذف شود. - 1. استانداردسازی زمان (Time Normalization):
ورودیهای تاریخ توسط تابعcheckDatetimeاستاندارد میشوند تا فرمتهای مختلف (با جداکننده یا بدون آن) به یک فرمت واحد Y-m-d تبدیل شوند. این کار برای کوئریهای دقیق روی Redis و دیتابیس حیاتی است. - 2. کشینگ توضیحات (Redis Description Caching):
داخل حلقه پردازش تراکنشها، سیستم ابتدا Redis را چک میکند (Redis::get('accountingpays' . $item->id)).
اگر توضیحات سند قبلاً ساخته نشده باشد، تابع سنگینconvertPayDetailsDbToTableصدا زده میشود و خروجی آن (شامل لینکهای HTML و متن فرمت شده) در Redis ذخیره میشود تا در درخواستهای بعدی سرعت بالا برود. - 3. تجمیع هوشمند کارتخوانها (POS Aggregation Logic):
این مهمترین تفاوت است. اگر نوع پرداختpos(کارتخوان) باشد:- تراکنشها به لیست اصلی
Billsاضافه نمیشوند. - در عوض، در آرایه
$PosTotalبر اساس تاریخ روز جمع زده میشوند. - در انتهای پردازش، یک آیتم واحد برای هر روز ساخته میشود که عنوان "سند مجموع کارتخوانهای..." دارد و ریز تراکنشها داخل فیلد
subsetقرار میگیرند (به نمونه خروجی دقت کنید).
- تراکنشها به لیست اصلی
- 4. محاسبه مانده از قبل (Financial Pasts):
توسط تابعgetFinancialPasts، مانده حساب از ابتدای تاریخ بازه انتخابی محاسبه میشود. این تابع هوشمندانه بررسی میکند که آیا "سند دستی افتتاحیه" وجود دارد یا باید تمام تراکنشهای سالهای قبل را جمع بزند. - 5. کارمزدها (Wage Handling):
اگر تراکنش شامل کارمزد بانکی باشد (wage > 0)، یک ردیف جداگانه در صورتحساب با عنوان "کارمزد نقل و انتقال بانکی" و تایپwageدرج میشود.
ساختار خروجی (Refined Response)
با توجه به فایل جدید، ساختار خروجی شامل فیلد subset برای تراکنشهای تجمیعی است:
{
"Bills": [
{
// نمونه تراکنش معمولی
"serial_id": 15102,
"system_serial": 204,
"datetime": "1403/02/15 10:00:00",
"credit": 0,
"debit": 2500000,
"details": {
"title": {
"html": "سند پرداخت پایا...",
"text": "سند پرداخت پایا..."
},
"type": {
"subject": "pay",
"title": "سندمالی"
}
}
},
{
// نمونه تراکنش تجمیعی (POS) - کشف شده در فایل جدید
"serial_id": "1403021601", // ID ترکیبی از تاریخ
"system_serial": "1403021601",
"datetime": "1403/02/16 00:00:00",
"credit": 50000000, // جمع کل کارتخوانهای آن روز
"debit": 0,
"details": {
"title": {
"html": "سند مجموع کارتخوان های 1403/02/16",
"text": "سند مجموع کارتخوان های 1403/02/16"
},
"type": {
"subject": "pos",
"title": "سند کارتخوان"
}
},
"subset": [ // <--- بخش جدید اضافه شده
{
"id": 5001,
"amount": 20000000,
"description": "تراکنش اول..."
},
{
"id": 5002,
"amount": 30000000,
"description": "تراکنش دوم..."
}
]
}
],
"Total": {
"credit": 50000000,
"debit": 2500000,
"balance": 47500000,
"diagnosis": "Creditor"
}
}
وابستگیهای سیستمی (System Dependencies)
عملکرد صحیح این روت به وجود و صحت توابع زیر در فایلهای Helper وابسته است:
| نام تابع | نقش کلیدی |
|---|---|
| StaticController::getAccountingTitles | تشخیص سطح حساب (کل/معین/تفضیلی) برای تصمیمگیری در مورد نوع کوئری. |
| StaticController::convertPayDetailsDbToTable | تولید HTML لینکدار برای رفرنسها و تشخیص وضعیت چکها. |
| StaticController::int2DateTime | تبدیل اعداد دیتابیسی (مثل 14030215) به رشته نمایشی (1403/02/15). |