move all transactions from one account to another account (#288)

This commit is contained in:
MaysWind
2025-10-11 01:10:13 +08:00
parent 3ce7f6e99a
commit 2cb47bfd75
29 changed files with 974 additions and 41 deletions
+4
View File
@@ -61,6 +61,7 @@ import type {
import type {
TransactionCreateRequest,
TransactionModifyRequest,
TransactionMoveBetweenAccountsRequest,
TransactionDeleteRequest,
TransactionImportRequest,
TransactionListByMaxTimeRequest,
@@ -528,6 +529,9 @@ export default {
modifyTransaction: (req: TransactionModifyRequest): ApiResponsePromise<TransactionInfoResponse> => {
return axios.post<ApiResponse<TransactionInfoResponse>>('v1/transactions/modify.json', req);
},
moveAllTransactionsBetweenAccounts: (req: TransactionMoveBetweenAccountsRequest): ApiResponsePromise<boolean> => {
return axios.post<ApiResponse<boolean>>('v1/transactions/move/all.json', req);
},
deleteTransaction: (req: TransactionDeleteRequest): ApiResponsePromise<boolean> => {
return axios.post<ApiResponse<boolean>>('v1/transactions/delete.json', req);
},
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Sind Sie sicher, dass Sie {count} Transaktionen importieren möchten?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "Sie haben {count} Transaktionen erfolgreich importiert.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Ein Aktivierungslink wurde an Ihre E-Mail-Adresse gesendet: {email}. Wenn Sie die E-Mail nicht erhalten haben, geben Sie bitte das Passwort erneut ein und klicken Sie auf die Schaltfläche unten, um die Bestätigungs-E-Mail erneut zu senden.",
"resendValidationEmailTip": "Wenn Sie die E-Mail nicht erhalten haben, geben Sie bitte das Passwort erneut ein und klicken Sie auf die Schaltfläche unten, um die Bestätigungs-E-Mail an: {email} erneut zu senden."
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Transaction type mapping is invalid",
"transaction time format invalid": "Transaction time format is invalid",
"transaction time zone format invalid": "Transaction time zone format is invalid",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "Transaktionskategorie-ID ist ungültig",
"transaction category not found": "Transaktionskategorie nicht gefunden",
"transaction category type is invalid": "Transaktionskategorietyp ist ungültig",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Are you sure you want to delete this sub-account?",
"Unable to delete this account": "Konto kann nicht gelöscht werden",
"Unable to delete this sub-account": "Unable to delete this sub-account",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Default Transfer Category",
"Invalid Account": "Ungültiges Konto",
"Target Account": "Zielkonto",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Ungültiges Tag",
"Target Tag": "Ziel-Tag",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Are you sure you want to import {count} transactions?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "You have imported {count} transactions successfully.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Account activation link has been sent to your email address: {email}, If you don't receive the mail, please fill password again and click the button below to resend the validation mail.",
"resendValidationEmailTip": "If you don't receive the mail, please fill password again and click the button below to resend the validation mail to: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Transaction type mapping is invalid",
"transaction time format invalid": "Transaction time format is invalid",
"transaction time zone format invalid": "Transaction time zone format is invalid",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "Transaction category ID is invalid",
"transaction category not found": "Transaction category is not found",
"transaction category type is invalid": "Transaction category type is invalid",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Are you sure you want to delete this sub-account?",
"Unable to delete this account": "Unable to delete this account",
"Unable to delete this sub-account": "Unable to delete this sub-account",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Default Transfer Category",
"Invalid Account": "Invalid Account",
"Target Account": "Target Account",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Invalid Tag",
"Target Tag": "Target Tag",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "¿Está seguro de que desea importar {count} transacciones?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "Ha importado {count} transacciones correctamente.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "El enlace de activación de la cuenta se envió a su dirección de correo electrónico: {email}. Si no recibe el correo, ingrese la contraseña nuevamente y haga clic en el botón a continuación para reenviar el correo de validación.",
"resendValidationEmailTip": "Si no recibe el correo, complete nuevamente la contraseña y haga clic en el botón a continuación para reenviar el correo de validación a: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Transaction type mapping is invalid",
"transaction time format invalid": "Transaction time format is invalid",
"transaction time zone format invalid": "Transaction time zone format is invalid",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "El ID de categoría de transacción no es válido",
"transaction category not found": "No se encuentra la categoría de transacción",
"transaction category type is invalid": "El tipo de categoría de transacción no es válido",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Are you sure you want to delete this sub-account?",
"Unable to delete this account": "No se puede eliminar esta cuenta",
"Unable to delete this sub-account": "Unable to delete this sub-account",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Default Transfer Category",
"Invalid Account": "Cuenta no válida",
"Target Account": "Cuenta de destino",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Etiqueta no válida",
"Target Tag": "Etiqueta de destino",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Êtes-vous sûr de vouloir importer {count} transactions ?",
"importingTransactions": "Importation ({process}%)",
"importTransactionResult": "Vous avez importé {count} transactions avec succès.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Le lien d'activation du compte a été envoyé à votre adresse e-mail : {email}, Si vous ne recevez pas le mail, veuillez remplir à nouveau le mot de passe et cliquer sur le bouton ci-dessous pour renvoyer l'e-mail de validation.",
"resendValidationEmailTip": "Si vous ne recevez pas le mail, veuillez remplir à nouveau le mot de passe et cliquer sur le bouton ci-dessous pour renvoyer l'e-mail de validation à : {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Le mappage du type de transaction est invalide",
"transaction time format invalid": "Le format d'heure de transaction est invalide",
"transaction time zone format invalid": "Le format de fuseau horaire de transaction est invalide",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "L'ID de catégorie de transaction est invalide",
"transaction category not found": "Catégorie de transaction non trouvée",
"transaction category type is invalid": "Le type de catégorie de transaction est invalide",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Êtes-vous sûr de vouloir supprimer ce sous-compte ?",
"Unable to delete this account": "Impossible de supprimer ce compte",
"Unable to delete this sub-account": "Impossible de supprimer ce sous-compte",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Relevé de rapprochement",
"Account Balance Trends": "Tendances du solde du compte",
"Update Closing Balance": "Mettre à jour le solde de clôture",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Catégorie de virement par défaut",
"Invalid Account": "Compte invalide",
"Target Account": "Compte cible",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Étiquette invalide",
"Target Tag": "Étiquette cible",
"Remove Tag": "Supprimer l'étiquette",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Sei sicuro di voler importare {count} transazioni?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "Hai importato {count} transazioni.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Abbiamo inviato un link per l'attivazione del tuo account all'indirizzo {email}. Se non hai ricevuto la mail, inserisci nuovamente la password e premi il bottone per ritentare l'invio.",
"resendValidationEmailTip": "Se non hai ricevuto la mail, inserisci nuovamente la password e premi il bottone per ritentare l'invio all'indirizzo: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Mappatura del tipo di transazione non valida",
"transaction time format invalid": "Formato dell'ora della transazione non valido",
"transaction time zone format invalid": "Formato del fuso orario della transazione non valido",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "ID categoria transazione non valido",
"transaction category not found": "Categoria transazione non trovata",
"transaction category type is invalid": "Tipo di categoria transazione non valido",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Sei sicuro di voler eliminare questo sotto-account?",
"Unable to delete this account": "Impossibile eliminare questo account",
"Unable to delete this sub-account": "Impossibile eliminare questo sotto-account",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Categoria di trasferimento predefinita",
"Invalid Account": "Conto non valido",
"Target Account": "Conto di destinazione",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Tag non valido",
"Target Tag": "Tag di destinazione",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "本当に{count}件の取引をインポートしますか?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "{count}件の取引を正常にインポートしました。",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "アカウントの有効化リンクがメールアドレスに送信されました:{email}、メールが届かない場合はパスワードをもう一度入力して下のボタンをクリックして認証メールを再送信してください。",
"resendValidationEmailTip": "メールが届かない場合は、パスワードをもう一度入力の上、以下のボタンをクリックして検証メールを再送信してください: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "取引タイプのマッピングが無効です",
"transaction time format invalid": "取引時間の形式が無効です",
"transaction time zone format invalid": "取引のタイムゾーン形式が無効です",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "取引カテゴリIDは無効です",
"transaction category not found": "取引カテゴリは見つかりません",
"transaction category type is invalid": "取引カテゴリタイプは無効です",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Are you sure you want to delete this sub-account?",
"Unable to delete this account": "この口座を削除できません",
"Unable to delete this sub-account": "Unable to delete this sub-account",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Default Transfer Category",
"Invalid Account": "無効な口座",
"Target Account": "対象口座",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "無効なタグ",
"Target Tag": "対象タグ",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "{count}개의 거래를 가져오시겠습니까?",
"importingTransactions": "가져오는 중 ({process}%)",
"importTransactionResult": "성공적으로 {count}개의 거래를 가져왔습니다.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "이 작업은 되돌릴 수 없습니다. {account}의 거래 데이터를 지웁니다. 계속하시려면 현재 비밀번호를 입력하세요.",
"accountActivationAndResendValidationEmailTip": "계정 활성화 링크가 귀하의 이메일 주소({email})로 전송되었습니다. 메일을 받지 못하신 경우, 비밀번호를 다시 입력하고 아래 버튼을 클릭하여 확인 메일을 재전송하십시오.",
"resendValidationEmailTip": "메일을 받지 못하신 경우, 비밀번호를 다시 입력하고 아래 버튼을 클릭하여 확인 메일을 {email}로 재전송하십시오."
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "거래 유형 매핑이 유효하지 않습니다.",
"transaction time format invalid": "거래 시간 형식이 유효하지 않습니다.",
"transaction time zone format invalid": "거래 시간대 형식이 유효하지 않습니다.",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "거래 카테고리 ID가 유효하지 않습니다.",
"transaction category not found": "거래 카테고리를 찾을 수 없습니다.",
"transaction category type is invalid": "거래 카테고리 유형이 유효하지 않습니다.",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "이 하위계좌를 삭제하시겠습니까?",
"Unable to delete this account": "이 계좌를 삭제할 수 없습니다.",
"Unable to delete this sub-account": "이 하위계좌를 삭제할 수 없습니다.",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "조정 명세서",
"Account Balance Trends": "계좌 잔액 추세",
"Update Closing Balance": "마감 잔액 업데이트",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "기본 이체 카테고리",
"Invalid Account": "유효하지 않은 계좌",
"Target Account": "대상 계좌",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "유효하지 않은 태그",
"Target Tag": "대상 태그",
"Remove Tag": "태그 제거",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Weet je zeker dat je {count} transacties wilt importeren?",
"importingTransactions": "Bezig met importeren ({process}%)",
"importTransactionResult": "Je hebt {count} transacties succesvol geïmporteerd.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Een activatielink is verzonden naar je e-mailadres: {email}. Als je de e-mail niet ontvangt, vul dan je wachtwoord opnieuw in en klik op de knop hieronder om de validatiemail opnieuw te verzenden.",
"resendValidationEmailTip": "Als je de e-mail niet ontvangt, vul dan je wachtwoord opnieuw in en klik op de knop hieronder om de validatiemail opnieuw te verzenden naar: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Transactietypetoewijzing is ongeldig",
"transaction time format invalid": "Formaat van transactietijd is ongeldig",
"transaction time zone format invalid": "Formaat van transactietijdzone is ongeldig",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "Transactiecategorie-ID is ongeldig",
"transaction category not found": "Transactiecategorie niet gevonden",
"transaction category type is invalid": "Type transactiecategorie is ongeldig",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Weet je zeker dat je deze subrekening wilt verwijderen?",
"Unable to delete this account": "Kan deze rekening niet verwijderen",
"Unable to delete this sub-account": "Kan deze subrekening niet verwijderen",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Afstemmingsrapport",
"Account Balance Trends": "Rekening-saldotrends",
"Update Closing Balance": "Eindsaldo bijwerken",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Standaard overboekingscategorie",
"Invalid Account": "Ongeldige rekening",
"Target Account": "Doelrekening",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Ongeldige tag",
"Target Tag": "Doeltag",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Tem certeza de que deseja importar {count} transações?",
"importingTransactions": "Importando ({process}%)",
"importTransactionResult": "Você importou {count} transações com sucesso.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "O link de ativação da conta foi enviado para seu endereço de e-mail: {email}. Se você não receber o e-mail, por favor preencha a senha novamente e clique no botão abaixo para reenviar o e-mail de validação.",
"resendValidationEmailTip": "Se você não receber o e-mail, por favor preencha a senha novamente e clique no botão abaixo para reenviar o e-mail de validação para: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Mapeamento de tipo de transação é inválido",
"transaction time format invalid": "Formato de tempo da transação é inválido",
"transaction time zone format invalid": "Formato de fuso horário da transação é inválido",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "ID de categoria de transação é inválido",
"transaction category not found": "Categoria de transação não encontrada",
"transaction category type is invalid": "Tipo de categoria de transação é inválido",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Tem certeza de que deseja deletar esta subconta?",
"Unable to delete this account": "Não foi possível deletar esta conta",
"Unable to delete this sub-account": "Não foi possível deletar esta subconta",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Categoria Padrão de Transferência",
"Invalid Account": "Conta Inválida",
"Target Account": "Conta Alvo",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Tag Inválida",
"Target Tag": "Tag Alvo",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Вы уверены, что хотите импортировать {count} транзакций?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "Вы успешно импортировали {count} транзакций.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Ссылка для активации учетной записи была отправлена на ваш электронный адрес: {email}. Если вы не получили письмо, заполните пароль снова и нажмите кнопку ниже, чтобы отправить письмо повторно.",
"resendValidationEmailTip": "Если вы не получили письмо, заполните пароль снова и нажмите кнопку ниже, чтобы отправить письмо повторно на: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Transaction type mapping is invalid",
"transaction time format invalid": "Transaction time format is invalid",
"transaction time zone format invalid": "Transaction time zone format is invalid",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "ID категории транзакции недействителен",
"transaction category not found": "Категория транзакции не найдена",
"transaction category type is invalid": "Тип категории транзакции недействителен",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Are you sure you want to delete this sub-account?",
"Unable to delete this account": "Не удалось удалить этот счет",
"Unable to delete this sub-account": "Unable to delete this sub-account",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Default Transfer Category",
"Invalid Account": "Недействительный счет",
"Target Account": "Целевой счет",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Недействительный тег",
"Target Tag": "Целевой тег",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "คุณแน่ใจหรือไม่ว่าต้องการนำเข้าธุรกรรม {count} รายการ?",
"importingTransactions": "กำลังนำเข้า ({process}%)",
"importTransactionResult": "คุณได้นำเข้าธุรกรรม {count} รายการเรียบร้อยแล้ว",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "คุณไม่สามารถยกเลิกการกระทำนี้ได้ การกระทำนี้จะลบข้อมูลธุรกรรมทั้งหมดใน {account} โปรดป้อนรหัสผ่านปัจจุบันเพื่อยืนยัน",
"accountActivationAndResendValidationEmailTip": "ลิงก์สำหรับเปิดใช้งานบัญชีได้ถูกส่งไปยังอีเมลของคุณแล้ว: {email} หากคุณไม่ได้รับอีเมล โปรดกรอกรหัสผ่านอีกครั้งแล้วกดปุ่มด้านล่างเพื่อส่งอีเมลยืนยันอีกครั้ง",
"resendValidationEmailTip": "หากคุณไม่ได้รับอีเมล โปรดกรอกรหัสผ่านอีกครั้งแล้วกดปุ่มด้านล่างเพื่อส่งอีเมลยืนยันไปยัง: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "การแมปประเภทธุรกรรมไม่ถูกต้อง",
"transaction time format invalid": "รูปแบบเวลาธุรกรรมไม่ถูกต้อง",
"transaction time zone format invalid": "รูปแบบโซนเวลาธุรกรรมไม่ถูกต้อง",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "รหัสหมวดหมู่ธุรกรรมไม่ถูกต้อง",
"transaction category not found": "ไม่พบหมวดหมู่ธุรกรรม",
"transaction category type is invalid": "ประเภทหมวดหมู่ธุรกรรมไม่ถูกต้อง",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "คุณแน่ใจหรือว่าต้องการลบบัญชีย่อยนี้?",
"Unable to delete this account": "ไม่สามารถลบบัญชีนี้ได้",
"Unable to delete this sub-account": "ไม่สามารถลบบัญชีย่อยนี้ได้",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "งบกระทบยอด",
"Account Balance Trends": "แนวโน้มยอดบัญชี",
"Update Closing Balance": "อัปเดตยอดปิดบัญชี",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "หมวดโอนเริ่มต้น",
"Invalid Account": "บัญชีไม่ถูกต้อง",
"Target Account": "บัญชีเป้าหมาย",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "แท็กไม่ถูกต้อง",
"Target Tag": "แท็กเป้าหมาย",
"Remove Tag": "ลบแท็ก",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Ви впевнені, що хочете імпортувати {count} транзакцій?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "Ви успішно імпортували {count} транзакцій.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Посилання для активації облікового запису було надіслано на вашу електронну адресу: {email}. Якщо ви не отримали лист, введіть пароль ще раз і натисніть кнопку нижче, щоб надіслати лист повторно.",
"resendValidationEmailTip": "Якщо ви не отримали лист, введіть пароль ще раз і натисніть кнопку нижче, щоб надіслати лист повторно на адресу: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Некоректне зіставлення типу транзакції",
"transaction time format invalid": "Неправильний формат часу транзакції",
"transaction time zone format invalid": "Неправильний формат часового поясу транзакції",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "ID категорії транзакції недійсний",
"transaction category not found": "Категорію транзакції не знайдено",
"transaction category type is invalid": "Тип категорії транзакції недійсний",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Ви впевнені, що хочете видалити цей субрахунок?",
"Unable to delete this account": "Не вдалося видалити цей рахунок",
"Unable to delete this sub-account": "Не вдалося видалити цей субрахунок",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Категорія переказів за замовчуванням",
"Invalid Account": "Недійсний рахунок",
"Target Account": "Цільовий рахунок",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Недійсний тег",
"Target Tag": "Цільовий тег",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "Bạn có chắc chắn muốn nhập {count} giao dịch không?",
"importingTransactions": "Importing ({process}%)",
"importTransactionResult": "Bạn đã nhập thành công {count} giao dịch.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "You CANNOT undo this action. This will clear your transactions data in {account}. Please enter your current password to confirm.",
"accountActivationAndResendValidationEmailTip": "Liên kết kích hoạt tài khoản đã được gửi tới email của bạn: {email}. Nếu bạn không nhận được email, vui lòng nhập lại mật khẩu và nhấp nút bên dưới để gửi lại email xác nhận.",
"resendValidationEmailTip": "Nếu bạn không nhận được email, vui lòng nhập lại mật khẩu và nhấp nút bên dưới để gửi lại email xác nhận tới: {email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "Transaction type mapping is invalid",
"transaction time format invalid": "Transaction time format is invalid",
"transaction time zone format invalid": "Transaction time zone format is invalid",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"transaction category id is invalid": "ID danh mục giao dịch không hợp lệ",
"transaction category not found": "Không tìm thấy danh mục giao dịch",
"transaction category type is invalid": "Loại danh mục giao dịch không hợp lệ",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "Are you sure you want to delete this sub-account?",
"Unable to delete this account": "Không thể xóa tài khoản này",
"Unable to delete this sub-account": "Unable to delete this sub-account",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "Default Transfer Category",
"Invalid Account": "Tài khoản không hợp lệ",
"Target Account": "Tài khoản mục tiêu",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Invalid Tag": "Thẻ không hợp lệ",
"Target Tag": "Thẻ mục tiêu",
"Remove Tag": "Remove Tag",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "您确定要导入 {count} 个交易?",
"importingTransactions": "正在导入 ({process}%)",
"importTransactionResult": "您已经成功导入 {count} 个交易。",
"moveTransactionsInAccountTip": "您不能撤销该操作。该操作将会把 {fromAccount} 账户中所有的交易数据移动到 {toAccount}。",
"clearTransactionsInAccountTip": "您不能撤销该操作。该操作将会清除您在 {account} 账户中的交易数据。请输入您当前的密码以确认。",
"accountActivationAndResendValidationEmailTip": "账号激活链接已经发送到您的邮箱地址:{email},如果您没有收到邮件,请再次输入密码并点击下方的按钮重新发送验证邮件。",
"resendValidationEmailTip": "如果您没有收到邮件,请再次输入密码并点击下方的按钮重新发送验证邮件到:{email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "交易类型映射无效",
"transaction time format invalid": "交易时间格式无效",
"transaction time zone format invalid": "交易时区格式无效",
"cannot move transaction to same account": "不能将交易移动到相同的账户",
"cannot move transaction from or to hidden account": "不能从隐藏账户移动交易或移动交易到隐藏账户",
"cannot move transaction from or to parent account": "不能从父账户移动交易或移动交易到父账户",
"cannot move transaction between accounts with different currencies": "不能在不同货币的账户之间移动交易",
"transaction category id is invalid": "交易分类ID无效",
"transaction category not found": "交易分类不存在",
"transaction category type is invalid": "交易分类类型无效",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "您确定要删除该子账户?",
"Unable to delete this account": "无法删除该账户",
"Unable to delete this sub-account": "无法删除该子账户",
"Move All Transactions": "移动所有交易",
"Are you sure you want to move all transactions?": "您确定要移动所有交易?",
"Unable to move transactions": "无法移动交易",
"All transactions in this account has been moved.": "该账户中的所有交易已被移动。",
"Reconciliation Statement": "对账单",
"Account Balance Trends": "账户余额趋势",
"Update Closing Balance": "更新期末余额",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "默认转账分类",
"Invalid Account": "无效账户",
"Target Account": "目标账户",
"Confirm Target Account Name": "确认目标账户名称",
"Please re-enter the target account name to confirm": "请重新输入目标账户名称以确认",
"Invalid Tag": "无效标签",
"Target Tag": "目标标签",
"Remove Tag": "删除标签",
+11
View File
@@ -126,6 +126,7 @@
"confirmImportTransactions": "您確定要匯入 {count} 個交易?",
"importingTransactions": "正在匯入 ({process}%)",
"importTransactionResult": "您已經成功匯入 {count} 個交易。",
"moveTransactionsInAccountTip": "您不能還原此操作。此操作將會把 {fromAccount} 帳戶中的所有交易資料移動到 {toAccount}。",
"clearTransactionsInAccountTip": "您不能還原此操作。此操作將會清除您在 {account} 帳戶中的交易資料。請輸入您目前的密碼以確認。",
"accountActivationAndResendValidationEmailTip": "帳號啟用連結已經傳送到您的信箱地址:{email},如果您沒有收到郵件,請再次輸入密碼並點擊下方的按鈕重新發送驗證郵件。",
"resendValidationEmailTip": "如果您沒有收到郵件,請再次輸入密碼並點擊下方的按鈕重新發送驗證郵件到:{email}"
@@ -1163,6 +1164,10 @@
"transaction type mapping invalid": "交易類型對應無效",
"transaction time format invalid": "交易時間格式無效",
"transaction time zone format invalid": "交易時區格式無效",
"cannot move transaction to same account": "不能將交易移動到相同的帳戶",
"cannot move transaction from or to hidden account": "不能從隱藏帳戶移動交易或移動交易到隱藏帳戶",
"cannot move transaction from or to parent account": "不能從父帳戶移動交易或移動交易到父帳戶",
"cannot move transaction between accounts with different currencies": "不能在不同幣別的帳戶之間移動交易",
"transaction category id is invalid": "交易分類ID無效",
"transaction category not found": "交易分類不存在",
"transaction category type is invalid": "交易分類類型無效",
@@ -1704,6 +1709,10 @@
"Are you sure you want to delete this sub-account?": "您確定要刪除這個子帳戶?",
"Unable to delete this account": "無法刪除此帳戶",
"Unable to delete this sub-account": "無法刪除此子帳戶",
"Move All Transactions": "移動所有交易",
"Are you sure you want to move all transactions?": "您確定要移動所有交易?",
"Unable to move transactions": "無法移動交易",
"All transactions in this account has been moved.": "此帳戶中的所有交易已被移動。",
"Reconciliation Statement": "對帳單",
"Account Balance Trends": "帳戶餘額趨勢",
"Update Closing Balance": "更新期末餘額",
@@ -1886,6 +1895,8 @@
"Default Transfer Category": "預設轉帳分類",
"Invalid Account": "無效帳戶",
"Target Account": "目標帳戶",
"Confirm Target Account Name": "確認目標帳戶名稱",
"Please re-enter the target account name to confirm": "請再次輸入目標帳戶名稱以確認",
"Invalid Tag": "無效標籤",
"Target Tag": "目標標籤",
"Remove Tag": "移除標籤",
+5
View File
@@ -488,6 +488,11 @@ export interface TransactionModifyRequest {
readonly geoLocation?: TransactionGeoLocationRequest;
}
export interface TransactionMoveBetweenAccountsRequest {
readonly fromAccountId: string;
readonly toAccountId: string;
}
export interface TransactionDeleteRequest {
readonly id: string;
}
+6
View File
@@ -14,6 +14,7 @@ import TransactionAmountFilterPage from '@/views/mobile/transactions/AmountFilte
import AccountListPage from '@/views/mobile/accounts/ListPage.vue';
import AccountEditPage from '@/views/mobile/accounts/EditPage.vue';
import AccountReconciliationStatementPage from '@/views/mobile/accounts/ReconciliationStatementPage.vue';
import AccountMoveAllTransactionsPage from '@/views/mobile/accounts/MoveAllTransactionsPage.vue';
import StatisticsTransactionPage from '@/views/mobile/statistics/TransactionPage.vue';
import StatisticsSettingsPage from '@/views/mobile/statistics/SettingsPage.vue';
@@ -197,6 +198,11 @@ const routes: Router.RouteParameters[] = [
async: asyncResolve(AccountReconciliationStatementPage),
beforeEnter: [checkLogin]
},
{
path: '/account/move_all_transactions',
async: asyncResolve(AccountMoveAllTransactionsPage),
beforeEnter: [checkLogin]
},
{
path: '/statistic/transaction',
async: asyncResolve(StatisticsTransactionPage),
+46
View File
@@ -1103,6 +1103,51 @@ export const useTransactionsStore = defineStore('transactions', () => {
});
}
function moveAllTransactionsBetweenAccounts({ fromAccountId, toAccountId }: { fromAccountId: string, toAccountId: string }): Promise<boolean> {
return new Promise((resolve, reject) => {
services.moveAllTransactionsBetweenAccounts({ fromAccountId, toAccountId }).then(response => {
const data = response.data;
if (!data || !data.success || !data.result) {
reject({ message: 'Unable to move transactions' });
return;
}
if (!transactionListStateInvalid.value) {
updateTransactionListInvalidState(true);
}
if (!transactionReconciliationStatementStateInvalid.value) {
updateTransactionReconciliationStatementInvalidState(true);
}
if (!accountsStore.accountListStateInvalid) {
accountsStore.updateAccountListInvalidState(true);
}
if (!overviewStore.transactionOverviewStateInvalid) {
overviewStore.updateTransactionOverviewInvalidState(true);
}
if (!statisticsStore.transactionStatisticsStateInvalid) {
statisticsStore.updateTransactionStatisticsInvalidState(true);
}
resolve(data.result);
}).catch(error => {
logger.error('failed to move transactions', error);
if (error.response && error.response.data && error.response.data.errorMessage) {
reject({ error: error.response.data });
} else if (!error.processed) {
reject({ message: 'Unable to move transactions' });
} else {
reject(error);
}
});
});
}
function deleteTransaction({ transaction, defaultCurrency, beforeResolve }: { transaction: TransactionInfoResponse, defaultCurrency: string, beforeResolve?: BeforeResolveFunction }): Promise<boolean> {
return new Promise((resolve, reject) => {
services.deleteTransaction({
@@ -1405,6 +1450,7 @@ export const useTransactionsStore = defineStore('transactions', () => {
getReconciliationStatements,
getTransaction,
saveTransaction,
moveAllTransactionsBetweenAccounts,
deleteTransaction,
recognizeReceiptImage,
cancelRecognizeReceiptImage,
@@ -0,0 +1,61 @@
import { ref, computed } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
import { useSettingsStore } from '@/stores/setting.ts';
import { useAccountsStore } from '@/stores/account.ts';
import { Account, type CategorizedAccountWithDisplayBalance } from '@/models/account.ts';
export function useMoveAllTransactionsPageBase() {
const { tt, getCategorizedAccountsWithDisplayBalance } = useI18n();
const settingsStore = useSettingsStore();
const accountsStore = useAccountsStore();
const moving = ref<boolean>(false);
const fromAccount = ref<Account | undefined>(undefined);
const toAccountId = ref<string>('');
const toAccountName = ref<string>('');
const showAccountBalance = computed<boolean>(() => settingsStore.appSettings.showAccountBalance);
const allAccounts = computed<Account[]>(() => accountsStore.allPlainAccounts);
const allVisibleAccounts = computed<Account[]>(() => accountsStore.allVisiblePlainAccounts);
const allVisibleCategorizedAccounts = computed<CategorizedAccountWithDisplayBalance[]>(() => getCategorizedAccountsWithDisplayBalance(allVisibleAccounts.value, showAccountBalance.value));
const displayToAccountName = computed<string>(() => {
if (!toAccountId.value) {
return tt('Target Account');
}
return Account.findAccountNameById(allAccounts.value, toAccountId.value, tt('Target Account')) || tt('Target Account');
});
const isToAccountNameValid = computed<boolean>(() => {
if (!toAccountId.value || !toAccountName.value) {
return false;
}
const expectedAccountName = Account.findAccountNameById(allAccounts.value, toAccountId.value);
if (!expectedAccountName) {
return false;
}
return expectedAccountName === toAccountName.value;
});
return {
// states
moving,
fromAccount,
toAccountId,
toAccountName,
// computed states
allAccounts,
allVisibleAccounts,
allVisibleCategorizedAccounts,
displayToAccountName,
isToAccountNameValid
};
}
+31 -4
View File
@@ -250,10 +250,21 @@
</v-btn>
<v-btn class="px-2 ms-1" density="comfortable" color="default" variant="text"
:class="{ 'd-none': loading, 'hover-display': !loading }"
:disabled="loading" :prepend-icon="mdiEraser"
v-if="element.type === AccountType.SingleAccount.type || element.getSubAccount(activeSubAccount[element.id])"
@click="clearAllTransactions(element)">
{{ tt('Clear All Transactions') }}
:disabled="loading" :prepend-icon="mdiDotsHorizontalCircleOutline"
v-if="element.type === AccountType.SingleAccount.type || element.getSubAccount(activeSubAccount[element.id])">
{{ tt('More') }}
<v-menu activator="parent" :open-on-hover="true">
<v-list>
<v-list-item class="text-sm" density="compact"
:title="tt('Move All Transactions')"
:prepend-icon="mdiSwapHorizontal"
@click="moveAllTransactions(element)"></v-list-item>
<v-list-item class="text-sm" density="compact"
:title="tt('Clear All Transactions')"
:prepend-icon="mdiEraser"
@click="clearAllTransactions(element)"></v-list-item>
</v-list>
</v-menu>
</v-btn>
<v-btn class="px-2 ms-1" density="comfortable" color="default" variant="text"
:class="{ 'd-none': loading, 'hover-display': !loading }"
@@ -289,6 +300,7 @@
<edit-dialog ref="editDialog" />
<reconciliation-statement-dialog ref="reconciliationStatementDialog"
@error="onShowDateRangeError" />
<move-all-transactions-dialog ref="moveAllTransactionsDialog" />
<clear-all-transactions-dialog ref="clearAllTransactionsDialog" />
<date-range-selection-dialog :title="tt('Custom Date Range')"
@@ -305,6 +317,7 @@ import ConfirmDialog from '@/components/desktop/ConfirmDialog.vue';
import SnackBar from '@/components/desktop/SnackBar.vue';
import EditDialog from './list/dialogs/EditDialog.vue';
import ReconciliationStatementDialog from './list/dialogs/ReconciliationStatementDialog.vue';
import MoveAllTransactionsDialog from '@/views/desktop/accounts/list/dialogs/MoveAllTransactionsDialog.vue';
import ClearAllTransactionsDialog from '@/views/desktop/accounts/list/dialogs/ClearAllTransactionsDialog.vue';
import AccountFilterSettingsCard from '@/views/desktop/common/cards/AccountFilterSettingsCard.vue';
@@ -331,6 +344,8 @@ import {
mdiSquareRounded,
mdiMenu,
mdiPencilOutline,
mdiDotsHorizontalCircleOutline,
mdiSwapHorizontal,
mdiEraser,
mdiDeleteOutline,
mdiListBoxOutline,
@@ -343,6 +358,7 @@ type ConfirmDialogType = InstanceType<typeof ConfirmDialog>;
type SnackBarType = InstanceType<typeof SnackBar>;
type EditDialogType = InstanceType<typeof EditDialog>;
type ReconciliationStatementDialogType = InstanceType<typeof ReconciliationStatementDialog>;
type MoveAllTransactionsDialogType = InstanceType<typeof MoveAllTransactionsDialog>;
type ClearAllTransactionsDialogType = InstanceType<typeof ClearAllTransactionsDialog>;
const display = useDisplay();
@@ -372,6 +388,7 @@ const confirmDialog = useTemplateRef<ConfirmDialogType>('confirmDialog');
const snackbar = useTemplateRef<SnackBarType>('snackbar');
const editDialog = useTemplateRef<EditDialogType>('editDialog');
const reconciliationStatementDialog = useTemplateRef<ReconciliationStatementDialogType>('reconciliationStatementDialog');
const moveAllTransactionsDialog = useTemplateRef<MoveAllTransactionsDialogType>('moveAllTransactionsDialog');
const clearAllTransactionsDialog = useTemplateRef<ClearAllTransactionsDialogType>('clearAllTransactionsDialog');
const activeAccountCategoryType = ref<number>(AccountCategory.Default.type);
@@ -525,6 +542,16 @@ function showReconciliationStatementCustomDateRangeDialog(account: Account, date
});
}
function moveAllTransactions(account: Account): void {
moveAllTransactionsDialog.value?.open(account).then(() => {
snackbar.value?.showMessage('All transactions in this account has been moved.');
if (accountsStore.accountListStateInvalid && !loading.value) {
reload(false);
}
});
}
function clearAllTransactions(account: Account): void {
clearAllTransactionsDialog.value?.open(account).then(() => {
snackbar.value?.showMessage('All transactions in this account has been cleared');
@@ -0,0 +1,160 @@
<template>
<v-dialog width="640" :persistent="true" v-model="showState">
<v-card class="pa-2 pa-sm-4 pa-md-4">
<template #title>
<div class="d-flex align-center justify-center">
<h4 class="text-h4 text-wrap">{{ tt('Are you sure you want to move all transactions?') }}</h4>
</div>
</template>
<v-card-text>{{ tt('format.misc.moveTransactionsInAccountTip', { fromAccount: fromAccount?.name, toAccount: displayToAccountName }) }}</v-card-text>
<v-card-text class="mb-md-4 w-100 d-flex justify-center">
<v-row>
<v-col cols="12" md="12">
<two-column-select primary-key-field="id" primary-value-field="category"
primary-title-field="name" primary-footer-field="displayBalance"
primary-icon-field="icon" primary-icon-type="account"
primary-sub-items-field="accounts"
:primary-title-i18n="true"
secondary-key-field="id" secondary-value-field="id"
secondary-title-field="name" secondary-footer-field="displayBalance"
secondary-icon-field="icon" secondary-icon-type="account" secondary-color-field="color"
:disabled="loading || moving || !allVisibleAccounts.length"
:enable-filter="true" :filter-placeholder="tt('Find account')" :filter-no-items-text="tt('No available account')"
:label="tt('Target Account')"
:placeholder="tt('Target Account')"
:items="allVisibleCategorizedAccounts"
:no-item-text="Account.findAccountNameById(allAccounts, toAccountId, tt('Unspecified'))"
v-model="toAccountId">
</two-column-select>
</v-col>
<v-col cols="12" md="12">
<v-text-field type="text"
persistent-placeholder
:disabled="moving"
:label="tt('Confirm Target Account Name')"
:placeholder="tt('Please re-enter the target account name to confirm')"
v-model="toAccountName"
/>
</v-col>
</v-row>
</v-card-text>
<v-card-text class="overflow-y-visible">
<div class="w-100 d-flex justify-center gap-4">
<v-btn :disabled="!fromAccount || !toAccountId || fromAccount?.id === toAccountId || !toAccountName || !isToAccountNameValid || moving" @click="confirm">
{{ tt('Confirm') }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="moving"></v-progress-circular>
</v-btn>
<v-btn color="secondary" variant="tonal" :disabled="moving" @click="cancel">
{{ tt('Cancel') }}
</v-btn>
</div>
</v-card-text>
</v-card>
</v-dialog>
<snack-bar ref="snackbar" />
</template>
<script setup lang="ts">
import SnackBar from '@/components/desktop/SnackBar.vue';
import { ref, useTemplateRef } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
import { useMoveAllTransactionsPageBase } from '@/views/base/accounts/MoveAllTransactionsPageBase.ts'
import { useAccountsStore } from '@/stores/account.ts';
import { useTransactionsStore } from '@/stores/transaction.ts';
import { Account } from '@/models/account.ts';
type SnackBarType = InstanceType<typeof SnackBar>;
const { tt } = useI18n();
const {
moving,
fromAccount,
toAccountId,
toAccountName,
allAccounts,
allVisibleAccounts,
allVisibleCategorizedAccounts,
displayToAccountName,
isToAccountNameValid
} = useMoveAllTransactionsPageBase();
const accountsStore = useAccountsStore();
const transactionsStore = useTransactionsStore();
let resolveFunc: (() => void) | null = null;
let rejectFunc: ((reason?: unknown) => void) | null = null;
const snackbar = useTemplateRef<SnackBarType>('snackbar');
const showState = ref<boolean>(false);
const loading = ref<boolean>(false);
function init(): void {
accountsStore.loadAllAccounts({
force: false
}).then(() => {
loading.value = false;
}).catch(error => {
loading.value = false;
if (!error.processed) {
snackbar.value?.showError(error);
}
});
}
function open(account: Account): Promise<void> {
showState.value = true;
moving.value = false;
fromAccount.value = account;
toAccountId.value = '';
toAccountName.value = '';
return new Promise((resolve, reject) => {
resolveFunc = resolve;
rejectFunc = reject;
});
}
function confirm(): void {
if (!fromAccount.value || !toAccountId.value || fromAccount.value?.id === toAccountId.value || !toAccountName.value || !isToAccountNameValid.value) {
return;
}
moving.value = true;
transactionsStore.moveAllTransactionsBetweenAccounts({
fromAccountId: fromAccount.value.id,
toAccountId: toAccountId.value
}).then(() => {
moving.value = false;
resolveFunc?.();
showState.value = false;
}).catch(error => {
moving.value = false;
if (!error.processed) {
snackbar.value?.showError(error);
}
});
}
function cancel(): void {
rejectFunc?.();
showState.value = false;
}
defineExpose({
open
});
init();
</script>
+13
View File
@@ -163,6 +163,7 @@
<f7-actions-button @click="showReconciliationStatement(accountForMoreActionSheet)">{{ tt('Reconciliation Statement') }}</f7-actions-button>
</f7-actions-group>
<f7-actions-group v-if="accountForMoreActionSheet && accountForMoreActionSheet.type === AccountType.SingleAccount.type">
<f7-actions-button @click="moveAllTransactions(accountForMoreActionSheet)">{{ tt('Move All Transactions') }}</f7-actions-button>
<f7-actions-button color="red" @click="showPasswordSheetForClearAllTransaction(accountForMoreActionSheet)">{{ tt('Clear All Transactions') }}</f7-actions-button>
</f7-actions-group>
<template v-if="accountForMoreActionSheet && accountForMoreActionSheet.type === AccountType.MultiSubAccounts.type">
@@ -171,6 +172,7 @@
v-show="showHidden || !subAccount.hidden">
<f7-actions-label>{{ subAccount.name }}</f7-actions-label>
<f7-actions-button @click="showReconciliationStatement(subAccount)">{{ tt('Reconciliation Statement') }}</f7-actions-button>
<f7-actions-button @click="moveAllTransactions(subAccount)">{{ tt('Move All Transactions') }}</f7-actions-button>
<f7-actions-button color="red" @click="showPasswordSheetForClearAllTransaction(subAccount)">{{ tt('Clear All Transactions') }}</f7-actions-button>
</f7-actions-group>
</template>
@@ -363,6 +365,17 @@ function showReconciliationStatement(account: Account | null): void {
accountForMoreActionSheet.value = null;
}
function moveAllTransactions(account: Account | null): void {
if (!account) {
showAlert('An error occurred');
return;
}
props.f7router.navigate('/account/move_all_transactions?fromAccountId=' + account.id);
showAccountMoreActionSheet.value = false;
accountForMoreActionSheet.value = null;
}
function showPasswordSheetForClearAllTransaction(account: Account | null): void {
if (!account) {
showAlert('An error occurred');
@@ -0,0 +1,165 @@
<template>
<f7-page @page:afterin="onPageAfterIn">
<f7-navbar>
<f7-nav-left :back-link="tt('Back')"></f7-nav-left>
<f7-nav-title :title="tt('Move All Transactions')"></f7-nav-title>
<f7-nav-right>
<f7-link :class="{ 'disabled': !fromAccount || !toAccountId || fromAccount?.id === toAccountId || !toAccountName || !isToAccountNameValid || moving }" :text="tt('Confirm')" @click="confirm"></f7-link>
</f7-nav-right>
</f7-navbar>
<f7-card
:title="tt('Are you sure you want to move all transactions?')"
:content="tt('format.misc.moveTransactionsInAccountTip', { fromAccount: fromAccount?.name, toAccount: displayToAccountName })">
</f7-card>
<f7-list strong inset dividers class="margin-vertical skeleton-text" v-if="loading">
<f7-list-item class="list-item-with-header-and-title list-item-no-item-after" header="Target Account" title="Unspecified"></f7-list-item>
<f7-list-item class="list-item-with-header-and-title list-item-no-item-after" header="Confirm Target Account Name" title="Unspecified"></f7-list-item>
</f7-list>
<f7-list form strong inset dividers class="margin-vertical" v-if="!loading">
<f7-list-item
class="list-item-with-header-and-title"
link="#" no-chevron
:class="{ 'disabled': moving || !allVisibleAccounts.length }"
:header="tt('Target Account')"
:title="Account.findAccountNameById(allAccounts, toAccountId, tt('Unspecified'))"
@click="showAccountSheet = true"
>
<two-column-list-item-selection-sheet primary-key-field="id" primary-value-field="category"
primary-title-field="name" primary-footer-field="displayBalance"
primary-icon-field="icon" primary-icon-type="account"
primary-sub-items-field="accounts"
:primary-title-i18n="true"
secondary-key-field="id" secondary-value-field="id"
secondary-title-field="name" secondary-footer-field="displayBalance"
secondary-icon-field="icon" secondary-icon-type="account" secondary-color-field="color"
:enable-filter="true" :filter-placeholder="tt('Find account')" :filter-no-items-text="tt('No available account')"
:items="allVisibleCategorizedAccounts"
v-model:show="showAccountSheet"
v-model="toAccountId">
</two-column-list-item-selection-sheet>
</f7-list-item>
<f7-list-input
type="text"
clear-button
:label="tt('Confirm Target Account Name')"
:placeholder="tt('Please re-enter the target account name to confirm')"
v-model:value="toAccountName"
></f7-list-input>
</f7-list>
</f7-page>
</template>
<script setup lang="ts">
import { ref} from 'vue';
import type { Router } from 'framework7/types';
import { useI18n } from '@/locales/helpers.ts';
import { useI18nUIComponents, showLoading, hideLoading } from '@/lib/ui/mobile.ts';
import { useMoveAllTransactionsPageBase } from '@/views/base/accounts/MoveAllTransactionsPageBase.ts'
import { useAccountsStore } from '@/stores/account.ts';
import { useTransactionsStore } from '@/stores/transaction.ts';
import { Account } from '@/models/account.ts';
const props = defineProps<{
f7route: Router.Route;
f7router: Router.Router;
}>();
const { tt } = useI18n();
const { showToast, routeBackOnError } = useI18nUIComponents();
const {
moving,
fromAccount,
toAccountId,
toAccountName,
allAccounts,
allVisibleAccounts,
allVisibleCategorizedAccounts,
displayToAccountName,
isToAccountNameValid
} = useMoveAllTransactionsPageBase();
const accountsStore = useAccountsStore();
const transactionsStore = useTransactionsStore();
const loading = ref<boolean>(true);
const loadingError = ref<unknown | null>(null);
const showAccountSheet = ref<boolean>(false);
function init(): void {
const query = props.f7route.query;
const fromAccountId = query['fromAccountId'];
if (!fromAccountId) {
showToast('Parameter Invalid');
loadingError.value = 'Parameter Invalid';
return;
}
accountsStore.loadAllAccounts({
force: false
}).then(() => {
loading.value = false;
const account = accountsStore.allAccountsMap[fromAccountId];
if (!account) {
showToast('Parameter Invalid');
loadingError.value = 'Parameter Invalid';
return;
}
fromAccount.value = account;
}).catch(error => {
if (error.processed) {
loading.value = false;
} else {
loadingError.value = error;
showToast(error.message || error);
}
});
}
function confirm(): void {
const router = props.f7router;
if (!fromAccount.value || !toAccountId.value || fromAccount.value?.id === toAccountId.value || !toAccountName.value || !isToAccountNameValid.value) {
return;
}
moving.value = true;
showLoading(() => moving.value);
transactionsStore.moveAllTransactionsBetweenAccounts({
fromAccountId: fromAccount.value.id,
toAccountId: toAccountId.value
}).then(() => {
moving.value = false;
hideLoading();
showToast('All transactions in this account has been moved.');
router.back();
}).catch(error => {
moving.value = false;
hideLoading();
if (!error.processed) {
showToast(error.message || error);
}
});
}
function onPageAfterIn(): void {
routeBackOnError(props.f7router, loadingError);
}
init();
</script>