mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-11 07:10:48 +00:00
🤖 Auto commit for release 'develop' on 2025-10-08
This commit is contained in:
@@ -49,6 +49,7 @@ class AutocompleteRequest extends FormRequest
|
|||||||
$array = array_diff($array, [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value]);
|
$array = array_diff($array, [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value]);
|
||||||
|
|
||||||
$date = $this->getCarbonDate('date') ?? today(config('app.timezone'));
|
$date = $this->getCarbonDate('date') ?? today(config('app.timezone'));
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'types' => $array,
|
'types' => $array,
|
||||||
'query' => $this->convertString('query'),
|
'query' => $this->convertString('query'),
|
||||||
|
@@ -28,7 +28,6 @@ use FireflyIII\Exceptions\ValidationException;
|
|||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
use Illuminate\Validation\Validator;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request class for end points that require date parameters.
|
* Request class for end points that require date parameters.
|
||||||
|
@@ -25,8 +25,6 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Helpers\Report;
|
namespace FireflyIII\Helpers\Report;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Deprecated;
|
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\UserGroup;
|
use FireflyIII\Models\UserGroup;
|
||||||
|
@@ -25,7 +25,6 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Helpers\Report;
|
namespace FireflyIII\Helpers\Report;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Deprecated;
|
|
||||||
use FireflyIII\Models\UserGroup;
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
@@ -49,5 +48,4 @@ interface NetWorthInterface
|
|||||||
public function setUser(Authenticatable|User|null $user): void;
|
public function setUser(Authenticatable|User|null $user): void;
|
||||||
|
|
||||||
public function setUserGroup(UserGroup $userGroup): void;
|
public function setUserGroup(UserGroup $userGroup): void;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -114,13 +114,13 @@ class ReconcileController extends Controller
|
|||||||
$start->startOfDay();
|
$start->startOfDay();
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
// $startDate = clone $start;
|
// $startDate = clone $start;
|
||||||
// $startDate->subDay()->endOfDay(); // this is correct, subday endofday ends at 23:59:59
|
// $startDate->subDay()->endOfDay(); // this is correct, subday endofday ends at 23:59:59
|
||||||
// both are validated and are correct.
|
// both are validated and are correct.
|
||||||
// Log::debug(sprintf('reconcile: Call finalAccountBalance with date/time "%s"', $startDate->toIso8601String()));
|
// Log::debug(sprintf('reconcile: Call finalAccountBalance with date/time "%s"', $startDate->toIso8601String()));
|
||||||
// Log::debug(sprintf('reconcile2: Call finalAccountBalance with date/time "%s"', $end->toIso8601String()));
|
// Log::debug(sprintf('reconcile2: Call finalAccountBalance with date/time "%s"', $end->toIso8601String()));
|
||||||
// $startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
// $startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
||||||
// $endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places);
|
// $endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places);
|
||||||
|
|
||||||
// 2025-10-08 replace with accountsBalancesOptimized
|
// 2025-10-08 replace with accountsBalancesOptimized
|
||||||
// no longer need to do subday->endofday on $start, set inclusive = false for the same effect.
|
// no longer need to do subday->endofday on $start, set inclusive = false for the same effect.
|
||||||
|
@@ -522,9 +522,9 @@ class AccountController extends Controller
|
|||||||
$range = Steam::filterAccountBalances($range, $account, $this->convertToPrimary, $accountCurrency);
|
$range = Steam::filterAccountBalances($range, $account, $this->convertToPrimary, $accountCurrency);
|
||||||
Log::debug('Get and filter balance for entire range end');
|
Log::debug('Get and filter balance for entire range end');
|
||||||
// temp, get end balance.
|
// temp, get end balance.
|
||||||
// Log::debug(sprintf('period: Call finalAccountBalance with date/time "%s"', $end->toIso8601String()));
|
// Log::debug(sprintf('period: Call finalAccountBalance with date/time "%s"', $end->toIso8601String()));
|
||||||
// Steam::finalAccountBalance($account, $end);
|
// Steam::finalAccountBalance($account, $end);
|
||||||
// Log::debug('END temp get end balance done');
|
// Log::debug('END temp get end balance done');
|
||||||
|
|
||||||
$previous = array_values($range)[0];
|
$previous = array_values($range)[0];
|
||||||
$accountCurrency ??= $this->primaryCurrency; // do this AFTER getting the balances.
|
$accountCurrency ??= $this->primaryCurrency; // do this AFTER getting the balances.
|
||||||
@@ -671,7 +671,7 @@ class AccountController extends Controller
|
|||||||
[
|
[
|
||||||
$startBalances,
|
$startBalances,
|
||||||
$endBalances,
|
$endBalances,
|
||||||
] = Steam::accountsBalancesInRange($accounts, $start, $end , $this->primaryCurrency, $this->convertToPrimary);
|
] = Steam::accountsBalancesInRange($accounts, $start, $end, $this->primaryCurrency, $this->convertToPrimary);
|
||||||
|
|
||||||
|
|
||||||
// loop the accounts, then check for balance and currency info.
|
// loop the accounts, then check for balance and currency info.
|
||||||
|
@@ -201,8 +201,8 @@ class ReconcileController extends Controller
|
|||||||
Log::debug(sprintf('transactions2: Call accountsBalancesOptimized with date/time "%s"', $end->toIso8601String()));
|
Log::debug(sprintf('transactions2: Call accountsBalancesOptimized with date/time "%s"', $end->toIso8601String()));
|
||||||
|
|
||||||
// 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized
|
// 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized
|
||||||
// $startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
// $startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
||||||
// $endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places);
|
// $endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places);
|
||||||
|
|
||||||
$startBalance = Steam::accountsBalancesOptimized(new Collection()->push($account), $startDate)[$account->id];
|
$startBalance = Steam::accountsBalancesOptimized(new Collection()->push($account), $startDate)[$account->id];
|
||||||
$endBalance = Steam::accountsBalancesOptimized(new Collection()->push($account), $end)[$account->id];
|
$endBalance = Steam::accountsBalancesOptimized(new Collection()->push($account), $end)[$account->id];
|
||||||
|
@@ -234,8 +234,8 @@ class ConvertController extends Controller
|
|||||||
// $balance = Steam::finalAccountBalance($account, $date)['balance'];
|
// $balance = Steam::finalAccountBalance($account, $date)['balance'];
|
||||||
$balance = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id]['balance'] ?? '0';
|
$balance = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id]['balance'] ?? '0';
|
||||||
$currency = $this->accountRepository->getAccountCurrency($account) ?? $this->primaryCurrency;
|
$currency = $this->accountRepository->getAccountCurrency($account) ?? $this->primaryCurrency;
|
||||||
$role = sprintf('l_%s',$account->accountType->type);
|
$role = sprintf('l_%s', $account->accountType->type);
|
||||||
$key = (string) trans(sprintf('firefly.opt_group_%s',$role));
|
$key = (string) trans(sprintf('firefly.opt_group_%s', $role));
|
||||||
$grouped[$key][$account->id] = sprintf('%s (%s)', $account->name, Amount::formatAnything($currency, $balance, false));
|
$grouped[$key][$account->id] = sprintf('%s (%s)', $account->name, Amount::formatAnything($currency, $balance, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,7 +266,7 @@ class ConvertController extends Controller
|
|||||||
$role = 'no_account_type';
|
$role = 'no_account_type';
|
||||||
}
|
}
|
||||||
|
|
||||||
$key = (string) trans(sprintf('firefly.opt_group_%s',$role));
|
$key = (string) trans(sprintf('firefly.opt_group_%s', $role));
|
||||||
$grouped[$key][$account->id] = sprintf('%s (%s)', $account->name, Amount::formatAnything($currency, $balance, false));
|
$grouped[$key][$account->id] = sprintf('%s (%s)', $account->name, Amount::formatAnything($currency, $balance, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -377,7 +377,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface, UserGroupInte
|
|||||||
Log::debug(sprintf('leftOnAccount: Call finalAccountBalance with date/time "%s"', $date->toIso8601String()));
|
Log::debug(sprintf('leftOnAccount: Call finalAccountBalance with date/time "%s"', $date->toIso8601String()));
|
||||||
// 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized.
|
// 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized.
|
||||||
$balance = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
|
$balance = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
|
||||||
//$balance = Steam::finalAccountBalance($account, $date)['balance'];
|
// $balance = Steam::finalAccountBalance($account, $date)['balance'];
|
||||||
|
|
||||||
Log::debug(sprintf('Balance is: %s', $balance));
|
Log::debug(sprintf('Balance is: %s', $balance));
|
||||||
|
|
||||||
|
@@ -40,6 +40,7 @@ use Illuminate\Support\Str;
|
|||||||
use Psr\Container\ContainerExceptionInterface;
|
use Psr\Container\ContainerExceptionInterface;
|
||||||
use Psr\Container\NotFoundExceptionInterface;
|
use Psr\Container\NotFoundExceptionInterface;
|
||||||
use ValueError;
|
use ValueError;
|
||||||
|
|
||||||
use function Safe\parse_url;
|
use function Safe\parse_url;
|
||||||
use function Safe\preg_replace;
|
use function Safe\preg_replace;
|
||||||
|
|
||||||
@@ -62,9 +63,11 @@ class Steam
|
|||||||
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
|
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
|
||||||
->where('transaction_journals.date', $inclusive ? '<=' : '<', $date->format('Y-m-d H:i:s'))
|
->where('transaction_journals.date', $inclusive ? '<=' : '<', $date->format('Y-m-d H:i:s'))
|
||||||
->groupBy(['transactions.account_id', 'transaction_currencies.code'])
|
->groupBy(['transactions.account_id', 'transaction_currencies.code'])
|
||||||
->get(['transactions.account_id', 'transaction_currencies.code', DB::raw('SUM(transactions.amount) as sum_of_amount')])->toArray();
|
->get(['transactions.account_id', 'transaction_currencies.code', DB::raw('SUM(transactions.amount) as sum_of_amount')])->toArray()
|
||||||
|
;
|
||||||
|
|
||||||
Log::debug('Array of sums: ', $arrayOfSums);
|
Log::debug('Array of sums: ', $arrayOfSums);
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
$return = [
|
$return = [
|
||||||
@@ -74,14 +77,14 @@ class Steam
|
|||||||
$currency = $currencies[$account->id];
|
$currency = $currencies[$account->id];
|
||||||
|
|
||||||
// second array
|
// second array
|
||||||
$accountSums = array_filter($arrayOfSums, fn($entry) => $entry['account_id'] === $account->id);
|
$accountSums = array_filter($arrayOfSums, fn ($entry) => $entry['account_id'] === $account->id);
|
||||||
if (0 === count($accountSums)) {
|
if (0 === count($accountSums)) {
|
||||||
$result[$account->id] = $return;
|
$result[$account->id] = $return;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$sumsByCode = [];
|
$sumsByCode = [];
|
||||||
foreach($accountSums as $accountSum) {
|
foreach ($accountSums as $accountSum) {
|
||||||
// $accountSum = array_values($accountSum)[0];
|
// $accountSum = array_values($accountSum)[0];
|
||||||
$sumOfAmount = (string)$accountSum['sum_of_amount'];
|
$sumOfAmount = (string)$accountSum['sum_of_amount'];
|
||||||
$sumOfAmount = $this->floatalize('' === $sumOfAmount ? '0' : $sumOfAmount);
|
$sumOfAmount = $this->floatalize('' === $sumOfAmount ? '0' : $sumOfAmount);
|
||||||
@@ -118,7 +121,7 @@ class Steam
|
|||||||
}
|
}
|
||||||
$final = array_merge($return, $sumsByCode);
|
$final = array_merge($return, $sumsByCode);
|
||||||
$result[$account->id] = $final;
|
$result[$account->id] = $final;
|
||||||
Log::debug(sprintf('Final balance for account #%d is',$account->id), $final);
|
Log::debug(sprintf('Final balance for account #%d is', $account->id), $final);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
@@ -154,10 +157,10 @@ class Steam
|
|||||||
// Log::debug(sprintf('Trying bcround("%s",%d)', $number, $precision));
|
// Log::debug(sprintf('Trying bcround("%s",%d)', $number, $precision));
|
||||||
if (str_contains($number, '.')) {
|
if (str_contains($number, '.')) {
|
||||||
if ('-' !== $number[0]) {
|
if ('-' !== $number[0]) {
|
||||||
return bcadd($number, '0.' . str_repeat('0', $precision) . '5', $precision);
|
return bcadd($number, '0.'.str_repeat('0', $precision).'5', $precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
return bcsub($number, '0.' . str_repeat('0', $precision) . '5', $precision);
|
return bcsub($number, '0.'.str_repeat('0', $precision).'5', $precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $number;
|
return $number;
|
||||||
@@ -335,8 +338,9 @@ class Steam
|
|||||||
$array = $account->transactions()
|
$array = $account->transactions()
|
||||||
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||||
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
|
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
|
||||||
->where('transaction_journals.date', $inclusive ? '<=': '<', $date->format('Y-m-d H:i:s'))
|
->where('transaction_journals.date', $inclusive ? '<=' : '<', $date->format('Y-m-d H:i:s'))
|
||||||
->get(['transaction_currencies.code', 'transactions.amount'])->toArray();
|
->get(['transaction_currencies.code', 'transactions.amount'])->toArray()
|
||||||
|
;
|
||||||
$others = $this->groupAndSumTransactions($array, 'code', 'amount');
|
$others = $this->groupAndSumTransactions($array, 'code', 'amount');
|
||||||
Log::debug('All balances are (joined)', $others);
|
Log::debug('All balances are (joined)', $others);
|
||||||
// if there is no request to convert, take this as "balance" and "pc_balance".
|
// if there is no request to convert, take this as "balance" and "pc_balance".
|
||||||
@@ -439,7 +443,8 @@ class Steam
|
|||||||
'transactions.transaction_currency_id',
|
'transactions.transaction_currency_id',
|
||||||
DB::raw('SUM(transactions.amount) AS sum_of_day'),
|
DB::raw('SUM(transactions.amount) AS sum_of_day'),
|
||||||
]
|
]
|
||||||
);
|
)
|
||||||
|
;
|
||||||
|
|
||||||
$currentBalance = $startBalance;
|
$currentBalance = $startBalance;
|
||||||
$converter = new ExchangeRateConverter();
|
$converter = new ExchangeRateConverter();
|
||||||
|
@@ -78,8 +78,8 @@ return [
|
|||||||
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
||||||
// see cer.php for exchange rates feature flag.
|
// see cer.php for exchange rates feature flag.
|
||||||
],
|
],
|
||||||
'version' => 'develop/2025-10-07',
|
'version' => 'develop/2025-10-08',
|
||||||
'build_time' => 1759859933,
|
'build_time' => 1759908015,
|
||||||
'api_version' => '2.1.0', // field is no longer used.
|
'api_version' => '2.1.0', // field is no longer used.
|
||||||
'db_version' => 28, // field is no longer used.
|
'db_version' => 28, // field is no longer used.
|
||||||
|
|
||||||
|
18
package-lock.json
generated
18
package-lock.json
generated
@@ -4521,9 +4521,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001748",
|
"version": "1.0.30001749",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz",
|
||||||
"integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==",
|
"integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5736,9 +5736,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.232",
|
"version": "1.5.233",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz",
|
||||||
"integrity": "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==",
|
"integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@@ -10290,9 +10290,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/semver": {
|
"node_modules/semver": {
|
||||||
"version": "7.7.2",
|
"version": "7.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
|
||||||
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
|
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
Reference in New Issue
Block a user