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
->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,

View file

@ -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) {