Merge pull request #12460 from firefly-iii/release-1783619839

🤖 Automatically merge the PR into the develop branch.
This commit is contained in:
github-actions[bot]
2026-07-09 19:57:29 +02:00
committed by GitHub
61 changed files with 506 additions and 491 deletions
+7 -7
View File
@@ -468,16 +468,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.95.11",
"version": "v3.95.12",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "35f98e1293283397824d7f349ce5afb8747c3cd5"
"reference": "b1b9055997a98dce3c2338e884626e718a25a923"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/35f98e1293283397824d7f349ce5afb8747c3cd5",
"reference": "35f98e1293283397824d7f349ce5afb8747c3cd5",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b1b9055997a98dce3c2338e884626e718a25a923",
"reference": "b1b9055997a98dce3c2338e884626e718a25a923",
"shasum": ""
},
"require": {
@@ -517,7 +517,7 @@
"php-coveralls/php-coveralls": "^2.9.1",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8",
"phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55",
"phpunit/phpunit": "^9.6.35 || ^10.5.64 || ^11.5.56",
"symfony/polyfill-php85": "^1.38",
"symfony/var-dumper": "^5.4.48 || ^6.4.36 || ^7.4.8 || ^8.1.0",
"symfony/yaml": "^5.4.53 || ^6.4.41 || ^7.4.13 || ^8.1.0"
@@ -561,7 +561,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.95.11"
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.12"
},
"funding": [
{
@@ -569,7 +569,7 @@
"type": "github"
}
],
"time": "2026-06-25T14:17:04+00:00"
"time": "2026-07-07T13:29:36+00:00"
},
{
"name": "psr/container",
@@ -158,7 +158,10 @@ final class TagController extends Controller
'currency_id' => (string) $foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'],
];
$response[$foreignKey]['difference'] = bcadd((string) $response[$foreignKey]['difference'], Steam::positive($journal['foreign_amount']));
$response[$foreignKey]['difference'] = bcadd(
(string) $response[$foreignKey]['difference'],
Steam::positive($journal['foreign_amount'])
);
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference'];
}
}
@@ -155,7 +155,10 @@ final class TagController extends Controller
'currency_id' => (string) $foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'],
];
$response[$foreignKey]['difference'] = bcadd((string) $response[$foreignKey]['difference'], Steam::positive($journal['foreign_amount']));
$response[$foreignKey]['difference'] = bcadd(
(string) $response[$foreignKey]['difference'],
Steam::positive($journal['foreign_amount'])
);
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
}
}
+42 -41
View File
@@ -42,6 +42,7 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
use League\CommonMark\GithubFlavoredMarkdownConverter;
use function Safe\json_decode;
use function Safe\mb_ord;
use function Safe\preg_match;
@@ -51,7 +52,7 @@ if (!function_exists('env_default_when_empty')) {
/**
* @return null|mixed
*/
function env_default_when_empty(mixed $value, bool | int | string | null $default = null): mixed
function env_default_when_empty(mixed $value, bool|int|string|null $default = null): mixed
{
if (null === $value) {
return $default;
@@ -65,7 +66,6 @@ if (!function_exists('env_default_when_empty')) {
}
if (!function_exists('sign_amount')) {
function sign_amount(string $amount, string $transactionType, string $sourceType): string
{
// withdrawals stay negative
@@ -89,7 +89,7 @@ if (!function_exists('sign_amount')) {
if (!function_exists('normal_journal_object_amount')) {
function normal_journal_object_amount(TransactionJournal $journal): string
{
$type = $journal->transactionType->type;
$type = $journal->transactionType->type;
/** @var Transaction $first */
$first = $journal->transactions()->where('amount', '<', 0)->first();
@@ -98,12 +98,12 @@ if (!function_exists('normal_journal_object_amount')) {
$colored = true;
$sourceType = $first->account->accountType()->first()->type;
$amount = sign_amount($amount, $type, $sourceType);
$amount = sign_amount($amount, $type, $sourceType);
if (TransactionTypeEnum::TRANSFER->value === $type) {
$colored = false;
}
$result = Amount::formatFlat($currency->symbol, $currency->decimal_places, $amount, $colored);
$result = Amount::formatFlat($currency->symbol, $currency->decimal_places, $amount, $colored);
if (TransactionTypeEnum::TRANSFER->value === $type) {
return sprintf('<span class="text-info money-transfer">%s</span>', $result);
}
@@ -123,10 +123,9 @@ if (!function_exists('journal_object_has_foreign')) {
}
if (function_exists('foreign_journal_object_amount')) {
function foreign_journal_object_amount(TransactionJournal $journal): string
{
$type = $journal->transactionType->type;
$type = $journal->transactionType->type;
/** @var Transaction $first */
$first = $journal->transactions()->where('amount', '<', 0)->first();
@@ -135,12 +134,12 @@ if (function_exists('foreign_journal_object_amount')) {
$colored = true;
$sourceType = $first->account->accountType()->first()->type;
$amount = sign_amount($amount, $type, $sourceType);
$amount = sign_amount($amount, $type, $sourceType);
if (TransactionTypeEnum::TRANSFER->value === $type) {
$colored = false;
}
$result = Amount::formatFlat($currency->symbol, $currency->decimal_places, $amount, $colored);
$result = Amount::formatFlat($currency->symbol, $currency->decimal_places, $amount, $colored);
if (TransactionTypeEnum::TRANSFER->value === $type) {
return sprintf('<span class="text-info money-transfer">%s</span>', $result);
}
@@ -168,10 +167,11 @@ if (!function_exists('journal_link_translation')) {
function journal_link_translation(string $direction, string $original): string
{
$key = sprintf('firefly.%s_%s', $original, $direction);
$translation = (string)trans($key);
$translation = (string) trans($key);
if ($key === $translation) {
return $original;
}
return $translation;
}
}
@@ -180,9 +180,9 @@ if (!function_exists('all_journal_triggers')) {
function all_journal_triggers(): array
{
return [
'store-journal' => (string)trans('firefly.rule_trigger_store_journal'),
'update-journal' => (string)trans('firefly.rule_trigger_update_journal'),
'manual-activation' => (string)trans('firefly.rule_trigger_manual'),
'store-journal' => (string) trans('firefly.rule_trigger_store_journal'),
'update-journal' => (string) trans('firefly.rule_trigger_update_journal'),
'manual-activation' => (string) trans('firefly.rule_trigger_manual'),
];
}
}
@@ -194,10 +194,11 @@ if (!function_exists('all_rule_actions')) {
$ruleActions = array_keys(config('firefly.rule-actions'));
$possibleActions = [];
foreach ($ruleActions as $key) {
$possibleActions[$key] = (string)trans('firefly.rule_action_' . $key . '_choice');
$possibleActions[$key] = (string) trans('firefly.rule_action_'.$key.'_choice');
}
unset($ruleActions);
asort($possibleActions);
return $possibleActions;
}
}
@@ -206,9 +207,9 @@ if (!function_exists('all_journal_triggers')) {
function all_journal_triggers(): array
{
return [
'store-journal' => (string)trans('firefly.rule_trigger_store_journal'),
'update-journal' => (string)trans('firefly.rule_trigger_update_journal'),
'manual-activation' => (string)trans('firefly.rule_trigger_manual'),
'store-journal' => (string) trans('firefly.rule_trigger_store_journal'),
'update-journal' => (string) trans('firefly.rule_trigger_update_journal'),
'manual-activation' => (string) trans('firefly.rule_trigger_manual'),
];
}
}
@@ -217,14 +218,14 @@ if (!function_exists('mime_icon')) {
function mime_icon(string $file): string
{
return match ($file) {
'application/pdf' => 'bi-file-earmark-pdf',
'application/pdf' => 'bi-file-earmark-pdf',
'image/webp',
'image/png',
'image/jpeg',
'image/svg+xml',
'image/heic',
'image/heic-sequence',
'application/vnd.oasis.opendocument.image' => 'bi-file-earmark-image',
'application/vnd.oasis.opendocument.image' => 'bi-file-earmark-image',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
@@ -237,7 +238,7 @@ if (!function_exists('mime_icon')) {
'application/vnd.oasis.opendocument.text',
'application/vnd.oasis.opendocument.text-template',
'application/vnd.oasis.opendocument.text-web',
'application/vnd.oasis.opendocument.text-master' => 'bi-file-earmark-word',
'application/vnd.oasis.opendocument.text-master' => 'bi-file-earmark-word',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
@@ -245,7 +246,7 @@ if (!function_exists('mime_icon')) {
'application/vnd.sun.xml.calc.template',
'application/vnd.stardivision.calc',
'application/vnd.oasis.opendocument.spreadsheet',
'application/vnd.oasis.opendocument.spreadsheet-template' => 'bi-file-earmark-excel',
'application/vnd.oasis.opendocument.spreadsheet-template' => 'bi-file-earmark-excel',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.openxmlformats-officedocument.presentationml.template',
@@ -254,18 +255,18 @@ if (!function_exists('mime_icon')) {
'application/vnd.sun.xml.impress.template',
'application/vnd.stardivision.impress',
'application/vnd.oasis.opendocument.presentation',
'application/vnd.oasis.opendocument.presentation-template' => 'bi-file-earmark-slides',
'application/vnd.oasis.opendocument.presentation-template' => 'bi-file-earmark-slides',
'application/vnd.sun.xml.draw',
'application/vnd.sun.xml.draw.template',
'application/vnd.stardivision.draw',
'application/vnd.oasis.opendocument.chart' => 'bi-file-earmark-easel',
'application/vnd.oasis.opendocument.chart' => 'bi-file-earmark-easel',
'application/vnd.oasis.opendocument.graphics',
'application/vnd.oasis.opendocument.graphics-template',
'application/vnd.sun.xml.math',
'application/vnd.stardivision.math',
'application/vnd.oasis.opendocument.formula',
'application/vnd.oasis.opendocument.database' => 'bi-file-earmark-rules',
default => 'bi-file-earmark'
'application/vnd.oasis.opendocument.database' => 'bi-file-earmark-rules',
default => 'bi-file-earmark'
};
}
}
@@ -275,7 +276,7 @@ if (!function_exists('parse_markdown')) {
{
$converter = new GithubFlavoredMarkdownConverter(['allow_unsafe_links' => false, 'max_nesting_level' => 5, 'html_input' => 'escape']);
return (string)$converter->convert($string);
return (string) $converter->convert($string);
}
}
@@ -369,11 +370,11 @@ if (!function_exists('account_balance')) {
function account_balance(Account $account): string
{
/** @var Carbon $date */
$date = now();
$date = now();
// get the date from the current session. If it's in the future, keep `now()`.
/** @var Carbon $session */
$session = clone session('end', today(config('app.timezone'))->endOfMonth());
$session = clone session('end', today(config('app.timezone'))->endOfMonth());
if ($session->lt($date)) {
$date = $session->copy();
$date->endOfDay();
@@ -381,13 +382,13 @@ if (!function_exists('account_balance')) {
Log::debug(sprintf('twig balance: Call finalAccountBalance with date/time "%s"', $date->toIso8601String()));
// 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized.
$info = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
$info = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
// $info = Steam::finalAccountBalance($account, $date);
$currency = Steam::getAccountCurrency($account);
$primary = Amount::getPrimaryCurrency();
$convertToPrimary = Amount::convertToPrimary();
$usePrimary = $convertToPrimary && $primary->id !== $currency->id;
$currency ??= $primary;
$currency ??= $primary;
$strings = [];
foreach ($info as $key => $balance) {
if ('balance' === $key) {
@@ -454,15 +455,15 @@ if (!function_exists('print_nice_filesize')) {
{
// less than one GB, more than one MB
if ($size < (1024 * 1024 * 2014) && $size >= (1024 * 1024)) {
return round($size / (1024 * 1024), 2) . ' MB';
return round($size / (1024 * 1024), 2).' MB';
}
// less than one MB
if ($size < (1024 * 1024)) {
return round($size / 1024, 2) . ' KB';
return round($size / 1024, 2).' KB';
}
return $size . ' bytes';
return $size.' bytes';
}
}
@@ -483,11 +484,11 @@ if (!function_exists('journal_get_meta_field')) {
return '';
}
return json_decode((string)$entry->data, true);
return json_decode((string) $entry->data, true);
}
}
if (!function_exists('journal_get_meta_date')) {
function journal_get_meta_date(int $journalId, string $metaField): Carbon | CarbonInterface
function journal_get_meta_date(int $journalId, string $metaField): Carbon|CarbonInterface
{
/** @var null|TransactionJournalMeta $entry */
$entry = DB::table('journal_meta')->where('name', $metaField)->where('transaction_journal_id', $journalId)->whereNull('deleted_at')->first();
@@ -495,7 +496,7 @@ if (!function_exists('journal_get_meta_date')) {
return today(config('app.timezone'));
}
return new Carbon(json_decode((string)$entry->data, false));
return new Carbon(json_decode((string) $entry->data, false));
}
}
@@ -524,14 +525,14 @@ if (!function_exists('blade_escape_js')) {
return preg_replace_callback(
'#[^a-zA-Z0-9,\._]#Su',
static function ($matches) {
$char = $matches[0];
$char = $matches[0];
/*
* A few characters have short escape sequences in JSON and JavaScript.
* Escape sequences supported only by JavaScript, not JSON, are omitted.
* \" is also supported but omitted, because the resulting string is not HTML safe.
*/
$short = match ($char) {
$short = match ($char) {
'\\' => '\\\\',
'/' => '\/',
"\x08" => '\b',
@@ -553,9 +554,9 @@ if (!function_exists('blade_escape_js')) {
// Split characters outside the BMP into surrogate pairs
// https://tools.ietf.org/html/rfc2781.html#section-2.1
$u = $codepoint - 0x10_000;
$high = 0xD800 | ($u >> 10);
$low = 0xDC00 | ($u & 0x3FF);
$u = $codepoint - 0x10_000;
$high = 0xD800 | ($u >> 10);
$low = 0xDC00 | ($u & 0x3FF);
return \sprintf('\u%04X\u%04X', $high, $low);
},
@@ -80,7 +80,7 @@ final class IndexController extends Controller
$collection = $this->repository->getInactiveAccountsByType($types);
$total = $collection->count();
$page = 0 === (int) $request->input('page') ? 1 : (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$accounts = $collection->slice(($page - 1) * $pageSize, $pageSize);
$inactiveCount = $this->repository->getInactiveAccountsByType($types)->count();
@@ -147,7 +147,7 @@ final class IndexController extends Controller
$collection = $this->repository->getActiveAccountsByType($types);
$total = $collection->count();
$page = 0 === (int) $request->input('page') ? 1 : (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$accounts = $collection->slice(($page - 1) * $pageSize, $pageSize);
$inactiveCount = $this->repository->getInactiveAccountsByType($types)->count();
@@ -121,7 +121,7 @@ final class ShowController extends Controller
$currency = $accountCurrency ?? $this->primaryCurrency;
$fStart = $start->isoFormat($this->monthAndDayFormat);
$fEnd = $end->isoFormat($this->monthAndDayFormat);
$isLiability = $this->repository->isLiability($account);
$isLiability = $this->repository->isLiability($account);
$subTitle = (string) trans('firefly.journals_in_period_for_account', ['name' => $account->name, 'start' => $fStart, 'end' => $fEnd]);
$chartUrl = route('chart.account.period', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')]);
$firstTransaction = $this->repository->oldestJournalDate($account) ?? $start;
@@ -179,7 +179,7 @@ final class ShowController extends Controller
'currency' => $currency,
'today' => $today,
'periods' => $periods,
'isLiability' => $isLiability,
'isLiability' => $isLiability,
'subTitleIcon' => $subTitleIcon,
'groups' => $groups,
'attachments' => $attachments,
@@ -215,7 +215,7 @@ final class ShowController extends Controller
$start = $this->repository->oldestJournalDate($account) ?? today(config('app.timezone'))->startOfMonth();
$subTitleIcon = config('firefly.subIconsByIdentifier.'.$account->accountType->type);
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$currency = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency;
$subTitle = (string) trans('firefly.all_journals_for_account', ['name' => $account->name]);
@@ -255,7 +255,10 @@ final class IndexController extends Controller
if (count($bill['paid_dates']) < count($bill['pay_dates'])) {
$count = count($bill['pay_dates']) - count($bill['paid_dates']);
if ($count > 0) {
$avg = bcdiv(bcadd((string) $bill['amount_min'], (string) $bill['amount_max']), '2');
$avg = bcdiv(
bcadd((string) $bill['amount_min'], (string) $bill['amount_max']),
'2'
);
$avg = bcmul($avg, (string) $count);
$sums[$groupOrder][$currencyId]['total_left_to_pay'] = bcadd($sums[$groupOrder][$currencyId]['total_left_to_pay'], $avg);
Log::debug(
+1 -1
View File
@@ -130,7 +130,7 @@ final class ShowController extends Controller
$end = session('end');
$year = $start->year;
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$yearAverage = $this->repository->getYearAverage($bill, $start);
$overallAverage = $this->repository->getOverallAverage($bill);
@@ -198,7 +198,13 @@ final class BudgetLimitController extends Controller
if ($request->expectsJson()) {
$array = $limit->toArray();
// add some extra metadata:
$spentArr = $this->opsRepository->sumExpenses($limit->start_date, $limit->end_date, null, new Collection()->push($budget), $currency);
$spentArr = $this->opsRepository->sumExpenses(
$limit->start_date,
$limit->end_date,
null,
new Collection()->push($budget),
$currency
);
$array['spent'] = $spentArr[$currency->id]['sum'] ?? '0';
$array['left_formatted'] = Amount::formatAnything($limit->transactionCurrency, bcadd($array['spent'], (string) $array['amount']));
$array['amount_formatted'] = Amount::formatAnything($limit->transactionCurrency, $limit['amount']);
@@ -284,7 +284,10 @@ final class IndexController extends Controller
if (array_key_exists($currency->id, $spentArr) && array_key_exists('sum', $spentArr[$currency->id])) {
$array['spent'][$currency->id]['spent'] = $spentArr[$currency->id]['sum'];
$array['spent'][$currency->id]['spent_outside'] = Steam::negative(bcsub($spentInLimits[$currency->id], $spentArr[$currency->id]['sum']));
$array['spent'][$currency->id]['spent_outside'] = Steam::negative(bcsub(
$spentInLimits[$currency->id],
$spentArr[$currency->id]['sum']
));
$array['spent'][$currency->id]['currency_id'] = $currency->id;
$array['spent'][$currency->id]['currency_symbol'] = $currency->symbol;
$array['spent'][$currency->id]['currency_decimal_places'] = $currency->decimal_places;
@@ -97,7 +97,7 @@ final class ShowController extends Controller
$firstDate = $first instanceof TransactionJournal ? $first->date : $start;
$periods = $this->getNoModelPeriodOverview('budget', $firstDate, $end);
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
/** @var GroupCollectorInterface $collector */
@@ -132,7 +132,7 @@ final class ShowController extends Controller
$start = $first instanceof TransactionJournal ? $first->date : new Carbon();
$end = today(config('app.timezone'));
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
/** @var GroupCollectorInterface $collector */
@@ -166,7 +166,7 @@ final class ShowController extends Controller
$allStart = session('first', today(config('app.timezone'))->startOfYear());
$allEnd = today();
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$limits = $this->getLimits($budget, $allStart, $allEnd);
$repetition = null;
@@ -216,7 +216,7 @@ final class ShowController extends Controller
$currencySymbol = $budgetLimit->transactionCurrency->symbol;
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$subTitle = trans('firefly.budget_in_period', [
'name' => $budget->name,
@@ -71,7 +71,7 @@ final class IndexController extends Controller
public function index(Request $request): Factory|\Illuminate\Contracts\View\View
{
$page = 0 === (int) $request->input('page') ? 1 : (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$collection = $this->repository->getCategories();
$total = $collection->count();
@@ -85,7 +85,7 @@ final class NoCategoryController extends Controller
/** @var Carbon $start */
/** @var Carbon $end */
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$subTitle = trans('firefly.without_category_between', [
'start' => $start->isoFormat($this->monthAndDayFormat),
@@ -135,7 +135,7 @@ final class NoCategoryController extends Controller
$end = null;
$periods = new Collection();
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
Log::debug('Start of noCategory()');
$subTitle = (string) trans('firefly.all_journals_without_category');
@@ -84,7 +84,7 @@ final class ShowController extends Controller
/** @var Carbon $end */
$subTitleIcon = 'bi-bookmark';
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$attachments = $this->repository->getAttachments($category);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$oldest = $this->repository->firstUseDate($category) ?? today(config('app.timezone'))->startOfYear();
@@ -136,7 +136,7 @@ final class ShowController extends Controller
// default values:
$subTitleIcon = 'bi-bookmark';
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$start = null;
$end = null;
@@ -539,7 +539,13 @@ final class BudgetController extends Controller
}
// get spent amount in this period for this currency.
$sum = $this->opsRepository->sumExpenses($currentStart, $currentEnd, $accounts, new Collection()->push($budget), $currency);
$sum = $this->opsRepository->sumExpenses(
$currentStart,
$currentEnd,
$accounts,
new Collection()->push($budget),
$currency
);
$amount = Steam::positive($sum[$currency->id]['sum'] ?? '0');
$chartData[0]['entries'][$title] = Steam::bcround($amount, $currency->decimal_places);
+18 -14
View File
@@ -74,13 +74,14 @@ abstract class Controller extends BaseController
{
// is site a demo site?
try {
$isDemoSiteConfig = AppConfiguration::get('is_demo_site', config('firefly.configuration.is_demo_site', false));
} catch(FireflyException $e) {
$isDemoSiteConfig = AppConfiguration::get('is_demo_site', config('firefly.configuration.is_demo_site', false));
} catch (FireflyException $e) {
// if this breaks, just stop right here.
Log::error($e->getMessage());
return;
}
$isDemoSite = (bool) $isDemoSiteConfig->data;
$isDemoSite = (bool) $isDemoSiteConfig->data;
View::share('IS_DEMO_SITE', $isDemoSite);
View::share('DEMO_USERNAME', config('firefly.demo_username'));
View::share('DEMO_PASSWORD', config('firefly.demo_password'));
@@ -88,21 +89,24 @@ abstract class Controller extends BaseController
View::share('FF_BUILD_TIME', config('firefly.build_time'));
// this breaks when running < PHP 8.5 and is totally intentional.
$input = ' James is cool';
$output = $input
$input = ' James is cool';
$output = $input
|> trim(...)
|> (fn (string $string) => str_replace(' ', '-', $string))
|> (fn (string $string) => str_replace(['.', '/', '…'], '', $string))
|> strtolower(...);
// is webhooks enabled?
View::share('featuringWebhooks', true === config('firefly.feature_flags.webhooks') && true === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data);
View::share(
'featuringWebhooks',
true === config('firefly.feature_flags.webhooks') && true === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data
);
// is currency exchange enabled?
View::share('featuringCer', true === AppConfiguration::get('enable_exchange_rates', config('cer.enabled'))->data);
// share custom auth guard info.
$authGuard = config('firefly.authentication_guard');
$logoutUrl = config('firefly.custom_logout_url');
$authGuard = config('firefly.authentication_guard');
$logoutUrl = config('firefly.custom_logout_url');
// overrule v2 layout back to v1.
@@ -116,15 +120,15 @@ abstract class Controller extends BaseController
View::share('logoutUrl', $logoutUrl);
// upload size
$maxFileSize = Steam::phpBytes(ini_get('upload_max_filesize'));
$maxPostSize = Steam::phpBytes(ini_get('post_max_size'));
$uploadSize = min($maxFileSize, $maxPostSize);
$maxFileSize = Steam::phpBytes(ini_get('upload_max_filesize'));
$maxPostSize = Steam::phpBytes(ini_get('post_max_size'));
$uploadSize = min($maxFileSize, $maxPostSize);
View::share('uploadSize', $uploadSize);
// share is alpha, is beta
$isAlpha = false;
$isBeta = false;
$isDevelop = false;
$isAlpha = false;
$isBeta = false;
$isDevelop = false;
if (str_contains((string) config('firefly.version'), 'alpha')) {
$isAlpha = true;
}
+15 -2
View File
@@ -51,7 +51,13 @@ final class RuleController extends Controller
}
try {
$view = view('rules.partials.action', ['actions' => $actions, 'count' => $count,'oldAction' => null, 'oldValue' => null,'oldChecked' => null])->render();
$view = view('rules.partials.action', [
'actions' => $actions,
'count' => $count,
'oldAction' => null,
'oldValue' => null,
'oldChecked' => null,
])->render();
} catch (Throwable $e) {
Log::error(sprintf('Cannot render rules.partials.action: %s', $e->getMessage()));
Log::error($e->getTraceAsString());
@@ -81,7 +87,14 @@ final class RuleController extends Controller
asort($triggers);
try {
$view = view('rules.partials.trigger', ['triggers' => $triggers, 'count' => $count,'oldTrigger' => null, 'oldProhibited' => null,'oldValue' => null,'oldChecked' =>null])->render();
$view = view('rules.partials.trigger', [
'triggers' => $triggers,
'count' => $count,
'oldTrigger' => null,
'oldProhibited' => null,
'oldValue' => null,
'oldChecked' => null,
])->render();
} catch (Throwable $e) {
Log::error(sprintf('Cannot render rules.partials.trigger: %s', $e->getMessage()));
Log::error($e->getTraceAsString());
@@ -128,9 +128,8 @@ final class PreferencesController extends Controller
// missing fields will give an error unless set, so:
$tjOptionalFields['external_url'] ??= false;
$tjOptionalFields['location'] ??= false;
$tjOptionalFields['links'] ??= false;
$tjOptionalFields['location'] ??= false;
$tjOptionalFields['links'] ??= false;
$availableDarkModes = config('firefly.available_dark_modes');
@@ -81,7 +81,7 @@ final class IndexController extends Controller
public function index(Request $request): Factory|\Illuminate\Contracts\View\View
{
$page = 0 === (int) $request->input('page') ? 1 : (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$collection = $this->repository->get();
$today = today(config('app.timezone'));
@@ -134,8 +134,9 @@ final class BalanceController extends Controller
// get transactions in budget
}
// echo '<pre>';
// print_r($report);exit;
// echo '<pre>';
// print_r($report);exit;
try {
$result = view('reports.partials.balance', ['report' => $report])->render();
} catch (Throwable $e) {
@@ -353,9 +353,9 @@ final class BudgetController extends Controller
*/
public function topExpenses(Collection $accounts, Collection $budgets, Carbon $start, Carbon $end)
{
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, $budgets);
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, $budgets);
$incomeTopLength = 0;
$result = [];
$result = [];
foreach ($spent as $currency) {
foreach ($currency['budgets'] as $budget) {
foreach ($budget['transaction_journals'] as $journal) {
@@ -376,16 +376,16 @@ final class BudgetController extends Controller
'budget_name' => $budget['name'],
];
}
$incomeTopLength++;
++$incomeTopLength;
}
}
// sort by amount_float
// sort temp array by amount.
$amounts = array_column($result, 'amount_float');
$amounts = array_column($result, 'amount_float');
array_multisort($amounts, SORT_ASC, $result);
try {
$result = view('reports.budget.partials.top-expenses', ['result' => $result, 'incomeTopLength'=>$incomeTopLength])->render();
$result = view('reports.budget.partials.top-expenses', ['result' => $result, 'incomeTopLength' => $incomeTopLength])->render();
} catch (Throwable $e) {
Log::error(sprintf('Could not render reports.partials.budget-period: %s', $e->getMessage()));
$result = sprintf('Could not render view: %s', $e->getMessage());
@@ -604,7 +604,7 @@ final class CategoryController extends Controller
{
$incomeTopLength = 0;
// chart properties for cache:
$cache = new CacheProperties();
$cache = new CacheProperties();
$cache->addProperty($start);
$cache->addProperty($end);
$cache->addProperty('category-report');
@@ -614,15 +614,15 @@ final class CategoryController extends Controller
}
/** @var CategoryReportGenerator $generator */
$generator = app(CategoryReportGenerator::class);
$generator = app(CategoryReportGenerator::class);
$generator->setAccounts($accounts);
$generator->setStart($start);
$generator->setEnd($end);
$generator->operations();
$report = $generator->getReport();
$report = $generator->getReport();
try {
$result = view('reports.partials.categories', ['report' => $report,'incomeTopLength' => $incomeTopLength])->render();
$result = view('reports.partials.categories', ['report' => $report, 'incomeTopLength' => $incomeTopLength])->render();
$cache->store($result);
} catch (Throwable $e) {
Log::error(sprintf('Could not render category::expenses: %s', $e->getMessage()));
@@ -641,12 +641,12 @@ final class CategoryController extends Controller
*/
public function topExpenses(Collection $accounts, Collection $categories, Carbon $start, Carbon $end)
{
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, $categories);
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, $categories);
$incomeTopLength = 0;
$result = [];
$result = [];
foreach ($spent as $currency) {
foreach ($currency['categories'] as $category) {
$incomeTopLength++;
++$incomeTopLength;
foreach ($category['transaction_journals'] as $journal) {
$result[] = [
'description' => $journal['description'],
@@ -669,7 +669,7 @@ final class CategoryController extends Controller
}
// sort by amount_float
// sort temp array by amount.
$amounts = array_column($result, 'amount_float');
$amounts = array_column($result, 'amount_float');
array_multisort($amounts, SORT_ASC, $result);
try {
@@ -65,7 +65,7 @@ final class OperationsController extends Controller
public function expenses(Collection $accounts, Carbon $start, Carbon $end)
{
// chart properties for cache:
$cache = new CacheProperties();
$cache = new CacheProperties();
$cache->addProperty($start);
$cache->addProperty($end);
$cache->addProperty('expense-report');
@@ -73,9 +73,9 @@ final class OperationsController extends Controller
if ($cache->has()) {
return $cache->get();
}
$report = $this->tasker->getExpenseReport($start, $end, $accounts);
$type = 'expense-entry';
$incomeTopLength= count($report['accounts']);
$report = $this->tasker->getExpenseReport($start, $end, $accounts);
$type = 'expense-entry';
$incomeTopLength = count($report['accounts']);
try {
$result = view('reports.partials.income-expenses', ['report' => $report, 'type' => $type, 'incomeTopLength' => $incomeTopLength])->render();
@@ -446,12 +446,12 @@ final class TagController extends Controller
*/
public function topExpenses(Collection $accounts, Collection $tags, Carbon $start, Carbon $end)
{
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, $tags);
$result = [];
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, $tags);
$result = [];
$incomeTopLength = 0;
foreach ($spent as $currency) {
foreach ($currency['tags'] as $tag) {
$incomeTopLength++;
++$incomeTopLength;
foreach ($tag['transaction_journals'] as $journal) {
$result[] = [
'description' => $journal['description'],
@@ -474,7 +474,7 @@ final class TagController extends Controller
}
// sort by amount_float
// sort temp array by amount.
$amounts = array_column($result, 'amount_float');
$amounts = array_column($result, 'amount_float');
array_multisort($amounts, SORT_ASC, $result);
try {
+2 -2
View File
@@ -67,7 +67,7 @@ final class SearchController extends Controller
}
$fullQuery = (string) $fullQuery;
$page = 0 === (int) $request->input('page') ? 1 : (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$ruleId = (int) $request->input('rule');
$ruleChanged = false;
@@ -117,7 +117,7 @@ final class SearchController extends Controller
}
$fullQuery = (string) $entry;
$page = 0 === (int) $request->input('page') ? 1 : (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$searcher->parseQuery($fullQuery);
@@ -41,6 +41,7 @@ use Illuminate\Support\Facades\Log;
use Illuminate\View\View;
use Laravel\Passport\Passport;
use phpseclib3\Crypt\RSA;
use function Safe\file_put_contents;
/**
@@ -55,37 +56,37 @@ final class InstallController extends Controller
public const string FORBIDDEN_ERROR = 'Internal PHP function "proc_close" is disabled for your installation. Auto-migration is not possible.';
public const string OTHER_ERROR = 'An unknown error prevented Firefly III from executing the upgrade commands. Sorry.';
private string $lastError = '';
private string $lastError = '';
// empty on purpose.
private array $upgradeCommands
= [
// there are 5 initial commands
// Check 4 places: InstallController, Docker image, UpgradeDatabase, composer.json
'firefly-iii:create-database' => [],
'migrate' => ['--seed' => true, '--force' => true],
'generate-keys' => [], // an exception :(
'firefly-iii:upgrade-database' => [],
'firefly-iii:set-latest-version' => ['--james-is-cool' => true],
'firefly-iii:verify-security-alerts' => [],
];
private array $upgradeCommands = [
// there are 5 initial commands
// Check 4 places: InstallController, Docker image, UpgradeDatabase, composer.json
'firefly-iii:create-database' => [],
'migrate' => ['--seed' => true, '--force' => true],
'generate-keys' => [], // an exception :(
'firefly-iii:upgrade-database' => [],
'firefly-iii:set-latest-version' => ['--james-is-cool' => true],
'firefly-iii:verify-security-alerts' => [],
];
/**
* Show index.
*
* @return Factory|View
*/
public function index(): Factory | \Illuminate\Contracts\View\View
public function index(): Factory|\Illuminate\Contracts\View\View
{
if ($this->hasNoTables() || $this->isOldVersionInstalled()) {
app('view')->share('FF_VERSION', config('firefly.version'));
// index will set FF3 version.
try {
AppConfiguration::set('ff3_version', (string)config('firefly.version'));
AppConfiguration::set('ff3_build_time', (int)config('firefly.build_time'));
AppConfiguration::set('ff3_version', (string) config('firefly.version'));
AppConfiguration::set('ff3_build_time', (int) config('firefly.build_time'));
} catch (FireflyException $e) {
Log::warning($e->getMessage());
}
return view('install.index');
}
@@ -98,7 +99,7 @@ final class InstallController extends Controller
public function keys(): void
{
if ($this->hasNoTables() || $this->isOldVersionInstalled()) {
$key = RSA::createKey(4096);
$key = RSA::createKey(4096);
[$publicKey, $privateKey] = [Passport::keyPath('oauth-public.key'), Passport::keyPath('oauth-private.key')];
@@ -106,7 +107,7 @@ final class InstallController extends Controller
return;
}
file_put_contents($publicKey, (string)$key->getPublicKey());
file_put_contents($publicKey, (string) $key->getPublicKey());
file_put_contents($privateKey, $key->toString('PKCS1'));
}
}
@@ -114,14 +115,14 @@ final class InstallController extends Controller
public function runCommand(Request $request): JsonResponse
{
if ($this->hasNoTables() || $this->isOldVersionInstalled()) {
$requestIndex = (int)$request->input('index');
$requestIndex = (int) $request->input('index');
$response = ['hasNextCommand' => false, 'done' => true, 'previous' => null, 'error' => false, 'errorMessage' => null];
Log::debug(sprintf('Will now run commands. Request index is %d', $requestIndex));
$indexes = array_keys($this->upgradeCommands);
$indexes = array_keys($this->upgradeCommands);
if (array_key_exists($requestIndex, $indexes)) {
$command = $indexes[$requestIndex];
$parameters = $this->upgradeCommands[$command];
$command = $indexes[$requestIndex];
$parameters = $this->upgradeCommands[$command];
Log::debug(sprintf('Will now execute command "%s" with parameters', $command), $parameters);
try {
+1 -1
View File
@@ -298,7 +298,7 @@ final class TagController extends Controller
// default values:
$subTitleIcon = 'bi-tag';
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$periods = [];
$subTitle = (string) trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]);
@@ -152,7 +152,7 @@ final class IndexController extends Controller
$subTitleIcon = config('firefly.transactionIconsByType.'.$objectType);
$types = config('firefly.transactionTypesByType.'.$objectType);
$page = (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$path = route('transactions.index.all', [$objectType]);
$first = $this->repository->firstNull();
@@ -37,7 +37,6 @@ use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse;
use Illuminate\View\View;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
@@ -72,7 +72,7 @@ final class IndexController extends Controller
/** @var User $user */
$user = auth()->user();
$page = 0 === (int) $request->input('page') ? 1 : (int) $request->input('page');
$page = min(max(1, $page), 2 ** 16);
$page = min(max(1, $page), 2 ** 16);
$pageSize = (int) Preferences::get('listPageSize', 50)->data;
$collection = $this->repository->getAll();
-2
View File
@@ -74,6 +74,4 @@ class Installer
// update firefly version
return $next($request);
}
}
+14 -2
View File
@@ -122,7 +122,13 @@ class CreateAutoBudgetLimits implements ShouldQueue
// if has one, calculate expenses and use that as a base.
$repository = app(OperationsRepositoryInterface::class);
$repository->setUser($autoBudget->budget->user);
$spent = $repository->sumExpenses($previousStart, $previousEnd, null, new Collection()->push($autoBudget->budget), $autoBudget->transactionCurrency);
$spent = $repository->sumExpenses(
$previousStart,
$previousEnd,
null,
new Collection()->push($autoBudget->budget),
$autoBudget->transactionCurrency
);
$currencyId = $autoBudget->transaction_currency_id;
$spentAmount = $spent[$currencyId]['sum'] ?? '0';
Log::debug(sprintf('Spent in previous budget period (%s-%s) is %s', $previousStart->format('Y-m-d'), $previousEnd->format('Y-m-d'), $spentAmount));
@@ -212,7 +218,13 @@ class CreateAutoBudgetLimits implements ShouldQueue
// if has one, calculate expenses and use that as a base.
$repository = app(OperationsRepositoryInterface::class);
$repository->setUser($autoBudget->budget->user);
$spent = $repository->sumExpenses($previousStart, $previousEnd, null, new Collection()->push($autoBudget->budget), $autoBudget->transactionCurrency);
$spent = $repository->sumExpenses(
$previousStart,
$previousEnd,
null,
new Collection()->push($autoBudget->budget),
$autoBudget->transactionCurrency
);
$currencyId = $autoBudget->transaction_currency_id;
$spentAmount = $spent[$currencyId]['sum'] ?? '0';
Log::debug(sprintf('Spent in previous budget period (%s-%s) is %s', $previousStart->format('Y-m-d'), $previousEnd->format('Y-m-d'), $spentAmount));
+1 -1
View File
@@ -61,7 +61,7 @@ class AppConfiguration
try {
/** @var null|Configuration $config */
$config = Configuration::query()->where('name', $name)->first(['id', 'name', 'data']);
} catch (Exception|QueryException|FireflyException $e) {
} catch (Exception|FireflyException|QueryException $e) {
throw new FireflyException(sprintf('Could not poll the database: %s', $e->getMessage()), 0, $e);
}
+22 -23
View File
@@ -100,15 +100,14 @@ class ExpandedForm
try {
$html = view('form.checkbox', [
'classes' => $classes,
'name' => $name,
'label' => $label,
'value' => $value,
'options' => $options,
'classes' => $classes,
'name' => $name,
'label' => $label,
'value' => $value,
'options' => $options,
'inputClasses' => $inputClasses,
])->render();
} catch (Throwable $e) {
Log::debug(sprintf('Could not render checkbox(): %s', $e->getMessage()));
$html = 'Could not render checkbox.';
@@ -165,6 +164,23 @@ class ExpandedForm
return $html;
}
/**
* @throws FireflyException
*/
public function hidden(string $name, mixed $value): string
{
try {
$html = view('form.hidden', ['name' => $name, 'value' => $value])->render();
} catch (Throwable $e) {
Log::debug(sprintf('Could not render hidden(): %s', $e->getMessage()));
$html = sprintf('Could not render hidden: %s', $e->getMessage());
throw new FireflyException($html, 0, $e);
}
return $html;
}
/**
* @param mixed $value
*
@@ -325,23 +341,6 @@ class ExpandedForm
return $html;
}
/**
* @throws FireflyException
*/
public function hidden(string $name, mixed $value): string
{
try {
$html = view('form.hidden', ['name' => $name, 'value' => $value])->render();
} catch (Throwable $e) {
Log::debug(sprintf('Could not render hidden(): %s', $e->getMessage()));
$html = sprintf('Could not render hidden: %s', $e->getMessage());
throw new FireflyException($html, 0, $e);
}
return $html;
}
/**
* @throws FireflyException
*/
+9 -9
View File
@@ -286,7 +286,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -357,7 +357,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -418,7 +418,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -465,7 +465,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -547,7 +547,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -716,7 +716,7 @@ class ExportDataGenerator
}
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -865,7 +865,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -923,7 +923,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
@@ -1121,7 +1121,7 @@ class ExportDataGenerator
// load the CSV document from a string
$csv = Writer::fromString();
$escaper = new EscapeFormula();
$escaper = new EscapeFormula();
$csv->addFormatter($escaper->escapeRecord(...));
// insert the header
+13 -13
View File
@@ -139,19 +139,6 @@ trait FormSupport
return today(config('app.timezone'));
}
protected function getHolderClasses(string $name): string
{
// Get errors from session:
/** @var null|MessageBag $errors */
$errors = session('errors');
if (null !== $errors && $errors->has($name)) {
return 'has-error has-feedback';
}
return 'has-error has-feedback';
}
protected function getErrorClassesForCheckbox(string $name): string
{
// Get errors from session:
@@ -165,6 +152,19 @@ trait FormSupport
return 'form-check-input';
}
protected function getHolderClasses(string $name): string
{
// Get errors from session:
/** @var null|MessageBag $errors */
$errors = session('errors');
if (null !== $errors && $errors->has($name)) {
return 'has-error has-feedback';
}
return 'has-error has-feedback';
}
protected function label(string $name, ?array $options = null): string
{
$options ??= [];
@@ -222,7 +222,14 @@ trait AugumentData
$currentEnd->addMonth();
}
// primary currency amount.
$expenses = $opsRepository->sumExpenses($currentStart, $currentEnd, null, $budgetCollection, $entry->transactionCurrency, $this->convertToPrimary);
$expenses = $opsRepository->sumExpenses(
$currentStart,
$currentEnd,
null,
$budgetCollection,
$entry->transactionCurrency,
$this->convertToPrimary
);
$spent = $expenses[$currency->id]['sum'] ?? '0';
$entry->pc_spent = $spent;
@@ -354,7 +354,11 @@ class RecurringEnrichment implements EnrichmentInterface
/** @var RecurrenceRepetition $repetition */
foreach ($set as $repetition) {
$recurrence = $this->collection->filter(static fn (Recurrence $item): bool => (int) $item->id === (int) $repetition->recurrence_id)->first();
$recurrence = $this->collection->filter(
static fn (Recurrence $item): bool => (int) $item->id === (int) $repetition->recurrence_id
)
->first()
;
$fromDate = clone ($recurrence->latest_date ?? $recurrence->first_date);
$recurrenceId = (int) $repetition->recurrence_id;
$repId = (int) $repetition->id;
+8 -8
View File
@@ -47,8 +47,8 @@ trait IsOldVersion
return 0;
}
$currentDate = Carbon::createFromFormat('!Y-m-d', $currentParts[1]);
$latestDate = Carbon::createFromFormat('!Y-m-d', $latestParts[1]);
$currentDate = Carbon::createFromFormat('!Y-m-d', $currentParts[1]);
$latestDate = Carbon::createFromFormat('!Y-m-d', $latestParts[1]);
if ($currentDate->lt($latestDate)) {
Log::debug(sprintf('This current version is older, current = %s, latest version %s.', $current, $latest));
@@ -71,16 +71,16 @@ trait IsOldVersion
protected function isOldVersionInstalled(): bool
{
// version compare thing.
$configBuildTime = (int)config('firefly.build_time');
$dbBuildTime = (int)AppConfiguration::getFresh('ff3_build_time', 123)->data;
$configBuildTime = (int) config('firefly.build_time');
$dbBuildTime = (int) AppConfiguration::getFresh('ff3_build_time', 123)->data;
$configTime = Carbon::createFromTimestamp($configBuildTime, config('app.timezone'));
$dbTime = Carbon::createFromTimestamp($dbBuildTime, config('app.timezone'));
if ($dbBuildTime < $configBuildTime) {
Log::warning(sprintf(
'Your database was last managed by an older version of Firefly III (I see %s, I expect %s). Redirect to migrate routine.',
$dbTime->format('Y-m-d H:i:s'),
$configTime->format('Y-m-d H:i:s')
));
'Your database was last managed by an older version of Firefly III (I see %s, I expect %s). Redirect to migrate routine.',
$dbTime->format('Y-m-d H:i:s'),
$configTime->format('Y-m-d H:i:s')
));
return true;
}
+22 -21
View File
@@ -39,6 +39,7 @@ use Override;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
use function Safe\parse_url;
/**
@@ -103,9 +104,9 @@ class General extends AbstractExtension
'activeRoutePartialObjectType',
static function (array $context): string {
[, $route, $objectType] = func_get_args();
$activeObjectType = $context['objectType'] ?? false;
$activeObjectType = $context['objectType'] ?? false;
if ($objectType === $activeObjectType && false !== stripos((string)Route::getCurrentRoute()->getName(), (string)$route)) {
if ($objectType === $activeObjectType && false !== stripos((string) Route::getCurrentRoute()->getName(), (string) $route)) {
return 'active';
}
@@ -144,11 +145,11 @@ class General extends AbstractExtension
}
/** @var Carbon $date */
$date = now();
$date = now();
// get the date from the current session. If it's in the future, keep `now()`.
/** @var Carbon $session */
$session = clone session('end', today(config('app.timezone'))->endOfMonth());
$session = clone session('end', today(config('app.timezone'))->endOfMonth());
if ($session->lt($date)) {
$date = $session->copy();
$date->endOfDay();
@@ -156,13 +157,13 @@ class General extends AbstractExtension
Log::debug(sprintf('twig balance: Call finalAccountBalance with date/time "%s"', $date->toIso8601String()));
// 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized.
$info = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
$info = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
// $info = Steam::finalAccountBalance($account, $date);
$currency = Steam::getAccountCurrency($account);
$primary = Amount::getPrimaryCurrency();
$convertToPrimary = Amount::convertToPrimary();
$usePrimary = $convertToPrimary && $primary->id !== $currency->id;
$currency ??= $primary;
$currency ??= $primary;
$strings = [];
foreach ($info as $key => $balance) {
if ('balance' === $key) {
@@ -202,7 +203,7 @@ class General extends AbstractExtension
protected function carbonize(): TwigFunction
{
return new TwigFunction('carbonize', static fn(string $date): Carbon => new Carbon($date, config('app.timezone')));
return new TwigFunction('carbonize', static fn (string $date): Carbon => new Carbon($date, config('app.timezone')));
}
/**
@@ -225,15 +226,15 @@ class General extends AbstractExtension
return new TwigFilter('filesize', static function (int $size): string {
// less than one GB, more than one MB
if ($size < (1024 * 1024 * 2014) && $size >= (1024 * 1024)) {
return round($size / (1024 * 1024), 2) . ' MB';
return round($size / (1024 * 1024), 2).' MB';
}
// less than one MB
if ($size < (1024 * 1024)) {
return round($size / 1024, 2) . ' KB';
return round($size / 1024, 2).' KB';
}
return $size . ' bytes';
return $size.' bytes';
});
}
@@ -282,7 +283,7 @@ class General extends AbstractExtension
static function (string $text): string {
$converter = new GithubFlavoredMarkdownConverter(['allow_unsafe_links' => false, 'max_nesting_level' => 5, 'html_input' => 'escape']);
return (string)$converter->convert($text);
return (string) $converter->convert($text);
},
['is_safe' => ['html']]
);
@@ -315,15 +316,15 @@ class General extends AbstractExtension
{
return new TwigFilter(
'mimeIcon',
static fn(string $string): string => match ($string) {
'application/pdf' => 'fa-file-pdf-o',
static fn (string $string): string => match ($string) {
'application/pdf' => 'fa-file-pdf-o',
'image/webp',
'image/png',
'image/jpeg',
'image/svg+xml',
'image/heic',
'image/heic-sequence',
'application/vnd.oasis.opendocument.image' => 'fa-file-image-o',
'application/vnd.oasis.opendocument.image' => 'fa-file-image-o',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
@@ -336,7 +337,7 @@ class General extends AbstractExtension
'application/vnd.oasis.opendocument.text',
'application/vnd.oasis.opendocument.text-template',
'application/vnd.oasis.opendocument.text-web',
'application/vnd.oasis.opendocument.text-master' => 'fa-file-word-o',
'application/vnd.oasis.opendocument.text-master' => 'fa-file-word-o',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
@@ -344,7 +345,7 @@ class General extends AbstractExtension
'application/vnd.sun.xml.calc.template',
'application/vnd.stardivision.calc',
'application/vnd.oasis.opendocument.spreadsheet',
'application/vnd.oasis.opendocument.spreadsheet-template' => 'fa-file-excel-o',
'application/vnd.oasis.opendocument.spreadsheet-template' => 'fa-file-excel-o',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.openxmlformats-officedocument.presentationml.template',
@@ -353,18 +354,18 @@ class General extends AbstractExtension
'application/vnd.sun.xml.impress.template',
'application/vnd.stardivision.impress',
'application/vnd.oasis.opendocument.presentation',
'application/vnd.oasis.opendocument.presentation-template' => 'fa-file-powerpoint-o',
'application/vnd.oasis.opendocument.presentation-template' => 'fa-file-powerpoint-o',
'application/vnd.sun.xml.draw',
'application/vnd.sun.xml.draw.template',
'application/vnd.stardivision.draw',
'application/vnd.oasis.opendocument.chart' => 'bi-paint-bucket',
'application/vnd.oasis.opendocument.chart' => 'bi-paint-bucket',
'application/vnd.oasis.opendocument.graphics',
'application/vnd.oasis.opendocument.graphics-template',
'application/vnd.sun.xml.math',
'application/vnd.stardivision.math',
'application/vnd.oasis.opendocument.formula',
'application/vnd.oasis.opendocument.database' => 'fa-calculator',
default => 'fa-file-o'
'application/vnd.oasis.opendocument.database' => 'fa-calculator',
default => 'fa-file-o'
},
['is_safe' => ['html']]
);
@@ -399,6 +400,6 @@ class General extends AbstractExtension
private function fireflyIIIConfig(): TwigFunction
{
return new TwigFunction('fireflyiiiconfig', static fn(string $string, mixed $default): mixed => AppConfiguration::get($string, $default)->data);
return new TwigFunction('fireflyiiiconfig', static fn (string $string, mixed $default): mixed => AppConfiguration::get($string, $default)->data);
}
}
@@ -23,11 +23,11 @@ class TransactionAmount extends Component
*/
public function __construct(string $type, array $amount, array $foreign, array $sourceAccount, ?string $pcAmount, ?Account $account)
{
$this->type = $type;
$this->amount = $amount;
$this->foreign = $foreign;
$this->account = $account;
$this->pcAmount = $pcAmount;
$this->type = $type;
$this->amount = $amount;
$this->foreign = $foreign;
$this->account = $account;
$this->pcAmount = $pcAmount;
$this->sourceAccount = $sourceAccount;
}
+4 -4
View File
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Form\Alpine;
use Closure;
@@ -14,20 +13,21 @@ class Checkbox extends Component
public string $id;
public string $value;
public string $title;
/**
* Create a new component instance.
*/
public function __construct(string $id, string $value, string $title)
{
$this->id = $id;
$this->value= $value;
$this->id = $id;
$this->value = $value;
$this->title = $title;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.form.alpine.checkbox');
}
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Form\Alpine;
use Closure;
@@ -12,18 +11,19 @@ use Illuminate\View\Component;
class Deliveries extends Component
{
public string $value;
/**
* Create a new component instance.
*/
public function __construct(string $value)
{
$this->value= $value;
$this->value = $value;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.form.alpine.deliveries');
}
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Form\Alpine;
use Closure;
@@ -12,18 +11,19 @@ use Illuminate\View\Component;
class Responses extends Component
{
public string $value;
/**
* Create a new component instance.
*/
public function __construct(string $value)
{
$this->value= $value;
$this->value = $value;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.form.alpine.responses');
}
+3 -3
View File
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Form\Alpine;
use Closure;
@@ -12,18 +11,19 @@ use Illuminate\View\Component;
class Title extends Component
{
public string $value;
/**
* Create a new component instance.
*/
public function __construct(string $value)
{
$this->value= $value;
$this->value = $value;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.form.alpine.title');
}
+3 -3
View File
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Form\Alpine;
use Closure;
@@ -13,19 +12,20 @@ class Triggers extends Component
{
public string $value;
public string $multiple = '';
/**
* Create a new component instance.
*/
public function __construct(string $value, string $multiple = '')
{
$this->value= $value;
$this->value = $value;
$this->multiple = $multiple;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.form.alpine.triggers');
}
+3 -3
View File
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Form\Alpine;
use Closure;
@@ -12,18 +11,19 @@ use Illuminate\View\Component;
class Url extends Component
{
public string $value;
/**
* Create a new component instance.
*/
public function __construct(string $value)
{
$this->value= $value;
$this->value = $value;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.form.alpine.url');
}
+2 -2
View File
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Lists;
use Closure;
@@ -13,6 +12,7 @@ use Illuminate\View\Component;
class Ale extends Component
{
public array|Collection $logEntries;
/**
* Create a new component instance.
*/
@@ -24,7 +24,7 @@ class Ale extends Component
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.lists.ale');
}
+4 -4
View File
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Lists;
use Closure;
@@ -12,11 +11,12 @@ use Illuminate\View\Component;
class Attachments extends Component
{
public Collection|array $attachments;
public array|Collection $attachments;
/**
* Create a new component instance.
*/
public function __construct(Collection|array $attachments)
public function __construct(array|Collection $attachments)
{
$this->attachments = $attachments;
}
@@ -24,7 +24,7 @@ class Attachments extends Component
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.lists.attachments');
}
+2 -2
View File
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Lists;
use Closure;
@@ -13,6 +12,7 @@ use Illuminate\View\Component;
class Categories extends Component
{
public LengthAwarePaginator $categories;
/**
* Create a new component instance.
*/
@@ -24,7 +24,7 @@ class Categories extends Component
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.lists.categories');
}
+7 -7
View File
@@ -13,26 +13,26 @@ use Illuminate\View\Component;
class GroupsLarge extends Component
{
public LengthAwarePaginator|Collection $groups;
public ?Account $account;
public bool $showCategory;
public bool $showBudget;
public Collection|LengthAwarePaginator $groups;
public ?Account $account;
public bool $showCategory;
public bool $showBudget;
/**
* Create a new component instance.
*/
public function __construct(LengthAwarePaginator| Collection $groups, ?bool $showCategory, ?bool $showBudget, ?Account $account = null)
public function __construct(Collection|LengthAwarePaginator $groups, ?bool $showCategory, ?bool $showBudget, ?Account $account = null)
{
$this->groups = $groups;
$this->account = $account;
$this->showCategory = $showCategory ??false;
$this->showCategory = $showCategory ?? false;
$this->showBudget = $showBudget ?? false;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): Closure | string | View
public function render(): Closure|string|View
{
return view('components.lists.groups-large');
}
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Lists;
use Closure;
@@ -14,19 +13,20 @@ class PiggyBankEvents extends Component
{
public Collection $events;
public bool $showPiggyBank;
/**
* Create a new component instance.
*/
public function __construct(Collection $events, bool $showPiggyBank)
{
$this->events = $events;
$this->events = $events;
$this->showPiggyBank = $showPiggyBank;
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.lists.piggy-bank-events');
}
@@ -2,7 +2,6 @@
declare(strict_types=1);
namespace FireflyIII\View\Components\Report\Partial;
use Closure;
@@ -15,12 +14,13 @@ class JournalsAudit extends Component
public array $journals;
public array $auditData;
public Account $account;
/**
* Create a new component instance.
*/
public function __construct(array $journals,array $auditData, Account $account)
public function __construct(array $journals, array $auditData, Account $account)
{
$this->journals = $journals;
$this->journals = $journals;
$this->auditData = $auditData;
$this->account = $account;
}
@@ -28,7 +28,7 @@ class JournalsAudit extends Component
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
public function render(): Closure|string|View
{
return view('components.report.partial.journals-audit');
}
Generated
+80 -80
View File
@@ -1246,22 +1246,22 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "7.13.2",
"version": "7.14.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "bcd989ad36c92d42a3715379af91f2defee5b8dd"
"reference": "aef242412e13128b5049864867bb49fc37dd39de"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/bcd989ad36c92d42a3715379af91f2defee5b8dd",
"reference": "bcd989ad36c92d42a3715379af91f2defee5b8dd",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/aef242412e13128b5049864867bb49fc37dd39de",
"reference": "aef242412e13128b5049864867bb49fc37dd39de",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^2.5",
"guzzlehttp/psr7": "^2.12.3",
"guzzlehttp/promises": "^2.5.1",
"guzzlehttp/psr7": "^2.12.4",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.5 || ^3.0",
@@ -1354,7 +1354,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.13.2"
"source": "https://github.com/guzzle/guzzle/tree/7.14.0"
},
"funding": [
{
@@ -1370,20 +1370,20 @@
"type": "tidelift"
}
],
"time": "2026-07-05T19:00:11+00:00"
"time": "2026-07-08T22:54:09+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "2.5.0",
"version": "2.5.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "4360e982f87f5f258bf872d094647791db2f4c8e"
"reference": "9ad1e4fc607446a055b95870c7f668e93b5cff29"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e",
"reference": "4360e982f87f5f258bf872d094647791db2f4c8e",
"url": "https://api.github.com/repos/guzzle/promises/zipball/9ad1e4fc607446a055b95870c7f668e93b5cff29",
"reference": "9ad1e4fc607446a055b95870c7f668e93b5cff29",
"shasum": ""
},
"require": {
@@ -1438,7 +1438,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.5.0"
"source": "https://github.com/guzzle/promises/tree/2.5.1"
},
"funding": [
{
@@ -1454,20 +1454,20 @@
"type": "tidelift"
}
],
"time": "2026-06-02T12:23:43+00:00"
"time": "2026-07-08T15:48:39+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "2.12.3",
"version": "2.12.4",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d"
"reference": "51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/7ec62dc3f44aa218487dbed81a9bf9bc647be55d",
"reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c",
"reference": "51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c",
"shasum": ""
},
"require": {
@@ -1557,7 +1557,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.12.3"
"source": "https://github.com/guzzle/psr7/tree/2.12.4"
},
"funding": [
{
@@ -1573,20 +1573,20 @@
"type": "tidelift"
}
],
"time": "2026-06-23T15:21:08+00:00"
"time": "2026-07-08T15:56:20+00:00"
},
{
"name": "guzzlehttp/uri-template",
"version": "v1.0.8",
"version": "v1.0.9",
"source": {
"type": "git",
"url": "https://github.com/guzzle/uri-template.git",
"reference": "9c19128923b05a5d7355e5d2318d7808b7e33bbd"
"reference": "d7580af6d3f8384325d9cd3e99b21c3ed1848176"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/uri-template/zipball/9c19128923b05a5d7355e5d2318d7808b7e33bbd",
"reference": "9c19128923b05a5d7355e5d2318d7808b7e33bbd",
"url": "https://api.github.com/repos/guzzle/uri-template/zipball/d7580af6d3f8384325d9cd3e99b21c3ed1848176",
"reference": "d7580af6d3f8384325d9cd3e99b21c3ed1848176",
"shasum": ""
},
"require": {
@@ -1643,7 +1643,7 @@
],
"support": {
"issues": "https://github.com/guzzle/uri-template/issues",
"source": "https://github.com/guzzle/uri-template/tree/v1.0.8"
"source": "https://github.com/guzzle/uri-template/tree/v1.0.9"
},
"funding": [
{
@@ -1659,7 +1659,7 @@
"type": "tidelift"
}
],
"time": "2026-06-23T13:02:23+00:00"
"time": "2026-07-08T16:19:22+00:00"
},
{
"name": "jc5/google2fa-laravel",
@@ -1885,16 +1885,16 @@
},
{
"name": "laravel/framework",
"version": "v13.18.1",
"version": "v13.19.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "7d66044819e269f05924793a6800022dc181d850"
"reference": "514502b38e11bd676ecf83b271c9452cc7500f16"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/7d66044819e269f05924793a6800022dc181d850",
"reference": "7d66044819e269f05924793a6800022dc181d850",
"url": "https://api.github.com/repos/laravel/framework/zipball/514502b38e11bd676ecf83b271c9452cc7500f16",
"reference": "514502b38e11bd676ecf83b271c9452cc7500f16",
"shasum": ""
},
"require": {
@@ -2105,7 +2105,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2026-07-02T18:35:20+00:00"
"time": "2026-07-07T14:13:33+00:00"
},
{
"name": "laravel/passport",
@@ -2844,16 +2844,16 @@
},
{
"name": "league/flysystem",
"version": "3.35.1",
"version": "3.35.2",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "f23af6c5aafd958a7593029a271d77baf5ed793c"
"reference": "b277b5dc3d56650b68904117124e79c851e12376"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f23af6c5aafd958a7593029a271d77baf5ed793c",
"reference": "f23af6c5aafd958a7593029a271d77baf5ed793c",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b277b5dc3d56650b68904117124e79c851e12376",
"reference": "b277b5dc3d56650b68904117124e79c851e12376",
"shasum": ""
},
"require": {
@@ -2921,9 +2921,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.35.1"
"source": "https://github.com/thephpleague/flysystem/tree/3.35.2"
},
"time": "2026-06-25T06:52:23+00:00"
"time": "2026-07-06T14:42:07+00:00"
},
{
"name": "league/flysystem-local",
@@ -3046,16 +3046,16 @@
},
{
"name": "league/mime-type-detection",
"version": "1.16.0",
"version": "1.17.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/mime-type-detection.git",
"reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"
"reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",
"reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",
"url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/f5f47eff7c48ed1003069a2ca67f316fb4021c76",
"reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76",
"shasum": ""
},
"require": {
@@ -3065,7 +3065,7 @@
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.2",
"phpstan/phpstan": "^0.12.68",
"phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0"
"phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0 || ^11.0 || ^12.0"
},
"type": "library",
"autoload": {
@@ -3086,7 +3086,7 @@
"description": "Mime-type detection for Flysystem",
"support": {
"issues": "https://github.com/thephpleague/mime-type-detection/issues",
"source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0"
"source": "https://github.com/thephpleague/mime-type-detection/tree/1.17.0"
},
"funding": [
{
@@ -3098,7 +3098,7 @@
"type": "tidelift"
}
],
"time": "2024-09-21T08:32:55+00:00"
"time": "2026-07-09T11:49:27+00:00"
},
{
"name": "league/oauth2-server",
@@ -9936,16 +9936,16 @@
},
{
"name": "vlucas/phpdotenv",
"version": "v5.6.3",
"version": "v5.6.4",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
"reference": "955e7815d677a3eaa7075231212f2110983adecc"
"reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc",
"reference": "955e7815d677a3eaa7075231212f2110983adecc",
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b",
"reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b",
"shasum": ""
},
"require": {
@@ -10004,7 +10004,7 @@
],
"support": {
"issues": "https://github.com/vlucas/phpdotenv/issues",
"source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3"
"source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4"
},
"funding": [
{
@@ -10016,7 +10016,7 @@
"type": "tidelift"
}
],
"time": "2025-12-27T19:49:13+00:00"
"time": "2026-07-06T19:11:50+00:00"
},
{
"name": "voku/portable-ascii",
@@ -11798,16 +11798,16 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "14.2.2",
"version": "14.2.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83"
"reference": "82f6e49ff224e2cde923d74425e583a883910783"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/10d7da3628a99289cdf4c662dd7f0d73f1baec83",
"reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/82f6e49ff224e2cde923d74425e583a883910783",
"reference": "82f6e49ff224e2cde923d74425e583a883910783",
"shasum": ""
},
"require": {
@@ -11815,7 +11815,7 @@
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^5.7.0",
"nikic/php-parser": "^5.8.0",
"php": ">=8.4",
"phpunit/php-text-template": "^6.0",
"sebastian/complexity": "^6.0",
@@ -11826,7 +11826,7 @@
"theseer/tokenizer": "^2.0.1"
},
"require-dev": {
"phpunit/phpunit": "^13.2.0"
"phpunit/phpunit": "^13.2.2"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -11864,7 +11864,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.2.2"
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.2.3"
},
"funding": [
{
@@ -11884,7 +11884,7 @@
"type": "tidelift"
}
],
"time": "2026-06-08T11:50:38+00:00"
"time": "2026-07-06T15:04:02+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -12181,30 +12181,30 @@
},
{
"name": "phpunit/phpunit",
"version": "13.2.2",
"version": "13.2.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "492c067e618de7b3c76105082c90f9d2833401b7"
"reference": "8f5180f4627fc1978be2f61d8d9979dbe37e0c10"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/492c067e618de7b3c76105082c90f9d2833401b7",
"reference": "492c067e618de7b3c76105082c90f9d2833401b7",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8f5180f4627fc1978be2f61d8d9979dbe37e0c10",
"reference": "8f5180f4627fc1978be2f61d8d9979dbe37e0c10",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-filter": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
"myclabs/deep-copy": "^1.13.4",
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.4.1",
"phpunit/php-code-coverage": "^14.2.2",
"phpunit/php-code-coverage": "^14.2.3",
"phpunit/php-file-iterator": "^7.0.0",
"phpunit/php-invoker": "^7.0.0",
"phpunit/php-text-template": "^6.0.0",
@@ -12261,7 +12261,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.2"
"source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.4"
},
"funding": [
{
@@ -12269,20 +12269,20 @@
"type": "other"
}
],
"time": "2026-06-29T13:36:29+00:00"
"time": "2026-07-08T08:36:51+00:00"
},
{
"name": "rector/rector",
"version": "2.5.3",
"version": "2.5.5",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
"reference": "3d3577ad88d70d9f8dccd0a4c2f75bf13d6268e6"
"reference": "9718a72e7f1aacacbdcb6eeed07a47147bce802e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/3d3577ad88d70d9f8dccd0a4c2f75bf13d6268e6",
"reference": "3d3577ad88d70d9f8dccd0a4c2f75bf13d6268e6",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/9718a72e7f1aacacbdcb6eeed07a47147bce802e",
"reference": "9718a72e7f1aacacbdcb6eeed07a47147bce802e",
"shasum": ""
},
"require": {
@@ -12321,7 +12321,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
"source": "https://github.com/rectorphp/rector/tree/2.5.3"
"source": "https://github.com/rectorphp/rector/tree/2.5.5"
},
"funding": [
{
@@ -12329,7 +12329,7 @@
"type": "github"
}
],
"time": "2026-07-05T01:32:08+00:00"
"time": "2026-07-09T09:48:44+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -13021,24 +13021,24 @@
},
{
"name": "sebastian/lines-of-code",
"version": "5.0.1",
"version": "5.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7"
"reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
"reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8",
"reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8",
"shasum": ""
},
"require": {
"nikic/php-parser": "^5.7.0",
"nikic/php-parser": "^5.8.0",
"php": ">=8.4"
},
"require-dev": {
"phpunit/phpunit": "^13.1.10"
"phpunit/phpunit": "^13.2.4"
},
"type": "library",
"extra": {
@@ -13067,7 +13067,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.1"
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.2"
},
"funding": [
{
@@ -13087,7 +13087,7 @@
"type": "tidelift"
}
],
"time": "2026-05-19T16:23:37+00:00"
"time": "2026-07-09T08:42:34+00:00"
},
{
"name": "sebastian/object-enumerator",
+3 -3
View File
@@ -78,8 +78,8 @@ return [
'running_balance_column' => (bool)env_default_when_empty(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-07-06',
'build_time' => 1783312383,
'version' => 'develop/2026-07-09',
'build_time' => 1783619838,
'api_version' => '2.1.0', // field is no longer used.
'db_version' => 28, // field is no longer used.
@@ -390,7 +390,7 @@ return [
AccountTypeEnum::MORTGAGE->value => AccountTypeEnum::MORTGAGE->value,
],
'transactionTypesByType' => [
'all' => [TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::TRANSFER->value],
'all' => [TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::TRANSFER->value],
'expenses' => ['Withdrawal'],
'withdrawal' => ['Withdrawal'],
'revenue' => ['Deposit'],
+2 -2
View File
@@ -39,7 +39,7 @@ return [
'date',
'rate',
'triggers',
'help_rate_form'
'help_rate_form',
],
'list' => [
'drag_and_drop',
@@ -143,7 +143,7 @@ return [
'webhook_trigger_STORE_TRANSACTION',
'webhook_trigger_UPDATE_TRANSACTION',
'webhook_response_RELEVANT',
'webhook_delivery_JSON'
'webhook_delivery_JSON',
// 'account_column_opt_drag_and_drop',
// 'account_column_opt_active',
// 'account_column_opt_name',
+76 -124
View File
@@ -97,9 +97,9 @@
}
},
"node_modules/@oxc-project/types": {
"version": "0.138.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz",
"integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==",
"version": "0.139.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
"integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -235,9 +235,6 @@
"arm"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -259,9 +256,6 @@
"arm"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -283,9 +277,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -307,9 +298,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -331,9 +319,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -355,9 +340,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -459,9 +441,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz",
"integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
"integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
"cpu": [
"arm64"
],
@@ -476,9 +458,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz",
"integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
"integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
"cpu": [
"arm64"
],
@@ -493,9 +475,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz",
"integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
"integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
"cpu": [
"x64"
],
@@ -510,9 +492,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz",
"integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
"integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
"cpu": [
"x64"
],
@@ -527,9 +509,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz",
"integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
"integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
"cpu": [
"arm"
],
@@ -544,16 +526,13 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz",
"integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
"integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -564,16 +543,13 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz",
"integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
"integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -584,16 +560,13 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz",
"integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
"integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
"cpu": [
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -604,16 +577,13 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz",
"integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
"integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
"cpu": [
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -624,16 +594,13 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz",
"integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
"integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -644,16 +611,13 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz",
"integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
"integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -664,9 +628,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz",
"integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
"integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
"cpu": [
"arm64"
],
@@ -681,9 +645,9 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz",
"integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
"integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
"cpu": [
"wasm32"
],
@@ -700,9 +664,9 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz",
"integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
"integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
"cpu": [
"arm64"
],
@@ -717,9 +681,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz",
"integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
"integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
"cpu": [
"x64"
],
@@ -1494,9 +1458,9 @@
}
},
"node_modules/i18next": {
"version": "26.3.4",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.4.tgz",
"integrity": "sha512-pa7m0d7pBDqGHZxljT+WPFeyFgQ7P7SciPPo1tTqYuO0z4sqADYhwnBESmmGp/wEof1inwdls/k8ZgTg8rxFHA==",
"version": "26.3.6",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.6.tgz",
"integrity": "sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==",
"funding": [
{
"type": "individual",
@@ -1513,7 +1477,7 @@
],
"license": "MIT",
"peerDependencies": {
"typescript": "^5 || ^6"
"typescript": "^5 || ^6 || ^7"
},
"peerDependenciesMeta": {
"typescript": {
@@ -1857,9 +1821,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1881,9 +1842,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1905,9 +1863,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1929,9 +1884,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -2217,13 +2169,13 @@
}
},
"node_modules/rolldown": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz",
"integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
"integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.138.0",
"@oxc-project/types": "=0.139.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -2233,21 +2185,21 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.1.4",
"@rolldown/binding-darwin-arm64": "1.1.4",
"@rolldown/binding-darwin-x64": "1.1.4",
"@rolldown/binding-freebsd-x64": "1.1.4",
"@rolldown/binding-linux-arm-gnueabihf": "1.1.4",
"@rolldown/binding-linux-arm64-gnu": "1.1.4",
"@rolldown/binding-linux-arm64-musl": "1.1.4",
"@rolldown/binding-linux-ppc64-gnu": "1.1.4",
"@rolldown/binding-linux-s390x-gnu": "1.1.4",
"@rolldown/binding-linux-x64-gnu": "1.1.4",
"@rolldown/binding-linux-x64-musl": "1.1.4",
"@rolldown/binding-openharmony-arm64": "1.1.4",
"@rolldown/binding-wasm32-wasi": "1.1.4",
"@rolldown/binding-win32-arm64-msvc": "1.1.4",
"@rolldown/binding-win32-x64-msvc": "1.1.4"
"@rolldown/binding-android-arm64": "1.1.5",
"@rolldown/binding-darwin-arm64": "1.1.5",
"@rolldown/binding-darwin-x64": "1.1.5",
"@rolldown/binding-freebsd-x64": "1.1.5",
"@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
"@rolldown/binding-linux-arm64-gnu": "1.1.5",
"@rolldown/binding-linux-arm64-musl": "1.1.5",
"@rolldown/binding-linux-ppc64-gnu": "1.1.5",
"@rolldown/binding-linux-s390x-gnu": "1.1.5",
"@rolldown/binding-linux-x64-gnu": "1.1.5",
"@rolldown/binding-linux-x64-musl": "1.1.5",
"@rolldown/binding-openharmony-arm64": "1.1.5",
"@rolldown/binding-wasm32-wasi": "1.1.5",
"@rolldown/binding-win32-arm64-msvc": "1.1.5",
"@rolldown/binding-win32-x64-msvc": "1.1.5"
}
},
"node_modules/rxjs": {
@@ -2536,16 +2488,16 @@
"link": true
},
"node_modules/vite": {
"version": "8.1.3",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.1.3.tgz",
"integrity": "sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==",
"version": "8.1.4",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz",
"integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.4",
"picomatch": "^4.0.5",
"postcss": "^8.5.16",
"rolldown": "~1.1.3",
"rolldown": "~1.1.4",
"tinyglobby": "^0.2.17"
},
"bin": {
+1 -1
View File
@@ -49,7 +49,7 @@ return [
'reports' => 'Reports',
'search_result' => 'Search results for ":query"',
'withdrawal_list' => 'Expenses',
'all_list' => 'All transactions',
'all_list' => 'All transactions',
'Withdrawal_list' => 'Expenses',
'deposit_list' => 'Revenue, income and deposits',
'transfer_list' => 'Transfers',
+10 -10
View File
@@ -186,7 +186,7 @@ return [
'all_withdrawal' => 'All expenses',
'all_transactions' => 'All transactions',
'title_withdrawal_between' => 'All expenses between :start and :end',
'title_all_between' => 'All transactions between :start and :end',
'title_all_between' => 'All transactions between :start and :end',
'all_deposit' => 'All revenue',
'title_deposit_between' => 'All revenue between :start and :end',
'all_transfers' => 'All transfers',
@@ -249,7 +249,7 @@ return [
'webhooks' => 'Webhooks',
'webhooks_breadcrumb' => 'Webhooks',
'webhooks_menu_disabled' => 'disabled',
'cer_menu_disabled' => 'disabled',
'cer_menu_disabled' => 'disabled',
'no_webhook_messages' => 'There are no webhook messages',
'webhook_trigger_ANY' => 'After any event',
'webhook_trigger_STORE_TRANSACTION' => 'After transaction creation',
@@ -295,7 +295,7 @@ return [
'reset_webhook_secret' => 'Reset webhook secret',
'webhook_stored_link' => '<a href="webhooks/show/{ID}">Webhook #{ID} ("{title}")</a> has been stored.',
'webhook_updated_link' => '<a href="webhooks/show/{ID}">Webhook #{ID}</a> ("{title}") has been updated.',
'no_webhooks' => 'You have no webhooks. Please create one. Webhooks can be used to make external systems respond to Firefly III events, like newly created transactions or updated budgets.',
'no_webhooks' => 'You have no webhooks. Please create one. Webhooks can be used to make external systems respond to Firefly III events, like newly created transactions or updated budgets.',
// API access
'authorization_request' => 'Firefly III v:version Authorization Request',
@@ -1963,8 +1963,8 @@ return [
'extension_date_is' => 'Extension date is {date}',
// accounts:
'disabled_split_account_dest' => 'This field is disabled. You can only change the destination account from the first split, and it will be applied to all splits.',
'disabled_split_account_src' => 'This field is disabled. You can only change the source account from the first split, and it will be applied to all splits.',
'disabled_split_account_dest' => 'This field is disabled. You can only change the destination account from the first split, and it will be applied to all splits.',
'disabled_split_account_src' => 'This field is disabled. You can only change the source account from the first split, and it will be applied to all splits.',
'account_locked_currency' => 'The currency of this account must remain :name as long as piggy banks are linked to it.',
'i_am_owed_amount' => 'I am owed amount',
'i_owe_amount' => 'I owe amount',
@@ -2071,7 +2071,7 @@ return [
'reconcile_this_account' => 'Reconcile this account',
'reconcile' => 'Reconcile',
'show' => 'Show',
'hide' => 'Hide',
'hide' => 'Hide',
'confirm_reconciliation' => 'Confirm reconciliation',
'submitted_start_balance' => 'Submitted start balance',
'selected_transactions' => 'Selected transactions (:count)',
@@ -2148,7 +2148,7 @@ return [
'deleted_reconciliation' => 'Successfully deleted reconciliation transaction ":description"',
'stored_journal' => 'Successfully created new transaction ":description"',
'stored_journal_js' => 'Successfully created new transaction "{{description}}"',
'updated_journal_js' => 'Successfully updated transaction "{{description}}"',
'updated_journal_js' => 'Successfully updated transaction "{{description}}"',
'stored_journal_no_descr' => 'Successfully created your new transaction',
'updated_journal_no_descr' => 'Successfully updated your transaction',
'select_transactions' => 'Select transactions',
@@ -2801,9 +2801,9 @@ return [
'no_categories_intro_default' => 'You have no categories yet. Categories are used to fine tune your transactions and label them with their designated category.',
'no_categories_imperative_default' => 'Categories are created automatically when you create transactions, but you can create one manually too. Let\'s create one now:',
'no_categories_create_default' => 'Create a category',
'no_object-groups_title_default' => 'Object groups',
'no_object-groups_intro_default' => 'Some things in Firefly III can be divided into groups. Piggy banks for example, feature a "Group" field in the edit and create screens. When you set this field, you can edit the names and the order of the groups on this page.',
'no_object-groups_imperative_default' => 'For more information, check out the help-pages in the top right corner, under the (?)-icon. ',
'no_object-groups_title_default' => 'Object groups',
'no_object-groups_intro_default' => 'Some things in Firefly III can be divided into groups. Piggy banks for example, feature a "Group" field in the edit and create screens. When you set this field, you can edit the names and the order of the groups on this page.',
'no_object-groups_imperative_default' => 'For more information, check out the help-pages in the top right corner, under the (?)-icon. ',
'no_tags_title_default' => 'Let\'s create a tag!',
'no_tags_intro_default' => 'You have no tags yet. Tags are used to fine tune your transactions and label them with specific keywords.',
'no_tags_imperative_default' => 'Tags are created automatically when you create transactions, but you can create one manually too. Let\'s create one now:',
+3 -3
View File
@@ -136,7 +136,7 @@ return [
'mime' => 'Mime type',
'size' => 'Size',
'trigger' => 'Trigger',
'triggers' => 'Triggers',
'triggers' => 'Triggers',
'stop_processing' => 'Stop processing',
'end_date' => 'End date',
'enddate' => 'End date',
@@ -269,9 +269,9 @@ return [
'key' => 'Key',
'value' => 'Content of record',
'webhook_delivery' => 'Delivery',
'deliveries' => 'Deliveries',
'deliveries' => 'Deliveries',
'webhook_response' => 'Response',
'responses' => 'Responses',
'responses' => 'Responses',
'webhook_trigger' => 'Trigger',
'pushover_app_token' => 'Pushover app token',
'pushover_user_token' => 'Pushover user token',
+2 -2
View File
@@ -27,8 +27,8 @@ return [
'icon' => 'Icon',
'id' => 'ID',
'create_date' => 'Created at',
'responds_when' => 'Responds when',
'responds_with' => 'Responds with',
'responds_when' => 'Responds when',
'responds_with' => 'Responds with',
'primary_currency' => 'Primary currency',
'update_date' => 'Updated at',
'updated_at' => 'Updated at',