bug fix in persons
This commit is contained in:
parent
f41123b4b2
commit
06092d46a2
|
@ -475,110 +475,93 @@ class PersonsController extends AbstractController
|
||||||
$types = $params['types'] ?? null;
|
$types = $params['types'] ?? null;
|
||||||
$transactionFilters = $params['transactionFilters'] ?? null;
|
$transactionFilters = $params['transactionFilters'] ?? null;
|
||||||
|
|
||||||
$queryBuilder = $entityManager->getRepository(Person::class)
|
// کوئری اصلی برای گرفتن همه اشخاص
|
||||||
|
$queryBuilder = $entityManager->getRepository(\App\Entity\Person::class)
|
||||||
->createQueryBuilder('p')
|
->createQueryBuilder('p')
|
||||||
->leftJoin('p.type', 't')
|
|
||||||
->leftJoin('p.hesabdariRows', 'hr', 'WITH', 'hr.person = p.id')
|
|
||||||
->leftJoin('hr.doc', 'hd')
|
|
||||||
->where('p.bid = :bid')
|
->where('p.bid = :bid')
|
||||||
->setParameter('bid', $acc['bid']);
|
->setParameter('bid', $acc['bid']);
|
||||||
|
|
||||||
// فیلتر سال مالی و واحد پولی
|
// جستوجو (بهبود دادهشده)
|
||||||
$queryBuilder->andWhere('hd.year = :year')
|
if (!empty($search) || $search === '0') { // برای اطمینان از کار با "0" یا خالی
|
||||||
->andWhere('hd.money = :money')
|
$search = trim($search); // حذف فضای خالی اضافی
|
||||||
->setParameter('year', $acc['year'])
|
$queryBuilder->andWhere('p.nikename LIKE :search OR p.name LIKE :search OR p.code LIKE :search')
|
||||||
->setParameter('money', $acc['money']);
|
->setParameter('search', "%$search%");
|
||||||
|
|
||||||
// جستوجو
|
|
||||||
if (!empty($search)) {
|
|
||||||
$queryBuilder->andWhere(
|
|
||||||
$queryBuilder->expr()->orX(
|
|
||||||
$queryBuilder->expr()->like('p.nikename', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.name', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.code', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.tel', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.mobile', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.mobile2', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.email', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.company', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.shenasemeli', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.codeeghtesadi', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.sabt', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.keshvar', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.ostan', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.shahr', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.postalcode', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.website', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.fax', ':search'),
|
|
||||||
$queryBuilder->expr()->like('p.birthday', ':search')
|
|
||||||
)
|
|
||||||
)->setParameter('search', "%$search%");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// فیلتر نوع اشخاص
|
// فیلتر نوع اشخاص
|
||||||
if ($types && !empty($types)) {
|
if ($types && !empty($types)) {
|
||||||
$queryBuilder->andWhere('t.code IN (:types)')
|
$queryBuilder->leftJoin('p.type', 't')
|
||||||
|
->andWhere('t.code IN (:types)')
|
||||||
->setParameter('types', $types);
|
->setParameter('types', $types);
|
||||||
}
|
}
|
||||||
|
|
||||||
// فیلتر وضعیت تراکنش
|
// تعداد کل (قبل از فیلتر تراکنشها)
|
||||||
if ($transactionFilters && !empty($transactionFilters)) {
|
$totalItems = (clone $queryBuilder)
|
||||||
$conditions = [];
|
->select('COUNT(p.id)')
|
||||||
if (in_array('debtors', $transactionFilters)) {
|
|
||||||
$conditions[] = 'SUM(CAST(hr.bd AS DECIMAL)) > SUM(CAST(hr.bs AS DECIMAL))';
|
|
||||||
}
|
|
||||||
if (in_array('creditors', $transactionFilters)) {
|
|
||||||
$conditions[] = 'SUM(CAST(hr.bs AS DECIMAL)) > SUM(CAST(hr.bd AS DECIMAL))';
|
|
||||||
}
|
|
||||||
if (!empty($conditions)) {
|
|
||||||
$queryBuilder->groupBy('p.id')
|
|
||||||
->having(implode(' OR ', $conditions));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// محاسبه تعداد کل
|
|
||||||
$totalQuery = (clone $queryBuilder)
|
|
||||||
->select('COUNT(DISTINCT p.id) as total')
|
|
||||||
->getQuery()
|
->getQuery()
|
||||||
->getScalarResult();
|
->getSingleScalarResult();
|
||||||
$totalItems = $totalQuery[0]['total'] ?? 0;
|
|
||||||
|
|
||||||
// دریافت لیست با صفحهبندی
|
// گرفتن اشخاص با صفحهبندی
|
||||||
$persons = $queryBuilder
|
$persons = $queryBuilder
|
||||||
->select('DISTINCT p')
|
->select('p')
|
||||||
->setFirstResult(($page - 1) * $itemsPerPage)
|
->setFirstResult(($page - 1) * $itemsPerPage)
|
||||||
->setMaxResults($itemsPerPage)
|
->setMaxResults($itemsPerPage)
|
||||||
->getQuery()
|
->getQuery()
|
||||||
->getResult();
|
->getResult();
|
||||||
|
|
||||||
$response = Explore::ExplorePersons($persons, $entityManager->getRepository(PersonType::class)->findAll());
|
// محاسبه تراکنشها و اعمال فیلتر تراکنشها
|
||||||
foreach ($persons as $key => $person) {
|
$response = [];
|
||||||
$rows = $entityManager->getRepository(HesabdariRow::class)
|
foreach ($persons as $person) {
|
||||||
->createQueryBuilder('hr')
|
$rows = $entityManager->getRepository(\App\Entity\HesabdariRow::class)->findBy([
|
||||||
->leftJoin('hr.doc', 'hd')
|
'person' => $person,
|
||||||
->where('hr.person = :person')
|
'bid' => $acc['bid'],
|
||||||
->andWhere('hd.year = :year')
|
]);
|
||||||
->andWhere('hd.money = :money')
|
$bs = 0; // بستانکار
|
||||||
->setParameter('person', $person)
|
$bd = 0; // بدهکار
|
||||||
->setParameter('year', $acc['year'])
|
|
||||||
->setParameter('money', $acc['money'])
|
|
||||||
->getQuery()
|
|
||||||
->getResult();
|
|
||||||
|
|
||||||
$bs = 0;
|
|
||||||
$bd = 0;
|
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
$bs += (float) $row->getBs();
|
if ($row->getDoc()->getMoney()->getId() == $acc['money']->getId() &&
|
||||||
$bd += (float) $row->getBd();
|
$row->getDoc()->getYear()->getId() == $acc['year']->getId()) {
|
||||||
|
$bs += (float) $row->getBs(); // بستانکار
|
||||||
|
$bd += (float) $row->getBd(); // بدهکار
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$balance = $bs - $bd; // تراز = بستانکار - بدهکار
|
||||||
|
|
||||||
|
// اعمال فیلتر transactionFilters
|
||||||
|
$include = true;
|
||||||
|
if ($transactionFilters && !empty($transactionFilters)) {
|
||||||
|
$include = false;
|
||||||
|
if (in_array('debtors', $transactionFilters) && $balance < 0) { // بدهکارها (تراز منفی)
|
||||||
|
$include = true;
|
||||||
|
}
|
||||||
|
if (in_array('creditors', $transactionFilters) && $balance > 0) { // بستانکارها (تراز مثبت)
|
||||||
|
$include = true;
|
||||||
|
}
|
||||||
|
if (in_array('zero', $transactionFilters) && $balance == 0) { // تسویهشدهها
|
||||||
|
$include = true;
|
||||||
}
|
}
|
||||||
$response[$key]['bs'] = $bs;
|
|
||||||
$response[$key]['bd'] = $bd;
|
|
||||||
$response[$key]['balance'] = $bs - $bd;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->json([
|
if ($include) {
|
||||||
'items' => $response,
|
$response[] = [
|
||||||
'total' => $totalItems,
|
'id' => $person->getId(),
|
||||||
|
'name' => $person->getName(),
|
||||||
|
'nikename' => $person->getNikename(),
|
||||||
|
'code' => $person->getCode(),
|
||||||
|
'bs' => $bs, // بستانکار
|
||||||
|
'bd' => $bd, // بدهکار
|
||||||
|
'balance' => $balance, // تراز
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// تعداد آیتمهای فیلترشده
|
||||||
|
$filteredTotal = count($response);
|
||||||
|
|
||||||
|
return new JsonResponse([
|
||||||
|
'items' => array_slice($response, 0, $itemsPerPage), // فقط تعداد درخواستی
|
||||||
|
'total' => $filteredTotal, // تعداد کل فیلترشده
|
||||||
|
'unfilteredTotal' => $totalItems, // تعداد کل بدون فیلتر (اختیاری)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue