mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2026-06-09 03:44:57 +00:00
This commit is contained in:
@@ -53,29 +53,28 @@ class AccountBalanceCalculator
|
||||
|
||||
return '0';
|
||||
}
|
||||
$query = Transaction::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||
->whereNull('transactions.deleted_at')
|
||||
->where('transactions.transaction_currency_id', $currencyId)
|
||||
->whereNull('transaction_journals.deleted_at')
|
||||
$query = Transaction::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||
->whereNull('transactions.deleted_at')
|
||||
->where('transactions.transaction_currency_id', $currencyId)
|
||||
->whereNull('transaction_journals.deleted_at')
|
||||
// this order is the same as GroupCollector
|
||||
->orderBy('transaction_journals.date', 'DESC')
|
||||
->orderBy('transaction_journals.order', 'ASC')
|
||||
->orderBy('transaction_journals.id', 'DESC')
|
||||
->orderBy('transaction_journals.description', 'DESC')
|
||||
->orderBy('transactions.amount', 'DESC')
|
||||
->where('transactions.account_id', $accountId)
|
||||
;
|
||||
->orderBy('transaction_journals.date', 'DESC')
|
||||
->orderBy('transaction_journals.order', 'ASC')
|
||||
->orderBy('transaction_journals.id', 'DESC')
|
||||
->orderBy('transaction_journals.description', 'DESC')
|
||||
->orderBy('transactions.amount', 'DESC')
|
||||
->where('transactions.account_id', $accountId);
|
||||
$query->where('transaction_journals.date', '<', $notBefore);
|
||||
|
||||
$first = $query->first([
|
||||
'transactions.id',
|
||||
'transactions.balance_dirty',
|
||||
'transactions.transaction_currency_id',
|
||||
'transaction_journals.date',
|
||||
'transactions.account_id',
|
||||
'transactions.amount',
|
||||
'transactions.balance_after',
|
||||
]);
|
||||
$first = $query->first([
|
||||
'transactions.id',
|
||||
'transactions.balance_dirty',
|
||||
'transactions.transaction_currency_id',
|
||||
'transaction_journals.date',
|
||||
'transactions.account_id',
|
||||
'transactions.amount',
|
||||
'transactions.balance_after',
|
||||
]);
|
||||
|
||||
if (null === $first) {
|
||||
// Log::debug(sprintf('Found no transactions for currency #%d and account #%d, return 0.', $currencyId, $accountId));
|
||||
@@ -83,13 +82,13 @@ class AccountBalanceCalculator
|
||||
return '0';
|
||||
}
|
||||
|
||||
$balance = (string) ($first->balance_after ?? '0');
|
||||
$balance = (string)($first->balance_after ?? '0');
|
||||
Log::debug(sprintf(
|
||||
'getLatestBalance: found balance: %s in transaction #%d on moment %s',
|
||||
Steam::bcround($balance, 2),
|
||||
$first->id ?? 0,
|
||||
$notBefore->format('Y-m-d H:i:s')
|
||||
));
|
||||
'getLatestBalance: found balance: %s in transaction #%d on moment %s',
|
||||
Steam::bcround($balance, 2),
|
||||
$first->id ?? 0,
|
||||
$notBefore->format('Y-m-d H:i:s')
|
||||
));
|
||||
|
||||
return $balance;
|
||||
}
|
||||
@@ -108,15 +107,14 @@ class AccountBalanceCalculator
|
||||
$balances = [];
|
||||
$count = 0;
|
||||
$query = Transaction::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||
->whereNull('transactions.deleted_at')
|
||||
->whereNull('transaction_journals.deleted_at')
|
||||
->whereNull('transactions.deleted_at')
|
||||
->whereNull('transaction_journals.deleted_at')
|
||||
// this order is the same as GroupCollector, but in the exact reverse.
|
||||
->orderBy('transaction_journals.date', 'asc')
|
||||
->orderBy('transaction_journals.order', 'desc')
|
||||
->orderBy('transaction_journals.id', 'asc')
|
||||
->orderBy('transaction_journals.description', 'asc')
|
||||
->orderBy('transactions.amount', 'asc')
|
||||
;
|
||||
->orderBy('transaction_journals.date', 'asc')
|
||||
->orderBy('transaction_journals.order', 'desc')
|
||||
->orderBy('transaction_journals.id', 'asc')
|
||||
->orderBy('transaction_journals.description', 'asc')
|
||||
->orderBy('transactions.amount', 'asc');
|
||||
if ($accounts->count() > 0) {
|
||||
$query->whereIn('transactions.account_id', $accounts->pluck('id')->toArray());
|
||||
}
|
||||
@@ -124,14 +122,14 @@ class AccountBalanceCalculator
|
||||
$query->where('transaction_journals.date', '>=', $notBefore);
|
||||
}
|
||||
|
||||
$set = $query->get([
|
||||
'transactions.id',
|
||||
'transactions.balance_dirty',
|
||||
'transactions.transaction_currency_id',
|
||||
'transaction_journals.date',
|
||||
'transactions.account_id',
|
||||
'transactions.amount',
|
||||
]);
|
||||
$set = $query->get([
|
||||
'transactions.id',
|
||||
'transactions.balance_dirty',
|
||||
'transactions.transaction_currency_id',
|
||||
'transaction_journals.date',
|
||||
'transactions.account_id',
|
||||
'transactions.amount',
|
||||
]);
|
||||
Log::debug(sprintf('Found %d transaction(s)', $set->count()));
|
||||
|
||||
// the balance value is an array.
|
||||
@@ -141,6 +139,9 @@ class AccountBalanceCalculator
|
||||
foreach ($set as $entry) {
|
||||
// Log::debug(sprintf('Processing transaction #%d with currency #%d and amount %s', $entry->id, $entry->transaction_currency_id, Steam::bcround($entry->amount, 2)));
|
||||
// start with empty array:
|
||||
$entry->account_id = (int)$entry->account_id;
|
||||
$entry->transaction_currency_id = (int)$entry->transaction_currency_id;
|
||||
|
||||
$balances[$entry->account_id] ??= [];
|
||||
$balances[$entry->account_id][$entry->transaction_currency_id] ??= [
|
||||
self::getLatestBalance($entry->account_id, $entry->transaction_currency_id, $notBefore),
|
||||
@@ -148,8 +149,8 @@ class AccountBalanceCalculator
|
||||
];
|
||||
|
||||
// before and after are easy:
|
||||
$before = $balances[$entry->account_id][$entry->transaction_currency_id][0];
|
||||
$after = bcadd($before, (string) $entry->amount);
|
||||
$before = $balances[$entry->account_id][$entry->transaction_currency_id][0];
|
||||
$after = bcadd($before, (string)$entry->amount);
|
||||
|
||||
// Log::debug(sprintf('Before:%s, after:%s', Steam::bcround($before, 2), Steam::bcround($after, 2)));
|
||||
|
||||
@@ -193,17 +194,17 @@ class AccountBalanceCalculator
|
||||
return;
|
||||
}
|
||||
Log::debug(__METHOD__);
|
||||
$object = new self();
|
||||
$object = new self();
|
||||
|
||||
$set = [];
|
||||
$set = [];
|
||||
foreach ($transactionJournal->transactions as $transaction) {
|
||||
$set[$transaction->account_id] = $transaction->account;
|
||||
}
|
||||
$accounts = new Collection()->push(...$set);
|
||||
|
||||
// find meta value:
|
||||
$date = $transactionJournal->date;
|
||||
$meta = $transactionJournal->transactionJournalMeta()->where('name', '_internal_previous_date')->where('data', '!=', '')->first();
|
||||
$date = $transactionJournal->date;
|
||||
$meta = $transactionJournal->transactionJournalMeta()->where('name', '_internal_previous_date')->where('data', '!=', '')->first();
|
||||
Log::debug(sprintf('Date used is "%s"', $date->toW3cString()));
|
||||
if (null !== $meta) {
|
||||
$date = Carbon::parse($meta->data);
|
||||
|
||||
Reference in New Issue
Block a user