From 32fe62df03f67815947a759b6e50d86a707fa70f Mon Sep 17 00:00:00 2001 From: JC5 Date: Fri, 20 Mar 2026 08:24:57 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20Auto=20commit=20for=20release=20?= =?UTF-8?q?'develop'=20on=202026-03-20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- THANKS.md | 1 + .../Models/Recurrence/ListController.php | 2 +- .../TransactionLinkType/ListController.php | 2 +- .../Report/Standard/YearReportGenerator.php | 15 +-- .../Report/Tag/MonthReportGenerator.php | 10 +- .../Controllers/PreferencesController.php | 123 +++++++++--------- app/Http/Controllers/TagController.php | 122 ++++++++--------- .../Transaction/ConvertController.php | 2 +- app/Http/Middleware/SecureHeaders.php | 4 +- .../PrimaryAmountRecalculationService.php | 3 +- .../Internal/Update/JournalUpdateService.php | 5 +- composer.lock | 44 ++++--- config/firefly.php | 4 +- package-lock.json | 99 +++++++------- resources/assets/v1/src/locales/ru.json | 16 +-- resources/assets/v1/src/locales/uk.json | 2 +- 16 files changed, 231 insertions(+), 223 deletions(-) diff --git a/THANKS.md b/THANKS.md index 7b0b584133..170262e928 100755 --- a/THANKS.md +++ b/THANKS.md @@ -4,6 +4,7 @@ Over time, many people have contributed to Firefly III. Their efforts are not al Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution. ## 2026 +- Daniel Holøien - Matthew Grove - Cinnamon Pyro - R1DEN diff --git a/app/Api/V1/Controllers/Models/Recurrence/ListController.php b/app/Api/V1/Controllers/Models/Recurrence/ListController.php index b48c5b0263..db7599498e 100644 --- a/app/Api/V1/Controllers/Models/Recurrence/ListController.php +++ b/app/Api/V1/Controllers/Models/Recurrence/ListController.php @@ -83,7 +83,7 @@ final class ListController extends Controller // use new group collector: /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); - if(0 === count($journalIds)) { + if (0 === count($journalIds)) { $collector->findNothing(); } $collector diff --git a/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php b/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php index 5cd42aca64..ef6d5abc34 100644 --- a/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php +++ b/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php @@ -84,7 +84,7 @@ final class ListController extends Controller // use new group collector: /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); - if(0 === count($journalIds)) { + if (0 === count($journalIds)) { $collector->findNothing(); } $collector diff --git a/app/Generator/Report/Standard/YearReportGenerator.php b/app/Generator/Report/Standard/YearReportGenerator.php index 9729830982..d6d296c5f5 100644 --- a/app/Generator/Report/Standard/YearReportGenerator.php +++ b/app/Generator/Report/Standard/YearReportGenerator.php @@ -56,15 +56,12 @@ class YearReportGenerator implements ReportGeneratorInterface $reportType = 'default'; try { - $result = view('reports.default.year', - [ - 'accountIds' => $accountIds, - 'reportType' => $reportType, - 'start' => $this->start, - 'end' => $this->end, - ]) - ->render() - ; + $result = view('reports.default.year', [ + 'accountIds' => $accountIds, + 'reportType' => $reportType, + 'start' => $this->start, + 'end' => $this->end, + ])->render(); } catch (Throwable $e) { Log::error(sprintf('Cannot render reports.account.report: %s', $e->getMessage())); Log::error($e->getTraceAsString()); diff --git a/app/Generator/Report/Tag/MonthReportGenerator.php b/app/Generator/Report/Tag/MonthReportGenerator.php index ce88337267..1c6795f444 100644 --- a/app/Generator/Report/Tag/MonthReportGenerator.php +++ b/app/Generator/Report/Tag/MonthReportGenerator.php @@ -66,11 +66,11 @@ class MonthReportGenerator implements ReportGeneratorInterface $result = view('reports.tag.month', [ 'accountIds' => $accountIds, 'reportType' => $reportType, - 'tagIds' => $tagIds, - 'start' => $this->start, - 'end' => $this->end, - 'tags' => $this->tags, - 'accounts' => $this->accounts, + 'tagIds' => $tagIds, + 'start' => $this->start, + 'end' => $this->end, + 'tags' => $this->tags, + 'accounts' => $this->accounts, ])->render(); } catch (Throwable $e) { Log::error(sprintf('Cannot render reports.tag.month: %s', $e->getMessage())); diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index a04cccf52a..d2721c4d19 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -44,6 +44,7 @@ use Illuminate\Support\Facades\Log; use Illuminate\View\View; use JsonException; use Safe\Exceptions\FilesystemException; + use function Safe\file_get_contents; use function Safe\json_decode; @@ -60,7 +61,7 @@ final class PreferencesController extends Controller parent::__construct(); $this->middleware(static function ($request, $next) { - app('view')->share('title', (string)trans('firefly.preferences')); + app('view')->share('title', (string) trans('firefly.preferences')); app('view')->share('mainTitleIcon', 'fa-gear'); return $next($request); @@ -75,22 +76,22 @@ final class PreferencesController extends Controller * @throws FireflyException * @throws FilesystemException */ - public function index(AccountRepositoryInterface $repository): Factory | \Illuminate\Contracts\View\View + public function index(AccountRepositoryInterface $repository): Factory|\Illuminate\Contracts\View\View { - $accounts = $repository->getAccountsByType([ - AccountTypeEnum::DEFAULT->value, - AccountTypeEnum::ASSET->value, - AccountTypeEnum::LOAN->value, - AccountTypeEnum::DEBT->value, - AccountTypeEnum::MORTGAGE->value, - ]); - $isDocker = config('firefly.is_docker'); - $groupedAccounts = []; + $accounts = $repository->getAccountsByType([ + AccountTypeEnum::DEFAULT->value, + AccountTypeEnum::ASSET->value, + AccountTypeEnum::LOAN->value, + AccountTypeEnum::DEBT->value, + AccountTypeEnum::MORTGAGE->value, + ]); + $isDocker = config('firefly.is_docker'); + $groupedAccounts = []; /** @var Account $account */ foreach ($accounts as $account) { - $type = $account->accountType->type; - $role = sprintf('opt_group_%s', $repository->getMetaValue($account, 'account_role')); + $type = $account->accountType->type; + $role = sprintf('opt_group_%s', $repository->getMetaValue($account, 'account_role')); if (in_array($type, [AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value], true)) { $role = sprintf('opt_group_l_%s', $type); @@ -99,48 +100,48 @@ final class PreferencesController extends Controller if ('opt_group_' === $role) { $role = 'opt_group_defaultAsset'; } - $groupedAccounts[(string)trans(sprintf('firefly.%s', $role))][$account->id] = $account->name; + $groupedAccounts[(string) trans(sprintf('firefly.%s', $role))][$account->id] = $account->name; } ksort($groupedAccounts); /** @var array $accountIds */ - $accountIds = $accounts->pluck('id')->toArray(); - $viewRange = Navigation::getViewRange(false); - $frontpageAccountsPref = Preferences::get('frontpageAccounts', $accountIds); - $frontpageAccounts = $frontpageAccountsPref->data; + $accountIds = $accounts->pluck('id')->toArray(); + $viewRange = Navigation::getViewRange(false); + $frontpageAccountsPref = Preferences::get('frontpageAccounts', $accountIds); + $frontpageAccounts = $frontpageAccountsPref->data; if (!is_array($frontpageAccounts)) { $frontpageAccounts = $accountIds; } - $language = Steam::getLanguage(); - $languages = config('firefly.languages'); - $locale = Preferences::get('locale', config('firefly.default_locale', 'equal'))->data; - $listPageSize = Preferences::get('listPageSize', 50)->data; - $darkMode = Preferences::get('darkMode', 'browser')->data; - $customFiscalYear = Preferences::get('customFiscalYear', 0)->data; - $fiscalYearStartStr = Preferences::get('fiscalYearStart', '01-01')->data; - $convertToPrimary = $this->convertToPrimary; + $language = Steam::getLanguage(); + $languages = config('firefly.languages'); + $locale = Preferences::get('locale', config('firefly.default_locale', 'equal'))->data; + $listPageSize = Preferences::get('listPageSize', 50)->data; + $darkMode = Preferences::get('darkMode', 'browser')->data; + $customFiscalYear = Preferences::get('customFiscalYear', 0)->data; + $fiscalYearStartStr = Preferences::get('fiscalYearStart', '01-01')->data; + $convertToPrimary = $this->convertToPrimary; if (is_array($fiscalYearStartStr)) { $fiscalYearStartStr = '01-01'; } - $fiscalYearStart = sprintf('%s-%s', Carbon::now()->format('Y'), (string)$fiscalYearStartStr); - $tjOptionalFields = Preferences::get('transaction_journal_optional_fields', [])->data; - $availableDarkModes = config('firefly.available_dark_modes'); + $fiscalYearStart = sprintf('%s-%s', Carbon::now()->format('Y'), (string) $fiscalYearStartStr); + $tjOptionalFields = Preferences::get('transaction_journal_optional_fields', [])->data; + $availableDarkModes = config('firefly.available_dark_modes'); // notifications settings - $slackUrl = Preferences::getEncrypted('slack_webhook_url', '')->data; - $pushoverAppToken = (string)Preferences::getEncrypted('pushover_app_token', '')->data; - $pushoverUserToken = (string)Preferences::getEncrypted('pushover_user_token', '')->data; - $ntfyServer = Preferences::getEncrypted('ntfy_server', 'https://ntfy.sh')->data; - $ntfyTopic = (string)Preferences::getEncrypted('ntfy_topic', '')->data; - $ntfyAuth = '1' === Preferences::get('ntfy_auth', false)->data; - $ntfyUser = Preferences::getEncrypted('ntfy_user', '')->data; - $ntfyPass = (string)Preferences::getEncrypted('ntfy_pass', '')->data; - $channels = config('notifications.channels'); - $forcedAvailability = []; - $anonymous = Steam::anonymous(); + $slackUrl = Preferences::getEncrypted('slack_webhook_url', '')->data; + $pushoverAppToken = (string) Preferences::getEncrypted('pushover_app_token', '')->data; + $pushoverUserToken = (string) Preferences::getEncrypted('pushover_user_token', '')->data; + $ntfyServer = Preferences::getEncrypted('ntfy_server', 'https://ntfy.sh')->data; + $ntfyTopic = (string) Preferences::getEncrypted('ntfy_topic', '')->data; + $ntfyAuth = '1' === Preferences::get('ntfy_auth', false)->data; + $ntfyUser = Preferences::getEncrypted('ntfy_user', '')->data; + $ntfyPass = (string) Preferences::getEncrypted('ntfy_pass', '')->data; + $channels = config('notifications.channels'); + $forcedAvailability = []; + $anonymous = Steam::anonymous(); // notification preferences - $notifications = []; + $notifications = []; foreach (config('notifications.notifications.user') as $key => $info) { if (true === $info['enabled']) { $notifications[$key] = [ @@ -166,7 +167,7 @@ final class PreferencesController extends Controller Log::error($e->getMessage()); $locales = []; } - $locales = ['equal' => (string)trans('firefly.equal_to_language')] + $locales; + $locales = ['equal' => (string) trans('firefly.equal_to_language')] + $locales; // an important fallback is that the frontPageAccount array gets refilled automatically // when it turns up empty. if (0 === count($frontpageAccounts)) { @@ -232,15 +233,17 @@ final class PreferencesController extends Controller $frontpageAccounts = []; if (is_array($request->input('frontpageAccounts')) && count($request->input('frontpageAccounts')) > 0) { foreach ($request->input('frontpageAccounts') as $id) { - $frontpageAccounts[] = (int)$id; + $frontpageAccounts[] = (int) $id; } Log::debug('Update frontpageAccounts', $frontpageAccounts); Preferences::set('frontpageAccounts', $frontpageAccounts); } // extract notifications: - $keys = array_map(function(string $value): string {return sprintf('notification_%s', $value);}, array_keys(config('notifications.notifications.user'))); - $all = $request->only($keys); + $keys = array_map(function (string $value): string { + return sprintf('notification_%s', $value); + }, array_keys(config('notifications.notifications.user'))); + $all = $request->only($keys); foreach (config('notifications.notifications.user') as $key => $info) { $key = sprintf('notification_%s', $key); if (array_key_exists($key, $all)) { @@ -265,7 +268,7 @@ final class PreferencesController extends Controller // notification settings, cannot be set by the demo user. if (!auth()->user()->hasRole('demo')) { $variables = ['slack_webhook_url', 'pushover_app_token', 'pushover_user_token', 'ntfy_server', 'ntfy_topic', 'ntfy_user', 'ntfy_pass']; - $all = $request->only($variables); + $all = $request->only($variables); foreach ($variables as $variable) { if ('' === $all[$variable]) { Preferences::delete($variable); @@ -279,7 +282,7 @@ final class PreferencesController extends Controller unset($all); // convert primary - $convertToPrimary = 1 === (int)$request->input('convertToPrimary'); + $convertToPrimary = 1 === (int) $request->input('convertToPrimary'); if ($convertToPrimary && !$this->convertToPrimary) { // set to true! Log::debug('User sets convertToPrimary to true.'); @@ -291,9 +294,9 @@ final class PreferencesController extends Controller Preferences::set('convert_to_primary', $convertToPrimary); // custom fiscal year - $customFiscalYear = 1 === (int)$request->input('customFiscalYear'); + $customFiscalYear = 1 === (int) $request->input('customFiscalYear'); Preferences::set('customFiscalYear', $customFiscalYear); - $fiscalYearString = (string)$request->input('fiscalYearStart'); + $fiscalYearString = (string) $request->input('fiscalYearStart'); if ('' !== $fiscalYearString) { $fiscalYearStart = Carbon::parse($fiscalYearString, config('app.timezone'))->format('m-d'); Preferences::set('fiscalYearStart', $fiscalYearStart); @@ -301,15 +304,15 @@ final class PreferencesController extends Controller // save page size: Preferences::set('listPageSize', 50); - $listPageSize = (int)$request->input('listPageSize'); + $listPageSize = (int) $request->input('listPageSize'); if ($listPageSize > 0 && $listPageSize < 1337) { Preferences::set('listPageSize', $listPageSize); } // language: /** @var Preference $currentLang */ - $currentLang = Preferences::get('language', 'en_US'); - $lang = $request->input('language'); + $currentLang = Preferences::get('language', 'en_US'); + $lang = $request->input('language'); if (array_key_exists($lang, config('firefly.languages'))) { Preferences::set('language', $lang); } @@ -320,14 +323,14 @@ final class PreferencesController extends Controller // same for locale: if (!auth()->user()->hasRole('demo')) { - $locale = (string)$request->input('locale'); + $locale = (string) $request->input('locale'); $locale = '' === $locale ? null : $locale; Preferences::set('locale', $locale); } // optional fields for transactions: - $setOptions = $request->input('tj') ?? []; - $optionalTj = [ + $setOptions = $request->input('tj') ?? []; + $optionalTj = [ 'interest_date' => array_key_exists('interest_date', $setOptions), 'book_date' => array_key_exists('book_date', $setOptions), 'process_date' => array_key_exists('process_date', $setOptions), @@ -344,17 +347,17 @@ final class PreferencesController extends Controller Preferences::set('transaction_journal_optional_fields', $optionalTj); // dark mode - $darkMode = $request->input('darkMode') ?? 'browser'; + $darkMode = $request->input('darkMode') ?? 'browser'; if (in_array($darkMode, config('firefly.available_dark_modes'), true)) { Preferences::set('darkMode', $darkMode); } // anonymous amounts? - $anonymous = '1' === $request->input('anonymous'); + $anonymous = '1' === $request->input('anonymous'); Preferences::set('anonymous', $anonymous); // save and continue - session()->flash('success', (string)trans('firefly.saved_preferences')); + session()->flash('success', (string) trans('firefly.saved_preferences')); Preferences::mark(); Log::debug('Done saving settings.'); @@ -368,7 +371,7 @@ final class PreferencesController extends Controller switch ($channel) { default: - session()->flash('error', (string)trans('firefly.notification_test_failed', ['channel' => $channel])); + session()->flash('error', (string) trans('firefly.notification_test_failed', ['channel' => $channel])); break; @@ -380,7 +383,7 @@ final class PreferencesController extends Controller $user = auth()->user(); Log::debug(sprintf('Now in testNotification("%s") controller.', $channel)); event(new UserTestsNotificationChannel($channel, $user)); - session()->flash('success', (string)trans('firefly.notification_test_executed', ['channel' => $channel])); + session()->flash('success', (string) trans('firefly.notification_test_executed', ['channel' => $channel])); } return ''; diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 5a64d07346..4670353f7a 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -48,7 +48,7 @@ final class TagController extends Controller { use PeriodOverview; - protected TagRepositoryInterface $repository; + protected TagRepositoryInterface $repository; private AttachmentHelperInterface $attachmentsHelper; /** @@ -60,7 +60,7 @@ final class TagController extends Controller $this->redirectUrl = route('tags.index'); $this->middleware(function ($request, $next) { - app('view')->share('title', (string)trans('firefly.tags')); + app('view')->share('title', (string) trans('firefly.tags')); app('view')->share('mainTitleIcon', 'fa-tag'); $this->attachmentsHelper = app(AttachmentHelperInterface::class); @@ -75,14 +75,14 @@ final class TagController extends Controller * * @return Factory|View */ - public function create(Request $request): Factory | \Illuminate\Contracts\View\View + public function create(Request $request): Factory|\Illuminate\Contracts\View\View { - $subTitle = (string)trans('firefly.new_tag'); + $subTitle = (string) trans('firefly.new_tag'); $subTitleIcon = 'fa-tag'; // location info: - $hasOldInput = null !== $request->old('_token'); - $locations = ['location' => [ + $hasOldInput = null !== $request->old('_token'); + $locations = ['location' => [ 'latitude' => $hasOldInput ? old('location_latitude') : config('firefly.default_location.latitude'), 'longitude' => $hasOldInput ? old('location_longitude') : config('firefly.default_location.longitude'), 'zoom_level' => $hasOldInput ? old('location_zoom_level') : config('firefly.default_location.zoom_level'), @@ -103,9 +103,9 @@ final class TagController extends Controller * * @return Factory|View */ - public function delete(Tag $tag): Factory | \Illuminate\Contracts\View\View + public function delete(Tag $tag): Factory|\Illuminate\Contracts\View\View { - $subTitle = (string)trans('breadcrumbs.delete_tag', ['tag' => $tag->tag]); + $subTitle = (string) trans('breadcrumbs.delete_tag', ['tag' => $tag->tag]); // put previous url in session $this->rememberPreviousUrl('tags.delete.url'); @@ -121,7 +121,7 @@ final class TagController extends Controller $tagName = $tag->tag; $this->repository->destroy($tag); - session()->flash('success', (string)trans('firefly.deleted_tag', ['tag' => $tagName])); + session()->flash('success', (string) trans('firefly.deleted_tag', ['tag' => $tagName])); Preferences::mark(); return redirect($this->getPreviousUrl('tags.delete.url')); @@ -132,17 +132,17 @@ final class TagController extends Controller * * @return Factory|View */ - public function edit(Tag $tag): Factory | \Illuminate\Contracts\View\View + public function edit(Tag $tag): Factory|\Illuminate\Contracts\View\View { - $subTitle = (string)trans('firefly.edit_tag', ['tag' => $tag->tag]); + $subTitle = (string) trans('firefly.edit_tag', ['tag' => $tag->tag]); $subTitleIcon = 'fa-tag'; - $location = $this->repository->getLocation($tag); - $latitude = $location instanceof Location ? $location->latitude : config('firefly.default_location.latitude'); - $longitude = $location instanceof Location ? $location->longitude : config('firefly.default_location.longitude'); - $zoomLevel = $location instanceof Location ? $location->zoom_level : config('firefly.default_location.zoom_level'); - $hasLocation = $location instanceof Location; - $locations = ['location' => [ + $location = $this->repository->getLocation($tag); + $latitude = $location instanceof Location ? $location->latitude : config('firefly.default_location.latitude'); + $longitude = $location instanceof Location ? $location->longitude : config('firefly.default_location.longitude'); + $zoomLevel = $location instanceof Location ? $location->zoom_level : config('firefly.default_location.zoom_level'); + $hasLocation = $location instanceof Location; + $locations = ['location' => [ 'latitude' => old('location_latitude') ?? $latitude, 'longitude' => old('location_longitude') ?? $longitude, 'zoom_level' => old('location_zoom_level') ?? $zoomLevel, @@ -163,12 +163,12 @@ final class TagController extends Controller * * @return Factory|View */ - public function index(TagRepositoryInterface $repository): Factory | \Illuminate\Contracts\View\View + public function index(TagRepositoryInterface $repository): Factory|\Illuminate\Contracts\View\View { // start with the oldest tag - $first = session('first', today()) ?? today(); - $oldestTagDate = $repository->oldestTag() instanceof Tag ? $repository->oldestTag()->date : clone $first; - $newestTagDate = $repository->newestTag() instanceof Tag ? $repository->newestTag()->date : today(); + $first = session('first', today()) ?? today(); + $oldestTagDate = $repository->oldestTag() instanceof Tag ? $repository->oldestTag()->date : clone $first; + $newestTagDate = $repository->newestTag() instanceof Tag ? $repository->newestTag()->date : today(); $oldestTagDate->startOfYear(); $newestTagDate->endOfYear(); @@ -185,22 +185,22 @@ final class TagController extends Controller $tags[$year] = $repository->getTagsInYear($year); $newestTagDate->subYear(); } - $count = $repository->count(); + $count = $repository->count(); return view('tags.index', ['tags' => $tags, 'count' => $count]); } public function massDestroy(Request $request): RedirectResponse { - $tags = $request->get('tags'); + $tags = $request->get('tags'); if (null === $tags || !is_array($tags)) { - session()->flash('info', (string)trans('firefly.select_tags_to_delete')); + session()->flash('info', (string) trans('firefly.select_tags_to_delete')); return redirect(route('tags.index')); } $count = 0; foreach ($tags as $tagId) { - $tagId = (int)$tagId; + $tagId = (int) $tagId; $tag = $this->repository->find($tagId); if ($tag instanceof Tag) { $this->repository->destroy($tag); @@ -221,14 +221,14 @@ final class TagController extends Controller * @throws FireflyException * @throws NotFoundExceptionInterface */ - public function show(Request $request, Tag $tag, ?Carbon $start = null, ?Carbon $end = null): Factory | \Illuminate\Contracts\View\View + public function show(Request $request, Tag $tag, ?Carbon $start = null, ?Carbon $end = null): Factory|\Illuminate\Contracts\View\View { // default values: $subTitleIcon = 'fa-tag'; - $page = (int)$request->input('page'); - $pageSize = (int)Preferences::get('listPageSize', 50)->data; - $start ??= session('start'); - $end ??= session('end'); + $page = (int) $request->input('page'); + $pageSize = (int) Preferences::get('listPageSize', 50)->data; + $start ??= session('start'); + $end ??= session('end'); $location = $this->repository->getLocation($tag); $attachments = $this->repository->getAttachments($tag); $subTitle = trans('firefly.journals_in_period_for_tag', [ @@ -237,18 +237,18 @@ final class TagController extends Controller 'end' => $end->isoFormat($this->monthAndDayFormat), ]); - $startPeriod = $this->repository->firstUseDate($tag); + $startPeriod = $this->repository->firstUseDate($tag); $startPeriod ??= today(config('app.timezone')); - $endPeriod = clone $end; - $periods = $this->getTagPeriodOverview($tag, $startPeriod, $endPeriod); - $path = route('tags.show', [$tag->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); + $endPeriod = clone $end; + $periods = $this->getTagPeriodOverview($tag, $startPeriod, $endPeriod); + $path = route('tags.show', [$tag->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); + $collector = app(GroupCollectorInterface::class); // collect transaction journal IDs in repository, // this makes the collector faster and more accurate. - $journalIds = $this->repository->getJournalIds($tag); + $journalIds = $this->repository->getJournalIds($tag); if (0 === count($journalIds)) { $collector->findNothing(); } @@ -260,11 +260,12 @@ final class TagController extends Controller ->withAccountInformation() ->withBudgetInformation() ->withCategoryInformation() - ->withAttachmentInformation(); + ->withAttachmentInformation() + ; - $groups = $collector->getPaginatedGroups(); + $groups = $collector->getPaginatedGroups(); $groups->setPath($path); - $sums = $this->repository->sumsOfTag($tag, $start, $end); + $sums = $this->repository->sumsOfTag($tag, $start, $end); return view('tags.show', [ 'tag' => $tag, @@ -288,14 +289,14 @@ final class TagController extends Controller * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ - public function showAll(Request $request, Tag $tag): Factory | \Illuminate\Contracts\View\View + public function showAll(Request $request, Tag $tag): Factory|\Illuminate\Contracts\View\View { // default values: $subTitleIcon = 'fa-tag'; - $page = (int)$request->get('page'); - $pageSize = (int)Preferences::get('listPageSize', 50)->data; + $page = (int) $request->get('page'); + $pageSize = (int) Preferences::get('listPageSize', 50)->data; $periods = []; - $subTitle = (string)trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]); + $subTitle = (string) trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]); $start = $this->repository->firstUseDate($tag) ?? today(config('app.timezone')); $end = $this->repository->lastUseDate($tag) ?? today(config('app.timezone')); $attachments = $this->repository->getAttachments($tag); @@ -305,8 +306,8 @@ final class TagController extends Controller // collect transaction journal IDs in repository, // this makes the collector faster and more accurate. /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); - $journalIds = $this->repository->getJournalIds($tag); + $collector = app(GroupCollectorInterface::class); + $journalIds = $this->repository->getJournalIds($tag); if (0 === count($journalIds)) { $collector->findNothing(); } @@ -319,10 +320,11 @@ final class TagController extends Controller ->setJournalIds($journalIds) ->withBudgetInformation() ->withCategoryInformation() - ->withAttachmentInformation(); - $groups = $collector->getPaginatedGroups(); + ->withAttachmentInformation() + ; + $groups = $collector->getPaginatedGroups(); $groups->setPath($path); - $sums = $this->repository->sumsOfTag($tag, $start, $end); + $sums = $this->repository->sumsOfTag($tag, $start, $end); return view('tags.show', [ 'tag' => $tag, @@ -343,24 +345,24 @@ final class TagController extends Controller */ public function store(TagFormRequest $request): RedirectResponse { - $data = $request->collectTagData(); + $data = $request->collectTagData(); Log::debug('Data from request', $data); - $result = $this->repository->store($data); + $result = $this->repository->store($data); Log::debug('Data after storage', $result->toArray()); - session()->flash('success', (string)trans('firefly.created_tag', ['tag' => $data['tag']])); + session()->flash('success', (string) trans('firefly.created_tag', ['tag' => $data['tag']])); Preferences::mark(); // store attachment(s): /** @var null|array $files */ - $files = $request->hasFile('attachments') ? $request->file('attachments') : null; + $files = $request->hasFile('attachments') ? $request->file('attachments') : null; if (null !== $files && !auth()->user()->hasRole('demo')) { $this->attachmentsHelper->saveAttachmentsForModel($result, $files); } if (null !== $files && auth()->user()->hasRole('demo')) { Log::channel('audit')->warning(sprintf('The demo user is trying to upload attachments in %s.', __METHOD__)); - session()->flash('info', (string)trans('firefly.no_att_demo_user')); + session()->flash('info', (string) trans('firefly.no_att_demo_user')); } if (count($this->attachmentsHelper->getMessages()->get('attachments')) > 0) { @@ -370,7 +372,7 @@ final class TagController extends Controller $request->session()->flash('error', $this->attachmentsHelper->getErrors()->get('attachments')); } $redirect = redirect($this->getPreviousUrl('tags.create.url')); - if (1 === (int)$request->get('create_another')) { + if (1 === (int) $request->get('create_another')) { session()->put('tags.create.fromStore', true); $redirect = redirect(route('tags.create'))->withInput(); @@ -384,21 +386,21 @@ final class TagController extends Controller */ public function update(TagFormRequest $request, Tag $tag): RedirectResponse { - $data = $request->collectTagData(); - $tag = $this->repository->update($tag, $data); + $data = $request->collectTagData(); + $tag = $this->repository->update($tag, $data); - session()->flash('success', (string)trans('firefly.updated_tag', ['tag' => $data['tag']])); + session()->flash('success', (string) trans('firefly.updated_tag', ['tag' => $data['tag']])); Preferences::mark(); // store new attachment(s): /** @var null|array $files */ - $files = $request->hasFile('attachments') ? $request->file('attachments') : null; + $files = $request->hasFile('attachments') ? $request->file('attachments') : null; if (null !== $files && !auth()->user()->hasRole('demo')) { $this->attachmentsHelper->saveAttachmentsForModel($tag, $files); } if (null !== $files && auth()->user()->hasRole('demo')) { Log::channel('audit')->warning(sprintf('The demo user is trying to upload attachments in %s.', __METHOD__)); - session()->flash('info', (string)trans('firefly.no_att_demo_user')); + session()->flash('info', (string) trans('firefly.no_att_demo_user')); } if (count($this->attachmentsHelper->getMessages()->get('attachments')) > 0) { @@ -408,7 +410,7 @@ final class TagController extends Controller $request->session()->flash('error', $this->attachmentsHelper->getErrors()->get('attachments')); } $redirect = redirect($this->getPreviousUrl('tags.edit.url')); - if (1 === (int)$request->get('return_to_edit')) { + if (1 === (int) $request->get('return_to_edit')) { session()->put('tags.edit.fromUpdate', true); $redirect = redirect(route('tags.edit', [$tag->id]))->withInput(['return_to_edit' => 1]); diff --git a/app/Http/Controllers/Transaction/ConvertController.php b/app/Http/Controllers/Transaction/ConvertController.php index c4f150960b..6784d8af0f 100644 --- a/app/Http/Controllers/Transaction/ConvertController.php +++ b/app/Http/Controllers/Transaction/ConvertController.php @@ -153,7 +153,7 @@ final class ConvertController extends Controller foreach ($group->transactionJournals as $journal) { // catch FF exception. try { - $this->convertJournal($journal, $destinationType, $request->only(['source_id', 'source_name', 'destination_id', 'destination_name',])); + $this->convertJournal($journal, $destinationType, $request->only(['source_id', 'source_name', 'destination_id', 'destination_name'])); } catch (FireflyException $e) { session()->flash('error', $e->getMessage()); diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index 7858fac162..1d84d21871 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -61,7 +61,7 @@ class SecureHeaders // sprintf("style-src 'self' 'nonce-%1s'", $nonce), // safe variant "style-src 'self' 'unsafe-inline'", // unsafe variant "base-uri 'self'", - //"form-action 'self'", // safe + // "form-action 'self'", // safe "font-src 'self' data:", sprintf("connect-src 'self' %s", $trackingScriptSrc), sprintf("img-src 'self' data: 'nonce-%1s' ", $nonce), @@ -70,7 +70,7 @@ class SecureHeaders // overrule in development mode if (true === config('firefly.is_local_dev')) { - $ip = '192.168.96.165'; + $ip = '192.168.96.165'; $csp = [ "default-src 'none'", "object-src 'none'", diff --git a/app/Services/Internal/Recalculate/PrimaryAmountRecalculationService.php b/app/Services/Internal/Recalculate/PrimaryAmountRecalculationService.php index 630e496fbe..8b61163306 100644 --- a/app/Services/Internal/Recalculate/PrimaryAmountRecalculationService.php +++ b/app/Services/Internal/Recalculate/PrimaryAmountRecalculationService.php @@ -115,7 +115,8 @@ class PrimaryAmountRecalculationService $q->orWhere('virtual_balance', '!=', ''); } }) - ->get(); + ->get() + ; /** @var Account $account */ foreach ($set as $account) { diff --git a/app/Services/Internal/Update/JournalUpdateService.php b/app/Services/Internal/Update/JournalUpdateService.php index cf0750aee0..e0d5acf65d 100644 --- a/app/Services/Internal/Update/JournalUpdateService.php +++ b/app/Services/Internal/Update/JournalUpdateService.php @@ -780,8 +780,9 @@ class JournalUpdateService ], [ 'currency_symbol' => $recordCurrency->symbol, - 'decimal_places' => $recordCurrency->decimal_places, - 'amount' => $value] + 'decimal_places' => $recordCurrency->decimal_places, + 'amount' => $value, + ] ) ); } diff --git a/composer.lock b/composer.lock index 4a6862d761..bc88a420ef 100644 --- a/composer.lock +++ b/composer.lock @@ -2562,16 +2562,16 @@ }, { "name": "league/commonmark", - "version": "2.8.1", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "84b1ca48347efdbe775426f108622a42735a6579" + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84b1ca48347efdbe775426f108622a42735a6579", - "reference": "84b1ca48347efdbe775426f108622a42735a6579", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", "shasum": "" }, "require": { @@ -2665,7 +2665,7 @@ "type": "tidelift" } ], - "time": "2026-03-05T21:37:03+00:00" + "time": "2026-03-19T13:16:38+00:00" }, { "name": "league/config", @@ -10379,22 +10379,22 @@ }, { "name": "driftingly/rector-laravel", - "version": "2.1.12", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/driftingly/rector-laravel.git", - "reference": "2a2175eefabca6d15c247d55de17c75dc2f787a9" + "reference": "807840ceb09de6764cbfcce0719108d044a459a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/2a2175eefabca6d15c247d55de17c75dc2f787a9", - "reference": "2a2175eefabca6d15c247d55de17c75dc2f787a9", + "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/807840ceb09de6764cbfcce0719108d044a459a9", + "reference": "807840ceb09de6764cbfcce0719108d044a459a9", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", "rector/rector": "^2.2.7", - "webmozart/assert": "^1.11" + "webmozart/assert": "^1.11 || ^2.0" }, "type": "rector-extension", "autoload": { @@ -10409,9 +10409,9 @@ "description": "Rector upgrades rules for Laravel Framework", "support": { "issues": "https://github.com/driftingly/rector-laravel/issues", - "source": "https://github.com/driftingly/rector-laravel/tree/2.1.12" + "source": "https://github.com/driftingly/rector-laravel/tree/2.2.0" }, - "time": "2026-03-06T19:59:21+00:00" + "time": "2026-03-19T17:24:38+00:00" }, { "name": "ergebnis/phpstan-rules", @@ -13158,23 +13158,23 @@ }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8", + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -13184,7 +13184,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -13200,6 +13200,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -13210,9 +13214,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.1.6" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2026-02-27T10:28:38+00:00" } ], "aliases": [], diff --git a/config/firefly.php b/config/firefly.php index bec9be0dc5..3497d0f11d 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -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-16', - 'build_time' => 1773691523, + 'version' => 'develop/2026-03-20', + 'build_time' => 1773991310, '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 ccd735cc65..686dfaf6aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,7 +4,6 @@ "requires": true, "packages": { "": { - "name": "firefly-iii", "hasInstallScript": true, "workspaces": [ "resources/assets/v1", @@ -201,9 +200,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz", - "integrity": "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, "license": "MIT", "dependencies": { @@ -392,23 +391,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dev": true, "license": "MIT", "dependencies": { @@ -1502,9 +1501,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", - "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", + "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", "dev": true, "license": "MIT", "dependencies": { @@ -1587,13 +1586,13 @@ } }, "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz", - "integrity": "sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.7", + "@babel/helper-define-polyfill-provider": "^0.6.8", "core-js-compat": "^3.48.0" }, "peerDependencies": { @@ -1626,9 +1625,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -4056,14 +4055,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz", - "integrity": "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.7", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { @@ -4095,13 +4094,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz", - "integrity": "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.7" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4136,9 +4135,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", - "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "version": "2.10.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.9.tgz", + "integrity": "sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4588,9 +4587,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001779", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001779.tgz", - "integrity": "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==", + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", "dev": true, "funding": [ { @@ -5029,9 +5028,9 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { @@ -5793,9 +5792,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.313", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", - "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", "dev": true, "license": "ISC" }, @@ -5850,9 +5849,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", - "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "dev": true, "license": "MIT", "dependencies": { @@ -7144,9 +7143,9 @@ } }, "node_modules/i18next": { - "version": "25.8.18", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.18.tgz", - "integrity": "sha512-lzY5X83BiL5AP77+9DydbrqkQHFN9hUzWGjqjLpPcp5ZOzuu1aSoKaU3xbBLSjWx9dAzW431y+d+aogxOZaKRA==", + "version": "25.8.20", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.20.tgz", + "integrity": "sha512-xjo9+lbX/P1tQt3xpO2rfJiBppNfUnNIPKgCvNsTKsvTOCro1Qr/geXVg1N47j5ScOSaXAPq8ET93raK3Rr06A==", "funding": [ { "type": "individual", @@ -10276,9 +10275,9 @@ } }, "node_modules/sax": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", - "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "dev": true, "license": "BlueOak-1.0.0", "engines": { diff --git a/resources/assets/v1/src/locales/ru.json b/resources/assets/v1/src/locales/ru.json index e6cd8171a4..834a2207b1 100644 --- a/resources/assets/v1/src/locales/ru.json +++ b/resources/assets/v1/src/locales/ru.json @@ -54,7 +54,7 @@ "update_transaction": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e", "after_update_create_another": "\u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u0441\u044e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.", "store_as_new": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u043d\u043e\u0432\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.", - "split_title_help": "\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u0435 \u0432\u0441\u0435\u0445 \u0435\u0451 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445.", + "split_title_help": "\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0435\u0451 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445.", "none_in_select_list": "(\u043d\u0435\u0442)", "no_piggy_bank": "(\u043d\u0435\u0442 \u043a\u043e\u043f\u0438\u043b\u043a\u0438)", "description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", @@ -82,9 +82,9 @@ "profile_oauth_create_client": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430", "profile_oauth_edit_client": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430", "profile_oauth_name_help": "\u0427\u0442\u043e-\u0442\u043e, \u0447\u0442\u043e \u0432\u0430\u0448\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0437\u043d\u0430\u044e\u0442, \u0438 \u0447\u0435\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u044e\u0442.", - "profile_oauth_redirect_url": "URL \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u0430", + "profile_oauth_redirect_url": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438", "profile_oauth_clients_external_auth": "\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Authelia, \u043a\u043b\u0438\u0435\u043d\u0442\u044b OAuth \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430.", - "profile_oauth_redirect_url_help": "URL \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.", + "profile_oauth_redirect_url_help": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.", "profile_authorized_apps": "\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", "profile_authorized_clients": "\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b", "profile_scopes": "\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f", @@ -116,9 +116,9 @@ "webhook_trigger_DESTROY_BUDGET": "\u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u044e\u0434\u0436\u0435\u0442\u0430", "webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change", "webhook_response_TRANSACTIONS": "\u0414\u0435\u0442\u0430\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438", - "webhook_response_RELEVANT": "Relevant details", + "webhook_response_RELEVANT": "\u0420\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f", "webhook_response_ACCOUNTS": "\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438", - "webhook_response_NONE": "No details", + "webhook_response_NONE": "\u041d\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439", "webhook_delivery_JSON": "JSON", "actions": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f", "meta_data": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435", @@ -128,7 +128,7 @@ "inspect": "\u041f\u0440\u043e\u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c", "create_new_webhook": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0435\u0431\u0445\u0443\u043a", "webhooks": "\u0412\u0435\u0431-\u0445\u0443\u043a\u0438", - "webhook_trigger_form_help": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435, \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0431-\u0445\u0443\u043a", + "webhook_trigger_form_help": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435, \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0431-\u0445\u0443\u043a", "webhook_response_form_help": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u0435\u0431-\u0445\u0443\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 URL.", "webhook_delivery_form_help": "\u0412 \u043a\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u0445\u0443\u043a\u0430.", "webhook_active_form_help": "\u0412\u0435\u0431-\u0445\u0443\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0438\u043b\u0438 \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d.", @@ -160,7 +160,7 @@ "url": "\u0421\u0441\u044b\u043b\u043a\u0430", "active": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439", "interest_date": "\u0414\u0430\u0442\u0430 \u043d\u0430\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432", - "administration_currency": "Primary currency", + "administration_currency": "\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0430\u043b\u044e\u0442\u0430", "title": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "date": "\u0414\u0430\u0442\u0430", "book_date": "\u0414\u0430\u0442\u0430 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f", @@ -180,7 +180,7 @@ "list": { "title": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", "active": "\u0410\u043a\u0442\u0438\u0432\u0435\u043d?", - "primary_currency": "Primary currency", + "primary_currency": "\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0430\u043b\u044e\u0442\u0430", "trigger": "\u0421\u043e\u0431\u044b\u0442\u0438\u0435", "response": "\u041e\u0442\u0432\u0435\u0442", "delivery": "\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430", diff --git a/resources/assets/v1/src/locales/uk.json b/resources/assets/v1/src/locales/uk.json index 144f79546c..eec2bc7359 100644 --- a/resources/assets/v1/src/locales/uk.json +++ b/resources/assets/v1/src/locales/uk.json @@ -118,7 +118,7 @@ "webhook_response_TRANSACTIONS": "\u0414\u0435\u0442\u0430\u043b\u0456 \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0457", "webhook_response_RELEVANT": "Relevant details", "webhook_response_ACCOUNTS": "\u0414\u0430\u043d\u0456 \u0440\u0430\u0445\u0443\u043d\u043a\u0443", - "webhook_response_NONE": "No details", + "webhook_response_NONE": "\u041d\u0435\u043c\u0430\u0454 \u0434\u0435\u0442\u0430\u043b\u0435\u0439", "webhook_delivery_JSON": "JSON", "actions": "\u0414\u0456\u0457", "meta_data": "\u041c\u0435\u0442\u0430-\u0434\u0430\u043d\u0456",