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
+2
View File
@@ -32,4 +32,6 @@ var (
ErrImportFileTypeIsEmpty = NewSystemError(NormalSubcategoryTransaction, 25, http.StatusBadRequest, "import file type is empty") ErrImportFileTypeIsEmpty = NewSystemError(NormalSubcategoryTransaction, 25, http.StatusBadRequest, "import file type is empty")
ErrImportFileTypeNotSupported = NewSystemError(NormalSubcategoryTransaction, 26, http.StatusBadRequest, "import file type not supported") ErrImportFileTypeNotSupported = NewSystemError(NormalSubcategoryTransaction, 26, http.StatusBadRequest, "import file type not supported")
ErrNoDataToImport = NewSystemError(NormalSubcategoryTransaction, 27, http.StatusBadRequest, "no data to import") ErrNoDataToImport = NewSystemError(NormalSubcategoryTransaction, 27, http.StatusBadRequest, "no data to import")
ErrCannotAddTransactionBeforeBalanceModificationTransaction = NewSystemError(NormalSubcategoryTransaction, 28, http.StatusBadRequest, "cannot add transaction before balance modification transaction")
ErrBalanceModificationTransactionCannotModifyTime = NewSystemError(NormalSubcategoryTransaction, 29, http.StatusBadRequest, "balance modification transaction cannot modify transaction time")
) )
+5 -5
View File
@@ -69,12 +69,12 @@ func (s TransactionDbType) ToTransactionType() (TransactionType, error) {
// Transaction represents transaction data stored in database // Transaction represents transaction data stored in database
type Transaction struct { type Transaction struct {
TransactionId int64 `xorm:"PK"` TransactionId int64 `xorm:"PK"`
Uid int64 `xorm:"UNIQUE(UQE_transaction_uid_time) INDEX(IDX_transaction_uid_deleted_time) INDEX(IDX_transaction_uid_deleted_type_time) INDEX(IDX_transaction_uid_deleted_category_id_time) INDEX(IDX_transaction_uid_deleted_account_id_time) INDEX(IDX_transaction_uid_deleted_time_longitude_latitude) NOT NULL"` Uid int64 `xorm:"UNIQUE(UQE_transaction_uid_time) INDEX(IDX_transaction_uid_deleted_time) INDEX(IDX_transaction_uid_deleted_type_time) INDEX(IDX_transaction_uid_deleted_type_account_id_time) INDEX(IDX_transaction_uid_deleted_category_id_time) INDEX(IDX_transaction_uid_deleted_account_id_time) INDEX(IDX_transaction_uid_deleted_time_longitude_latitude) NOT NULL"`
Deleted bool `xorm:"INDEX(IDX_transaction_uid_deleted_time) INDEX(IDX_transaction_uid_deleted_type_time) INDEX(IDX_transaction_uid_deleted_category_id_time) INDEX(IDX_transaction_uid_deleted_account_id_time) INDEX(IDX_transaction_uid_deleted_time_longitude_latitude) NOT NULL"` Deleted bool `xorm:"INDEX(IDX_transaction_uid_deleted_time) INDEX(IDX_transaction_uid_deleted_type_time) INDEX(IDX_transaction_uid_deleted_type_account_id_time) INDEX(IDX_transaction_uid_deleted_category_id_time) INDEX(IDX_transaction_uid_deleted_account_id_time) INDEX(IDX_transaction_uid_deleted_time_longitude_latitude) NOT NULL"`
Type TransactionDbType `xorm:"INDEX(IDX_transaction_uid_deleted_type_time) NOT NULL"` Type TransactionDbType `xorm:"INDEX(IDX_transaction_uid_deleted_type_time) INDEX(IDX_transaction_uid_deleted_type_account_id_time) NOT NULL"`
CategoryId int64 `xorm:"INDEX(IDX_transaction_uid_deleted_category_id_time) NOT NULL"` CategoryId int64 `xorm:"INDEX(IDX_transaction_uid_deleted_category_id_time) NOT NULL"`
AccountId int64 `xorm:"INDEX(IDX_transaction_uid_deleted_account_id_time) NOT NULL"` AccountId int64 `xorm:"INDEX(IDX_transaction_uid_deleted_account_id_time) INDEX(IDX_transaction_uid_deleted_type_account_id_time) NOT NULL"`
TransactionTime int64 `xorm:"UNIQUE(UQE_transaction_uid_time) INDEX(IDX_transaction_uid_deleted_time) INDEX(IDX_transaction_uid_deleted_type_time) INDEX(IDX_transaction_uid_deleted_category_id_time) INDEX(IDX_transaction_uid_deleted_account_id_time) NOT NULL"` TransactionTime int64 `xorm:"UNIQUE(UQE_transaction_uid_time) INDEX(IDX_transaction_uid_deleted_time) INDEX(IDX_transaction_uid_deleted_type_time) INDEX(IDX_transaction_uid_deleted_type_account_id_time) INDEX(IDX_transaction_uid_deleted_category_id_time) INDEX(IDX_transaction_uid_deleted_account_id_time) NOT NULL"`
TimezoneUtcOffset int16 `xorm:"NOT NULL"` TimezoneUtcOffset int16 `xorm:"NOT NULL"`
Amount int64 `xorm:"NOT NULL"` Amount int64 `xorm:"NOT NULL"`
RelatedId int64 `xorm:"NOT NULL"` RelatedId int64 `xorm:"NOT NULL"`
+35
View File
@@ -624,6 +624,10 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
modifyTransactionTime := false modifyTransactionTime := false
if utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime) != utils.GetUnixTimeFromTransactionTime(oldTransaction.TransactionTime) { if utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime) != utils.GetUnixTimeFromTransactionTime(oldTransaction.TransactionTime) {
if oldTransaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
return errs.ErrBalanceModificationTransactionCannotModifyTime
}
sameSecondLatestTransaction := &models.Transaction{} sameSecondLatestTransaction := &models.Transaction{}
minTransactionTime := utils.GetMinTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime)) minTransactionTime := utils.GetMinTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime))
maxTransactionTime := utils.GetMaxTransactionTimeFromUnixTime(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 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 // Update transaction row
updatedRows, err := sess.ID(transaction.TransactionId).Cols(updateCols...).Where("uid=? AND deleted=?", transaction.Uid, false).Update(transaction) 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.RelatedAccountId = transaction.AccountId
transaction.RelatedAccountAmount = transaction.Amount - sourceAccount.Balance 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 // Insert transaction row
+2
View File
@@ -1079,6 +1079,8 @@
"import file type is empty": "Import file type is empty", "import file type is empty": "Import file type is empty",
"import file type not supported": "Import file type is not supported", "import file type not supported": "Import file type is not supported",
"no data to import": "No data to import", "no data to import": "No data to import",
"cannot add transaction before balance modification transaction": "You cannot add transaction before the balance modification transaction",
"balance modification transaction cannot modify transaction time": "You cannot modify transaction time for balance modification transaction",
"transaction category id is invalid": "Transaction category ID is invalid", "transaction category id is invalid": "Transaction category ID is invalid",
"transaction category not found": "Transaction category is not found", "transaction category not found": "Transaction category is not found",
"transaction category type is invalid": "Transaction category type is invalid", "transaction category type is invalid": "Transaction category type is invalid",
+2
View File
@@ -1079,6 +1079,8 @@
"import file type is empty": "导入文件类型为空", "import file type is empty": "导入文件类型为空",
"import file type not supported": "导入文件类型不支持", "import file type not supported": "导入文件类型不支持",
"no data to import": "没有可以导入的数据", "no data to import": "没有可以导入的数据",
"cannot add transaction before balance modification transaction": "不能添加早于修改余额的交易",
"balance modification transaction cannot modify transaction time": "您无法对修改余额的交易修改交易时间",
"transaction category id is invalid": "交易分类ID无效", "transaction category id is invalid": "交易分类ID无效",
"transaction category not found": "交易分类不存在", "transaction category not found": "交易分类不存在",
"transaction category type is invalid": "交易分类类型无效", "transaction category type is invalid": "交易分类类型无效",