support credit card billing cycles as a time granularity option in the account balance trend chart on the account reconciliation statements page

This commit is contained in:
MaysWind
2026-04-10 02:26:55 +08:00
parent d44798bf0f
commit a604737c7c
30 changed files with 163 additions and 30 deletions
@@ -8,7 +8,8 @@ import {
type YearUnixTime,
type YearQuarterUnixTime,
type YearMonthUnixTime,
YearMonthDayUnixTime
YearMonthDayUnixTime,
DateRange
} from '@/core/datetime.ts';
import type { FiscalYearUnixTime } from '@/core/fiscalyear.ts';
import { ChartDateAggregationType } from '@/core/statistics.ts';
@@ -24,7 +25,9 @@ import {
getQuarterFirstTimeTimeBySpecifiedUnixTime,
getMonthFirstDateTimeBySpecifiedUnixTime,
getDayFirstDateTimeBySpecifiedUnixTime,
getBillingCycleLastUnixTimeBySpecifiedUnixTime,
getAllDaysStartAndEndUnixTimes,
getAllBillingCyclesStartAndEndUnixTimes,
getFiscalYearStartDateTime
} from '@/lib/datetime.ts';
import { TimezoneTypeForStatistics } from '@/core/timezone.ts';
@@ -43,6 +46,7 @@ export interface AccountBalanceTrendsChartItem {
dateRangeKey: string;
lastYearDateRangeKey: string;
displayDate: string;
alternativeDisplayDate: string;
openingBalance: number;
closingBalance: number;
minimumBalance: number;
@@ -59,6 +63,7 @@ export interface CommonAccountBalanceTrendsChartProps {
timezoneUsedForDateRange: number;
fiscalYearStart: number;
account: AccountInfoResponse;
statementDate: number | undefined;
}
export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTrendsChartProps) {
@@ -67,11 +72,12 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren
formatDateTimeToGregorianLikeShortYear,
formatDateTimeToGregorianLikeShortYearMonth,
formatDateTimeToGregorianLikeYearQuarter,
formatDateTimeToGregorianLikeFiscalYear
formatDateTimeToGregorianLikeFiscalYear,
formatDateRange
} = useI18n();
const showYearOverYearOnTooltip = ref<boolean>(true);
const showPeriodOverPeriodOnTooltip = computed<boolean>(() => props.dateAggregationType === ChartDateAggregationType.Day.type || props.dateAggregationType === ChartDateAggregationType.Month.type || props.dateAggregationType === ChartDateAggregationType.Quarter.type);
const showPeriodOverPeriodOnTooltip = computed<boolean>(() => props.dateAggregationType === ChartDateAggregationType.Day.type || props.dateAggregationType === ChartDateAggregationType.Month.type || props.dateAggregationType === ChartDateAggregationType.Quarter.type || props.dateAggregationType === ChartDateAggregationType.BillingCycle.type);
const dataDateRange = computed<AccountBalanceUnixTimeAndBalanceRange | null>(() => {
if (!props.items || props.items.length < 1) {
@@ -116,6 +122,8 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren
if (props.dateAggregationType === ChartDateAggregationType.Day.type) {
return getAllDaysStartAndEndUnixTimes(dataDateRange.value.minUnixTime, dataDateRange.value.maxUnixTime);
} else if (props.dateAggregationType === ChartDateAggregationType.BillingCycle.type) {
return getAllBillingCyclesStartAndEndUnixTimes(dataDateRange.value.minUnixTime, dataDateRange.value.maxUnixTime, props.statementDate ?? 1);
} else {
const startYearMonth = getGregorianCalendarYearAndMonthFromUnixTime(dataDateRange.value.minUnixTime);
const endYearMonth = getGregorianCalendarYearAndMonthFromUnixTime(dataDateRange.value.maxUnixTime);
@@ -156,6 +164,9 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren
} else if (props.dateAggregationType === ChartDateAggregationType.Day.type) {
minDateTime = getDayFirstDateTimeBySpecifiedUnixTime(dateItem.time, transactionTimeUtfOffset);
displayDate = formatDateTimeToShortDate(minDateTime);
} else if (props.dateAggregationType === ChartDateAggregationType.BillingCycle.type) {
minDateTime = getBillingCycleLastUnixTimeBySpecifiedUnixTime(dateItem.time, props.statementDate ?? 1, transactionTimeUtfOffset);
displayDate = formatDateTimeToGregorianLikeShortYearMonth(minDateTime);
} else {
return ret;
}
@@ -179,6 +190,7 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren
const minDateTime = parseDateTimeFromUnixTime(dateRange.minUnixTime);
let displayDate = '';
let alternativeDisplayDate = '';
if (props.dateAggregationType === ChartDateAggregationType.Year.type) {
displayDate = formatDateTimeToGregorianLikeShortYear(minDateTime);
@@ -190,6 +202,10 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren
displayDate = formatDateTimeToGregorianLikeShortYearMonth(minDateTime);
} else if (props.dateAggregationType === ChartDateAggregationType.Day.type) {
displayDate = formatDateTimeToShortDate(minDateTime);
} else if (props.dateAggregationType === ChartDateAggregationType.BillingCycle.type) {
const maxDateTime = parseDateTimeFromUnixTime(dateRange.maxUnixTime);
displayDate = formatDateTimeToGregorianLikeShortYearMonth(maxDateTime);
alternativeDisplayDate = formatDateRange(DateRange.Custom.type, dateRange.minUnixTime, dateRange.maxUnixTime);
} else {
return ret;
}
@@ -256,6 +272,7 @@ export function useAccountBalanceTrendsChartBase(props: CommonAccountBalanceTren
dateRangeKey: dateRangeKey,
lastYearDateRangeKey: lastYearDateRangeKey,
displayDate: displayDate,
alternativeDisplayDate: alternativeDisplayDate,
openingBalance: lastOpeningBalance,
closingBalance: lastClosingBalance,
minimumBalance: lastMinimumBalance,
@@ -211,6 +211,10 @@ const chartOptions = computed<object>(() => {
let periodOverPeriodDataItemDisplayItems: NameNumeralValue[] | undefined = undefined;
let separatorLineIndex: number | undefined = undefined;
if (dataItem.alternativeDisplayDate) {
header = dataItem.alternativeDisplayDate;
}
if (props.type === AccountBalanceTrendChartType.Boxplot.type) {
header += ` ${props.legendName}`;
displayItems = getBoxplotChartTooltip(dataItem);
@@ -27,7 +27,7 @@
:key="item.index"
:style="`top: ${virtualDataItems.topPosition}px`"
:virtual-list-index="item.index"
:title="item.displayDate"
:title="item.alternativeDisplayDate || item.displayDate"
:after="formatAmountToLocalizedNumeralsWithCurrency(item.closingBalance, account.currency)"
v-for="item in virtualDataItems.items"
>
@@ -99,6 +99,7 @@ const allVirtualListItems = computed<MobileAccountBalanceTrendsChartItem[]>(() =
dateRangeKey: dataItem.dateRangeKey,
lastYearDateRangeKey: dataItem.lastYearDateRangeKey,
displayDate: dataItem.displayDate,
alternativeDisplayDate: dataItem.alternativeDisplayDate,
openingBalance: dataItem.openingBalance,
closingBalance: dataItem.closingBalance,
medianBalance: dataItem.medianBalance,
+2
View File
@@ -236,6 +236,8 @@ export class ChartDateAggregationType {
public static readonly Year = new ChartDateAggregationType(2, 'Yearly', 'Aggregate by Year', StatisticsAnalysisType.TrendAnalysis, StatisticsAnalysisType.AssetTrends);
public static readonly FiscalYear = new ChartDateAggregationType(3, 'FiscalYearly', 'Aggregate by Fiscal Year', StatisticsAnalysisType.TrendAnalysis, StatisticsAnalysisType.AssetTrends);
public static readonly BillingCycle = new ChartDateAggregationType(11, 'BillingCycle', 'Aggregate by Billing Cycle');
public static readonly Default = ChartDateAggregationType.Month;
public readonly type: number;
+55
View File
@@ -890,6 +890,26 @@ export function getDayLastDateTimeBySpecifiedUnixTime(unixTime: number, utcOffse
return getDayFirstDateTimeBySpecifiedUnixTime(unixTime, utcOffset).add(1, 'days').subtract(1, 'seconds');
}
export function getBillingCycleFirstUnixTimeBySpecifiedUnixTime(unixTime: number, statementDate: number, utcOffset?: number): DateTime {
let date = moment.unix(unixTime);
if (isNumber(utcOffset)) {
date = date.tz(getFixedTimezoneName(utcOffset));
}
if (date.date() > statementDate) {
date = date.set({ date: statementDate + 1, hour: 0, minute: 0, second: 0, millisecond: 0 });
} else {
date = date.set({ date: statementDate, hour: 0, minute: 0, second: 0, millisecond: 0 }).add(-1, 'months').add(1, 'days');
}
return MomentDateTime.of(date);
}
export function getBillingCycleLastUnixTimeBySpecifiedUnixTime(unixTime: number, statementDate: number, utcOffset?: number): DateTime {
return getBillingCycleFirstUnixTimeBySpecifiedUnixTime(unixTime, statementDate, utcOffset).add(1, 'months').subtract(1, 'seconds');
}
export function getYearFirstUnixTime(year: number): number {
return moment().set({ year: year, month: 0, date: 1, hour: 0, minute: 0, second: 0, millisecond: 0 }).unix();
}
@@ -1106,6 +1126,41 @@ export function getAllMonthsStartAndEndUnixTimes(startYearMonth: Year0BasedMonth
return allYearMonthTimes;
}
export function getAllBillingCyclesStartAndEndUnixTimes(startUnixTime: number, endUnixTime: number, statementDate: number): YearMonthUnixTime[] {
const allYearMonthTimes: YearMonthUnixTime[] = [];
if (!startUnixTime || !endUnixTime) {
return allYearMonthTimes;
}
let unixTime: number = startUnixTime;
while (unixTime <= endUnixTime) {
const currentDateTime = parseDateTimeFromUnixTime(unixTime);
let currentBillingCycleMinDateTime: DateTime;
if (currentDateTime.getGregorianCalendarDay() > statementDate) {
const currentMonthMinDateTime = getMonthFirstDateTimeBySpecifiedUnixTime(unixTime);
currentBillingCycleMinDateTime = currentMonthMinDateTime.add(statementDate, 'days');
} else {
const currentMonthMinDateTime = getMonthFirstDateTimeBySpecifiedUnixTime(unixTime);
const previousMonthMinDateTime = currentMonthMinDateTime.add(-1, 'months');
currentBillingCycleMinDateTime = previousMonthMinDateTime.add(statementDate, 'days');
}
const currentBillingCycleMaxDateTime = currentBillingCycleMinDateTime.add(1, 'months').subtract(1, 'seconds');
const yearMonth: Year0BasedMonth = {
year: currentBillingCycleMaxDateTime.getGregorianCalendarYear(),
month0base: currentBillingCycleMaxDateTime.getGregorianCalendarMonth() - 1
};
allYearMonthTimes.push(YearMonthUnixTime.of(yearMonth, currentBillingCycleMinDateTime.getUnixTime(), currentBillingCycleMaxDateTime.getUnixTime()));
unixTime = currentBillingCycleMaxDateTime.getUnixTime() + 1;
}
return allYearMonthTimes;
}
export function getAllDaysStartAndEndUnixTimes(startUnixTime: number, endUnixTime: number): YearMonthDayUnixTime[] {
const allYearMonthDayTimes: YearMonthDayUnixTime[] = [];
+1 -1
View File
@@ -109,7 +109,7 @@ export function getDateRangeKeyWithYearOffset(dateRange: YearUnixTime | FiscalYe
return (dateRange.year + (yearOffset ?? 0)).toString();
} else if (dateAggregationType === ChartDateAggregationType.Quarter.type && 'quarter' in dateRange) {
return `${dateRange.year + (yearOffset ?? 0)}-${dateRange.quarter}`;
} else if (dateAggregationType === ChartDateAggregationType.Month.type && 'month0base' in dateRange) {
} else if ((dateAggregationType === ChartDateAggregationType.Month.type || dateAggregationType === ChartDateAggregationType.BillingCycle.type) && 'month0base' in dateRange) {
return `${dateRange.year + (yearOffset ?? 0)}-${dateRange.month0base + 1}`;
} else if (dateAggregationType === ChartDateAggregationType.Day.type && 'day' in dateRange) {
return `${dateRange.year + (yearOffset ?? 0)}-${dateRange.month}-${dateRange.day}`;
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Jährlich",
"Quarterly": "Vierteljährlich",
"Monthly": "Monatlich",
"Daily": "Täglich"
"Daily": "Täglich",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Westlich-arabische Ziffern",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Nach Quartal aggregieren",
"Aggregate by Year": "Nach Jahr aggregieren",
"Aggregate by Fiscal Year": "Nach Geschäftsjahr aggregieren",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Jahresvergleich",
"Period-over-Period": "Periodenvergleich",
"Filter Accounts": "Konten filtern",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Yearly",
"Quarterly": "Quarterly",
"Monthly": "Monthly",
"Daily": "Daily"
"Daily": "Daily",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Aggregate by Quarter",
"Aggregate by Year": "Aggregate by Year",
"Aggregate by Fiscal Year": "Aggregate by Fiscal Year",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Filter Accounts",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Anual",
"Quarterly": "Trimestral",
"Monthly": "Mensual",
"Daily": "Diario"
"Daily": "Diario",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Cifras Arábigas Occidentales",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Agregado por Trimestre",
"Aggregate by Year": "Agregado por Año",
"Aggregate by Fiscal Year": "Agregado por Año Fiscal",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Filtrar cuentas",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Annuel",
"Quarterly": "Trimestriel",
"Monthly": "Mensuel",
"Daily": "Quotidien"
"Daily": "Quotidien",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Chiffres arabes occidentaux",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Agréger par trimestre",
"Aggregate by Year": "Agréger par année",
"Aggregate by Fiscal Year": "Agréger par année fiscale",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Filtrer les comptes",
+10 -3
View File
@@ -634,7 +634,7 @@ export function useI18n() {
return ret;
}
function getLocalizedChartDateAggregationTypeAndDisplayName(analysisType: StatisticsAnalysisType, fullName: boolean): TypeAndDisplayName[] {
function getLocalizedChartDateAggregationTypeAndDisplayName(analysisType: StatisticsAnalysisType, fullName: boolean, includeBillingCycle: boolean): TypeAndDisplayName[] {
const ret: TypeAndDisplayName[] = [];
const allTypes: ChartDateAggregationType[] = ChartDateAggregationType.values(analysisType);
@@ -645,6 +645,13 @@ export function useI18n() {
});
}
if (includeBillingCycle) {
ret.push({
type: ChartDateAggregationType.BillingCycle.type,
displayName: t(fullName ? ChartDateAggregationType.BillingCycle.fullName : `granularity.${ChartDateAggregationType.BillingCycle.shortName}`)
});
}
return ret;
}
@@ -2432,8 +2439,8 @@ export function useI18n() {
getAllAccountBalanceTrendChartTypes: () => getLocalizedDisplayNameAndType(AccountBalanceTrendChartType.values()),
getAllStatisticsChartDataTypes: (analysisType: StatisticsAnalysisType, withDesktopOnlyChart?: boolean) => getLocalizedDisplayNameAndType(ChartDataType.values(analysisType, withDesktopOnlyChart)),
getAllStatisticsSortingTypes: (useAlternativeName?: boolean) => getLocalizedDisplayNameAndType(ChartSortingType.values(), useAlternativeName),
getAllStatisticsDateAggregationTypes: (analysisType: StatisticsAnalysisType) => getLocalizedChartDateAggregationTypeAndDisplayName(analysisType, true),
getAllStatisticsDateAggregationTypesWithShortName: (analysisType: StatisticsAnalysisType) => getLocalizedChartDateAggregationTypeAndDisplayName(analysisType, false),
getAllStatisticsDateAggregationTypes: (analysisType: StatisticsAnalysisType, includeBillingCycle: boolean) => getLocalizedChartDateAggregationTypeAndDisplayName(analysisType, true, includeBillingCycle),
getAllStatisticsDateAggregationTypesWithShortName: (analysisType: StatisticsAnalysisType, includeBillingCycle: boolean) => getLocalizedChartDateAggregationTypeAndDisplayName(analysisType, false, includeBillingCycle),
getAllTransactionEditScopeTypes: () => getLocalizedDisplayNameAndType(TransactionEditScopeType.values()),
getAllTransactionQuickSaveButtonStyles: () => getLocalizedDisplayNameAndType(TransactionQuickSaveButtonStyle.values()),
getAllTransactionQuickAddButtonActionTypes: () => getLocalizedDisplayNameAndType(TransactionQuickAddButtonActionType.values()),
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Yearly",
"Quarterly": "Quarterly",
"Monthly": "Monthly",
"Daily": "Daily"
"Daily": "Daily",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Aggrega per trimestre",
"Aggregate by Year": "Aggrega per anno",
"Aggregate by Fiscal Year": "Aggregate by Fiscal Year",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Filtra conti",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Yearly",
"Quarterly": "Quarterly",
"Monthly": "Monthly",
"Daily": "Daily"
"Daily": "Daily",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "四半期ごとに集計",
"Aggregate by Year": "年ごとに集計",
"Aggregate by Fiscal Year": "Aggregate by Fiscal Year",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "口座で絞り込み",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "ವಾರ್ಷಿಕ",
"Quarterly": "ತ್ರೈಮಾಸಿಕ",
"Monthly": "ಮಾಸಿಕ",
"Daily": "ದೈನಂದಿನ"
"Daily": "ದೈನಂದಿನ",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "ತ್ರೈಮಾಸಿಕ ಒಕ್ಕೂಟ",
"Aggregate by Year": "ವರ್ಷವಾರು ಒಕ್ಕೂಟ",
"Aggregate by Fiscal Year": "ಹಣಕಾಸು ವರ್ಷವಾರು ಒಕ್ಕೂಟ",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "ಖಾತೆಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಿ",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "연간",
"Quarterly": "분기별",
"Monthly": "월간",
"Daily": "일간"
"Daily": "일간",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "서양 아라비아 숫자",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "분기별 집계",
"Aggregate by Year": "연도별 집계",
"Aggregate by Fiscal Year": "회계 연도별 집계",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "계좌 필터",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Jaarlijks",
"Quarterly": "Per kwartaal",
"Monthly": "Maandelijks",
"Daily": "Dagelijks"
"Daily": "Dagelijks",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Groeperen per kwartaal",
"Aggregate by Year": "Groeperen per jaar",
"Aggregate by Fiscal Year": "Groeperen per boekjaar",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Rekeningen filteren",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Anual",
"Quarterly": "Trimestral",
"Monthly": "Mensal",
"Daily": "Diário"
"Daily": "Diário",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Algarismos Arábicos Ocidentais",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Agregar por Trimestre",
"Aggregate by Year": "Agregar por Ano",
"Aggregate by Fiscal Year": "Agregar por Ano Fiscal",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Filtrar Contas",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Ежегодно",
"Quarterly": "Ежеквартально",
"Monthly": "Ежемесячно",
"Daily": "Ежедневно"
"Daily": "Ежедневно",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Западно арабские цифры",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Агрегировать по кварталам",
"Aggregate by Year": "Агрегировать по годам",
"Aggregate by Fiscal Year": "Агрегировать по фискальным годам",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Фильтровать счета",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Letno",
"Quarterly": "Četrtletno",
"Monthly": "Mesečno",
"Daily": "Dnevno"
"Daily": "Dnevno",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Zahodne arabske številke",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Združi po četrtletjih",
"Aggregate by Year": "Združi po letih",
"Aggregate by Fiscal Year": "Združi po fiskalnih letih",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Filtriraj račune",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "ஆண்டுவாரியாக",
"Quarterly": "காலாண்டு வாரியாக",
"Monthly": "மாதாந்திர",
"Daily": "தினசரி"
"Daily": "தினசரி",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "மேற்கத்திய அரபு எண்கள்",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "காலாண்டு கூட்டமைப்பு",
"Aggregate by Year": "ஆண்டுவாரி கூட்டமைப்பு",
"Aggregate by Fiscal Year": "நிதி ஆண்டுவாரி கூட்டமைப்பு",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "கணக்குகளை வடிகட்டி செய்",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "รายปี",
"Quarterly": "รายไตรมาส",
"Monthly": "รายเดือน",
"Daily": "รายวัน"
"Daily": "รายวัน",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "เลขอารบิกตะวันตก",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "รวมตามไตรมาส",
"Aggregate by Year": "รวมตามปี",
"Aggregate by Fiscal Year": "รวมตามปีงบประมาณ",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "กรองบัญชี",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Yıllık",
"Quarterly": "Çeyreklik",
"Monthly": "Aylık",
"Daily": "Günlük"
"Daily": "Günlük",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Batı Arap Rakamları",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Çeyreğe Göre Topla",
"Aggregate by Year": "Yıla Göre Topla",
"Aggregate by Fiscal Year": "Mali Yıla Göre Topla",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Hesapları Filtrele",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Yearly",
"Quarterly": "Quarterly",
"Monthly": "Monthly",
"Daily": "Daily"
"Daily": "Daily",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Агрегувати за кварталами",
"Aggregate by Year": "Агрегувати за роками",
"Aggregate by Fiscal Year": "Aggregate by Fiscal Year",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Фільтрувати рахунки",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "Yearly",
"Quarterly": "Quarterly",
"Monthly": "Monthly",
"Daily": "Daily"
"Daily": "Daily",
"BillingCycle": "Billing Cycle"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "Tổng hợp theo quý",
"Aggregate by Year": "Tổng hợp theo năm",
"Aggregate by Fiscal Year": "Aggregate by Fiscal Year",
"Aggregate by Billing Cycle": "Aggregate by Billing Cycle",
"Year-over-Year": "Year-over-Year",
"Period-over-Period": "Period-over-Period",
"Filter Accounts": "Lọc tài khoản",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "按年",
"Quarterly": "按季度",
"Monthly": "按月",
"Daily": "按天"
"Daily": "按天",
"BillingCycle": "按账单周期"
},
"numeral": {
"Western Arabic Numerals": "阿拉伯数字",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "按季度聚合",
"Aggregate by Year": "按年聚合",
"Aggregate by Fiscal Year": "按财年聚合",
"Aggregate by Billing Cycle": "按账单周期聚合",
"Year-over-Year": "同比",
"Period-over-Period": "环比",
"Filter Accounts": "过滤账户",
+3 -1
View File
@@ -294,7 +294,8 @@
"Yearly": "依年份",
"Quarterly": "依季度",
"Monthly": "依月份",
"Daily": "依日期"
"Daily": "依日期",
"BillingCycle": "依帳單週期"
},
"numeral": {
"Western Arabic Numerals": "阿拉伯數字",
@@ -2210,6 +2211,7 @@
"Aggregate by Quarter": "依季度彙整",
"Aggregate by Year": "依年份彙整",
"Aggregate by Fiscal Year": "依財年彙整",
"Aggregate by Billing Cycle": "依帳單週期彙整",
"Year-over-Year": "同比",
"Period-over-Period": "環比",
"Filter Accounts": "篩選帳戶",
@@ -63,11 +63,12 @@ export function useReconciliationStatementPageBase() {
const defaultCurrency = computed<string>(() => userStore.currentUserDefaultCurrency);
const allChartTypes = computed<TypeAndDisplayName[]>(() => getAllAccountBalanceTrendChartTypes());
const allDateAggregationTypes = computed<TypeAndDisplayName[]>(() => getAllStatisticsDateAggregationTypesWithShortName(StatisticsAnalysisType.AssetTrends));
const allDateAggregationTypes = computed<TypeAndDisplayName[]>(() => getAllStatisticsDateAggregationTypesWithShortName(StatisticsAnalysisType.AssetTrends, !!currentAccountStatementDate.value));
const allTimezoneTypesUsedForDateRange = computed<TypeAndDisplayName[]>(() => getAllTimezoneTypesUsedForStatistics());
const currentAccount = computed(() => allAccountsMap.value[accountId.value]);
const currentAccountCurrency = computed<string>(() => currentAccount.value?.currency ?? defaultCurrency.value);
const currentAccountStatementDate = computed<number | undefined>(() => accountsStore.getAccountStatementDate(accountId.value) || undefined);
const isCurrentLiabilityAccount = computed<boolean>(() => currentAccount.value?.isLiability ?? false);
const exportFileName = computed<string>(() => {
@@ -309,6 +310,7 @@ export function useReconciliationStatementPageBase() {
allTimezoneTypesUsedForDateRange,
currentAccount,
currentAccountCurrency,
currentAccountStatementDate,
isCurrentLiabilityAccount,
exportFileName,
displayStartDateTime,
@@ -73,8 +73,8 @@ export function useStatisticsTransactionPageBase() {
}
});
const allSortingTypes = computed<TypeAndDisplayName[]>(() => getAllStatisticsSortingTypes());
const allTrendAnalysisDateAggregationTypes = computed<TypeAndDisplayName[]>(() => getAllStatisticsDateAggregationTypes(StatisticsAnalysisType.TrendAnalysis));
const allAssetTrendsDateAggregationTypes = computed<TypeAndDisplayName[]>(() => getAllStatisticsDateAggregationTypes(StatisticsAnalysisType.AssetTrends));
const allTrendAnalysisDateAggregationTypes = computed<TypeAndDisplayName[]>(() => getAllStatisticsDateAggregationTypes(StatisticsAnalysisType.TrendAnalysis, false));
const allAssetTrendsDateAggregationTypes = computed<TypeAndDisplayName[]>(() => getAllStatisticsDateAggregationTypes(StatisticsAnalysisType.AssetTrends, false));
const query = computed<TransactionStatisticsFilter>(() => statisticsStore.transactionStatisticsFilter);
const queryChartDataCategory = computed<string>(() => statisticsStore.categoricalAnalysisChartDataCategory);
@@ -246,6 +246,7 @@
:items="[]"
:legend-name="isCurrentLiabilityAccount ? tt('Account Outstanding Balance') : tt('Account Balance')"
:account="currentAccount"
:statement-date="currentAccountStatementDate"
:skeleton="true"
v-if="showAccountBalanceTrendsCharts && loading"
/>
@@ -258,6 +259,7 @@
:items="reconciliationStatements?.transactions"
:legend-name="isCurrentLiabilityAccount ? tt('Account Outstanding Balance') : tt('Account Balance')"
:account="currentAccount"
:statement-date="currentAccountStatementDate"
v-if="showAccountBalanceTrendsCharts && !loading"
/>
</div>
@@ -320,6 +322,7 @@ import {
mdiChartWaterfall,
mdiCalendarTodayOutline,
mdiCalendarMonthOutline,
mdiCalendarTextOutline,
mdiHomeClockOutline,
mdiInvoiceTextClockOutline,
mdiLayersTripleOutline,
@@ -353,6 +356,7 @@ const {
allTimezoneTypesUsedForDateRange,
currentAccount,
currentAccountCurrency,
currentAccountStatementDate,
isCurrentLiabilityAccount,
exportFileName,
displayStartDateTime,
@@ -391,6 +395,7 @@ const chartDataDateAggregationTypeIconMap = {
[ChartDateAggregationType.Quarter.type]: mdiLayersTripleOutline,
[ChartDateAggregationType.Year.type]: mdiLayersTripleOutline,
[ChartDateAggregationType.FiscalYear.type]: mdiLayersTripleOutline,
[ChartDateAggregationType.BillingCycle.type]: mdiCalendarTextOutline,
};
const timezoneTypeIconMap = {
@@ -277,6 +277,7 @@
:fiscal-year-start="fiscalYearStart"
:items="reconciliationStatements?.transactions"
:account="currentAccount"
:statement-date="currentAccountStatementDate"
/>
</f7-card-content>
</f7-card>
@@ -424,6 +425,7 @@ const {
isCurrentLiabilityAccount,
currentAccount,
currentAccountCurrency,
currentAccountStatementDate,
displayStartDateTime,
displayEndDateTime,
displayTotalInflows,