mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2026-09-03 20:52:58 -05:00
Can handle multi-currency balances better.
This commit is contained in:
+43
-14
@@ -45,14 +45,27 @@ class Steam
|
|||||||
if ($cache->has()) {
|
if ($cache->has()) {
|
||||||
return $cache->get(); // @codeCoverageIgnore
|
return $cache->get(); // @codeCoverageIgnore
|
||||||
}
|
}
|
||||||
|
$currencyId = intval($account->getMeta('currency_id'));
|
||||||
$balance = strval(
|
// first part: get all balances in own currency:
|
||||||
$account->transactions()->leftJoin(
|
$nativeBalance = strval(
|
||||||
'transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id'
|
$account->transactions()
|
||||||
)->where('transaction_journals.date', '<=', $date->format('Y-m-d'))->sum('transactions.amount')
|
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||||
|
->where('transaction_journals.date', '<=', $date->format('Y-m-d'))
|
||||||
|
->where('transactions.transaction_currency_id', $currencyId)
|
||||||
|
->sum('transactions.amount')
|
||||||
);
|
);
|
||||||
$virtual = is_null($account->virtual_balance) ? '0' : strval($account->virtual_balance);
|
|
||||||
$balance = bcadd($balance, $virtual);
|
// get all balances in foreign currency:
|
||||||
|
$foreignBalance = strval(
|
||||||
|
$account->transactions()
|
||||||
|
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||||
|
->where('transaction_journals.date', '<=', $date->format('Y-m-d'))
|
||||||
|
->where('transactions.foreign_currency_id', $currencyId)
|
||||||
|
->sum('transactions.foreign_amount')
|
||||||
|
);
|
||||||
|
$balance = bcadd($nativeBalance, $foreignBalance);
|
||||||
|
$virtual = is_null($account->virtual_balance) ? '0' : strval($account->virtual_balance);
|
||||||
|
$balance = bcadd($balance, $virtual);
|
||||||
$cache->store($balance);
|
$cache->store($balance);
|
||||||
|
|
||||||
return $balance;
|
return $balance;
|
||||||
@@ -76,13 +89,26 @@ class Steam
|
|||||||
if ($cache->has()) {
|
if ($cache->has()) {
|
||||||
return $cache->get(); // @codeCoverageIgnore
|
return $cache->get(); // @codeCoverageIgnore
|
||||||
}
|
}
|
||||||
|
$currencyId = intval($account->getMeta('currency_id'));
|
||||||
|
|
||||||
$balance = strval(
|
$nativeBalance = strval(
|
||||||
$account->transactions()->leftJoin(
|
$account->transactions()
|
||||||
'transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id'
|
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||||
)->where('transaction_journals.date', '<=', $date->format('Y-m-d'))->sum('transactions.amount')
|
->where('transaction_journals.date', '<=', $date->format('Y-m-d'))
|
||||||
|
->where('transactions.transaction_currency_id', $currencyId)
|
||||||
|
->sum('transactions.amount')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// get all balances in foreign currency:
|
||||||
|
$foreignBalance = strval(
|
||||||
|
$account->transactions()
|
||||||
|
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||||
|
->where('transaction_journals.date', '<=', $date->format('Y-m-d'))
|
||||||
|
->where('transactions.foreign_currency_id', $currencyId)
|
||||||
|
->sum('transactions.foreign_amount')
|
||||||
|
);
|
||||||
|
$balance = bcadd($nativeBalance, $foreignBalance);
|
||||||
|
|
||||||
$cache->store($balance);
|
$cache->store($balance);
|
||||||
|
|
||||||
return $balance;
|
return $balance;
|
||||||
@@ -128,10 +154,13 @@ class Steam
|
|||||||
->whereNull('transaction_journals.deleted_at')
|
->whereNull('transaction_journals.deleted_at')
|
||||||
->get(['transaction_journals.date', DB::raw('SUM(transactions.amount) AS modified')]);
|
->get(['transaction_journals.date', DB::raw('SUM(transactions.amount) AS modified')]);
|
||||||
$currentBalance = $startBalance;
|
$currentBalance = $startBalance;
|
||||||
|
/** @var Transaction $entry */
|
||||||
foreach ($set as $entry) {
|
foreach ($set as $entry) {
|
||||||
$modified = is_null($entry->modified) ? '0' : strval($entry->modified);
|
$modified = is_null($entry->modified) ? '0' : strval($entry->modified);
|
||||||
$currentBalance = bcadd($currentBalance, $modified);
|
$currentBalance = bcadd($currentBalance, $modified);
|
||||||
$balances[$entry->date] = $currentBalance;
|
$carbon = new Carbon($entry->date);
|
||||||
|
$date = $carbon->format('Y-m-d');
|
||||||
|
$balances[$date] = $currentBalance;
|
||||||
}
|
}
|
||||||
|
|
||||||
$cache->store($balances);
|
$cache->store($balances);
|
||||||
|
|||||||
Reference in New Issue
Block a user