bug fix in persons paginations
This commit is contained in:
parent
36c2841011
commit
40fbedb6d1
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue