bug fix in persons

This commit is contained in:
Hesabix 2025-03-19 19:22:33 +00:00
parent f41123b4b2
commit 06092d46a2

View file

@ -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, // تعداد کل بدون فیلتر (اختیاری)
]); ]);
} }