Compare commits

..

40 Commits

Author SHA1 Message Date
github-actions[bot]
29c51ad0e2 Merge pull request #12046 from firefly-iii/release-1774795569
🤖 Automatically merge the PR into the develop branch.
2026-03-29 16:46:17 +02:00
JC5
bf8c40d502 🤖 Auto commit for release 'develop' on 2026-03-29 2026-03-29 16:46:09 +02:00
James Cole
99912483de Add some debug for https://github.com/orgs/firefly-iii/discussions/12044 2026-03-29 16:38:49 +02:00
James Cole
a3f4ab9b1b Validate if amount can be added. 2026-03-27 07:05:16 +01:00
James Cole
953fe7d9eb Fix https://github.com/firefly-iii/firefly-iii/issues/12034 2026-03-27 05:23:22 +01:00
github-actions[bot]
41a7890c7a Merge pull request #12040 from firefly-iii/release-1774582734
🤖 Automatically merge the PR into the develop branch.
2026-03-27 04:39:02 +01:00
JC5
b8e07c1df4 🤖 Auto commit for release 'develop' on 2026-03-27 2026-03-27 04:38:55 +01:00
James Cole
2a3d9001d1 Merge branch 'main' into develop 2026-03-27 04:33:18 +01:00
James Cole
bc7453e204 Update changelog template. 2026-03-27 04:33:03 +01:00
James Cole
8c9ad9da83 Improve running balance correction. 2026-03-27 04:32:41 +01:00
James Cole
c8bd8d5113 Fix https://github.com/firefly-iii/firefly-iii/issues/12035 2026-03-26 20:13:14 +01:00
James Cole
8ce5429e06 Merge pull request #12015 from firefly-iii/dependabot/composer/develop/laravel-notification-channels/pushover-5.0.0
Bump laravel-notification-channels/pushover from 4.1.2 to 5.0.0
2026-03-26 10:36:30 +01:00
James Cole
c1f8fb2f45 Merge pull request #12033 from firefly-iii/dependabot/npm_and_yarn/npm_and_yarn-66413a1f6e 2026-03-26 04:19:12 +01:00
dependabot[bot]
5fb4330c20 Bump picomatch in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [picomatch](https://github.com/micromatch/picomatch).


Updates `picomatch` from 2.3.1 to 2.3.2
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-25 22:06:01 +00:00
James Cole
485eb224d2 Fix https://github.com/firefly-iii/firefly-iii/issues/12030 2026-03-25 20:39:12 +01:00
Sander Dorigo
de7033ee63 Fix #12029 2026-03-25 16:56:46 +01:00
James Cole
4c20547863 Merge branch 'main' into develop 2026-03-24 19:21:16 +01:00
James Cole
3881cd3e39 Fix https://github.com/firefly-iii/firefly-iii/issues/12026 2026-03-24 19:20:36 +01:00
github-actions[bot]
a3e7fa008d Merge pull request #12025 from firefly-iii/release-1774347937
🤖 Automatically merge the PR into the develop branch.
2026-03-24 11:25:46 +01:00
JC5
205b5bd3bf 🤖 Auto commit for release 'develop' on 2026-03-24 2026-03-24 11:25:37 +01:00
Sander Dorigo
21c3dc3f56 Some demo user protections 2026-03-24 10:35:35 +01:00
github-actions[bot]
aa4f5d5a2e Merge pull request #12022 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-03-23 08:33:08 +01:00
github-actions[bot]
9c1f79110c Merge pull request #12021 from firefly-iii/release-1774251172
🤖 Automatically merge the PR into the develop branch.
2026-03-23 08:33:01 +01:00
JC5
bd62957908 🤖 Auto commit for release 'v6.5.9' on 2026-03-23 2026-03-23 08:32:53 +01:00
github-actions[bot]
a7e4252b46 Merge pull request #12020 from firefly-iii/release-1774249889
🤖 Automatically merge the PR into the develop branch.
2026-03-23 08:11:38 +01:00
JC5
c18691d6b3 🤖 Auto commit for release 'develop' on 2026-03-23 2026-03-23 08:11:29 +01:00
github-actions[bot]
b4dbcdcfba Merge pull request #12018 from firefly-iii/release-1774249482
🤖 Automatically merge the PR into the develop branch.
2026-03-23 08:04:52 +01:00
JC5
b0a6acb334 🤖 Auto commit for release 'v6.5.9' on 2026-03-23 2026-03-23 08:04:42 +01:00
github-actions[bot]
a0c423b9ed Merge pull request #12017 from firefly-iii/release-1774238341
🤖 Automatically merge the PR into the develop branch.
2026-03-23 04:59:09 +01:00
JC5
2844929351 🤖 Auto commit for release 'develop' on 2026-03-23 2026-03-23 04:59:01 +01:00
dependabot[bot]
7bfba6a239 Bump laravel-notification-channels/pushover from 4.1.2 to 5.0.0
Bumps [laravel-notification-channels/pushover](https://github.com/laravel-notification-channels/pushover) from 4.1.2 to 5.0.0.
- [Release notes](https://github.com/laravel-notification-channels/pushover/releases)
- [Changelog](https://github.com/laravel-notification-channels/pushover/blob/master/CHANGELOG.md)
- [Commits](https://github.com/laravel-notification-channels/pushover/compare/4.1.2...5.0.0)

---
updated-dependencies:
- dependency-name: laravel-notification-channels/pushover
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 03:52:43 +00:00
James Cole
c0d4a70d46 Update changelog for next release. 2026-03-22 17:10:47 +01:00
James Cole
a62f8bbaff Fix https://github.com/firefly-iii/firefly-iii/issues/12014 2026-03-22 17:05:31 +01:00
James Cole
b115b4ad92 Improve PR template. 2026-03-22 13:38:04 +01:00
github-actions[bot]
dc60025097 Merge pull request #12012 from firefly-iii/release-1774166607
🤖 Automatically merge the PR into the develop branch.
2026-03-22 09:03:34 +01:00
JC5
d77769b2f4 🤖 Auto commit for release 'develop' on 2026-03-22 2026-03-22 09:03:27 +01:00
James Cole
c6497960f8 Try updating package lock/ 2026-03-22 08:58:15 +01:00
James Cole
4eee0c79cd Go to vite plugin 3. 2026-03-22 08:36:43 +01:00
James Cole
e333c3254b Merge pull request #11961 from firefly-iii/dependabot/npm_and_yarn/develop/vite-8.0.0
Bump vite from 7.3.1 to 8.0.0
2026-03-22 07:21:07 +01:00
dependabot[bot]
974c84a877 Bump vite from 7.3.1 to 8.0.0
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.1 to 8.0.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.0.0/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:52:51 +00:00
22 changed files with 824 additions and 935 deletions

View File

@@ -6,6 +6,8 @@
2. If your PR is more than 25 lines, talk to me FIRST.
3. If you fix spelling or code comments, talk to me FIRST.
This is to prevent AI bots, low-effort PRs and spam. Sorry about that.
Wanna talk to me? Open a GitHub Issue, Discussion, or email me: james@firefly-iii.org
👀 Please ensure you have taken a look at the contribution guidelines:
@@ -17,7 +19,9 @@ Remember that your PR may be CLOSED:
2. If you open a PR on the main branch, your PR will be CLOSED.
3. If you only fix a spelling error or code comment, your PR will be CLOSED.
Thanks again, and happy developing!
Again, this is to prevent AI bots, low-effort PRs and spam. I apologize for the harsh tone.
But if you made it this far thanks again for contributing, and happy developing!
-->
@@ -48,3 +52,6 @@ I used AI assistance for:
<!--
Thanks for contributing!
-->
@JC5

View File

@@ -116,6 +116,7 @@ final class PiggyBankController extends Controller
'currency_decimal_places' => $currency->decimal_places,
'object_group_id' => null === $objectGroup ? null : (string) $objectGroup->id,
'object_group_title' => $objectGroup?->title,
'object_group_order' => $objectGroup?->order,
];
}

View File

@@ -28,6 +28,7 @@ use FireflyIII\Models\PiggyBank;
use FireflyIII\Rules\IsValidPositiveAmount;
use FireflyIII\Rules\IsValidZeroOrMoreAmount;
use FireflyIII\Rules\LessThanPiggyTarget;
use FireflyIII\Rules\PiggyBank\IsEnoughInAccounts;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest;
@@ -84,7 +85,7 @@ class UpdateRequest extends FormRequest
'accounts' => 'array',
'accounts.*' => 'array',
'accounts.*.account_id' => ['required', 'numeric', 'belongsToUser:accounts,id'],
'accounts.*.current_amount' => ['numeric', 'nullable', new IsValidZeroOrMoreAmount(true)],
'accounts.*.current_amount' => ['numeric', 'nullable', new IsValidZeroOrMoreAmount(true), new IsEnoughInAccounts($piggyBank, $this->getAll())],
'object_group_id' => 'numeric|belongsToUser:object_groups,id',
'object_group_title' => ['min:1', 'max:255'],
'transaction_currency_id' => 'exists:transaction_currencies,id|nullable',

View File

@@ -33,6 +33,7 @@ use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class CorrectsGroupAccounts extends Command
{
@@ -46,6 +47,7 @@ class CorrectsGroupAccounts extends Command
*/
public function handle(): int
{
Log::debug('Start of correction:group-accounts');
$groups = [];
$res = TransactionJournal::groupBy('transaction_group_id')->get(['transaction_group_id', DB::raw('COUNT(transaction_group_id) as the_count')]);
@@ -64,8 +66,10 @@ class CorrectsGroupAccounts extends Command
$group = TransactionGroup::find($groupId);
$objects->appendFromTransactionGroup($group);
}
Log::debug(sprintf('Fire event for %d transaction group(s)', count($groups)));
event(new UpdatedSingleTransactionGroup($flags, $objects));
event(new WebhookMessagesRequestSending());
Log::debug('End of correction:group-accounts');
return 0;
}

View File

@@ -134,6 +134,13 @@ class PiggyBankFactory
$previous = $toBeLinked[$account->id]['current_amount'] ?? '0';
$diff = bcsub($info['current_amount'], $previous);
// if money is added, check if we can!
if (1 === bccomp($diff, '0') && !$this->piggyBankRepository->canAddAmount($piggyBank, $account, $diff)) {
Log::debug(sprintf('Cannot add amount %s to piggy bank #%d ("%s")', $diff, $piggyBank->id, $piggyBank->name));
continue;
}
// create event for difference.
if (0 !== bccomp($diff, '0')) {
// 2025-10-01 for issue #10990 disable this event.

View File

@@ -246,14 +246,14 @@ final class PreferencesController extends Controller
$all = $request->only($keys);
foreach (config('notifications.notifications.user') as $key => $info) {
$key = sprintf('notification_%s', $key);
if (array_key_exists($key, $all)) {
if (array_key_exists($key, $all) && false === auth()->user()->hasRole('demo')) {
Log::debug(sprintf('update notification to true: %s', $key));
Preferences::set($key, true);
continue;
}
if (!array_key_exists($key, $all)) {
Log::debug(sprintf('update notification to false: %s', $key));
Preferences::set($key, false);
}
Log::debug(sprintf('update notification to false: %s', $key));
Preferences::set($key, false);
}
unset($all);
@@ -369,6 +369,12 @@ final class PreferencesController extends Controller
$all = $request->only(['channel']);
$channel = $all['channel'] ?? '';
if (true === auth()->user()->hasRole('demo')) {
session()->flash('error', (string) trans('firefly.not_available_demo_user'));
return redirect(route('preferences.index'));
}
switch ($channel) {
default:
session()->flash('error', (string) trans('firefly.notification_test_failed', ['channel' => $channel]));

View File

@@ -170,7 +170,7 @@ final class MassController extends Controller
*/
public function update(MassEditJournalRequest $request): RedirectResponse
{
$journalIds = $request->get('journals');
$journalIds = $request->input('journals');
if (!is_array($journalIds)) {
// TODO this is a weird error, should be caught.
throw new FireflyException('This is not an array.');
@@ -250,6 +250,8 @@ final class MassController extends Controller
private function updateJournal(int $journalId, MassEditJournalRequest $request): void
{
$journal = $this->repository->find($journalId);
$objects = TransactionGroupEventObjects::collectFromTransactionGroup($journal->transactionGroup);
if (!$journal instanceof TransactionJournal) {
throw new FireflyException(sprintf('Trying to edit non-existent or deleted journal #%d', $journalId));
}
@@ -274,8 +276,9 @@ final class MassController extends Controller
// call service to update.
$service->setData($data);
$service->update();
$updated = $service->getTransactionJournal();
$objects->appendFromTransactionGroup($updated->transactionGroup);
$flags = new TransactionGroupEventFlags();
$objects = TransactionGroupEventObjects::collectFromTransactionGroup($journal->transactionGroup);
event(new UpdatedSingleTransactionGroup($flags, $objects));
event(new WebhookMessagesRequestSending());
}

View File

@@ -116,13 +116,28 @@ class ProcessesUpdatedTransactionGroup
$destAccount = $first->transactions()->where('amount', '>', '0')->first()->account;
$type = $first->transactionType->type;
$effect = 0;
if (TransactionTypeEnum::TRANSFER->value === $type || TransactionTypeEnum::WITHDRAWAL->value === $type) {
// set all source transactions to source account:
Transaction::whereIn('transaction_journal_id', $all)->where('amount', '<', 0)->update(['account_id' => $sourceAccount->id]);
$effect += Transaction::whereIn('transaction_journal_id', $all)
->where('account_id', '!=', $sourceAccount->id)
->where('amount', '<', 0)
->update(['account_id' => $sourceAccount->id])
;
}
if (TransactionTypeEnum::TRANSFER->value === $type || TransactionTypeEnum::DEPOSIT->value === $type) {
// set all destination transactions to destination account:
Transaction::whereIn('transaction_journal_id', $all)->where('amount', '>', 0)->update(['account_id' => $destAccount->id]);
$effect += Transaction::whereIn('transaction_journal_id', $all)
->where('account_id', '!=', $destAccount->id)
->where('amount', '>', 0)
->update(['account_id' => $destAccount->id])
;
}
if (0 === $effect) {
Log::debug(sprintf('Had nothing to do in unifyAccounts(#%d)', $group->id));
return;
}
Log::debug(sprintf('Updated %d transaction(s) in unifyAccounts(#%d)', $effect, $group->id));
}
}

View File

@@ -34,13 +34,13 @@ trait SupportsGroupProcessingTrait
return;
}
$array = $set->pluck('id')->toArray();
$array = array_unique($set->pluck('id')->toArray());
/** @var TransactionJournal $first */
$first = $set->first();
$journalIds = implode(',', $array);
$user = $first->user;
// Log::debug(sprintf('Add local operator for journal(s): %s', $journalIds));
Log::debug(sprintf('Fire rule engine for journal(s): %s', $journalIds));
// collect rules:
$ruleGroupRepository = app(RuleGroupRepositoryInterface::class);
@@ -56,6 +56,7 @@ trait SupportsGroupProcessingTrait
$newRuleEngine->setUser($user);
$newRuleEngine->setRuleGroups($groups);
foreach ($array as $journalId) {
Log::debug(sprintf('Fire rule engine for journal #%d', $journalId));
$newRuleEngine->removeOperator('journal_id');
$newRuleEngine->addOperator(['type' => 'journal_id', 'value' => $journalId]);
$newRuleEngine->fire();

View File

@@ -0,0 +1,75 @@
<?php
declare(strict_types=1);
/*
* IsEnoughInAccounts.php
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Rules\PiggyBank;
use Closure;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use Illuminate\Contracts\Validation\ValidationRule;
use Override;
class IsEnoughInAccounts implements ValidationRule
{
public function __construct(
private readonly PiggyBank $piggyBank,
private readonly array $data
) {}
#[Override]
public function validate(string $attribute, mixed $value, Closure $fail): void
{
// TODO: Implement validate() method.
if (!array_key_exists('accounts', $this->data)) {
return;
}
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
/** @var PiggyBankRepositoryInterface $piggyRepos */
$piggyRepos = app(PiggyBankRepositoryInterface::class);
$accounts = $this->data['accounts'];
foreach ($accounts as $info) {
$account = $repository->find((int) $info['account_id']);
$amount = $info['current_amount'] ?? '0';
if (null === $account) {
$fail('validation.no_asset_account')->translate();
return;
}
if ('' === $amount || 0 === bccomp($amount, '0')) {
$fail('validation.more_than_zero_correct')->translate();
return;
}
$diff = bcsub($amount, $piggyRepos->getCurrentAmount($this->piggyBank, $account));
if (1 === bccomp($diff, '0') && !$piggyRepos->canAddAmount($this->piggyBank, $account, $amount)) {
$fail('validation.cannot_add_piggy_amount')->translate();
}
}
}
}

View File

@@ -225,7 +225,7 @@ class PrimaryAmountRecalculationService
/** @var Account $account */
foreach ($set as $account) {
$currencyId = (int) $account->accountMeta()->where('name', 'currency_id')->first()->data;
$currencyId = (int) $account->accountMeta()->where('name', 'currency_id')->first()?->data;
if ($groupCurrency->id === $currencyId) {
Log::debug(sprintf('Account "%s" is in group currency %s. Skip.', $account->name, $groupCurrency->code));

View File

@@ -111,6 +111,11 @@ class JournalUpdateService
$this->transactionGroupRepository = app(TransactionGroupRepositoryInterface::class);
}
public function getTransactionJournal(): ?TransactionJournal
{
return $this->transactionJournal;
}
public function isCompareHashChanged(): bool
{
Log::debug(sprintf('Now in %s', __METHOD__));
@@ -774,8 +779,8 @@ class JournalUpdateService
$this->transactionJournal,
'update_foreign_amount',
[
'currency_symbol' => $oldForeignCurrency->symbol,
'decimal_places' => $oldForeignCurrency->decimal_places,
'currency_symbol' => $oldForeignCurrency?->symbol,
'decimal_places' => $oldForeignCurrency?->decimal_places,
'amount' => $originalSourceAmount,
],
[

View File

@@ -32,6 +32,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\CacheProperties;
use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
@@ -60,6 +61,7 @@ trait ChartGeneration
}
Log::debug('Regenerate chart.account.account-balance-chart from scratch.');
$locale = Steam::getLocale();
$converter = new ExchangeRateConverter();
/** @var GeneratorInterface $generator */
$generator = app(GeneratorInterface::class);
@@ -76,10 +78,6 @@ trait ChartGeneration
foreach ($accounts as $account) {
Log::debug(sprintf('Now at account #%d ("%s)', $account->id, $account->name));
$currency = $accountRepos->getAccountCurrency($account) ?? $primary;
$usePrimary = $convertToPrimary && $primary->id !== $currency->id;
$field = $convertToPrimary ? 'pc_balance' : 'balance';
$currency = $usePrimary ? $primary : $currency;
Log::debug(sprintf('Will use field %s', $field));
$currentSet = ['label' => $account->name, 'currency_symbol' => $currency->symbol, 'entries' => []];
$currentStart = clone $start;
@@ -90,9 +88,16 @@ trait ChartGeneration
$format = $currentStart->format('Y-m-d');
$label = trim($currentStart->isoFormat((string) trans('config.month_and_day_js', [], $locale)));
$balance = $range[$format] ?? $previous;
$converted = $balance['balance'] ?? '0';
// convert balance if necessary:
if ($convertToPrimary) {
$converted = $converter->convert($currency, $primary, $currentStart, $balance['balance']);
}
$previous = $balance;
$currentStart->addDay();
$currentSet['entries'][$label] = $balance[$field] ?? '0';
$currentSet['entries'][$label] = $converted;
}
$chartData[] = $currentSet;
}

View File

@@ -474,7 +474,10 @@ trait ConvertsDataTypes
if (!array_key_exists('current_amount', $entry)) {
$amount = null;
}
$return[] = ['account_id' => $this->integerFromValue((string) ($entry['account_id'] ?? '0')), 'current_amount' => $amount];
$return[] = [
'account_id' => $this->integerFromValue((string) ($entry['account_id'] ?? '0')),
'current_amount' => $amount,
];
}
return $return;

View File

@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## v6.5.9 - 2026-03-23
<!-- summary: Bug fixes mainly, but also updated dependencies and new wording in the instructions you see when you open a PR. -->
### Fixed
- [Issue 12004](https://github.com/firefly-iii/firefly-iii/issues/12004) (Test notification buttons always generate an error) reported by @IDevJoe
- [Issue 12014](https://github.com/firefly-iii/firefly-iii/issues/12014) (Converting a transaction to a transfer and setting the destination account to one with a different currency breaks the audit log) reported by @avee87
# Changed
- [Issue 12000](https://github.com/firefly-iii/firefly-iii/issues/12000) (Improved transaction pagination for large data sets) reported by @christiaanderidder
## v6.5.8 - 2026-03-22
<!-- summary: This release fixes a regression bug in user registration. -->
@@ -2680,7 +2691,7 @@ problems:
## x.x.x - 20xx-xx-xx
<!-- summary: If you can read this I forgot to update the summary! -->
<!-- summary: This release fixes ... If you can read this I forgot to update the summary! -->
### Added

View File

@@ -87,7 +87,7 @@
"guzzlehttp/guzzle": "^7.9",
"jc5/google2fa-laravel": "^2.0",
"jc5/recovery": "^2",
"laravel-notification-channels/pushover": "^4.0",
"laravel-notification-channels/pushover": "^5.0",
"laravel/framework": "^12",
"laravel/passport": "^12.0",
"laravel/slack-notification-channel": "^3.3",

119
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "93912463b9c00da1cf4afbd38edd36a1",
"content-hash": "7e221e2496a89469f121036f554178ac",
"packages": [
{
"name": "bacon/bacon-qr-code",
@@ -1009,16 +1009,16 @@
},
{
"name": "firebase/php-jwt",
"version": "v7.0.3",
"version": "v7.0.4",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
"reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e"
"reference": "e41f1bd7dbe3c5455c3f72d4338cfeb083b71931"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e",
"reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e",
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/e41f1bd7dbe3c5455c3f72d4338cfeb083b71931",
"reference": "e41f1bd7dbe3c5455c3f72d4338cfeb083b71931",
"shasum": ""
},
"require": {
@@ -1026,6 +1026,7 @@
},
"require-dev": {
"guzzlehttp/guzzle": "^7.4",
"phpfastcache/phpfastcache": "^9.2",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
"psr/cache": "^2.0||^3.0",
@@ -1066,9 +1067,9 @@
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
"source": "https://github.com/firebase/php-jwt/tree/v7.0.3"
"source": "https://github.com/firebase/php-jwt/tree/v7.0.4"
},
"time": "2026-02-25T22:16:40+00:00"
"time": "2026-03-27T21:17:19+00:00"
},
{
"name": "fruitcake/php-cors",
@@ -1812,28 +1813,28 @@
},
{
"name": "laravel-notification-channels/pushover",
"version": "4.1.2",
"version": "5.0.0",
"source": {
"type": "git",
"url": "https://github.com/laravel-notification-channels/pushover.git",
"reference": "53be939273e79e832a417d5863c1d443f0b3c665"
"reference": "a276d3cdbfede11bb5f4013c24ad1ef2a06bcb39"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel-notification-channels/pushover/zipball/53be939273e79e832a417d5863c1d443f0b3c665",
"reference": "53be939273e79e832a417d5863c1d443f0b3c665",
"url": "https://api.github.com/repos/laravel-notification-channels/pushover/zipball/a276d3cdbfede11bb5f4013c24ad1ef2a06bcb39",
"reference": "a276d3cdbfede11bb5f4013c24ad1ef2a06bcb39",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^7.0.1",
"illuminate/notifications": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0",
"illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0",
"php": "^8.1"
"illuminate/notifications": "^11.0 || ^12.0 || ^13.0",
"illuminate/support": "^11.0 || ^12.0 || ^13.0",
"php": "^8.2"
},
"require-dev": {
"mockery/mockery": "^1.3.1",
"orchestra/testbench": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0",
"phpunit/phpunit": "^9.3 || ^10.5 || ^11.5.3"
"orchestra/testbench": "^9.0 || ^10.0 || ^11.0",
"phpunit/phpunit": "^11.5.3 || ^12.5.12"
},
"suggest": {
"ext-exif": "Required for image attachment support"
@@ -1873,22 +1874,22 @@
"homepage": "https://github.com/laravel-notification-channels/pushover",
"support": {
"issues": "https://github.com/laravel-notification-channels/pushover/issues",
"source": "https://github.com/laravel-notification-channels/pushover/tree/4.1.2"
"source": "https://github.com/laravel-notification-channels/pushover/tree/5.0.0"
},
"time": "2025-09-09T09:14:17+00:00"
"time": "2026-03-18T11:30:33+00:00"
},
{
"name": "laravel/framework",
"version": "v12.55.1",
"version": "v12.56.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "6d9185a248d101b07eecaf8fd60b18129545fd33"
"reference": "dac16d424b59debb2273910dde88eb7050a2a709"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/6d9185a248d101b07eecaf8fd60b18129545fd33",
"reference": "6d9185a248d101b07eecaf8fd60b18129545fd33",
"url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709",
"reference": "dac16d424b59debb2273910dde88eb7050a2a709",
"shasum": ""
},
"require": {
@@ -2097,7 +2098,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2026-03-18T14:28:59+00:00"
"time": "2026-03-26T14:51:54+00:00"
},
{
"name": "laravel/passport",
@@ -2177,16 +2178,16 @@
},
{
"name": "laravel/prompts",
"version": "v0.3.15",
"version": "v0.3.16",
"source": {
"type": "git",
"url": "https://github.com/laravel/prompts.git",
"reference": "4bb8107ec97651fd3f17f897d6489dbc4d8fb999"
"reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/prompts/zipball/4bb8107ec97651fd3f17f897d6489dbc4d8fb999",
"reference": "4bb8107ec97651fd3f17f897d6489dbc4d8fb999",
"url": "https://api.github.com/repos/laravel/prompts/zipball/11e7d5f93803a2190b00e145142cb00a33d17ad2",
"reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2",
"shasum": ""
},
"require": {
@@ -2230,9 +2231,9 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
"issues": "https://github.com/laravel/prompts/issues",
"source": "https://github.com/laravel/prompts/tree/v0.3.15"
"source": "https://github.com/laravel/prompts/tree/v0.3.16"
},
"time": "2026-03-17T13:45:17+00:00"
"time": "2026-03-23T14:35:33+00:00"
},
{
"name": "laravel/serializable-closure",
@@ -2896,16 +2897,16 @@
},
{
"name": "league/flysystem",
"version": "3.32.0",
"version": "3.33.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725"
"reference": "570b8871e0ce693764434b29154c54b434905350"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725",
"reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350",
"reference": "570b8871e0ce693764434b29154c54b434905350",
"shasum": ""
},
"require": {
@@ -2973,9 +2974,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.32.0"
"source": "https://github.com/thephpleague/flysystem/tree/3.33.0"
},
"time": "2026-02-25T17:01:41+00:00"
"time": "2026-03-25T07:59:30+00:00"
},
{
"name": "league/flysystem-local",
@@ -10173,22 +10174,22 @@
},
{
"name": "cloudcreativity/json-api-testing",
"version": "v6.2.0",
"version": "v6.3.0",
"source": {
"type": "git",
"url": "https://github.com/cloudcreativity/json-api-testing.git",
"reference": "bb2ff0a87013d40781ca7f959023491d6f1b4ed2"
"reference": "c6f1460dae648a28217b182195f8ca4ed0ee9bd5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/cloudcreativity/json-api-testing/zipball/bb2ff0a87013d40781ca7f959023491d6f1b4ed2",
"reference": "bb2ff0a87013d40781ca7f959023491d6f1b4ed2",
"url": "https://api.github.com/repos/cloudcreativity/json-api-testing/zipball/c6f1460dae648a28217b182195f8ca4ed0ee9bd5",
"reference": "c6f1460dae648a28217b182195f8ca4ed0ee9bd5",
"shasum": ""
},
"require": {
"ext-json": "*",
"illuminate/contracts": "^10.0|^11.0|^12.0",
"illuminate/support": "^10.0|^11.0|^12.0",
"illuminate/contracts": "^10.0|^11.0|^12.0|^13.0",
"illuminate/support": "^10.0|^11.0|^12.0|^13.0",
"php": "^8.2",
"phpunit/phpunit": "^10.5|^11.0|^12.0"
},
@@ -10225,9 +10226,9 @@
],
"support": {
"issues": "https://github.com/cloudcreativity/json-api/issues",
"source": "https://github.com/cloudcreativity/json-api-testing/tree/v6.2.0"
"source": "https://github.com/cloudcreativity/json-api-testing/tree/v6.3.0"
},
"time": "2025-04-09T19:15:46+00:00"
"time": "2026-03-28T18:04:28+00:00"
},
{
"name": "composer/class-map-generator",
@@ -10835,28 +10836,28 @@
},
{
"name": "laravel-json-api/testing",
"version": "v3.1.0",
"version": "v3.2.0",
"source": {
"type": "git",
"url": "https://github.com/laravel-json-api/testing.git",
"reference": "bbf3b31b977955eff93c47ff101c4a134a3ffa8f"
"reference": "506d434a47ebd9bcc7dfca0096c63b79d28427a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel-json-api/testing/zipball/bbf3b31b977955eff93c47ff101c4a134a3ffa8f",
"reference": "bbf3b31b977955eff93c47ff101c4a134a3ffa8f",
"url": "https://api.github.com/repos/laravel-json-api/testing/zipball/506d434a47ebd9bcc7dfca0096c63b79d28427a8",
"reference": "506d434a47ebd9bcc7dfca0096c63b79d28427a8",
"shasum": ""
},
"require": {
"cloudcreativity/json-api-testing": "^6.1",
"cloudcreativity/json-api-testing": "^6.3",
"ext-json": "*",
"illuminate/http": "^11.0|^12.0",
"illuminate/support": "^11.0|^12.0",
"illuminate/testing": "^11.0|^12.0",
"illuminate/http": "^11.0|^12.0|^13.0",
"illuminate/support": "^11.0|^12.0|^13.0",
"illuminate/testing": "^11.0|^12.0|^13.0",
"php": "^8.2"
},
"require-dev": {
"laravel/framework": "^11.0|^12.0",
"laravel/framework": "^11.0|^12.0|^13.0",
"phpunit/phpunit": "^10.5|^11.0"
},
"type": "library",
@@ -10881,7 +10882,7 @@
},
{
"name": "Christopher Gammie",
"email": "contact@gammie.co.uk"
"email": "chris@cloudcreativity.co.uk"
}
],
"description": "Test helpers for JSON:API compliant APIs.",
@@ -10894,9 +10895,9 @@
],
"support": {
"issues": "https://github.com/laravel-json-api/testing/issues",
"source": "https://github.com/laravel-json-api/testing/tree/v3.1.0"
"source": "https://github.com/laravel-json-api/testing/tree/v3.2.0"
},
"time": "2025-02-24T20:39:08+00:00"
"time": "2026-03-28T18:06:47+00:00"
},
{
"name": "mockery/mockery",
@@ -11435,11 +11436,11 @@
},
{
"name": "phpstan/phpstan",
"version": "2.1.42",
"version": "2.1.44",
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/1279e1ce86ba768f0780c9d889852b4e02ff40d0",
"reference": "1279e1ce86ba768f0780c9d889852b4e02ff40d0",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/4a88c083c668b2c364a425c9b3171b2d9ea5d218",
"reference": "4a88c083c668b2c364a425c9b3171b2d9ea5d218",
"shasum": ""
},
"require": {
@@ -11484,7 +11485,7 @@
"type": "github"
}
],
"time": "2026-03-17T14:58:32+00:00"
"time": "2026-03-25T17:34:21+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",

View File

@@ -78,8 +78,8 @@ return [
'running_balance_column' => (bool)envDefaultWhenEmpty(env('USE_RUNNING_BALANCE'), true), // this is only the default value, is not used.
// see cer.php for exchange rates feature flag.
],
'version' => 'develop/2026-03-22',
'build_time' => 1774159352,
'version' => 'develop/2026-03-29',
'build_time' => 1774795378,
'api_version' => '2.1.0', // field is no longer used.
'db_version' => 28, // field is no longer used.

1435
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,10 +9,10 @@
},
"devDependencies": {
"axios": "^1",
"laravel-vite-plugin": "^2",
"laravel-vite-plugin": "^3",
"patch-package": "^8",
"sass": "^1",
"vite": "^7",
"vite": "^8",
"vite-plugin-manifest-sri": "^0.2.0"
},
"dependencies": {

View File

@@ -70,6 +70,7 @@ return [
'rule_action_value' => 'This value is invalid for the selected action.',
'file_already_attached' => 'Uploaded file ":name" is already attached to this object.',
'file_attached' => 'Successfully uploaded file ":name".',
'cannot_add_piggy_amount' => 'This amount cannot be added to the piggy bank.',
'file_zero' => 'The file is zero bytes in size.',
'must_exist' => 'The ID in field :attribute does not exist in the database.',
'all_accounts_equal' => 'All accounts in this field must be equal.',

View File

@@ -28,8 +28,8 @@
{% if objectType != 'liabilities' %}
<th class="hidden-sm hidden-xs hidden-md">{{ trans('list.lastActivity') }}</th>
{% endif %}
<th class="fifteen"
class="hidden-sm hidden-xs hidden-md">{{ trans('list.balanceDiff') }}</th>
<th
class="fifteen hidden-sm hidden-xs hidden-md">{{ trans('list.balanceDiff') }}</th>
<th class="hidden-sm hidden-xs">&nbsp;</th>
</tr>
</thead>