add api for getting total income/expense amounts by month

This commit is contained in:
MaysWind
2021-03-29 00:57:16 +08:00
parent f57f56b9ea
commit ead072ed31
8 changed files with 277 additions and 0 deletions
+67
View File
@@ -969,6 +969,73 @@ func (s *TransactionService) GetAccountsTotalIncomeAndExpense(uid int64, startUn
return incomeAmounts, expenseAmounts, nil
}
// GetAccountsMonthTotalIncomeAndExpense returns the every accounts total income and expense amount in month by specific date range
func (s *TransactionService) GetAccountsMonthTotalIncomeAndExpense(uid int64, startUnixTime int64, endUnixTime int64, pageCount int) (map[string]models.TransactionAccountsAmount, error) {
if uid <= 0 {
return nil, errs.ErrUserIdInvalid
}
startTransactionTime := utils.GetMinTransactionTimeFromUnixTime(startUnixTime)
endTransactionTime := utils.GetMaxTransactionTimeFromUnixTime(endUnixTime)
minTransactionTime := startTransactionTime
maxTransactionTime := endTransactionTime
var allTransactions []*models.Transaction
for maxTransactionTime > 0 {
var transactions []*models.Transaction
err := s.UserDataDB(uid).Select("uid, type, account_id, transaction_time, timezone_utc_offset, amount").Where("uid=? AND deleted=? AND (type=? OR type=?) AND transaction_time>=? AND transaction_time<=?", uid, false, models.TRANSACTION_DB_TYPE_INCOME, models.TRANSACTION_DB_TYPE_EXPENSE, minTransactionTime, maxTransactionTime).Limit(pageCount, 0).OrderBy("transaction_time desc").Find(&transactions)
if err != nil {
return nil, err
}
allTransactions = append(allTransactions, transactions...)
if len(transactions) < pageCount {
maxTransactionTime = 0
break
}
maxTransactionTime = transactions[len(transactions)-1].TransactionTime - 1
}
totalAmounts := make(map[string]models.TransactionAccountsAmount)
for i := 0; i < len(allTransactions); i++ {
transaction := allTransactions[i]
transactionTimeZone := time.FixedZone("Transaction Timezone", int(transaction.TimezoneUtcOffset)*60)
yearMonth := utils.FormatUnixTimeToYearMonth(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime), transactionTimeZone)
monthAccountsAmounts, exists := totalAmounts[yearMonth]
if !exists {
monthAccountsAmounts = make(models.TransactionAccountsAmount)
totalAmounts[yearMonth] = monthAccountsAmounts
}
monthAccountAmount, exists := monthAccountsAmounts[transaction.AccountId]
if !exists {
monthAccountAmount = &models.TransactionAccountAmount{
AccountId: transaction.AccountId,
TotalIncomeAmount: 0,
TotalExpenseAmount: 0,
}
monthAccountsAmounts[transaction.AccountId] = monthAccountAmount
}
if transaction.Type == models.TRANSACTION_DB_TYPE_INCOME {
monthAccountAmount.TotalIncomeAmount += transaction.Amount
} else if transaction.Type == models.TRANSACTION_DB_TYPE_EXPENSE {
monthAccountAmount.TotalExpenseAmount += transaction.Amount
}
}
return totalAmounts, nil
}
// GetAccountsAndCategoriesTotalIncomeAndExpense returns the every accounts and categories total income and expense amount by specific date range
func (s *TransactionService) GetAccountsAndCategoriesTotalIncomeAndExpense(uid int64, startUnixTime int64, endUnixTime int64) ([]*models.Transaction, error) {
if uid <= 0 {