Skip to content
Snippets Groups Projects
Unverified Commit fc6eb4be authored by Neil's avatar Neil Committed by GitHub
Browse files

Add transfers to CashFlow Report (#1311)

parent a3e3c78c
No related branches found
No related tags found
No related merge requests found
......@@ -87,7 +87,7 @@ function CashFlow() {
return null;
}
const { graphData, totalExpenses, totalIncome } = data;
const { graphData, totalExpenses, totalIncome, totalTransfers } = data;
return (
<View style={[styles.page, { minWidth: 650, overflow: 'hidden' }]}>
......@@ -142,8 +142,18 @@ function CashFlow() {
</Text>
}
/>
<AlignedText
style={{ marginBottom: 5, minWidth: 160 }}
left={<Block>Transfers:</Block>}
right={
<Text style={{ fontWeight: 600 }}>
{integerToCurrency(totalTransfers)}
</Text>
}
/>
<Text style={{ fontWeight: 600 }}>
<Change amount={totalIncome + totalExpenses} />
<Change amount={totalIncome + totalExpenses + totalTransfers} />
</Text>
</View>
......
......@@ -8,7 +8,7 @@ import * as monthUtils from 'loot-core/src/shared/months';
import { integerToCurrency, integerToAmount } from 'loot-core/src/shared/util';
import { AlignedText } from '../../common';
import { fromDateRepr, fromDateReprToDay, runAll, index } from '../util';
import { runAll, indexCashFlow } from '../util';
export function simpleCashFlow(start, end) {
return async (spreadsheet, setData) => {
......@@ -68,26 +68,25 @@ export function cashFlowByDate(
{ date: { $transform: '$month', $lte: end } },
],
'account.offbudget': false,
$or: [
{
'payee.transfer_acct.offbudget': true,
'payee.transfer_acct': null,
},
],
});
if (isConcise) {
return query
.groupBy({ $month: '$date' })
.groupBy([{ $month: '$date' }, 'payee.transfer_acct'])
.select([
{ date: { $month: '$date' } },
{ isTransfer: 'payee.transfer_acct' },
{ amount: { $sum: '$amount' } },
]);
}
return query
.groupBy('date')
.select(['date', { amount: { $sum: '$amount' } }]);
.groupBy(['date', 'payee.transfer_acct'])
.select([
'date',
{ isTransfer: 'payee.transfer_acct' },
{ amount: { $sum: '$amount' } },
]);
}
return runAll(
......@@ -111,41 +110,46 @@ export function cashFlowByDate(
function recalculate(data, start, end, isConcise) {
let [startingBalance, income, expense] = data;
let convIncome = income.map(t => {
return { ...t, isTransfer: t.isTransfer !== null };
});
let convExpense = expense.map(t => {
return { ...t, isTransfer: t.isTransfer !== null };
});
const dates = isConcise
? monthUtils.rangeInclusive(
monthUtils.getMonth(start),
monthUtils.getMonth(end),
)
: monthUtils.dayRangeInclusive(start, end);
const incomes = index(
income,
'date',
isConcise ? fromDateRepr : fromDateReprToDay,
);
const expenses = index(
expense,
'date',
isConcise ? fromDateRepr : fromDateReprToDay,
);
const incomes = indexCashFlow(convIncome, 'date', 'isTransfer');
const expenses = indexCashFlow(convExpense, 'date', 'isTransfer');
let balance = startingBalance;
let totalExpenses = 0;
let totalIncome = 0;
let totalTransfers = 0;
const graphData = dates.reduce(
(res, date) => {
let income = 0;
let expense = 0;
let creditTransfers = 0;
let debitTransfers = 0;
if (incomes[date]) {
income = incomes[date].amount;
income = !incomes[date].false ? 0 : incomes[date].false;
creditTransfers = !incomes[date].true ? 0 : incomes[date].true;
}
if (expenses[date]) {
expense = expenses[date].amount;
expense = !expenses[date].false ? 0 : expenses[date].false;
debitTransfers = !expenses[date].true ? 0 : expenses[date].true;
}
totalExpenses += expense;
totalIncome += income;
balance += income + expense;
balance += income + expense + creditTransfers + debitTransfers;
totalTransfers += creditTransfers + debitTransfers;
const x = d.parseISO(date);
const label = (
......@@ -162,6 +166,12 @@ function recalculate(data, start, end, isConcise) {
left="Change:"
right={<strong>{integerToCurrency(income + expense)}</strong>}
/>
{creditTransfers + debitTransfers !== 0 && (
<AlignedText
left="Transfers:"
right={integerToCurrency(creditTransfers + debitTransfers)}
/>
)}
<AlignedText left="Balance:" right={integerToCurrency(balance)} />
</div>
</div>
......@@ -187,6 +197,7 @@ function recalculate(data, start, end, isConcise) {
balance: balances[balances.length - 1].amount,
totalExpenses,
totalIncome,
totalTransfers,
totalChange: balances[balances.length - 1].amount - balances[0].amount,
};
}
......@@ -4,10 +4,6 @@ export function fromDateRepr(date) {
return date.slice(0, 7);
}
export function fromDateReprToDay(date) {
return date;
}
export async function runAll(queries, cb) {
let data = await Promise.all(
queries.map(q => {
......@@ -24,3 +20,17 @@ export function index(data, field, mapper) {
});
return result;
}
export function indexCashFlow(data, date, isTransfer) {
const results = {};
data.forEach(item => {
let findExisting = results[item.date]
? results[item.date][item.xfer]
? results[item.date][item.xfer]
: 0
: 0;
let result = { [item[isTransfer]]: item.amount + findExisting };
results[item[date]] = { ...results[item[date]], ...result };
});
return results;
}
---
category: Bugfix
authors: [carkom]
---
The cashflow report filters out transfers which makes the ending balance inaccurate (and variable depending on when the tranfers land). I've added transfers into the report and split them out from the totals.
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment