diff --git a/hesabixCore/src/Controller/ExploreAccountsController.php b/hesabixCore/src/Controller/ExploreAccountsController.php index 19af10b..10dc272 100644 --- a/hesabixCore/src/Controller/ExploreAccountsController.php +++ b/hesabixCore/src/Controller/ExploreAccountsController.php @@ -51,6 +51,7 @@ class ExploreAccountsController extends AbstractController $page = $params['page'] ?? 1; $perPage = $params['perPage'] ?? 10; $offset = ($page - 1) * $perPage; + $dateFilter = $params['dateFilter'] ?? null; $nodeId = $params['node'] === 'root' ? $this->em->getRepository(HesabdariTable::class) @@ -80,7 +81,7 @@ class ExploreAccountsController extends AbstractController foreach ($children as $child) { $allNodes = $this->getAllDescendants($child, $acc); $allNodes[] = $child; - $rows = $this->getRowsForNodes($allNodes, $acc); + $rows = $this->getRowsForNodes($allNodes, $acc, $dateFilter); $output[] = $this->calculateTotals($rows, $child, $acc); } break; @@ -101,7 +102,7 @@ class ExploreAccountsController extends AbstractController 'ref' => $node, 'bid' => $acc['bid'], 'year' => $acc['year'], - ], $acc['money']); + ], $acc['money'], $dateFilter); $output[] = $this->calculateBankTotals($rows, $bankAccount, $node); } break; @@ -122,7 +123,7 @@ class ExploreAccountsController extends AbstractController 'ref' => $node, 'bid' => $acc['bid'], 'year' => $acc['year'], - ], $acc['money']); + ], $acc['money'], $dateFilter); $output[] = $this->calculateCashdeskTotals($rows, $cashdesk, $node); } break; @@ -143,7 +144,7 @@ class ExploreAccountsController extends AbstractController 'ref' => $node, 'bid' => $acc['bid'], 'year' => $acc['year'], - ], $acc['money']); + ], $acc['money'], $dateFilter); $output[] = $this->calculateSalaryTotals($rows, $salary, $node); } break; @@ -162,7 +163,7 @@ class ExploreAccountsController extends AbstractController 'ref' => $node, 'bid' => $acc['bid'], 'year' => $acc['year'], - ], $acc['money']); + ], $acc['money'], $dateFilter); $output[] = $this->calculatePersonTotals($rows, $person, $node); } break; @@ -181,7 +182,7 @@ class ExploreAccountsController extends AbstractController 'ref' => $node, 'bid' => $acc['bid'], 'year' => $acc['year'], - ], $acc['money']); + ], $acc['money'], $dateFilter); $output[] = $this->calculateCommodityTotals($rows, $commodity, $node); } break; @@ -200,7 +201,7 @@ class ExploreAccountsController extends AbstractController 'ref' => $node, 'bid' => $acc['bid'], 'year' => $acc['year'], - ], $acc['money']); + ], $acc['money'], $dateFilter); $output[] = $this->calculateChequeTotals($rows, $cheque, $node); } break; @@ -241,6 +242,7 @@ class ExploreAccountsController extends AbstractController $page = max(1, (int) ($params['page'] ?? 1)); $perPage = max(1, (int) ($params['perPage'] ?? 10)); $offset = ($page - 1) * $perPage; + $dateFilter = $params['dateFilter'] ?? null; $rows = []; $totalItems = 0; @@ -265,6 +267,14 @@ class ExploreAccountsController extends AbstractController ->setParameter('money', $acc['money']) ->setParameter('year', $acc['year']); + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + $totalItems = (int) $qb->select('COUNT(r.id)') ->getQuery() ->getSingleScalarResult(); @@ -298,6 +308,14 @@ class ExploreAccountsController extends AbstractController ->setParameter('year', $acc['year']) ->setParameter('money', $acc['money']); + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + $totalItems = (int) $qb->select('COUNT(r.id)') ->getQuery() ->getSingleScalarResult(); @@ -331,6 +349,14 @@ class ExploreAccountsController extends AbstractController ->setParameter('year', $acc['year']) ->setParameter('money', $acc['money']); + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + $totalItems = (int) $qb->select('COUNT(r.id)') ->getQuery() ->getSingleScalarResult(); @@ -364,6 +390,14 @@ class ExploreAccountsController extends AbstractController ->setParameter('year', $acc['year']) ->setParameter('money', $acc['money']); + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + $totalItems = (int) $qb->select('COUNT(r.id)') ->getQuery() ->getSingleScalarResult(); @@ -396,6 +430,14 @@ class ExploreAccountsController extends AbstractController ->setParameter('year', $acc['year']) ->setParameter('money', $acc['money']); + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + $totalItems = (int) $qb->select('COUNT(r.id)') ->getQuery() ->getSingleScalarResult(); @@ -428,6 +470,14 @@ class ExploreAccountsController extends AbstractController ->setParameter('year', $acc['year']) ->setParameter('money', $acc['money']); + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + $totalItems = (int) $qb->select('COUNT(r.id)') ->getQuery() ->getSingleScalarResult(); @@ -460,6 +510,14 @@ class ExploreAccountsController extends AbstractController ->setParameter('year', $acc['year']) ->setParameter('money', $acc['money']); + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + $totalItems = (int) $qb->select('COUNT(r.id)') ->getQuery() ->getSingleScalarResult(); @@ -500,6 +558,8 @@ class ExploreAccountsController extends AbstractController throw $this->createNotFoundException('Required parameters (node, type, isObject) are missing'); } + $dateFilter = $params['dateFilter'] ?? null; + $node = $this->em->getRepository(HesabdariTable::class) ->findNode($params['upperID'] ?? $params['node'], $acc['bid']->getId()); if (!$node) { @@ -510,7 +570,7 @@ class ExploreAccountsController extends AbstractController if ($params['isObject'] === false) { $allNodes = $this->getAllDescendants($node, $acc); $allNodes[] = $node; - $rows = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') + $qb = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') ->innerJoin('r.doc', 'd') ->where('r.ref IN (:nodeIds)') ->andWhere('r.bid = :bid OR r.bid IS NULL') @@ -519,9 +579,17 @@ class ExploreAccountsController extends AbstractController ->setParameter('nodeIds', array_map(fn($n) => $n->getId(), $allNodes)) ->setParameter('bid', $acc['bid']) ->setParameter('money', $acc['money']) - ->setParameter('year', $acc['year']) - ->getQuery() - ->getResult(); + ->setParameter('year', $acc['year']); + + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + + $rows = $qb->getQuery()->getResult(); } else { switch ($params['type']) { case 'bank': @@ -533,7 +601,7 @@ class ExploreAccountsController extends AbstractController if (!$item) { throw $this->createNotFoundException('Bank account not found'); } - $rows = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') + $qb = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') ->innerJoin('r.doc', 'd') ->where('r.bank = :bank') ->andWhere('r.ref = :ref') @@ -544,9 +612,17 @@ class ExploreAccountsController extends AbstractController ->setParameter('ref', $node) ->setParameter('bid', $acc['bid']) ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->getQuery() - ->getResult(); + ->setParameter('money', $acc['money']); + + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + + $rows = $qb->getQuery()->getResult(); break; case 'cashdesk': @@ -558,7 +634,7 @@ class ExploreAccountsController extends AbstractController if (!$item) { throw $this->createNotFoundException('Cashdesk not found'); } - $rows = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') + $qb = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') ->innerJoin('r.doc', 'd') ->where('r.cashdesk = :cashdesk') ->andWhere('r.ref = :ref') @@ -569,9 +645,17 @@ class ExploreAccountsController extends AbstractController ->setParameter('ref', $node) ->setParameter('bid', $acc['bid']) ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->getQuery() - ->getResult(); + ->setParameter('money', $acc['money']); + + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + + $rows = $qb->getQuery()->getResult(); break; case 'salary': @@ -583,7 +667,7 @@ class ExploreAccountsController extends AbstractController if (!$item) { throw $this->createNotFoundException('Salary not found'); } - $rows = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') + $qb = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') ->innerJoin('r.doc', 'd') ->where('r.salary = :salary') ->andWhere('r.ref = :ref') @@ -594,9 +678,17 @@ class ExploreAccountsController extends AbstractController ->setParameter('ref', $node) ->setParameter('bid', $acc['bid']) ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->getQuery() - ->getResult(); + ->setParameter('money', $acc['money']); + + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + + $rows = $qb->getQuery()->getResult(); break; case 'person': @@ -607,7 +699,7 @@ class ExploreAccountsController extends AbstractController if (!$item) { throw $this->createNotFoundException('Person not found'); } - $rows = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') + $qb = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') ->innerJoin('r.doc', 'd') ->where('r.person = :person') ->andWhere('r.ref = :ref') @@ -618,9 +710,17 @@ class ExploreAccountsController extends AbstractController ->setParameter('ref', $node) ->setParameter('bid', $acc['bid']) ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->getQuery() - ->getResult(); + ->setParameter('money', $acc['money']); + + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + + $rows = $qb->getQuery()->getResult(); break; case 'commodity': @@ -631,7 +731,7 @@ class ExploreAccountsController extends AbstractController if (!$item) { throw $this->createNotFoundException('Commodity not found'); } - $rows = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') + $qb = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') ->innerJoin('r.doc', 'd') ->where('r.commodity = :commodity') ->andWhere('r.ref = :ref') @@ -642,9 +742,17 @@ class ExploreAccountsController extends AbstractController ->setParameter('ref', $node) ->setParameter('bid', $acc['bid']) ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->getQuery() - ->getResult(); + ->setParameter('money', $acc['money']); + + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + + $rows = $qb->getQuery()->getResult(); break; case 'cheque': @@ -655,7 +763,7 @@ class ExploreAccountsController extends AbstractController if (!$item) { throw $this->createNotFoundException('Cheque not found'); } - $rows = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') + $qb = $this->em->getRepository(HesabdariRow::class)->createQueryBuilder('r') ->innerJoin('r.doc', 'd') ->where('r.cheque = :cheque') ->andWhere('r.ref = :ref') @@ -666,9 +774,17 @@ class ExploreAccountsController extends AbstractController ->setParameter('ref', $node) ->setParameter('bid', $acc['bid']) ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->getQuery() - ->getResult(); + ->setParameter('money', $acc['money']); + + // اضافه کردن فیلتر تاریخ + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $qb->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + + $rows = $qb->getQuery()->getResult(); break; default: @@ -741,14 +857,14 @@ class ExploreAccountsController extends AbstractController /** * پیدا کردن ردیف‌های مرتبط با نودها (برای type=calc) */ - private function getRowsForNodes(array $nodes, array $acc): array + private function getRowsForNodes(array $nodes, array $acc, ?array $dateFilter = null): array { $nodeIds = array_unique(array_map(fn($node) => $node->getId(), $nodes)); return $this->em->getRepository(HesabdariRow::class)->findByJoinMoney([ 'ref' => $nodeIds, 'bid' => $acc['bid'], 'year' => $acc['year'], - ], $acc['money']); + ], $acc['money'], $dateFilter); } /** diff --git a/hesabixCore/src/Repository/HesabdariRowRepository.php b/hesabixCore/src/Repository/HesabdariRowRepository.php index 8c23356..a1a741c 100644 --- a/hesabixCore/src/Repository/HesabdariRowRepository.php +++ b/hesabixCore/src/Repository/HesabdariRowRepository.php @@ -33,7 +33,7 @@ class HesabdariRowRepository extends ServiceEntityRepository /** * پیدا کردن ردیف‌ها با جوین روی سند و فیلتر پول، با حذف تکرارها */ - public function findByJoinMoney(array $params, Money $money): array + public function findByJoinMoney(array $params, Money $money, ?array $dateFilter = null): array { $query = $this->createQueryBuilder('t') ->select('DISTINCT t') // حذف تکرارها با DISTINCT @@ -56,6 +56,14 @@ class HesabdariRowRepository extends ServiceEntityRepository } } + // اضافه کردن فیلتر تاریخ اگر موجود باشد + if ($dateFilter && isset($dateFilter['startDate']) && isset($dateFilter['endDate'])) { + $query->andWhere('d.date >= :startDate') + ->andWhere('d.date <= :endDate') + ->setParameter('startDate', $dateFilter['startDate']) + ->setParameter('endDate', $dateFilter['endDate']); + } + return $query->getQuery()->getResult(); } diff --git a/webUI/src/views/acc/component/reports/detailsBtn.vue b/webUI/src/views/acc/component/reports/detailsBtn.vue index 73e043d..856eab9 100755 --- a/webUI/src/views/acc/component/reports/detailsBtn.vue +++ b/webUI/src/views/acc/component/reports/detailsBtn.vue @@ -98,6 +98,13 @@ export default defineComponent({ type: Number, default: null, }, + dateFilter: { + type: Object, + default: () => ({ + startDate: '', + endDate: '', + }), + }, }, setup(props) { const { t } = useI18n(); @@ -123,14 +130,24 @@ export default defineComponent({ const loadData = async () => { loading.value = true; try { - const response = await axios.post('/api/report/acc/get_details', { + const requestData = { node: props.node, type: props.nodeType, isObject: props.isObject, upperId: props.upperId, page: serverOptions.value.page, perPage: serverOptions.value.rowsPerPage, - }); + }; + + // اضافه کردن فیلتر تاریخ اگر موجود باشد + if (props.dateFilter && props.dateFilter.startDate && props.dateFilter.endDate) { + requestData.dateFilter = { + startDate: props.dateFilter.startDate, + endDate: props.dateFilter.endDate, + }; + } + + const response = await axios.post('/api/report/acc/get_details', requestData); items.value = response.data.items || []; totalItems.value = response.data.pagination.totalItems || 0; serverOptions.value.page = response.data.pagination.currentPage || 1; @@ -146,14 +163,24 @@ export default defineComponent({ const exportToExcel = async () => { loading.value = true; try { + const requestData = { + node: props.node, + type: props.nodeType, + isObject: props.isObject, + upperId: props.upperId, + }; + + // اضافه کردن فیلتر تاریخ اگر موجود باشد + if (props.dateFilter && props.dateFilter.startDate && props.dateFilter.endDate) { + requestData.dateFilter = { + startDate: props.dateFilter.startDate, + endDate: props.dateFilter.endDate, + }; + } + const response = await axios.post( '/api/report/acc/export_details_excel', - { - node: props.node, - type: props.nodeType, - isObject: props.isObject, - upperId: props.upperId, - }, + requestData, { responseType: 'blob' } ); const url = window.URL.createObjectURL(new Blob([response.data])); @@ -179,6 +206,13 @@ export default defineComponent({ loadData(); }, { deep: true }); + // مشاهده تغییرات فیلتر تاریخ + watch(() => props.dateFilter, () => { + if (dialog.value) { + loadData(); + } + }, { deep: true }); + return { loading, dialog, diff --git a/webUI/src/views/acc/reports/explore_accounts.vue b/webUI/src/views/acc/reports/explore_accounts.vue index 781fa88..38c05e2 100755 --- a/webUI/src/views/acc/reports/explore_accounts.vue +++ b/webUI/src/views/acc/reports/explore_accounts.vue @@ -30,6 +30,105 @@ + + + + + + + فیلتر بر اساس تاریخ + + فعال + + + + + + + + + + + + + + + + + + + اعمال فیلتر + اعمال + + + حذف + حذف + + + + + + @@ -51,7 +150,7 @@ >