bug fix in persons paginations

This commit is contained in:
Hesabix 2025-08-06 08:06:31 +00:00
parent 36c2841011
commit 40fbedb6d1
2 changed files with 61 additions and 76 deletions

View file

@ -120,52 +120,36 @@ class PersonService
} }
} }
// اگر سورت روی فیلدهای محاسبه‌شده است، ابتدا همه داده‌ها را دریافت کن // همیشه ابتدا همه اشخاص را دریافت کن
if ($hasCalculatedSort) { $persons = $queryBuilder
$persons = $queryBuilder ->select('p')
->select('p') ->getQuery()
->getQuery() ->getResult();
->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') $totalQueryBuilder = clone $queryBuilder;
->setFirstResult(($page - 1) * $itemsPerPage) try {
->setMaxResults($itemsPerPage) $totalItems = $totalQueryBuilder
->select('COUNT(p.id)')
->getQuery() ->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) { foreach ($persons as $person) {
$rows = $this->entityManager->getRepository(HesabdariRow::class)->findBy([ $rows = $this->entityManager->getRepository(HesabdariRow::class)->findBy([
'person' => $person, 'person' => $person,
@ -184,9 +168,35 @@ class PersonService
} }
$balance = $bs - $bd; $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; $include = true;
if ($transactionFilters && !empty($transactionFilters)) { if ($transactionFilters && !empty($transactionFilters)) {
$include = false; $include = false;
$balance = $person['balance'];
if (in_array('debtors', $transactionFilters) && $balance < 0) { if (in_array('debtors', $transactionFilters) && $balance < 0) {
$include = true; $include = true;
} }
@ -197,34 +207,17 @@ class PersonService
$include = true; $include = true;
} }
} }
if ($include) { if ($include) {
$result = Explore::ExplorePerson($person, $this->entityManager->getRepository(PersonType::class)->findAll()); $filteredPersons[] = $person;
$result['bs'] = $bs;
$result['bd'] = $bd;
$result['balance'] = $balance;
$response[] = $result;
} }
} }
// اگر سورت روی فیلدهای محاسبه‌شده است، اینجا سورت کن // محاسبه تعداد کل آیتم‌های فیلترشده
if ($hasCalculatedSort && $calculatedSortField && $calculatedSortOrder) { $filteredTotal = count($filteredPersons);
usort($response, function($a, $b) use ($calculatedSortField, $calculatedSortOrder) {
$aVal = $a[$calculatedSortField] ?? 0; // اعمال صفحه‌بندی
$bVal = $b[$calculatedSortField] ?? 0; $response = array_slice($filteredPersons, ($page - 1) * $itemsPerPage, $itemsPerPage);
if ($calculatedSortOrder === 'ASC') {
return $aVal <=> $bVal;
} else {
return $bVal <=> $aVal;
}
});
// اعمال صفحه‌بندی بعد از سورت
$response = array_slice($response, ($page - 1) * $itemsPerPage, $itemsPerPage);
}
$filteredTotal = count($response);
return [ return [
'items' => $response, 'items' => $response,

View file

@ -324,16 +324,8 @@ const fetchData = async () => {
}); });
items.value = response.data.items || []; items.value = response.data.items || [];
// اگر فیلتری اعمال شده باشد، از total (تعداد فیلترشده) استفاده کن // همیشه از total استفاده کن (تعداد کل آیتمهای فیلترشده)
// اگر فیلتری اعمال نشده باشد، از unfilteredTotal (تعداد کل) استفاده کن totalItems.value = response.data.total || 0;
const isFiltered =
searchValue.value ||
selectedTypes.length > 0 ||
selectedTransactionFilters.length > 0;
totalItems.value = isFiltered
? (response.data.total || 0) // تعداد کل فیلترشده
: (response.data.unfilteredTotal || 0); // تعداد کل بدون فیلتر
resetSelections(); resetSelections();
} catch (error) { } catch (error) {