bug fix in persons paginations
This commit is contained in:
parent
36c2841011
commit
40fbedb6d1
|
@ -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')
|
||||
->setFirstResult(($page - 1) * $itemsPerPage)
|
||||
->setMaxResults($itemsPerPage)
|
||||
->getQuery()
|
||||
->getResult();
|
||||
}
|
||||
|
||||
$totalItems = (clone $queryBuilder)
|
||||
// محاسبه تعداد کل آیتمها
|
||||
$totalQueryBuilder = clone $queryBuilder;
|
||||
try {
|
||||
$totalItems = $totalQueryBuilder
|
||||
->select('COUNT(p.id)')
|
||||
->getQuery()
|
||||
->getSingleScalarResult();
|
||||
} catch (\Doctrine\ORM\NoResultException $e) {
|
||||
$totalItems = 0;
|
||||
}
|
||||
|
||||
$response = [];
|
||||
// اگر هیچ آیتمی وجود ندارد، خالی برگردان
|
||||
if ($totalItems == 0) {
|
||||
return [
|
||||
'items' => [],
|
||||
'total' => 0,
|
||||
'unfilteredTotal' => 0,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ابتدا همه اشخاص را با تراز محاسبه کن
|
||||
$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;
|
||||
}
|
||||
|
@ -199,32 +209,15 @@ class PersonService
|
|||
}
|
||||
|
||||
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;
|
||||
// محاسبه تعداد کل آیتمهای فیلترشده
|
||||
$filteredTotal = count($filteredPersons);
|
||||
|
||||
if ($calculatedSortOrder === 'ASC') {
|
||||
return $aVal <=> $bVal;
|
||||
} else {
|
||||
return $bVal <=> $aVal;
|
||||
}
|
||||
});
|
||||
|
||||
// اعمال صفحهبندی بعد از سورت
|
||||
$response = array_slice($response, ($page - 1) * $itemsPerPage, $itemsPerPage);
|
||||
}
|
||||
|
||||
$filteredTotal = count($response);
|
||||
// اعمال صفحهبندی
|
||||
$response = array_slice($filteredPersons, ($page - 1) * $itemsPerPage, $itemsPerPage);
|
||||
|
||||
return [
|
||||
'items' => $response,
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue