Merge pull request #10716 from firefly-iii/release-1754505595

🤖 Automatically merge the PR into the develop branch.
This commit is contained in:
github-actions[bot]
2025-08-06 20:40:02 +02:00
committed by GitHub
27 changed files with 474 additions and 462 deletions

View File

@@ -28,7 +28,6 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment;
use FireflyIII\Transformers\RecurrenceTransformer; use FireflyIII\Transformers\RecurrenceTransformer;
use FireflyIII\User; use FireflyIII\User;

View File

@@ -157,7 +157,8 @@ class DebugController extends Controller
return view('debug', compact('table', 'now', 'logContent')); return view('debug', compact('table', 'now', 'logContent'));
} }
public function apiTest() { public function apiTest()
{
return view('test.api-test'); return view('test.api-test');
} }

View File

@@ -144,7 +144,8 @@ class AccountEnrichment implements EnrichmentInterface
{ {
$set = AccountMeta::whereIn('name', ['is_multi_currency', 'include_net_worth', 'currency_id', 'account_role', 'account_number', 'BIC', 'liability_direction', 'interest', 'interest_period', 'current_debt']) $set = AccountMeta::whereIn('name', ['is_multi_currency', 'include_net_worth', 'currency_id', 'account_role', 'account_number', 'BIC', 'liability_direction', 'interest', 'interest_period', 'current_debt'])
->whereIn('account_id', $this->ids) ->whereIn('account_id', $this->ids)
->get(['account_meta.id', 'account_meta.account_id', 'account_meta.name', 'account_meta.data'])->toArray(); ->get(['account_meta.id', 'account_meta.account_id', 'account_meta.name', 'account_meta.data'])->toArray()
;
/** @var array $entry */ /** @var array $entry */
foreach ($set as $entry) { foreach ($set as $entry) {
@@ -172,7 +173,8 @@ class AccountEnrichment implements EnrichmentInterface
$notes = Note::query()->whereIn('noteable_id', $this->ids) $notes = Note::query()->whereIn('noteable_id', $this->ids)
->whereNotNull('notes.text') ->whereNotNull('notes.text')
->where('notes.text', '!=', '') ->where('notes.text', '!=', '')
->where('noteable_type', Account::class)->get(['notes.noteable_id', 'notes.text'])->toArray(); ->where('noteable_type', Account::class)->get(['notes.noteable_id', 'notes.text'])->toArray()
;
foreach ($notes as $note) { foreach ($notes as $note) {
$this->notes[(int)$note['noteable_id']] = (string)$note['text']; $this->notes[(int)$note['noteable_id']] = (string)$note['text'];
} }
@@ -182,7 +184,8 @@ class AccountEnrichment implements EnrichmentInterface
private function collectLocations(): void private function collectLocations(): void
{ {
$locations = Location::query()->whereIn('locatable_id', $this->ids) $locations = Location::query()->whereIn('locatable_id', $this->ids)
->where('locatable_type', Account::class)->get(['locations.locatable_id', 'locations.latitude', 'locations.longitude', 'locations.zoom_level'])->toArray(); ->where('locatable_type', Account::class)->get(['locations.locatable_id', 'locations.latitude', 'locations.longitude', 'locations.zoom_level'])->toArray()
;
foreach ($locations as $location) { foreach ($locations as $location) {
$this->locations[(int)$location['locatable_id']] $this->locations[(int)$location['locatable_id']]
= [ = [
@@ -204,7 +207,8 @@ class AccountEnrichment implements EnrichmentInterface
->setUserGroup($this->userGroup) ->setUserGroup($this->userGroup)
->setAccounts($this->collection) ->setAccounts($this->collection)
->withAccountInformation() ->withAccountInformation()
->setTypes([TransactionTypeEnum::OPENING_BALANCE->value]); ->setTypes([TransactionTypeEnum::OPENING_BALANCE->value])
;
$journals = $collector->getExtractedJournals(); $journals = $collector->getExtractedJournals();
foreach ($journals as $journal) { foreach ($journals as $journal) {
$this->openingBalances[(int)$journal['source_account_id']] $this->openingBalances[(int)$journal['source_account_id']]
@@ -279,7 +283,7 @@ class AccountEnrichment implements EnrichmentInterface
// get the current balance: // get the current balance:
$date = $this->getDate(); $date = $this->getDate();
//$finalBalance = Steam::finalAccountBalance($item, $date, $this->primaryCurrency, $this->convertToPrimary); // $finalBalance = Steam::finalAccountBalance($item, $date, $this->primaryCurrency, $this->convertToPrimary);
$finalBalance = $this->balances[$id]; $finalBalance = $this->balances[$id];
Log::debug(sprintf('Call finalAccountBalance(%s) with date/time "%s"', var_export($this->convertToPrimary, true), $date->toIso8601String()), $finalBalance); Log::debug(sprintf('Call finalAccountBalance(%s) with date/time "%s"', var_export($this->convertToPrimary, true), $date->toIso8601String()), $finalBalance);

View File

@@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace FireflyIII\Support\JsonApi\Enrichments; namespace FireflyIII\Support\JsonApi\Enrichments;
use Carbon\Carbon; use Carbon\Carbon;
@@ -52,7 +54,7 @@ class PiggyBankEnrichment implements EnrichmentInterface
return $this->collection; return $this->collection;
} }
public function enrichSingle(Model|array $model): array|Model public function enrichSingle(array|Model $model): array|Model
{ {
Log::debug(__METHOD__); Log::debug(__METHOD__);
$collection = new Collection([$model]); $collection = new Collection([$model]);
@@ -109,6 +111,7 @@ class PiggyBankEnrichment implements EnrichmentInterface
// get account currency preference for ALL. // get account currency preference for ALL.
$set = AccountMeta::whereIn('account_id', array_values($this->accountIds))->where('name', 'currency_id')->get(); $set = AccountMeta::whereIn('account_id', array_values($this->accountIds))->where('name', 'currency_id')->get();
/** @var AccountMeta $item */ /** @var AccountMeta $item */
foreach ($set as $item) { foreach ($set as $item) {
$accountId = (int)$item->account_id; $accountId = (int)$item->account_id;
@@ -121,6 +124,7 @@ class PiggyBankEnrichment implements EnrichmentInterface
// get account info. // get account info.
$set = Account::whereIn('id', array_values($this->accountIds))->get(); $set = Account::whereIn('id', array_values($this->accountIds))->get();
/** @var Account $item */ /** @var Account $item */
foreach ($set as $item) { foreach ($set as $item) {
$id = (int)$item->id; $id = (int)$item->id;
@@ -205,7 +209,8 @@ class PiggyBankEnrichment implements EnrichmentInterface
$notes = Note::query()->whereIn('noteable_id', $this->ids) $notes = Note::query()->whereIn('noteable_id', $this->ids)
->whereNotNull('notes.text') ->whereNotNull('notes.text')
->where('notes.text', '!=', '') ->where('notes.text', '!=', '')
->where('noteable_type', PiggyBank::class)->get(['notes.noteable_id', 'notes.text'])->toArray(); ->where('noteable_type', PiggyBank::class)->get(['notes.noteable_id', 'notes.text'])->toArray()
;
foreach ($notes as $note) { foreach ($notes as $note) {
$this->notes[(int)$note['noteable_id']] = (string)$note['text']; $this->notes[(int)$note['noteable_id']] = (string)$note['text'];
} }
@@ -217,7 +222,8 @@ class PiggyBankEnrichment implements EnrichmentInterface
$set = DB::table('object_groupables') $set = DB::table('object_groupables')
->whereIn('object_groupable_id', $this->ids) ->whereIn('object_groupable_id', $this->ids)
->where('object_groupable_type', PiggyBank::class) ->where('object_groupable_type', PiggyBank::class)
->get(['object_groupable_id', 'object_group_id']); ->get(['object_groupable_id', 'object_group_id'])
;
$ids = array_unique($set->pluck('object_group_id')->toArray()); $ids = array_unique($set->pluck('object_group_id')->toArray());
@@ -233,9 +239,7 @@ class PiggyBankEnrichment implements EnrichmentInterface
} }
} }
private function collectCurrentAmounts(): void private function collectCurrentAmounts(): void {}
{
}
/** /**
* Returns the suggested amount the user should save per month, or "". * Returns the suggested amount the user should save per month, or "".

View File

@@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace FireflyIII\Support\JsonApi\Enrichments; namespace FireflyIII\Support\JsonApi\Enrichments;
use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountMeta;
@@ -16,7 +18,6 @@ use Illuminate\Support\Facades\Log;
class PiggyBankEventEnrichment implements EnrichmentInterface class PiggyBankEventEnrichment implements EnrichmentInterface
{ {
private User $user; private User $user;
private UserGroup $userGroup; private UserGroup $userGroup;
private Collection $collection; private Collection $collection;
@@ -27,13 +28,13 @@ class PiggyBankEventEnrichment implements EnrichmentInterface
private array $piggybankIds = []; private array $piggybankIds = [];
private array $accountCurrencies = []; private array $accountCurrencies = [];
private array $currencies = []; private array $currencies = [];
//private bool $convertToPrimary = false; // private bool $convertToPrimary = false;
//private TransactionCurrency $primaryCurrency; // private TransactionCurrency $primaryCurrency;
public function __construct() public function __construct()
{ {
//$this->convertToPrimary = Amount::convertToPrimary(); // $this->convertToPrimary = Amount::convertToPrimary();
//$this->primaryCurrency = Amount::getPrimaryCurrency(); // $this->primaryCurrency = Amount::getPrimaryCurrency();
} }
public function enrich(Collection $collection): Collection public function enrich(Collection $collection): Collection
@@ -45,7 +46,7 @@ class PiggyBankEventEnrichment implements EnrichmentInterface
return $this->collection; return $this->collection;
} }
public function enrichSingle(Model|array $model): array|Model public function enrichSingle(array|Model $model): array|Model
{ {
Log::debug(__METHOD__); Log::debug(__METHOD__);
$collection = new Collection([$model]); $collection = new Collection([$model]);
@@ -76,6 +77,7 @@ class PiggyBankEventEnrichment implements EnrichmentInterface
$this->ids = array_unique($this->ids); $this->ids = array_unique($this->ids);
// collect groups with journal info. // collect groups with journal info.
$set = TransactionJournal::whereIn('id', $this->journalIds)->get(['id', 'transaction_group_id']); $set = TransactionJournal::whereIn('id', $this->journalIds)->get(['id', 'transaction_group_id']);
/** @var TransactionJournal $item */ /** @var TransactionJournal $item */
foreach ($set as $item) { foreach ($set as $item) {
$this->groupIds[(int)$item->id] = (int)$item->transaction_group_id; $this->groupIds[(int)$item->id] = (int)$item->transaction_group_id;
@@ -93,6 +95,7 @@ class PiggyBankEventEnrichment implements EnrichmentInterface
// get account currency preference for ALL. // get account currency preference for ALL.
// TODO This method does a find in a loop. // TODO This method does a find in a loop.
$set = AccountMeta::whereIn('account_id', array_values($this->accountIds))->where('name', 'currency_id')->get(); $set = AccountMeta::whereIn('account_id', array_values($this->accountIds))->where('name', 'currency_id')->get();
/** @var AccountMeta $item */ /** @var AccountMeta $item */
foreach ($set as $item) { foreach ($set as $item) {
$accountId = (int)$item->account_id; $accountId = (int)$item->account_id;

View File

@@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace FireflyIII\Support\JsonApi\Enrichments; namespace FireflyIII\Support\JsonApi\Enrichments;
use Carbon\Carbon; use Carbon\Carbon;
@@ -75,7 +77,7 @@ class RecurringEnrichment implements EnrichmentInterface
return $this->collection; return $this->collection;
} }
public function enrichSingle(Model|array $model): array|Model public function enrichSingle(array|Model $model): array|Model
{ {
Log::debug(__METHOD__); Log::debug(__METHOD__);
$collection = new Collection([$model]); $collection = new Collection([$model]);
@@ -121,6 +123,7 @@ class RecurringEnrichment implements EnrichmentInterface
$repository = app(RecurringRepositoryInterface::class); $repository = app(RecurringRepositoryInterface::class);
$repository->setUserGroup($this->userGroup); $repository->setUserGroup($this->userGroup);
$set = RecurrenceRepetition::whereIn('recurrence_id', $this->ids)->get(); $set = RecurrenceRepetition::whereIn('recurrence_id', $this->ids)->get();
/** @var RecurrenceRepetition $repetition */ /** @var RecurrenceRepetition $repetition */
foreach ($set as $repetition) { foreach ($set as $repetition) {
$recurrence = $this->collection->filter(function (Recurrence $item) use ($repetition) { $recurrence = $this->collection->filter(function (Recurrence $item) use ($repetition) {
@@ -134,6 +137,7 @@ class RecurringEnrichment implements EnrichmentInterface
// get the (future) occurrences for this specific type of repetition: // get the (future) occurrences for this specific type of repetition:
$amount = 'daily' === $repetition->repetition_type ? 9 : 5; $amount = 'daily' === $repetition->repetition_type ? 9 : 5;
$set = $repository->getXOccurrencesSince($repetition, $fromDate, now(config('app.timezone')), $amount); $set = $repository->getXOccurrencesSince($repetition, $fromDate, now(config('app.timezone')), $amount);
/** @var Carbon $carbon */ /** @var Carbon $carbon */
foreach ($set as $carbon) { foreach ($set as $carbon) {
$occurrences[] = $carbon->toAtomString(); $occurrences[] = $carbon->toAtomString();
@@ -157,6 +161,7 @@ class RecurringEnrichment implements EnrichmentInterface
private function collectTransactions(): void private function collectTransactions(): void
{ {
$set = RecurrenceTransaction::whereIn('recurrence_id', $this->ids)->get(); $set = RecurrenceTransaction::whereIn('recurrence_id', $this->ids)->get();
/** @var RecurrenceTransaction $transaction */ /** @var RecurrenceTransaction $transaction */
foreach ($set as $transaction) { foreach ($set as $transaction) {
$id = (int)$transaction->recurrence_id; $id = (int)$transaction->recurrence_id;
@@ -257,7 +262,7 @@ class RecurringEnrichment implements EnrichmentInterface
$repDate = clone $today; $repDate = clone $today;
} }
// $diffInYears = (int)$today->diffInYears($repDate, true); // $diffInYears = (int)$today->diffInYears($repDate, true);
//$repDate->addYears($diffInYears); // technically not necessary. // $repDate->addYears($diffInYears); // technically not necessary.
$string = $repDate->isoFormat((string)trans('config.month_and_day_no_year_js')); $string = $repDate->isoFormat((string)trans('config.month_and_day_no_year_js'));
return (string)trans('firefly.recurring_yearly', ['date' => $string], $this->language); return (string)trans('firefly.recurring_yearly', ['date' => $string], $this->language);
@@ -354,6 +359,7 @@ class RecurringEnrichment implements EnrichmentInterface
unset($transaction['transaction_currency_id']); unset($transaction['transaction_currency_id']);
$return[] = $transaction; $return[] = $transaction;
} }
return $return; return $return;
} }
@@ -361,6 +367,7 @@ class RecurringEnrichment implements EnrichmentInterface
{ {
$all = array_merge(array_unique($this->sourceAccountIds), array_unique($this->destinationAccountIds)); $all = array_merge(array_unique($this->sourceAccountIds), array_unique($this->destinationAccountIds));
$accounts = Account::with(['accountType'])->whereIn('id', array_unique($all))->get(); $accounts = Account::with(['accountType'])->whereIn('id', array_unique($all))->get();
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
$id = (int)$account->id; $id = (int)$account->id;
@@ -399,6 +406,7 @@ class RecurringEnrichment implements EnrichmentInterface
]; ];
} }
} }
break; break;
case 'tags': case 'tags':
@@ -417,6 +425,7 @@ class RecurringEnrichment implements EnrichmentInterface
]; ];
} }
} }
break; break;
case 'category_id': case 'category_id':
@@ -430,6 +439,7 @@ class RecurringEnrichment implements EnrichmentInterface
]; ];
} }
} }
break; break;
case 'category_name': case 'category_name':
@@ -443,6 +453,7 @@ class RecurringEnrichment implements EnrichmentInterface
]; ];
} }
} }
break; break;
case 'budget_id': case 'budget_id':
@@ -456,6 +467,7 @@ class RecurringEnrichment implements EnrichmentInterface
]; ];
} }
} }
break; break;
} }
} }
@@ -564,7 +576,8 @@ class RecurringEnrichment implements EnrichmentInterface
$notes = Note::query()->whereIn('noteable_id', $this->ids) $notes = Note::query()->whereIn('noteable_id', $this->ids)
->whereNotNull('notes.text') ->whereNotNull('notes.text')
->where('notes.text', '!=', '') ->where('notes.text', '!=', '')
->where('noteable_type', Recurrence::class)->get(['notes.noteable_id', 'notes.text'])->toArray(); ->where('noteable_type', Recurrence::class)->get(['notes.noteable_id', 'notes.text'])->toArray()
;
foreach ($notes as $note) { foreach ($notes as $note) {
$this->notes[(int)$note['noteable_id']] = (string)$note['text']; $this->notes[(int)$note['noteable_id']] = (string)$note['text'];
} }

