Skip to content

Commit

Permalink
fix the bug that there are duplicate transaction in transaction list …
Browse files Browse the repository at this point in the history
…response when filtering multiple accounts
  • Loading branch information
mayswind committed Jul 3, 2024
1 parent 7a5d733 commit 7e1338e
Showing 1 changed file with 41 additions and 21 deletions.
62 changes: 41 additions & 21 deletions pkg/services/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -1347,25 +1347,54 @@ func (s *TransactionService) getTransactionQueryCondition(uid int64, maxTransact
conditionParams = append(conditionParams, minTransactionTime)
}

var accountIdsCondition strings.Builder
accountIdConditionParams := make([]any, 0, len(accountIds))

for i := 0; i < len(accountIds); i++ {
if i > 0 {
accountIdsCondition.WriteString(",")
}

accountIdsCondition.WriteString("?")
accountIdConditionParams = append(accountIdConditionParams, accountIds[i])
}

if models.TRANSACTION_DB_TYPE_MODIFY_BALANCE <= transactionType && transactionType <= models.TRANSACTION_DB_TYPE_EXPENSE {
condition = condition + " AND type=?"
conditionParams = append(conditionParams, transactionType)
} else if transactionType == models.TRANSACTION_DB_TYPE_TRANSFER_OUT || transactionType == models.TRANSACTION_DB_TYPE_TRANSFER_IN {
if len(accountIds) == 0 {
condition = condition + " AND type=?"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
} else {
} else if len(accountIds) == 1 {
condition = condition + " AND (type=? OR type=?)"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_IN)
} else { // len(accountsIds) > 1
condition = condition + " AND (type=? OR (type=? AND related_account_id NOT IN (" + accountIdsCondition.String() + ")))"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_IN)
conditionParams = append(conditionParams, accountIdConditionParams...)
}
} else {
if noDuplicated && len(accountIds) == 0 {
condition = condition + " AND (type=? OR type=? OR type=? OR type=?)"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_INCOME)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_EXPENSE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
if noDuplicated {
if len(accountIds) == 0 {
condition = condition + " AND (type=? OR type=? OR type=? OR type=?)"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_INCOME)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_EXPENSE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
} else if len(accountIds) == 1 {
// Do Nothing
} else { // len(accountsIds) > 1
condition = condition + " AND (type=? OR type=? OR type=? OR type=? OR (type=? AND related_account_id NOT IN (" + accountIdsCondition.String() + ")))"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_INCOME)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_EXPENSE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_IN)
conditionParams = append(conditionParams, accountIdConditionParams...)
}
}
}

Expand All @@ -1389,22 +1418,13 @@ func (s *TransactionService) getTransactionQueryCondition(uid int64, maxTransact
}

if len(accountIds) > 0 {
var conditions strings.Builder

for i := 0; i < len(accountIds); i++ {
if i > 0 {
conditions.WriteString(",")
}

conditions.WriteString("?")
conditionParams = append(conditionParams, accountIds[i])
}

if conditions.Len() > 1 {
condition = condition + " AND account_id IN (" + conditions.String() + ")"
if accountIdsCondition.Len() > 1 {
condition = condition + " AND account_id IN (" + accountIdsCondition.String() + ")"
} else {
condition = condition + " AND account_id = " + conditions.String()
condition = condition + " AND account_id = " + accountIdsCondition.String()
}

conditionParams = append(conditionParams, accountIdConditionParams...)
}

if amountFilter != "" {
Expand Down

0 comments on commit 7e1338e

Please sign in to comment.