From 40fbedb6d1098b0742f830c58fee268277623674 Mon Sep 17 00:00:00 2001 From: Babak Alizadeh Date: Wed, 6 Aug 2025 08:06:31 +0000 Subject: [PATCH] bug fix in persons paginations --- hesabixCore/src/Cog/PersonService.php | 125 ++++++++++++-------------- webUI/src/views/acc/persons/list.vue | 12 +-- 2 files changed, 61 insertions(+), 76 deletions(-) diff --git a/hesabixCore/src/Cog/PersonService.php b/hesabixCore/src/Cog/PersonService.php index 1d4c319..61c0ecd 100644 --- a/hesabixCore/src/Cog/PersonService.php +++ b/hesabixCore/src/Cog/PersonService.php @@ -120,52 +120,36 @@ class PersonService } } - // اگر سورت روی فیلدهای محاسبه‌شده است، ابتدا همه داده‌ها را دریافت کن - if ($hasCalculatedSort) { - $persons = $queryBuilder - ->select('p') - ->getQuery() - ->getResult(); - } else { - // اعمال سورت کردن برای فیلدهای مستقیم - if ($sortBy && is_array($sortBy) && !empty($sortBy)) { - foreach ($sortBy as $sort) { - if (isset($sort['key']) && isset($sort['order'])) { - $field = $sort['key']; - $order = strtoupper($sort['order']); - - // بررسی فیلدهای مجاز برای سورت - $allowedFields = [ - 'code', 'nikename', 'name', 'birthday', 'company', - 'shenasemeli', 'codeeghtesadi', 'sabt', 'keshvar', - 'ostan', 'shahr', 'postalcode', 'tel', 'mobile', - 'mobile2', 'email', 'website', 'fax', 'speedAccess' - ]; - - if (in_array($field, $allowedFields)) { - $queryBuilder->addOrderBy("p.$field", $order); - } - } - } - } else { - // سورت پیش‌فرض بر اساس کد - $queryBuilder->orderBy('p.code', 'ASC'); - } + // همیشه ابتدا همه اشخاص را دریافت کن + $persons = $queryBuilder + ->select('p') + ->getQuery() + ->getResult(); - $persons = $queryBuilder - ->select('p') - ->setFirstResult(($page - 1) * $itemsPerPage) - ->setMaxResults($itemsPerPage) + // محاسبه تعداد کل آیتم‌ها + $totalQueryBuilder = clone $queryBuilder; + try { + $totalItems = $totalQueryBuilder + ->select('COUNT(p.id)') ->getQuery() - ->getResult(); + ->getSingleScalarResult(); + } catch (\Doctrine\ORM\NoResultException $e) { + $totalItems = 0; + } + + // اگر هیچ آیتمی وجود ندارد، خالی برگردان + if ($totalItems == 0) { + return [ + 'items' => [], + 'total' => 0, + 'unfilteredTotal' => 0, + ]; } - $totalItems = (clone $queryBuilder) - ->select('COUNT(p.id)') - ->getQuery() - ->getSingleScalarResult(); - $response = []; + + // ابتدا همه اشخاص را با تراز محاسبه کن + $allPersonsWithBalance = []; foreach ($persons as $person) { $rows = $this->entityManager->getRepository(HesabdariRow::class)->findBy([ 'person' => $person, @@ -184,9 +168,35 @@ class PersonService } $balance = $bs - $bd; + $result = Explore::ExplorePerson($person, $this->entityManager->getRepository(PersonType::class)->findAll()); + $result['bs'] = $bs; + $result['bd'] = $bd; + $result['balance'] = $balance; + + $allPersonsWithBalance[] = $result; + } + + // اگر سورت روی فیلدهای محاسبه‌شده است، ابتدا سورت کن + if ($hasCalculatedSort && $calculatedSortField && $calculatedSortOrder) { + usort($allPersonsWithBalance, function($a, $b) use ($calculatedSortField, $calculatedSortOrder) { + $aVal = $a[$calculatedSortField] ?? 0; + $bVal = $b[$calculatedSortField] ?? 0; + + if ($calculatedSortOrder === 'ASC') { + return $aVal <=> $bVal; + } else { + return $bVal <=> $aVal; + } + }); + } + + // سپس فیلترهای تراکنش را اعمال کن + $filteredPersons = []; + foreach ($allPersonsWithBalance as $person) { $include = true; if ($transactionFilters && !empty($transactionFilters)) { $include = false; + $balance = $person['balance']; if (in_array('debtors', $transactionFilters) && $balance < 0) { $include = true; } @@ -197,34 +207,17 @@ class PersonService $include = true; } } - + if ($include) { - $result = Explore::ExplorePerson($person, $this->entityManager->getRepository(PersonType::class)->findAll()); - $result['bs'] = $bs; - $result['bd'] = $bd; - $result['balance'] = $balance; - $response[] = $result; + $filteredPersons[] = $person; } } - - // اگر سورت روی فیلدهای محاسبه‌شده است، اینجا سورت کن - if ($hasCalculatedSort && $calculatedSortField && $calculatedSortOrder) { - usort($response, function($a, $b) use ($calculatedSortField, $calculatedSortOrder) { - $aVal = $a[$calculatedSortField] ?? 0; - $bVal = $b[$calculatedSortField] ?? 0; - - if ($calculatedSortOrder === 'ASC') { - return $aVal <=> $bVal; - } else { - return $bVal <=> $aVal; - } - }); - - // اعمال صفحه‌بندی بعد از سورت - $response = array_slice($response, ($page - 1) * $itemsPerPage, $itemsPerPage); - } - - $filteredTotal = count($response); + + // محاسبه تعداد کل آیتم‌های فیلترشده + $filteredTotal = count($filteredPersons); + + // اعمال صفحه‌بندی + $response = array_slice($filteredPersons, ($page - 1) * $itemsPerPage, $itemsPerPage); return [ 'items' => $response, diff --git a/webUI/src/views/acc/persons/list.vue b/webUI/src/views/acc/persons/list.vue index e5d4c41..c8fb4e0 100755 --- a/webUI/src/views/acc/persons/list.vue +++ b/webUI/src/views/acc/persons/list.vue @@ -324,16 +324,8 @@ const fetchData = async () => { }); items.value = response.data.items || []; - // اگر فیلتری اعمال شده باشد، از total (تعداد فیلترشده) استفاده کن - // اگر فیلتری اعمال نشده باشد، از unfilteredTotal (تعداد کل) استفاده کن - const isFiltered = - searchValue.value || - selectedTypes.length > 0 || - selectedTransactionFilters.length > 0; - - totalItems.value = isFiltered - ? (response.data.total || 0) // تعداد کل فیلترشده - : (response.data.unfilteredTotal || 0); // تعداد کل بدون فیلتر + // همیشه از total استفاده کن (تعداد کل آیتم‌های فیلترشده) + totalItems.value = response.data.total || 0; resetSelections(); } catch (error) {