View File

@@ -80,7 +80,7 @@ trait CalculateXOccurrencesSince
while ($total < $count) { while ($total < $count) {
$domCorrected = min($dayOfMonth, $mutator->daysInMonth); $domCorrected = min($dayOfMonth, $mutator->daysInMonth);
$mutator->day = $domCorrected; $mutator->day = $domCorrected;
$mutator->setTime(0,0,0); $mutator->setTime(0, 0, 0);
if (0 === $attempts % $skipMod && $mutator->gte($afterDate)) { if (0 === $attempts % $skipMod && $mutator->gte($afterDate)) {
Log::debug(sprintf('Mutator is now %s and is added to the list.', $mutator->toAtomString())); Log::debug(sprintf('Mutator is now %s and is added to the list.', $mutator->toAtomString()));
$return[] = clone $mutator; $return[] = clone $mutator;

View File

@@ -37,6 +37,7 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use ValueError; use ValueError;
use function Safe\parse_url; use function Safe\parse_url;
use function Safe\preg_replace; use function Safe\preg_replace;
@@ -64,10 +65,10 @@ class Steam
// Log::debug(sprintf('Trying bcround("%s",%d)', $number, $precision)); // Log::debug(sprintf('Trying bcround("%s",%d)', $number, $precision));
if (str_contains($number, '.')) { if (str_contains($number, '.')) {
if ('-' !== $number[0]) { if ('-' !== $number[0]) {
return bcadd($number, '0.' . str_repeat('0', $precision) . '5', $precision); return bcadd($number, '0.'.str_repeat('0', $precision).'5', $precision);
} }
return bcsub($number, '0.' . str_repeat('0', $precision) . '5', $precision); return bcsub($number, '0.'.str_repeat('0', $precision).'5', $precision);
} }
return $number; return $number;
@@ -264,7 +265,8 @@ class Steam
'transactions.transaction_currency_id', 'transactions.transaction_currency_id',
DB::raw('SUM(transactions.amount) AS sum_of_day'), DB::raw('SUM(transactions.amount) AS sum_of_day'),
] ]
); )
;
$currentBalance = $startBalance; $currentBalance = $startBalance;
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();
@@ -320,8 +322,8 @@ class Steam
public function finalAccountsBalanceOptimized(Collection $accounts, Carbon $date, ?TransactionCurrency $primary = null, ?bool $convertToPrimary = null): array public function finalAccountsBalanceOptimized(Collection $accounts, Carbon $date, ?TransactionCurrency $primary = null, ?bool $convertToPrimary = null): array
{ {
$result = []; $result = [];
$convertToPrimary = $convertToPrimary ?? Amount::convertToPrimary(); $convertToPrimary ??= Amount::convertToPrimary();
$primary = $primary ?? Amount::getPrimaryCurrency(); $primary ??= Amount::getPrimaryCurrency();
$currencies = $this->getCurrencies($accounts); $currencies = $this->getCurrencies($accounts);
// balance(s) in all currencies for ALL accounts. // balance(s) in all currencies for ALL accounts.
@@ -329,7 +331,8 @@ class Steam
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id') ->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'))
->get(['transactions.account_id', 'transaction_currencies.code', 'transactions.amount'])->toArray(); ->get(['transactions.account_id', 'transaction_currencies.code', 'transactions.amount'])->toArray()
;
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
@@ -378,6 +381,7 @@ class Steam
$result[$account->id] = $final; $result[$account->id] = $final;
// Log::debug('Final balance is', $final); // Log::debug('Final balance is', $final);
} }
return $result; return $result;
} }
@@ -403,7 +407,7 @@ class Steam
if ($cache->has()) { if ($cache->has()) {
Log::debug(sprintf('CACHED finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); Log::debug(sprintf('CACHED finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s')));
//return $cache->get(); // return $cache->get();
} }
// Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); // Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s')));
if (null === $convertToPrimary) { if (null === $convertToPrimary) {
@@ -432,7 +436,8 @@ class Steam
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id') ->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'))
->get(['transaction_currencies.code', 'transactions.amount'])->toArray(); ->get(['transaction_currencies.code', 'transactions.amount'])->toArray()
;
$others = $this->groupAndSumTransactions($array, 'code', 'amount'); $others = $this->groupAndSumTransactions($array, 'code', 'amount');
// Log::debug('All balances are (joined)', $others); // Log::debug('All balances are (joined)', $others);
// if there is no request to convert, take this as "balance" and "pc_balance". // if there is no request to convert, take this as "balance" and "pc_balance".
@@ -761,6 +766,7 @@ class Steam
$ids = $accounts->pluck('id')->toArray(); $ids = $accounts->pluck('id')->toArray();
$result = AccountMeta::whereIn('account_id', $ids)->where('name', 'currency_id')->get(); $result = AccountMeta::whereIn('account_id', $ids)->where('name', 'currency_id')->get();
/** @var AccountMeta $item */ /** @var AccountMeta $item */
foreach ($result as $item) { foreach ($result as $item) {
$accountPreferences[(int)$item->account_id] = (int)$item->data; $accountPreferences[(int)$item->account_id] = (int)$item->data;
@@ -787,6 +793,7 @@ class Steam
$accountCurrencies[$account->id] = $currencies[$accountPreferences[$account->id]]; $accountCurrencies[$account->id] = $currencies[$accountPreferences[$account->id]];
} }
} }
return $accountCurrencies; return $accountCurrencies;
} }
} }

