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
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
+29 -13
View File
@@ -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
}
+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('&') : ''));
},
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 = [];