mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-14 15:07:33 +08:00
973 lines
37 KiB
JavaScript
973 lines
37 KiB
JavaScript
import datetimeConstants from '../consts/datetime.js';
|
|
import statisticsConstants from '../consts/statistics.js';
|
|
import userState from '../lib/userstate.js';
|
|
import settings from '../lib/settings.js';
|
|
import utils from '../lib/utils.js';
|
|
|
|
import {
|
|
RESET_STATE,
|
|
|
|
STORE_USER_INFO,
|
|
CLEAR_USER_INFO,
|
|
|
|
STORE_LATEST_EXCHANGE_RATES,
|
|
|
|
LOAD_ACCOUNT_LIST,
|
|
ADD_ACCOUNT_TO_ACCOUNT_LIST,
|
|
SAVE_ACCOUNT_IN_ACCOUNT_LIST,
|
|
CHANGE_ACCOUNT_DISPLAY_ORDER_IN_ACCOUNT_LIST,
|
|
UPDATE_ACCOUNT_VISIBILITY_IN_ACCOUNT_LIST,
|
|
REMOVE_ACCOUNT_FROM_ACCOUNT_LIST,
|
|
UPDATE_ACCOUNT_LIST_INVALID_STATE,
|
|
|
|
LOAD_TRANSACTION_LIST,
|
|
INIT_TRANSACTION_LIST_FILTER,
|
|
UPDATE_TRANSACTION_LIST_FILTER,
|
|
COLLAPSE_MONTH_IN_TRANSACTION_LIST,
|
|
SAVE_TRANSACTION_IN_TRANSACTION_LIST,
|
|
REMOVE_TRANSACTION_FROM_TRANSACTION_LIST,
|
|
UPDATE_TRANSACTION_LIST_INVALID_STATE,
|
|
|
|
LOAD_TRANSACTION_CATEGORY_LIST,
|
|
ADD_CATEGORY_TO_TRANSACTION_CATEGORY_LIST,
|
|
SAVE_CATEGORY_IN_TRANSACTION_CATEGORY_LIST,
|
|
CHANGE_CATEGORY_DISPLAY_ORDER_IN_CATEGORY_LIST,
|
|
UPDATE_CATEGORY_VISIBILITY_IN_TRANSACTION_CATEGORY_LIST,
|
|
REMOVE_CATEGORY_FROM_TRANSACTION_CATEGORYLIST,
|
|
UPDATE_TRANSACTION_CATEGORY_LIST_INVALID_STATE,
|
|
|
|
LOAD_TRANSACTION_TAG_LIST,
|
|
ADD_TAG_TO_TRANSACTION_TAG_LIST,
|
|
SAVE_TAG_IN_TRANSACTION_TAG_LIST,
|
|
CHANGE_TAG_DISPLAY_ORDER_IN_TRANSACTION_TAG_LIST,
|
|
UPDATE_TAG_VISIBILITY_IN_TRANSACTION_TAG_LIST,
|
|
REMOVE_TAG_FROM_TRANSACTION_TAG_LIST,
|
|
UPDATE_TRANSACTION_TAG_LIST_INVALID_STATE,
|
|
|
|
LOAD_TRANSACTION_OVERVIEW,
|
|
UPDATE_TRANSACTION_OVERVIEW_INVALID_STATE,
|
|
|
|
LOAD_TRANSACTION_STATISTICS,
|
|
INIT_TRANSACTION_STATISTICS_FILTER,
|
|
UPDATE_TRANSACTION_STATISTICS_FILTER,
|
|
UPDATE_TRANSACTION_STATISTICS_INVALID_STATE,
|
|
} from './mutations.js';
|
|
|
|
import {
|
|
authorize,
|
|
authorize2FA,
|
|
register,
|
|
logout,
|
|
getCurrentUserProfile,
|
|
updateUserProfile,
|
|
clearUserData,
|
|
clearUserInfoState,
|
|
resetState,
|
|
currentUserNickname,
|
|
currentUserDefaultCurrency,
|
|
currentUserFirstDayOfWeek,
|
|
} from './user.js';
|
|
|
|
import {
|
|
get2FAStatus,
|
|
enable2FA,
|
|
confirmEnable2FA,
|
|
disable2FA,
|
|
regenerate2FARecoveryCode,
|
|
} from './twoFactorAuth.js';
|
|
|
|
import {
|
|
getAllTokens,
|
|
refreshTokenAndRevokeOldToken,
|
|
revokeToken,
|
|
revokeAllTokens,
|
|
} from './token.js';
|
|
|
|
import {
|
|
getLatestExchangeRates,
|
|
exchangeRatesLastUpdateTime,
|
|
getExchangedAmount,
|
|
getExchangeRatesFromLocalStorage,
|
|
setExchangeRatesToLocalStorage,
|
|
clearExchangeRatesFromLocalStorage,
|
|
} from './exchangeRates.js';
|
|
|
|
import {
|
|
loadTransactionOverview
|
|
} from './overview.js';
|
|
|
|
import {
|
|
loadTransactionStatistics,
|
|
initTransactionStatisticsFilter,
|
|
updateTransactionStatisticsFilter
|
|
} from './statistics.js';
|
|
|
|
import {
|
|
loadAllAccounts,
|
|
getAccount,
|
|
saveAccount,
|
|
changeAccountDisplayOrder,
|
|
updateAccountDisplayOrders,
|
|
hideAccount,
|
|
deleteAccount,
|
|
allPlainAccounts,
|
|
allVisiblePlainAccounts,
|
|
allAvailableAccountsCount,
|
|
allVisibleAccountsCount,
|
|
} from './account.js';
|
|
|
|
import {
|
|
initTransactionListFilter,
|
|
updateTransactionListFilter,
|
|
loadTransactions,
|
|
getTransaction,
|
|
saveTransaction,
|
|
deleteTransaction,
|
|
collapseMonthInTransactionList,
|
|
noTransaction,
|
|
hasMoreTransaction,
|
|
fillTransactionObject,
|
|
calculateMonthTotalAmount,
|
|
} from './transaction.js';
|
|
|
|
import {
|
|
loadAllCategories,
|
|
getCategory,
|
|
saveCategory,
|
|
addCategories,
|
|
changeCategoryDisplayOrder,
|
|
updateCategoryDisplayOrders,
|
|
hideCategory,
|
|
deleteCategory,
|
|
} from './transactionCategory.js';
|
|
|
|
import {
|
|
loadAllTags,
|
|
saveTag,
|
|
changeTagDisplayOrder,
|
|
updateTagDisplayOrders,
|
|
hideTag,
|
|
deleteTag,
|
|
} from './transactionTag.js';
|
|
|
|
const stores = {
|
|
strict: !settings.isProduction(),
|
|
state: {
|
|
currentUserInfo: userState.getUserInfo(),
|
|
latestExchangeRates: getExchangeRatesFromLocalStorage(),
|
|
allAccounts: [],
|
|
allAccountsMap: {},
|
|
allCategorizedAccounts: {},
|
|
accountListStateInvalid: true,
|
|
transactionsFilter: {
|
|
dateType: datetimeConstants.allDateRanges.All.type,
|
|
maxTime: 0,
|
|
minTime: 0,
|
|
type: 0,
|
|
categoryId: '0',
|
|
accountId: '0',
|
|
keyword: ''
|
|
},
|
|
transactions: [],
|
|
transactionsNextTimeId: 0,
|
|
transactionListStateInvalid: true,
|
|
allTransactionCategories: {},
|
|
allTransactionCategoriesMap: {},
|
|
transactionCategoryListStateInvalid: true,
|
|
allTransactionTags: [],
|
|
allTransactionTagsMap: {},
|
|
transactionTagListStateInvalid: true,
|
|
transactionOverview: {},
|
|
transactionOverviewStateInvalid: true,
|
|
transactionStatisticsFilter: {
|
|
dateType: statisticsConstants.defaultDataRangeType,
|
|
startTime: 0,
|
|
endTime: 0,
|
|
chartType: statisticsConstants.defaultChartType,
|
|
chartDataType: statisticsConstants.defaultChartDataType,
|
|
filterAccountIds: {},
|
|
filterCategoryIds: {}
|
|
},
|
|
transactionStatistics: [],
|
|
transactionStatisticsStateInvalid: true,
|
|
},
|
|
getters: {
|
|
// user
|
|
currentUserNickname,
|
|
currentUserDefaultCurrency,
|
|
currentUserFirstDayOfWeek,
|
|
|
|
// exchange rates
|
|
exchangeRatesLastUpdateTime,
|
|
getExchangedAmount,
|
|
|
|
// account
|
|
allPlainAccounts,
|
|
allVisiblePlainAccounts,
|
|
allAvailableAccountsCount,
|
|
allVisibleAccountsCount,
|
|
|
|
// transaction
|
|
noTransaction,
|
|
hasMoreTransaction,
|
|
},
|
|
mutations: {
|
|
[RESET_STATE] (state) {
|
|
state.latestExchangeRates = {};
|
|
|
|
state.allAccounts = [];
|
|
state.allAccountsMap = {};
|
|
state.allCategorizedAccounts = {};
|
|
state.accountListStateInvalid = true;
|
|
|
|
state.transactionsFilter.dateType = datetimeConstants.allDateRanges.All.type;
|
|
state.transactionsFilter.maxTime = 0;
|
|
state.transactionsFilter.minTime = 0;
|
|
state.transactionsFilter.type = 0;
|
|
state.transactionsFilter.categoryId = '0';
|
|
state.transactionsFilter.accountId = '0';
|
|
state.transactionsFilter.keyword = '';
|
|
state.transactions = [];
|
|
state.transactionsNextTimeId = 0;
|
|
state.transactionListStateInvalid = true;
|
|
|
|
state.allTransactionCategories = {};
|
|
state.allTransactionCategoriesMap = {};
|
|
state.transactionCategoryListStateInvalid = true;
|
|
|
|
state.allTransactionTags = [];
|
|
state.allTransactionTagsMap = {};
|
|
state.transactionTagListStateInvalid = true;
|
|
|
|
state.transactionOverview = {};
|
|
state.transactionOverviewStateInvalid = true;
|
|
|
|
state.transactionStatisticsFilter.dateType = statisticsConstants.defaultDataRangeType;
|
|
state.transactionStatisticsFilter.startTime = 0;
|
|
state.transactionStatisticsFilter.endTime = 0;
|
|
state.transactionStatisticsFilter.chartType = statisticsConstants.defaultChartType;
|
|
state.transactionStatisticsFilter.chartDataType = statisticsConstants.defaultChartDataType;
|
|
state.transactionStatisticsFilter.filterAccountIds = {};
|
|
state.transactionStatisticsFilter.filterCategoryIds = {};
|
|
state.transactionStatistics = {};
|
|
state.transactionStatisticsStateInvalid = true;
|
|
|
|
clearExchangeRatesFromLocalStorage();
|
|
},
|
|
[STORE_USER_INFO] (state, userInfo) {
|
|
state.currentUserInfo = userInfo;
|
|
userState.updateUserInfo(userInfo);
|
|
},
|
|
[CLEAR_USER_INFO] (state) {
|
|
state.currentUserInfo = null;
|
|
userState.clearUserInfo();
|
|
},
|
|
[STORE_LATEST_EXCHANGE_RATES] (state, latestExchangeRates) {
|
|
state.latestExchangeRates = latestExchangeRates;
|
|
setExchangeRatesToLocalStorage(latestExchangeRates);
|
|
},
|
|
[LOAD_ACCOUNT_LIST] (state, accounts) {
|
|
state.allAccounts = accounts;
|
|
state.allAccountsMap = {};
|
|
|
|
for (let i = 0; i < accounts.length; i++) {
|
|
const account = accounts[i];
|
|
state.allAccountsMap[account.id] = account;
|
|
|
|
if (account.subAccounts) {
|
|
for (let j = 0; j < account.subAccounts.length; j++) {
|
|
const subAccount = account.subAccounts[j];
|
|
state.allAccountsMap[subAccount.id] = subAccount;
|
|
}
|
|
}
|
|
}
|
|
|
|
state.allCategorizedAccounts = utils.getCategorizedAccounts(accounts);
|
|
},
|
|
[ADD_ACCOUNT_TO_ACCOUNT_LIST] (state, account) {
|
|
let insertIndexToAllList = 0;
|
|
|
|
for (let i = 0; i < state.allAccounts.length; i++) {
|
|
if (state.allAccounts[i].category > account.category) {
|
|
insertIndexToAllList = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
state.allAccounts.splice(insertIndexToAllList, 0, account);
|
|
|
|
state.allAccountsMap[account.id] = account;
|
|
|
|
if (account.subAccounts) {
|
|
for (let i = 0; i < account.subAccounts.length; i++) {
|
|
const subAccount = account.subAccounts[i];
|
|
state.allAccountsMap[subAccount.id] = subAccount;
|
|
}
|
|
}
|
|
|
|
if (state.allCategorizedAccounts[account.category]) {
|
|
const accountList = state.allCategorizedAccounts[account.category].accounts;
|
|
accountList.push(account);
|
|
} else {
|
|
state.allCategorizedAccounts = utils.getCategorizedAccounts(state.allAccounts);
|
|
}
|
|
},
|
|
[SAVE_ACCOUNT_IN_ACCOUNT_LIST] (state, account) {
|
|
for (let i = 0; i < state.allAccounts.length; i++) {
|
|
if (state.allAccounts[i].id === account.id) {
|
|
state.allAccounts.splice(i, 1, account);
|
|
break;
|
|
}
|
|
}
|
|
|
|
state.allAccountsMap[account.id] = account;
|
|
|
|
if (account.subAccounts) {
|
|
for (let i = 0; i < account.subAccounts.length; i++) {
|
|
const subAccount = account.subAccounts[i];
|
|
state.allAccountsMap[subAccount.id] = subAccount;
|
|
}
|
|
}
|
|
|
|
if (state.allCategorizedAccounts[account.category]) {
|
|
const accountList = state.allCategorizedAccounts[account.category].accounts;
|
|
|
|
for (let i = 0; i < accountList.length; i++) {
|
|
if (accountList[i].id === account.id) {
|
|
accountList.splice(i, 1, account);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
[CHANGE_ACCOUNT_DISPLAY_ORDER_IN_ACCOUNT_LIST] (state, { account, from, to }) {
|
|
let fromAccount = null;
|
|
let toAccount = null;
|
|
|
|
if (state.allCategorizedAccounts[account.category]) {
|
|
const accountList = state.allCategorizedAccounts[account.category].accounts;
|
|
fromAccount = accountList[from];
|
|
toAccount = accountList[to];
|
|
|
|
accountList.splice(to, 0, accountList.splice(from, 1)[0]);
|
|
}
|
|
|
|
if (fromAccount && toAccount) {
|
|
let globalFromIndex = -1;
|
|
let globalToIndex = -1;
|
|
|
|
for (let i = 0; i < state.allAccounts.length; i++) {
|
|
if (state.allAccounts[i].id === fromAccount.id) {
|
|
globalFromIndex = i;
|
|
} else if (state.allAccounts[i].id === toAccount.id) {
|
|
globalToIndex = i;
|
|
}
|
|
}
|
|
|
|
if (globalFromIndex >= 0 && globalToIndex >= 0) {
|
|
state.allAccounts.splice(globalToIndex, 0, state.allAccounts.splice(globalFromIndex, 1)[0]);
|
|
}
|
|
}
|
|
},
|
|
[UPDATE_ACCOUNT_VISIBILITY_IN_ACCOUNT_LIST] (state, { account, hidden }) {
|
|
if (state.allAccountsMap[account.id]) {
|
|
state.allAccountsMap[account.id].hidden = hidden;
|
|
}
|
|
},
|
|
[REMOVE_ACCOUNT_FROM_ACCOUNT_LIST] (state, account) {
|
|
for (let i = 0; i < state.allAccounts.length; i++) {
|
|
if (state.allAccounts[i].id === account.id) {
|
|
state.allAccounts.splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (state.allAccountsMap[account.id] && state.allAccountsMap[account.id].subAccounts) {
|
|
const subAccounts = state.allAccountsMap[account.id].subAccounts;
|
|
|
|
for (let i = 0; i < subAccounts.length; i++) {
|
|
const subAccount = subAccounts[i];
|
|
if (state.allAccountsMap[subAccount.id]) {
|
|
delete state.allAccountsMap[subAccount.id];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (state.allAccountsMap[account.id]) {
|
|
delete state.allAccountsMap[account.id];
|
|
}
|
|
|
|
if (state.allCategorizedAccounts[account.category]) {
|
|
const accountList = state.allCategorizedAccounts[account.category].accounts;
|
|
|
|
for (let i = 0; i < accountList.length; i++) {
|
|
if (accountList[i].id === account.id) {
|
|
accountList.splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
[UPDATE_ACCOUNT_LIST_INVALID_STATE] (state, invalidState) {
|
|
state.accountListStateInvalid = invalidState;
|
|
},
|
|
[LOAD_TRANSACTION_LIST] (state, { transactions, reload, autoExpand, defaultCurrency }) {
|
|
if (reload) {
|
|
state.transactions = [];
|
|
}
|
|
|
|
if (transactions.items && transactions.items.length) {
|
|
const currentUtcOffset = utils.getTimezoneOffsetMinutes();
|
|
let currentMonthListIndex = -1;
|
|
let currentMonthList = null;
|
|
|
|
for (let i = 0; i < transactions.items.length; i++) {
|
|
const item = transactions.items[i];
|
|
fillTransactionObject(state, item, currentUtcOffset);
|
|
|
|
const transactionTime = utils.parseDateFromUnixTime(item.time, item.utcOffset, currentUtcOffset);
|
|
const transactionYear = utils.getYear(transactionTime);
|
|
const transactionMonth = utils.getMonth(transactionTime);
|
|
const transactionYearMonth = utils.getYearAndMonth(transactionTime);
|
|
|
|
if (currentMonthList && currentMonthList.year === transactionYear && currentMonthList.month === transactionMonth) {
|
|
currentMonthList.items.push(Object.freeze(item));
|
|
continue;
|
|
}
|
|
|
|
for (let j = currentMonthListIndex + 1; j < state.transactions.length; j++) {
|
|
if (state.transactions[j].year === transactionYear && state.transactions[j].month === transactionMonth) {
|
|
currentMonthListIndex = j;
|
|
currentMonthList = state.transactions[j];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!currentMonthList || currentMonthList.year !== transactionYear || currentMonthList.month !== transactionMonth) {
|
|
calculateMonthTotalAmount(state, currentMonthList, defaultCurrency, state.transactionsFilter.accountId, false);
|
|
|
|
state.transactions.push({
|
|
year: transactionYear,
|
|
month: transactionMonth,
|
|
yearMonth: transactionYearMonth,
|
|
opened: autoExpand,
|
|
items: []
|
|
});
|
|
|
|
currentMonthListIndex = state.transactions.length - 1;
|
|
currentMonthList = state.transactions[state.transactions.length - 1];
|
|
}
|
|
|
|
currentMonthList.items.push(Object.freeze(item));
|
|
calculateMonthTotalAmount(state, currentMonthList, defaultCurrency, state.transactionsFilter.accountId, true);
|
|
}
|
|
}
|
|
|
|
if (transactions.nextTimeSequenceId) {
|
|
state.transactionsNextTimeId = transactions.nextTimeSequenceId;
|
|
} else {
|
|
calculateMonthTotalAmount(state, state.transactions[state.transactions.length - 1], defaultCurrency, state.transactionsFilter.accountId, false);
|
|
state.transactionsNextTimeId = -1;
|
|
}
|
|
},
|
|
[INIT_TRANSACTION_LIST_FILTER] (state, filter) {
|
|
if (filter && utils.isNumber(filter.dateType)) {
|
|
state.transactionsFilter.dateType = filter.dateType;
|
|
} else {
|
|
state.transactionsFilter.dateType = datetimeConstants.allDateRanges.All.type;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.maxTime)) {
|
|
state.transactionsFilter.maxTime = filter.maxTime;
|
|
} else {
|
|
state.transactionsFilter.maxTime = 0;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.minTime)) {
|
|
state.transactionsFilter.minTime = filter.minTime;
|
|
} else {
|
|
state.transactionsFilter.minTime = 0;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.type)) {
|
|
state.transactionsFilter.type = filter.type;
|
|
} else {
|
|
state.transactionsFilter.type = 0;
|
|
}
|
|
|
|
if (filter && utils.isString(filter.categoryId)) {
|
|
state.transactionsFilter.categoryId = filter.categoryId;
|
|
} else {
|
|
state.transactionsFilter.categoryId = '0';
|
|
}
|
|
|
|
if (filter && utils.isString(filter.accountId)) {
|
|
state.transactionsFilter.accountId = filter.accountId;
|
|
} else {
|
|
state.transactionsFilter.accountId = '0';
|
|
}
|
|
|
|
if (filter && utils.isString(filter.keyword)) {
|
|
state.transactionsFilter.keyword = filter.keyword;
|
|
} else {
|
|
state.transactionsFilter.keyword = '';
|
|
}
|
|
},
|
|
[UPDATE_TRANSACTION_LIST_FILTER] (state, filter) {
|
|
if (filter && utils.isNumber(filter.dateType)) {
|
|
state.transactionsFilter.dateType = filter.dateType;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.maxTime)) {
|
|
state.transactionsFilter.maxTime = filter.maxTime;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.minTime)) {
|
|
state.transactionsFilter.minTime = filter.minTime;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.type)) {
|
|
state.transactionsFilter.type = filter.type;
|
|
}
|
|
|
|
if (filter && utils.isString(filter.categoryId)) {
|
|
state.transactionsFilter.categoryId = filter.categoryId;
|
|
}
|
|
|
|
if (filter && utils.isString(filter.accountId)) {
|
|
state.transactionsFilter.accountId = filter.accountId;
|
|
}
|
|
|
|
if (filter && utils.isString(filter.keyword)) {
|
|
state.transactionsFilter.keyword = filter.keyword;
|
|
}
|
|
},
|
|
[COLLAPSE_MONTH_IN_TRANSACTION_LIST] (state, { month, collapse }) {
|
|
if (month) {
|
|
month.opened = !collapse;
|
|
}
|
|
},
|
|
[SAVE_TRANSACTION_IN_TRANSACTION_LIST] (state, { transaction, defaultCurrency }) {
|
|
const currentUtcOffset = utils.getTimezoneOffsetMinutes();
|
|
const transactionTime = utils.parseDateFromUnixTime(transaction.time, transaction.utcOffset, currentUtcOffset);
|
|
const transactionYear = utils.getYear(transactionTime);
|
|
const transactionMonth = utils.getMonth(transactionTime);
|
|
|
|
for (let i = 0; i < state.transactions.length; i++) {
|
|
const transactionMonthList = state.transactions[i];
|
|
|
|
if (!transactionMonthList.items) {
|
|
continue;
|
|
}
|
|
|
|
for (let j = 0; j < transactionMonthList.items.length; j++) {
|
|
if (transactionMonthList.items[j].id === transaction.id) {
|
|
fillTransactionObject(state, transaction, currentUtcOffset);
|
|
|
|
if (transactionYear !== transactionMonthList.year ||
|
|
transactionMonth !== transactionMonthList.month ||
|
|
transaction.day !== transactionMonthList.items[j].day) {
|
|
state.transactionListStateInvalid = true;
|
|
return;
|
|
}
|
|
|
|
if ((state.transactionsFilter.categoryId && state.transactionsFilter.categoryId !== '0' && state.transactionsFilter.categoryId !== transaction.categoryId) ||
|
|
(state.transactionsFilter.accountId && state.transactionsFilter.accountId !== '0' && state.transactionsFilter.accountId !== transaction.sourceAccountId && state.transactionsFilter.accountId !== transaction.destinationAccountId)) {
|
|
transactionMonthList.items.splice(j, 1);
|
|
} else {
|
|
transactionMonthList.items.splice(j, 1, transaction);
|
|
}
|
|
|
|
if (transactionMonthList.items.length < 1) {
|
|
state.transactions.splice(i, 1);
|
|
} else {
|
|
calculateMonthTotalAmount(state, transactionMonthList, defaultCurrency, state.transactionsFilter.accountId, i >= state.transactions.length - 1 && state.transactionsNextTimeId > 0);
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
[REMOVE_TRANSACTION_FROM_TRANSACTION_LIST] (state, { transaction, defaultCurrency }) {
|
|
for (let i = 0; i < state.transactions.length; i++) {
|
|
const transactionMonthList = state.transactions[i];
|
|
|
|
if (!transactionMonthList.items ||
|
|
transactionMonthList.items[0].time < transaction.time ||
|
|
transactionMonthList.items[transactionMonthList.items.length - 1].time > transaction.time) {
|
|
continue;
|
|
}
|
|
|
|
for (let j = 0; j < transactionMonthList.items.length; j++) {
|
|
if (transactionMonthList.items[j].id === transaction.id) {
|
|
transactionMonthList.items.splice(j, 1);
|
|
}
|
|
}
|
|
|
|
if (transactionMonthList.items.length < 1) {
|
|
state.transactions.splice(i, 1);
|
|
} else {
|
|
calculateMonthTotalAmount(state, transactionMonthList, defaultCurrency, state.transactionsFilter.accountId, i >= state.transactions.length - 1 && state.transactionsNextTimeId > 0);
|
|
}
|
|
}
|
|
},
|
|
[UPDATE_TRANSACTION_LIST_INVALID_STATE] (state, invalidState) {
|
|
state.transactionListStateInvalid = invalidState;
|
|
},
|
|
[LOAD_TRANSACTION_CATEGORY_LIST] (state, allCategories) {
|
|
state.allTransactionCategories = allCategories;
|
|
state.allTransactionCategoriesMap = {};
|
|
|
|
for (let categoryType in allCategories) {
|
|
if (!Object.prototype.hasOwnProperty.call(allCategories, categoryType)) {
|
|
continue;
|
|
}
|
|
|
|
const categories = allCategories[categoryType];
|
|
|
|
for (let i = 0; i < categories.length; i++) {
|
|
const category = categories[i];
|
|
state.allTransactionCategoriesMap[category.id] = category;
|
|
|
|
for (let j = 0; j < category.subCategories.length; j++) {
|
|
const subCategory = category.subCategories[j];
|
|
state.allTransactionCategoriesMap[subCategory.id] = subCategory;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
[ADD_CATEGORY_TO_TRANSACTION_CATEGORY_LIST] (state, category) {
|
|
let categoryList = null;
|
|
|
|
if (!category.parentId || category.parentId === '0') {
|
|
categoryList = state.allTransactionCategories[category.type];
|
|
} else if (state.allTransactionCategoriesMap[category.parentId]) {
|
|
categoryList = state.allTransactionCategoriesMap[category.parentId].subCategories;
|
|
}
|
|
|
|
if (categoryList) {
|
|
categoryList.push(category);
|
|
}
|
|
|
|
state.allTransactionCategoriesMap[category.id] = category;
|
|
},
|
|
[SAVE_CATEGORY_IN_TRANSACTION_CATEGORY_LIST] (state, category) {
|
|
let categoryList = null;
|
|
|
|
if (!category.parentId || category.parentId === '0') {
|
|
categoryList = state.allTransactionCategories[category.type];
|
|
} else if (state.allTransactionCategoriesMap[category.parentId]) {
|
|
categoryList = state.allTransactionCategoriesMap[category.parentId].subCategories;
|
|
}
|
|
|
|
if (categoryList) {
|
|
for (let i = 0; i < categoryList.length; i++) {
|
|
if (categoryList[i].id === category.id) {
|
|
categoryList.splice(i, 1, category);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
state.allTransactionCategoriesMap[category.id] = category;
|
|
},
|
|
[CHANGE_CATEGORY_DISPLAY_ORDER_IN_CATEGORY_LIST] (state, { category, from, to }) {
|
|
let categoryList = null;
|
|
|
|
if (!category.parentId || category.parentId === '0') {
|
|
categoryList = state.allTransactionCategories[category.type];
|
|
} else if (state.allTransactionCategoriesMap[category.parentId]) {
|
|
categoryList = state.allTransactionCategoriesMap[category.parentId].subCategories;
|
|
}
|
|
|
|
if (categoryList) {
|
|
categoryList.splice(to, 0, categoryList.splice(from, 1)[0]);
|
|
}
|
|
},
|
|
[UPDATE_CATEGORY_VISIBILITY_IN_TRANSACTION_CATEGORY_LIST] (state, { category, hidden }) {
|
|
if (state.allTransactionCategoriesMap[category.id]) {
|
|
state.allTransactionCategoriesMap[category.id].hidden = hidden;
|
|
}
|
|
},
|
|
[REMOVE_CATEGORY_FROM_TRANSACTION_CATEGORYLIST] (state, category) {
|
|
let categoryList = null;
|
|
|
|
if (!category.parentId || category.parentId === '0') {
|
|
categoryList = state.allTransactionCategories[category.type];
|
|
} else if (state.allTransactionCategoriesMap[category.parentId]) {
|
|
categoryList = state.allTransactionCategoriesMap[category.parentId].subCategories;
|
|
}
|
|
|
|
if (categoryList) {
|
|
for (let i = 0; i < categoryList.length; i++) {
|
|
if (categoryList[i].id === category.id) {
|
|
categoryList.splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (state.allTransactionCategoriesMap[category.id] && state.allTransactionCategoriesMap[category.id].subCategories) {
|
|
const subCategories = state.allTransactionCategoriesMap[category.id].subCategories;
|
|
|
|
for (let i = 0; i < subCategories.length; i++) {
|
|
const subCategory = subCategories[i];
|
|
if (state.allTransactionCategoriesMap[subCategory.id]) {
|
|
delete state.allTransactionCategoriesMap[subCategory.id];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (state.allTransactionCategoriesMap[category.id]) {
|
|
delete state.allTransactionCategoriesMap[category.id];
|
|
}
|
|
},
|
|
[UPDATE_TRANSACTION_CATEGORY_LIST_INVALID_STATE] (state, invalidState) {
|
|
state.transactionCategoryListStateInvalid = invalidState;
|
|
},
|
|
[LOAD_TRANSACTION_TAG_LIST] (state, tags) {
|
|
state.allTransactionTags = tags;
|
|
state.allTransactionTagsMap = {};
|
|
|
|
for (let i = 0; i < tags.length; i++) {
|
|
const tag = tags[i];
|
|
state.allTransactionTagsMap[tag.id] = tag;
|
|
}
|
|
},
|
|
[ADD_TAG_TO_TRANSACTION_TAG_LIST] (state, tag) {
|
|
state.allTransactionTags.push(tag);
|
|
state.allTransactionTagsMap[tag.id] = tag;
|
|
},
|
|
[SAVE_TAG_IN_TRANSACTION_TAG_LIST] (state, tag) {
|
|
for (let i = 0; i < state.allTransactionTags.length; i++) {
|
|
if (state.allTransactionTags[i].id === tag.id) {
|
|
state.allTransactionTags.splice(i, 1, tag);
|
|
break;
|
|
}
|
|
}
|
|
|
|
state.allTransactionTagsMap[tag.id] = tag;
|
|
},
|
|
[CHANGE_TAG_DISPLAY_ORDER_IN_TRANSACTION_TAG_LIST] (state, { from, to }) {
|
|
state.allTransactionTags.splice(to, 0, state.allTransactionTags.splice(from, 1)[0]);
|
|
},
|
|
[UPDATE_TAG_VISIBILITY_IN_TRANSACTION_TAG_LIST] (state, { tag, hidden }) {
|
|
if (state.allTransactionTagsMap[tag.id]) {
|
|
state.allTransactionTagsMap[tag.id].hidden = hidden;
|
|
}
|
|
},
|
|
[REMOVE_TAG_FROM_TRANSACTION_TAG_LIST] (state, tag) {
|
|
for (let i = 0; i < state.allTransactionTags.length; i++) {
|
|
if (state.allTransactionTags[i].id === tag.id) {
|
|
state.allTransactionTags.splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (state.allTransactionTagsMap[tag.id]) {
|
|
delete state.allTransactionTagsMap[tag.id];
|
|
}
|
|
},
|
|
[UPDATE_TRANSACTION_TAG_LIST_INVALID_STATE] (state, invalidState) {
|
|
state.transactionTagListStateInvalid = invalidState;
|
|
},
|
|
[LOAD_TRANSACTION_OVERVIEW] (state, transactionOverview) {
|
|
state.transactionOverview = transactionOverview;
|
|
},
|
|
[UPDATE_TRANSACTION_OVERVIEW_INVALID_STATE] (state, invalidState) {
|
|
state.transactionOverviewStateInvalid = invalidState;
|
|
},
|
|
[LOAD_TRANSACTION_STATISTICS] (state, { statistics, defaultCurrency }) {
|
|
if (statistics && statistics.items && statistics.items.length) {
|
|
for (let i = 0; i < statistics.items.length; i++) {
|
|
const item = statistics.items[i];
|
|
|
|
if (item.accountId) {
|
|
item.account = state.allAccountsMap[item.accountId];
|
|
}
|
|
|
|
if (item.account && item.account.parentId !== '0') {
|
|
item.primaryAccount = state.allAccountsMap[item.account.parentId];
|
|
} else {
|
|
item.primaryAccount = item.account;
|
|
}
|
|
|
|
if (item.categoryId) {
|
|
item.category = state.allTransactionCategoriesMap[item.categoryId];
|
|
}
|
|
|
|
if (item.category && item.category.parentId !== '0') {
|
|
item.primaryCategory = state.allTransactionCategoriesMap[item.category.parentId];
|
|
} else {
|
|
item.primaryCategory = item.category;
|
|
}
|
|
|
|
if (item.account && item.account.currency !== defaultCurrency) {
|
|
const amount = getExchangedAmount(state)(item.amount, item.account.currency, defaultCurrency);
|
|
|
|
if (utils.isNumber(amount)) {
|
|
item.amountInDefaultCurrency = Math.floor(amount);
|
|
}
|
|
} else if (item.account && item.account.currency === defaultCurrency) {
|
|
item.amountInDefaultCurrency = item.amount;
|
|
} else {
|
|
item.amountInDefaultCurrency = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
state.transactionStatistics = statistics;
|
|
},
|
|
[INIT_TRANSACTION_STATISTICS_FILTER] (state, filter) {
|
|
if (filter && utils.isNumber(filter.dateType)) {
|
|
state.transactionStatisticsFilter.dateType = filter.dateType;
|
|
} else {
|
|
state.transactionStatisticsFilter.dateType = statisticsConstants.defaultDataRangeType;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.startTime)) {
|
|
state.transactionStatisticsFilter.startTime = filter.startTime;
|
|
} else {
|
|
state.transactionStatisticsFilter.startTime = 0;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.endTime)) {
|
|
state.transactionStatisticsFilter.endTime = filter.endTime;
|
|
} else {
|
|
state.transactionStatisticsFilter.endTime = 0;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.chartType)) {
|
|
state.transactionStatisticsFilter.chartType = filter.chartType;
|
|
} else {
|
|
state.transactionStatisticsFilter.chartType = statisticsConstants.defaultChartType;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.chartDataType)) {
|
|
state.transactionStatisticsFilter.chartDataType = filter.chartDataType;
|
|
} else {
|
|
state.transactionStatisticsFilter.chartDataType = statisticsConstants.defaultChartDataType;
|
|
}
|
|
|
|
if (filter && utils.isObject(filter.filterAccountIds)) {
|
|
state.transactionStatisticsFilter.filterAccountIds = filter.filterAccountIds;
|
|
} else {
|
|
state.transactionStatisticsFilter.filterAccountIds = {};
|
|
}
|
|
|
|
if (filter && utils.isObject(filter.filterCategoryIds)) {
|
|
state.transactionStatisticsFilter.filterCategoryIds = filter.filterCategoryIds;
|
|
} else {
|
|
state.transactionStatisticsFilter.filterCategoryIds = {};
|
|
}
|
|
},
|
|
[UPDATE_TRANSACTION_STATISTICS_FILTER] (state, filter) {
|
|
if (filter && utils.isNumber(filter.dateType)) {
|
|
state.transactionStatisticsFilter.dateType = filter.dateType;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.startTime)) {
|
|
state.transactionStatisticsFilter.startTime = filter.startTime;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.endTime)) {
|
|
state.transactionStatisticsFilter.endTime = filter.endTime;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.chartType)) {
|
|
state.transactionStatisticsFilter.chartType = filter.chartType;
|
|
}
|
|
|
|
if (filter && utils.isNumber(filter.chartDataType)) {
|
|
state.transactionStatisticsFilter.chartDataType = filter.chartDataType;
|
|
}
|
|
|
|
if (filter && utils.isObject(filter.filterAccountIds)) {
|
|
state.transactionStatisticsFilter.filterAccountIds = filter.filterAccountIds;
|
|
}
|
|
|
|
if (filter && utils.isObject(filter.filterCategoryIds)) {
|
|
state.transactionStatisticsFilter.filterCategoryIds = filter.filterCategoryIds;
|
|
}
|
|
},
|
|
[UPDATE_TRANSACTION_STATISTICS_INVALID_STATE] (state, invalidState) {
|
|
state.transactionStatisticsStateInvalid = invalidState;
|
|
},
|
|
},
|
|
actions: {
|
|
// user
|
|
authorize,
|
|
authorize2FA,
|
|
register,
|
|
logout,
|
|
getCurrentUserProfile,
|
|
updateUserProfile,
|
|
clearUserData,
|
|
clearUserInfoState,
|
|
resetState,
|
|
|
|
// 2fa
|
|
get2FAStatus,
|
|
enable2FA,
|
|
confirmEnable2FA,
|
|
disable2FA,
|
|
regenerate2FARecoveryCode,
|
|
|
|
// token
|
|
getAllTokens,
|
|
refreshTokenAndRevokeOldToken,
|
|
revokeToken,
|
|
revokeAllTokens,
|
|
|
|
// exchange rates
|
|
getLatestExchangeRates,
|
|
|
|
// overview
|
|
loadTransactionOverview,
|
|
|
|
// statistics
|
|
loadTransactionStatistics,
|
|
initTransactionStatisticsFilter,
|
|
updateTransactionStatisticsFilter,
|
|
|
|
// account
|
|
loadAllAccounts,
|
|
saveAccount,
|
|
getAccount,
|
|
changeAccountDisplayOrder,
|
|
updateAccountDisplayOrders,
|
|
hideAccount,
|
|
deleteAccount,
|
|
|
|
// transaction
|
|
initTransactionListFilter,
|
|
updateTransactionListFilter,
|
|
loadTransactions,
|
|
getTransaction,
|
|
saveTransaction,
|
|
deleteTransaction,
|
|
collapseMonthInTransactionList,
|
|
|
|
// transaction category
|
|
loadAllCategories,
|
|
getCategory,
|
|
saveCategory,
|
|
addCategories,
|
|
changeCategoryDisplayOrder,
|
|
updateCategoryDisplayOrders,
|
|
hideCategory,
|
|
deleteCategory,
|
|
|
|
// transaction tag
|
|
loadAllTags,
|
|
saveTag,
|
|
changeTagDisplayOrder,
|
|
updateTagDisplayOrders,
|
|
hideTag,
|
|
deleteTag,
|
|
}
|
|
};
|
|
|
|
export default stores;
|