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() { ...@@ -87,7 +87,7 @@ function CashFlow() {
return null; return null;
} }
const { graphData, totalExpenses, totalIncome } = data; const { graphData, totalExpenses, totalIncome, totalTransfers } = data;
return ( return (
<View style={[styles.page, { minWidth: 650, overflow: 'hidden' }]}> <View style={[styles.page, { minWidth: 650, overflow: 'hidden' }]}>
...@@ -142,8 +142,18 @@ function CashFlow() { ...@@ -142,8 +142,18 @@ function CashFlow() {
</Text> </Text>
} }
/> />
<AlignedText
style={{ marginBottom: 5, minWidth: 160 }}
left={<Block>Transfers:</Block>}
right={
<Text style={{ fontWeight: 600 }}>
{integerToCurrency(totalTransfers)}
</Text>
}
/>
<Text style={{ fontWeight: 600 }}> <Text style={{ fontWeight: 600 }}>
<Change amount={totalIncome + totalExpenses} /> <Change amount={totalIncome + totalExpenses + totalTransfers} />
</Text> </Text>
</View> </View>
......
...@@ -8,7 +8,7 @@ import * as monthUtils from 'loot-core/src/shared/months'; ...@@ -8,7 +8,7 @@ import * as monthUtils from 'loot-core/src/shared/months';
import { integerToCurrency, integerToAmount } from 'loot-core/src/shared/util'; import { integerToCurrency, integerToAmount } from 'loot-core/src/shared/util';
import { AlignedText } from '../../common'; import { AlignedText } from '../../common';
import { fromDateRepr, fromDateReprToDay, runAll, index } from '../util'; import { runAll, indexCashFlow } from '../util';
export function simpleCashFlow(start, end) { export function simpleCashFlow(start, end) {
return async (spreadsheet, setData) => { return async (spreadsheet, setData) => {
...@@ -68,26 +68,25 @@ export function cashFlowByDate( ...@@ -68,26 +68,25 @@ export function cashFlowByDate(
{ date: { $transform: '$month', $lte: end } }, { date: { $transform: '$month', $lte: end } },
], ],
'account.offbudget': false, 'account.offbudget': false,
$or: [
{
'payee.transfer_acct.offbudget': true,
'payee.transfer_acct': null,
},
],
}); });
if (isConcise) { if (isConcise) {
return query return query
.groupBy({ $month: '$date' }) .groupBy([{ $month: '$date' }, 'payee.transfer_acct'])
.select([ .select([
{ date: { $month: '$date' } }, { date: { $month: '$date' } },
{ isTransfer: 'payee.transfer_acct' },
{ amount: { $sum: '$amount' } }, { amount: { $sum: '$amount' } },
]); ]);
} }
return query return query
.groupBy('date') .groupBy(['date', 'payee.transfer_acct'])
.select(['date', { amount: { $sum: '$amount' } }]); .select([
'date',
{ isTransfer: 'payee.transfer_acct' },
{ amount: { $sum: '$amount' } },
]);
} }
return runAll( return runAll(
...@@ -111,41 +110,46 @@ export function cashFlowByDate( ...@@ -111,41 +110,46 @@ export function cashFlowByDate(
function recalculate(data, start, end, isConcise) { function recalculate(data, start, end, isConcise) {
let [startingBalance, income, expense] = data; 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 const dates = isConcise
? monthUtils.rangeInclusive( ? monthUtils.rangeInclusive(
monthUtils.getMonth(start), monthUtils.getMonth(start),
monthUtils.getMonth(end), monthUtils.getMonth(end),
) )
: monthUtils.dayRangeInclusive(start, end); : monthUtils.dayRangeInclusive(start, end);
const incomes = index( const incomes = indexCashFlow(convIncome, 'date', 'isTransfer');
income, const expenses = indexCashFlow(convExpense, 'date', 'isTransfer');
'date',
isConcise ? fromDateRepr : fromDateReprToDay,
);
const expenses = index(
expense,
'date',
isConcise ? fromDateRepr : fromDateReprToDay,
);
let balance = startingBalance; let balance = startingBalance;
let totalExpenses = 0; let totalExpenses = 0;
let totalIncome = 0; let totalIncome = 0;
let totalTransfers = 0;
const graphData = dates.reduce( const graphData = dates.reduce(
(res, date) => { (res, date) => {
let income = 0; let income = 0;
let expense = 0; let expense = 0;
let creditTransfers = 0;
let debitTransfers = 0;
if (incomes[date]) { 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]) { 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; totalExpenses += expense;
totalIncome += income; totalIncome += income;
balance += income + expense; balance += income + expense + creditTransfers + debitTransfers;
totalTransfers += creditTransfers + debitTransfers;
const x = d.parseISO(date); const x = d.parseISO(date);
const label = ( const label = (
...@@ -162,6 +166,12 @@ function recalculate(data, start, end, isConcise) { ...@@ -162,6 +166,12 @@ function recalculate(data, start, end, isConcise) {
left="Change:" left="Change:"
right={<strong>{integerToCurrency(income + expense)}</strong>} right={<strong>{integerToCurrency(income + expense)}</strong>}
/> />
{creditTransfers + debitTransfers !== 0 && (
<AlignedText
left="Transfers:"
right={integerToCurrency(creditTransfers + debitTransfers)}
/>
)}
<AlignedText left="Balance:" right={integerToCurrency(balance)} /> <AlignedText left="Balance:" right={integerToCurrency(balance)} />
</div> </div>
</div> </div>
...@@ -187,6 +197,7 @@ function recalculate(data, start, end, isConcise) { ...@@ -187,6 +197,7 @@ function recalculate(data, start, end, isConcise) {
balance: balances[balances.length - 1].amount, balance: balances[balances.length - 1].amount,
totalExpenses, totalExpenses,
totalIncome, totalIncome,
totalTransfers,
totalChange: balances[balances.length - 1].amount - balances[0].amount, totalChange: balances[balances.length - 1].amount - balances[0].amount,
}; };
} }
...@@ -4,10 +4,6 @@ export function fromDateRepr(date) { ...@@ -4,10 +4,6 @@ export function fromDateRepr(date) {
return date.slice(0, 7); return date.slice(0, 7);
} }
export function fromDateReprToDay(date) {
return date;
}
export async function runAll(queries, cb) { export async function runAll(queries, cb) {
let data = await Promise.all( let data = await Promise.all(
queries.map(q => { queries.map(q => {
...@@ -24,3 +20,17 @@ export function index(data, field, mapper) { ...@@ -24,3 +20,17 @@ export function index(data, field, mapper) {
}); });
return result; 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