add date filter to explore account report

This commit is contained in:
Hesabix 2025-08-14 14:13:47 +00:00
parent b1ce11930e
commit d87d3ba137
4 changed files with 474 additions and 47 deletions

View file

@ -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);
}
/**

View file

@ -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();
}

View file

@ -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,

View file

@ -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>