support batch update tags for transactions

This commit is contained in:
MaysWind
2026-04-26 00:52:44 +08:00
parent bab7a0041b
commit 1e38d1b18b
29 changed files with 924 additions and 6 deletions
+3
View File
@@ -395,6 +395,9 @@ func startWebServer(c *core.CliContext) error {
apiV1Route.POST("/transactions/modify.json", bindApi(api.Transactions.TransactionModifyHandler))
apiV1Route.POST("/transactions/batch_update/category.json", bindApi(api.Transactions.TransactionBatchUpdateCategoriesHandler))
apiV1Route.POST("/transactions/batch_update/account.json", bindApi(api.Transactions.TransactionBatchUpdateAccountsHandler))
apiV1Route.POST("/transactions/batch_update/tag/add.json", bindApi(api.Transactions.TransactionBatchAddTagsHandler))
apiV1Route.POST("/transactions/batch_update/tag/remove.json", bindApi(api.Transactions.TransactionBatchRemoveTagsHandler))
apiV1Route.POST("/transactions/batch_update/tag/clear.json", bindApi(api.Transactions.TransactionBatchClearTagsHandler))
apiV1Route.POST("/transactions/move/all.json", bindApi(api.Transactions.TransactionMoveAllBetweenAccountsHandler))
apiV1Route.POST("/transactions/delete.json", bindApi(api.Transactions.TransactionDeleteHandler))
apiV1Route.POST("/transactions/batch_delete.json", bindApi(api.Transactions.TransactionBatchDeleteHandler))
+285
View File
@@ -1588,6 +1588,291 @@ func (a *TransactionsApi) TransactionBatchUpdateAccountsHandler(c *core.WebConte
return true, nil
}
// TransactionBatchAddTagsHandler batch add tags to transactions by request parameters for current user
func (a *TransactionsApi) TransactionBatchAddTagsHandler(c *core.WebContext) (any, *errs.Error) {
var transactionBatchUpdateReq models.TransactionBatchAddTagsRequest
err := c.ShouldBindJSON(&transactionBatchUpdateReq)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchAddTagsHandler] parse request failed, because %s", err.Error())
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
}
clientTimezone, err := c.GetClientTimezone()
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchAddTagsHandler] cannot get client timezone, because %s", err.Error())
return nil, errs.ErrClientTimezoneOffsetInvalid
}
transactionIds, err := utils.StringArrayToInt64Array(transactionBatchUpdateReq.TransactionIds)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchAddTagsHandler] parse transaction ids failed, because %s", err.Error())
return nil, errs.ErrTransactionIdInvalid
}
tagIds, err := utils.StringArrayToInt64Array(transactionBatchUpdateReq.TagIds)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchAddTagsHandler] parse tag ids failed, because %s", err.Error())
return nil, errs.ErrTransactionTagIdInvalid
}
tagIds = utils.ToUniqueInt64Slice(tagIds)
uid := c.GetCurrentUid()
user, err := a.users.GetUserById(c, uid)
if err != nil {
if !errs.IsCustomError(err) {
log.Errorf(c, "[transactions.TransactionBatchAddTagsHandler] failed to get user, because %s", err.Error())
}
return nil, errs.ErrUserNotFound
}
tags, err := a.transactionTags.GetTagsByTagIds(c, uid, tagIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchAddTagsHandler] failed to get tags for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
if len(tags) != len(tagIds) {
log.Warnf(c, "[transactions.TransactionBatchAddTagsHandler] some tags do not exist for user \"uid:%d\"", uid)
return nil, errs.ErrTransactionTagNotFound
}
transactions, err := a.transactions.GetTransactionsByTransactionIds(c, uid, transactionIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchAddTagsHandler] failed to get transactions for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
transactionTagIndexes, err := a.transactionTags.GetAllTagIdsOfTransactions(c, uid, transactionIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchAddTagsHandler] failed to get transactions tag indexes for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
allNewTransactionTagIndexes := make(map[int64][]int64, len(transactions))
for i := 0; i < len(transactions); i++ {
transaction := transactions[i]
if transaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_IN {
log.Warnf(c, "[transactions.TransactionBatchAddTagsHandler] cannot modify transaction \"id:%d\" for user \"uid:%d\", because transaction type is transfer in", transaction.TransactionId, uid)
return nil, errs.ErrTransactionTypeInvalid
}
transactionEditable := user.CanEditTransactionByTransactionTime(transaction.TransactionTime, clientTimezone)
if !transactionEditable {
log.Warnf(c, "[transactions.TransactionBatchAddTagsHandler] transaction \"id:%d\" is not editable for user \"uid:%d\"", transaction.TransactionId, uid)
return nil, errs.ErrCannotModifyTransactionWithThisTransactionTime
}
existedTagIds := transactionTagIndexes[transaction.TransactionId]
existedTagIdsMap := make(map[int64]bool, len(existedTagIds))
for j := 0; j < len(existedTagIds); j++ {
existedTagIdsMap[existedTagIds[j]] = true
}
var newTagIds []int64
for j := 0; j < len(tagIds); j++ {
tagId := tagIds[j]
if _, exists := existedTagIdsMap[tagId]; !exists {
newTagIds = append(newTagIds, tagId)
}
}
allNewTransactionTagIndexes[transaction.TransactionId] = newTagIds
}
err = a.transactions.BatchAddTagsToTransactions(c, uid, transactions, allNewTransactionTagIndexes)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchAddTagsHandler] failed to batch update transactions tags for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
log.Infof(c, "[transactions.TransactionBatchAddTagsHandler] user \"uid:%d\" has batch updated tag of %d transactions successfully", uid, len(allNewTransactionTagIndexes))
return true, nil
}
// TransactionBatchRemoveTagsHandler batch remove tags from transactions by request parameters for current user
func (a *TransactionsApi) TransactionBatchRemoveTagsHandler(c *core.WebContext) (any, *errs.Error) {
var transactionBatchUpdateReq models.TransactionBatchRemoveTagsRequest
err := c.ShouldBindJSON(&transactionBatchUpdateReq)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchRemoveTagsHandler] parse request failed, because %s", err.Error())
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
}
clientTimezone, err := c.GetClientTimezone()
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchRemoveTagsHandler] cannot get client timezone, because %s", err.Error())
return nil, errs.ErrClientTimezoneOffsetInvalid
}
transactionIds, err := utils.StringArrayToInt64Array(transactionBatchUpdateReq.TransactionIds)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchRemoveTagsHandler] parse transaction ids failed, because %s", err.Error())
return nil, errs.ErrTransactionIdInvalid
}
tagIds, err := utils.StringArrayToInt64Array(transactionBatchUpdateReq.TagIds)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchRemoveTagsHandler] parse tag ids failed, because %s", err.Error())
return nil, errs.ErrTransactionTagIdInvalid
}
tagIds = utils.ToUniqueInt64Slice(tagIds)
uid := c.GetCurrentUid()
user, err := a.users.GetUserById(c, uid)
if err != nil {
if !errs.IsCustomError(err) {
log.Errorf(c, "[transactions.TransactionBatchRemoveTagsHandler] failed to get user, because %s", err.Error())
}
return nil, errs.ErrUserNotFound
}
tags, err := a.transactionTags.GetTagsByTagIds(c, uid, tagIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchRemoveTagsHandler] failed to get tags for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
if len(tags) != len(tagIds) {
log.Warnf(c, "[transactions.TransactionBatchRemoveTagsHandler] some tags do not exist for user \"uid:%d\"", uid)
return nil, errs.ErrTransactionTagNotFound
}
transactions, err := a.transactions.GetTransactionsByTransactionIds(c, uid, transactionIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchRemoveTagsHandler] failed to get transactions for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
allTransactionIds := make([]int64, 0, len(transactions))
for i := 0; i < len(transactions); i++ {
transaction := transactions[i]
if transaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_IN {
log.Warnf(c, "[transactions.TransactionBatchRemoveTagsHandler] cannot modify transaction \"id:%d\" for user \"uid:%d\", because transaction type is transfer in", transaction.TransactionId, uid)
return nil, errs.ErrTransactionTypeInvalid
}
transactionEditable := user.CanEditTransactionByTransactionTime(transaction.TransactionTime, clientTimezone)
if !transactionEditable {
log.Warnf(c, "[transactions.TransactionBatchRemoveTagsHandler] transaction \"id:%d\" is not editable for user \"uid:%d\"", transaction.TransactionId, uid)
return nil, errs.ErrCannotModifyTransactionWithThisTransactionTime
}
allTransactionIds = append(allTransactionIds, transaction.TransactionId)
}
err = a.transactions.BatchRemoveTagsFromTransactions(c, uid, allTransactionIds, tagIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchRemoveTagsHandler] failed to batch update transactions tags for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
log.Infof(c, "[transactions.TransactionBatchRemoveTagsHandler] user \"uid:%d\" has batch updated tag of %d transactions successfully", uid, len(allTransactionIds))
return true, nil
}
// TransactionBatchClearTagsHandler batch clear all tags from transactions by request parameters for current user
func (a *TransactionsApi) TransactionBatchClearTagsHandler(c *core.WebContext) (any, *errs.Error) {
var transactionBatchUpdateReq models.TransactionBatchClearTagsRequest
err := c.ShouldBindJSON(&transactionBatchUpdateReq)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchClearTagsHandler] parse request failed, because %s", err.Error())
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
}
clientTimezone, err := c.GetClientTimezone()
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchClearTagsHandler] cannot get client timezone, because %s", err.Error())
return nil, errs.ErrClientTimezoneOffsetInvalid
}
transactionIds, err := utils.StringArrayToInt64Array(transactionBatchUpdateReq.TransactionIds)
if err != nil {
log.Warnf(c, "[transactions.TransactionBatchClearTagsHandler] parse transaction ids failed, because %s", err.Error())
return nil, errs.ErrTransactionIdInvalid
}
uid := c.GetCurrentUid()
user, err := a.users.GetUserById(c, uid)
if err != nil {
if !errs.IsCustomError(err) {
log.Errorf(c, "[transactions.TransactionBatchClearTagsHandler] failed to get user, because %s", err.Error())
}
return nil, errs.ErrUserNotFound
}
transactions, err := a.transactions.GetTransactionsByTransactionIds(c, uid, transactionIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchClearTagsHandler] failed to get transactions for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
allTransactionIds := make([]int64, 0, len(transactions))
for i := 0; i < len(transactions); i++ {
transaction := transactions[i]
if transaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_IN {
log.Warnf(c, "[transactions.TransactionBatchClearTagsHandler] cannot modify transaction \"id:%d\" for user \"uid:%d\", because transaction type is transfer in", transaction.TransactionId, uid)
return nil, errs.ErrTransactionTypeInvalid
}
transactionEditable := user.CanEditTransactionByTransactionTime(transaction.TransactionTime, clientTimezone)
if !transactionEditable {
log.Warnf(c, "[transactions.TransactionBatchClearTagsHandler] transaction \"id:%d\" is not editable for user \"uid:%d\"", transaction.TransactionId, uid)
return nil, errs.ErrCannotModifyTransactionWithThisTransactionTime
}
allTransactionIds = append(allTransactionIds, transaction.TransactionId)
}
err = a.transactions.BatchClearAllTagsFromTransactions(c, uid, allTransactionIds)
if err != nil {
log.Errorf(c, "[transactions.TransactionBatchClearTagsHandler] failed to batch update transactions tags for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
log.Infof(c, "[transactions.TransactionBatchClearTagsHandler] user \"uid:%d\" has batch updated tag of %d transactions successfully", uid, len(allTransactionIds))
return true, nil
}
// TransactionMoveAllBetweenAccountsHandler moves all transactions from one account to another account for current user
func (a *TransactionsApi) TransactionMoveAllBetweenAccountsHandler(c *core.WebContext) (any, *errs.Error) {
var transactionMoveReq models.TransactionMoveBetweenAccountsRequest
+1
View File
@@ -45,4 +45,5 @@ var (
ErrCannotMoveTransactionFromOrToHiddenAccount = NewNormalError(NormalSubcategoryTransaction, 38, http.StatusBadRequest, "cannot move transaction from or to hidden account")
ErrCannotMoveTransactionFromOrToParentAccount = NewNormalError(NormalSubcategoryTransaction, 39, http.StatusBadRequest, "cannot move transaction from or to parent account")
ErrCannotMoveTransactionBetweenAccountsWithDifferentCurrencies = NewNormalError(NormalSubcategoryTransaction, 40, http.StatusBadRequest, "cannot move transaction between accounts with different currencies")
ErrCannotAddTagsToTooManyTransactionsOneTime = NewNormalError(NormalSubcategoryTransaction, 41, http.StatusBadRequest, "cannot add tags to too many transactions one time")
)
+19 -2
View File
@@ -327,17 +327,34 @@ type TransactionGetRequest struct {
// TransactionBatchUpdateCategoryRequest represents all parameters of transaction batch update category request
type TransactionBatchUpdateCategoryRequest struct {
TransactionIds []string `json:"transactionIds,string" binding:"required"`
TransactionIds []string `json:"transactionIds" binding:"required"`
CategoryId int64 `json:"categoryId,string" binding:"required"`
}
// TransactionBatchUpdateAccountRequest represents all parameters of transaction batch update account request
type TransactionBatchUpdateAccountRequest struct {
TransactionIds []string `json:"transactionIds,string" binding:"required"`
TransactionIds []string `json:"transactionIds" binding:"required"`
AccountId int64 `json:"accountId,string" binding:"required"`
IsDestinationAccount bool `json:"isDestinationAccount"`
}
// TransactionBatchAddTagsRequest represents all parameters of transaction batch add tags request
type TransactionBatchAddTagsRequest struct {
TransactionIds []string `json:"transactionIds" binding:"required"`
TagIds []string `json:"tagIds" binding:"required"`
}
// TransactionBatchRemoveTagsRequest represents all parameters of transaction batch remove tags request
type TransactionBatchRemoveTagsRequest struct {
TransactionIds []string `json:"transactionIds" binding:"required"`
TagIds []string `json:"tagIds" binding:"required"`
}
// TransactionBatchClearTagsRequest represents all parameters of transaction batch clear tags request
type TransactionBatchClearTagsRequest struct {
TransactionIds []string `json:"transactionIds" binding:"required"`
}
// TransactionMoveBetweenAccountsRequest represents all parameters of moving all transactions between accounts request
type TransactionMoveBetweenAccountsRequest struct {
FromAccountId int64 `json:"fromAccountId,string" binding:"required,min=1"`
+158 -4
View File
@@ -1033,7 +1033,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
}
// Get and verify tags
err = s.isTagsValid(sess, transaction, transactionTagIndexes, addTagIds)
err = s.isTagsValid(sess, transaction.Uid, transactionTagIndexes, addTagIds)
if err != nil {
return err
@@ -1373,6 +1373,160 @@ func (s *TransactionService) BatchUpdateTransactionsCategory(c core.Context, uid
})
}
// BatchAddTagsToTransactions batch adds tags to transactions
func (s *TransactionService) BatchAddTagsToTransactions(c core.Context, uid int64, transactions []*models.Transaction, addTransactionTagIds map[int64][]int64) error {
if uid <= 0 {
return errs.ErrUserIdInvalid
}
if len(addTransactionTagIds) < 1 {
return errs.ErrTransactionIdInvalid
}
now := time.Now().Unix()
transactionTagIndexes := make([]*models.TransactionTagIndex, 0, len(addTransactionTagIds))
transactionsMap := make(map[int64]*models.Transaction, len(transactions))
transactionTagIdsMap := make(map[int64]bool, 0)
for i := 0; i < len(transactions); i++ {
transaction := transactions[i]
transactionsMap[transaction.TransactionId] = transaction
}
for transactionId, tagIds := range addTransactionTagIds {
if transactionId <= 0 {
return errs.ErrTransactionIdInvalid
}
transaction, exists := transactionsMap[transactionId]
if !exists || transaction == nil {
return errs.ErrTransactionNotFound
}
tagIds = utils.ToUniqueInt64Slice(tagIds)
for i := 0; i < len(tagIds); i++ {
tagId := tagIds[i]
if tagId <= 0 {
return errs.ErrTransactionTagIdInvalid
}
transactionTagIndexes = append(transactionTagIndexes, &models.TransactionTagIndex{
Uid: uid,
Deleted: false,
TransactionTime: transaction.TransactionTime,
TagId: tagId,
TransactionId: transactionId,
CreatedUnixTime: now,
UpdatedUnixTime: now,
})
transactionTagIdsMap[tagId] = true
}
}
tagIndexUuids := s.GenerateUuids(uuid.UUID_TYPE_TAG_INDEX, uint16(len(transactionTagIndexes)))
if len(tagIndexUuids) < len(transactionTagIndexes) {
return errs.ErrCannotAddTagsToTooManyTransactionsOneTime
}
for i := 0; i < len(transactionTagIndexes); i++ {
transactionTagIndexes[i].TagIndexId = tagIndexUuids[i]
}
tagIds := make([]int64, 0, len(transactionTagIdsMap))
for tagId := range transactionTagIdsMap {
tagIds = append(tagIds, tagId)
}
return s.UserDataDB(uid).DoTransaction(c, func(sess *xorm.Session) error {
// Get and verify tags
err := s.isTagsValid(sess, uid, transactionTagIndexes, tagIds)
if err != nil {
return err
}
for i := 0; i < len(transactionTagIndexes); i++ {
transactionTagIndex := transactionTagIndexes[i]
_, err := sess.Insert(transactionTagIndex)
if err != nil {
return err
}
}
return nil
})
}
// BatchRemoveTagsFromTransactions batch removes tags from transactions
func (s *TransactionService) BatchRemoveTagsFromTransactions(c core.Context, uid int64, transactionIds []int64, tagIds []int64) error {
if uid <= 0 {
return errs.ErrUserIdInvalid
}
if len(transactionIds) < 1 {
return errs.ErrTransactionIdInvalid
}
uniqueTransactionIds := utils.ToUniqueInt64Slice(transactionIds)
uniqueTagIds := utils.ToUniqueInt64Slice(tagIds)
now := time.Now().Unix()
tagIndexUpdateModel := &models.TransactionTagIndex{
Deleted: true,
DeletedUnixTime: now,
}
return s.UserDataDB(uid).DoTransaction(c, func(sess *xorm.Session) error {
deletedRows, err := sess.Cols("deleted", "deleted_unix_time").Where("uid=? AND deleted=?", uid, false).In("transaction_id", uniqueTransactionIds).In("tag_id", uniqueTagIds).Update(tagIndexUpdateModel)
if err != nil {
return err
} else if deletedRows < 1 {
return errs.ErrTransactionTagNotFound
}
return nil
})
}
// BatchClearAllTagsFromTransactions batch clears all tags from transactions
func (s *TransactionService) BatchClearAllTagsFromTransactions(c core.Context, uid int64, transactionIds []int64) error {
if uid <= 0 {
return errs.ErrUserIdInvalid
}
if len(transactionIds) < 1 {
return errs.ErrTransactionIdInvalid
}
uniqueTransactionIds := utils.ToUniqueInt64Slice(transactionIds)
now := time.Now().Unix()
tagIndexUpdateModel := &models.TransactionTagIndex{
Deleted: true,
DeletedUnixTime: now,
}
return s.UserDataDB(uid).DoTransaction(c, func(sess *xorm.Session) error {
deletedRows, err := sess.Cols("deleted", "deleted_unix_time").Where("uid=? AND deleted=?", uid, false).In("transaction_id", uniqueTransactionIds).Update(tagIndexUpdateModel)
if err != nil {
return err
} else if deletedRows < 1 {
return errs.ErrTransactionTagNotFound
}
return nil
})
}
// MoveAllTransactionsBetweenAccounts moves all transactions from one account to another account, and combine balance modification transactions if necessary
func (s *TransactionService) MoveAllTransactionsBetweenAccounts(c core.Context, uid int64, fromAccountId int64, toAccountId int64) error {
if uid <= 0 {
@@ -2317,7 +2471,7 @@ func (s *TransactionService) doCreateTransaction(c core.Context, database *datas
}
// Get and verify tags
err = s.isTagsValid(sess, transaction, transactionTagIndexes, tagIds)
err = s.isTagsValid(sess, transaction.Uid, transactionTagIndexes, tagIds)
if err != nil {
return err
@@ -2954,10 +3108,10 @@ func (s *TransactionService) isCategoryValid(sess *xorm.Session, transaction *mo
return nil
}
func (s *TransactionService) isTagsValid(sess *xorm.Session, transaction *models.Transaction, transactionTagIndexes []*models.TransactionTagIndex, tagIds []int64) error {
func (s *TransactionService) isTagsValid(sess *xorm.Session, uid int64, transactionTagIndexes []*models.TransactionTagIndex, tagIds []int64) error {
if len(transactionTagIndexes) > 0 {
var tags []*models.TransactionTag
err := sess.Where("uid=? AND deleted=?", transaction.Uid, false).In("tag_id", tagIds).Find(&tags)
err := sess.Where("uid=? AND deleted=?", uid, false).In("tag_id", tagIds).Find(&tags)
if err != nil {
return err
+18
View File
@@ -67,6 +67,9 @@ import type {
TransactionModifyRequest,
TransactionBatchUpdateCategoryRequest,
TransactionBatchUpdateAccountRequest,
TransactionBatchAddTagsRequest,
TransactionBatchRemoveTagsRequest,
TransactionBatchClearTagsRequest,
TransactionMoveBetweenAccountsRequest,
TransactionDeleteRequest,
TransactionBatchDeleteRequest,
@@ -625,6 +628,21 @@ export default {
timeout: DEFAULT_BATCH_UPDATE_TRANSACTIONS_API_TIMEOUT
} as ApiRequestConfig);
},
batchAddTagsToTransaction: (req: TransactionBatchAddTagsRequest): ApiResponsePromise<boolean> => {
return axios.post<ApiResponse<boolean>>('v1/transactions/batch_update/tag/add.json', req, {
timeout: DEFAULT_BATCH_UPDATE_TRANSACTIONS_API_TIMEOUT
} as ApiRequestConfig);
},
batchRemoveTagsFromTransaction: (req: TransactionBatchRemoveTagsRequest): ApiResponsePromise<boolean> => {
return axios.post<ApiResponse<boolean>>('v1/transactions/batch_update/tag/remove.json', req, {
timeout: DEFAULT_BATCH_UPDATE_TRANSACTIONS_API_TIMEOUT
} as ApiRequestConfig);
},
batchClearAllTagsFromTransaction: (req: TransactionBatchClearTagsRequest): ApiResponsePromise<boolean> => {
return axios.post<ApiResponse<boolean>>('v1/transactions/batch_update/tag/clear.json', req, {
timeout: DEFAULT_BATCH_UPDATE_TRANSACTIONS_API_TIMEOUT
} as ApiRequestConfig);
},
moveAllTransactionsBetweenAccounts: (req: TransactionMoveBetweenAccountsRequest): ApiResponsePromise<boolean> => {
return axios.post<ApiResponse<boolean>>('v1/transactions/move/all.json', req);
},
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "Diese Aktion kann NICHT rückgängig gemacht werden. Alle Transaktionen werden von {fromAccount} nach {toAccount} verschoben.",
"clearTransactionsInAccountTip": "Diese Aktion kann NICHT rückgängig gemacht werden. Ihre Transaktionsdaten in {account} werden gelöscht. Bitte geben Sie Ihr aktuelles Passwort zur Bestätigung ein.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"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.",
"oauth2bindTip": "Sie melden sich beim Benutzer {userName} mit {providerName} an. Bitte geben Sie Ihr ezBookkeeping-Passwort zur Bestätigung ein."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "Transaktion kann nicht von oder zu einem versteckten Konto verschoben werden",
"cannot move transaction from or to parent account": "Transaktion kann nicht von oder zu einem übergeordneten Konto verschoben werden",
"cannot move transaction between accounts with different currencies": "Transaktion kann nicht zwischen Konten mit unterschiedlichen Währungen verschoben werden",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Kontoliste",
+6
View File
@@ -141,6 +141,7 @@
"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.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"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}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Account List",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "NO PUEDES deshacer esta acción. Se moverán todas las transacciones de {fromAccount} a {toAccount}.",
"clearTransactionsInAccountTip": "NO PUEDES deshacer esta acción. Se eliminarán todas las transacciones de {account}. Por favor introduce tu contraseña para confirmar.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "El enlace de activación de la cuenta se envió a tu dirección de correo electrónico: {email}. Si no recibes el correo, introduce nuevamente la contraseña y haz clic en el botón de abajo para reenviar el correo de validación.",
"resendValidationEmailTip": "Si no recibes el correo, introduce nuevamente la contraseña y haz clic en el botón de abajo para reenviar el correo de validación a: {email}",
"oauth2bindTip": "Estás iniciando sesión con el usuario {userName} usando {providerName}. Porfavor introduce tu contraseña de ezBookkeeping para verificar."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "No se puede mover la transacción desde o hacia una cuenta oculta",
"cannot move transaction from or to parent account": "No se puede mover la transacción desde o hacia la cuenta principal",
"cannot move transaction between accounts with different currencies": "No se pueden mover transacciones entre cuentas con diferentes monedas",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Lista de Cuentas",
+6
View File
@@ -141,6 +141,7 @@
"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.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"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}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Liste des comptes",
+6
View File
@@ -141,6 +141,7 @@
"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.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"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}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Elenco account",
+6
View File
@@ -141,6 +141,7 @@
"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.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "アカウントの有効化リンクがメールアドレスに送信されました:{email}、メールが届かない場合はパスワードをもう一度入力して下のボタンをクリックして認証メールを再送信してください。",
"resendValidationEmailTip": "メールが届かない場合は、パスワードをもう一度入力の上、以下のボタンをクリックして検証メールを再送信してください: {email}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "取引カテゴリIDは無効です",
"transaction category not found": "取引カテゴリは見つかりません",
"transaction category type is invalid": "取引カテゴリタイプは無効です",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "口座リスト",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "ಈ ಕ್ರಿಯೆಯನ್ನು ಹಿಂದಕ್ಕೆ ತರಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದು {fromAccount} ನ ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು {toAccount} ಗೆ ಸ್ಥಳಾಂತರಿಸುತ್ತದೆ.",
"clearTransactionsInAccountTip": "ಈ ಕ್ರಿಯೆಯನ್ನು ಹಿಂದಕ್ಕೆ ತರಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದು {account} ನಲ್ಲಿ ನಿಮ್ಮ ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ಅಳಿಸುತ್ತದೆ. ದೃಢೀಕರಿಸಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "ಖಾತೆ ಸಕ್ರಿಯಗೊಳಿಸುವ ಲಿಂಕ್ ಅನ್ನು ನಿಮ್ಮ ಈಮೇಲ್‌ಗೆ ಕಳುಹಿಸಲಾಗಿದೆ: {email}. ನೀವು ಇಮೇಲ್ ಪಡೆಯದಿದ್ದರೆ, ದಯವಿಟ್ಟು ಪಾಸ್‌ವರ್ಡ್ ಮರು ನಮೂದಿಸಿ ಮತ್ತು ಕೆಳಗಿನ ಬಟನ್ ಒತ್ತಿ ಸರೀಕರಿಸುವ ಇಮೇಲ್ ಮರು ಕಳುಹಿಸಿ.",
"resendValidationEmailTip": "ನೀವು ಇಮೇಲ್ ಪಡೆಯದಿದ್ದರೆ, ದಯವಿಟ್ಟು ಪಾಸ್‌ವರ್ಡ್ ಮರು ನಮೂದಿಸಿ ಮತ್ತು ಕೆಳಗಿನ ಬಟನ್ ಒತ್ತಿ ಮರು ಸರೀಕರಿಸುವ ಇಮೇಲ್ ಕಳುಹಿಸಲಾಗುವುದು: {email}",
"oauth2bindTip": "ನೀವು {providerName} ಬಳಸಿ {userName} ಬಳಕೆದಾರರಾಗಿ ಲಾಗಿನ್ ಆಗುತ್ತಿದ್ದೀರಿ. ದೃಢೀಕರಿಸಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ ezBookkeeping ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "ಗೋಚರಿಸದ ಖಾತೆಯಿಂದ/ಖಾತೆಗೆ ವಹಿವಾಟು ಸ್ಥಳಾಂತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
"cannot move transaction from or to parent account": "ಪೋಷಕ ಖಾತೆಯಿಂದ ಅಥವಾ ಖಾತೆಗೆ ವಹಿವಾಟು ಸ್ಥಳಾಂತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
"cannot move transaction between accounts with different currencies": "ವಿವಿಧ ಕರೆನ್ಸಿಗಳ ಖಾತೆಗಳ ನಡುವೆ ವಹಿವಾಟು ಸ್ಥಳಾಂತರ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "ವಹಿವಾಟು ವರ್ಗ ID ಅಮಾನ್ಯವಾಗಿದೆ",
"transaction category not found": "ವಹಿವಾಟು ವರ್ಗ ಸಿಕ್ಕಿಲ್ಲ",
"transaction category type is invalid": "ವಹಿವಾಟು ವರ್ಗದ ಪ್ರಕಾರ ಅಮಾನ್ಯವಾಗಿದೆ",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "ಖಾತೆಗಳ ಪಟ್ಟಿ",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "이 작업은 되돌릴 수 없습니다. {fromAccount}에서 {toAccount}로 모든 거래를 이동합니다.",
"clearTransactionsInAccountTip": "이 작업은 되돌릴 수 없습니다. {account}의 거래 데이터를 지웁니다. 계속하시려면 현재 비밀번호를 입력하세요.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "계정 활성화 링크가 귀하의 이메일 주소({email})로 전송되었습니다. 메일을 받지 못하신 경우, 비밀번호를 다시 입력하고 아래 버튼을 클릭하여 확인 메일을 재전송하십시오.",
"resendValidationEmailTip": "메일을 받지 못하신 경우, 비밀번호를 다시 입력하고 아래 버튼을 클릭하여 확인 메일을 {email}로 재전송하십시오.",
"oauth2bindTip": "{providerName}를 사용하여 {userName} 사용자로 로그인하고 있습니다. 확인을 위해 ezBookkeeping 비밀번호를 입력하세요."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "숨겨진 계좌에서 또는 숨겨진 계좌로 거래를 이동할 수 없습니다.",
"cannot move transaction from or to parent account": "상위 계좌에서 또는 상위 계좌로 거래를 이동할 수 없습니다.",
"cannot move transaction between accounts with different currencies": "다른 통화를 사용하는 계좌 간에 거래를 이동할 수 없습니다.",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "거래 카테고리 ID가 유효하지 않습니다.",
"transaction category not found": "거래 카테고리를 찾을 수 없습니다.",
"transaction category type is invalid": "거래 카테고리 유형이 유효하지 않습니다.",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "계좌 목록",
+6
View File
@@ -141,6 +141,7 @@
"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.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"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}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Rekeningenlijst",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "Você NÃO PODE desfazer esta ação. Isso moverá todas as transações de {fromAccount} para {toAccount}.",
"clearTransactionsInAccountTip": "Você NÃO PODE desfazer esta ação. Isso apagará todas as transações em {account}. Por favor, insira sua senha atual para confirmar.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"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, insira 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, insira a senha novamente e clique no botão abaixo para reenviar o e-mail de validação para: {email}",
"oauth2bindTip": "Você está fazendo login como {userName} usando {providerName}. Por favor, insira sua senha do ezBookkeeping para verificar."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "Não é possível mover transação de ou para conta oculta",
"cannot move transaction from or to parent account": "Não é possível mover transação de ou para conta principal",
"cannot move transaction between accounts with different currencies": "Não é possível mover transação entre contas com moedas diferentes",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Lista de Contas",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "Вы НЕ сможете отменить это действие. Все транзакции будут перемещены с {fromAccount} на {toAccount}.",
"clearTransactionsInAccountTip": "Вы НЕ сможете отменить это действие. Все транзакции будут отчищеы с {account}. Пожалуйста введите пароль.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "Ссылка для активации учетной записи была отправлена на ваш электронный адрес: {email}. Если вы не получили письмо, заполните пароль снова и нажмите кнопку ниже, чтобы отправить письмо повторно.",
"resendValidationEmailTip": "Если вы не получили письмо, заполните пароль снова и нажмите кнопку ниже, чтобы отправить письмо повторно на: {email}",
"oauth2bindTip": "Вы входите как пользователь {userName} используя {providerName}. Пожалуйста введите ваш ezBookkeeping пароль для подтверждения."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "Нельзя переместить транзакцию из/в скрытый счёт",
"cannot move transaction from or to parent account": "Нельзя переместить транзакцию из/в родительский счёт",
"cannot move transaction between accounts with different currencies": "Нельзя переместить транзакцию между счетами с разными валютами",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "ID категории транзакции недействителен",
"transaction category not found": "Категория транзакции не найдена",
"transaction category type is invalid": "Тип категории транзакции недействителен",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Список счетов",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "Tega dejanja NE MORETE razveljaviti. S tem boste vse transakcije premaknili iz računa {fromAccount} v račun {toAccount}.",
"clearTransactionsInAccountTip": "Tega dejanja NE MORETE razveljaviti. S tem boste izbrisali podatke o transakcijah v računu {account}. Za potrditev vnesite trenutno geslo.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "Povezava za aktivacijo računa je bila poslana na vaš e-poštni naslov: {email}. Če e-pošte ne prejmete, ponovno vnesite geslo in kliknite spodnji gumb, da ponovno pošljete potrditveno e-pošto.",
"resendValidationEmailTip": "Če ne prejmete e-pošte, ponovno vnesite geslo in kliknite spodnji gumb, da ponovno pošljete potrditveno e-pošto na: {email}",
"oauth2bindTip": "Prijavljate se v uporabniški račun {userName} z uporabo računa {providerName}. Za potrditev vnesite svoje geslo za ezBookkeeping."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "Transakcije ni mogoče premakniti iz ali v skrit račun",
"cannot move transaction from or to parent account": "Transakcije ni mogoče premakniti iz ali v nadrejeni račun",
"cannot move transaction between accounts with different currencies": "Transakcij ni mogoče premikati med računi z različnimi valutami",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "ID kategorije transakcije ni veljaven",
"transaction category not found": "Kategorije transakcije ni mogoče najti",
"transaction category type is invalid": "Vrsta kategorije transakcije ni veljavna",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Seznam računov",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "இந்த செயலை மீட்டெடுக்க முடியாது. இது {fromAccount} இலிருந்து அனைத்து பரிவர்த்தனைகளையும் {toAccount} க்கு மாற்றும்.",
"clearTransactionsInAccountTip": "இந்த செயலை மீட்டெடுக்க முடியாது. இது {account} இல் உள்ள உங்கள் அனைத்து பரிவர்த்தனைகளையும் நீக்கும். உறுதிப்படுத்த உங்கள் தற்போதைய கடவுச்சொல்லை உள்ளிடவும்.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "கணக்கு செயல்படுத்தும் இணைப்பு உங்கள் மின்னஞ்சலுக்கு அனுப்பப்பட்டது: {email}. நீங்கள் மின்னஞ்சலைப் பெறவில்லை என்றால், கடவுச்சொல்லை மீண்டும் உள்ளிட்டு கீழே உள்ள பொத்தானை அழுத்தி சரிபார்ப்பு மின்னஞ்சலை மீண்டும் அனுப்பவும்.",
"resendValidationEmailTip": "நீங்கள் மின்னஞ்சலைப் பெறவில்லை என்றால், கடவுச்சொல்லை மீண்டும் உள்ளிட்டு கீழே உள்ள பொத்தானை அழுத்தவும், சரிபார்ப்பு மின்னஞ்சல் அனுப்பப்படும்: {email}",
"oauth2bindTip": "நீங்கள் {providerName} பயன்படுத்தி {userName} பயனராக உள்நுழைகிறீர்கள். உறுதிப்படுத்த உங்கள் ezBookkeeping கடவுச்சொல்லை உள்ளிடவும்."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "மறைந்த கணக்கிலிருந்து/கணக்கிற்கு பரிவர்த்தனை நகர்த்த முடியாது",
"cannot move transaction from or to parent account": "பெற்றோர் கணக்கிலிருந்து அல்லது கணக்கிற்கு பரிவர்த்தனை நகர்த்த முடியாது",
"cannot move transaction between accounts with different currencies": "பல்வேறு நாணயம்களின் கணக்குகளின் இடையே பரிவர்த்தனை இடம்மாற்றம் செய்ய முடியாது",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "பரிவர்த்தனை வகை ID தவறானது உள்ளது",
"transaction category not found": "பரிவர்த்தனை வகை கிடைக்கவில்லை",
"transaction category type is invalid": "பரிவர்த்தனை வகையின் வகை தவறானது உள்ளது",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "கணக்குகளின் பட்டியல்",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"clearTransactionsInAccountTip": "คุณไม่สามารถยกเลิกการกระทำนี้ได้ การกระทำนี้จะลบข้อมูลธุรกรรมทั้งหมดใน {account} โปรดป้อนรหัสผ่านปัจจุบันเพื่อยืนยัน",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "ลิงก์สำหรับเปิดใช้งานบัญชีได้ถูกส่งไปยังอีเมลของคุณแล้ว: {email} หากคุณไม่ได้รับอีเมล โปรดกรอกรหัสผ่านอีกครั้งแล้วกดปุ่มด้านล่างเพื่อส่งอีเมลยืนยันอีกครั้ง",
"resendValidationEmailTip": "หากคุณไม่ได้รับอีเมล โปรดกรอกรหัสผ่านอีกครั้งแล้วกดปุ่มด้านล่างเพื่อส่งอีเมลยืนยันไปยัง: {email}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "รหัสหมวดหมู่ธุรกรรมไม่ถูกต้อง",
"transaction category not found": "ไม่พบหมวดหมู่ธุรกรรม",
"transaction category type is invalid": "ประเภทหมวดหมู่ธุรกรรมไม่ถูกต้อง",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "รายการบัญชี",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "Bu işlem GERİ ALINAMAZ. Bu, {fromAccount} hesabındaki tüm işlemleri {toAccount} hesabına taşıyacaktır.",
"clearTransactionsInAccountTip": "Bu işlem GERİ ALINAMAZ. Bu, {account} hesabındaki işlem verilerinizi silecektir. Onaylamak için lütfen mevcut şifrenizi girin.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "Hesap aktivasyon bağlantısı e-posta adresinize ({email}) gönderildi. Eğer e-postayı almadıysanız, lütfen şifrenizi tekrar girin ve doğrulama postasını yeniden göndermek için aşağıdaki butona tıklayın.",
"resendValidationEmailTip": "Eğer e-postayı almadıysanız, lütfen şifrenizi tekrar girin ve doğrulama postasını şu adrese yeniden göndermek için aşağıdaki butona tıklayın: {email}",
"oauth2bindTip": "{providerName} kullanarak {userName} hesabına giriş yapıyorsunuz. Doğrulamak için lütfen ezBookkeeping şifrenizi girin."
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "Gizli hesaptan veya gizli hesaba işlem taşınamaz",
"cannot move transaction from or to parent account": "Ana hesaptan veya ana hesaba işlem taşınamaz",
"cannot move transaction between accounts with different currencies": "Farklı para birimlerine sahip hesaplar arasında işlem taşınamaz",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "İşlem kategori ID geçersiz",
"transaction category not found": "İşlem kategorisi bulunamadı",
"transaction category type is invalid": "İşlem kategori türü geçersiz",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Hesap Listesi",
+6
View File
@@ -141,6 +141,7 @@
"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.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"accountActivationAndResendValidationEmailTip": "Посилання для активації облікового запису було надіслано на вашу електронну адресу: {email}. Якщо ви не отримали лист, введіть пароль ще раз і натисніть кнопку нижче, щоб надіслати лист повторно.",
"resendValidationEmailTip": "Якщо ви не отримали лист, введіть пароль ще раз і натисніть кнопку нижче, щоб надіслати лист повторно на адресу: {email}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"transaction category id is invalid": "ID категорії транзакції недійсний",
"transaction category not found": "Категорію транзакції не знайдено",
"transaction category type is invalid": "Тип категорії транзакції недійсний",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Список рахунків",
+6
View File
@@ -141,6 +141,7 @@
"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.",
"deleteTransactionsTip": "You CANNOT undo this action. This will delete {count} transactions. Please enter your current password to confirm.",
"clearTransactionsTagsTip": "You CANNOT undo this action. This will clear all tags from {count} transactions.",
"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}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
@@ -1195,6 +1196,7 @@
"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",
"cannot add tags to too many transactions one time": "You cannot add tags to too many transactions one time",
"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ệ",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "Update Accounts for Transactions",
"Update Destination Accounts for Transactions": "Update Destination Accounts for Transactions",
"Unable to update accounts for transactions": "Unable to update accounts for transactions",
"Add Tags to Transactions": "Add Tags to Transactions",
"Remove Tags from Transactions": "Remove Tags from Transactions",
"Clear All Tags from Transactions": "Clear All Tags from Transactions",
"Unable to update tags for transactions": "Unable to update tags for transactions",
"Delete Transactions": "Delete Transactions",
"Unable to delete these transactions": "Unable to delete these transactions",
"Account List": "Danh sách tài khoản",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "您不能撤销该操作。该操作将会把 {fromAccount} 账户中所有的交易数据移动到 {toAccount}。",
"clearTransactionsInAccountTip": "您不能撤销该操作。该操作将会清除您在 {account} 账户中的交易数据。请输入您当前的密码以确认。",
"deleteTransactionsTip": "您不能撤销该操作。该操作将会删除 {count} 个交易数据。请输入您当前的密码以确认。",
"clearTransactionsTagsTip": "您不能撤销该操作。该操作将会清除 {count} 个交易中的全部标签。",
"accountActivationAndResendValidationEmailTip": "账号激活链接已经发送到您的邮箱地址:{email},如果您没有收到邮件,请再次输入密码并点击下方的按钮重新发送验证邮件。",
"resendValidationEmailTip": "如果您没有收到邮件,请再次输入密码并点击下方的按钮重新发送验证邮件到:{email}",
"oauth2bindTip": "您正在使用 {providerName} 登录 \"{userName}\" 用户,请输入你的 ezBookkeeping 的密码进行验证。"
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "不能从隐藏账户移动交易或移动交易到隐藏账户",
"cannot move transaction from or to parent account": "不能从父账户移动交易或移动交易到父账户",
"cannot move transaction between accounts with different currencies": "不能在不同货币的账户之间移动交易",
"cannot add tags to too many transactions one time": "一次不能将标签添加到太多交易",
"transaction category id is invalid": "交易分类ID无效",
"transaction category not found": "交易分类不存在",
"transaction category type is invalid": "交易分类类型无效",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "更新交易的账户",
"Update Destination Accounts for Transactions": "更新交易的目标账户",
"Unable to update accounts for transactions": "无法更新交易的账户",
"Add Tags to Transactions": "为交易添加标签",
"Remove Tags from Transactions": "从交易移除标签",
"Clear All Tags from Transactions": "从交易清除所有标签",
"Unable to update tags for transactions": "无法更新交易的标签",
"Delete Transactions": "删除交易",
"Unable to delete these transactions": "无法删除这些交易",
"Account List": "账户列表",
+6
View File
@@ -141,6 +141,7 @@
"moveTransactionsInAccountTip": "您不能還原此操作。此操作將會把 {fromAccount} 帳戶中的所有交易資料移動到 {toAccount}。",
"clearTransactionsInAccountTip": "您不能還原此操作。此操作將會清除您在 {account} 帳戶中的交易資料。請輸入您目前的密碼以確認。",
"deleteTransactionsTip": "您不能還原此操作。此操作將會刪除 {count} 個交易資料。請輸入您目前的密碼以確認。",
"clearTransactionsTagsTip": "您不能還原此操作。此操作將會清除 {count} 個交易中的全部標籤。",
"accountActivationAndResendValidationEmailTip": "帳號啟用連結已經傳送到您的信箱地址:{email},如果您沒有收到郵件,請再次輸入密碼並點擊下方的按鈕重新發送驗證郵件。",
"resendValidationEmailTip": "如果您沒有收到郵件,請再次輸入密碼並點擊下方的按鈕重新發送驗證郵件到:{email}",
"oauth2bindTip": "您正在使用 {providerName} 登入 \"{userName}\" 使用者,請輸入您的 ezBookkeeping 的密碼以進行驗證。"
@@ -1195,6 +1196,7 @@
"cannot move transaction from or to hidden account": "不能從隱藏帳戶移動交易或移動交易到隱藏帳戶",
"cannot move transaction from or to parent account": "不能從父帳戶移動交易或移動交易到父帳戶",
"cannot move transaction between accounts with different currencies": "不能在不同幣別的帳戶之間移動交易",
"cannot add tags to too many transactions one time": "一次不能將標籤添加到太多交易",
"transaction category id is invalid": "交易分類ID無效",
"transaction category not found": "交易分類不存在",
"transaction category type is invalid": "交易分類類型無效",
@@ -1856,6 +1858,10 @@
"Update Accounts for Transactions": "更新交易的帳戶",
"Update Destination Accounts for Transactions": "更新交易的目標帳戶",
"Unable to update accounts for transactions": "無法更新交易的帳戶",
"Add Tags to Transactions": "為交易添加標籤",
"Remove Tags from Transactions": "從交易移除標籤",
"Clear All Tags from Transactions": "從交易清除所有標籤",
"Unable to update tags for transactions": "無法更新交易的標籤",
"Delete Transactions": "刪除交易",
"Unable to delete these transactions": "無法刪除這些交易",
"Account List": "帳戶清單",
+14
View File
@@ -569,6 +569,20 @@ export interface TransactionBatchUpdateAccountRequest {
readonly isDestinationAccount: boolean;
}
export interface TransactionBatchAddTagsRequest {
readonly transactionIds: string[];
readonly tagIds: string[];
}
export interface TransactionBatchRemoveTagsRequest {
readonly transactionIds: string[];
readonly tagIds: string[];
}
export interface TransactionBatchClearTagsRequest {
readonly transactionIds: string[];
}
export interface TransactionMoveBetweenAccountsRequest {
readonly fromAccountId: string;
readonly toAccountId: string;
+96
View File
@@ -1198,6 +1198,99 @@ export const useTransactionsStore = defineStore('transactions', () => {
});
}
function batchAddTagsToTransaction({ transactionIds, tagIds }: { transactionIds: string[], tagIds: string[] }): Promise<boolean> {
return new Promise((resolve, reject) => {
services.batchAddTagsToTransaction({ transactionIds, tagIds }).then(response => {
const data = response.data;
if (!data || !data.success || !data.result) {
reject({ message: 'Unable to update tags for transactions' });
return;
}
updateStoreInvalidState({
transactionList: true,
reconciliationStatement: true,
explorer: true
});
resolve(data.result);
}).catch(error => {
logger.error('failed to update tags for 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 update tags for transactions' });
} else {
reject(error);
}
});
});
}
function batchRemoveTagsFromTransaction({ transactionIds, tagIds }: { transactionIds: string[], tagIds: string[] }): Promise<boolean> {
return new Promise((resolve, reject) => {
services.batchRemoveTagsFromTransaction({ transactionIds, tagIds }).then(response => {
const data = response.data;
if (!data || !data.success || !data.result) {
reject({ message: 'Unable to update tags for transactions' });
return;
}
updateStoreInvalidState({
transactionList: true,
reconciliationStatement: true,
explorer: true
});
resolve(data.result);
}).catch(error => {
logger.error('failed to update tags for 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 update tags for transactions' });
} else {
reject(error);
}
});
});
}
function batchClearAllTagsFromTransaction({ transactionIds }: { transactionIds: string[] }): Promise<boolean> {
return new Promise((resolve, reject) => {
services.batchClearAllTagsFromTransaction({ transactionIds }).then(response => {
const data = response.data;
if (!data || !data.success || !data.result) {
reject({ message: 'Unable to update tags for transactions' });
return;
}
updateStoreInvalidState({
transactionList: true,
reconciliationStatement: true,
explorer: true
});
resolve(data.result);
}).catch(error => {
logger.error('failed to update tags for 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 update tags for transactions' });
} else {
reject(error);
}
});
});
}
function moveAllTransactionsBetweenAccounts({ fromAccountId, toAccountId }: { fromAccountId: string, toAccountId: string }): Promise<boolean> {
return new Promise((resolve, reject) => {
services.moveAllTransactionsBetweenAccounts({ fromAccountId, toAccountId }).then(response => {
@@ -1574,6 +1667,9 @@ export const useTransactionsStore = defineStore('transactions', () => {
saveTransaction,
batchUpdateTransactionCategories,
batchUpdateTransactionAccounts,
batchAddTagsToTransaction,
batchRemoveTagsFromTransaction,
batchClearAllTagsFromTransaction,
moveAllTransactionsBetweenAccounts,
deleteTransaction,
batchDeleteTransactions,
@@ -0,0 +1,180 @@
<template>
<v-dialog width="600" :persistent="true" v-model="showState">
<v-card class="pa-sm-1 pa-md-2">
<template #title>
<div class="d-flex flex-wrap align-center">
<h4 class="text-h4 text-wrap" v-if="type === 'add'">{{ tt('Add Tags to Transactions') }}</h4>
<h4 class="text-h4 text-wrap" v-if="type === 'remove'">{{ tt('Remove Tags from Transactions') }}</h4>
<h4 class="text-h4 text-wrap" v-if="type === 'clear'">{{ tt('Clear All Tags from Transactions') }}</h4>
<v-btn class="ms-2" density="compact" color="default" variant="text" size="24"
:icon="true" :disabled="loading || submitting" :loading="loading"
@click="reload" v-if="type !== 'clear'">
<template #loader>
<v-progress-circular indeterminate size="20"/>
</template>
<v-icon :icon="mdiRefresh" size="24" />
<v-tooltip activator="parent">{{ tt('Refresh') }}</v-tooltip>
</v-btn>
</div>
</template>
<v-card-text class="pb-4" v-if="type === 'clear'">{{ tt('format.misc.clearTransactionsTagsTip', { count: formatNumberToLocalizedNumerals(updateIds?.length ?? 0) }) }}</v-card-text>
<v-card-text class="w-100 d-flex justify-center" v-if="type !== 'clear'">
<v-row>
<v-col cols="12">
<transaction-tag-auto-complete
:disabled="loading || submitting"
:show-label="true"
:allow-add-new-tag="type === 'add'"
v-model="tagIds"
@tag:saving="onSavingTag"
/>
</v-col>
</v-row>
</v-card-text>
<v-card-text>
<div class="w-100 d-flex justify-center flex-wrap mt-sm-1 mt-md-2 gap-4">
<v-btn :disabled="loading || submitting || updateIds.length < 1 || (type !== 'clear' && (!tagIds || tagIds.length < 1))" @click="confirm">
{{ tt('OK') }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="submitting"></v-progress-circular>
</v-btn>
<v-btn color="secondary" variant="tonal" :disabled="loading || submitting" @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 { useTransactionTagsStore } from '@/stores/transactionTag.ts';
import { useTransactionsStore } from '@/stores/transaction.ts';
import {
mdiRefresh
} from '@mdi/js'
export type BatchUpdateTagsOperationType = 'add' | 'remove' | 'clear';
type SnackBarType = InstanceType<typeof SnackBar>;
const {
tt,
formatNumberToLocalizedNumerals
} = useI18n();
const transactionTagsStore = useTransactionTagsStore();
const transactionsStore = useTransactionsStore();
const snackbar = useTemplateRef<SnackBarType>('snackbar');
const showState = ref<boolean>(false);
const loading = ref<boolean>(false);
const submitting = ref<boolean>(false);
const type = ref<BatchUpdateTagsOperationType>('add');
const updateIds = ref<string[]>([]);
const tagIds = ref<string[]>([]);
let resolveFunc: ((response: number) => void) | null = null;
let rejectFunc: ((reason?: unknown) => void) | null = null;
function open(options: { type: BatchUpdateTagsOperationType; updateIds: string[] }): Promise<number> {
type.value = options.type;
updateIds.value = options.updateIds;
tagIds.value = [];
submitting.value = false;
showState.value = true;
return new Promise((resolve, reject) => {
resolveFunc = resolve;
rejectFunc = reject;
});
}
function reload(): void {
loading.value = true;
transactionTagsStore.loadAllTags({ force: true }).then(() => {
loading.value = false;
}).catch(error => {
loading.value = false;
if (!error.processed) {
snackbar.value?.showError(error);
}
});
}
function confirm(): void {
if (type.value === 'add') {
submitting.value = true;
transactionsStore.batchAddTagsToTransaction({
transactionIds: updateIds.value,
tagIds: tagIds.value
}).then(() => {
submitting.value = false;
showState.value = false;
resolveFunc?.(updateIds.value.length);
}).catch(error => {
submitting.value = false;
if (!error.processed) {
snackbar.value?.showError(error);
}
});
} else if (type.value === 'remove') {
submitting.value = true;
transactionsStore.batchRemoveTagsFromTransaction({
transactionIds: updateIds.value,
tagIds: tagIds.value
}).then(() => {
submitting.value = false;
showState.value = false;
resolveFunc?.(updateIds.value.length);
}).catch(error => {
submitting.value = false;
if (!error.processed) {
snackbar.value?.showError(error);
}
});
} else if (type.value === 'clear') {
submitting.value = true;
transactionsStore.batchClearAllTagsFromTransaction({
transactionIds: updateIds.value
}).then(() => {
submitting.value = false;
showState.value = false;
resolveFunc?.(updateIds.value.length);
}).catch(error => {
submitting.value = false;
if (!error.processed) {
snackbar.value?.showError(error);
}
});
}
}
function cancel(): void {
rejectFunc?.();
showState.value = false;
}
function onSavingTag(state: boolean): void {
submitting.value = state;
}
defineExpose({
open
});
</script>
@@ -100,6 +100,19 @@
:disabled="!isAllSelectedTransactionsTransfer"
@click="batchUpdateTransactionAccounts(true)"></v-list-item>
<v-divider class="my-2" />
<v-list-item :prepend-icon="mdiTextBoxEditOutline"
:title="tt('Add Tags to Transactions')"
:disabled="selectedTransactionCount < 1"
@click="batchUpdateTransactionTags('add')"></v-list-item>
<v-list-item :prepend-icon="mdiTextBoxEditOutline"
:title="tt('Remove Tags from Transactions')"
:disabled="selectedTransactionCount < 1"
@click="batchUpdateTransactionTags('remove')"></v-list-item>
<v-list-item :prepend-icon="mdiTextBoxEditOutline"
:title="tt('Clear All Tags from Transactions')"
:disabled="selectedTransactionCount < 1"
@click="batchUpdateTransactionTags('clear')"></v-list-item>
<v-divider class="my-2" />
<v-list-item :prepend-icon="mdiDeleteOutline"
:title="tt('Delete Transactions')"
:disabled="selectedTransactionCount < 1"
@@ -190,6 +203,7 @@
<batch-update-category-dialog ref="batchUpdateCategoryDialog" />
<batch-update-account-dialog ref="batchUpdateAccountDialog" />
<batch-update-tags-dialog ref="batchUpdateTagsDialog" />
<batch-delete-dialog ref="batchDeleteDialog" />
<snack-bar ref="snackbar" />
</template>
@@ -199,6 +213,7 @@ import SnackBar from '@/components/desktop/SnackBar.vue';
import PaginationButtons from '@/components/desktop/PaginationButtons.vue';
import BatchUpdateCategoryDialog from '@/views/desktop/insights/dialogs/BatchUpdateCategoryDialog.vue';
import BatchUpdateAccountDialog from '@/views/desktop/insights/dialogs/BatchUpdateAccountDialog.vue';
import BatchUpdateTagsDialog, { type BatchUpdateTagsOperationType } from '@/views/desktop/insights/dialogs/BatchUpdateTagsDialog.vue';
import BatchDeleteDialog from '@/views/desktop/insights/dialogs/BatchDeleteDialog.vue';
import { ref, computed, useTemplateRef, watch } from 'vue';
@@ -228,6 +243,7 @@ import {
type SnackBarType = InstanceType<typeof SnackBar>;
type BatchUpdateCategoryDialogType = InstanceType<typeof BatchUpdateCategoryDialog>;
type BatchUpdateAccountDialogType = InstanceType<typeof BatchUpdateAccountDialog>;
type BatchUpdateTagsDialogType = InstanceType<typeof BatchUpdateTagsDialog>;
type BatchDeleteDialogType = InstanceType<typeof BatchDeleteDialog>;
interface InsightsExplorerDataTableTabProps {
@@ -245,6 +261,7 @@ const emit = defineEmits<{
const snackbar = useTemplateRef<SnackBarType>('snackbar');
const batchUpdateCategoryDialog = useTemplateRef<BatchUpdateCategoryDialogType>('batchUpdateCategoryDialog');
const batchUpdateAccountDialog = useTemplateRef<BatchUpdateAccountDialogType>('batchUpdateAccountDialog');
const batchUpdateTagsDialog = useTemplateRef<BatchUpdateTagsDialogType>('batchUpdateTagsDialog');
const batchDeleteDialog = useTemplateRef<BatchDeleteDialogType>('batchDeleteDialog');
const {
@@ -365,6 +382,25 @@ function batchUpdateTransactionAccounts(isDestinationAccount: boolean): void {
});
}
function batchUpdateTransactionTags(type: BatchUpdateTagsOperationType): void {
batchUpdateTagsDialog.value?.open({
type: type,
updateIds: getAllSelectedTransactionIds()
}).then(updatedCount => {
if (updatedCount > 0) {
snackbar.value?.showMessage('format.misc.youHaveUpdatedTransactions', {
count: formatNumberToLocalizedNumerals(updatedCount)
});
}
selectedTransactions.value = {};
emit('update:transactions');
}).catch(error => {
if (error) {
snackbar.value?.showError(error);
}
});
}
function batchDeleteTransactions(): void {
batchDeleteDialog.value?.open({
updateIds: getAllSelectedTransactionIds()