View File

@@ -73,7 +73,7 @@ class CategoryTransformer extends AbstractTransformer
'links' => [ 'links' => [
[ [
'rel' => 'self', 'rel' => 'self',
'uri' => '/categories/' . $category->id, 'uri' => '/categories/'.$category->id,
], ],
], ],
]; ];

View File

@@ -25,13 +25,9 @@ declare(strict_types=1);
namespace FireflyIII\Transformers; namespace FireflyIII\Transformers;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ObjectGroup;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class PiggyBankTransformer * Class PiggyBankTransformer

View File

@@ -24,34 +24,19 @@ declare(strict_types=1);
namespace FireflyIII\Transformers; namespace FireflyIII\Transformers;
use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Factory\CategoryFactory;
use FireflyIII\Models\Account;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Models\RecurrenceRepetition;
use FireflyIII\Models\RecurrenceTransaction;
use FireflyIII\Models\RecurrenceTransactionMeta;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Support\Facades\Steam;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use function Safe\json_decode;
/** /**
* Class RecurringTransactionTransformer * Class RecurringTransactionTransformer
*/ */
class RecurrenceTransformer extends AbstractTransformer class RecurrenceTransformer extends AbstractTransformer
{ {
/** /**
* RecurrenceTransformer constructor. * RecurrenceTransformer constructor.
*/ */
public function __construct() public function __construct() {}
{
}
/** /**
* Transform the recurring transaction. * Transform the recurring transaction.
@@ -86,7 +71,7 @@ class RecurrenceTransformer extends AbstractTransformer
'links' => [ 'links' => [
[ [
'rel' => 'self', 'rel' => 'self',
'uri' => '/recurring/' . $recurrence->id, 'uri' => '/recurring/'.$recurrence->id,
], ],
], ],
]; ];

12
composer.lock generated
View File

@@ -5101,16 +5101,16 @@
}, },
{ {
"name": "predis/predis", "name": "predis/predis",
"version": "v3.1.0", "version": "v3.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/predis/predis.git", "url": "https://github.com/predis/predis.git",
"reference": "202e0c5322b906ec4c761c0cefebad6d0959a699" "reference": "9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/predis/predis/zipball/202e0c5322b906ec4c761c0cefebad6d0959a699", "url": "https://api.github.com/repos/predis/predis/zipball/9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8",
"reference": "202e0c5322b906ec4c761c0cefebad6d0959a699", "reference": "9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5152,7 +5152,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/predis/predis/issues", "issues": "https://github.com/predis/predis/issues",
"source": "https://github.com/predis/predis/tree/v3.1.0" "source": "https://github.com/predis/predis/tree/v3.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -5160,7 +5160,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-07-22T15:37:44+00:00" "time": "2025-08-06T06:41:24+00:00"
}, },
{ {
"name": "psr/cache", "name": "psr/cache",

View File

@@ -78,8 +78,8 @@ return [
'running_balance_column' => env('USE_RUNNING_BALANCE', false), 'running_balance_column' => env('USE_RUNNING_BALANCE', false),
// see cer.php for exchange rates feature flag. // see cer.php for exchange rates feature flag.
], ],
'version' => 'develop/2025-08-05', 'version' => 'develop/2025-08-06',
'build_time' => 1754394714, 'build_time' => 1754505490,
'api_version' => '2.1.0', // field is no longer used. 'api_version' => '2.1.0', // field is no longer used.
'db_version' => 26, 'db_version' => 26,

24
package-lock.json generated
View File

@@ -5700,9 +5700,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.195", "version": "1.5.197",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.195.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.197.tgz",
"integrity": "sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==", "integrity": "sha512-m1xWB3g7vJ6asIFz+2pBUbq3uGmfmln1M9SSvBe4QIFWYrRHylP73zL/3nMjDmwz8V+1xAXQDfBd6+HPW0WvDQ==",
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
@@ -5757,9 +5757,9 @@
} }
}, },
"node_modules/enhanced-resolve": { "node_modules/enhanced-resolve": {
"version": "5.18.2", "version": "5.18.3",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
"integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -10214,9 +10214,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/sass": { "node_modules/sass": {
"version": "1.89.2", "version": "1.90.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz",
"integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -12459,9 +12459,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/yaml": { "node_modules/yaml": {
"version": "2.8.0", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
"integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
"dev": true, "dev": true,
"license": "ISC", "license": "ISC",
"bin": { "bin": {

View File

@@ -1,154 +1,154 @@
{ {
"firefly": { "firefly": {
"administrations_page_title": "Financial administrations", "administrations_page_title": "\u0627\u0644\u0625\u062f\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0627\u0644\u064a\u0629",
"administrations_index_menu": "Financial administrations", "administrations_index_menu": "\u0627\u0644\u0625\u062f\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0627\u0644\u064a\u0629",
"expires_at": "Expires at", "expires_at": "\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621",
"temp_administrations_introduction": "Firefly III will soon get the ability to manage multiple financial administrations. Right now, you only have the one. You can set the title of this administration and its primary currency. This replaces the previous setting where you would set your \"default currency\". This setting is now tied to the financial administration and can be different per administration.", "temp_administrations_introduction": "\u0633\u064a\u062d\u0635\u0644 Firefly III \u0642\u0631\u064a\u0628\u0627\u064b \u0639\u0644\u0649 \u0625\u0645\u0643\u0627\u0646\u064a\u0629 \u0625\u062f\u0627\u0631\u0629 \u0639\u062f\u0629 \u0625\u062f\u0627\u0631\u0627\u062a \u0645\u0627\u0644\u064a\u0629. \u062d\u0627\u0644\u064a\u0627\u064b \u0644\u062f\u064a\u0643 \u0648\u0627\u062d\u062f\u0629 \u0641\u0642\u0637. \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u064a\u064a\u0646 \u0639\u0646\u0648\u0627\u0646 \u0647\u0630\u0647 \u0627\u0644\u0625\u062f\u0627\u0631\u0629 \u0648\u0639\u0645\u0644\u062a\u0647\u0627 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629. \u0647\u0630\u0627 \u064a\u0633\u062a\u0628\u062f\u0644 \u0627\u0644\u0625\u0639\u062f\u0627\u062f \u0627\u0644\u0633\u0627\u0628\u0642 \u062d\u064a\u062b \u0643\u0646\u062a \u062a\u0639\u064a\u0646 \"\u0627\u0644\u0639\u0645\u0644\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629\". \u0647\u0630\u0627 \u0627\u0644\u0625\u0639\u062f\u0627\u062f \u0623\u0635\u0628\u062d \u0627\u0644\u0622\u0646 \u0645\u0631\u062a\u0628\u0637\u0627\u064b \u0628\u0627\u0644\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0627\u0644\u064a\u0629 \u0648\u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u062e\u062a\u0644\u0641 \u0644\u0643\u0644 \u0625\u062f\u0627\u0631\u0629.",
"administration_currency_form_help": "It may take a long time for the page to load if you change the primary currency because transaction may need to be converted to your (new) primary currency.", "administration_currency_form_help": "\u0642\u062f \u064a\u0633\u062a\u063a\u0631\u0642 \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0635\u0641\u062d\u0629 \u0648\u0642\u062a\u0627\u064b \u0637\u0648\u064a\u0644\u0627\u064b \u0625\u0630\u0627 \u0642\u0645\u062a \u0628\u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u0639\u0645\u0644\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 \u0644\u0623\u0646 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0642\u062f \u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u0627\u0644\u062a\u062d\u0648\u064a\u0644 \u0625\u0644\u0649 \u0639\u0645\u0644\u062a\u0643 (\u0627\u0644\u062c\u062f\u064a\u062f\u0629) \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629.",
"administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", "administrations_page_edit_sub_title_js": "\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0627\u0644\u064a\u0629 \"{title}\"",
"table": "Table", "table": "\u062c\u062f\u0648\u0644",
"welcome_back": "What's playing?", "welcome_back": "\u0623\u0647\u0644\u0627\u064b \u0648\u0633\u0647\u0644\u0627\u064b!",
"flash_error": "Error!", "flash_error": "\u062e\u0637\u0623!",
"flash_warning": "Warning!", "flash_warning": "\u062a\u062d\u0630\u064a\u0631!",
"flash_success": "Success!", "flash_success": "\u0646\u062c\u062d!",
"close": "Close", "close": "\u0625\u063a\u0644\u0627\u0642",
"select_dest_account": "Please select or type a valid destination account name", "select_dest_account": "\u064a\u0631\u062c\u0649 \u0627\u062e\u062a\u064a\u0627\u0631 \u0623\u0648 \u0643\u062a\u0627\u0628\u0629 \u0627\u0633\u0645 \u062d\u0633\u0627\u0628 \u0648\u062c\u0647\u0629 \u0635\u0627\u0644\u062d",
"select_source_account": "Please select or type a valid source account name", "select_source_account": "\u064a\u0631\u062c\u0649 \u0627\u062e\u062a\u064a\u0627\u0631 \u0623\u0648 \u0643\u062a\u0627\u0628\u0629 \u0627\u0633\u0645 \u062d\u0633\u0627\u0628 \u0645\u0635\u062f\u0631 \u0635\u0627\u0644\u062d",
"split_transaction_title": "Description of the split transaction", "split_transaction_title": "\u0648\u0635\u0641 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u0627\u0644\u0645\u0646\u0642\u0633\u0645\u0629",
"errors_submission": "There was something wrong with your submission. Please check out the errors below.", "errors_submission": "\u0643\u0627\u0646 \u0647\u0646\u0627\u0643 \u062e\u0637\u0623 \u0645\u0627 \u0641\u064a \u062a\u0642\u062f\u064a\u0645\u0643. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 \u0623\u062f\u0646\u0627\u0647.",
"is_reconciled": "Is reconciled", "is_reconciled": "\u062a\u0645\u062a \u0627\u0644\u062a\u0633\u0648\u064a\u0629",
"split": "Split", "split": "\u062a\u0642\u0633\u064a\u0645",
"single_split": "Split", "single_split": "\u062a\u0642\u0633\u064a\u0645",
"not_enough_currencies": "Not enough currencies", "not_enough_currencies": "\u0639\u062f\u062f \u0627\u0644\u0639\u0645\u0644\u0627\u062a \u063a\u064a\u0631 \u0643\u0627\u0641\u064d",
"not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.", "not_enough_currencies_enabled": "\u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062f\u064a\u0643 \u0639\u0645\u0644\u0629 \u0648\u0627\u062d\u062f\u0629 \u0641\u0642\u0637 \u0645\u0641\u0639\u0644\u0629\u060c \u0641\u0644\u0627 \u062f\u0627\u0639\u064a \u0644\u0625\u0636\u0627\u0641\u0629 \u0623\u0633\u0639\u0627\u0631 \u0635\u0631\u0641.",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.", "transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 #{ID} (\"{title}\")<\/a> \u062a\u0645 \u062d\u0641\u0638\u0647\u0627.",
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.", "webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\u0648\u064a\u0628 \u0647\u0648\u0643 #{ID} (\"{title}\")<\/a> \u062a\u0645 \u062d\u0641\u0638\u0647.",
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.", "webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u0648\u064a\u0628 \u0647\u0648\u0643 #{ID}<\/a> (\"{title}\") \u062a\u0645 \u062a\u062d\u062f\u064a\u062b\u0647.",
"transaction_updated_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID}<\/a> (\"{title}\") has been updated.", "transaction_updated_link": "<a href=\"transactions\/show\/{ID}\">\u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 #{ID}<\/a> (\"{title}\") \u062a\u0645 \u062a\u062d\u062f\u064a\u062b\u0647\u0627.",
"transaction_new_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID}<\/a> has been stored.", "transaction_new_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 #{ID}<\/a> \u062a\u0645 \u062d\u0641\u0638\u0647\u0627.",
"transaction_journal_information": "Transaction information", "transaction_journal_information": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
"submission_options": "Submission options", "submission_options": "\u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u0625\u0631\u0633\u0627\u0644",
"apply_rules_checkbox": "Apply rules", "apply_rules_checkbox": "\u062a\u0637\u0628\u064a\u0642 \u0627\u0644\u0642\u0648\u0627\u0639\u062f",
"fire_webhooks_checkbox": "Fire webhooks", "fire_webhooks_checkbox": "\u062a\u0634\u063a\u064a\u0644 Webhooks",
"no_budget_pointer": "You seem to have no budgets yet. You should create some on the <a href=\"budgets\">budgets<\/a>-page. Budgets can help you keep track of expenses.", "no_budget_pointer": "\u064a\u0628\u062f\u0648 \u0623\u0646\u0647 \u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0645\u064a\u0632\u0627\u0646\u064a\u0627\u062a \u0628\u0639\u062f. \u064a\u062c\u0628 \u0623\u0646 \u062a\u0646\u0634\u0626 \u0628\u0639\u0636\u0647\u0627 \u0641\u064a <a href=\"budgets\">\u0635\u0641\u062d\u0629 \u0627\u0644\u0645\u064a\u0632\u0627\u0646\u064a\u0627\u062a<\/a>. \u0627\u0644\u0645\u064a\u0632\u0627\u0646\u064a\u0627\u062a \u064a\u0645\u0643\u0646 \u0623\u0646 \u062a\u0633\u0627\u0639\u062f\u0643 \u0641\u064a \u062a\u062a\u0628\u0639 \u0627\u0644\u0646\u0641\u0642\u0627\u062a.",
"no_bill_pointer": "You seem to have no subscription yet. You should create some on the <a href=\"subscriptions\">subscription<\/a>-page. Subscriptions can help you keep track of expenses.", "no_bill_pointer": "\u064a\u0628\u062f\u0648 \u0623\u0646\u0647 \u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0627\u0634\u062a\u0631\u0627\u0643\u0627\u062a \u0628\u0639\u062f. \u064a\u062c\u0628 \u0623\u0646 \u062a\u0646\u0634\u0626 \u0628\u0639\u0636\u0647\u0627 \u0641\u064a <a href=\"subscriptions\">\u0635\u0641\u062d\u0629 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643\u0627\u062a<\/a>. \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643\u0627\u062a \u064a\u0645\u0643\u0646 \u0623\u0646 \u062a\u0633\u0627\u0639\u062f\u0643 \u0641\u064a \u062a\u062a\u0628\u0639 \u0627\u0644\u0646\u0641\u0642\u0627\u062a.",
"source_account": "Source account", "source_account": "\u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0635\u062f\u0631",
"hidden_fields_preferences": "You can enable more transaction options in your <a href=\"preferences\">preferences<\/a>.", "hidden_fields_preferences": "\u064a\u0645\u0643\u0646\u0643 \u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0641\u064a <a href=\"preferences\">\u0627\u0644\u062a\u0641\u0636\u064a\u0644\u0627\u062a<\/a> \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643.",
"destination_account": "Destination account", "destination_account": "\u062d\u0633\u0627\u0628 \u0627\u0644\u0648\u062c\u0647\u0629",
"add_another_split": "Add another split", "add_another_split": "\u0625\u0636\u0627\u0641\u0629 \u062a\u0642\u0633\u064a\u0645 \u0622\u062e\u0631",
"submission": "Submission", "submission": "\u0625\u0631\u0633\u0627\u0644",
"stored_journal": "Successfully created new transaction \":description\"", "stored_journal": "\u062a\u0645 \u0625\u0646\u0634\u0627\u0621 \u0645\u0639\u0627\u0645\u0644\u0629 \u062c\u062f\u064a\u062f\u0629 \":description\"",
"create_another": "After storing, return here to create another one.", "create_another": "\u0628\u0639\u062f \u0627\u0644\u062a\u062e\u0632\u064a\u0646\u060c \u0639\u062f \u0625\u0644\u0649 \u0647\u0646\u0627 \u0644\u0625\u0646\u0634\u0627\u0621 \u0648\u0627\u062d\u062f\u0629 \u0623\u062e\u0631\u0649.",
"reset_after": "Reset form after submission", "reset_after": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0628\u0639\u062f \u0627\u0644\u0625\u0631\u0633\u0627\u0644",
"submit": "Submit", "submit": "\u0625\u0631\u0633\u0627\u0644",
"amount": "Amount", "amount": "\u0627\u0644\u0645\u0628\u0644\u063a",
"date": "Date", "date": "\u0627\u0644\u062a\u0627\u0631\u064a\u062e",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s) unless you remove the reconciliation flag.", "is_reconciled_fields_dropped": "\u0644\u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u062a\u0645\u062a \u062a\u0633\u0648\u064a\u062a\u0647\u0627\u060c \u0644\u0646 \u062a\u062a\u0645\u0643\u0646 \u0645\u0646 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a \u0623\u0648 \u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0625\u0644\u0627 \u0625\u0630\u0627 \u0623\u0632\u0644\u062a \u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062a\u0633\u0648\u064a\u0629.",
"tags": "Tags", "tags": "\u0627\u0644\u0648\u0633\u0648\u0645",
"no_budget": "(no budget)", "no_budget": "(\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u064a\u0632\u0627\u0646\u064a\u0629)",
"no_bill": "(no subscription)", "no_bill": "(\u0644\u0627 \u062a\u0648\u062c\u062f \u0627\u0634\u062a\u0631\u0627\u0643)",
"category": "Category", "category": "\u0641\u0626\u0629",
"attachments": "Attachments", "attachments": "\u0627\u0644\u0645\u0631\u0641\u0642\u0627\u062a",
"notes": "Notes", "notes": "\u0645\u0644\u0627\u062d\u0638\u0627\u062a",
"external_url": "External URL", "external_url": "\u0631\u0627\u0628\u0637 \u062e\u0627\u0631\u062c\u064a",
"update_transaction": "Update transaction", "update_transaction": "\u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
"after_update_create_another": "After updating, return here to continue editing.", "after_update_create_another": "\u0628\u0639\u062f \u0627\u0644\u062a\u062d\u062f\u064a\u062b\u060c \u0639\u062f \u0625\u0644\u0649 \u0647\u0646\u0627 \u0644\u0645\u062a\u0627\u0628\u0639\u0629 \u0627\u0644\u062a\u062d\u0631\u064a\u0631.",
"store_as_new": "Store as a new transaction instead of updating.", "store_as_new": "\u062a\u062e\u0632\u064a\u0646 \u0643\u0645\u0639\u0627\u0645\u0644\u0629 \u062c\u062f\u064a\u062f\u0629 \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u0627\u0644\u062a\u062d\u062f\u064a\u062b.",
"split_title_help": "If you create a split transaction, there must be a global description for all splits of the transaction.", "split_title_help": "\u0625\u0630\u0627 \u0642\u0645\u062a \u0628\u0625\u0646\u0634\u0627\u0621 \u0645\u0639\u0627\u0645\u0644\u0629 \u0645\u0646\u0642\u0633\u0645\u0629\u060c \u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0647\u0646\u0627\u0643 \u0648\u0635\u0641 \u0639\u0627\u0644\u0645\u064a \u0644\u062c\u0645\u064a\u0639 \u0627\u0646\u0642\u0633\u0627\u0645\u0627\u062a \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629.",
"none_in_select_list": "(none)", "none_in_select_list": "(\u0644\u0627 \u064a\u0648\u062c\u062f)",
"no_piggy_bank": "(no piggy bank)", "no_piggy_bank": "(\u0644\u0627 \u062a\u0648\u062c\u062f \u062d\u0635\u0627\u0644\u0629)",
"description": "Description", "description": "\u0627\u0644\u0648\u0635\u0641",
"split_transaction_title_help": "If you create a split transaction, there must be a global description for all splits of the transaction.", "split_transaction_title_help": "\u0625\u0630\u0627 \u0642\u0645\u062a \u0628\u0625\u0646\u0634\u0627\u0621 \u0645\u0639\u0627\u0645\u0644\u0629 \u0645\u0646\u0642\u0633\u0645\u0629\u060c \u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0647\u0646\u0627\u0643 \u0648\u0635\u0641 \u0639\u0627\u0644\u0645\u064a \u0644\u062c\u0645\u064a\u0639 \u0627\u0646\u0642\u0633\u0627\u0645\u0627\u062a \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629.",
"destination_account_reconciliation": "You can't edit the destination account of a reconciliation transaction.", "destination_account_reconciliation": "\u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u062f\u064a\u0644 \u062d\u0633\u0627\u0628 \u0627\u0644\u0648\u062c\u0647\u0629 \u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u0627\u0644\u062a\u0633\u0648\u064a\u0629.",
"source_account_reconciliation": "You can't edit the source account of a reconciliation transaction.", "source_account_reconciliation": "\u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u062f\u064a\u0644 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0635\u062f\u0631 \u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u0627\u0644\u062a\u0633\u0648\u064a\u0629.",
"budget": "Budget", "budget": "\u0645\u064a\u0632\u0627\u0646\u064a\u0629",
"bill": "Subscription", "bill": "\u0627\u0634\u062a\u0631\u0627\u0643",
"you_create_withdrawal": "You're creating a withdrawal.", "you_create_withdrawal": "\u0623\u0646\u062a \u062a\u0642\u0648\u0645 \u0628\u0625\u0646\u0634\u0627\u0621 \u0633\u062d\u0628.",
"you_create_transfer": "You're creating a transfer.", "you_create_transfer": "\u0623\u0646\u062a \u062a\u0642\u0648\u0645 \u0628\u0625\u0646\u0634\u0627\u0621 \u062a\u062d\u0648\u064a\u0644.",
"you_create_deposit": "You're creating a deposit.", "you_create_deposit": "\u0623\u0646\u062a \u062a\u0642\u0648\u0645 \u0628\u0625\u0646\u0634\u0627\u0621 \u0625\u064a\u062f\u0627\u0639.",
"edit": "Edit", "edit": "\u062a\u0639\u062f\u064a\u0644",
"delete": "Delete", "delete": "\u062d\u0630\u0641",
"name": "Name", "name": "\u0627\u0644\u0627\u0633\u0645",
"profile_whoops": "Whoops!", "profile_whoops": "\u0639\u0630\u0631\u0627\u064b!",
"profile_something_wrong": "Something went wrong!", "profile_something_wrong": "\u062d\u062f\u062b \u062e\u0637\u0623 \u0645\u0627!",
"profile_try_again": "Something went wrong. Please try again.", "profile_try_again": "\u062d\u062f\u062b \u062e\u0637\u0623 \u0645\u0627. \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649.",
"profile_oauth_clients": "OAuth Clients", "profile_oauth_clients": "\u0639\u0645\u0644\u0627\u0621 OAuth",
"profile_oauth_no_clients": "You have not created any OAuth clients.", "profile_oauth_no_clients": "\u0644\u0645 \u062a\u0642\u0645 \u0628\u0625\u0646\u0634\u0627\u0621 \u0623\u064a \u0639\u0645\u0644\u0627\u0621 OAuth.",
"profile_oauth_clients_header": "Clients", "profile_oauth_clients_header": "\u0627\u0644\u0639\u0645\u0644\u0627\u0621",
"profile_oauth_client_id": "Client ID", "profile_oauth_client_id": "\u0645\u0639\u0631\u0651\u0641 \u0627\u0644\u0639\u0645\u064a\u0644",
"profile_oauth_client_name": "Name", "profile_oauth_client_name": "\u0627\u0644\u0627\u0633\u0645",
"profile_oauth_client_secret": "Secret", "profile_oauth_client_secret": "\u0627\u0644\u0633\u0631",
"profile_oauth_create_new_client": "Create New Client", "profile_oauth_create_new_client": "\u0625\u0646\u0634\u0627\u0621 \u0639\u0645\u064a\u0644 \u062c\u062f\u064a\u062f",
"profile_oauth_create_client": "Create Client", "profile_oauth_create_client": "\u0625\u0646\u0634\u0627\u0621 \u0639\u0645\u064a\u0644",
"profile_oauth_edit_client": "Edit Client", "profile_oauth_edit_client": "\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0639\u0645\u064a\u0644",
"profile_oauth_name_help": "Something your users will recognize and trust.", "profile_oauth_name_help": "\u0634\u064a\u0621 \u0633\u064a\u062a\u0639\u0631\u0641 \u0639\u0644\u064a\u0647 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u0648\u0646 \u0648\u064a\u062b\u0642\u0648\u0646 \u0628\u0647.",
"profile_oauth_redirect_url": "Redirect URL", "profile_oauth_redirect_url": "\u0631\u0627\u0628\u0637 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647",
"profile_oauth_clients_external_auth": "If you're using an external authentication provider like Authelia, OAuth Clients will not work. You can use Personal Access Tokens only.", "profile_oauth_clients_external_auth": "\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 \u0645\u0648\u0641\u0631 \u0645\u0635\u0627\u062f\u0642\u0629 \u062e\u0627\u0631\u062c\u064a \u0645\u062b\u0644 Authelia\u060c \u0641\u0644\u0646 \u062a\u0639\u0645\u0644 \u0639\u0645\u0644\u0627\u0621 OAuth. \u064a\u0645\u0643\u0646\u0643 \u0641\u0642\u0637 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0631\u0645\u0648\u0632 \u0627\u0644\u0648\u0635\u0648\u0644 \u0627\u0644\u0634\u062e\u0635\u064a\u0629.",
"profile_oauth_redirect_url_help": "Your application's authorization callback URL.", "profile_oauth_redirect_url_help": "\u0631\u0627\u0628\u0637 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 \u0644\u062a\u0637\u0628\u064a\u0642\u0643.",
"profile_authorized_apps": "Authorized applications", "profile_authorized_apps": "\u0627\u0644\u062a\u0637\u0628\u064a\u0642\u0627\u062a \u0627\u0644\u0645\u0635\u0631\u062d \u0628\u0647\u0627",
"profile_authorized_clients": "Authorized clients", "profile_authorized_clients": "\u0627\u0644\u0639\u0645\u0644\u0627\u0621 \u0627\u0644\u0645\u0635\u0631\u062d \u0644\u0647\u0645",
"profile_scopes": "Scopes", "profile_scopes": "\u0627\u0644\u0646\u0637\u0627\u0642\u0627\u062a",
"profile_revoke": "Revoke", "profile_revoke": "\u0625\u0644\u063a\u0627\u0621",
"profile_personal_access_tokens": "Personal Access Tokens", "profile_personal_access_tokens": "\u0631\u0645\u0648\u0632 \u0627\u0644\u0648\u0635\u0648\u0644 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
"profile_personal_access_token": "Personal Access Token", "profile_personal_access_token": "\u0631\u0645\u0632 \u0627\u0644\u0648\u0635\u0648\u0644 \u0627\u0644\u0634\u062e\u0635\u064a",
"profile_personal_access_token_explanation": "Here is your new personal access token. This is the only time it will be shown so don't lose it! You may now use this token to make API requests.", "profile_personal_access_token_explanation": "\u0647\u0630\u0627 \u0647\u0648 \u0631\u0645\u0632 \u0627\u0644\u0648\u0635\u0648\u0644 \u0627\u0644\u0634\u062e\u0635\u064a \u0627\u0644\u062c\u062f\u064a\u062f \u0627\u0644\u062e\u0627\u0635 \u0628\u0643. \u0647\u0630\u0647 \u0647\u064a \u0627\u0644\u0645\u0631\u0629 \u0627\u0644\u0648\u062d\u064a\u062f\u0629 \u0627\u0644\u062a\u064a \u0633\u064a\u0638\u0647\u0631 \u0641\u064a\u0647\u0627 \u0641\u0644\u0627 \u062a\u0641\u0642\u062f\u0647! \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0622\u0646 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0647\u0630\u0627 \u0627\u0644\u0631\u0645\u0632 \u0644\u0625\u062c\u0631\u0627\u0621 \u0637\u0644\u0628\u0627\u062a API.",
"profile_no_personal_access_token": "You have not created any personal access tokens.", "profile_no_personal_access_token": "\u0644\u0645 \u062a\u0642\u0645 \u0628\u0625\u0646\u0634\u0627\u0621 \u0623\u064a \u0631\u0645\u0648\u0632 \u0648\u0635\u0648\u0644 \u0634\u062e\u0635\u064a\u0629.",
"profile_create_new_token": "Create new token", "profile_create_new_token": "\u0625\u0646\u0634\u0627\u0621 \u0631\u0645\u0632 \u062c\u062f\u064a\u062f",
"profile_create_token": "Create token", "profile_create_token": "\u0625\u0646\u0634\u0627\u0621 \u0631\u0645\u0632",
"profile_create": "Create", "profile_create": "\u0625\u0646\u0634\u0627\u0621",
"profile_save_changes": "Save changes", "profile_save_changes": "\u062d\u0641\u0638 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a",
"default_group_title_name": "(ungrouped)", "default_group_title_name": "(\u063a\u064a\u0631 \u0645\u062c\u0645\u0639)",
"piggy_bank": "Piggy bank", "piggy_bank": "\u062d\u0635\u0627\u0644\u0629",
"profile_oauth_client_secret_title": "Client Secret", "profile_oauth_client_secret_title": "\u0633\u0631 \u0627\u0644\u0639\u0645\u064a\u0644",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.", "profile_oauth_client_secret_expl": "\u0647\u0630\u0627 \u0647\u0648 \u0633\u0631 \u0627\u0644\u0639\u0645\u064a\u0644 \u0627\u0644\u062c\u062f\u064a\u062f \u0627\u0644\u062e\u0627\u0635 \u0628\u0643. \u0647\u0630\u0647 \u0647\u064a \u0627\u0644\u0645\u0631\u0629 \u0627\u0644\u0648\u062d\u064a\u062f\u0629 \u0627\u0644\u062a\u064a \u0633\u064a\u0638\u0647\u0631 \u0641\u064a\u0647\u0627 \u0641\u0644\u0627 \u062a\u0641\u0642\u062f\u0647! \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0622\u0646 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0647\u0630\u0627 \u0627\u0644\u0633\u0631 \u0644\u0625\u062c\u0631\u0627\u0621 \u0637\u0644\u0628\u0627\u062a API.",
"profile_oauth_confidential": "Confidential", "profile_oauth_confidential": "\u0633\u0631\u064a",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as primary desktop or JavaScript SPA applications, are unable to hold secrets securely.", "profile_oauth_confidential_help": "\u064a\u062a\u0637\u0644\u0628 \u0645\u0646 \u0627\u0644\u0639\u0645\u064a\u0644 \u0627\u0644\u0645\u0635\u0627\u062f\u0642\u0629 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0633\u0631. \u064a\u0645\u0643\u0646 \u0644\u0644\u0639\u0645\u0644\u0627\u0621 \u0627\u0644\u0633\u0631\u064a\u064a\u0646 \u0627\u0644\u0627\u062d\u062a\u0641\u0627\u0638 \u0628\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0637\u0631\u064a\u0642\u0629 \u0622\u0645\u0646\u0629 \u062f\u0648\u0646 \u0643\u0634\u0641\u0647\u0627 \u0644\u0623\u0637\u0631\u0627\u0641 \u063a\u064a\u0631 \u0645\u0635\u0631\u062d \u0644\u0647\u0627. \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u0627\u062a \u0627\u0644\u0639\u0627\u0645\u0629 \u0645\u062b\u0644 \u062a\u0637\u0628\u064a\u0642\u0627\u062a \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 \u0623\u0648 \u062a\u0637\u0628\u064a\u0642\u0627\u062a SPA JavaScript \u063a\u064a\u0631 \u0642\u0627\u062f\u0631\u0629 \u0639\u0644\u0649 \u0627\u0644\u0627\u062d\u062a\u0641\u0627\u0638 \u0628\u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0628\u0623\u0645\u0627\u0646.",
"multi_account_warning_unknown": "Depending on the type of transaction you create, the source and\/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.", "multi_account_warning_unknown": "\u0627\u0639\u062a\u0645\u0627\u062f\u0627\u064b \u0639\u0644\u0649 \u0646\u0648\u0639 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u0627\u0644\u062a\u064a \u062a\u0646\u0634\u0626\u0647\u0627\u060c \u0642\u062f \u064a\u062a\u0645 \u062a\u062c\u0627\u0648\u0632 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0635\u062f\u0631 \u0648\/\u0623\u0648 \u0627\u0644\u0648\u062c\u0647\u0629 \u0641\u064a \u0627\u0644\u062a\u0642\u0633\u064a\u0645\u0627\u062a \u0627\u0644\u0644\u0627\u062d\u0642\u0629 \u0628\u0645\u0627 \u0647\u0648 \u0645\u062d\u062f\u062f \u0641\u064a \u0623\u0648\u0644 \u062a\u0642\u0633\u064a\u0645 \u0644\u0644\u0645\u0639\u0627\u0645\u0644\u0629.",
"multi_account_warning_withdrawal": "Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.", "multi_account_warning_withdrawal": "\u0636\u0639 \u0641\u064a \u0627\u0639\u062a\u0628\u0627\u0631\u0643 \u0623\u0646 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0635\u062f\u0631 \u0641\u064a \u0627\u0644\u062a\u0642\u0633\u064a\u0645\u0627\u062a \u0627\u0644\u0644\u0627\u062d\u0642\u0629 \u0633\u064a\u062a\u0645 \u062a\u062c\u0627\u0648\u0632\u0647 \u0628\u0645\u0627 \u0647\u0648 \u0645\u062d\u062f\u062f \u0641\u064a \u0623\u0648\u0644 \u062a\u0642\u0633\u064a\u0645 \u0644\u0644\u0633\u062d\u0628.",
"multi_account_warning_deposit": "Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.", "multi_account_warning_deposit": "\u0636\u0639 \u0641\u064a \u0627\u0639\u062a\u0628\u0627\u0631\u0643 \u0623\u0646 \u062d\u0633\u0627\u0628 \u0627\u0644\u0648\u062c\u0647\u0629 \u0641\u064a \u0627\u0644\u062a\u0642\u0633\u064a\u0645\u0627\u062a \u0627\u0644\u0644\u0627\u062d\u0642\u0629 \u0633\u064a\u062a\u0645 \u062a\u062c\u0627\u0648\u0632\u0647 \u0628\u0645\u0627 \u0647\u0648 \u0645\u062d\u062f\u062f \u0641\u064a \u0623\u0648\u0644 \u062a\u0642\u0633\u064a\u0645 \u0644\u0644\u0625\u064a\u062f\u0627\u0639.",
"multi_account_warning_transfer": "Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer.", "multi_account_warning_transfer": "\u0636\u0639 \u0641\u064a \u0627\u0639\u062a\u0628\u0627\u0631\u0643 \u0623\u0646 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0635\u062f\u0631 + \u0627\u0644\u0648\u062c\u0647\u0629 \u0641\u064a \u0627\u0644\u062a\u0642\u0633\u064a\u0645\u0627\u062a \u0627\u0644\u0644\u0627\u062d\u0642\u0629 \u0633\u064a\u062a\u0645 \u062a\u062c\u0627\u0648\u0632\u0647\u0645\u0627 \u0628\u0645\u0627 \u0647\u0648 \u0645\u062d\u062f\u062f \u0641\u064a \u0623\u0648\u0644 \u062a\u0642\u0633\u064a\u0645 \u0644\u0644\u062a\u062d\u0648\u064a\u0644.",
"webhook_trigger_STORE_TRANSACTION": "After transaction creation", "webhook_trigger_STORE_TRANSACTION": "\u0628\u0639\u062f \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update", "webhook_trigger_UPDATE_TRANSACTION": "\u0628\u0639\u062f \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete", "webhook_trigger_DESTROY_TRANSACTION": "\u0628\u0639\u062f \u062d\u0630\u0641 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
"webhook_response_TRANSACTIONS": "Transaction details", "webhook_response_TRANSACTIONS": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
"webhook_response_ACCOUNTS": "Account details", "webhook_response_ACCOUNTS": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u062d\u0633\u0627\u0628",
"webhook_response_none_NONE": "No details", "webhook_response_none_NONE": "\u0644\u0627 \u062a\u0648\u062c\u062f \u062a\u0641\u0627\u0635\u064a\u0644",
"webhook_delivery_JSON": "JSON", "webhook_delivery_JSON": "JSON",
"actions": "Actions", "actions": "\u0627\u0644\u0625\u062c\u0631\u0627\u0621\u0627\u062a",
"meta_data": "Meta data", "meta_data": "\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0635\u0641\u064a\u0629",
"webhook_messages": "Webhook message", "webhook_messages": "\u0631\u0633\u0627\u0644\u0629 \u0648\u064a\u0628 \u0647\u0648\u0643",
"inactive": "Inactive", "inactive": "\u063a\u064a\u0631 \u0646\u0634\u0637",
"no_webhook_messages": "There are no webhook messages", "no_webhook_messages": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0631\u0633\u0627\u0626\u0644 \u0648\u064a\u0628 \u0647\u0648\u0643",
"inspect": "Inspect", "inspect": "\u062a\u0641\u0642\u062f",
"create_new_webhook": "Create new webhook", "create_new_webhook": "\u0625\u0646\u0634\u0627\u0621 \u0648\u064a\u0628 \u0647\u0648\u0643 \u062c\u062f\u064a\u062f",
"webhooks": "Webhooks", "webhooks": "\u0648\u064a\u0628 \u0647\u0648\u0643\u0633",
"webhook_trigger_form_help": "Indicate on what event the webhook will trigger", "webhook_trigger_form_help": "\u062d\u062f\u062f \u0627\u0644\u062d\u062f\u062b \u0627\u0644\u0630\u064a \u0633\u064a\u0634\u063a\u0644 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643",
"webhook_response_form_help": "Indicate what the webhook must submit to the URL.", "webhook_response_form_help": "\u062d\u062f\u062f \u0645\u0627 \u064a\u062c\u0628 \u0623\u0646 \u064a\u0631\u0633\u0644\u0647 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643 \u0625\u0644\u0649 \u0627\u0644\u0631\u0627\u0628\u0637.",
"webhook_delivery_form_help": "Which format the webhook must deliver data in.", "webhook_delivery_form_help": "\u062d\u062f\u062f \u0623\u064a \u0635\u064a\u063a\u0629 \u064a\u062c\u0628 \u0623\u0646 \u064a\u0631\u0633\u0644 \u0628\u0647\u0627 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a.",
"webhook_active_form_help": "The webhook must be active or it won't be called.", "webhook_active_form_help": "\u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643 \u0646\u0634\u0637\u0627\u064b \u0648\u0625\u0644\u0627 \u0644\u0646 \u064a\u062a\u0645 \u0627\u0633\u062a\u062f\u0639\u0627\u0624\u0647.",
"edit_webhook_js": "Edit webhook \"{title}\"", "edit_webhook_js": "\u062a\u0639\u062f\u064a\u0644 \u0648\u064a\u0628 \u0647\u0648\u0643 \"{title}\"",
"webhook_was_triggered": "The webhook was triggered on the indicated transaction. Please wait for results to appear.", "webhook_was_triggered": "\u062a\u0645 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643 \u0639\u0644\u0649 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u0627\u0644\u0645\u062d\u062f\u062f\u0629. \u064a\u0631\u062c\u0649 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u062d\u062a\u0649 \u062a\u0638\u0647\u0631 \u0627\u0644\u0646\u062a\u0627\u0626\u062c.",
"view_message": "View message", "view_message": "\u0639\u0631\u0636 \u0627\u0644\u0631\u0633\u0627\u0644\u0629",
"view_attempts": "View failed attempts", "view_attempts": "\u0639\u0631\u0636 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0627\u062a \u0627\u0644\u0641\u0627\u0634\u0644\u0629",
"message_content_title": "Webhook message content", "message_content_title": "\u0645\u062d\u062a\u0648\u0649 \u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643",
"message_content_help": "This is the content of the message that was sent (or tried) using this webhook.", "message_content_help": "\u0647\u0630\u0627 \u0647\u0648 \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0631\u0633\u0627\u0644\u0647\u0627 (\u0623\u0648 \u0645\u062d\u0627\u0648\u0644\u0629 \u0625\u0631\u0633\u0627\u0644\u0647\u0627) \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0647\u0630\u0627 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643.",
"attempt_content_title": "Webhook attempts", "attempt_content_title": "\u0645\u062d\u0627\u0648\u0644\u0627\u062a \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643",
"attempt_content_help": "These are all the unsuccessful attempts of this webhook message to submit to the configured URL. After some time, Firefly III will stop trying.", "attempt_content_help": "\u0647\u0630\u0647 \u0647\u064a \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0627\u062a \u063a\u064a\u0631 \u0627\u0644\u0646\u0627\u062c\u062d\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0644\u0625\u0631\u0633\u0627\u0644\u0647\u0627 \u0625\u0644\u0649 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0645\u062d\u062f\u062f. \u0628\u0639\u062f \u0641\u062a\u0631\u0629\u060c \u0633\u064a\u062a\u0648\u0642\u0641 Firefly III \u0639\u0646 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629.",
"no_attempts": "There are no unsuccessful attempts. That's a good thing!", "no_attempts": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u062d\u0627\u0648\u0644\u0627\u062a \u063a\u064a\u0631 \u0646\u0627\u062c\u062d\u0629. \u0647\u0630\u0627 \u0623\u0645\u0631 \u062c\u064a\u062f!",
"webhook_attempt_at": "Attempt at {moment}", "webhook_attempt_at": "\u0645\u062d\u0627\u0648\u0644\u0629 \u0641\u064a {moment}",
"logs": "Logs", "logs": "\u0627\u0644\u0633\u062c\u0644\u0627\u062a",
"response": "Response", "response": "\u0627\u0644\u0627\u0633\u062a\u062c\u0627\u0628\u0629",
"visit_webhook_url": "Visit webhook URL", "visit_webhook_url": "\u0632\u064a\u0627\u0631\u0629 \u0631\u0627\u0628\u0637 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643",
"reset_webhook_secret": "Reset webhook secret", "reset_webhook_secret": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0633\u0631 \u0627\u0644\u0648\u064a\u0628 \u0647\u0648\u0643",
"header_exchange_rates": "Exchange rates", "header_exchange_rates": "\u0623\u0633\u0639\u0627\u0631 \u0627\u0644\u0635\u0631\u0641",
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.", "exchange_rates_intro": "\u064a\u062f\u0639\u0645 Firefly III \u062a\u0646\u0632\u064a\u0644 \u0648\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0623\u0633\u0639\u0627\u0631 \u0627\u0644\u0635\u0631\u0641. \u0627\u0642\u0631\u0623 \u0627\u0644\u0645\u0632\u064a\u062f \u0639\u0646 \u0630\u0644\u0643 \u0641\u064a <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">\u0627\u0644\u0648\u062b\u0627\u0626\u0642<\/a>.",
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)", "exchange_rates_from_to": "\u0628\u064a\u0646 {from} \u0648{to} (\u0648\u0628\u0627\u0644\u0639\u0643\u0633)",
"exchange_rates_intro_rates": "Firefly III uses the following exchange rates. The inverse is automatically calculated when it is not provided. If no exchange rate exists for the date of the transaction, Firefly III will go back in time to find one. If none are present, the rate \"1\" will be used.", "exchange_rates_intro_rates": "\u064a\u0633\u062a\u062e\u062f\u0645 Firefly III \u0623\u0633\u0639\u0627\u0631 \u0627\u0644\u0635\u0631\u0641 \u0627\u0644\u062a\u0627\u0644\u064a\u0629. \u064a\u062a\u0645 \u062d\u0633\u0627\u0628 \u0627\u0644\u0639\u0643\u0633 \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u0625\u0630\u0627 \u0644\u0645 \u064a\u062a\u0645 \u062a\u0648\u0641\u064a\u0631\u0647. \u0625\u0630\u0627 \u0644\u0645 \u064a\u0648\u062c\u062f \u0633\u0639\u0631 \u0635\u0631\u0641 \u0644\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629\u060c \u0633\u064a\u0639\u0648\u062f Firefly III \u0628\u0627\u0644\u0632\u0645\u0646 \u0644\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0648\u0627\u062d\u062f. \u0625\u0630\u0627 \u0644\u0645 \u064a\u0648\u062c\u062f \u0623\u064a \u0633\u0639\u0631\u060c \u0633\u064a\u062a\u0645 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0633\u0639\u0631 \"1\".",
"header_exchange_rates_rates": "Exchange rates", "header_exchange_rates_rates": "\u0623\u0633\u0639\u0627\u0631 \u0627\u0644\u0635\u0631\u0641",
"header_exchange_rates_table": "Table with exchange rates", "header_exchange_rates_table": "\u062c\u062f\u0648\u0644 \u0623\u0633\u0639\u0627\u0631 \u0627\u0644\u0635\u0631\u0641",
"help_rate_form": "On this day, how many {to} will you get for one {from}?", "help_rate_form": "\u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u064a\u0648\u0645\u060c \u0643\u0645 {to} \u0633\u062a\u062d\u0635\u0644 \u0645\u0642\u0627\u0628\u0644 \u0648\u0627\u062d\u062f {from}\u061f",
"add_new_rate": "Add a new exchange rate", "add_new_rate": "\u0625\u0636\u0627\u0641\u0629 \u0633\u0639\u0631 \u0635\u0631\u0641 \u062c\u062f\u064a\u062f",
"save_new_rate": "Save new rate" "save_new_rate": "\u062d\u0641\u0638 \u0633\u0639\u0631 \u062c\u062f\u064a\u062f"
}, },
"form": { "form": {
"url": "URL", "url": "URL",

View File

@@ -183,6 +183,6 @@
}, },
"config": { "config": {
"html_language": "sv", "html_language": "sv",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss" "date_time_fns": "D MMMM YYYY @ HH:mm:ss"
} }
} }