not allow to add transaction before balance modification transaction and not allow to modify transaction time for balance modification transaction

This commit is contained in:
MaysWind
2024-10-09 01:05:49 +08:00
parent c36f58e491
commit e5cd8ffa61
5 changed files with 74 additions and 33 deletions
+35
View File
@@ -624,6 +624,10 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
modifyTransactionTime := false
if utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime) != utils.GetUnixTimeFromTransactionTime(oldTransaction.TransactionTime) {
if oldTransaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
return errs.ErrBalanceModificationTransactionCannotModifyTime
}
sameSecondLatestTransaction := &models.Transaction{}
minTransactionTime := utils.GetMinTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime))
maxTransactionTime := utils.GetMaxTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime))
@@ -702,6 +706,23 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
return err
}
// Not allow to add transaction before balance modification transaction
if transaction.Type != models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
otherTransactionExists := false
if destinationAccount != nil && sourceAccount.AccountId != destinationAccount.AccountId {
otherTransactionExists, err = sess.Cols("uid", "deleted", "account_id").Where("uid=? AND deleted=? AND type=? AND (account_id=? OR account_id=?) AND transaction_time>=?", transaction.Uid, false, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE, sourceAccount.AccountId, destinationAccount.AccountId, transaction.TransactionTime).Limit(1).Exist(&models.Transaction{})
} else {
otherTransactionExists, err = sess.Cols("uid", "deleted", "account_id").Where("uid=? AND deleted=? AND type=? AND account_id=? AND transaction_time>=?", transaction.Uid, false, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE, sourceAccount.AccountId, transaction.TransactionTime).Limit(1).Exist(&models.Transaction{})
}
if err != nil {
return err
} else if otherTransactionExists {
return errs.ErrCannotAddTransactionBeforeBalanceModificationTransaction
}
}
// Update transaction row
updatedRows, err := sess.ID(transaction.TransactionId).Cols(updateCols...).Where("uid=? AND deleted=?", transaction.Uid, false).Update(transaction)
@@ -1579,6 +1600,20 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
transaction.RelatedAccountId = transaction.AccountId
transaction.RelatedAccountAmount = transaction.Amount - sourceAccount.Balance
} else { // Not allow to add transaction before balance modification transaction
otherTransactionExists := false
if destinationAccount != nil && sourceAccount.AccountId != destinationAccount.AccountId {
otherTransactionExists, err = sess.Cols("uid", "deleted", "account_id").Where("uid=? AND deleted=? AND type=? AND (account_id=? OR account_id=?) AND transaction_time>=?", transaction.Uid, false, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE, sourceAccount.AccountId, destinationAccount.AccountId, transaction.TransactionTime).Limit(1).Exist(&models.Transaction{})
} else {
otherTransactionExists, err = sess.Cols("uid", "deleted", "account_id").Where("uid=? AND deleted=? AND type=? AND account_id=? AND transaction_time>=?", transaction.Uid, false, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE, sourceAccount.AccountId, transaction.TransactionTime).Limit(1).Exist(&models.Transaction{})
}
if err != nil {
return err
} else if otherTransactionExists {
return errs.ErrCannotAddTransactionBeforeBalanceModificationTransaction
}
}
// Insert transaction row