add date filter to explore account report
This commit is contained in:
parent
b1ce11930e
commit
d87d3ba137
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -30,6 +30,105 @@
|
|||
</v-col>
|
||||
</v-row>
|
||||
</v-card-text>
|
||||
|
||||
<!-- Date Filter -->
|
||||
<v-card-text class="pt-0">
|
||||
<v-card variant="outlined" class="mb-4 date-filter-card">
|
||||
<v-card-title class="text-subtitle-1 font-weight-medium pa-4 pb-2">
|
||||
<v-icon icon="mdi-calendar-filter" class="me-2" color="primary"></v-icon>
|
||||
فیلتر بر اساس تاریخ
|
||||
<v-chip
|
||||
v-if="isDateFilterActive"
|
||||
color="success"
|
||||
size="small"
|
||||
class="ms-2"
|
||||
prepend-icon="mdi-check-circle"
|
||||
>
|
||||
فعال
|
||||
</v-chip>
|
||||
</v-card-title>
|
||||
<v-card-text class="pt-0">
|
||||
<v-row>
|
||||
<v-col cols="12" sm="6" md="4" class="date-picker-container">
|
||||
<v-text-field
|
||||
:model-value="formattedStartDate"
|
||||
label="تاریخ شروع"
|
||||
prepend-inner-icon="mdi-calendar"
|
||||
readonly
|
||||
@click="showStartDatePicker = true"
|
||||
variant="outlined"
|
||||
density="comfortable"
|
||||
/>
|
||||
<v-dialog v-model="showStartDatePicker" max-width="400">
|
||||
<v-date-picker
|
||||
v-model="gregorianStartDate"
|
||||
:min="convertJalaliToGregorian(year.start)"
|
||||
:max="convertJalaliToGregorian(year.end)"
|
||||
locale="fa"
|
||||
color="primary"
|
||||
@update:model-value="(value) => {
|
||||
dateFilter.startDate = convertGregorianToJalali(value);
|
||||
gregorianStartDate = value;
|
||||
showStartDatePicker = false;
|
||||
}"
|
||||
/>
|
||||
</v-dialog>
|
||||
</v-col>
|
||||
<v-col cols="12" sm="6" md="4" class="date-picker-container">
|
||||
<v-text-field
|
||||
:model-value="formattedEndDate"
|
||||
label="تاریخ پایان"
|
||||
prepend-inner-icon="mdi-calendar"
|
||||
readonly
|
||||
@click="showEndDatePicker = true"
|
||||
variant="outlined"
|
||||
density="comfortable"
|
||||
/>
|
||||
<v-dialog v-model="showEndDatePicker" max-width="400">
|
||||
<v-date-picker
|
||||
v-model="gregorianEndDate"
|
||||
:min="convertJalaliToGregorian(dateFilter.startDate || year.start)"
|
||||
:max="convertJalaliToGregorian(year.end)"
|
||||
locale="fa"
|
||||
color="primary"
|
||||
@update:model-value="(value) => {
|
||||
dateFilter.endDate = convertGregorianToJalali(value);
|
||||
gregorianEndDate = value;
|
||||
showEndDatePicker = false;
|
||||
}"
|
||||
/>
|
||||
</v-dialog>
|
||||
</v-col>
|
||||
<v-col cols="12" sm="12" md="4" class="d-flex align-center filter-buttons">
|
||||
<v-btn
|
||||
color="primary"
|
||||
variant="elevated"
|
||||
size="large"
|
||||
@click="applyDateFilter"
|
||||
:loading="loading"
|
||||
:disabled="!dateFilter.startDate || !dateFilter.endDate"
|
||||
class="flex-grow-1"
|
||||
prepend-icon="mdi-filter-check"
|
||||
>
|
||||
<span class="d-none d-sm-inline">اعمال فیلتر</span>
|
||||
<span class="d-sm-none">اعمال</span>
|
||||
</v-btn>
|
||||
<v-btn
|
||||
color="secondary"
|
||||
variant="outlined"
|
||||
size="large"
|
||||
@click="clearDateFilter"
|
||||
:disabled="!dateFilter.startDate && !dateFilter.endDate"
|
||||
prepend-icon="mdi-filter-off"
|
||||
>
|
||||
<span class="d-none d-sm-inline">حذف</span>
|
||||
<span class="d-sm-none">حذف</span>
|
||||
</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-card-text>
|
||||
|
||||
<!-- Table -->
|
||||
<v-card-text class="mt-0 pt-0 px-0">
|
||||
|
@ -51,7 +150,7 @@
|
|||
>
|
||||
<!-- Custom Slots -->
|
||||
<template #item-operation="{ id, type, isObject, upperID }">
|
||||
<DetailsBtn :node="id" :node-type="type" :is-object="isObject" :upper-id="upperID" />
|
||||
<DetailsBtn :node="id" :node-type="type" :is-object="isObject" :upper-id="upperID" :date-filter="dateFilter" />
|
||||
</template>
|
||||
<template #item-account="{ hasChild, type, isObject, code, account, id }">
|
||||
<v-btn
|
||||
|
@ -118,6 +217,8 @@
|
|||
<script>
|
||||
import axios from 'axios';
|
||||
import DetailsBtn from '../component/reports/detailsBtn.vue';
|
||||
import { format } from 'date-fns-jalali';
|
||||
import moment from 'jalali-moment';
|
||||
|
||||
export default {
|
||||
name: 'ExploreAccounts',
|
||||
|
@ -132,6 +233,16 @@
|
|||
plugins: [],
|
||||
errorDialog: false,
|
||||
errorMessage: '',
|
||||
dateFilter: {
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
},
|
||||
year: {
|
||||
start: '',
|
||||
end: '',
|
||||
},
|
||||
gregorianStartDate: '',
|
||||
gregorianEndDate: '',
|
||||
headers: [
|
||||
{ text: this.$t('table.account'), value: 'account', sortable: true },
|
||||
{ text: this.$t('table.debit_turnover'), value: 'his_bd', sortable: true, width: 100 },
|
||||
|
@ -149,8 +260,30 @@
|
|||
currentNode: 'root',
|
||||
currentType: 'calc',
|
||||
currentHasChild: true,
|
||||
showStartDatePicker: false,
|
||||
showEndDatePicker: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
isDateFilterActive() {
|
||||
return this.dateFilter.startDate && this.dateFilter.endDate &&
|
||||
(this.dateFilter.startDate !== this.year.start || this.dateFilter.endDate !== this.year.end);
|
||||
},
|
||||
formattedStartDate() {
|
||||
return this.dateFilter.startDate ? this.formatDateForDisplay(this.dateFilter.startDate) : '';
|
||||
},
|
||||
formattedEndDate() {
|
||||
return this.dateFilter.endDate ? this.formatDateForDisplay(this.dateFilter.endDate) : '';
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
'dateFilter.startDate'(newValue) {
|
||||
this.gregorianStartDate = this.convertJalaliToGregorian(newValue);
|
||||
},
|
||||
'dateFilter.endDate'(newValue) {
|
||||
this.gregorianEndDate = this.convertJalaliToGregorian(newValue);
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async loadNode(id, type, hasChild, page) {
|
||||
this.loading = true;
|
||||
|
@ -164,6 +297,10 @@
|
|||
hasChild,
|
||||
page: page || this.pagination.currentPage,
|
||||
perPage: this.pagination.perPage,
|
||||
dateFilter: this.dateFilter.startDate && this.dateFilter.endDate ? {
|
||||
startDate: this.dateFilter.startDate,
|
||||
endDate: this.dateFilter.endDate,
|
||||
} : null,
|
||||
});
|
||||
this.items = response.data.itemData || [];
|
||||
this.tree = response.data.tree || [];
|
||||
|
@ -184,6 +321,17 @@
|
|||
try {
|
||||
const pluginResponse = await axios.post('/api/plugin/get/actives');
|
||||
this.plugins = pluginResponse.data || [];
|
||||
|
||||
// دریافت اطلاعات سال مالی
|
||||
const yearResponse = await axios.get('/api/year/get');
|
||||
this.year = yearResponse.data;
|
||||
|
||||
// تنظیم تاریخهای پیشفرض
|
||||
this.dateFilter.startDate = this.year.start;
|
||||
this.dateFilter.endDate = this.year.end;
|
||||
this.gregorianStartDate = this.convertJalaliToGregorian(this.dateFilter.startDate);
|
||||
this.gregorianEndDate = this.convertJalaliToGregorian(this.dateFilter.endDate);
|
||||
|
||||
await this.loadNode('root', 'calc', true, 1);
|
||||
} catch (error) {
|
||||
this.showError(this.$t('error.initial_load') + (error.response?.data?.message || error.message));
|
||||
|
@ -191,6 +339,20 @@
|
|||
this.loading = false;
|
||||
}
|
||||
},
|
||||
applyDateFilter() {
|
||||
if (this.dateFilter.startDate && this.dateFilter.endDate) {
|
||||
this.gregorianStartDate = this.convertJalaliToGregorian(this.dateFilter.startDate);
|
||||
this.gregorianEndDate = this.convertJalaliToGregorian(this.dateFilter.endDate);
|
||||
this.loadNode(this.currentNode, this.currentType, this.currentHasChild, 1);
|
||||
}
|
||||
},
|
||||
clearDateFilter() {
|
||||
this.dateFilter.startDate = this.year.start;
|
||||
this.dateFilter.endDate = this.year.end;
|
||||
this.gregorianStartDate = this.convertJalaliToGregorian(this.dateFilter.startDate);
|
||||
this.gregorianEndDate = this.convertJalaliToGregorian(this.dateFilter.endDate);
|
||||
this.loadNode(this.currentNode, this.currentType, this.currentHasChild, 1);
|
||||
},
|
||||
showError(message) {
|
||||
this.errorMessage = message;
|
||||
this.errorDialog = true;
|
||||
|
@ -198,6 +360,63 @@
|
|||
formatNumber(value) {
|
||||
return value ? Number(value).toLocaleString('fa-IR') : '0';
|
||||
},
|
||||
formatDateForDisplay(dateString) {
|
||||
if (!dateString) return '';
|
||||
|
||||
try {
|
||||
// اگر تاریخ شمسی است (فرمت Y/m/d)، آن را به میلادی تبدیل کن
|
||||
if (typeof dateString === 'string' && dateString.includes('/')) {
|
||||
const parts = dateString.split('/');
|
||||
if (parts.length === 3) {
|
||||
// استفاده از jalali-moment برای تبدیل دقیق
|
||||
const gregorianDate = moment(dateString, 'jYYYY/jMM/jDD').toDate();
|
||||
return format(gregorianDate, 'yyyy/MM/dd');
|
||||
}
|
||||
}
|
||||
|
||||
// اگر تاریخ میلادی است
|
||||
const date = new Date(dateString);
|
||||
return format(date, 'yyyy/MM/dd');
|
||||
} catch (error) {
|
||||
return dateString;
|
||||
}
|
||||
},
|
||||
convertJalaliToGregorian(jalaliDate) {
|
||||
if (!jalaliDate) return '';
|
||||
|
||||
try {
|
||||
// اگر تاریخ شمسی است (فرمت Y/m/d)، آن را به میلادی تبدیل کن
|
||||
if (typeof jalaliDate === 'string' && jalaliDate.includes('/')) {
|
||||
const parts = jalaliDate.split('/');
|
||||
if (parts.length === 3) {
|
||||
const year = parseInt(parts[0]);
|
||||
const month = parseInt(parts[1]);
|
||||
const day = parseInt(parts[2]);
|
||||
|
||||
// استفاده از jalali-moment برای تبدیل دقیق
|
||||
const gregorianDate = moment(`${year}/${month}/${day}`, 'jYYYY/jMM/jDD').format('YYYY-MM-DD');
|
||||
return gregorianDate;
|
||||
}
|
||||
}
|
||||
|
||||
return jalaliDate;
|
||||
} catch (error) {
|
||||
console.error('Error converting Jalali to Gregorian:', error);
|
||||
return jalaliDate;
|
||||
}
|
||||
},
|
||||
convertGregorianToJalali(gregorianDate) {
|
||||
if (!gregorianDate) return '';
|
||||
|
||||
try {
|
||||
// استفاده از jalali-moment برای تبدیل دقیق
|
||||
const jalaliDate = moment(gregorianDate, 'YYYY-MM-DD').format('jYYYY/jMM/jDD');
|
||||
return jalaliDate;
|
||||
} catch (error) {
|
||||
console.error('Error converting Gregorian to Jalali:', error);
|
||||
return gregorianDate;
|
||||
}
|
||||
},
|
||||
isPluginActive(plugName) {
|
||||
return !!this.plugins[plugName];
|
||||
},
|
||||
|
@ -208,8 +427,58 @@
|
|||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* Global styles for Vuetify date picker z-index */
|
||||
.v-date-picker {
|
||||
z-index: 9999 !important;
|
||||
}
|
||||
|
||||
.v-dialog {
|
||||
z-index: 9999 !important;
|
||||
}
|
||||
|
||||
.v-overlay {
|
||||
z-index: 9999 !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style scoped>
|
||||
.customize-table {
|
||||
font-family: 'Vazir', sans-serif;
|
||||
position: relative;
|
||||
z-index: 1 !important;
|
||||
}
|
||||
|
||||
.date-filter-card {
|
||||
border-left: 4px solid #1976d2;
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.filter-buttons {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.date-picker-container {
|
||||
position: relative;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
/* کاهش z-index برای EasyDataTable */
|
||||
:deep(.easy-data-table) {
|
||||
position: relative;
|
||||
z-index: 1 !important;
|
||||
}
|
||||
|
||||
:deep(.easy-data-table__table) {
|
||||
position: relative;
|
||||
z-index: 1 !important;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.filter-buttons {
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
}
|
||||
</style>
|
Loading…
Reference in a new issue