2020-10-31 20:30:02 +00:00
|
|
|
import { Module, MutationTree, ActionTree, GetterTree } from 'vuex';
|
2021-01-31 19:40:18 +00:00
|
|
|
//import store, { StateInterface } from 'src/store';
|
2021-01-29 22:03:05 +00:00
|
|
|
import store, { StateInterface } from 'src/store';
|
2020-10-31 20:30:02 +00:00
|
|
|
import { axios } from 'src/boot/axios';
|
|
|
|
import { AxiosResponse } from 'axios';
|
|
|
|
|
|
|
|
interface BalanceResponse {
|
|
|
|
balance: number;
|
|
|
|
credit: number;
|
|
|
|
debit: number;
|
|
|
|
}
|
|
|
|
|
2021-01-29 22:29:38 +00:00
|
|
|
export interface BalancesResponse extends BalanceResponse {
|
|
|
|
userid: string;
|
|
|
|
}
|
|
|
|
|
2021-01-29 19:11:13 +00:00
|
|
|
export interface TransactionsResponse {
|
|
|
|
transactions: Array<FG.Transaction>;
|
|
|
|
count?: number;
|
|
|
|
}
|
|
|
|
|
2021-01-21 13:24:46 +00:00
|
|
|
export interface UserBalance extends BalanceResponse {
|
|
|
|
limit: number | null;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface BalanceInterface {
|
|
|
|
balances: Map<string, UserBalance>;
|
|
|
|
shortcuts: Array<number>;
|
2021-01-27 01:40:24 +00:00
|
|
|
transactions: Array<FG.Transaction>;
|
2020-11-15 13:18:28 +00:00
|
|
|
loading: number;
|
2020-10-31 20:30:02 +00:00
|
|
|
}
|
|
|
|
|
2021-01-31 19:40:18 +00:00
|
|
|
//export interface StateInterfaceBalance extends StateInterface {
|
|
|
|
export interface StateInterfaceBalance {
|
2021-01-21 13:24:46 +00:00
|
|
|
balance: BalanceInterface;
|
|
|
|
}
|
|
|
|
|
2020-10-31 20:30:02 +00:00
|
|
|
const state: BalanceInterface = {
|
2021-01-21 13:24:46 +00:00
|
|
|
balances: new Map<string, UserBalance>(),
|
|
|
|
shortcuts: [],
|
2021-01-27 01:40:24 +00:00
|
|
|
transactions: [],
|
2021-01-30 10:23:18 +00:00
|
|
|
loading: 0,
|
2020-10-31 20:30:02 +00:00
|
|
|
};
|
|
|
|
|
2021-01-29 01:29:27 +00:00
|
|
|
function fixTransaction(t: FG.Transaction) {
|
|
|
|
t.time = new Date(t.time);
|
|
|
|
}
|
|
|
|
|
2020-10-31 20:30:02 +00:00
|
|
|
const mutations: MutationTree<BalanceInterface> = {
|
2021-01-21 13:24:46 +00:00
|
|
|
setBalance(state, data: { userid: string; balance: BalanceResponse }) {
|
|
|
|
state.balances.set(
|
|
|
|
data.userid,
|
|
|
|
Object.assign({ limit: state.balances.get(data.userid)?.limit || null }, data.balance)
|
|
|
|
);
|
2020-10-31 20:30:02 +00:00
|
|
|
},
|
2021-01-21 13:24:46 +00:00
|
|
|
changeBalance(state, data: { userid: string; amount: number }) {
|
|
|
|
const user = <UserBalance>state.balances.get(data.userid);
|
|
|
|
if (data.amount < 0) user.debit += data.amount;
|
|
|
|
else user.credit += data.amount;
|
|
|
|
user.balance += data.amount;
|
2020-10-31 20:30:02 +00:00
|
|
|
},
|
2021-01-21 13:24:46 +00:00
|
|
|
setLimit(state, data: { userid: string; limit: number | null }) {
|
|
|
|
if (state.balances.has(data.userid))
|
|
|
|
(<UserBalance>state.balances.get(data.userid)).limit = data.limit;
|
|
|
|
else state.balances.set(data.userid, { balance: 0, debit: 0, credit: 0, limit: data.limit });
|
2020-11-15 13:18:28 +00:00
|
|
|
},
|
|
|
|
setLoading(state, data = true) {
|
|
|
|
if (data) state.loading += 1;
|
|
|
|
else state.loading -= 1;
|
2021-01-21 13:24:46 +00:00
|
|
|
},
|
|
|
|
setShortcuts(state, data: Array<number>) {
|
2021-01-21 23:17:03 +00:00
|
|
|
state.shortcuts.splice(0, state.shortcuts.length, ...data);
|
2021-01-27 01:40:24 +00:00
|
|
|
},
|
|
|
|
addTransaction(state, data: FG.Transaction) {
|
|
|
|
state.transactions.push(data);
|
|
|
|
},
|
2021-01-29 01:29:27 +00:00
|
|
|
addTransactions(state, data: [FG.Transaction]) {
|
2021-01-30 10:23:18 +00:00
|
|
|
data.forEach((transaction) => {
|
|
|
|
if (!state.transactions.find((t) => t.id == transaction.id)) {
|
|
|
|
state.transactions.push(transaction);
|
|
|
|
}
|
|
|
|
});
|
2021-01-29 01:29:27 +00:00
|
|
|
state.transactions.sort((a, b) => (a.time <= b.time ? -1 : 1));
|
|
|
|
},
|
2021-01-27 01:40:24 +00:00
|
|
|
reverseTransaction(state, data: { transaction: FG.Transaction; reversal: FG.Transaction }) {
|
2021-01-30 10:23:18 +00:00
|
|
|
const idx = state.transactions.findIndex((value) => value.id === data.transaction.id);
|
2021-01-29 03:38:20 +00:00
|
|
|
data.transaction.reversal_id = data.reversal.id;
|
2021-01-27 01:40:24 +00:00
|
|
|
if (idx > -1) state.transactions[idx] = data.transaction;
|
|
|
|
else state.transactions.push(data.transaction);
|
2021-01-30 10:23:18 +00:00
|
|
|
},
|
2020-10-31 20:30:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
const actions: ActionTree<BalanceInterface, StateInterface> = {
|
2021-01-31 19:40:18 +00:00
|
|
|
//const actions: ActionTree<BalanceInterface, any> = {
|
2021-01-21 23:17:03 +00:00
|
|
|
addShortcut({ commit, state, rootState }, shortcut) {
|
|
|
|
const sc = [...state.shortcuts, shortcut];
|
2021-01-29 03:38:20 +00:00
|
|
|
sc.sort();
|
2021-01-21 23:17:03 +00:00
|
|
|
|
|
|
|
const user = <FG.User>rootState.user.currentUser;
|
|
|
|
return axios.put(`/users/${user.userid}/balance/shortcuts`, sc).then(() => {
|
|
|
|
commit('setShortcuts', sc);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
removeShortcut({ commit, state, rootState }, shortcut) {
|
|
|
|
const sc = state.shortcuts.filter((value: number) => value != shortcut);
|
|
|
|
|
|
|
|
const user = <FG.User>rootState.user.currentUser;
|
|
|
|
return axios.put(`/users/${user.userid}/balance/shortcuts`, sc).then(() => {
|
|
|
|
commit('setShortcuts', sc);
|
|
|
|
});
|
|
|
|
},
|
2021-01-21 13:24:46 +00:00
|
|
|
getShortcuts({ commit, state, rootState }, force = false) {
|
|
|
|
if (force || state.shortcuts.length == 0) {
|
|
|
|
commit('setLoading');
|
|
|
|
const user = <FG.User>rootState.user.currentUser;
|
|
|
|
return axios
|
|
|
|
.get(`/users/${user.userid}/balance/shortcuts`)
|
|
|
|
.then(({ data }: AxiosResponse<BalanceResponse>) => {
|
|
|
|
commit('setShortcuts', data);
|
|
|
|
return data;
|
|
|
|
})
|
|
|
|
.finally(() => commit('setLoading', false));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
getBalance({ commit, rootState }, user: FG.User | undefined = undefined) {
|
2020-11-15 13:18:28 +00:00
|
|
|
commit('setLoading');
|
2021-01-21 13:24:46 +00:00
|
|
|
if (!user) user = <FG.User>rootState.user.currentUser;
|
|
|
|
return axios
|
|
|
|
.get(`/users/${user.userid}/balance`)
|
2020-10-31 20:30:02 +00:00
|
|
|
.then(({ data }: AxiosResponse<BalanceResponse>) => {
|
2021-01-21 13:24:46 +00:00
|
|
|
commit('setBalance', { userid: user?.userid, balance: data });
|
|
|
|
return data;
|
2020-11-15 13:18:28 +00:00
|
|
|
})
|
|
|
|
.finally(() => commit('setLoading', false));
|
2020-10-31 20:30:02 +00:00
|
|
|
},
|
2021-01-29 22:29:38 +00:00
|
|
|
getBalances() {
|
|
|
|
return axios.get('/balance').then(({ data }: AxiosResponse<Array<BalancesResponse>>) => {
|
|
|
|
return data;
|
|
|
|
});
|
|
|
|
},
|
2021-01-29 01:29:27 +00:00
|
|
|
getTransactions(
|
|
|
|
{ commit, rootState },
|
|
|
|
payload: {
|
|
|
|
userid?: string;
|
2021-01-29 20:05:03 +00:00
|
|
|
filter?: {
|
|
|
|
limit?: number;
|
|
|
|
offset?: number;
|
|
|
|
from?: Date;
|
|
|
|
to?: Date;
|
|
|
|
showReversals?: boolean;
|
|
|
|
showCancelled?: boolean;
|
|
|
|
};
|
2021-01-29 01:29:27 +00:00
|
|
|
}
|
|
|
|
) {
|
|
|
|
commit('setLoading');
|
|
|
|
if (!payload.userid) payload.userid = (<FG.User>rootState.user.currentUser).userid;
|
|
|
|
if (!payload.filter) payload.filter = { limit: 10 };
|
|
|
|
return axios
|
|
|
|
.get(`/users/${payload.userid}/balance/transactions`, { params: payload.filter || {} })
|
2021-01-29 19:11:13 +00:00
|
|
|
.then(({ data }: AxiosResponse<TransactionsResponse>) => {
|
2021-01-30 10:23:18 +00:00
|
|
|
data.transactions.forEach((t) => fixTransaction(t));
|
2021-01-29 19:11:13 +00:00
|
|
|
commit('addTransactions', data.transactions);
|
2021-01-29 01:29:27 +00:00
|
|
|
return data;
|
|
|
|
})
|
|
|
|
.finally(() => commit('setLoading', false));
|
|
|
|
},
|
2020-11-15 13:18:28 +00:00
|
|
|
getLimit({ rootState, commit }) {
|
|
|
|
commit('setLoading');
|
2020-10-31 20:30:02 +00:00
|
|
|
axios
|
2020-11-04 22:53:10 +00:00
|
|
|
/* eslint-disable-next-line @typescript-eslint/restrict-template-expressions */
|
|
|
|
.get(`/users/${rootState.user.currentUser?.userid}/balance/limit`)
|
2020-10-31 20:30:02 +00:00
|
|
|
.then(({ data }) => {
|
|
|
|
console.log(data);
|
|
|
|
})
|
2021-01-30 10:23:18 +00:00
|
|
|
.catch((err) => {
|
2020-10-31 20:30:02 +00:00
|
|
|
console.warn(err);
|
2020-11-15 13:18:28 +00:00
|
|
|
})
|
|
|
|
.finally(() => commit('setLoading', false));
|
2020-10-31 20:30:02 +00:00
|
|
|
},
|
2021-01-27 01:40:24 +00:00
|
|
|
revert({ dispatch, commit }, transaction: FG.Transaction) {
|
|
|
|
return axios
|
|
|
|
.delete(`/balance/${transaction.id}`)
|
2021-01-29 01:29:27 +00:00
|
|
|
.then(({ data }: AxiosResponse<FG.Transaction>) => {
|
|
|
|
fixTransaction(data);
|
|
|
|
commit('reverseTransaction', { transaction: transaction, reversal: data });
|
2021-01-30 10:23:18 +00:00
|
|
|
dispatch('getBalance').catch((err) => console.warn(err));
|
2021-01-27 01:40:24 +00:00
|
|
|
});
|
2021-01-21 13:24:46 +00:00
|
|
|
},
|
2021-01-29 22:03:05 +00:00
|
|
|
changeBalance(
|
|
|
|
{ dispatch, commit, rootState },
|
|
|
|
data: { amount: number; user: string; sender?: string }
|
|
|
|
) {
|
2020-11-15 13:18:28 +00:00
|
|
|
commit('setLoading');
|
2021-01-21 13:24:46 +00:00
|
|
|
return axios
|
|
|
|
.put(`/users/${data.user}/balance`, data)
|
|
|
|
.then((response: AxiosResponse<FG.Transaction>) => {
|
2021-01-27 01:40:24 +00:00
|
|
|
const transaction = response.data;
|
2021-01-29 01:29:27 +00:00
|
|
|
fixTransaction(transaction);
|
2021-01-29 22:03:05 +00:00
|
|
|
if (
|
|
|
|
data.user == rootState.user.currentUser?.userid ||
|
|
|
|
data.sender === rootState.user.currentUser?.userid
|
|
|
|
)
|
|
|
|
commit('addTransaction', transaction);
|
2021-01-21 13:24:46 +00:00
|
|
|
commit(state.balances.has(data.user) ? 'changeBalance' : 'setBalance', {
|
|
|
|
userid: data.user,
|
2021-01-30 10:23:18 +00:00
|
|
|
amount: data.amount,
|
2021-01-21 13:24:46 +00:00
|
|
|
});
|
|
|
|
if (data.sender)
|
|
|
|
commit(state.balances.has(data.sender) ? 'changeBalance' : 'setBalance', {
|
|
|
|
userid: data.sender,
|
2021-01-30 10:23:18 +00:00
|
|
|
amount: -1 * data.amount,
|
2021-01-21 13:24:46 +00:00
|
|
|
});
|
2021-01-27 01:40:24 +00:00
|
|
|
return transaction;
|
2020-10-31 20:30:02 +00:00
|
|
|
})
|
2021-01-30 10:23:18 +00:00
|
|
|
.catch((err) => {
|
2021-01-27 01:40:24 +00:00
|
|
|
console.debug(err);
|
2021-01-21 13:24:46 +00:00
|
|
|
// Maybe Balance changed
|
2021-01-29 01:29:27 +00:00
|
|
|
void dispatch('getTransactions', {});
|
2021-01-27 01:40:24 +00:00
|
|
|
return dispatch('getBalance', data.sender ? data.sender : data.user);
|
2020-10-31 20:30:02 +00:00
|
|
|
})
|
2020-11-15 13:18:28 +00:00
|
|
|
.finally(() => commit('setLoading', false));
|
2021-01-30 10:23:18 +00:00
|
|
|
},
|
2020-10-31 20:30:02 +00:00
|
|
|
};
|
|
|
|
|
2021-01-31 19:40:18 +00:00
|
|
|
const getters: GetterTree<BalanceInterface, StateInterface> = {
|
|
|
|
balances: ({ balances }) => {
|
|
|
|
return balances;
|
|
|
|
},
|
|
|
|
shortcuts: ({ shortcuts }) => {
|
|
|
|
return shortcuts;
|
|
|
|
},
|
|
|
|
transactions: ({ transactions }) => {
|
|
|
|
return transactions;
|
|
|
|
},
|
|
|
|
};
|
2020-10-31 20:30:02 +00:00
|
|
|
|
|
|
|
const balance: Module<BalanceInterface, StateInterface> = {
|
|
|
|
namespaced: true,
|
|
|
|
state,
|
|
|
|
mutations,
|
|
|
|
actions,
|
2021-01-30 10:23:18 +00:00
|
|
|
getters,
|
2020-10-31 20:30:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export default balance;
|