support setting timezone type in reconciliation statement dialog / page

This commit is contained in:
MaysWind
2026-01-04 00:36:00 +08:00
parent 43154832b6
commit 43bc04012d
10 changed files with 213 additions and 124 deletions
@@ -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<number, TransactionReconciliationStatementResponseItem[]> = {};
const dayDataItemsMap: Record<string, TransactionReconciliationStatementResponseItem[]> = {};
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;