diff --git a/.ci/php-cs-fixer/composer.lock b/.ci/php-cs-fixer/composer.lock
index 855dcefdd6..b59e024a1e 100644
--- a/.ci/php-cs-fixer/composer.lock
+++ b/.ci/php-cs-fixer/composer.lock
@@ -402,16 +402,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
- "version": "v3.93.1",
+ "version": "v3.94.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
- "reference": "b3546ab487c0762c39f308dc1ec0ea2c461fc21a"
+ "reference": "883b20fb38c7866de9844ab6d0a205c423bde2d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b3546ab487c0762c39f308dc1ec0ea2c461fc21a",
- "reference": "b3546ab487c0762c39f308dc1ec0ea2c461fc21a",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/883b20fb38c7866de9844ab6d0a205c423bde2d4",
+ "reference": "883b20fb38c7866de9844ab6d0a205c423bde2d4",
"shasum": ""
},
"require": {
@@ -428,7 +428,7 @@
"react/event-loop": "^1.5",
"react/socket": "^1.16",
"react/stream": "^1.4",
- "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0",
+ "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0",
"symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
@@ -442,18 +442,18 @@
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
},
"require-dev": {
- "facile-it/paraunit": "^1.3.1 || ^2.7",
- "infection/infection": "^0.32",
- "justinrainbow/json-schema": "^6.6",
+ "facile-it/paraunit": "^1.3.1 || ^2.7.1",
+ "infection/infection": "^0.32.3",
+ "justinrainbow/json-schema": "^6.6.4",
"keradus/cli-executor": "^2.3",
"mikey179/vfsstream": "^1.6.12",
- "php-coveralls/php-coveralls": "^2.9",
- "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
- "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
- "phpunit/phpunit": "^9.6.31 || ^10.5.60 || ^11.5.48",
+ "php-coveralls/php-coveralls": "^2.9.1",
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.7",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.7",
+ "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.51",
"symfony/polyfill-php85": "^1.33",
- "symfony/var-dumper": "^5.4.48 || ^6.4.26 || ^7.4.0 || ^8.0",
- "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0"
+ "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.4",
+ "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.1"
},
"suggest": {
"ext-dom": "For handling output formats in XML",
@@ -494,7 +494,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
- "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.93.1"
+ "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.0"
},
"funding": [
{
@@ -502,7 +502,7 @@
"type": "github"
}
],
- "time": "2026-01-28T23:50:50+00:00"
+ "time": "2026-02-11T16:44:33+00:00"
},
{
"name": "psr/container",
@@ -1185,29 +1185,29 @@
},
{
"name": "sebastian/diff",
- "version": "7.0.0",
+ "version": "8.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "7ab1ea946c012266ca32390913653d844ecd085f"
+ "reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f",
- "reference": "7ab1ea946c012266ca32390913653d844ecd085f",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
+ "reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
"shasum": ""
},
"require": {
- "php": ">=8.3"
+ "php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^12.0",
+ "phpunit/phpunit": "^13.0",
"symfony/process": "^7.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "7.0-dev"
+ "dev-main": "8.0-dev"
}
},
"autoload": {
@@ -1240,15 +1240,27 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
- "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0"
+ "source": "https://github.com/sebastianbergmann/diff/tree/8.0.0"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/diff",
+ "type": "tidelift"
}
],
- "time": "2025-02-07T04:55:46+00:00"
+ "time": "2026-02-06T04:42:27+00:00"
},
{
"name": "symfony/console",
diff --git a/app/Events/Model/Bill/UpdatedExistingBill.php b/app/Events/Model/Bill/UpdatedExistingBill.php
index 0a11e81603..1adf257dca 100644
--- a/app/Events/Model/Bill/UpdatedExistingBill.php
+++ b/app/Events/Model/Bill/UpdatedExistingBill.php
@@ -1,4 +1,7 @@
bill->name !== $event->oldData['name']) {
$this->updateBillTriggersAndActions($event->bill, $event->oldData);
}
}
-
private function updateBillTriggersAndActions(Bill $bill, array $oldData): void
{
Log::debug(sprintf('Now in updateBillTriggersAndActions(#%d)', $bill->id));
$repository = app(RuleRepositoryInterface::class);
$repository->setUser($bill->user);
- $rules = $repository->getAll();
+ $rules = $repository->getAll();
/** @var Rule $rule */
foreach ($rules as $rule) {
@@ -58,6 +59,7 @@ class UpdatesRulesForChangedBill implements ShouldQueue
private function updateRule(Bill $bill, Rule $rule, array $oldData): void
{
$triggers = ['bill_is', 'bill_ends', 'bill_starts', 'bill_contains'];
+
/** @var RuleTrigger $trigger */
foreach ($rule->ruleTriggers as $trigger) {
if (in_array($trigger->trigger_type, $triggers, true) && $trigger->trigger_value === $oldData['name']) {
@@ -66,14 +68,14 @@ class UpdatesRulesForChangedBill implements ShouldQueue
$trigger->save();
}
}
+
/** @var RuleAction $action */
foreach ($rule->ruleActions as $action) {
- if ($action->action_type === 'link_to_bill' && $action->action_value === $oldData['name']) {
+ if ('link_to_bill' === $action->action_type && $action->action_value === $oldData['name']) {
Log::debug(sprintf('Updated action #%d in rule #%d to new subscription name', $action->id, $rule->id));
$action->action_value = $bill->name;
$action->save();
}
}
}
-
}
diff --git a/app/Services/Internal/Update/BillUpdateService.php b/app/Services/Internal/Update/BillUpdateService.php
index 1303195def..38d7825c4c 100644
--- a/app/Services/Internal/Update/BillUpdateService.php
+++ b/app/Services/Internal/Update/BillUpdateService.php
@@ -30,7 +30,6 @@ use FireflyIII\Models\Bill;
use FireflyIII\Models\ObjectGroup;
use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleTrigger;
-use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\ObjectGroup\CreatesObjectGroups;
use FireflyIII\Services\Internal\Support\BillServiceTrait;
use FireflyIII\Support\Facades\Amount;
@@ -51,7 +50,7 @@ class BillUpdateService
public function update(Bill $bill, array $data): Bill
{
$this->user = $bill->user;
- $oldData = $bill->toArray();
+ $oldData = $bill->toArray();
if (array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) {
$factory = app(TransactionCurrencyFactory::class);
diff --git a/app/Support/Authentication/RemoteUserGuard.php b/app/Support/Authentication/RemoteUserGuard.php
index 604adae369..e4c39f6355 100644
--- a/app/Support/Authentication/RemoteUserGuard.php
+++ b/app/Support/Authentication/RemoteUserGuard.php
@@ -39,14 +39,16 @@ use Illuminate\Support\Facades\Log;
class RemoteUserGuard implements Guard
{
protected Application $application;
- protected ?User $user = null;
- private $tried = false;
+ protected ?User $user = null;
+ private $tried = false;
/**
* Create a new authentication guard.
*/
- public function __construct(protected UserProvider $provider, Application $app)
- {
+ public function __construct(
+ protected UserProvider $provider,
+ Application $app
+ ) {
$app->get('request');
Log::debug(sprintf('Created RemoteUserGuard for %s "%s"', $app->get('request')?->getMethod(), $app->get('request')?->getRequestUri()));
$this->application = $app;
@@ -54,7 +56,7 @@ class RemoteUserGuard implements Guard
public function authenticate(): void
{
- $this->tried = true;
+ $this->tried = true;
Log::debug(sprintf('Now at %s', __METHOD__));
if ($this->user instanceof User) {
Log::debug(sprintf('%s is found: #%d, "%s".', $this->user::class, $this->user->id, $this->user->email));
@@ -62,8 +64,8 @@ class RemoteUserGuard implements Guard
return;
}
// Get the user identifier from $_SERVER or apache filtered headers
- $header = config('auth.guard_header', 'REMOTE_USER');
- $userID = request()->server($header) ?? null;
+ $header = config('auth.guard_header', 'REMOTE_USER');
+ $userID = request()->server($header) ?? null;
if (function_exists('apache_request_headers')) {
Log::debug('Use apache_request_headers to find user ID.');
@@ -85,10 +87,10 @@ class RemoteUserGuard implements Guard
$retrievedUser = $this->provider->retrieveById($userID);
// store email address if present in header and not already set.
- $header = config('auth.guard_email');
+ $header = config('auth.guard_email');
if (null !== $header) {
- $emailAddress = (string)(request()->server($header) ?? apache_request_headers()[$header] ?? null);
+ $emailAddress = (string) (request()->server($header) ?? apache_request_headers()[$header] ?? null);
$preference = Preferences::getForUser($retrievedUser, 'remote_guard_alt_email');
if ('' !== $emailAddress && null === $preference && $emailAddress !== $userID) {
@@ -101,7 +103,7 @@ class RemoteUserGuard implements Guard
}
Log::debug(sprintf('Result of getting user from provider: %s', $retrievedUser->email));
- $this->user = $retrievedUser;
+ $this->user = $retrievedUser;
}
public function check(): bool
@@ -128,14 +130,14 @@ class RemoteUserGuard implements Guard
/**
* @SuppressWarnings("PHPMD.ShortMethodName")
*/
- public function id(): int | string | null
+ public function id(): int|string|null
{
// Log::debug(sprintf('Now at %s', __METHOD__));
return $this->user?->id;
}
- public function setUser(Authenticatable | User | null $user): void // @phpstan-ignore-line
+ public function setUser(Authenticatable|User|null $user): void // @phpstan-ignore-line
{
// Log::debug(sprintf('Now at %s', __METHOD__));
if ($user instanceof User) {
@@ -155,7 +157,6 @@ class RemoteUserGuard implements Guard
// Log::debug(sprintf('Now at %s', __METHOD__));
$user = $this->user;
-
if (!$user instanceof User) {
Log::debug('User is NULL');
diff --git a/app/Support/Calendar/Calculator.php b/app/Support/Calendar/Calculator.php
index 0954058351..5d44cb2363 100644
--- a/app/Support/Calendar/Calculator.php
+++ b/app/Support/Calendar/Calculator.php
@@ -48,6 +48,7 @@ class Calculator
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private static array $intervals = [];
public function isAvailablePeriodicity(Periodicity $periodicity): bool
diff --git a/app/Support/Export/ExportDataGenerator.php b/app/Support/Export/ExportDataGenerator.php
index b40ed94f2b..3c3e4963b8 100644
--- a/app/Support/Export/ExportDataGenerator.php
+++ b/app/Support/Export/ExportDataGenerator.php
@@ -114,6 +114,8 @@ class ExportDataGenerator
// @phpstan-ignore-line
+ // @phpstan-ignore-line
+
public function __construct()
{
$this->accounts = new Collection();
diff --git a/app/Support/Http/Controllers/PeriodOverview.php b/app/Support/Http/Controllers/PeriodOverview.php
index 5668dec562..3b3dc9cf3a 100644
--- a/app/Support/Http/Controllers/PeriodOverview.php
+++ b/app/Support/Http/Controllers/PeriodOverview.php
@@ -93,6 +93,7 @@ trait PeriodOverview
// temp data holder
// temp data holder
// temp data holder
+ // temp data holder
private array $transactions; // temp data holder
// temp data holder
@@ -119,6 +120,8 @@ trait PeriodOverview
// temp data holder
+ // temp data holder
+
/**
* This method returns "period entries", so nov-2015, dec-2015, etc. (this depends on the users session range)
* and for each period, the amount of money spent and earned. This is a complex operation which is cached for
diff --git a/app/Support/JsonApi/Enrichments/AvailableBudgetEnrichment.php b/app/Support/JsonApi/Enrichments/AvailableBudgetEnrichment.php
index c8c586e330..3179f42645 100644
--- a/app/Support/JsonApi/Enrichments/AvailableBudgetEnrichment.php
+++ b/app/Support/JsonApi/Enrichments/AvailableBudgetEnrichment.php
@@ -53,6 +53,7 @@ class AvailableBudgetEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private readonly bool $convertToPrimary; // @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
@@ -66,6 +67,7 @@ class AvailableBudgetEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private array $currencies = [];
private array $currencyIds = [];
private array $ids = [];
diff --git a/app/Support/JsonApi/Enrichments/BudgetLimitEnrichment.php b/app/Support/JsonApi/Enrichments/BudgetLimitEnrichment.php
index 9226270d9a..8045b82968 100644
--- a/app/Support/JsonApi/Enrichments/BudgetLimitEnrichment.php
+++ b/app/Support/JsonApi/Enrichments/BudgetLimitEnrichment.php
@@ -53,6 +53,7 @@ class BudgetLimitEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private array $currencies = [];
private array $currencyIds = [];
private Carbon $end;
diff --git a/app/Support/JsonApi/Enrichments/PiggyBankEnrichment.php b/app/Support/JsonApi/Enrichments/PiggyBankEnrichment.php
index 7e9e5b6a31..e661d0dcca 100644
--- a/app/Support/JsonApi/Enrichments/PiggyBankEnrichment.php
+++ b/app/Support/JsonApi/Enrichments/PiggyBankEnrichment.php
@@ -55,6 +55,7 @@ class PiggyBankEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private array $accounts = []; // @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
@@ -68,6 +69,7 @@ class PiggyBankEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private array $amounts = [];
private Collection $collection;
private array $currencies = [];
diff --git a/app/Support/JsonApi/Enrichments/PiggyBankEventEnrichment.php b/app/Support/JsonApi/Enrichments/PiggyBankEventEnrichment.php
index 5ca935ac80..ba1892b9ba 100644
--- a/app/Support/JsonApi/Enrichments/PiggyBankEventEnrichment.php
+++ b/app/Support/JsonApi/Enrichments/PiggyBankEventEnrichment.php
@@ -50,6 +50,7 @@ class PiggyBankEventEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private array $accountIds = []; // @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
@@ -63,6 +64,7 @@ class PiggyBankEventEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private Collection $collection;
private array $currencies = [];
private array $groupIds = [];
diff --git a/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php b/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php
index 1a23d40777..a78d829d87 100644
--- a/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php
+++ b/app/Support/JsonApi/Enrichments/SubscriptionEnrichment.php
@@ -59,6 +59,7 @@ class SubscriptionEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private readonly bool $convertToPrimary;
private ?Carbon $end = null;
private array $mappedObjects = [];
diff --git a/app/Support/JsonApi/Enrichments/TransactionGroupEnrichment.php b/app/Support/JsonApi/Enrichments/TransactionGroupEnrichment.php
index ce9d541cf6..6c99908217 100644
--- a/app/Support/JsonApi/Enrichments/TransactionGroupEnrichment.php
+++ b/app/Support/JsonApi/Enrichments/TransactionGroupEnrichment.php
@@ -79,6 +79,8 @@ class TransactionGroupEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
+ // @phpstan-ignore-line
+
public function __construct()
{
$this->dateFields = ['interest_date', 'book_date', 'process_date', 'due_date', 'payment_date', 'invoice_date'];
diff --git a/app/Support/JsonApi/Enrichments/WebhookEnrichment.php b/app/Support/JsonApi/Enrichments/WebhookEnrichment.php
index dee098fbd8..93f54eaa36 100644
--- a/app/Support/JsonApi/Enrichments/WebhookEnrichment.php
+++ b/app/Support/JsonApi/Enrichments/WebhookEnrichment.php
@@ -55,6 +55,7 @@ class WebhookEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private array $ids = []; // @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
@@ -68,6 +69,7 @@ class WebhookEnrichment implements EnrichmentInterface
// @phpstan-ignore-line
// @phpstan-ignore-line
// @phpstan-ignore-line
+ // @phpstan-ignore-line
private array $responses = [];
private array $triggers = [];
private array $webhookDeliveries = [];
diff --git a/composer.lock b/composer.lock
index 492be4d4cf..c4963f3dc9 100644
--- a/composer.lock
+++ b/composer.lock
@@ -3894,16 +3894,16 @@
},
{
"name": "nette/utils",
- "version": "v4.1.2",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5"
+ "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/f76b5dc3d6c6d3043c8d937df2698515b99cbaf5",
- "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5",
+ "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe",
+ "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe",
"shasum": ""
},
"require": {
@@ -3915,8 +3915,10 @@
},
"require-dev": {
"jetbrains/phpstorm-attributes": "^1.2",
+ "nette/phpstan-rules": "^1.0",
"nette/tester": "^2.5",
- "phpstan/phpstan": "^2.0@stable",
+ "phpstan/extension-installer": "^1.4@stable",
+ "phpstan/phpstan": "^2.1@stable",
"tracy/tracy": "^2.9"
},
"suggest": {
@@ -3977,9 +3979,9 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v4.1.2"
+ "source": "https://github.com/nette/utils/tree/v4.1.3"
},
- "time": "2026-02-03T17:21:09+00:00"
+ "time": "2026-02-13T03:05:33+00:00"
},
{
"name": "nunomaduro/collision",
@@ -5120,16 +5122,16 @@
},
{
"name": "predis/predis",
- "version": "v3.3.0",
+ "version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/predis/predis.git",
- "reference": "153097374b39a2f737fe700ebcd725642526cdec"
+ "reference": "1183f5732e6b10efd33f64984a96726eaecb59aa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/predis/predis/zipball/153097374b39a2f737fe700ebcd725642526cdec",
- "reference": "153097374b39a2f737fe700ebcd725642526cdec",
+ "url": "https://api.github.com/repos/predis/predis/zipball/1183f5732e6b10efd33f64984a96726eaecb59aa",
+ "reference": "1183f5732e6b10efd33f64984a96726eaecb59aa",
"shasum": ""
},
"require": {
@@ -5171,7 +5173,7 @@
],
"support": {
"issues": "https://github.com/predis/predis/issues",
- "source": "https://github.com/predis/predis/tree/v3.3.0"
+ "source": "https://github.com/predis/predis/tree/v3.4.0"
},
"funding": [
{
@@ -5179,7 +5181,7 @@
"type": "github"
}
],
- "time": "2025-11-24T17:48:50+00:00"
+ "time": "2026-02-11T17:30:28+00:00"
},
{
"name": "psr/cache",
@@ -11414,11 +11416,11 @@
},
{
"name": "phpstan/phpstan",
- "version": "2.1.38",
+ "version": "2.1.39",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dfaf1f530e1663aa167bc3e52197adb221582629",
- "reference": "dfaf1f530e1663aa167bc3e52197adb221582629",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224",
+ "reference": "c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224",
"shasum": ""
},
"require": {
@@ -11463,25 +11465,25 @@
"type": "github"
}
],
- "time": "2026-01-30T17:12:46+00:00"
+ "time": "2026-02-11T14:48:56+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
- "version": "2.0.3",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
- "reference": "468e02c9176891cc901143da118f09dc9505fc2f"
+ "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f",
- "reference": "468e02c9176891cc901143da118f09dc9505fc2f",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc",
+ "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.15"
+ "phpstan/phpstan": "^2.1.39"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
@@ -11506,29 +11508,32 @@
"MIT"
],
"description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
+ "keywords": [
+ "static analysis"
+ ],
"support": {
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
- "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3"
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4"
},
- "time": "2025-05-14T10:56:57+00:00"
+ "time": "2026-02-09T13:21:14+00:00"
},
{
"name": "phpstan/phpstan-strict-rules",
- "version": "2.0.8",
+ "version": "2.0.10",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-strict-rules.git",
- "reference": "1ed9e626a37f7067b594422411539aa807190573"
+ "reference": "1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/1ed9e626a37f7067b594422411539aa807190573",
- "reference": "1ed9e626a37f7067b594422411539aa807190573",
+ "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f",
+ "reference": "1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.29"
+ "phpstan/phpstan": "^2.1.39"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
@@ -11554,11 +11559,14 @@
"MIT"
],
"description": "Extra strict and opinionated rules for PHPStan",
+ "keywords": [
+ "static analysis"
+ ],
"support": {
"issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
- "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.8"
+ "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.10"
},
- "time": "2026-01-27T08:10:25+00:00"
+ "time": "2026-02-11T14:17:32+00:00"
},
{
"name": "phpunit/php-code-coverage",
diff --git a/config/firefly.php b/config/firefly.php
index 1a6d901468..f081a38f25 100644
--- a/config/firefly.php
+++ b/config/firefly.php
@@ -78,8 +78,8 @@ return [
'running_balance_column' => (bool)envNonEmpty('USE_RUNNING_BALANCE', true), // this is only the default value, is not used.
// see cer.php for exchange rates feature flag.
],
- 'version' => 'develop/2026-02-10',
- 'build_time' => 1770751756,
+ 'version' => 'develop/2026-02-13',
+ 'build_time' => 1770965855,
'api_version' => '2.1.0', // field is no longer used.
'db_version' => 28, // field is no longer used.
diff --git a/package-lock.json b/package-lock.json
index 258e22269d..63947d507d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7118,9 +7118,9 @@
}
},
"node_modules/i18next": {
- "version": "25.8.4",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.4.tgz",
- "integrity": "sha512-a9A0MnUjKvzjEN/26ZY1okpra9kA8MEwzYEz1BNm+IyxUKPRH6ihf0p7vj8YvULwZHKHl3zkJ6KOt4hewxBecQ==",
+ "version": "25.8.6",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.6.tgz",
+ "integrity": "sha512-HsS6p2yr/Vo5EPljWuBJ9OxKVFok2Q/Oa6PvFTpv2bMcDt2sQMOnKDQ7FTDDdME+3d1YULQjKj7aVSZP1bCouQ==",
"funding": [
{
"type": "individual",
@@ -9717,9 +9717,9 @@
"license": "MIT"
},
"node_modules/qs": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
- "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -11801,9 +11801,9 @@
"license": "BSD-2-Clause"
},
"node_modules/webpack": {
- "version": "5.105.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.1.tgz",
- "integrity": "sha512-Gdj3X74CLJJ8zy4URmK42W7wTZUJrqL+z8nyGEr4dTN0kb3nVs+ZvjbTOqRYPD7qX4tUmwyHL9Q9K6T1seW6Yw==",
+ "version": "5.105.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz",
+ "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/resources/assets/v1/src/locales/da.json b/resources/assets/v1/src/locales/da.json
index aec14e84ab..076060954e 100644
--- a/resources/assets/v1/src/locales/da.json
+++ b/resources/assets/v1/src/locales/da.json
@@ -22,8 +22,8 @@
"not_enough_currencies": "Not enough currencies",
"not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.",
"transaction_stored_link": "Transaction #{ID} (\"{title}\")<\/a> has been stored.",
- "webhook_stored_link": "Webhook #{ID} (\"{title}\")<\/a> has been stored.",
- "webhook_updated_link": "Webhook #{ID}<\/a> (\"{title}\") has been updated.",
+ "webhook_stored_link": "Webhook #{ID} (\"{title}\")<\/a> er blevet gemt.",
+ "webhook_updated_link": "Webhook #{ID}<\/a> (\"{title}\") er blevet opdateret.",
"transaction_updated_link": "Transaction #{ID}<\/a> (\"{title}\") has been updated.",
"transaction_new_stored_link": "Transaction #{ID}<\/a> has been stored.",
"transaction_journal_information": "Transaction information",
@@ -31,7 +31,7 @@
"apply_rules_checkbox": "Apply rules",
"fire_webhooks_checkbox": "Fire webhooks",
"no_budget_pointer": "Det ser ud til, at du ikke har oprettet budgetter endnu. Du burde oprette nogle p\u00e5 budgetsiden<\/a>. Budgetter kan hj\u00e6lpe dig med at holde styr p\u00e5 udgifter.",
- "no_bill_pointer": "You seem to have no subscription yet. You should create some on the subscription<\/a>-page. Subscriptions can help you keep track of expenses.",
+ "no_bill_pointer": "Det ser ikke ud til, at du har nogle budgetter endnu. Du burde oprette nogle p\u00e5 budgetsiden<\/a>. Budgetter kan hj\u00e6lpe dig med at holde styr p\u00e5 udgifter.",
"source_account": "Kildekonto",
"hidden_fields_preferences": "You can enable more transaction options in your preferences<\/a>.",
"destination_account": "Destinationskonto",
@@ -107,42 +107,42 @@
"multi_account_warning_withdrawal": "Husk, at kildekontoen for efterf\u00f8lgende opdelinger vil blive overstyret af hvad der er defineret i den f\u00f8rste opdeling af tilbagetr\u00e6kningen.",
"multi_account_warning_deposit": "Husk, at destinationskontoen for efterf\u00f8lgende opdelinger vil blive tilsidesat af hvad der er defineret i den f\u00f8rste opsplitning af depositummet.",
"multi_account_warning_transfer": "Husk p\u00e5, at kilden + destination konto for efterf\u00f8lgende opdelinger vil blive overstyret af hvad der er defineret i den f\u00f8rste opdeling af overf\u00f8rslen.",
- "webhook_trigger_ANY": "After any event",
+ "webhook_trigger_ANY": "Efter enhver begivenhed",
"webhook_trigger_STORE_TRANSACTION": "Efter oprettelse af transaktion",
"webhook_trigger_UPDATE_TRANSACTION": "Efter opdatering af transaktion",
"webhook_trigger_DESTROY_TRANSACTION": "Efter sletning af transaktion",
- "webhook_trigger_STORE_BUDGET": "After budget creation",
- "webhook_trigger_UPDATE_BUDGET": "After budget update",
- "webhook_trigger_DESTROY_BUDGET": "After budget delete",
- "webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
+ "webhook_trigger_STORE_BUDGET": "Efter budgetoprettelse",
+ "webhook_trigger_UPDATE_BUDGET": "Efter budgetopdatering",
+ "webhook_trigger_DESTROY_BUDGET": "Efter sletning af budget",
+ "webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "Efter budgetteret bel\u00f8b \u00e6ndring",
"webhook_response_TRANSACTIONS": "Transaktionsdetaljer",
- "webhook_response_RELEVANT": "Relevant details",
+ "webhook_response_RELEVANT": "Relevante oplysninger",
"webhook_response_ACCOUNTS": "Kontodetaljer",
- "webhook_response_NONE": "No details",
+ "webhook_response_NONE": "Ingen detaljer",
"webhook_delivery_JSON": "JSON",
"actions": "Handlinger",
"meta_data": "Meta data",
"webhook_messages": "Webhook-besked",
"inactive": "Inactive",
"no_webhook_messages": "Der er ingen webhook-beskeder",
- "inspect": "Inspect",
+ "inspect": "Unders\u00f8g",
"create_new_webhook": "Opret ny webhook",
"webhooks": "Webhooks",
- "webhook_trigger_form_help": "Indicate on what event the webhook will trigger",
- "webhook_response_form_help": "Indicate what the webhook must submit to the URL.",
+ "webhook_trigger_form_help": "Indik\u00e9r p\u00e5 hvilken begivenhed webhook vil udl\u00f8se",
+ "webhook_response_form_help": "Angiv, hvad webhook skal indsende til URL.",
"webhook_delivery_form_help": "Hvilket format webhook skal levere data i.",
"webhook_active_form_help": "Webhooken skal v\u00e6re aktiv, ellers vil den ikke blive kaldt.",
"edit_webhook_js": "Rediger webhook \"{title}\"",
- "webhook_was_triggered": "The webhook was triggered on the indicated transaction. Please wait for results to appear.",
+ "webhook_was_triggered": "Webhooken blev udl\u00f8st p\u00e5 den angivne transaktion. Vent venligst p\u00e5 at resultaterne vises.",
"view_message": "Vis besked",
"view_attempts": "Vis mislykkede fors\u00f8g",
"message_content_title": "Webhook-beskedindhold",
- "message_content_help": "This is the content of the message that was sent (or tried) using this webhook.",
+ "message_content_help": "Dette er indholdet af den besked, der blev sendt (eller fors\u00f8gt) ved hj\u00e6lp af denne webhook.",
"attempt_content_title": "Webhook-fors\u00f8g",
- "attempt_content_help": "These are all the unsuccessful attempts of this webhook message to submit to the configured URL. After some time, Firefly III will stop trying.",
+ "attempt_content_help": "Disse er alle de mislykkede fors\u00f8g p\u00e5 at sende denne webhook-meddelelse til den konfigurerede URL. Efter et stykke tid vil Firefly III stoppe med at fors\u00f8ge.",
"no_attempts": "Der er ingen mislykkede fors\u00f8g. Det er en god ting!",
- "webhook_attempt_at": "Attempt at {moment}",
- "logs": "Logs",
+ "webhook_attempt_at": "Fors\u00f8g p\u00e5 {moment}",
+ "logs": "Logfiler",
"response": "Svar",
"visit_webhook_url": "Bes\u00f8g webhook-URL",
"reset_webhook_secret": "Nulstil webhook-hemmelighed",
diff --git a/resources/assets/v1/src/locales/ko.json b/resources/assets/v1/src/locales/ko.json
index d1793e50d7..604684a8b3 100644
--- a/resources/assets/v1/src/locales/ko.json
+++ b/resources/assets/v1/src/locales/ko.json
@@ -62,7 +62,7 @@
"destination_account_reconciliation": "\uc870\uc815 \uac70\ub798\uc758 \ubaa9\uc801\uc9c0 \uacc4\uc815\uc740 \ud3b8\uc9d1\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
"source_account_reconciliation": "\uc870\uc815 \uac70\ub798\uc758 \ucd9c\ubc1c\uc9c0 \uacc4\uc815\uc740 \ud3b8\uc9d1\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
"budget": "\uc608\uc0b0",
- "bill": "Subscription",
+ "bill": "\uad6c\ub3c5",
"you_create_withdrawal": "\ucd9c\uae08\uc744 \uc0dd\uc131\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.",
"you_create_transfer": "\uc804\uc1a1\uc744 \uc0dd\uc131\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.",
"you_create_deposit": "\uc785\uae08\uc744 \uc0dd\uc131\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.",