From 43bc04012dcd2361421e108275abbb2262a7c40c Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 4 Jan 2026 00:36:00 +0800 Subject: [PATCH] support setting timezone type in reconciliation statement dialog / page --- .../base/AccountBalanceTrendsChartBase.ts | 47 +++-- .../mobile/AccountBalanceTrendsBarChart.vue | 2 +- src/core/datetime.ts | 18 +- src/lib/datetime.ts | 199 +++++++++--------- src/stores/statistics.ts | 2 +- .../ReconciliationStatementPageBase.ts | 11 +- .../dialogs/ReconciliationStatementDialog.vue | 23 +- src/views/desktop/transactions/ListPage.vue | 4 +- .../accounts/ReconciliationStatementPage.vue | 27 ++- src/views/mobile/transactions/ListPage.vue | 4 +- 10 files changed, 213 insertions(+), 124 deletions(-) diff --git a/src/components/base/AccountBalanceTrendsChartBase.ts b/src/components/base/AccountBalanceTrendsChartBase.ts index d0279c8d..9884e5fa 100644 --- a/src/components/base/AccountBalanceTrendsChartBase.ts +++ b/src/components/base/AccountBalanceTrendsChartBase.ts @@ -3,11 +3,12 @@ import { computed } from 'vue'; import { useI18n } from '@/locales/helpers.ts'; import { + type DateTime, type UnixTimeRange, type YearUnixTime, type YearQuarterUnixTime, type YearMonthUnixTime, - YearMonthDayUnixTime, + YearMonthDayUnixTime } from '@/core/datetime.ts'; import type { FiscalYearUnixTime } from '@/core/fiscalyear.ts'; import { ChartDateAggregationType } from '@/core/statistics.ts'; @@ -19,13 +20,14 @@ import { sumAmounts } from '@/lib/numeral.ts'; import { parseDateTimeFromUnixTime, getGregorianCalendarYearAndMonthFromUnixTime, - getYearFirstUnixTimeBySpecifiedUnixTime, - getQuarterFirstUnixTimeBySpecifiedUnixTime, - getMonthFirstUnixTimeBySpecifiedUnixTime, - getDayFirstUnixTimeBySpecifiedUnixTime, + getYearFirstDateTimeBySpecifiedDateTime, + getQuarterFirstTimeTimeBySpecifiedUnixTime, + getMonthFirstDateTimeBySpecifiedUnixTime, + getDayFirstDateTimeBySpecifiedUnixTime, getAllDaysStartAndEndUnixTimes, - getFiscalYearStartUnixTime + getFiscalYearStartDateTime } from '@/lib/datetime.ts'; +import { TimezoneTypeForStatistics } from '@/core/timezone.ts'; import { getAllDateRangesByYearMonthRange } from '@/lib/statistics.ts'; export interface AccountBalanceUnixTimeAndBalanceRange extends UnixTimeRange { @@ -47,6 +49,7 @@ export interface AccountBalanceTrendsChartItem { export interface CommonAccountBalanceTrendsChartProps { items: TransactionReconciliationStatementResponseItem[] | undefined; dateAggregationType: number; + timezoneUsedForDateRange: number; fiscalYearStart: number; account: AccountInfoResponse; } @@ -117,29 +120,40 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren return ret; } - const dayDataItemsMap: Record = {}; + const dayDataItemsMap: Record = {}; for (const dateItem of props.items) { - let dateRangeMinUnixTime = 0; + let minDateTime: DateTime; + let displayDate = ''; + let transactionTimeUtfOffset: number | undefined = undefined; + + if (props.timezoneUsedForDateRange === TimezoneTypeForStatistics.TransactionTimezone.type) { + transactionTimeUtfOffset = dateItem.utcOffset; + } if (props.dateAggregationType === ChartDateAggregationType.Year.type) { - dateRangeMinUnixTime = getYearFirstUnixTimeBySpecifiedUnixTime(dateItem.time); + minDateTime = getYearFirstDateTimeBySpecifiedDateTime(dateItem.time, transactionTimeUtfOffset); + displayDate = formatDateTimeToGregorianLikeShortYear(minDateTime); } else if (props.dateAggregationType === ChartDateAggregationType.FiscalYear.type) { - dateRangeMinUnixTime = getFiscalYearStartUnixTime(dateItem.time, props.fiscalYearStart); + minDateTime = getFiscalYearStartDateTime(dateItem.time, props.fiscalYearStart, transactionTimeUtfOffset); + displayDate = formatDateTimeToGregorianLikeFiscalYear(minDateTime); } else if (props.dateAggregationType === ChartDateAggregationType.Quarter.type) { - dateRangeMinUnixTime = getQuarterFirstUnixTimeBySpecifiedUnixTime(dateItem.time); + minDateTime = getQuarterFirstTimeTimeBySpecifiedUnixTime(dateItem.time, transactionTimeUtfOffset); + displayDate = formatDateTimeToGregorianLikeYearQuarter(minDateTime); } else if (props.dateAggregationType === ChartDateAggregationType.Month.type) { - dateRangeMinUnixTime = getMonthFirstUnixTimeBySpecifiedUnixTime(dateItem.time); + minDateTime = getMonthFirstDateTimeBySpecifiedUnixTime(dateItem.time, transactionTimeUtfOffset); + displayDate = formatDateTimeToGregorianLikeShortYearMonth(minDateTime); } else if (props.dateAggregationType === ChartDateAggregationType.Day.type) { - dateRangeMinUnixTime = getDayFirstUnixTimeBySpecifiedUnixTime(dateItem.time); + minDateTime = getDayFirstDateTimeBySpecifiedUnixTime(dateItem.time, transactionTimeUtfOffset); + displayDate = formatDateTimeToShortDate(minDateTime); } else { return ret; } - const dataItems: TransactionReconciliationStatementResponseItem[] = dayDataItemsMap[dateRangeMinUnixTime] || []; + const dataItems: TransactionReconciliationStatementResponseItem[] = dayDataItemsMap[displayDate] || []; dataItems.push(dateItem); - dayDataItemsMap[dateRangeMinUnixTime] = dataItems; + dayDataItemsMap[displayDate] = dataItems; } let lastOpeningBalance = dataDateRange.value.minUnixTimeOpeningBalance; @@ -150,7 +164,6 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren let lastAverageBalance = lastClosingBalance; for (const dateRange of allDateRanges.value) { - const dataItems = dayDataItemsMap[dateRange.minUnixTime]; const minDateTime = parseDateTimeFromUnixTime(dateRange.minUnixTime); let displayDate = ''; @@ -169,6 +182,8 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren return ret; } + const dataItems = dayDataItemsMap[displayDate]; + if (isArray(dataItems)) { if (dataItems.length < 1) { continue; diff --git a/src/components/mobile/AccountBalanceTrendsBarChart.vue b/src/components/mobile/AccountBalanceTrendsBarChart.vue index 962e8372..28646619 100644 --- a/src/components/mobile/AccountBalanceTrendsBarChart.vue +++ b/src/components/mobile/AccountBalanceTrendsBarChart.vue @@ -20,7 +20,7 @@