James Cole
2026-05-17 04:26:45 +02:00
parent 7ddf395ea9
commit 57010cd2e0

View File

@@ -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);