diff --git a/pkg/models/transaction.go b/pkg/models/transaction.go index 0f36fdac..a095e0db 100644 --- a/pkg/models/transaction.go +++ b/pkg/models/transaction.go @@ -385,16 +385,23 @@ func (t *TransactionAmountsRequest) GetTransactionAmountsRequestItems() ([]*Tran // GetNumericYearMonthRange returns numeric start year, start month, end year and end month func (t *YearMonthRangeRequest) GetNumericYearMonthRange() (int32, int32, int32, int32, error) { - startYear, startMonth, err := utils.ParseNumericYearMonth(t.StartYearMonth) + var startYear, startMonth, endYear, endMonth int32 + var err error - if err != nil { - return 0, 0, 0, 0, err + if t.StartYearMonth != "" { + startYear, startMonth, err = utils.ParseNumericYearMonth(t.StartYearMonth) + + if err != nil { + return 0, 0, 0, 0, err + } } - endYear, endMonth, err := utils.ParseNumericYearMonth(t.EndYearMonth) + if t.EndYearMonth != "" { + endYear, endMonth, err = utils.ParseNumericYearMonth(t.EndYearMonth) - if err != nil { - return 0, 0, 0, 0, err + if err != nil { + return 0, 0, 0, 0, err + } } return startYear, startMonth, endYear, endMonth, nil diff --git a/pkg/services/transactions.go b/pkg/services/transactions.go index db9f14d6..4cb321c5 100644 --- a/pkg/services/transactions.go +++ b/pkg/services/transactions.go @@ -1207,19 +1207,26 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c * } clientLocation := time.FixedZone("Client Timezone", int(utcOffset)*60) - startTransactionTime, _, err := utils.GetTransactionTimeRangeByYearMonth(startYear, startMonth) + var startTransactionTime, endTransactionTime int64 + var err error - if err != nil { - return nil, errs.ErrSystemError + if startYear > 0 && startMonth > 0 { + startTransactionTime, _, err = utils.GetTransactionTimeRangeByYearMonth(startYear, startMonth) + + if err != nil { + return nil, errs.ErrSystemError + } } - _, endTransactionTime, err := utils.GetTransactionTimeRangeByYearMonth(endYear, endMonth) + if endYear > 0 && endMonth > 0 { + _, endTransactionTime, err = utils.GetTransactionTimeRangeByYearMonth(endYear, endMonth) - if err != nil { - return nil, errs.ErrSystemError + if err != nil { + return nil, errs.ErrSystemError + } } - condition := "uid=? AND deleted=? AND (type=? OR type=?) AND transaction_time>=? AND transaction_time<=?" + condition := "uid=? AND deleted=? AND (type=? OR type=?)" conditionParams := make([]any, 0, 4) conditionParams = append(conditionParams, uid) conditionParams = append(conditionParams, false) @@ -1230,15 +1237,24 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c * maxTransactionTime := endTransactionTime var allTransactions []*models.Transaction - for maxTransactionTime > 0 { + for maxTransactionTime >= 0 { var transactions []*models.Transaction + finalCondition := condition finalConditionParams := make([]any, 0, 6) finalConditionParams = append(finalConditionParams, conditionParams...) - finalConditionParams = append(finalConditionParams, minTransactionTime) - finalConditionParams = append(finalConditionParams, maxTransactionTime) - err := s.UserDataDB(uid).NewSession(c).Select("category_id, account_id, transaction_time, timezone_utc_offset, amount").Where(condition, finalConditionParams...).Limit(pageCountForLoadTransactionAmounts, 0).OrderBy("transaction_time desc").Find(&transactions) + if minTransactionTime > 0 { + finalCondition = finalCondition + " AND transaction_time>=?" + finalConditionParams = append(finalConditionParams, minTransactionTime) + } + + if maxTransactionTime > 0 { + finalCondition = finalCondition + " AND transaction_time<=?" + finalConditionParams = append(finalConditionParams, maxTransactionTime) + } + + err := s.UserDataDB(uid).NewSession(c).Select("category_id, account_id, transaction_time, timezone_utc_offset, amount").Where(finalCondition, finalConditionParams...).Limit(pageCountForLoadTransactionAmounts, 0).OrderBy("transaction_time desc").Find(&transactions) if err != nil { return nil, err @@ -1247,7 +1263,7 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c * allTransactions = append(allTransactions, transactions...) if len(transactions) < pageCountForLoadTransactionAmounts { - maxTransactionTime = 0 + maxTransactionTime = -1 break } @@ -1269,7 +1285,7 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c * yearMonth := utils.FormatUnixTimeToNumericYearMonth(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime), timeZone) - if yearMonth < startYearMonth || yearMonth > endYearMonth { + if (startYearMonth > 0 && yearMonth < startYearMonth) || (endYearMonth > 0 && yearMonth > endYearMonth) { continue } diff --git a/src/lib/services.js b/src/lib/services.js index 185a5855..65e2826c 100644 --- a/src/lib/services.js +++ b/src/lib/services.js @@ -296,8 +296,18 @@ export default { return axios.get(`v1/transactions/statistics.json?use_transaction_timezone=${useTransactionTimezone}` + (queryParams.length ? '&' + queryParams.join('&') : '')); }, - getTransactionStatisticsTrends: ({ startTime, endTime, useTransactionTimezone, rangeType }) => { - return axios.get(`v1/transactions/statistics/trends.json?start_time=${startTime}&end_time=${endTime}&use_transaction_timezone=${useTransactionTimezone}&range_type=${rangeType}`); + getTransactionStatisticsTrends: ({ startYearMonth, endYearMonth, useTransactionTimezone }) => { + const queryParams = []; + + if (startYearMonth) { + queryParams.push(`start_year_month=${startYearMonth}`); + } + + if (endYearMonth) { + queryParams.push(`end_year_month=${endYearMonth}`); + } + + return axios.get(`v1/transactions/statistics/trends.json?use_transaction_timezone=${useTransactionTimezone}` + (queryParams.length ? '&' + queryParams.join('&') : '')); }, getTransactionAmounts: ({ useTransactionTimezone, today, thisWeek, thisMonth, thisYear, lastMonth, monthBeforeLastMonth, monthBeforeLast2Months, monthBeforeLast3Months, monthBeforeLast4Months, monthBeforeLast5Months, monthBeforeLast6Months, monthBeforeLast7Months, monthBeforeLast8Months, monthBeforeLast9Months, monthBeforeLast10Months }) => { const queryParams = [];