trend analysis supports data from all dates

This commit is contained in:
MaysWind
2024-05-31 11:02:12 +08:00
parent f041e7cb7d
commit c34887240e
3 changed files with 54 additions and 21 deletions
+13 -6
View File
@@ -385,16 +385,23 @@ func (t *TransactionAmountsRequest) GetTransactionAmountsRequestItems() ([]*Tran
// GetNumericYearMonthRange returns numeric start year, start month, end year and end month // GetNumericYearMonthRange returns numeric start year, start month, end year and end month
func (t *YearMonthRangeRequest) GetNumericYearMonthRange() (int32, int32, int32, int32, error) { 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 { if t.StartYearMonth != "" {
return 0, 0, 0, 0, err 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 { if err != nil {
return 0, 0, 0, 0, err return 0, 0, 0, 0, err
}
} }
return startYear, startMonth, endYear, endMonth, nil return startYear, startMonth, endYear, endMonth, nil
+29 -13
View File
@@ -1207,19 +1207,26 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c *
} }
clientLocation := time.FixedZone("Client Timezone", int(utcOffset)*60) clientLocation := time.FixedZone("Client Timezone", int(utcOffset)*60)
startTransactionTime, _, err := utils.GetTransactionTimeRangeByYearMonth(startYear, startMonth) var startTransactionTime, endTransactionTime int64
var err error
if err != nil { if startYear > 0 && startMonth > 0 {
return nil, errs.ErrSystemError 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 { if err != nil {
return nil, errs.ErrSystemError 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 := make([]any, 0, 4)
conditionParams = append(conditionParams, uid) conditionParams = append(conditionParams, uid)
conditionParams = append(conditionParams, false) conditionParams = append(conditionParams, false)
@@ -1230,15 +1237,24 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c *
maxTransactionTime := endTransactionTime maxTransactionTime := endTransactionTime
var allTransactions []*models.Transaction var allTransactions []*models.Transaction
for maxTransactionTime > 0 { for maxTransactionTime >= 0 {
var transactions []*models.Transaction var transactions []*models.Transaction
finalCondition := condition
finalConditionParams := make([]any, 0, 6) finalConditionParams := make([]any, 0, 6)
finalConditionParams = append(finalConditionParams, conditionParams...) 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 { if err != nil {
return nil, err return nil, err
@@ -1247,7 +1263,7 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c *
allTransactions = append(allTransactions, transactions...) allTransactions = append(allTransactions, transactions...)
if len(transactions) < pageCountForLoadTransactionAmounts { if len(transactions) < pageCountForLoadTransactionAmounts {
maxTransactionTime = 0 maxTransactionTime = -1
break break
} }
@@ -1269,7 +1285,7 @@ func (s *TransactionService) GetAccountsAndCategoriesMonthlyIncomeAndExpense(c *
yearMonth := utils.FormatUnixTimeToNumericYearMonth(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime), timeZone) yearMonth := utils.FormatUnixTimeToNumericYearMonth(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime), timeZone)
if yearMonth < startYearMonth || yearMonth > endYearMonth { if (startYearMonth > 0 && yearMonth < startYearMonth) || (endYearMonth > 0 && yearMonth > endYearMonth) {
continue continue
} }
+12 -2
View File
@@ -296,8 +296,18 @@ export default {
return axios.get(`v1/transactions/statistics.json?use_transaction_timezone=${useTransactionTimezone}` + (queryParams.length ? '&' + queryParams.join('&') : '')); return axios.get(`v1/transactions/statistics.json?use_transaction_timezone=${useTransactionTimezone}` + (queryParams.length ? '&' + queryParams.join('&') : ''));
}, },
getTransactionStatisticsTrends: ({ startTime, endTime, useTransactionTimezone, rangeType }) => { getTransactionStatisticsTrends: ({ startYearMonth, endYearMonth, useTransactionTimezone }) => {
return axios.get(`v1/transactions/statistics/trends.json?start_time=${startTime}&end_time=${endTime}&use_transaction_timezone=${useTransactionTimezone}&range_type=${rangeType}`); 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 }) => { getTransactionAmounts: ({ useTransactionTimezone, today, thisWeek, thisMonth, thisYear, lastMonth, monthBeforeLastMonth, monthBeforeLast2Months, monthBeforeLast3Months, monthBeforeLast4Months, monthBeforeLast5Months, monthBeforeLast6Months, monthBeforeLast7Months, monthBeforeLast8Months, monthBeforeLast9Months, monthBeforeLast10Months }) => {
const queryParams = []; const queryParams = [];