diff --git a/pkg/errs/transaction.go b/pkg/errs/transaction.go index 765f2dc1..8592efe7 100644 --- a/pkg/errs/transaction.go +++ b/pkg/errs/transaction.go @@ -17,5 +17,4 @@ var ( ErrCannotAddTransactionToHiddenAccount = NewNormalError(NormalSubcategoryTransaction, 10, http.StatusBadRequest, "cannot add transaction to hidden account") ErrCannotModifyTransactionInHiddenAccount = NewNormalError(NormalSubcategoryTransaction, 11, http.StatusBadRequest, "cannot modify transaction of hidden account") ErrCannotDeleteTransactionInHiddenAccount = NewNormalError(NormalSubcategoryTransaction, 12, http.StatusBadRequest, "cannot delete transaction in hidden account") - ErrCannotModifyTransactionType = NewNormalError(NormalSubcategoryTransaction, 13, http.StatusBadRequest, "cannot modify transaction type") ) diff --git a/pkg/services/transactions.go b/pkg/services/transactions.go index 57161d4d..eb6e6736 100644 --- a/pkg/services/transactions.go +++ b/pkg/services/transactions.go @@ -338,10 +338,7 @@ func (s *TransactionService) ModifyTransaction(transaction *models.Transaction, return errs.ErrTransactionNotFound } - // Cannot change transaction type - if transaction.Type != oldTransaction.Type { - return errs.ErrCannotModifyTransactionType - } + transaction.Type = oldTransaction.Type // Check whether account id is valid err = s.isAccountIdValid(transaction) @@ -472,11 +469,11 @@ func (s *TransactionService) ModifyTransaction(transaction *models.Transaction, // Update account table if oldTransaction.Type == models.TRANSACTION_TYPE_MODIFY_BALANCE { - if transaction.SourceAccountId != oldTransaction.SourceAccountId { + if transaction.DestinationAccountId != oldTransaction.DestinationAccountId { return errs.ErrBalanceModificationTransactionCannotChangeAccountId } - if transaction.SourceAmount != oldTransaction.SourceAmount { + if transaction.DestinationAmount != oldTransaction.DestinationAmount { destinationAccount.UpdatedUnixTime = time.Now().Unix() updatedRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)+(%d)", oldTransaction.DestinationAmount, transaction.DestinationAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount) @@ -487,48 +484,128 @@ func (s *TransactionService) ModifyTransaction(transaction *models.Transaction, } } } else if oldTransaction.Type == models.TRANSACTION_TYPE_INCOME { - if transaction.SourceAccountId != oldTransaction.SourceAccountId && transaction.DestinationAmount != oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.SourceAccountId != oldTransaction.SourceAccountId && transaction.DestinationAmount == oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.SourceAccountId == oldTransaction.SourceAccountId && transaction.DestinationAmount != oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } - } else if oldTransaction.Type == models.TRANSACTION_TYPE_EXPENSE { - if transaction.SourceAccountId != oldTransaction.SourceAccountId && transaction.DestinationAmount != oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.SourceAccountId != oldTransaction.SourceAccountId && transaction.DestinationAmount == oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.SourceAccountId == oldTransaction.SourceAccountId && transaction.DestinationAmount != oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } - } else if oldTransaction.Type == models.TRANSACTION_TYPE_TRANSFER { - if transaction.SourceAccountId != oldTransaction.SourceAccountId && transaction.SourceAmount != oldTransaction.SourceAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.SourceAccountId != oldTransaction.SourceAccountId && transaction.SourceAmount == oldTransaction.SourceAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.SourceAccountId == oldTransaction.SourceAccountId && transaction.SourceAmount != oldTransaction.SourceAmount { - // TODO: implement - return errs.ErrNotImplemented + var oldAccountNewAmount int64 = 0 + var newAccountNewAmount int64 = 0 + + if transaction.DestinationAccountId == oldTransaction.DestinationAccountId { + oldAccountNewAmount = transaction.DestinationAmount + } else if transaction.DestinationAccountId != oldTransaction.DestinationAccountId { + newAccountNewAmount = transaction.DestinationAmount } - if transaction.DestinationAccountId != oldTransaction.DestinationAccountId && transaction.DestinationAmount != oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.DestinationAccountId != oldTransaction.DestinationAccountId && transaction.DestinationAmount == oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented - } else if transaction.DestinationAccountId == oldTransaction.DestinationAccountId && transaction.DestinationAmount != oldTransaction.DestinationAmount { - // TODO: implement - return errs.ErrNotImplemented + if oldAccountNewAmount != oldTransaction.DestinationAmount { + oldDestinationAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(oldDestinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)+(%d)", oldTransaction.DestinationAmount, oldAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldDestinationAccount.Uid, false).Update(oldDestinationAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } + } + + if newAccountNewAmount != 0 { + destinationAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", newAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } + } + } else if oldTransaction.Type == models.TRANSACTION_TYPE_EXPENSE { + var oldAccountNewAmount int64 = 0 + var newAccountNewAmount int64 = 0 + + if transaction.DestinationAccountId == oldTransaction.DestinationAccountId { + oldAccountNewAmount = transaction.DestinationAmount + } else if transaction.DestinationAccountId != oldTransaction.DestinationAccountId { + newAccountNewAmount = transaction.DestinationAmount + } + + if oldAccountNewAmount != oldTransaction.DestinationAmount { + oldDestinationAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(oldDestinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)-(%d)", oldTransaction.DestinationAmount, oldAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldDestinationAccount.Uid, false).Update(oldDestinationAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } + } + + if newAccountNewAmount != 0 { + destinationAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", newAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } + } + } else if oldTransaction.Type == models.TRANSACTION_TYPE_TRANSFER { + var oldSourceAccountNewAmount int64 = 0 + var newSourceAccountNewAmount int64 = 0 + + if transaction.SourceAccountId == oldTransaction.SourceAccountId { + oldSourceAccountNewAmount = transaction.SourceAmount + } else if transaction.SourceAccountId != oldTransaction.SourceAccountId { + newSourceAccountNewAmount = transaction.SourceAmount + } + + if oldSourceAccountNewAmount != oldTransaction.SourceAmount { + oldSourceAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(oldSourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)-(%d)", oldTransaction.SourceAmount, oldSourceAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldSourceAccount.Uid, false).Update(oldSourceAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } + } + + if newSourceAccountNewAmount != 0 { + sourceAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", newSourceAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } + } + + var oldDestinationAccountNewAmount int64 = 0 + var newDestinationAccountNewAmount int64 = 0 + + if transaction.DestinationAccountId == oldTransaction.DestinationAccountId { + oldDestinationAccountNewAmount = transaction.DestinationAmount + } else if transaction.DestinationAccountId != oldTransaction.DestinationAccountId { + newDestinationAccountNewAmount = transaction.DestinationAmount + } + + if oldDestinationAccountNewAmount != oldTransaction.DestinationAmount { + oldDestinationAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(oldDestinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)+(%d)", oldTransaction.DestinationAmount, oldDestinationAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldDestinationAccount.Uid, false).Update(oldDestinationAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } + } + + if newDestinationAccountNewAmount != 0 { + destinationAccount.UpdatedUnixTime = time.Now().Unix() + updatedRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", newDestinationAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount) + + if err != nil { + return err + } else if updatedRows < 1 { + return errs.ErrDatabaseOperationFailed + } } } diff --git a/src/locales/en.js b/src/locales/en.js index b1d50791..b3e6d4ad 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -320,7 +320,6 @@ export default { 'cannot add transaction to hidden account': 'You cannot add transaction to an hidden account', 'cannot modify transaction of hidden account': 'You cannot modify transaction of an hidden account', 'cannot delete transaction in hidden account': 'You cannot delete transaction in an hidden account', - 'cannot modify transaction type': 'You cannot modify transaction type', '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', diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js index 44d935a0..7b6fcc1d 100644 --- a/src/locales/zh_Hans.js +++ b/src/locales/zh_Hans.js @@ -320,7 +320,6 @@ export default { 'cannot add transaction to hidden account': '您不能在隐藏账户中添加交易', 'cannot modify transaction of hidden account': '您不能修改隐藏账户中的交易', 'cannot delete transaction in hidden account': '您不能删除隐藏账户中的交易', - 'cannot modify transaction type': '您不能修改交易类型', 'transaction category id is invalid': '交易分类ID无效', 'transaction category not found': '交易分类不存在', 'transaction category type is invalid': '交易分类类型无效',