mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-14 15:07:33 +08:00
convert transaction type in import transaction dialog
This commit is contained in:
@@ -49,6 +49,29 @@ export function getCategorizedAccounts(allAccounts: Account[]): CategorizedAccou
|
||||
return ret;
|
||||
}
|
||||
|
||||
export function getAccountMapByName(allAccounts: Account[]): Record<string, Account> {
|
||||
const ret: Record<string, Account> = {};
|
||||
|
||||
if (!allAccounts) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (let i = 0; i < allAccounts.length; i++) {
|
||||
const account = allAccounts[i];
|
||||
|
||||
if (account.type === AccountType.SingleAccount.type) {
|
||||
ret[account.name] = account;
|
||||
} else if (account.type === AccountType.MultiSubAccounts.type && account.subAccounts) {
|
||||
for (let j = 0; j < account.subAccounts.length; j++) {
|
||||
const subAccount = account.subAccounts[j];
|
||||
ret[subAccount.name] = subAccount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
export function getCategorizedAccountsWithVisibleCount(categorizedAccountsMap: Record<number, CategorizedAccount>): AccountCategoriesWithVisibleCount[] {
|
||||
const ret: AccountCategoriesWithVisibleCount[] = [];
|
||||
const allCategories = AccountCategory.values();
|
||||
|
||||
@@ -26,6 +26,27 @@ export function categoryTypeToTransactionType(categoryType: CategoryType): Trans
|
||||
}
|
||||
}
|
||||
|
||||
export function getSecondaryTransactionMapByName(allCategories: TransactionCategory[]): Record<string, TransactionCategory> {
|
||||
const ret: Record<string, TransactionCategory> = {};
|
||||
|
||||
if (!allCategories) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (let i = 0; i < allCategories.length; i++) {
|
||||
const category = allCategories[i];
|
||||
|
||||
if (category.subCategories) {
|
||||
for (let j = 0; j < category.subCategories.length; j++) {
|
||||
const subCategory = category.subCategories[j];
|
||||
ret[subCategory.name] = subCategory;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
export function getTransactionPrimaryCategoryName(categoryId: string | null | undefined, allCategories: TransactionCategory[]): string {
|
||||
if (!allCategories) {
|
||||
return '';
|
||||
|
||||
@@ -1680,6 +1680,12 @@
|
||||
"Replace Invalid Transfer Categories": "Ungültige Überweisungskategorien ersetzen",
|
||||
"Replace Invalid Accounts": "Ungültige Konten ersetzen",
|
||||
"Replace Invalid Transaction Tags": "Ungültige Transaktions-Tags ersetzen",
|
||||
"Batch Convert Expense Transaction to Income Transaction": "Batch Convert Expense Transaction to Income Transaction",
|
||||
"Batch Convert Expense Transaction to Transfer Transaction": "Batch Convert Expense Transaction to Transfer Transaction",
|
||||
"Batch Convert Income Transaction to Expense Transaction": "Batch Convert Income Transaction to Expense Transaction",
|
||||
"Batch Convert Income Transaction to Transfer Transaction": "Batch Convert Income Transaction to Transfer Transaction",
|
||||
"Batch Convert Transfer Transaction to Expense Transaction": "Batch Convert Transfer Transaction to Expense Transaction",
|
||||
"Batch Convert Transfer Transaction to Income Transaction": "Batch Convert Transfer Transaction to Income Transaction",
|
||||
"Invalid Category": "Ungültige Kategorie",
|
||||
"Target Category": "Zielkategorie",
|
||||
"Invalid Account": "Ungültiges Konto",
|
||||
|
||||
@@ -1680,6 +1680,12 @@
|
||||
"Replace Invalid Transfer Categories": "Replace Invalid Transfer Categories",
|
||||
"Replace Invalid Accounts": "Replace Invalid Accounts",
|
||||
"Replace Invalid Transaction Tags": "Replace Invalid Transaction Tags",
|
||||
"Batch Convert Expense Transaction to Income Transaction": "Batch Convert Expense Transaction to Income Transaction",
|
||||
"Batch Convert Expense Transaction to Transfer Transaction": "Batch Convert Expense Transaction to Transfer Transaction",
|
||||
"Batch Convert Income Transaction to Expense Transaction": "Batch Convert Income Transaction to Expense Transaction",
|
||||
"Batch Convert Income Transaction to Transfer Transaction": "Batch Convert Income Transaction to Transfer Transaction",
|
||||
"Batch Convert Transfer Transaction to Expense Transaction": "Batch Convert Transfer Transaction to Expense Transaction",
|
||||
"Batch Convert Transfer Transaction to Income Transaction": "Batch Convert Transfer Transaction to Income Transaction",
|
||||
"Invalid Category": "Invalid Category",
|
||||
"Target Category": "Target Category",
|
||||
"Invalid Account": "Invalid Account",
|
||||
|
||||
@@ -1680,6 +1680,12 @@
|
||||
"Replace Invalid Transfer Categories": "Reemplazar categorías de transferencia no válidas",
|
||||
"Replace Invalid Accounts": "Reemplazar cuentas no válidas",
|
||||
"Replace Invalid Transaction Tags": "Reemplazar etiquetas de transacciones no válidas",
|
||||
"Batch Convert Expense Transaction to Income Transaction": "Batch Convert Expense Transaction to Income Transaction",
|
||||
"Batch Convert Expense Transaction to Transfer Transaction": "Batch Convert Expense Transaction to Transfer Transaction",
|
||||
"Batch Convert Income Transaction to Expense Transaction": "Batch Convert Income Transaction to Expense Transaction",
|
||||
"Batch Convert Income Transaction to Transfer Transaction": "Batch Convert Income Transaction to Transfer Transaction",
|
||||
"Batch Convert Transfer Transaction to Expense Transaction": "Batch Convert Transfer Transaction to Expense Transaction",
|
||||
"Batch Convert Transfer Transaction to Income Transaction": "Batch Convert Transfer Transaction to Income Transaction",
|
||||
"Invalid Category": "Categoría no válida",
|
||||
"Target Category": "Categoría de destino",
|
||||
"Invalid Account": "Cuenta no válida",
|
||||
|
||||
@@ -1680,6 +1680,12 @@
|
||||
"Replace Invalid Transfer Categories": "Заменить недействительные категории переводов",
|
||||
"Replace Invalid Accounts": "Заменить недействительные счета",
|
||||
"Replace Invalid Transaction Tags": "Заменить недействительные теги транзакций",
|
||||
"Batch Convert Expense Transaction to Income Transaction": "Batch Convert Expense Transaction to Income Transaction",
|
||||
"Batch Convert Expense Transaction to Transfer Transaction": "Batch Convert Expense Transaction to Transfer Transaction",
|
||||
"Batch Convert Income Transaction to Expense Transaction": "Batch Convert Income Transaction to Expense Transaction",
|
||||
"Batch Convert Income Transaction to Transfer Transaction": "Batch Convert Income Transaction to Transfer Transaction",
|
||||
"Batch Convert Transfer Transaction to Expense Transaction": "Batch Convert Transfer Transaction to Expense Transaction",
|
||||
"Batch Convert Transfer Transaction to Income Transaction": "Batch Convert Transfer Transaction to Income Transaction",
|
||||
"Invalid Category": "Недействительная категория",
|
||||
"Target Category": "Целевая категория",
|
||||
"Invalid Account": "Недействительный счет",
|
||||
|
||||
@@ -1680,6 +1680,12 @@
|
||||
"Replace Invalid Transfer Categories": "Thay thế các danh mục chuyển khoản không hợp lệ",
|
||||
"Replace Invalid Accounts": "Thay thế các tài khoản không hợp lệ",
|
||||
"Replace Invalid Transaction Tags": "Thay thế các thẻ giao dịch không hợp lệ",
|
||||
"Batch Convert Expense Transaction to Income Transaction": "Batch Convert Expense Transaction to Income Transaction",
|
||||
"Batch Convert Expense Transaction to Transfer Transaction": "Batch Convert Expense Transaction to Transfer Transaction",
|
||||
"Batch Convert Income Transaction to Expense Transaction": "Batch Convert Income Transaction to Expense Transaction",
|
||||
"Batch Convert Income Transaction to Transfer Transaction": "Batch Convert Income Transaction to Transfer Transaction",
|
||||
"Batch Convert Transfer Transaction to Expense Transaction": "Batch Convert Transfer Transaction to Expense Transaction",
|
||||
"Batch Convert Transfer Transaction to Income Transaction": "Batch Convert Transfer Transaction to Income Transaction",
|
||||
"Invalid Category": "Danh mục không hợp lệ",
|
||||
"Target Category": "Danh mục mục tiêu",
|
||||
"Invalid Account": "Tài khoản không hợp lệ",
|
||||
|
||||
@@ -1680,6 +1680,12 @@
|
||||
"Replace Invalid Transfer Categories": "替换无效的转账分类",
|
||||
"Replace Invalid Accounts": "替换无效的账户",
|
||||
"Replace Invalid Transaction Tags": "替换无效的交易标签",
|
||||
"Batch Convert Expense Transaction to Income Transaction": "批量转换支出交易为收入交易",
|
||||
"Batch Convert Expense Transaction to Transfer Transaction": "批量转换支出交易为转账交易",
|
||||
"Batch Convert Income Transaction to Expense Transaction": "批量转换收入交易为支出交易",
|
||||
"Batch Convert Income Transaction to Transfer Transaction": "批量转换收入交易为转账交易",
|
||||
"Batch Convert Transfer Transaction to Expense Transaction": "批量转换转账交易为支出交易",
|
||||
"Batch Convert Transfer Transaction to Income Transaction": "批量转换转账交易为收入交易",
|
||||
"Invalid Category": "无效分类",
|
||||
"Target Category": "目标分类",
|
||||
"Invalid Account": "无效账户",
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
:icon="true" :disabled="loading || submitting"
|
||||
v-if="currentStep === 'checkData'">
|
||||
<v-icon :icon="mdiDotsVertical" />
|
||||
<v-menu activator="parent">
|
||||
<v-menu activator="parent" max-height="500">
|
||||
<v-list>
|
||||
<v-list-item :prepend-icon="mdiFindReplace"
|
||||
:disabled="!!editingTransaction || selectedExpenseTransactionCount < 1"
|
||||
@@ -142,6 +142,31 @@
|
||||
:disabled="!!editingTransaction || !allInvalidTransactionTagNames || allInvalidTransactionTagNames.length < 1"
|
||||
:title="tt('Replace Invalid Transaction Tags')"
|
||||
@click="showReplaceInvalidItemDialog('tag', allInvalidTransactionTagNames)"></v-list-item>
|
||||
<v-divider class="my-2"/>
|
||||
<v-list-item :prepend-icon="mdiFindReplace"
|
||||
:disabled="!!editingTransaction || selectedExpenseTransactionCount < 1"
|
||||
:title="tt('Batch Convert Expense Transaction to Income Transaction')"
|
||||
@click="convertTransactionType(TransactionType.Expense, TransactionType.Income)"></v-list-item>
|
||||
<v-list-item :prepend-icon="mdiFindReplace"
|
||||
:disabled="!!editingTransaction || selectedExpenseTransactionCount < 1"
|
||||
:title="tt('Batch Convert Expense Transaction to Transfer Transaction')"
|
||||
@click="convertTransactionType(TransactionType.Expense, TransactionType.Transfer)"></v-list-item>
|
||||
<v-list-item :prepend-icon="mdiFindReplace"
|
||||
:disabled="!!editingTransaction || selectedIncomeTransactionCount < 1"
|
||||
:title="tt('Batch Convert Income Transaction to Expense Transaction')"
|
||||
@click="convertTransactionType(TransactionType.Income, TransactionType.Expense)"></v-list-item>
|
||||
<v-list-item :prepend-icon="mdiFindReplace"
|
||||
:disabled="!!editingTransaction || selectedIncomeTransactionCount < 1"
|
||||
:title="tt('Batch Convert Income Transaction to Transfer Transaction')"
|
||||
@click="convertTransactionType(TransactionType.Income, TransactionType.Transfer)"></v-list-item>
|
||||
<v-list-item :prepend-icon="mdiFindReplace"
|
||||
:disabled="!!editingTransaction || selectedTransferTransactionCount < 1"
|
||||
:title="tt('Batch Convert Transfer Transaction to Expense Transaction')"
|
||||
@click="convertTransactionType(TransactionType.Transfer, TransactionType.Expense)"></v-list-item>
|
||||
<v-list-item :prepend-icon="mdiFindReplace"
|
||||
:disabled="!!editingTransaction || selectedTransferTransactionCount < 1"
|
||||
:title="tt('Batch Convert Transfer Transaction to Income Transaction')"
|
||||
@click="convertTransactionType(TransactionType.Transfer, TransactionType.Income)"></v-list-item>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</v-btn>
|
||||
@@ -818,6 +843,11 @@ import {
|
||||
getTimezoneOffsetMinutes
|
||||
} from '@/lib/datetime.ts';
|
||||
import {
|
||||
getAccountMapByName
|
||||
} from '@/lib/account.ts';
|
||||
import {
|
||||
transactionTypeToCategoryType,
|
||||
getSecondaryTransactionMapByName,
|
||||
getTransactionPrimaryCategoryName,
|
||||
getTransactionSecondaryCategoryName
|
||||
} from '@/lib/category.ts';
|
||||
@@ -1029,6 +1059,7 @@ const allAccounts = computed<Account[]>(() => accountsStore.allPlainAccounts);
|
||||
const allVisibleAccounts = computed<Account[]>(() => accountsStore.allVisiblePlainAccounts);
|
||||
const allVisibleCategorizedAccounts = computed<CategorizedAccountWithDisplayBalance[]>(() => getCategorizedAccountsWithDisplayBalance(allVisibleAccounts.value, showAccountBalance.value));
|
||||
const allAccountsMap = computed<Record<string, Account>>(() => accountsStore.allAccountsMap);
|
||||
const allAccountsMapByName = computed<Record<string, Account>>(() => getAccountMapByName(accountsStore.allAccounts));
|
||||
const allCategories = computed<Record<number, TransactionCategory[]>>(() => transactionCategoriesStore.allTransactionCategories);
|
||||
const allCategoriesMap = computed<Record<string, TransactionCategory>>(() => transactionCategoriesStore.allTransactionCategoriesMap);
|
||||
const allTags = computed<TransactionTag[]>(() => transactionTagsStore.allTransactionTags);
|
||||
@@ -2392,6 +2423,46 @@ function showReplaceInvalidItemDialog(type: string, invalidItems: NameValue[]):
|
||||
});
|
||||
}
|
||||
|
||||
function convertTransactionType(fromType: TransactionType, toType: TransactionType): void {
|
||||
if (!importTransactions.value || importTransactions.value.length < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
const categoryType = transactionTypeToCategoryType(toType);
|
||||
|
||||
if (!categoryType) {
|
||||
return;
|
||||
}
|
||||
|
||||
const categoryMapByName: Record<string, TransactionCategory> = getSecondaryTransactionMapByName(allCategories.value[categoryType]);
|
||||
|
||||
for (let i = 0; i < importTransactions.value.length; i++) {
|
||||
const transaction: ImportTransaction = importTransactions.value[i];
|
||||
|
||||
if (!transaction.selected || transaction.type !== fromType) {
|
||||
continue;
|
||||
}
|
||||
|
||||
transaction.type = toType;
|
||||
transaction.categoryId = categoryMapByName[transaction.originalCategoryName]?.id || '0';
|
||||
|
||||
if (transaction.type === TransactionType.Transfer) {
|
||||
transaction.destinationAccountId = allAccountsMapByName.value[transaction.originalDestinationAccountName || '']?.id || '0';
|
||||
transaction.destinationAmount = transaction.sourceAmount;
|
||||
} else {
|
||||
if (fromType === TransactionType.Transfer && toType === TransactionType.Income) {
|
||||
transaction.sourceAccountId = transaction.destinationAccountId;
|
||||
transaction.sourceAmount = transaction.destinationAmount;
|
||||
}
|
||||
|
||||
transaction.destinationAccountId = '0';
|
||||
transaction.destinationAmount = 0;
|
||||
}
|
||||
|
||||
updateTransactionData(transaction);
|
||||
}
|
||||
}
|
||||
|
||||
function onShowDateRangeError(message: string): void {
|
||||
snackbar.value?.showError(message);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user