mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-19 01:04:25 +08:00
transaction reconciliation statement supports sorting by account name and category name on desktop version
This commit is contained in:
@@ -690,6 +690,22 @@ export interface TransactionReconciliationStatementResponse {
|
|||||||
readonly closingBalance: number;
|
readonly closingBalance: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface TransactionReconciliationStatementResponseItemWithInfo extends TransactionReconciliationStatementResponseItem {
|
||||||
|
readonly sourceAccount?: Account;
|
||||||
|
readonly sourceAccountName: string;
|
||||||
|
readonly destinationAccount?: Account;
|
||||||
|
readonly category?: TransactionCategory;
|
||||||
|
readonly categoryName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TransactionReconciliationStatementResponseWithInfo {
|
||||||
|
readonly transactions: TransactionReconciliationStatementResponseItemWithInfo[];
|
||||||
|
readonly totalInflows: number;
|
||||||
|
readonly totalOutflows: number;
|
||||||
|
readonly openingBalance: number;
|
||||||
|
readonly closingBalance: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface TransactionPageWrapper {
|
export interface TransactionPageWrapper {
|
||||||
readonly items: Transaction[];
|
readonly items: Transaction[];
|
||||||
readonly totalCount?: number;
|
readonly totalCount?: number;
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ import type { Account } from '@/models/account.ts';
|
|||||||
import type { TransactionCategory } from '@/models/transaction_category.ts';
|
import type { TransactionCategory } from '@/models/transaction_category.ts';
|
||||||
import type {
|
import type {
|
||||||
TransactionReconciliationStatementResponse,
|
TransactionReconciliationStatementResponse,
|
||||||
TransactionReconciliationStatementResponseItem
|
TransactionReconciliationStatementResponseItemWithInfo,
|
||||||
|
TransactionReconciliationStatementResponseWithInfo
|
||||||
} from '@/models/transaction.ts';
|
} from '@/models/transaction.ts';
|
||||||
|
|
||||||
import { replaceAll } from '@/lib/common.ts';
|
import { replaceAll } from '@/lib/common.ts';
|
||||||
@@ -48,7 +49,7 @@ export function useReconciliationStatementPageBase() {
|
|||||||
const accountId = ref<string>('');
|
const accountId = ref<string>('');
|
||||||
const startTime = ref<number>(0);
|
const startTime = ref<number>(0);
|
||||||
const endTime = ref<number>(0);
|
const endTime = ref<number>(0);
|
||||||
const reconciliationStatements = ref<TransactionReconciliationStatementResponse | undefined>(undefined);
|
const reconciliationStatements = ref<TransactionReconciliationStatementResponseWithInfo | undefined>(undefined);
|
||||||
|
|
||||||
const firstDayOfWeek = computed<WeekDayValue>(() => userStore.currentUserFirstDayOfWeek);
|
const firstDayOfWeek = computed<WeekDayValue>(() => userStore.currentUserFirstDayOfWeek);
|
||||||
const fiscalYearStart = computed<number>(() => userStore.currentUserFiscalYearStart);
|
const fiscalYearStart = computed<number>(() => userStore.currentUserFiscalYearStart);
|
||||||
@@ -113,7 +114,34 @@ export function useReconciliationStatementPageBase() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function getDisplayTransactionType(transaction: TransactionReconciliationStatementResponseItem): string {
|
function setReconciliationStatements(response: TransactionReconciliationStatementResponse | undefined) {
|
||||||
|
if (!response) {
|
||||||
|
reconciliationStatements.value = undefined;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const responseWithInfo: TransactionReconciliationStatementResponseWithInfo = {
|
||||||
|
transactions: response.transactions.map(transaction => {
|
||||||
|
const transactionWithInfo: TransactionReconciliationStatementResponseItemWithInfo = {
|
||||||
|
...transaction,
|
||||||
|
sourceAccount: allAccountsMap.value[transaction.sourceAccountId],
|
||||||
|
sourceAccountName: allAccountsMap.value[transaction.sourceAccountId]?.name || '',
|
||||||
|
destinationAccount: transaction.destinationAccountId && transaction.destinationAccountId !== '0' ? allAccountsMap.value[transaction.destinationAccountId] : undefined,
|
||||||
|
category: allCategoriesMap.value[transaction.categoryId],
|
||||||
|
categoryName: allCategoriesMap.value[transaction.categoryId]?.name || ''
|
||||||
|
};
|
||||||
|
return transactionWithInfo;
|
||||||
|
}),
|
||||||
|
totalInflows: response.totalInflows,
|
||||||
|
totalOutflows: response.totalOutflows,
|
||||||
|
openingBalance: response.openingBalance,
|
||||||
|
closingBalance: response.closingBalance
|
||||||
|
};
|
||||||
|
|
||||||
|
reconciliationStatements.value = responseWithInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDisplayTransactionType(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
if (transaction.type === TransactionType.ModifyBalance) {
|
if (transaction.type === TransactionType.ModifyBalance) {
|
||||||
return tt('Modify Balance');
|
return tt('Modify Balance');
|
||||||
} else if (transaction.type === TransactionType.Income) {
|
} else if (transaction.type === TransactionType.Income) {
|
||||||
@@ -131,54 +159,44 @@ export function useReconciliationStatementPageBase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDisplayDateTime(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getDisplayDateTime(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
return formatUnixTimeToLongDateTime(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value);
|
return formatUnixTimeToLongDateTime(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDisplayDate(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getDisplayDate(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
return formatUnixTimeToLongDate(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value);
|
return formatUnixTimeToLongDate(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDisplayTime(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getDisplayTime(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
return formatUnixTimeToShortTime(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value);
|
return formatUnixTimeToShortTime(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDisplayTimezone(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getDisplayTimezone(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
return `UTC${getUtcOffsetByUtcOffsetMinutes(transaction.utcOffset)}`;
|
return `UTC${getUtcOffsetByUtcOffsetMinutes(transaction.utcOffset)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDisplaySourceAmount(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getDisplaySourceAmount(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
let currency = defaultCurrency.value;
|
const currency = transaction.sourceAccount?.currency ?? defaultCurrency.value;
|
||||||
|
|
||||||
if (allAccountsMap.value[transaction.sourceAccountId]) {
|
|
||||||
currency = allAccountsMap.value[transaction.sourceAccountId]!.currency;
|
|
||||||
}
|
|
||||||
|
|
||||||
return formatAmountToLocalizedNumeralsWithCurrency(transaction.sourceAmount, currency);
|
return formatAmountToLocalizedNumeralsWithCurrency(transaction.sourceAmount, currency);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDisplayDestinationAmount(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getDisplayDestinationAmount(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
let currency = defaultCurrency.value;
|
const currency = transaction.destinationAccount?.currency ?? defaultCurrency.value;
|
||||||
|
|
||||||
if (allAccountsMap.value[transaction.destinationAccountId]) {
|
|
||||||
currency = allAccountsMap.value[transaction.destinationAccountId]!.currency;
|
|
||||||
}
|
|
||||||
|
|
||||||
return formatAmountToLocalizedNumeralsWithCurrency(transaction.destinationAmount, currency);
|
return formatAmountToLocalizedNumeralsWithCurrency(transaction.destinationAmount, currency);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDisplayAccountBalance(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getDisplayAccountBalance(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
let currency = defaultCurrency.value;
|
let currency = defaultCurrency.value;
|
||||||
let isLiabilityAccount = false;
|
let isLiabilityAccount = false;
|
||||||
|
|
||||||
if (transaction.type === TransactionType.Transfer && transaction.destinationAccountId === accountId.value) {
|
if (transaction.type === TransactionType.Transfer && transaction.destinationAccountId === accountId.value) {
|
||||||
if (allAccountsMap.value[transaction.destinationAccountId]) {
|
if (transaction.destinationAccount) {
|
||||||
currency = allAccountsMap.value[transaction.destinationAccountId]!.currency;
|
currency = transaction.destinationAccount.currency;
|
||||||
isLiabilityAccount = allAccountsMap.value[transaction.destinationAccountId]!.isLiability;
|
isLiabilityAccount = transaction.destinationAccount.isLiability;
|
||||||
}
|
}
|
||||||
} else if (allAccountsMap.value[transaction.sourceAccountId]) {
|
} else if (transaction.sourceAccount) {
|
||||||
currency = allAccountsMap.value[transaction.sourceAccountId]!.currency;
|
currency = transaction.sourceAccount.currency;
|
||||||
isLiabilityAccount = allAccountsMap.value[transaction.sourceAccountId]!.isLiability;
|
isLiabilityAccount = transaction.sourceAccount.isLiability;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isLiabilityAccount) {
|
if (isLiabilityAccount) {
|
||||||
@@ -211,9 +229,9 @@ export function useReconciliationStatementPageBase() {
|
|||||||
const rows = transactions.map(transaction => {
|
const rows = transactions.map(transaction => {
|
||||||
const transactionTime = parseDateTimeFromUnixTime(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value).getUnixTime();
|
const transactionTime = parseDateTimeFromUnixTime(transaction.time, transaction.utcOffset, currentTimezoneOffsetMinutes.value).getUnixTime();
|
||||||
const type = getDisplayTransactionType(transaction);
|
const type = getDisplayTransactionType(transaction);
|
||||||
let categoryName = allCategoriesMap.value[transaction.categoryId]?.name || '';
|
let categoryName = transaction.categoryName;
|
||||||
let displayAmount = formatAmountToWesternArabicNumeralsWithoutDigitGrouping(transaction.sourceAmount);
|
let displayAmount = formatAmountToWesternArabicNumeralsWithoutDigitGrouping(transaction.sourceAmount);
|
||||||
let displayAccountName = allAccountsMap.value[transaction.sourceAccountId]?.name || '';
|
let displayAccountName = transaction.sourceAccountName;
|
||||||
|
|
||||||
if (transaction.type === TransactionType.ModifyBalance) {
|
if (transaction.type === TransactionType.ModifyBalance) {
|
||||||
categoryName = tt('Modify Balance');
|
categoryName = tt('Modify Balance');
|
||||||
@@ -221,8 +239,8 @@ export function useReconciliationStatementPageBase() {
|
|||||||
displayAmount = formatAmountToWesternArabicNumeralsWithoutDigitGrouping(transaction.destinationAmount);
|
displayAmount = formatAmountToWesternArabicNumeralsWithoutDigitGrouping(transaction.destinationAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transaction.type === TransactionType.Transfer && allAccountsMap.value[transaction.destinationAccountId]) {
|
if (transaction.type === TransactionType.Transfer && transaction.destinationAccount) {
|
||||||
displayAccountName = displayAccountName + ' → ' + (allAccountsMap.value[transaction.destinationAccountId]?.name || '');
|
displayAccountName = displayAccountName + ' → ' + (transaction.destinationAccount?.name || '');
|
||||||
}
|
}
|
||||||
|
|
||||||
let displayAccountBalance = '';
|
let displayAccountBalance = '';
|
||||||
@@ -272,8 +290,6 @@ export function useReconciliationStatementPageBase() {
|
|||||||
currentAccountCurrency,
|
currentAccountCurrency,
|
||||||
isCurrentLiabilityAccount,
|
isCurrentLiabilityAccount,
|
||||||
exportFileName,
|
exportFileName,
|
||||||
allAccountsMap,
|
|
||||||
allCategoriesMap,
|
|
||||||
displayStartDateTime,
|
displayStartDateTime,
|
||||||
displayEndDateTime,
|
displayEndDateTime,
|
||||||
displayTotalInflows,
|
displayTotalInflows,
|
||||||
@@ -282,6 +298,7 @@ export function useReconciliationStatementPageBase() {
|
|||||||
displayOpeningBalance,
|
displayOpeningBalance,
|
||||||
displayClosingBalance,
|
displayClosingBalance,
|
||||||
// functions
|
// functions
|
||||||
|
setReconciliationStatements,
|
||||||
getDisplayTransactionType,
|
getDisplayTransactionType,
|
||||||
getDisplayDateTime,
|
getDisplayDateTime,
|
||||||
getDisplayDate,
|
getDisplayDate,
|
||||||
|
|||||||
@@ -155,18 +155,18 @@
|
|||||||
:class="{ 'text-income' : item.type === TransactionType.Income, 'text-expense': item.type === TransactionType.Expense }"
|
:class="{ 'text-income' : item.type === TransactionType.Income, 'text-expense': item.type === TransactionType.Expense }"
|
||||||
:color="getTransactionTypeColor(item)">{{ getDisplayTransactionType(item) }}</v-chip>
|
:color="getTransactionTypeColor(item)">{{ getDisplayTransactionType(item) }}</v-chip>
|
||||||
</template>
|
</template>
|
||||||
<template #item.categoryId="{ item }">
|
<template #item.categoryName="{ item }">
|
||||||
<div class="d-flex align-center">
|
<div class="d-flex align-center">
|
||||||
<ItemIcon size="24px" icon-type="category"
|
<ItemIcon size="24px" icon-type="category"
|
||||||
:icon-id="allCategoriesMap[item.categoryId]?.icon ?? ''"
|
:icon-id="item.category?.icon ?? ''"
|
||||||
:color="allCategoriesMap[item.categoryId]?.color ?? ''"
|
:color="item.category?.color ?? ''"
|
||||||
v-if="allCategoriesMap[item.categoryId] && allCategoriesMap[item.categoryId]?.color"></ItemIcon>
|
v-if="item.category && item.category?.color"></ItemIcon>
|
||||||
<v-icon size="24" :icon="mdiPencilBoxOutline" v-else-if="!allCategoriesMap[item.categoryId] || !allCategoriesMap[item.categoryId]?.color" />
|
<v-icon size="24" :icon="mdiPencilBoxOutline" v-else-if="!item.category || !item.category?.color" />
|
||||||
<span class="ms-2" v-if="item.type === TransactionType.ModifyBalance">
|
<span class="ms-2" v-if="item.type === TransactionType.ModifyBalance">
|
||||||
{{ tt('Modify Balance') }}
|
{{ tt('Modify Balance') }}
|
||||||
</span>
|
</span>
|
||||||
<span class="ms-2" v-else-if="item.type !== TransactionType.ModifyBalance && allCategoriesMap[item.categoryId]">
|
<span class="ms-2" v-else-if="item.type !== TransactionType.ModifyBalance && item.category">
|
||||||
{{ allCategoriesMap[item.categoryId]?.name }}
|
{{ item.category?.name }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -175,11 +175,11 @@
|
|||||||
<v-icon class="icon-with-direction mx-1" size="13" :icon="mdiArrowRight" v-if="item.type === TransactionType.Transfer && item.sourceAccountId !== item.destinationAccountId && getDisplaySourceAmount(item) !== getDisplayDestinationAmount(item)"></v-icon>
|
<v-icon class="icon-with-direction mx-1" size="13" :icon="mdiArrowRight" v-if="item.type === TransactionType.Transfer && item.sourceAccountId !== item.destinationAccountId && getDisplaySourceAmount(item) !== getDisplayDestinationAmount(item)"></v-icon>
|
||||||
<span v-if="item.type === TransactionType.Transfer && item.sourceAccountId !== item.destinationAccountId && getDisplaySourceAmount(item) !== getDisplayDestinationAmount(item)">{{ getDisplayDestinationAmount(item) }}</span>
|
<span v-if="item.type === TransactionType.Transfer && item.sourceAccountId !== item.destinationAccountId && getDisplaySourceAmount(item) !== getDisplayDestinationAmount(item)">{{ getDisplayDestinationAmount(item) }}</span>
|
||||||
</template>
|
</template>
|
||||||
<template #item.sourceAccountId="{ item }">
|
<template #item.sourceAccountName="{ item }">
|
||||||
<div class="d-flex align-center">
|
<div class="d-flex align-center">
|
||||||
<span v-if="item.sourceAccountId && allAccountsMap[item.sourceAccountId]">{{ allAccountsMap[item.sourceAccountId]?.name }}</span>
|
<span v-if="item.sourceAccount">{{ item.sourceAccount?.name }}</span>
|
||||||
<v-icon class="icon-with-direction mx-1" size="13" :icon="mdiArrowRight" v-if="item.type === TransactionType.Transfer"></v-icon>
|
<v-icon class="icon-with-direction mx-1" size="13" :icon="mdiArrowRight" v-if="item.type === TransactionType.Transfer"></v-icon>
|
||||||
<span v-if="item.type === TransactionType.Transfer && item.destinationAccountId && allAccountsMap[item.destinationAccountId]">{{ allAccountsMap[item.destinationAccountId]?.name }}</span>
|
<span v-if="item.type === TransactionType.Transfer && item.destinationAccount">{{ item.destinationAccount?.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #item.accountBalance="{ item }">
|
<template #item.accountBalance="{ item }">
|
||||||
@@ -326,8 +326,6 @@ const {
|
|||||||
currentAccount,
|
currentAccount,
|
||||||
currentAccountCurrency,
|
currentAccountCurrency,
|
||||||
isCurrentLiabilityAccount,
|
isCurrentLiabilityAccount,
|
||||||
allAccountsMap,
|
|
||||||
allCategoriesMap,
|
|
||||||
exportFileName,
|
exportFileName,
|
||||||
displayStartDateTime,
|
displayStartDateTime,
|
||||||
displayEndDateTime,
|
displayEndDateTime,
|
||||||
@@ -336,6 +334,7 @@ const {
|
|||||||
displayTotalBalance,
|
displayTotalBalance,
|
||||||
displayOpeningBalance,
|
displayOpeningBalance,
|
||||||
displayClosingBalance,
|
displayClosingBalance,
|
||||||
|
setReconciliationStatements,
|
||||||
getDisplayTransactionType,
|
getDisplayTransactionType,
|
||||||
getDisplayDateTime,
|
getDisplayDateTime,
|
||||||
getDisplayTimezone,
|
getDisplayTimezone,
|
||||||
@@ -395,9 +394,9 @@ const dataTableHeaders = computed<object[]>(() => {
|
|||||||
|
|
||||||
headers.push({ key: 'time', value: 'time', title: tt('Transaction Time'), sortable: true, nowrap: true });
|
headers.push({ key: 'time', value: 'time', title: tt('Transaction Time'), sortable: true, nowrap: true });
|
||||||
headers.push({ key: 'type', value: 'type', title: tt('Type'), sortable: true, nowrap: true });
|
headers.push({ key: 'type', value: 'type', title: tt('Type'), sortable: true, nowrap: true });
|
||||||
headers.push({ key: 'categoryId', value: 'categoryId', title: tt('Category'), sortable: true, nowrap: true });
|
headers.push({ key: 'categoryName', value: 'categoryName', title: tt('Category'), sortable: true, nowrap: true });
|
||||||
headers.push({ key: 'sourceAmount', value: 'sourceAmount', title: tt('Amount'), sortable: true, nowrap: true });
|
headers.push({ key: 'sourceAmount', value: 'sourceAmount', title: tt('Amount'), sortable: true, nowrap: true });
|
||||||
headers.push({ key: 'sourceAccountId', value: 'sourceAccountId', title: tt('Account'), sortable: true, nowrap: true });
|
headers.push({ key: 'sourceAccountName', value: 'sourceAccountName', title: tt('Account'), sortable: true, nowrap: true });
|
||||||
headers.push({ key: 'accountBalance', value: 'accountBalance', title: tt(accountBalanceName), sortable: true, nowrap: true });
|
headers.push({ key: 'accountBalance', value: 'accountBalance', title: tt(accountBalanceName), sortable: true, nowrap: true });
|
||||||
headers.push({ key: 'comment', value: 'comment', title: tt('Description'), sortable: true, nowrap: true });
|
headers.push({ key: 'comment', value: 'comment', title: tt('Description'), sortable: true, nowrap: true });
|
||||||
headers.push({ key: 'operation', title: tt('Operation'), sortable: false, nowrap: true, align: 'end' });
|
headers.push({ key: 'operation', title: tt('Operation'), sortable: false, nowrap: true, align: 'end' });
|
||||||
@@ -464,7 +463,7 @@ function open(options: { accountId: string, startTime: number, endTime: number }
|
|||||||
endTime: options.endTime
|
endTime: options.endTime
|
||||||
});
|
});
|
||||||
}).then(result => {
|
}).then(result => {
|
||||||
reconciliationStatements.value = result;
|
setReconciliationStatements(result);
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@@ -496,7 +495,7 @@ function reload(force: boolean): void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reconciliationStatements.value = result;
|
setReconciliationStatements(result);
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
|||||||
@@ -188,10 +188,10 @@
|
|||||||
<div class="item-media">
|
<div class="item-media">
|
||||||
<div class="transaction-icon display-flex align-items-center">
|
<div class="transaction-icon display-flex align-items-center">
|
||||||
<ItemIcon icon-type="category"
|
<ItemIcon icon-type="category"
|
||||||
:icon-id="allCategoriesMap[item.transaction.categoryId]?.icon"
|
:icon-id="item.transaction.category?.icon"
|
||||||
:color="allCategoriesMap[item.transaction.categoryId]?.color"
|
:color="item.transaction.category?.color"
|
||||||
v-if="allCategoriesMap[item.transaction.categoryId] && allCategoriesMap[item.transaction.categoryId]?.color"></ItemIcon>
|
v-if="item.transaction.category && item.transaction.category?.color"></ItemIcon>
|
||||||
<f7-icon v-else-if="!allCategoriesMap[item.transaction.categoryId] || !allCategoriesMap[item.transaction.categoryId]?.color"
|
<f7-icon v-else-if="!item.transaction.category || !item.transaction.category?.color"
|
||||||
f7="pencil_ellipsis_rectangle">
|
f7="pencil_ellipsis_rectangle">
|
||||||
</f7-icon>
|
</f7-icon>
|
||||||
</div>
|
</div>
|
||||||
@@ -203,8 +203,8 @@
|
|||||||
<span v-if="item.transaction.type === TransactionType.ModifyBalance">
|
<span v-if="item.transaction.type === TransactionType.ModifyBalance">
|
||||||
{{ tt('Modify Balance') }}
|
{{ tt('Modify Balance') }}
|
||||||
</span>
|
</span>
|
||||||
<span v-else-if="item.transaction.type !== TransactionType.ModifyBalance && allCategoriesMap[item.transaction.categoryId]">
|
<span v-else-if="item.transaction.type !== TransactionType.ModifyBalance && item.transaction.category">
|
||||||
{{ allCategoriesMap[item.transaction.categoryId]!.name }}
|
{{ item.transaction.category.name }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -352,7 +352,7 @@ import { AccountType } from '@/core/account.ts';
|
|||||||
import { TransactionType } from '@/core/transaction.ts';
|
import { TransactionType } from '@/core/transaction.ts';
|
||||||
import { ChartDateAggregationType } from '@/core/statistics.ts';
|
import { ChartDateAggregationType } from '@/core/statistics.ts';
|
||||||
import { TRANSACTION_MIN_AMOUNT, TRANSACTION_MAX_AMOUNT } from '@/consts/transaction.ts';
|
import { TRANSACTION_MIN_AMOUNT, TRANSACTION_MAX_AMOUNT } from '@/consts/transaction.ts';
|
||||||
import { type TransactionReconciliationStatementResponseItem } from '@/models/transaction.ts';
|
import { type TransactionReconciliationStatementResponseItemWithInfo } from '@/models/transaction.ts';
|
||||||
|
|
||||||
import { isDefined, isEquals, findDisplayNameByType } from '@/lib/common.ts';
|
import { isDefined, isEquals, findDisplayNameByType } from '@/lib/common.ts';
|
||||||
import {
|
import {
|
||||||
@@ -372,7 +372,7 @@ interface ReconciliationStatementVirtualListItem {
|
|||||||
index: number;
|
index: number;
|
||||||
type: ReconciliationStatementVirtualListItemType;
|
type: ReconciliationStatementVirtualListItemType;
|
||||||
displayDate?: string;
|
displayDate?: string;
|
||||||
transaction?: TransactionReconciliationStatementResponseItem;
|
transaction?: TransactionReconciliationStatementResponseItemWithInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReconciliationStatementVirtualListItemType = 'transaction' | 'date';
|
type ReconciliationStatementVirtualListItemType = 'transaction' | 'date';
|
||||||
@@ -402,7 +402,6 @@ const {
|
|||||||
allDateAggregationTypes,
|
allDateAggregationTypes,
|
||||||
currentTimezoneOffsetMinutes,
|
currentTimezoneOffsetMinutes,
|
||||||
isCurrentLiabilityAccount,
|
isCurrentLiabilityAccount,
|
||||||
allCategoriesMap,
|
|
||||||
currentAccount,
|
currentAccount,
|
||||||
currentAccountCurrency,
|
currentAccountCurrency,
|
||||||
displayStartDateTime,
|
displayStartDateTime,
|
||||||
@@ -412,6 +411,7 @@ const {
|
|||||||
displayTotalBalance,
|
displayTotalBalance,
|
||||||
displayOpeningBalance,
|
displayOpeningBalance,
|
||||||
displayClosingBalance,
|
displayClosingBalance,
|
||||||
|
setReconciliationStatements,
|
||||||
getDisplayDate,
|
getDisplayDate,
|
||||||
getDisplayTime,
|
getDisplayTime,
|
||||||
getDisplayTimezone,
|
getDisplayTimezone,
|
||||||
@@ -430,7 +430,7 @@ const loadingError = ref<unknown | null>(null);
|
|||||||
const queryDateRangeType = ref<number>(DateRange.ThisMonth.type);
|
const queryDateRangeType = ref<number>(DateRange.ThisMonth.type);
|
||||||
const showAccountBalanceTrendsCharts = ref<boolean>(false);
|
const showAccountBalanceTrendsCharts = ref<boolean>(false);
|
||||||
const chartDataDateAggregationType = ref<number>(ChartDateAggregationType.Day.type);
|
const chartDataDateAggregationType = ref<number>(ChartDateAggregationType.Day.type);
|
||||||
const transactionToDelete = ref<TransactionReconciliationStatementResponseItem | null>(null);
|
const transactionToDelete = ref<TransactionReconciliationStatementResponseItemWithInfo | null>(null);
|
||||||
const newClosingBalance = ref<number>(0);
|
const newClosingBalance = ref<number>(0);
|
||||||
const showDisplayModePopover = ref<boolean>(false);
|
const showDisplayModePopover = ref<boolean>(false);
|
||||||
const showCustomDateRangeSheet = ref<boolean>(false);
|
const showCustomDateRangeSheet = ref<boolean>(false);
|
||||||
@@ -485,7 +485,7 @@ const chartDataDateAggregationTypeDisplayName = computed<string>(() => {
|
|||||||
return findDisplayNameByType(allDateAggregationTypes.value, chartDataDateAggregationType.value) || tt('Unknown');
|
return findDisplayNameByType(allDateAggregationTypes.value, chartDataDateAggregationType.value) || tt('Unknown');
|
||||||
});
|
});
|
||||||
|
|
||||||
function getTransactionDomId(transaction: TransactionReconciliationStatementResponseItem): string {
|
function getTransactionDomId(transaction: TransactionReconciliationStatementResponseItemWithInfo): string {
|
||||||
return 'transaction_' + transaction.id;
|
return 'transaction_' + transaction.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,7 +567,7 @@ function reload(force: boolean): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
reconciliationStatements.value = result;
|
setReconciliationStatements(result);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
|
||||||
@@ -581,11 +581,11 @@ function addTransaction(): void {
|
|||||||
props.f7router.navigate(`/transaction/add?accountId=${accountId.value}`);
|
props.f7router.navigate(`/transaction/add?accountId=${accountId.value}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function duplicateTransaction(transaction: TransactionReconciliationStatementResponseItem): void {
|
function duplicateTransaction(transaction: TransactionReconciliationStatementResponseItemWithInfo): void {
|
||||||
props.f7router.navigate(`/transaction/add?id=${transaction.id}&type=${transaction.type}`);
|
props.f7router.navigate(`/transaction/add?id=${transaction.id}&type=${transaction.type}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function editTransaction(transaction: TransactionReconciliationStatementResponseItem): void {
|
function editTransaction(transaction: TransactionReconciliationStatementResponseItemWithInfo): void {
|
||||||
props.f7router.navigate(`/transaction/edit?id=${transaction.id}&type=${transaction.type}`);
|
props.f7router.navigate(`/transaction/edit?id=${transaction.id}&type=${transaction.type}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -636,7 +636,7 @@ function updateClosingBalance(balance?: number): void {
|
|||||||
props.f7router.navigate(`/transaction/add?${params.join('&')}`);
|
props.f7router.navigate(`/transaction/add?${params.join('&')}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeTransaction(transaction: TransactionReconciliationStatementResponseItem | null, confirm: boolean): void {
|
function removeTransaction(transaction: TransactionReconciliationStatementResponseItemWithInfo | null, confirm: boolean): void {
|
||||||
if (!transaction) {
|
if (!transaction) {
|
||||||
showAlert('An error occurred');
|
showAlert('An error occurred');
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user