diff --git a/.ci/php-cs-fixer/composer.lock b/.ci/php-cs-fixer/composer.lock index a48a40b6c5..138b0f636d 100644 --- a/.ci/php-cs-fixer/composer.lock +++ b/.ci/php-cs-fixer/composer.lock @@ -406,16 +406,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.73.1", + "version": "v3.75.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "ffcb8200a42045e65049af7910cfd022f631b064" + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ffcb8200a42045e65049af7910cfd022f631b064", - "reference": "ffcb8200a42045e65049af7910cfd022f631b064", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/399a128ff2fdaf4281e4e79b755693286cdf325c", + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c", "shasum": "" }, "require": { @@ -498,7 +498,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.73.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.75.0" }, "funding": [ { @@ -506,7 +506,7 @@ "type": "github" } ], - "time": "2025-03-19T23:42:16+00:00" + "time": "2025-03-31T18:40:42+00:00" }, { "name": "psr/container", @@ -1256,16 +1256,16 @@ }, { "name": "symfony/console", - "version": "v7.2.1", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" + "reference": "e51498ea18570c062e7df29d05a7003585b19b88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", + "reference": "e51498ea18570c062e7df29d05a7003585b19b88", "shasum": "" }, "require": { @@ -1329,7 +1329,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.1" + "source": "https://github.com/symfony/console/tree/v7.2.5" }, "funding": [ { @@ -1345,7 +1345,7 @@ "type": "tidelift" } ], - "time": "2024-12-11T03:49:26+00:00" + "time": "2025-03-12T08:11:12+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2243,16 +2243,16 @@ }, { "name": "symfony/process", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf" + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", - "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", + "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", "shasum": "" }, "require": { @@ -2284,7 +2284,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.4" + "source": "https://github.com/symfony/process/tree/v7.2.5" }, "funding": [ { @@ -2300,7 +2300,7 @@ "type": "tidelift" } ], - "time": "2025-02-05T08:33:46+00:00" + "time": "2025-03-13T12:21:46+00:00" }, { "name": "symfony/service-contracts", diff --git a/.env.example b/.env.example index e53ccacbe9..6ca952fe17 100644 --- a/.env.example +++ b/.env.example @@ -164,6 +164,13 @@ MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_SENDMAIL_COMMAND= +# +# If you use self-signed certificates for your STMP server, you can use the following settings. +# +MAIL_ALLOW_SELF_SIGNED=false +MAIL_VERIFY_PEER=true +MAIL_VERIFY_PEER_NAME=true + # Other mail drivers: # If you use Docker or similar, you can set these variables from a file by appending them with _FILE MAILGUN_DOMAIN= diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0062a4ce93..9bf199885f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -281,6 +281,8 @@ jobs: sudo chown -R runner:docker output.txt touch output.txt echo '' >> output.txt + echo "Welcome to release $version of Firefly III. It contains the the latest fixes, translations and features. Docker users can find this release under the \`latest\` tag." >> output.txt + echo '' >> output.txt echo '### Instructions' >> output.txt echo '' >> output.txt echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt diff --git a/THANKS.md b/THANKS.md index d3ca98d6b6..e2bfa7bfe8 100755 --- a/THANKS.md +++ b/THANKS.md @@ -4,6 +4,7 @@ Over time, many people have contributed to Firefly III. Their efforts are not al Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution. ## 2025 +- = - Lompi - Jose Diaz-Gonzalez - SoftBrix diff --git a/app/Api/V1/Controllers/Chart/AccountController.php b/app/Api/V1/Controllers/Chart/AccountController.php index e6ceb7d015..a7dbc10541 100644 --- a/app/Api/V1/Controllers/Chart/AccountController.php +++ b/app/Api/V1/Controllers/Chart/AccountController.php @@ -27,13 +27,16 @@ namespace FireflyIII\Api\V1\Controllers\Chart; use Carbon\Carbon; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Data\DateRequest; +use FireflyIII\Api\V1\Requests\Chart\ChartRequest; use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Models\Preference; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Support\Chart\ChartData; use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Http\Api\ApiSupport; +use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; use FireflyIII\User; use Illuminate\Http\JsonResponse; @@ -43,8 +46,10 @@ use Illuminate\Http\JsonResponse; class AccountController extends Controller { use ApiSupport; + use CollectsAccountsFromFilter; private AccountRepositoryInterface $repository; + private ChartData $chartData; /** * AccountController constructor. @@ -56,6 +61,7 @@ class AccountController extends Controller function ($request, $next) { /** @var User $user */ $user = auth()->user(); + $this->chartData = new ChartData(); $this->repository = app(AccountRepositoryInterface::class); $this->repository->setUser($user); @@ -64,6 +70,29 @@ class AccountController extends Controller ); } + /** + * TODO fix documentation + * + * @throws FireflyException + */ + public function dashboard(ChartRequest $request): JsonResponse + { + $queryParameters = $request->getParameters(); + $accounts = $this->getAccountList($queryParameters); + + // move date to end of day + $queryParameters['start']->startOfDay(); + $queryParameters['end']->endOfDay(); + + // loop each account, and collect info: + /** @var Account $account */ + foreach ($accounts as $account) { + $this->renderAccountData($queryParameters, $account); + } + + return response()->json($this->chartData->render()); + } + /** * This endpoint is documented at: * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview @@ -133,4 +162,45 @@ class AccountController extends Controller return response()->json($chartData); } + + /** + * @throws FireflyException + */ + private function renderAccountData(array $params, Account $account): void + { + $currency = $this->repository->getAccountCurrency($account); + if (null === $currency) { + $currency = $this->default; + } + $currentSet = [ + 'label' => $account->name, + + // the currency that belongs to the account. + 'currency_id' => (string) $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + + // the default currency of the user (could be the same!) + 'date' => $params['start']->toAtomString(), + 'start' => $params['start']->toAtomString(), + 'end' => $params['end']->toAtomString(), + 'period' => '1D', + 'entries' => [], + ]; + $currentStart = clone $params['start']; + $range = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToNative); + + $previous = array_values($range)[0]['balance']; + while ($currentStart <= $params['end']) { + $format = $currentStart->format('Y-m-d'); + $label = $currentStart->toAtomString(); + $balance = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous; + $previous = $balance; + + $currentStart->addDay(); + $currentSet['entries'][$label] = $balance; + } + $this->chartData->add($currentSet); + } } diff --git a/app/Api/V1/Controllers/Chart/BudgetController.php b/app/Api/V1/Controllers/Chart/BudgetController.php new file mode 100644 index 0000000000..573f90be51 --- /dev/null +++ b/app/Api/V1/Controllers/Chart/BudgetController.php @@ -0,0 +1,260 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Api\V1\Controllers\Chart; + +use Carbon\Carbon; +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\Generic\DateRequest; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Models\Budget; +use FireflyIII\Models\BudgetLimit; +use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; +use FireflyIII\Support\Http\Api\CleansChartData; +use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; +use Illuminate\Http\JsonResponse; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Log; + +/** + * Class BudgetController + */ +class BudgetController extends Controller +{ + use CleansChartData; + use ValidatesUserGroupTrait; + + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; + + protected OperationsRepositoryInterface $opsRepository; + private BudgetLimitRepositoryInterface $blRepository; + private array $currencies = []; + private TransactionCurrency $currency; + private BudgetRepositoryInterface $repository; + + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + $this->repository = app(BudgetRepositoryInterface::class); + $this->blRepository = app(BudgetLimitRepositoryInterface::class); + $this->opsRepository = app(OperationsRepositoryInterface::class); + $userGroup = $this->validateUserGroup($request); + $this->repository->setUserGroup($userGroup); + $this->opsRepository->setUserGroup($userGroup); + $this->blRepository->setUserGroup($userGroup); + + return $next($request); + } + ); + } + + /** + * TODO see autocomplete/accountcontroller + */ + public function dashboard(DateRequest $request): JsonResponse + { + $params = $request->getAll(); + + /** @var Carbon $start */ + $start = $params['start']; + + /** @var Carbon $end */ + $end = $params['end']; + + // code from FrontpageChartGenerator, but not in separate class + $budgets = $this->repository->getActiveBudgets(); + $data = []; + + /** @var Budget $budget */ + foreach ($budgets as $budget) { + // could return multiple arrays, so merge. + $data = array_merge($data, $this->processBudget($budget, $start, $end)); + } + + return response()->json($this->clean($data)); + } + + /** + * @throws FireflyException + */ + private function processBudget(Budget $budget, Carbon $start, Carbon $end): array + { + // get all limits: + $limits = $this->blRepository->getBudgetLimits($budget, $start, $end); + $rows = []; + + // if no limits + if (0 === $limits->count()) { + // return as a single item in an array + $rows = $this->noBudgetLimits($budget, $start, $end); + } + if ($limits->count() > 0) { + $rows = $this->budgetLimits($budget, $limits); + } + // is always an array + $return = []; + foreach ($rows as $row) { + $current = [ + 'label' => $budget->name, + 'currency_id' => (string) $row['currency_id'], + 'currency_code' => $row['currency_code'], + 'currency_name' => $row['currency_name'], + 'currency_decimal_places' => $row['currency_decimal_places'], + 'period' => null, + 'start' => $row['start'], + 'end' => $row['end'], + 'entries' => [ + 'spent' => $row['spent'], + 'left' => $row['left'], + 'overspent' => $row['overspent'], + ], + ]; + $return[] = $current; + } + + return $return; + } + + /** + * When no budget limits are present, the expenses of the whole period are collected and grouped. + * This is grouped per currency. Because there is no limit set, "left to spend" and "overspent" are empty. + * + * @throws FireflyException + */ + private function noBudgetLimits(Budget $budget, Carbon $start, Carbon $end): array + { + $spent = $this->opsRepository->listExpenses($start, $end, null, new Collection([$budget])); + + return $this->processExpenses($budget->id, $spent, $start, $end); + } + + /** + * Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return + * its info. + * + * @param array> $array + * + * @throws FireflyException + */ + private function processExpenses(int $budgetId, array $array, Carbon $start, Carbon $end): array + { + $return = []; + + /** + * This array contains the expenses in this budget. Grouped per currency. + * The grouping is on the main currency only. + * + * @var int $currencyId + * @var array $block + */ + foreach ($array as $currencyId => $block) { + $this->currencies[$currencyId] ??= TransactionCurrency::find($currencyId); + $return[$currencyId] ??= [ + 'currency_id' => (string) $currencyId, + 'currency_code' => $block['currency_code'], + 'currency_name' => $block['currency_name'], + 'currency_symbol' => $block['currency_symbol'], + 'currency_decimal_places' => (int) $block['currency_decimal_places'], + 'start' => $start->toAtomString(), + 'end' => $end->toAtomString(), + 'spent' => '0', + 'left' => '0', + 'overspent' => '0', + ]; + $currentBudgetArray = $block['budgets'][$budgetId]; + + // var_dump($return); + /** @var array $journal */ + foreach ($currentBudgetArray['transaction_journals'] as $journal) { + $return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], $journal['amount']); + } + } + + return $return; + } + + /** + * Function that processes each budget limit (per budget). + * + * If you have a budget limit in EUR, only transactions in EUR will be considered. + * If you have a budget limit in GBP, only transactions in GBP will be considered. + * + * If you have a budget limit in EUR, and a transaction in GBP, it will not be considered for the EUR budget limit. + * + * @throws FireflyException + */ + private function budgetLimits(Budget $budget, Collection $limits): array + { + app('log')->debug(sprintf('Now in budgetLimits(#%d)', $budget->id)); + $data = []; + + /** @var BudgetLimit $limit */ + foreach ($limits as $limit) { + $data = array_merge($data, $this->processLimit($budget, $limit)); + } + + return $data; + } + + /** + * @throws FireflyException + */ + private function processLimit(Budget $budget, BudgetLimit $limit): array + { + Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__)); + $end = clone $limit->end_date; + $end->endOfDay(); + $spent = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget])); + $limitCurrencyId = $limit->transaction_currency_id; + $filtered = []; + + /** @var array $entry */ + foreach ($spent as $currencyId => $entry) { + // only spent the entry where the entry's currency matches the budget limit's currency + // so $filtered will only have 1 or 0 entries + if ($entry['currency_id'] === $limitCurrencyId) { + $filtered[$currencyId] = $entry; + } + } + $result = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end); + if (1 === count($result)) { + $compare = bccomp($limit->amount, app('steam')->positive($result[$limitCurrencyId]['spent'])); + if (1 === $compare) { + // convert this amount into the native currency: + $result[$limitCurrencyId]['left'] = bcadd($limit->amount, $result[$limitCurrencyId]['spent']); + } + if ($compare <= 0) { + $result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, $result[$limitCurrencyId]['spent'])); + } + } + + return $result; + } +} diff --git a/app/Api/V1/Controllers/Chart/CategoryController.php b/app/Api/V1/Controllers/Chart/CategoryController.php new file mode 100644 index 0000000000..dd2c277c5e --- /dev/null +++ b/app/Api/V1/Controllers/Chart/CategoryController.php @@ -0,0 +1,128 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Api\V1\Controllers\Chart; + +use Carbon\Carbon; +use FireflyIII\Api\V2\Controllers\Controller; +use FireflyIII\Api\V2\Request\Generic\DateRequest; +use FireflyIII\Enums\AccountTypeEnum; +use FireflyIII\Enums\TransactionTypeEnum; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Helpers\Collector\GroupCollectorInterface; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; +use FireflyIII\Support\Http\Api\CleansChartData; +use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; +use Illuminate\Http\JsonResponse; + +/** + * Class BudgetController + */ +class CategoryController extends Controller +{ + use CleansChartData; + use ValidatesUserGroupTrait; + + private AccountRepositoryInterface $accountRepos; + private CurrencyRepositoryInterface $currencyRepos; + + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + $this->accountRepos = app(AccountRepositoryInterface::class); + $this->currencyRepos = app(CurrencyRepositoryInterface::class); + $userGroup = $this->validateUserGroup($request); + $this->accountRepos->setUserGroup($userGroup); + $this->currencyRepos->setUserGroup($userGroup); + + return $next($request); + } + ); + } + + /** + * TODO may be worth to move to a handler but the data is simple enough. + * TODO see autoComplete/account controller + * + * @throws FireflyException + * + * @SuppressWarnings("PHPMD.UnusedFormalParameter") + */ + public function dashboard(DateRequest $request): JsonResponse + { + /** @var Carbon $start */ + $start = $this->parameters->get('start'); + + /** @var Carbon $end */ + $end = $this->parameters->get('end'); + $accounts = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value]); + $currencies = []; + $return = []; + + // get journals for entire period: + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollectorInterface::class); + $collector->setRange($start, $end)->withAccountInformation(); + $collector->setXorAccounts($accounts)->withCategoryInformation(); + $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::RECONCILIATION->value]); + $journals = $collector->getExtractedJournals(); + + /** @var array $journal */ + foreach ($journals as $journal) { + $currencyId = (int) $journal['currency_id']; + $currency = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); + $currencies[$currencyId] = $currency; + $categoryName = null === $journal['category_name'] ? (string) trans('firefly.no_category') : $journal['category_name']; + $amount = app('steam')->positive($journal['amount']); + $key = sprintf('%s-%s', $categoryName, $currency->code); + // create arrays + $return[$key] ??= [ + 'label' => $categoryName, + 'currency_id' => (string) $currency->id, + 'currency_code' => $currency->code, + 'currency_name' => $currency->name, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'period' => null, + 'start' => $start->toAtomString(), + 'end' => $end->toAtomString(), + 'amount' => '0', + ]; + + // add monies + $return[$key]['amount'] = bcadd($return[$key]['amount'], $amount); + } + $return = array_values($return); + + // order by amount + usort($return, static function (array $a, array $b) { + return (float) $a['amount'] < (float) $b['amount'] ? 1 : -1; + }); + + return response()->json($this->clean($return)); + } +} diff --git a/app/Api/V1/Controllers/Summary/BasicController.php b/app/Api/V1/Controllers/Summary/BasicController.php index 89e94cad78..f5feb2fa2c 100644 --- a/app/Api/V1/Controllers/Summary/BasicController.php +++ b/app/Api/V1/Controllers/Summary/BasicController.php @@ -39,6 +39,8 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Support\Facades\Amount; +use FireflyIII\Support\Http\Api\ExchangeRateConverter; +use FireflyIII\Support\Report\Summarizer\TransactionSummarizer; use FireflyIII\User; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Log; @@ -97,10 +99,9 @@ class BasicController extends Controller $start = $dates['start']; $end = $dates['end']; $code = $request->get('currency_code'); - // balance information: $balanceData = $this->getBalanceInformation($start, $end); - $billData = $this->getBillInformation($start, $end); + $billData = $this->getSubscriptionInformation($start, $end); $spentData = $this->getLeftToSpendInfo($start, $end); $netWorthData = $this->getNetWorthInfo($end); // $balanceData = []; @@ -122,6 +123,7 @@ class BasicController extends Controller private function getBalanceInformation(Carbon $start, Carbon $end): array { + Log::debug('getBalanceInformation'); // some config settings $convertToNative = Amount::convertToNative(); $default = Amount::getNativeCurrency(); @@ -130,47 +132,110 @@ class BasicController extends Controller $expenses = []; $sums = []; $return = []; + $currencies = [ + $default->id => $default, + ]; // collect income of user using the new group collector. /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); - $collector->setRange($start, $end)->setPage($this->parameters->get('page'))->setTypes([TransactionTypeEnum::DEPOSIT->value]); + $summarizer = new TransactionSummarizer(); + $set = $collector->setRange($start, $end)->setTypes([TransactionTypeEnum::DEPOSIT->value])->getExtractedJournals(); + $incomes = $summarizer->groupByCurrencyId($set, 'positive', false); - $set = $collector->getExtractedJournals(); - - /** @var array $journal */ - foreach ($set as $journal) { - $currencyId = $convertToNative ? $default->id : (int) $journal['currency_id']; - $amount = Amount::getAmountFromJournal($journal); - $incomes[$currencyId] ??= '0'; - $incomes[$currencyId] = bcadd( - $incomes[$currencyId], - bcmul($amount, '-1') - ); - $sums[$currencyId] ??= '0'; - $sums[$currencyId] = bcadd($sums[$currencyId], bcmul($amount, '-1')); - } + // collect expenses of user. // collect expenses of user using the new group collector. /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); - $collector->setRange($start, $end)->setPage($this->parameters->get('page'))->setTypes([TransactionTypeEnum::WITHDRAWAL->value]); - $set = $collector->getExtractedJournals(); + $set = $collector->setRange($start, $end)->setPage($this->parameters->get('page'))->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->getExtractedJournals(); + $expenses = $summarizer->groupByCurrencyId($set, 'negative', false); - /** @var array $journal */ - foreach ($set as $journal) { - $currencyId = $convertToNative ? $default->id : (int) $journal['currency_id']; - $amount = Amount::getAmountFromJournal($journal); - $expenses[$currencyId] ??= '0'; - $expenses[$currencyId] = bcadd($expenses[$currencyId], $amount); - $sums[$currencyId] ??= '0'; - $sums[$currencyId] = bcadd($sums[$currencyId], $amount); + // if convert to native, do so right now. + if ($convertToNative) { + $newExpenses = [ + $default->id => [ + 'currency_id' => $default->id, + 'currency_code' => $default->code, + 'currency_symbol' => $default->symbol, + 'currency_decimal_places' => $default->decimal_places, + 'sum' => '0', + ], + ]; + $newIncomes = [ + $default->id => [ + 'currency_id' => $default->id, + 'currency_code' => $default->code, + 'currency_symbol' => $default->symbol, + 'currency_decimal_places' => $default->decimal_places, + 'sum' => '0', + ], + ]; + $sums = [ + $default->id => [ + 'currency_id' => $default->id, + 'currency_code' => $default->code, + 'currency_symbol' => $default->symbol, + 'currency_decimal_places' => $default->decimal_places, + 'sum' => '0', + ], + ]; + + $converter = new ExchangeRateConverter(); + // loop over income and expenses + foreach ([$expenses, $incomes] as $index => $array) { + + // loop over either one. + foreach ($array as $entry) { + + // if it is the native currency already. + if ($entry['currency_id'] === $default->id) { + $sums[$default->id]['sum'] = bcadd($entry['sum'], $sums[$default->id]['sum']); + + // don't forget to add it to newExpenses and newIncome + if (0 === $index) { + $newExpenses[$default->id]['sum'] = bcadd($newExpenses[$default->id]['sum'], $entry['sum']); + } + if (1 === $index) { + $newIncomes[$default->id]['sum'] = bcadd($newIncomes[$default->id]['sum'], $entry['sum']); + } + + continue; + } + + $currencies[$entry['currency_id']] ??= $this->currencyRepos->find($entry['currency_id']); + $convertedSum = $converter->convert($currencies[$entry['currency_id']], $default, $start, $entry['sum']); + $sums[$default->id]['sum'] = bcadd($sums[$default->id]['sum'], $convertedSum); + if (0 === $index) { + $newExpenses[$default->id]['sum'] = bcadd($newExpenses[$default->id]['sum'], $convertedSum); + } + if (1 === $index) { + $newIncomes[$default->id]['sum'] = bcadd($newIncomes[$default->id]['sum'], $convertedSum); + } + } + } + $incomes = $newIncomes; + $expenses = $newExpenses; + } + if (!$convertToNative) { + foreach ([$expenses, $incomes] as $array) { + foreach ($array as $entry) { + $currencyId = $entry['currency_id']; + $sums[$currencyId] ??= [ + 'currency_id' => $entry['currency_id'], + 'currency_code' => $entry['currency_code'], + 'currency_symbol' => $entry['currency_symbol'], + 'currency_decimal_places' => $entry['currency_decimal_places'], + 'sum' => '0', + ]; + $sums[$currencyId]['sum'] = bcadd($sums[$currencyId]['sum'], $entry['sum']); + } + } } - // format amounts: $keys = array_keys($sums); foreach ($keys as $currencyId) { - $currency = $this->currencyRepos->find($currencyId); + $currency = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); if (null === $currency) { continue; } @@ -178,37 +243,37 @@ class BasicController extends Controller $return[] = [ 'key' => sprintf('balance-in-%s', $currency->code), 'title' => trans('firefly.box_balance_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => $sums[$currencyId] ?? '0', + 'monetary_value' => $sums[$currencyId]['sum'] ?? '0', 'currency_id' => (string) $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, 'currency_decimal_places' => $currency->decimal_places, - 'value_parsed' => app('amount')->formatAnything($currency, $sums[$currencyId] ?? '0', false), + 'value_parsed' => app('amount')->formatAnything($currency, $sums[$currencyId]['sum'] ?? '0', false), 'local_icon' => 'balance-scale', - 'sub_title' => app('amount')->formatAnything($currency, $expenses[$currencyId] ?? '0', false) - .' + '.app('amount')->formatAnything($currency, $incomes[$currencyId] ?? '0', false), + 'sub_title' => app('amount')->formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false) + .' + '.app('amount')->formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), ]; $return[] = [ 'key' => sprintf('spent-in-%s', $currency->code), 'title' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => $expenses[$currencyId] ?? '0', + 'monetary_value' => $expenses[$currencyId]['sum'] ?? '0', 'currency_id' => (string) $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, 'currency_decimal_places' => $currency->decimal_places, - 'value_parsed' => app('amount')->formatAnything($currency, $expenses[$currencyId] ?? '0', false), + 'value_parsed' => app('amount')->formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false), 'local_icon' => 'balance-scale', 'sub_title' => '', ]; $return[] = [ 'key' => sprintf('earned-in-%s', $currency->code), 'title' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => $incomes[$currencyId] ?? '0', + 'monetary_value' => $incomes[$currencyId]['sum'] ?? '0', 'currency_id' => (string) $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, 'currency_decimal_places' => $currency->decimal_places, - 'value_parsed' => app('amount')->formatAnything($currency, $incomes[$currencyId] ?? '0', false), + 'value_parsed' => app('amount')->formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), 'local_icon' => 'balance-scale', 'sub_title' => '', ]; @@ -227,7 +292,7 @@ class BasicController extends Controller 'value_parsed' => app('amount')->formatAnything($currency, '0', false), 'local_icon' => 'balance-scale', 'sub_title' => app('amount')->formatAnything($currency, '0', false) - .' + '.app('amount')->formatAnything($currency, '0', false), + .' + '.app('amount')->formatAnything($currency, '0', false), ]; $return[] = [ 'key' => sprintf('spent-in-%s', $currency->code), @@ -258,15 +323,72 @@ class BasicController extends Controller return $return; } - private function getBillInformation(Carbon $start, Carbon $end): array + private function getSubscriptionInformation(Carbon $start, Carbon $end): array { - app('log')->debug(sprintf('Now in getBillInformation("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d-'))); + Log::debug(sprintf('Now in getBillInformation("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d-'))); /* * Since both this method and the chart use the exact same data, we can suffice * with calling the one method in the bill repository that will get this amount. */ $paidAmount = $this->billRepository->sumPaidInRange($start, $end); $unpaidAmount = $this->billRepository->sumUnpaidInRange($start, $end); + $currencies = [ + $this->nativeCurrency->id => $this->nativeCurrency, + ]; + + if ($this->convertToNative) { + $converter = new ExchangeRateConverter(); + $newPaidAmount = [[ + 'id' => $this->nativeCurrency->id, + 'name' => $this->nativeCurrency->name, + 'symbol' => $this->nativeCurrency->symbol, + 'code' => $this->nativeCurrency->code, + 'decimal_places' => $this->nativeCurrency->decimal_places, + 'sum' => '0', + ]]; + + $newUnpaidAmount = [[ + 'id' => $this->nativeCurrency->id, + 'name' => $this->nativeCurrency->name, + 'symbol' => $this->nativeCurrency->symbol, + 'code' => $this->nativeCurrency->code, + 'decimal_places' => $this->nativeCurrency->decimal_places, + 'sum' => '0', + ]]; + foreach ([$paidAmount, $unpaidAmount] as $index => $array) { + foreach ($array as $item) { + $currencyId = (int) $item['id']; + if (0 === $index) { + // paid amount + if ($currencyId === $this->nativeCurrency->id) { + $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], $item['sum']); + + continue; + } + $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); + $convertedAmount = $converter->convert($currencies[$currencyId], $this->nativeCurrency, $start, $item['sum']); + $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], $convertedAmount); + + continue; + } + // unpaid amount + if ($currencyId === $this->nativeCurrency->id) { + $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], $item['sum']); + + continue; + } + $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); + $convertedAmount = $converter->convert($currencies[$currencyId], $this->nativeCurrency, $start, $item['sum']); + $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], $convertedAmount); + } + } + $paidAmount = $newPaidAmount; + $unpaidAmount = $newUnpaidAmount; + } + + // var_dump($paidAmount); + // var_dump($unpaidAmount); + // exit; $return = []; @@ -307,7 +429,7 @@ class BasicController extends Controller 'sub_title' => '', ]; } - app('log')->debug(sprintf('Done with getBillInformation("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d-'))); + Log::debug(sprintf('Done with getBillInformation("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d-'))); if (0 === count($return)) { $currency = $this->nativeCurrency; @@ -348,30 +470,60 @@ class BasicController extends Controller */ private function getLeftToSpendInfo(Carbon $start, Carbon $end): array { - Log::debug(sprintf('Now in getLeftToSpendInfo("%s", "%s")', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'))); - $return = []; - $today = today(config('app.timezone')); - $available = $this->abRepository->getAvailableBudgetWithCurrency($start, $end); - $budgets = $this->budgetRepository->getActiveBudgets(); - $spent = $this->opsRepository->sumExpenses($start, $end, null, $budgets); - $days = (int) $today->diffInDays($end, true) + 1; + Log::debug(sprintf('Now in getLeftToSpendInfo("%s", "%s")', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'))); + $return = []; + $today = today(config('app.timezone')); + $available = $this->abRepository->getAvailableBudgetWithCurrency($start, $end); + $budgets = $this->budgetRepository->getActiveBudgets(); + $spent = $this->opsRepository->sumExpenses($start, $end, null, $budgets); + $days = (int) $today->diffInDays($end, true) + 1; + $currencies = []; + + // first, create an entry for each entry in the "available" array. + /** @var array $availableBudget */ + foreach ($available as $currencyId => $availableBudget) { + $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); + $return[$currencyId] = [ + 'key' => sprintf('left-to-spend-in-%s', $currencies[$currencyId]->code), + 'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $currencies[$currencyId]->symbol]), + 'no_available_budgets' => false, + 'monetary_value' => $availableBudget, + 'currency_id' => (string) $currencies[$currencyId]->id, + 'currency_code' => $currencies[$currencyId]->code, + 'currency_symbol' => $currencies[$currencyId]->symbol, + 'currency_decimal_places' => $currencies[$currencyId]->decimal_places, + 'value_parsed' => app('amount')->formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), + 'local_icon' => 'money', + 'sub_title' => app('amount')->formatFlat( + $currencies[$currencyId]->symbol, + $currencies[$currencyId]->decimal_places, + $availableBudget, + false + ), + ]; + } foreach ($spent as $row) { // either an amount was budgeted or 0 is available. - $currencyId = $row['currency_id']; - $amount = (string) ($available[$currencyId] ?? '0'); - $spentInCurrency = $row['sum']; - $leftToSpend = bcadd($amount, $spentInCurrency); - $perDay = '0'; + $currencyId = (int) $row['currency_id']; + $amount = (string) ($available[$currencyId] ?? '0'); + if (0 === bccomp($amount, '0')) { + // #9858 skip over currencies with no available budget. + continue; + } + $spentInCurrency = $row['sum']; + $leftToSpend = bcadd($amount, $spentInCurrency); + $perDay = '0'; if (0 !== $days && bccomp($leftToSpend, '0') > -1) { $perDay = bcdiv($leftToSpend, (string) $days); } Log::debug(sprintf('Spent %s %s', $row['currency_code'], $row['sum'])); - $return[] = [ + $return[$currencyId] = [ 'key' => sprintf('left-to-spend-in-%s', $row['currency_code']), 'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $row['currency_symbol']]), + 'no_available_budgets' => false, 'monetary_value' => $leftToSpend, 'currency_id' => (string) $row['currency_id'], 'currency_code' => $row['currency_code'], @@ -388,11 +540,12 @@ class BasicController extends Controller ]; } if (0 === count($return)) { - $currency = $this->nativeCurrency; - $return[] = [ + $currency = $this->nativeCurrency; + $return[$currency->id] = [ 'key' => sprintf('left-to-spend-in-%s', $currency->code), 'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $currency->symbol]), 'monetary_value' => '0', + 'no_available_budgets' => true, 'currency_id' => (string) $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, @@ -408,7 +561,7 @@ class BasicController extends Controller ]; } - return $return; + return array_values($return); } private function getNetWorthInfo(Carbon $end): array diff --git a/app/Api/V1/Requests/Chart/ChartRequest.php b/app/Api/V1/Requests/Chart/ChartRequest.php new file mode 100644 index 0000000000..a52c2e8245 --- /dev/null +++ b/app/Api/V1/Requests/Chart/ChartRequest.php @@ -0,0 +1,91 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Api\V1\Requests\Chart; + +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; +use FireflyIII\Support\Request\ChecksLogin; +use FireflyIII\Support\Request\ConvertsDataTypes; +use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Log; +use Illuminate\Validation\Validator; + +/** + * Class ChartRequest + */ +class ChartRequest extends FormRequest +{ + use ChecksLogin; + use ConvertsDataTypes; + use ValidatesUserGroupTrait; + + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; + + public function getParameters(): array + { + return [ + 'start' => $this->convertDateTime('start')?->startOfDay(), + 'end' => $this->convertDateTime('end')?->endOfDay(), + 'preselected' => $this->convertString('preselected', 'empty'), + 'period' => $this->convertString('period', '1M'), + 'accounts' => $this->arrayFromValue($this->get('accounts')), + ]; + } + + /** + * The rules that the incoming request must be matched against. + */ + public function rules(): array + { + return [ + 'start' => 'required|date|after:1900-01-01|before:2099-12-31|before_or_equal:end', + 'end' => 'required|date|after:1900-01-01|before:2099-12-31|after_or_equal:start', + 'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))), + 'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))), + 'accounts.*' => 'exists:accounts,id', + ]; + + } + + public function withValidator(Validator $validator): void + { + $validator->after( + static function (Validator $validator): void { + // validate transaction query data. + $data = $validator->getData(); + if (!array_key_exists('accounts', $data)) { + // $validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts'])); + return; + } + if (!is_array($data['accounts'])) { + $validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts'])); + } + } + ); + if ($validator->fails()) { + Log::channel('audit')->error(sprintf('Validation errors in %s', __CLASS__), $validator->errors()->toArray()); + } + } +} diff --git a/app/Api/V1/Requests/Generic/DateRequest.php b/app/Api/V1/Requests/Generic/DateRequest.php new file mode 100644 index 0000000000..c3840ac76b --- /dev/null +++ b/app/Api/V1/Requests/Generic/DateRequest.php @@ -0,0 +1,62 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Api\V1\Requests\Generic; + +use FireflyIII\Support\Request\ChecksLogin; +use FireflyIII\Support\Request\ConvertsDataTypes; +use Illuminate\Foundation\Http\FormRequest; + +/** + * Request class for end points that require date parameters. + * + * Class DateRequest + */ +class DateRequest extends FormRequest +{ + use ChecksLogin; + use ConvertsDataTypes; + + /** + * Get all data from the request. + */ + public function getAll(): array + { + return [ + 'start' => $this->getCarbonDate('start')->startOfDay(), + 'end' => $this->getCarbonDate('end')->endOfDay(), + ]; + } + + /** + * The rules that the incoming request must be matched against. + */ + public function rules(): array + { + return [ + 'start' => 'required|date|after:1900-01-01|before:2099-12-31', + 'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01', + ]; + } +} diff --git a/app/Api/V1/Requests/Generic/SingleDateRequest.php b/app/Api/V1/Requests/Generic/SingleDateRequest.php new file mode 100644 index 0000000000..2e4842433b --- /dev/null +++ b/app/Api/V1/Requests/Generic/SingleDateRequest.php @@ -0,0 +1,59 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Api\V1\Requests\Generic; + +use Carbon\Carbon; +use FireflyIII\Support\Request\ChecksLogin; +use FireflyIII\Support\Request\ConvertsDataTypes; +use Illuminate\Foundation\Http\FormRequest; + +/** + * Request class for end points that require a date parameter. + * + * Class SingleDateRequest + */ +class SingleDateRequest extends FormRequest +{ + use ChecksLogin; + use ConvertsDataTypes; + + /** + * Get all data from the request. + */ + public function getDate(): Carbon + { + return $this->getCarbonDate('date'); + } + + /** + * The rules that the incoming request must be matched against. + */ + public function rules(): array + { + return [ + 'date' => 'required|date|after:1900-01-01|before:2099-12-31', + ]; + } +} diff --git a/app/Http/Controllers/Chart/BillController.php b/app/Http/Controllers/Chart/BillController.php index a5ab00b99b..737698fc6e 100644 --- a/app/Http/Controllers/Chart/BillController.php +++ b/app/Http/Controllers/Chart/BillController.php @@ -179,7 +179,7 @@ class BillController extends Controller } $amount = bcmul($journal['amount'], '-1'); if ($this->convertToNative && $currencyId !== $journal['currency_id']) { - $amount = bcmul($journal['native_amount'], '-1'); + $amount = bcmul($journal['native_amount'] ?? '0', '-1'); } if ($this->convertToNative && $currencyId === $journal['foreign_currency_id']) { $amount = bcmul($journal['foreign_amount'], '-1'); diff --git a/app/Http/Controllers/Export/IndexController.php b/app/Http/Controllers/Export/IndexController.php index 267f827a27..8ab072fb12 100644 --- a/app/Http/Controllers/Export/IndexController.php +++ b/app/Http/Controllers/Export/IndexController.php @@ -32,6 +32,7 @@ use FireflyIII\Support\Export\ExportDataGenerator; use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Response as LaravelResponse; +use Illuminate\Support\Facades\Log; use Illuminate\View\View; /** @@ -71,6 +72,7 @@ class IndexController extends Controller return redirect(route('export.index')); } + Log::debug('Will export from the UI.'); /** @var ExportDataGenerator $generator */ $generator = app(ExportDataGenerator::class); @@ -83,6 +85,7 @@ class IndexController extends Controller $firstDate->subYear(); $journal = $this->journalRepository->firstNull(); if (null !== $journal) { + Log::debug('First journal is NULL, using today() - 1 year.'); $firstDate = clone $journal->date; } $generator->setStart($firstDate); diff --git a/app/Notifications/Admin/UnknownUserLoginAttempt.php b/app/Notifications/Admin/UnknownUserLoginAttempt.php index b19dd53ad6..57723356fc 100644 --- a/app/Notifications/Admin/UnknownUserLoginAttempt.php +++ b/app/Notifications/Admin/UnknownUserLoginAttempt.php @@ -27,6 +27,7 @@ namespace FireflyIII\Notifications\Admin; use FireflyIII\Notifications\Notifiables\OwnerNotifiable; use FireflyIII\Notifications\ReturnsAvailableChannels; use FireflyIII\Notifications\ReturnsSettings; +use FireflyIII\Support\Facades\FireflyConfig; use FireflyIII\Support\Facades\Steam; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; @@ -79,9 +80,10 @@ class UnknownUserLoginAttempt extends Notification { $settings = ReturnsSettings::getSettings('ntfy', 'owner', null); $message = new Message(); + $ip = Request::ip(); $message->topic($settings['ntfy_topic']); $message->title((string) trans('email.unknown_user_subject')); - $message->body((string) trans('email.unknown_user_message', ['address' => $this->address])); + $message->body((string) trans('email.unknown_user_message', ['address' => $this->address, 'ip' => $ip])); return $message; } @@ -91,7 +93,9 @@ class UnknownUserLoginAttempt extends Notification */ public function toPushover(OwnerNotifiable $notifiable): PushoverMessage { - return PushoverMessage::create((string) trans('email.unknown_user_message', ['address' => $this->address])) + $ip = Request::ip(); + + return PushoverMessage::create((string) trans('email.unknown_user_message', ['address' => $this->address, 'ip' => $ip])) ->title((string) trans('email.unknown_user_subject')) ; } @@ -101,8 +105,10 @@ class UnknownUserLoginAttempt extends Notification */ public function toSlack(OwnerNotifiable $notifiable): SlackMessage { + $ip = Request::ip(); + return new SlackMessage()->content( - (string) trans('email.unknown_user_body', ['address' => $this->address]) + (string) trans('email.unknown_user_body', ['address' => $this->address, 'ip' => $ip]) ); } @@ -111,6 +117,12 @@ class UnknownUserLoginAttempt extends Notification */ public function via(OwnerNotifiable $notifiable): array { - return ReturnsAvailableChannels::returnChannels('owner'); + $channels = ReturnsAvailableChannels::returnChannels('owner'); + $isDemoSite = FireflyConfig::get('is_demo_site', false)->data; + if (true === $isDemoSite) { + return array_diff($channels, ['mail']); + } + + return $channels; } } diff --git a/app/Notifications/Security/UserFailedLoginAttempt.php b/app/Notifications/Security/UserFailedLoginAttempt.php index 69bb04110c..c8eb674d30 100644 --- a/app/Notifications/Security/UserFailedLoginAttempt.php +++ b/app/Notifications/Security/UserFailedLoginAttempt.php @@ -26,6 +26,7 @@ namespace FireflyIII\Notifications\Security; use FireflyIII\Notifications\ReturnsAvailableChannels; use FireflyIII\Notifications\ReturnsSettings; +use FireflyIII\Support\Facades\FireflyConfig; use FireflyIII\Support\Facades\Steam; use FireflyIII\User; use Illuminate\Bus\Queueable; @@ -103,6 +104,12 @@ class UserFailedLoginAttempt extends Notification */ public function via(User $notifiable): array { - return ReturnsAvailableChannels::returnChannels('user', $notifiable); + $channels = ReturnsAvailableChannels::returnChannels('user', $notifiable); + $isDemoSite = FireflyConfig::get('is_demo_site', false)->data; + if (true === $isDemoSite) { + return array_diff($channels, ['mail']); + } + + return $channels; } } diff --git a/app/Notifications/Test/OwnerTestNotificationEmail.php b/app/Notifications/Test/OwnerTestNotificationEmail.php index 57df79296d..e80cb6e923 100644 --- a/app/Notifications/Test/OwnerTestNotificationEmail.php +++ b/app/Notifications/Test/OwnerTestNotificationEmail.php @@ -25,6 +25,7 @@ declare(strict_types=1); namespace FireflyIII\Notifications\Test; use FireflyIII\Notifications\Notifiables\OwnerNotifiable; +use FireflyIII\Support\Facades\FireflyConfig; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; @@ -63,6 +64,11 @@ class OwnerTestNotificationEmail extends Notification */ public function via(OwnerNotifiable $notifiable): array { + $isDemoSite = FireflyConfig::get('is_demo_site', false)->data; + if (true === $isDemoSite) { + return []; + } + return ['mail']; } } diff --git a/app/Notifications/Test/UserTestNotificationEmail.php b/app/Notifications/Test/UserTestNotificationEmail.php index 07f5b42e73..35f5836dbf 100644 --- a/app/Notifications/Test/UserTestNotificationEmail.php +++ b/app/Notifications/Test/UserTestNotificationEmail.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Notifications\Test; +use FireflyIII\Support\Facades\FireflyConfig; use FireflyIII\User; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; @@ -60,6 +61,11 @@ class UserTestNotificationEmail extends Notification */ public function via(User $notifiable): array { + $isDemoSite = FireflyConfig::get('is_demo_site', false)->data; + if (true === $isDemoSite) { + return []; + } + return ['mail']; } } diff --git a/app/Notifications/User/NewAccessToken.php b/app/Notifications/User/NewAccessToken.php index 1634638caa..f614c12bd9 100644 --- a/app/Notifications/User/NewAccessToken.php +++ b/app/Notifications/User/NewAccessToken.php @@ -26,6 +26,7 @@ namespace FireflyIII\Notifications\User; use FireflyIII\Notifications\ReturnsAvailableChannels; use FireflyIII\Notifications\ReturnsSettings; +use FireflyIII\Support\Facades\FireflyConfig; use FireflyIII\Support\Facades\Steam; use FireflyIII\User; use Illuminate\Bus\Queueable; @@ -101,6 +102,12 @@ class NewAccessToken extends Notification */ public function via(User $notifiable): array { - return ReturnsAvailableChannels::returnChannels('user', $notifiable); + $channels = ReturnsAvailableChannels::returnChannels('user', $notifiable); + $isDemoSite = FireflyConfig::get('is_demo_site', false)->data; + if (true === $isDemoSite) { + return array_diff($channels, ['mail']); + } + + return $channels; } } diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index 55112edf19..3f97289ee6 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -676,7 +676,7 @@ class AccountRepository implements AccountRepositoryInterface, UserGroupInterfac 'foreign_currencies.code as foreign_currency_code', 'foreign_currencies.name as foreign_currency_name', 'foreign_currencies.symbol as foreign_currency_symbol', - 'foreign_currencies.decimal_places as foreign_decimal_places', + 'foreign_currencies.decimal_places as foreign_currency_decimal_places', // fields 'transaction_journals.date', 'transaction_types.type', 'transaction_journals.transaction_currency_id', 'transactions.amount']) diff --git a/app/Repositories/Budget/AvailableBudgetRepository.php b/app/Repositories/Budget/AvailableBudgetRepository.php index fddb77e0ec..41f145c5e9 100644 --- a/app/Repositories/Budget/AvailableBudgetRepository.php +++ b/app/Repositories/Budget/AvailableBudgetRepository.php @@ -138,7 +138,7 @@ class AvailableBudgetRepository implements AvailableBudgetRepositoryInterface, U ->where('end_date', $end->format('Y-m-d'))->get() ; - Log::debug(sprintf('Found %d available budgets', $availableBudgets->count())); + Log::debug(sprintf('Found %d available budgets (already converted)', $availableBudgets->count())); // use native amount if necessary? $convertToNative = Amount::convertToNative($this->user); @@ -149,8 +149,9 @@ class AvailableBudgetRepository implements AvailableBudgetRepositoryInterface, U $currencyId = $convertToNative && $availableBudget->transaction_currency_id !== $default->id ? $default->id : $availableBudget->transaction_currency_id; $field = $convertToNative && $availableBudget->transaction_currency_id !== $default->id ? 'native_amount' : 'amount'; $return[$currencyId] ??= '0'; - $return[$currencyId] = bcadd($return[$currencyId], $availableBudget->{$field}); - Log::debug(sprintf('Add #%d %s (%s) for a total of %s', $currencyId, $availableBudget->{$field}, $field, $return[$currencyId])); + $amount = '' === (string) $availableBudget->{$field} ? '0' : (string) $availableBudget->{$field}; + $return[$currencyId] = bcadd($return[$currencyId], $amount); + Log::debug(sprintf('Add #%d %s (%s) for a total of %s', $currencyId, $amount, $field, $return[$currencyId])); } return $return; diff --git a/app/Repositories/Budget/OperationsRepository.php b/app/Repositories/Budget/OperationsRepository.php index eb6c70a52d..18cf66c3d4 100644 --- a/app/Repositories/Budget/OperationsRepository.php +++ b/app/Repositories/Budget/OperationsRepository.php @@ -247,6 +247,6 @@ class OperationsRepository implements OperationsRepositoryInterface, UserGroupIn } $summarizer = new TransactionSummarizer($this->user); - return $summarizer->groupByCurrencyId($journals); + return $summarizer->groupByCurrencyId($journals, 'negative', false); } } diff --git a/app/Repositories/Category/OperationsRepository.php b/app/Repositories/Category/OperationsRepository.php index deb6148de1..5e537041b6 100644 --- a/app/Repositories/Category/OperationsRepository.php +++ b/app/Repositories/Category/OperationsRepository.php @@ -55,6 +55,7 @@ class OperationsRepository implements OperationsRepositoryInterface, UserGroupIn $collector->setUser($this->user)->setRange($start, $end)->setTypes([TransactionTypeEnum::WITHDRAWAL->value]); if (null !== $accounts && $accounts->count() > 0) { $collector->setAccounts($accounts); + $collector->excludeDestinationAccounts($accounts); // to exclude withdrawals to liabilities. } if (null !== $categories && $categories->count() > 0) { $collector->setCategories($categories); @@ -132,6 +133,7 @@ class OperationsRepository implements OperationsRepositoryInterface, UserGroupIn $collector->setUser($this->user)->setRange($start, $end)->setTypes([TransactionTypeEnum::DEPOSIT->value]); if (null !== $accounts && $accounts->count() > 0) { $collector->setAccounts($accounts); + $collector->excludeSourceAccounts($accounts); // to prevent income from liabilities. } if (null !== $categories && $categories->count() > 0) { $collector->setCategories($categories); diff --git a/app/Services/Internal/Support/JournalServiceTrait.php b/app/Services/Internal/Support/JournalServiceTrait.php index 53c264ef7e..9a87b5aa75 100644 --- a/app/Services/Internal/Support/JournalServiceTrait.php +++ b/app/Services/Internal/Support/JournalServiceTrait.php @@ -35,7 +35,9 @@ use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; +use FireflyIII\Rules\UniqueIban; use FireflyIII\Support\NullArrayObject; +use Illuminate\Support\Facades\Log; /** * Trait JournalServiceTrait @@ -53,7 +55,7 @@ trait JournalServiceTrait protected function getAccount(string $transactionType, string $direction, array $data): ?Account { // some debug logging: - app('log')->debug(sprintf('Now in getAccount(%s)', $direction), $data); + Log::debug(sprintf('Now in getAccount(%s)', $direction), $data); // expected type of source account, in order of preference /** @var array $array */ @@ -63,7 +65,7 @@ trait JournalServiceTrait // and now try to find it, based on the type of transaction. $message = 'Transaction = %s, %s account should be in: %s. Direction is %s.'; - app('log')->debug(sprintf($message, $transactionType, $direction, implode(', ', $expectedTypes[$transactionType] ?? ['UNKNOWN']), $direction)); + Log::debug(sprintf($message, $transactionType, $direction, implode(', ', $expectedTypes[$transactionType] ?? ['UNKNOWN']), $direction)); $result = $this->findAccountById($data, $expectedTypes[$transactionType]); $result = $this->findAccountByIban($result, $data, $expectedTypes[$transactionType]); @@ -77,7 +79,7 @@ trait JournalServiceTrait // this account. In such a case, the name search must be retried with a new name. if (null !== $nameResult && null === $numberResult && null === $ibanResult && '' !== (string) $data['iban'] && '' !== (string) $nameResult->iban) { $data['name'] = sprintf('%s (%s)', $data['name'], $data['iban']); - app('log')->debug(sprintf('Search again using the new name, "%s".', $data['name'])); + Log::debug(sprintf('Search again using the new name, "%s".', $data['name'])); $result = $this->findAccountByName(null, $data, $expectedTypes[$transactionType]); } @@ -87,7 +89,7 @@ trait JournalServiceTrait // if the result is NULL but the ID is set, an account could exist of the wrong type. // that data can be used to create a new account of the right type. if (null === $result && null !== $data['id'] && null !== $creatableType) { - app('log')->debug(sprintf('Account #%d may exist and be of the wrong type, use data to create one of the right type.', $data['id'])); + Log::debug(sprintf('Account #%d may exist and be of the wrong type, use data to create one of the right type.', $data['id'])); $temp = $this->findAccountById(['id' => $data['id']], []); if (null !== $temp) { $tempData = [ @@ -100,11 +102,11 @@ trait JournalServiceTrait } } if (null === $result && null !== $creatableType) { - app('log')->debug('If nothing is found, create it.'); + Log::debug('If nothing is found, create it.'); $result = $this->createAccount($result, $data, $creatableType); } if (null === $result) { - app('log')->debug('If cant be created, return cash account.'); + Log::debug('If cant be created, return cash account.'); $result = $this->getCashAccount($result, $data, $expectedTypes[$transactionType]); } @@ -117,21 +119,21 @@ trait JournalServiceTrait if (null !== $data['id']) { $search = $this->accountRepository->find((int) $data['id']); if (null !== $search && in_array($search->accountType->type, $types, true)) { - app('log')->debug( + Log::debug( sprintf('Found "account_id" object: #%d, "%s" of type %s (1)', $search->id, $search->name, $search->accountType->type) ); return $search; } if (null !== $search && 0 === count($types)) { - app('log')->debug( + Log::debug( sprintf('Found "account_id" object: #%d, "%s" of type %s (2)', $search->id, $search->name, $search->accountType->type) ); return $search; } } - app('log')->debug(sprintf('Found no account by ID #%d of types', $data['id']), $types); + Log::debug(sprintf('Found no account by ID #%d of types', $data['id']), $types); return null; } @@ -139,12 +141,12 @@ trait JournalServiceTrait private function findAccountByIban(?Account $account, array $data, array $types): ?Account { if (null !== $account) { - app('log')->debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name)); + Log::debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name)); return $account; } if (null === $data['iban'] || '' === $data['iban']) { - app('log')->debug('IBAN is empty, will not search for IBAN.'); + Log::debug('IBAN is empty, will not search for IBAN.'); return null; } @@ -154,11 +156,11 @@ trait JournalServiceTrait $source ??= $this->accountRepository->findByIbanNull($data['iban'], $types); if (null !== $source) { - app('log')->debug(sprintf('Found "account_iban" object: #%d, %s', $source->id, $source->name)); + Log::debug(sprintf('Found "account_iban" object: #%d, %s', $source->id, $source->name)); return $source; } - app('log')->debug(sprintf('Found no account with IBAN "%s" of expected types', $data['iban']), $types); + Log::debug(sprintf('Found no account with IBAN "%s" of expected types', $data['iban']), $types); return null; } @@ -166,12 +168,12 @@ trait JournalServiceTrait private function findAccountByNumber(?Account $account, array $data, array $types): ?Account { if (null !== $account) { - app('log')->debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name)); + Log::debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name)); return $account; } if (null === $data['number'] || '' === $data['number']) { - app('log')->debug('Account number is empty, will not search for account number.'); + Log::debug('Account number is empty, will not search for account number.'); return null; } @@ -182,12 +184,12 @@ trait JournalServiceTrait $source ??= $this->accountRepository->findByAccountNumber((string) $data['number'], $types); if (null !== $source) { - app('log')->debug(sprintf('Found account: #%d, %s', $source->id, $source->name)); + Log::debug(sprintf('Found account: #%d, %s', $source->id, $source->name)); return $source; } - app('log')->debug(sprintf('Found no account with account number "%s" of expected types', $data['number']), $types); + Log::debug(sprintf('Found no account with account number "%s" of expected types', $data['number']), $types); return null; } @@ -195,12 +197,12 @@ trait JournalServiceTrait private function findAccountByName(?Account $account, array $data, array $types): ?Account { if (null !== $account) { - app('log')->debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name)); + Log::debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name)); return $account; } if (null === $data['name'] || '' === $data['name']) { - app('log')->debug('Account name is empty, will not search for account name.'); + Log::debug('Account name is empty, will not search for account name.'); return null; } @@ -212,11 +214,11 @@ trait JournalServiceTrait $source ??= $this->accountRepository->findByName($data['name'], $types); if (null !== $source) { - app('log')->debug(sprintf('Found "account_name" object: #%d, %s', $source->id, $source->name)); + Log::debug(sprintf('Found "account_name" object: #%d, %s', $source->id, $source->name)); return $source; } - app('log')->debug(sprintf('Found no account with account name "%s" of expected types', $data['name']), $types); + Log::debug(sprintf('Found no account with account name "%s" of expected types', $data['name']), $types); return null; } @@ -243,10 +245,10 @@ trait JournalServiceTrait */ private function createAccount(?Account $account, array $data, string $preferredType): ?Account { - app('log')->debug('Now in createAccount()', $data); + Log::debug('Now in createAccount()', $data); // return new account. if (null !== $account) { - app('log')->debug( + Log::debug( sprintf( 'Was given %s account #%d ("%s") so will simply return that.', $account->accountType->type, @@ -262,23 +264,32 @@ trait JournalServiceTrait } // fix name of account if only IBAN is given: if ('' === (string) $data['name'] && '' !== (string) $data['iban']) { - app('log')->debug(sprintf('Account name is now IBAN ("%s")', $data['iban'])); + Log::debug(sprintf('Account name is now IBAN ("%s")', $data['iban'])); $data['name'] = $data['iban']; } // fix name of account if only number is given: if ('' === (string) $data['name'] && '' !== (string) $data['number']) { - app('log')->debug(sprintf('Account name is now account number ("%s")', $data['number'])); + Log::debug(sprintf('Account name is now account number ("%s")', $data['number'])); $data['name'] = $data['number']; } // if name is still NULL, return NULL. if ('' === (string) $data['name']) { - app('log')->debug('Account name is still NULL, return NULL.'); + Log::debug('Account name is still NULL, return NULL.'); return null; } + // 2025-04-19 sanity check on IBAN. + $validator = new UniqueIban(null, $preferredType); + if ('' !== (string) $data['iban'] && !$validator->passes('iban', $data['iban'])) { + Log::warning(sprintf('IBAN "%s" is already in use, quietly ignore it.', $data['iban'])); + $data['iban'] = null; + } + + + // $data['name'] = $data['name'] ?? '(no name)'; - $account = $this->accountRepository->store( + $account = $this->accountRepository->store( [ 'account_type_id' => null, 'account_type_name' => $preferredType, @@ -314,7 +325,7 @@ trait JournalServiceTrait && in_array(AccountTypeEnum::CASH->value, $types, true)) { $account = $this->accountRepository->getCashAccount(); } - app('log')->debug('Cannot return cash account, return input instead.'); + Log::debug('Cannot return cash account, return input instead.'); return $account; } @@ -327,7 +338,7 @@ trait JournalServiceTrait if ('' === $amount) { throw new FireflyException(sprintf('The amount cannot be an empty string: "%s"', $amount)); } - app('log')->debug(sprintf('Now in getAmount("%s")', $amount)); + Log::debug(sprintf('Now in getAmount("%s")', $amount)); if (0 === bccomp('0', $amount)) { throw new FireflyException(sprintf('The amount seems to be zero: "%s"', $amount)); } @@ -338,21 +349,21 @@ trait JournalServiceTrait protected function getForeignAmount(?string $amount): ?string { if (null === $amount) { - app('log')->debug('No foreign amount info in array. Return NULL'); + Log::debug('No foreign amount info in array. Return NULL'); return null; } if ('' === $amount) { - app('log')->debug('Foreign amount is empty string, return NULL.'); + Log::debug('Foreign amount is empty string, return NULL.'); return null; } if (0 === bccomp('0', $amount)) { - app('log')->debug('Foreign amount is 0.0, return NULL.'); + Log::debug('Foreign amount is 0.0, return NULL.'); return null; } - app('log')->debug(sprintf('Foreign amount is %s', $amount)); + Log::debug(sprintf('Foreign amount is %s', $amount)); return $amount; } @@ -366,7 +377,7 @@ trait JournalServiceTrait } $budget = $this->budgetRepository->findBudget($data['budget_id'], $data['budget_name']); if (null !== $budget) { - app('log')->debug(sprintf('Link budget #%d to journal #%d', $budget->id, $journal->id)); + Log::debug(sprintf('Link budget #%d to journal #%d', $budget->id, $journal->id)); $journal->budgets()->sync([$budget->id]); return; @@ -379,7 +390,7 @@ trait JournalServiceTrait { $category = $this->categoryRepository->findCategory($data['category_id'], $data['category_name']); if (null !== $category) { - app('log')->debug(sprintf('Link category #%d to journal #%d', $category->id, $journal->id)); + Log::debug(sprintf('Link category #%d to journal #%d', $category->id, $journal->id)); $journal->categories()->sync([$category->id]); return; @@ -399,7 +410,7 @@ trait JournalServiceTrait } $note->text = $notes; $note->save(); - app('log')->debug(sprintf('Stored notes for journal #%d', $journal->id)); + Log::debug(sprintf('Stored notes for journal #%d', $journal->id)); return; } @@ -412,18 +423,18 @@ trait JournalServiceTrait */ protected function storeTags(TransactionJournal $journal, ?array $tags): void { - app('log')->debug('Now in storeTags()', $tags ?? []); + Log::debug('Now in storeTags()', $tags ?? []); $this->tagFactory->setUser($journal->user); $set = []; if (!is_array($tags)) { - app('log')->debug('Tags is not an array, break.'); + Log::debug('Tags is not an array, break.'); return; } - app('log')->debug('Start of loop.'); + Log::debug('Start of loop.'); foreach ($tags as $string) { $string = (string) $string; - app('log')->debug(sprintf('Now at tag "%s"', $string)); + Log::debug(sprintf('Now at tag "%s"', $string)); if ('' !== $string) { $tag = $this->tagFactory->findOrCreate($string); if (null !== $tag) { @@ -432,8 +443,8 @@ trait JournalServiceTrait } } $set = array_unique($set); - app('log')->debug('End of loop.'); - app('log')->debug(sprintf('Total nr. of tags: %d', count($tags)), $tags); + Log::debug('End of loop.'); + Log::debug(sprintf('Total nr. of tags: %d', count($tags)), $tags); $journal->tags()->sync($set); } } diff --git a/app/Support/Chart/ChartData.php b/app/Support/Chart/ChartData.php index 66585c415f..93a825415d 100644 --- a/app/Support/Chart/ChartData.php +++ b/app/Support/Chart/ChartData.php @@ -46,7 +46,7 @@ class ChartData if (array_key_exists('native_currency_id', $data)) { $data['native_currency_id'] = (string) $data['native_currency_id']; } - $required = ['start', 'date', 'end', 'entries', 'native_entries']; + $required = ['start', 'date', 'end', 'entries']; foreach ($required as $field) { if (!array_key_exists($field, $data)) { throw new FireflyException(sprintf('Data-set is missing the "%s"-variable.', $field)); diff --git a/app/Support/Cronjobs/UpdateCheckCronjob.php b/app/Support/Cronjobs/UpdateCheckCronjob.php index 9b9a08f5de..0cfb0a0967 100644 --- a/app/Support/Cronjobs/UpdateCheckCronjob.php +++ b/app/Support/Cronjobs/UpdateCheckCronjob.php @@ -45,8 +45,8 @@ class UpdateCheckCronjob extends AbstractCronjob Log::debug('Update check is not enabled.'); // get stuff from job: $this->jobFired = false; - $this->jobErrored = true; - $this->jobSucceeded = false; + $this->jobErrored = false; + $this->jobSucceeded = true; $this->message = 'The update check is not enabled.'; return; @@ -61,8 +61,8 @@ class UpdateCheckCronjob extends AbstractCronjob if ($diff < 604800 && false === $this->force) { // get stuff from job: $this->jobFired = false; - $this->jobErrored = true; - $this->jobSucceeded = false; + $this->jobErrored = false; + $this->jobSucceeded = true; $this->message = sprintf('Checked for updates less than a week ago (on %s).', date('Y-m-d H:i:s', $lastCheckTime->data)); return; diff --git a/app/Support/Export/ExportDataGenerator.php b/app/Support/Export/ExportDataGenerator.php index c50b9b28d2..3b86d45ec9 100644 --- a/app/Support/Export/ExportDataGenerator.php +++ b/app/Support/Export/ExportDataGenerator.php @@ -731,6 +731,7 @@ class ExportDataGenerator */ private function exportTransactions(): string { + Log::debug('Will now export transactions.'); // TODO better place for keys? $header = ['user_id', 'group_id', 'journal_id', 'created_at', 'updated_at', 'group_title', 'type', 'currency_code', 'amount', 'foreign_currency_code', 'foreign_amount', 'native_currency_code', 'native_amount', 'native_foreign_amount', 'description', 'date', 'source_name', 'source_iban', 'source_type', 'destination_name', 'destination_iban', 'destination_type', 'reconciled', 'category', 'budget', 'bill', 'tags', 'notes']; diff --git a/app/Support/Report/Summarizer/TransactionSummarizer.php b/app/Support/Report/Summarizer/TransactionSummarizer.php index 6c3a22fd6a..27f5bc1cda 100644 --- a/app/Support/Report/Summarizer/TransactionSummarizer.php +++ b/app/Support/Report/Summarizer/TransactionSummarizer.php @@ -49,7 +49,7 @@ class TransactionSummarizer $this->convertToNative = Amount::convertToNative($user); } - public function groupByCurrencyId(array $journals, string $method = 'negative'): array + public function groupByCurrencyId(array $journals, string $method = 'negative', bool $includeForeign = true): array { Log::debug(sprintf('Now in groupByCurrencyId(array, "%s")', $method)); $array = []; @@ -94,10 +94,10 @@ class TransactionSummarizer } } if (!$this->convertToNative) { - Log::debug(sprintf('Journal #%d also includes foreign amount (foreign is %s)', $journal['transaction_journal_id'], $journal['foreign_currency_code'])); // use foreign amount? $foreignCurrencyId = (int) $journal['foreign_currency_id']; if (0 !== $foreignCurrencyId) { + Log::debug(sprintf('Journal #%d also includes foreign amount (foreign is "%s")', $journal['transaction_journal_id'], $journal['foreign_currency_code'])); $foreignCurrencyName = $journal['foreign_currency_name']; $foreignCurrencySymbol = $journal['foreign_currency_symbol']; $foreignCurrencyCode = $journal['foreign_currency_code']; @@ -124,7 +124,7 @@ class TransactionSummarizer } // then process foreign amount, if it exists. - if (0 !== $foreignCurrencyId) { + if (0 !== $foreignCurrencyId && true === $includeForeign) { $amount = (string) ($journal['foreign_amount'] ?? '0'); $array[$foreignCurrencyId] ??= [ 'sum' => '0', diff --git a/app/Validation/AccountValidator.php b/app/Validation/AccountValidator.php index d927f67903..128f851a05 100644 --- a/app/Validation/AccountValidator.php +++ b/app/Validation/AccountValidator.php @@ -250,7 +250,7 @@ class AccountValidator */ protected function findExistingAccount(array $validTypes, array $data, bool $inverse = false): ?Account { - app('log')->debug('Now in findExistingAccount', $data); + app('log')->debug('Now in findExistingAccount', [$validTypes, $data]); app('log')->debug('The search will be reversed!'); $accountId = array_key_exists('id', $data) ? $data['id'] : null; $accountIban = array_key_exists('iban', $data) ? $data['iban'] : null; diff --git a/changelog.md b/changelog.md index 32cd78501e..e42065170c 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,29 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 6.2.11 - 2025-04-21 + +### Added + +- Support for Persian (`fa_IR`) +- Add expiry details for personal access tokens + +### Changed + +- [PR 10039](https://github.com/firefly-iii/firefly-iii/pull/10039) (update check: consider cron succesfull when disabled or too frequent) reported by @ovv +- Update currency list and update exchange rates + +### Fixed + +- [Issue 9398](https://github.com/firefly-iii/firefly-iii/issues/9398) (Expand email settings to allow self-signed certificates) reported by @SoulSeekkor +- [Issue 9858](https://github.com/firefly-iii/firefly-iii/issues/9858) (Homepage "left to spend" count two times an expense with "foreign amount") reported by @M4xS0ch +- [Issue 10015](https://github.com/firefly-iii/firefly-iii/issues/10015) ("It looks like this IBAN is already in use." when editing asset account.) reported by @wolph +- [Issue 10025](https://github.com/firefly-iii/firefly-iii/issues/10025) (Liabilities not counted in income and expenses) reported by @BhasherBEL +- [Issue 10068](https://github.com/firefly-iii/firefly-iii/issues/10068) (Export Data isn't exporting all transactions in the data) reported by @firsttiger +- [Issue 10069](https://github.com/firefly-iii/firefly-iii/issues/10069) (Undefined array key "foreign_currency_decimal_places") reported by @akong-carbon6 +- [Issue 10114](https://github.com/firefly-iii/firefly-iii/issues/10114) (Budget for foreign currency not getting updated when a transaction refers to it) reported by @srikakulamts +- [Issue 10150](https://github.com/firefly-iii/firefly-iii/issues/10150) (Mass deletion of initial balance throws 404 and doesn't delete) reported by @Tyler-Angell + ## 6.2.10 - 2025-03-22 ### Added diff --git a/composer.json b/composer.json index 5b1b754111..b2b00813bc 100644 --- a/composer.json +++ b/composer.json @@ -84,7 +84,7 @@ "bacon/bacon-qr-code": "^2", "diglactic/laravel-breadcrumbs": "^10", "gdbots/query-parser": "^3.0", - "guzzlehttp/guzzle": "^7.8", + "guzzlehttp/guzzle": "^7.9", "jc5/google2fa-laravel": "^2.0", "jc5/recovery": "^2", "laravel-notification-channels/pushover": "^4.0", diff --git a/composer.lock b/composer.lock index b7fcca3176..b431bdc56d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f5bc893e4af6924e2fbfe02989dbe719", + "content-hash": "3c350a535ca785e45a43f67c3a41154b", "packages": [ { "name": "bacon/bacon-qr-code", @@ -1010,16 +1010,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.0", + "version": "v6.11.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712" + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", "shasum": "" }, "require": { @@ -1067,9 +1067,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" }, - "time": "2025-01-23T05:11:06+00:00" + "time": "2025-04-09T20:32:01+00:00" }, { "name": "fruitcake/php-cors", @@ -1245,16 +1245,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "version": "7.9.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", "shasum": "" }, "require": { @@ -1351,7 +1351,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/7.9.3" }, "funding": [ { @@ -1367,20 +1367,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2025-03-27T13:37:11+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.4", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", "shasum": "" }, "require": { @@ -1434,7 +1434,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" + "source": "https://github.com/guzzle/promises/tree/2.2.0" }, "funding": [ { @@ -1450,20 +1450,20 @@ "type": "tidelift" } ], - "time": "2024-10-17T10:06:22+00:00" + "time": "2025-03-27T13:27:01+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", "shasum": "" }, "require": { @@ -1550,7 +1550,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "source": "https://github.com/guzzle/psr7/tree/2.7.1" }, "funding": [ { @@ -1566,7 +1566,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2025-03-27T12:30:47+00:00" }, { "name": "guzzlehttp/uri-template", @@ -2292,16 +2292,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.3", + "version": "v2.0.4", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f" + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f379c13663245f7aa4512a7869f62eb14095f23f", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b352cf0534aa1ae6b4d825d1e762e35d43f8a841", + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841", "shasum": "" }, "require": { @@ -2349,7 +2349,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2025-02-11T15:03:05+00:00" + "time": "2025-03-19T13:51:03+00:00" }, { "name": "laravel/slack-notification-channel", @@ -2618,16 +2618,16 @@ }, { "name": "league/commonmark", - "version": "2.6.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d990688c91cedfb69753ffc2512727ec646df2ad" + "reference": "06c3b0bf2540338094575612f4a1778d0d2d5e94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad", - "reference": "d990688c91cedfb69753ffc2512727ec646df2ad", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/06c3b0bf2540338094575612f4a1778d0d2d5e94", + "reference": "06c3b0bf2540338094575612f4a1778d0d2d5e94", "shasum": "" }, "require": { @@ -2721,7 +2721,7 @@ "type": "tidelift" } ], - "time": "2024-12-29T14:10:59+00:00" + "time": "2025-04-18T21:09:27+00:00" }, { "name": "league/config", @@ -2807,16 +2807,16 @@ }, { "name": "league/csv", - "version": "9.22.0", + "version": "9.23.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "afc109aa11f3086b8be8dfffa04ac31480b36b76" + "reference": "774008ad8a634448e4f8e288905e070e8b317ff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/afc109aa11f3086b8be8dfffa04ac31480b36b76", - "reference": "afc109aa11f3086b8be8dfffa04ac31480b36b76", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/774008ad8a634448e4f8e288905e070e8b317ff3", + "reference": "774008ad8a634448e4f8e288905e070e8b317ff3", "shasum": "" }, "require": { @@ -2894,7 +2894,7 @@ "type": "github" } ], - "time": "2025-02-28T10:00:39+00:00" + "time": "2025-03-28T06:52:04+00:00" }, { "name": "league/event", @@ -3472,22 +3472,22 @@ }, { "name": "mailersend/laravel-driver", - "version": "v2.8.0", + "version": "v2.9.1", "source": { "type": "git", "url": "https://github.com/mailersend/mailersend-laravel-driver.git", - "reference": "b28fde8f6ec0cd5406100abf05f7899935e71652" + "reference": "87fd5ab76808bbaac9221be0d306baef13e98725" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mailersend/mailersend-laravel-driver/zipball/b28fde8f6ec0cd5406100abf05f7899935e71652", - "reference": "b28fde8f6ec0cd5406100abf05f7899935e71652", + "url": "https://api.github.com/repos/mailersend/mailersend-laravel-driver/zipball/87fd5ab76808bbaac9221be0d306baef13e98725", + "reference": "87fd5ab76808bbaac9221be0d306baef13e98725", "shasum": "" }, "require": { "ext-json": "*", "illuminate/support": "^9.0 || ^10.0 || ^11.0 || ^12.0", - "mailersend/mailersend": "^0.8.0 || ^0.23.0 || ^0.24.0 || ^0.30.0", + "mailersend/mailersend": "^0.31.0", "nyholm/psr7": "^1.5", "php": ">=8.0", "php-http/guzzle7-adapter": "^1.0", @@ -3535,22 +3535,22 @@ ], "support": { "issues": "https://github.com/mailersend/mailersend-laravel-driver/issues", - "source": "https://github.com/mailersend/mailersend-laravel-driver/tree/v2.8.0" + "source": "https://github.com/mailersend/mailersend-laravel-driver/tree/v2.9.1" }, - "time": "2025-03-06T16:55:40+00:00" + "time": "2025-04-09T09:33:07+00:00" }, { "name": "mailersend/mailersend", - "version": "v0.30.0", + "version": "v0.31.0", "source": { "type": "git", "url": "https://github.com/mailersend/mailersend-php.git", - "reference": "7ac40e50fa914a506c58d13c82dbf0d3bf0a6487" + "reference": "513ff83ee768526055ad52987cde401ea7218c67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mailersend/mailersend-php/zipball/7ac40e50fa914a506c58d13c82dbf0d3bf0a6487", - "reference": "7ac40e50fa914a506c58d13c82dbf0d3bf0a6487", + "url": "https://api.github.com/repos/mailersend/mailersend-php/zipball/513ff83ee768526055ad52987cde401ea7218c67", + "reference": "513ff83ee768526055ad52987cde401ea7218c67", "shasum": "" }, "require": { @@ -3602,22 +3602,22 @@ ], "support": { "issues": "https://github.com/mailersend/mailersend-php/issues", - "source": "https://github.com/mailersend/mailersend-php/tree/v0.30.0" + "source": "https://github.com/mailersend/mailersend-php/tree/v0.31.0" }, - "time": "2025-03-06T15:45:57+00:00" + "time": "2025-04-03T12:16:11+00:00" }, { "name": "monolog/monolog", - "version": "3.8.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", "shasum": "" }, "require": { @@ -3695,7 +3695,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.8.1" + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" }, "funding": [ { @@ -3707,20 +3707,20 @@ "type": "tidelift" } ], - "time": "2024-12-05T17:15:07+00:00" + "time": "2025-03-24T10:02:05+00:00" }, { "name": "nesbot/carbon", - "version": "3.8.6", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd" + "reference": "6d16a8a015166fe54e22c042e0805c5363aef50d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6d16a8a015166fe54e22c042e0805c5363aef50d", + "reference": "6d16a8a015166fe54e22c042e0805c5363aef50d", "shasum": "" }, "require": { @@ -3813,7 +3813,7 @@ "type": "tidelift" } ], - "time": "2025-02-20T17:33:38+00:00" + "time": "2025-03-27T12:57:33+00:00" }, { "name": "nette/schema", @@ -3879,16 +3879,16 @@ }, { "name": "nette/utils", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + "reference": "ce708655043c7050eb050df361c5e313cf708309" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309", + "reference": "ce708655043c7050eb050df361c5e313cf708309", "shasum": "" }, "require": { @@ -3959,44 +3959,45 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.5" + "source": "https://github.com/nette/utils/tree/v4.0.6" }, - "time": "2024-08-07T15:39:19+00:00" + "time": "2025-03-30T21:06:30+00:00" }, { "name": "nunomaduro/collision", - "version": "v8.7.0", + "version": "v8.8.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26" + "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/586cb8181a257a2152b6a855ca8d9598878a1a26", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/4cf9f3b47afff38b139fb79ce54fc71799022ce8", + "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8", "shasum": "" }, "require": { - "filp/whoops": "^2.17.0", + "filp/whoops": "^2.18.0", "nunomaduro/termwind": "^2.3.0", "php": "^8.2.0", - "symfony/console": "^7.2.1" + "symfony/console": "^7.2.5" }, "conflict": { - "laravel/framework": "<11.39.1 || >=13.0.0", - "phpunit/phpunit": "<11.5.3 || >=12.0.0" + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" }, "require-dev": { - "larastan/larastan": "^2.10.0", - "laravel/framework": "^11.44.2", + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.2", + "laravel/framework": "^11.44.2 || ^12.6", "laravel/pint": "^1.21.2", "laravel/sail": "^1.41.0", "laravel/sanctum": "^4.0.8", "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0", - "pestphp/pest": "^3.7.4", - "sebastian/environment": "^6.1.0 || ^7.2.0" + "orchestra/testbench-core": "^9.12.0 || ^10.1", + "pestphp/pest": "^3.8.0", + "sebastian/environment": "^7.2.0 || ^8.0" }, "type": "library", "extra": { @@ -4059,7 +4060,7 @@ "type": "patreon" } ], - "time": "2025-03-14T22:37:40+00:00" + "time": "2025-04-03T14:33:09+00:00" }, { "name": "nunomaduro/termwind", @@ -5830,16 +5831,16 @@ }, { "name": "rcrowe/twigbridge", - "version": "v0.14.4", + "version": "v0.14.5", "source": { "type": "git", "url": "https://github.com/rcrowe/TwigBridge.git", - "reference": "4fddf45ae010bfc75535ad9ab141301908117f34" + "reference": "88c83c9658a2c029c64ec80dd8a15d5a67433ac4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/4fddf45ae010bfc75535ad9ab141301908117f34", - "reference": "4fddf45ae010bfc75535ad9ab141301908117f34", + "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/88c83c9658a2c029c64ec80dd8a15d5a67433ac4", + "reference": "88c83c9658a2c029c64ec80dd8a15d5a67433ac4", "shasum": "" }, "require": { @@ -5896,9 +5897,9 @@ ], "support": { "issues": "https://github.com/rcrowe/TwigBridge/issues", - "source": "https://github.com/rcrowe/TwigBridge/tree/v0.14.4" + "source": "https://github.com/rcrowe/TwigBridge/tree/v0.14.5" }, - "time": "2025-02-25T15:40:57+00:00" + "time": "2025-04-18T18:48:57+00:00" }, { "name": "spatie/backtrace", @@ -6360,16 +6361,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.91.1", + "version": "1.92.4", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "b0b509b9b01d77caa431ce9af3a706bc678e09c9" + "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/b0b509b9b01d77caa431ce9af3a706bc678e09c9", - "reference": "b0b509b9b01d77caa431ce9af3a706bc678e09c9", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d20b1969f836d210459b78683d85c9cd5c5f508c", + "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c", "shasum": "" }, "require": { @@ -6380,6 +6381,7 @@ "mockery/mockery": "^1.5", "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", "pestphp/pest": "^1.23|^2.1|^3.1", + "phpunit/php-code-coverage": "^9.0|^10.0|^11.0", "phpunit/phpunit": "^9.5.24|^10.5|^11.5", "spatie/pest-plugin-test-time": "^1.1|^2.2" }, @@ -6408,7 +6410,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.91.1" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.4" }, "funding": [ { @@ -6416,7 +6418,7 @@ "type": "github" } ], - "time": "2025-03-21T09:50:49+00:00" + "time": "2025-04-11T15:27:14+00:00" }, { "name": "spatie/period", @@ -6474,16 +6476,16 @@ }, { "name": "symfony/cache", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d33cd9e14326e14a4145c21e600602eaf17cc9e7" + "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d33cd9e14326e14a4145c21e600602eaf17cc9e7", - "reference": "d33cd9e14326e14a4145c21e600602eaf17cc9e7", + "url": "https://api.github.com/repos/symfony/cache/zipball/9131e3018872d2ebb6fe8a9a4d6631273513d42c", + "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c", "shasum": "" }, "require": { @@ -6552,7 +6554,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.2.4" + "source": "https://github.com/symfony/cache/tree/v7.2.5" }, "funding": [ { @@ -6568,7 +6570,7 @@ "type": "tidelift" } ], - "time": "2025-02-26T09:57:54+00:00" + "time": "2025-03-25T15:54:33+00:00" }, { "name": "symfony/cache-contracts", @@ -6722,16 +6724,16 @@ }, { "name": "symfony/console", - "version": "v7.2.1", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" + "reference": "e51498ea18570c062e7df29d05a7003585b19b88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", + "reference": "e51498ea18570c062e7df29d05a7003585b19b88", "shasum": "" }, "require": { @@ -6795,7 +6797,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.1" + "source": "https://github.com/symfony/console/tree/v7.2.5" }, "funding": [ { @@ -6811,7 +6813,7 @@ "type": "tidelift" } ], - "time": "2024-12-11T03:49:26+00:00" + "time": "2025-03-12T08:11:12+00:00" }, { "name": "symfony/css-selector", @@ -6947,16 +6949,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "aabf79938aa795350c07ce6464dd1985607d95d5" + "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/aabf79938aa795350c07ce6464dd1985607d95d5", - "reference": "aabf79938aa795350c07ce6464dd1985607d95d5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", "shasum": "" }, "require": { @@ -7002,7 +7004,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.4" + "source": "https://github.com/symfony/error-handler/tree/v7.2.5" }, "funding": [ { @@ -7018,7 +7020,7 @@ "type": "tidelift" } ], - "time": "2025-02-02T20:27:07+00:00" + "time": "2025-03-03T07:12:39+00:00" }, { "name": "symfony/event-dispatcher", @@ -7479,16 +7481,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.2.3", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0" + "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0", - "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", + "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", "shasum": "" }, "require": { @@ -7537,7 +7539,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.3" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.5" }, "funding": [ { @@ -7553,20 +7555,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-03-25T15:54:33+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9f1103734c5789798fefb90e91de4586039003ed" + "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f1103734c5789798fefb90e91de4586039003ed", - "reference": "9f1103734c5789798fefb90e91de4586039003ed", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", + "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", "shasum": "" }, "require": { @@ -7651,7 +7653,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.5" }, "funding": [ { @@ -7667,7 +7669,7 @@ "type": "tidelift" } ], - "time": "2025-02-26T11:01:22+00:00" + "time": "2025-03-28T13:32:50+00:00" }, { "name": "symfony/mailer", @@ -8607,16 +8609,16 @@ }, { "name": "symfony/process", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf" + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", - "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", + "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", "shasum": "" }, "require": { @@ -8648,7 +8650,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.4" + "source": "https://github.com/symfony/process/tree/v7.2.5" }, "funding": [ { @@ -8664,7 +8666,7 @@ "type": "tidelift" } ], - "time": "2025-02-05T08:33:46+00:00" + "time": "2025-03-13T12:21:46+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -9332,16 +9334,16 @@ }, { "name": "symfony/var-exporter", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a" + "reference": "c37b301818bd7288715d40de634f05781b686ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/4ede73aa7a73d81506002d2caadbbdad1ef5b69a", - "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c37b301818bd7288715d40de634f05781b686ace", + "reference": "c37b301818bd7288715d40de634f05781b686ace", "shasum": "" }, "require": { @@ -9388,7 +9390,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.4" + "source": "https://github.com/symfony/var-exporter/tree/v7.2.5" }, "funding": [ { @@ -9404,7 +9406,7 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-03-13T12:21:46+00:00" }, { "name": "thecodingmachine/safe", @@ -9681,16 +9683,16 @@ }, { "name": "verifiedjoseph/ntfy-php-library", - "version": "v4.7.0", + "version": "v4.7.1", "source": { "type": "git", "url": "https://github.com/VerifiedJoseph/ntfy-php-library.git", - "reference": "c84d4dd7074d4cd89bfc1c10b1aa7f2568105412" + "reference": "b191721dfed447a94f220a89dd372861d4c41115" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/VerifiedJoseph/ntfy-php-library/zipball/c84d4dd7074d4cd89bfc1c10b1aa7f2568105412", - "reference": "c84d4dd7074d4cd89bfc1c10b1aa7f2568105412", + "url": "https://api.github.com/repos/VerifiedJoseph/ntfy-php-library/zipball/b191721dfed447a94f220a89dd372861d4c41115", + "reference": "b191721dfed447a94f220a89dd372861d4c41115", "shasum": "" }, "require": { @@ -9729,9 +9731,9 @@ ], "support": { "issues": "https://github.com/VerifiedJoseph/ntfy-php-library/issues", - "source": "https://github.com/VerifiedJoseph/ntfy-php-library/tree/v4.7.0" + "source": "https://github.com/VerifiedJoseph/ntfy-php-library/tree/v4.7.1" }, - "time": "2024-12-10T10:48:38+00:00" + "time": "2025-04-01T14:02:04+00:00" }, { "name": "vlucas/phpdotenv", @@ -10028,16 +10030,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.15.2", + "version": "v3.15.4", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729" + "reference": "c0667ea91f7185f1e074402c5788195e96bf8106" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/0bc1e1361e7fffc2be156f46ad1fba6927c01729", - "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/c0667ea91f7185f1e074402c5788195e96bf8106", + "reference": "c0667ea91f7185f1e074402c5788195e96bf8106", "shasum": "" }, "require": { @@ -10048,9 +10050,6 @@ "php-debugbar/php-debugbar": "~2.1.1", "symfony/finder": "^6|^7" }, - "conflict": { - "maximebf/debugbar": "*" - }, "require-dev": { "mockery/mockery": "^1.3.3", "orchestra/testbench-dusk": "^7|^8|^9|^10", @@ -10100,7 +10099,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.2" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.4" }, "funding": [ { @@ -10112,7 +10111,7 @@ "type": "github" } ], - "time": "2025-02-25T15:25:22+00:00" + "time": "2025-04-16T06:32:06+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -10262,16 +10261,16 @@ }, { "name": "cloudcreativity/json-api-testing", - "version": "v6.1.0", + "version": "v6.2.0", "source": { "type": "git", "url": "https://github.com/cloudcreativity/json-api-testing.git", - "reference": "6c7a09b75e4ea250983d5b80f6120f15db9914cb" + "reference": "bb2ff0a87013d40781ca7f959023491d6f1b4ed2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cloudcreativity/json-api-testing/zipball/6c7a09b75e4ea250983d5b80f6120f15db9914cb", - "reference": "6c7a09b75e4ea250983d5b80f6120f15db9914cb", + "url": "https://api.github.com/repos/cloudcreativity/json-api-testing/zipball/bb2ff0a87013d40781ca7f959023491d6f1b4ed2", + "reference": "bb2ff0a87013d40781ca7f959023491d6f1b4ed2", "shasum": "" }, "require": { @@ -10279,7 +10278,7 @@ "illuminate/contracts": "^10.0|^11.0|^12.0", "illuminate/support": "^10.0|^11.0|^12.0", "php": "^8.2", - "phpunit/phpunit": "^10.5|^11.0" + "phpunit/phpunit": "^10.5|^11.0|^12.0" }, "type": "library", "extra": { @@ -10314,22 +10313,22 @@ ], "support": { "issues": "https://github.com/cloudcreativity/json-api/issues", - "source": "https://github.com/cloudcreativity/json-api-testing/tree/v6.1.0" + "source": "https://github.com/cloudcreativity/json-api-testing/tree/v6.2.0" }, - "time": "2025-02-24T20:34:56+00:00" + "time": "2025-04-09T19:15:46+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/134b705ddb0025d397d8318a75825fe3c9d1da34", + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34", "shasum": "" }, "require": { @@ -10373,7 +10372,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.0" + "source": "https://github.com/composer/class-map-generator/tree/1.6.1" }, "funding": [ { @@ -10389,7 +10388,7 @@ "type": "tidelift" } ], - "time": "2025-02-05T10:05:34+00:00" + "time": "2025-03-24T13:50:44+00:00" }, { "name": "composer/pcre", @@ -10586,16 +10585,16 @@ }, { "name": "iamcal/sql-parser", - "version": "v0.5", + "version": "v0.6", "source": { "type": "git", "url": "https://github.com/iamcal/SQLParser.git", - "reference": "644fd994de3b54e5d833aecf406150aa3b66ca88" + "reference": "947083e2dca211a6f12fb1beb67a01e387de9b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/iamcal/SQLParser/zipball/644fd994de3b54e5d833aecf406150aa3b66ca88", - "reference": "644fd994de3b54e5d833aecf406150aa3b66ca88", + "url": "https://api.github.com/repos/iamcal/SQLParser/zipball/947083e2dca211a6f12fb1beb67a01e387de9b62", + "reference": "947083e2dca211a6f12fb1beb67a01e387de9b62", "shasum": "" }, "require-dev": { @@ -10621,46 +10620,46 @@ "description": "MySQL schema parser", "support": { "issues": "https://github.com/iamcal/SQLParser/issues", - "source": "https://github.com/iamcal/SQLParser/tree/v0.5" + "source": "https://github.com/iamcal/SQLParser/tree/v0.6" }, - "time": "2024-03-22T22:46:32+00:00" + "time": "2025-03-17T16:59:46+00:00" }, { "name": "larastan/larastan", - "version": "v3.2.0", + "version": "v3.3.1", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "d84d5a3b6536a586899ad6855a3e098473703690" + "reference": "58bee8be51daf12d78ed0a909be3b205607d2f27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/d84d5a3b6536a586899ad6855a3e098473703690", - "reference": "d84d5a3b6536a586899ad6855a3e098473703690", + "url": "https://api.github.com/repos/larastan/larastan/zipball/58bee8be51daf12d78ed0a909be3b205607d2f27", + "reference": "58bee8be51daf12d78ed0a909be3b205607d2f27", "shasum": "" }, "require": { "ext-json": "*", - "iamcal/sql-parser": "^0.5.0", - "illuminate/console": "^11.41.3 || ^12.0", - "illuminate/container": "^11.41.3 || ^12.0", - "illuminate/contracts": "^11.41.3 || ^12.0", - "illuminate/database": "^11.41.3 || ^12.0", - "illuminate/http": "^11.41.3 || ^12.0", - "illuminate/pipeline": "^11.41.3 || ^12.0", - "illuminate/support": "^11.41.3 || ^12.0", + "iamcal/sql-parser": "^0.6.0", + "illuminate/console": "^11.44.2 || ^12.4.1", + "illuminate/container": "^11.44.2 || ^12.4.1", + "illuminate/contracts": "^11.44.2 || ^12.4.1", + "illuminate/database": "^11.44.2 || ^12.4.1", + "illuminate/http": "^11.44.2 || ^12.4.1", + "illuminate/pipeline": "^11.44.2 || ^12.4.1", + "illuminate/support": "^11.44.2 || ^12.4.1", "php": "^8.2", - "phpstan/phpstan": "^2.1.3" + "phpstan/phpstan": "^2.1.11" }, "require-dev": { "doctrine/coding-standard": "^12.0", - "laravel/framework": "^11.41.3 || ^12.0", - "mockery/mockery": "^1.6", - "nikic/php-parser": "^5.3", - "orchestra/canvas": "^v9.1.3 || ^10.0", - "orchestra/testbench-core": "^9.5.2 || ^10.0", - "phpstan/phpstan-deprecation-rules": "^2.0.0", - "phpunit/phpunit": "^10.5.35 || ^11.3.6" + "laravel/framework": "^11.44.2 || ^12.7.2", + "mockery/mockery": "^1.6.12", + "nikic/php-parser": "^5.4", + "orchestra/canvas": "^v9.2.2 || ^10.0.1", + "orchestra/testbench-core": "^9.12.0 || ^10.1", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpunit/phpunit": "^10.5.35 || ^11.5.15" }, "suggest": { "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" @@ -10708,15 +10707,19 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v3.2.0" + "source": "https://github.com/larastan/larastan/tree/v3.3.1" }, "funding": [ { "url": "https://github.com/canvural", "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" } ], - "time": "2025-03-14T21:54:26+00:00" + "time": "2025-04-03T20:08:04+00:00" }, { "name": "laravel-json-api/testing", @@ -11222,16 +11225,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.8", + "version": "2.1.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f" + "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f9adff3b87c03b12cc7e46a30a524648e497758f", - "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", + "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", "shasum": "" }, "require": { @@ -11276,7 +11279,7 @@ "type": "github" } ], - "time": "2025-03-09T09:30:48+00:00" + "time": "2025-04-16T13:19:18+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -11698,16 +11701,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.14", + "version": "11.5.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9d6046153c2893b521784069e6b5249ce7d2acae" + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9d6046153c2893b521784069e6b5249ce7d2acae", - "reference": "9d6046153c2893b521784069e6b5249ce7d2acae", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fd2e863a2995cdfd864fb514b5e0b28b09895b5c", + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c", "shasum": "" }, "require": { @@ -11779,7 +11782,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.14" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.17" }, "funding": [ { @@ -11795,7 +11798,7 @@ "type": "tidelift" } ], - "time": "2025-03-19T13:45:48+00:00" + "time": "2025-04-08T07:59:11+00:00" }, { "name": "sebastian/cli-parser", diff --git a/config/cer.php b/config/cer.php index 6ef20aebfb..5f358897fd 100644 --- a/config/cer.php +++ b/config/cer.php @@ -28,48 +28,53 @@ return [ 'download_enabled' => env('ENABLE_EXTERNAL_RATES', false), // if currencies are added, default rates must be added as well! - // last exchange rate update: 2024-12-30 // source: https://www.xe.com/currencyconverter/ - 'date' => '2024-12-30', + 'date' => '2025-04-15', // all rates are from EUR to $currency: 'rates' => [ // europa 'EUR' => 1, 'HUF' => 410.79798, - 'GBP' => 0.82858703, - 'UAH' => 43.485934, - 'PLN' => 4.2708542, - 'TRY' => 36.804124, + 'GBP' => 0.86003261, + 'UAH' => 46.867455, + 'PLN' => 4.2802098, + 'TRY' => 43.180054, 'DKK' => 7.4591, - 'RON' => 4.9768699, + 'RON' => 7.4648336, // Americas - 'USD' => 1.0430046, - 'BRL' => 6.4639113, - 'CAD' => 1.5006908, - 'MXN' => 21.249542, + 'USD' => 1.1349044, + 'BRL' => 6.6458518, + 'CAD' => 1.575105, + 'MXN' => 22.805278, // Oceania currencies - 'IDR' => 16860.057, - 'AUD' => 1.6705648, - 'NZD' => 1.8436945, + 'IDR' => 19070.382, + 'AUD' => 1.787202, + 'NZD' => 1.9191078, // africa - 'EGP' => 53.038174, - 'MAD' => 10.521629, - 'ZAR' => 19.460263, + 'EGP' => 57.874172, + 'MAD' => 10.549438, + 'ZAR' => 21.444356, // asia - 'JPY' => 164.74767, - 'RMB' => 7.6138994, - 'CNY' => 7.6138994, - 'RUB' => 108.56771, - 'INR' => 89.157391, + 'JPY' => 162.47195, + 'RMB' => 8.2849977, + 'CNY' => 8.2849977, + 'RUB' => 93.34423, + 'INR' => 97.572815, // int - 'ILS' => 3.8428028, - 'CHF' => 0.94044969, + 'ILS' => 4.1801786, + 'CHF' => 0.92683126, 'HRK' => 7.5345, // replaced by EUR + + 'ISK' => 145.10532, + 'NOK' => 11.980824, + 'SEK' => 11.08809, + 'HKD' => 8.8046322, + 'CZK' => 25.092213, ], ]; diff --git a/config/firefly.php b/config/firefly.php index 95bfbe5881..f83c90da92 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -29,12 +29,10 @@ use FireflyIII\Models\Bill; use FireflyIII\Models\Budget; use FireflyIII\Models\Category; use FireflyIII\Models\PiggyBank; -use FireflyIII\Models\Preference; use FireflyIII\Models\Recurrence; use FireflyIII\Models\Tag; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\Support\Binder\Date; use FireflyIII\TransactionRules\Actions\AddTag; use FireflyIII\TransactionRules\Actions\ClearBudget; use FireflyIII\TransactionRules\Actions\ClearCategory; @@ -57,7 +55,6 @@ use FireflyIII\TransactionRules\Actions\SetSourceAccount; use FireflyIII\TransactionRules\Actions\SetSourceToCashAccount; use FireflyIII\TransactionRules\Actions\SwitchAccounts; use FireflyIII\TransactionRules\Actions\UpdatePiggyBank; -use FireflyIII\User; /* * DO NOT EDIT THIS FILE. IT IS AUTO GENERATED. @@ -81,7 +78,7 @@ return [ 'running_balance_column' => env('USE_RUNNING_BALANCE', false), // see cer.php for exchange rates feature flag. ], - 'version' => '6.2.10', + 'version' => '6.2.11', 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 25, @@ -132,7 +129,7 @@ return [ 'es_ES' => ['name_locale' => 'Español', 'name_english' => 'Spanish'], 'ca_ES' => ['name_locale' => 'Català (Espanya)', 'name_english' => 'Catalan (Spain)'], // 'et_EE' => ['name_locale' => 'Estonian', 'name_english' => 'Estonian'], - // 'fa_IR' => ['name_locale' => 'فارسی', 'name_english' => 'Persian'], + 'fa_IR' => ['name_locale' => 'فارسی', 'name_english' => 'Persian'], 'fi_FI' => ['name_locale' => 'Suomi', 'name_english' => 'Finnish'], 'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French'], // 'he_IL' => ['name_locale' => 'Hebrew', 'name_english' => 'Hebrew'], @@ -187,6 +184,7 @@ return [ 'currencyPreference' => 'EUR', 'language' => 'en_US', 'locale' => 'equal', + 'convertToNative' => false, ], 'default_currency' => 'EUR', 'default_language' => envNonEmpty('DEFAULT_LANGUAGE', 'en_US'), diff --git a/config/mail.php b/config/mail.php index e9742e651a..08356c7a3a 100644 --- a/config/mail.php +++ b/config/mail.php @@ -37,14 +37,19 @@ return [ 'mailers' => [ 'smtp' => [ - 'transport' => 'smtp', - 'host' => envNonEmpty('MAIL_HOST', 'smtp.mailtrap.io'), - 'port' => (int) env('MAIL_PORT', 2525), - 'encryption' => envNonEmpty('MAIL_ENCRYPTION', 'tls'), - 'username' => envNonEmpty('MAIL_USERNAME', 'user@example.com'), - 'password' => envNonEmpty('MAIL_PASSWORD', 'password'), - 'timeout' => null, - 'verify_peer' => null !== env('MAIL_ENCRYPTION'), + 'transport' => 'smtp', + 'host' => envNonEmpty('MAIL_HOST', 'smtp.mailtrap.io'), + 'port' => (int) env('MAIL_PORT', 2525), + 'encryption' => envNonEmpty('MAIL_ENCRYPTION', 'tls'), + 'username' => envNonEmpty('MAIL_USERNAME', 'user@example.com'), + 'password' => envNonEmpty('MAIL_PASSWORD', 'password'), + 'timeout' => null, + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + 'verify_peer' => env('MAIL_VERIFY_PEER', true), + 'allow_self_signed' => env('MAIL_ALLOW_SELF_SIGNED', false), + 'verify_peer_name' => env('MAIL_VERIFY_PEER_NAME', true), ], 'mailersend' => [ 'transport' => 'mailersend', diff --git a/config/translations.php b/config/translations.php index d459268d0b..11d7f037d7 100644 --- a/config/translations.php +++ b/config/translations.php @@ -139,6 +139,7 @@ return [ 'firefly' => [ 'administrations_page_title', 'administrations_index_menu', + 'expires_at', 'temp_administrations_introduction', 'administration_currency_form_help', 'administrations_page_edit_sub_title_js', @@ -339,6 +340,7 @@ return [ 'en_US', 'es_ES', 'ca_ES', + 'fa_IR', 'fi_FI', 'fr_FR', 'hu_HU', diff --git a/database/seeders/TransactionCurrencySeeder.php b/database/seeders/TransactionCurrencySeeder.php index b4110a7264..d21be80335 100644 --- a/database/seeders/TransactionCurrencySeeder.php +++ b/database/seeders/TransactionCurrencySeeder.php @@ -69,10 +69,14 @@ class TransactionCurrencySeeder extends Seeder $currencies[] = ['code' => 'RUB', 'name' => 'Russian ruble', 'symbol' => '₽', 'decimal_places' => 2]; $currencies[] = ['code' => 'INR', 'name' => 'Indian rupee', 'symbol' => '₹', 'decimal_places' => 2]; - // PLEASE ADD NEW CURRENCIES BELOW THIS LINE + // ALL NEW CURRENCIES BELOW THIS LINE $currencies[] = ['code' => 'ILS', 'name' => 'Israeli new shekel', 'symbol' => '₪', 'decimal_places' => 2]; $currencies[] = ['code' => 'CHF', 'name' => 'Swiss franc', 'symbol' => 'CHF', 'decimal_places' => 2]; $currencies[] = ['code' => 'HRK', 'name' => 'Croatian kuna', 'symbol' => 'kn', 'decimal_places' => 2]; + $currencies[] = ['code' => 'HKD', 'name' => 'Hong Kong dollar', 'symbol' => 'HK$', 'decimal_places' => 2]; + $currencies[] = ['code' => 'CHF', 'name' => 'Swiss franc', 'symbol' => 'CHF', 'decimal_places' => 2]; + $currencies[] = ['code' => 'NOK', 'name' => 'Norwegian krone', 'symbol' => 'kr.', 'decimal_places' => 2]; + $currencies[] = ['code' => 'CZK', 'name' => 'Czech koruna', 'symbol' => 'Kč', 'decimal_places' => 2]; foreach ($currencies as $currency) { if (null === TransactionCurrency::where('code', $currency['code'])->first()) { diff --git a/package-lock.json b/package-lock.json index 96cce13f19..0e76a11c0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,42 +13,6 @@ "postcss": "^8.4.47" } }, - "node_modules/@ag-grid-community/client-side-row-model": { - "version": "32.3.4", - "resolved": "https://registry.npmjs.org/@ag-grid-community/client-side-row-model/-/client-side-row-model-32.3.4.tgz", - "integrity": "sha512-AZyLSemPyaCJi8wPJ/wvwow6v4MZKMkg9152TameKvaEf+m+N+gWJNKb1dQoqjgWCgEByqvM6SO8dJtYRrdr/A==", - "license": "MIT", - "dependencies": { - "@ag-grid-community/core": "32.3.4", - "tslib": "^2.3.0" - } - }, - "node_modules/@ag-grid-community/core": { - "version": "32.3.4", - "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-32.3.4.tgz", - "integrity": "sha512-g1CJOQuA4uRx1U3VP9SZLnTJBYdMwCTM348FsubdI6anaqxnHv3X0kridq9v1v26qXbl7yytm5X3v1hPcV8wVA==", - "license": "MIT", - "dependencies": { - "ag-charts-types": "10.3.4", - "tslib": "^2.3.0" - } - }, - "node_modules/@ag-grid-community/infinite-row-model": { - "version": "32.3.4", - "resolved": "https://registry.npmjs.org/@ag-grid-community/infinite-row-model/-/infinite-row-model-32.3.4.tgz", - "integrity": "sha512-GWlUoU9UPGp0ZYdBCiV8R+A/mwdYweoB3HsVOEeQiNZYDC1TQJxiCSKBCCg9qk3KDY+VbJ/6ebV/BUN7cLwIuQ==", - "license": "MIT", - "dependencies": { - "@ag-grid-community/core": "32.3.4", - "tslib": "^2.3.0" - } - }, - "node_modules/@ag-grid-community/styles": { - "version": "33.0.3", - "resolved": "https://registry.npmjs.org/@ag-grid-community/styles/-/styles-33.0.3.tgz", - "integrity": "sha512-1bXrYoVj5TIpLvyjgXHvKnYrC0/JvrdGDdJ3mYfT58GulDt1iNQqhjxMnZB+sxMdQoOc681jmKTGcWzOEDE1Dw==", - "license": "MIT" - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -130,14 +94,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -160,13 +124,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", + "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -187,9 +151,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", - "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", "dev": true, "license": "MIT", "dependencies": { @@ -198,7 +162,7 @@ "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.26.9", + "@babel/traverse": "^7.27.0", "semver": "^6.3.1" }, "engines": { @@ -219,9 +183,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", + "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", "dev": true, "license": "MIT", "dependencies": { @@ -428,27 +392,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -719,13 +683,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", + "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1290,13 +1254,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", + "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1436,9 +1400,9 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", - "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", + "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", "dev": true, "license": "MIT", "dependencies": { @@ -1628,9 +1592,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1640,32 +1604,32 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1674,9 +1638,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, "license": "MIT", "dependencies": { @@ -1709,9 +1673,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", "cpu": [ "ppc64" ], @@ -1726,9 +1690,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", "cpu": [ "arm" ], @@ -1743,9 +1707,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", "cpu": [ "arm64" ], @@ -1760,9 +1724,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", "cpu": [ "x64" ], @@ -1777,9 +1741,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", "cpu": [ "arm64" ], @@ -1794,9 +1758,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", "cpu": [ "x64" ], @@ -1811,9 +1775,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", "cpu": [ "arm64" ], @@ -1828,9 +1792,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", "cpu": [ "x64" ], @@ -1845,9 +1809,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", "cpu": [ "arm" ], @@ -1862,9 +1826,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", "cpu": [ "arm64" ], @@ -1879,9 +1843,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", "cpu": [ "ia32" ], @@ -1896,9 +1860,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", "cpu": [ "loong64" ], @@ -1913,9 +1877,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", "cpu": [ "mips64el" ], @@ -1930,9 +1894,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", "cpu": [ "ppc64" ], @@ -1947,9 +1911,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", "cpu": [ "riscv64" ], @@ -1964,9 +1928,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", "cpu": [ "s390x" ], @@ -1981,9 +1945,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", "cpu": [ "x64" ], @@ -1998,9 +1962,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", "cpu": [ "arm64" ], @@ -2015,9 +1979,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", "cpu": [ "x64" ], @@ -2032,9 +1996,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", "cpu": [ "arm64" ], @@ -2049,9 +2013,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", "cpu": [ "x64" ], @@ -2066,9 +2030,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", "cpu": [ "x64" ], @@ -2083,9 +2047,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", "cpu": [ "arm64" ], @@ -2100,9 +2064,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", "cpu": [ "ia32" ], @@ -2117,9 +2081,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", "cpu": [ "x64" ], @@ -2591,9 +2555,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", - "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", "cpu": [ "arm" ], @@ -2605,9 +2569,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", - "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", "cpu": [ "arm64" ], @@ -2619,9 +2583,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", - "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", "cpu": [ "arm64" ], @@ -2633,9 +2597,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", - "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", "cpu": [ "x64" ], @@ -2647,9 +2611,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", - "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", "cpu": [ "arm64" ], @@ -2661,9 +2625,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", - "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", "cpu": [ "x64" ], @@ -2675,9 +2639,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", - "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", "cpu": [ "arm" ], @@ -2689,9 +2653,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", - "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", "cpu": [ "arm" ], @@ -2703,9 +2667,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", - "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", "cpu": [ "arm64" ], @@ -2717,9 +2681,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", - "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", "cpu": [ "arm64" ], @@ -2731,9 +2695,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", - "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", "cpu": [ "loong64" ], @@ -2745,9 +2709,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", - "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", "cpu": [ "ppc64" ], @@ -2759,9 +2723,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", - "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", "cpu": [ "riscv64" ], @@ -2773,9 +2751,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", - "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", "cpu": [ "s390x" ], @@ -2787,9 +2765,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", - "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", "cpu": [ "x64" ], @@ -2801,9 +2779,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", - "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", "cpu": [ "x64" ], @@ -2815,9 +2793,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", - "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", "cpu": [ "arm64" ], @@ -2829,9 +2807,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", - "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", "cpu": [ "ia32" ], @@ -2843,9 +2821,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", - "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", "cpu": [ "x64" ], @@ -2881,9 +2859,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -2902,9 +2880,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { @@ -2987,9 +2965,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, @@ -3133,13 +3111,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-forge": { @@ -3231,9 +3209,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { @@ -3643,12 +3621,6 @@ "integrity": "sha512-q2VoAOu1DtZ7z41M2gQ05VMNYkFCAMxFU+j/HUMwCOlr/e3VhO+qww2SGJw4OxBw5nZQ7YV78+wK2RiB7ConzQ==", "license": "MIT" }, - "node_modules/ag-charts-types": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/ag-charts-types/-/ag-charts-types-10.3.4.tgz", - "integrity": "sha512-MU+3gvKn1jEyLlMHS0Vu0nHmIQxiVJAnA6ftUatLZvV0c7hOWap4VWghqZ0cVZUJsCdMI59Iuq1u3xquKv4LOQ==", - "license": "MIT" - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4132,9 +4104,9 @@ "license": "ISC" }, "node_modules/bootstrap": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz", + "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==", "funding": [ { "type": "github", @@ -4158,15 +4130,15 @@ "license": "MIT" }, "node_modules/bootstrap5-autocomplete": { - "version": "1.1.38", - "resolved": "https://registry.npmjs.org/bootstrap5-autocomplete/-/bootstrap5-autocomplete-1.1.38.tgz", - "integrity": "sha512-gw/66uyiKL+XioGxnIdzFwyvma/KlbD/hNIwnIAhzb1TNTWSFURPqOzMXaDuw2vD0DCtASjsJm4uydAzlaDaZQ==", + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/bootstrap5-autocomplete/-/bootstrap5-autocomplete-1.1.39.tgz", + "integrity": "sha512-jsOqej5/hI2fTSlYqbuVt7EbJcGrUXH984jiNlgUk+nbh46vIcVimo/eIg0iqcDqs/sJvXD9O38XGV2XpVU7sA==", "license": "MIT" }, "node_modules/bootstrap5-tags": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/bootstrap5-tags/-/bootstrap5-tags-1.7.7.tgz", - "integrity": "sha512-1rgN2OLM9PQlQxeKUFUN9Tay246Zn7rK0p6p+ZaG2Q2VXPkZaZ+3EDYh3LOofvlHS50mL/Uthk9AoOxtdz6drA==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/bootstrap5-tags/-/bootstrap5-tags-1.7.10.tgz", + "integrity": "sha512-affAvDcyny6/YU/oZD4U61m9KKIP3pE33041lLrH7oDEKRZN7oWi2TeA0QwWzIyPH0AgsBWET0+ILb04CKyqNw==", "license": "MIT" }, "node_modules/brace-expansion": { @@ -4448,9 +4420,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001706", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", - "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", + "version": "1.0.30001715", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", + "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", "dev": true, "funding": [ { @@ -4496,9 +4468,9 @@ } }, "node_modules/chart.js": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz", - "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", + "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -5663,9 +5635,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.123", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", - "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", + "version": "1.5.139", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.139.tgz", + "integrity": "sha512-GGnRYOTdN5LYpwbIr0rwP/ZHOQSvAF6TG0LSzp28uCBb9JiXHJGmaaKw29qjNJc5bGnnp6kXJqRnGMQoELwi5w==", "dev": true, "license": "ISC" }, @@ -5826,9 +5798,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5839,31 +5811,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" } }, "node_modules/escalade": { @@ -6767,9 +6739,9 @@ } }, "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "dev": true, "funding": [ { @@ -6943,9 +6915,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", - "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "dev": true, "license": "MIT" }, @@ -6965,9 +6937,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7185,9 +7157,9 @@ } }, "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", + "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", "dev": true, "license": "MIT" }, @@ -10020,13 +9992,13 @@ } }, "node_modules/rollup": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", - "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", + "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -10036,25 +10008,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.36.0", - "@rollup/rollup-android-arm64": "4.36.0", - "@rollup/rollup-darwin-arm64": "4.36.0", - "@rollup/rollup-darwin-x64": "4.36.0", - "@rollup/rollup-freebsd-arm64": "4.36.0", - "@rollup/rollup-freebsd-x64": "4.36.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", - "@rollup/rollup-linux-arm-musleabihf": "4.36.0", - "@rollup/rollup-linux-arm64-gnu": "4.36.0", - "@rollup/rollup-linux-arm64-musl": "4.36.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", - "@rollup/rollup-linux-riscv64-gnu": "4.36.0", - "@rollup/rollup-linux-s390x-gnu": "4.36.0", - "@rollup/rollup-linux-x64-gnu": "4.36.0", - "@rollup/rollup-linux-x64-musl": "4.36.0", - "@rollup/rollup-win32-arm64-msvc": "4.36.0", - "@rollup/rollup-win32-ia32-msvc": "4.36.0", - "@rollup/rollup-win32-x64-msvc": "4.36.0", + "@rollup/rollup-android-arm-eabi": "4.40.0", + "@rollup/rollup-android-arm64": "4.40.0", + "@rollup/rollup-darwin-arm64": "4.40.0", + "@rollup/rollup-darwin-x64": "4.40.0", + "@rollup/rollup-freebsd-arm64": "4.40.0", + "@rollup/rollup-freebsd-x64": "4.40.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", + "@rollup/rollup-linux-arm-musleabihf": "4.40.0", + "@rollup/rollup-linux-arm64-gnu": "4.40.0", + "@rollup/rollup-linux-arm64-musl": "4.40.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-musl": "4.40.0", + "@rollup/rollup-linux-s390x-gnu": "4.40.0", + "@rollup/rollup-linux-x64-gnu": "4.40.0", + "@rollup/rollup-linux-x64-musl": "4.40.0", + "@rollup/rollup-win32-arm64-msvc": "4.40.0", + "@rollup/rollup-win32-ia32-msvc": "4.40.0", + "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" } }, @@ -10110,9 +10083,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", - "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", + "version": "1.86.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz", + "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==", "dev": true, "license": "MIT", "dependencies": { @@ -10688,9 +10661,9 @@ } }, "node_modules/std-env": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", - "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, "license": "MIT" }, @@ -11041,6 +11014,51 @@ "node": ">=0.6.0" } }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -11094,6 +11112,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/tty-browserify": { @@ -11133,9 +11152,9 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -11330,15 +11349,18 @@ } }, "node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz", + "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.3", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.12" }, "bin": { "vite": "bin/vite.js" @@ -11419,6 +11441,34 @@ "dev": true, "license": "MIT" }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -11619,9 +11669,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.99.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.6.tgz", + "integrity": "sha512-TJOLrJ6oeccsGWPl7ujCYuc0pIq2cNsuD6GZDma8i5o5Npvcco/z+NKvZSFsP0/x6SShVb0+X2JK/JHUjKY9dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12210,9 +12260,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "dev": true, "license": "ISC", "bin": { @@ -12276,18 +12326,14 @@ "resources/assets/v2": { "hasInstallScript": true, "dependencies": { - "@ag-grid-community/client-side-row-model": "^32.0.2", - "@ag-grid-community/core": "^32.0.2", - "@ag-grid-community/infinite-row-model": "^32.0.2", - "@ag-grid-community/styles": "^33.0.2", "@fortawesome/fontawesome-free": "^6.4.0", "@popperjs/core": "^2.11.8", - "admin-lte": "^4.0.0-alpha3", + "admin-lte": "^4.0.0-beta3", "alpinejs": "^3.13.7", - "bootstrap": "^5.3.0", - "bootstrap5-autocomplete": "^1.1.22", - "bootstrap5-tags": "^1.7", - "chart.js": "^4.4.0", + "bootstrap": "^5", + "bootstrap5-autocomplete": "^1", + "bootstrap5-tags": "^1", + "chart.js": "^4", "chartjs-adapter-date-fns": "^3.0.0", "chartjs-chart-sankey": "^0.14.0", "date-fns": "^4.0.0", @@ -12299,10 +12345,10 @@ "store": "^2.0.12" }, "devDependencies": { - "axios": "^1.8.2", - "laravel-vite-plugin": "^1.0.5", - "patch-package": "^8.0.0", - "sass": "^1.78.0", + "axios": "^1", + "laravel-vite-plugin": "^1", + "patch-package": "^8", + "sass": "^1", "vite": "^6", "vite-plugin-manifest-sri": "^0.2.0" } diff --git a/public/v1/js/ff/index.js b/public/v1/js/ff/index.js index c955778848..496eb93270 100644 --- a/public/v1/js/ff/index.js +++ b/public/v1/js/ff/index.js @@ -80,11 +80,18 @@ function drawChart() { // left to spend if (key.substring(0, 17) === 'left-to-spend-in-') { - left_to_spend_top.push(data[key].value_parsed); - left_to_spend_bottom.push(data[key].sub_title); - if (parseFloat(data[key].monetary_value) > 0) { + if(true === data[key].no_available_budgets) { + left_to_spend_top.push('---'); + left_to_spend_bottom.push('---'); keepGreen = true; } + if(false === data[key].no_available_budgets) { + left_to_spend_top.push(data[key].value_parsed); + left_to_spend_bottom.push(data[key].sub_title); + if (parseFloat(data[key].monetary_value) > 0) { + keepGreen = true; + } + } } // net worth diff --git a/releases.md b/releases.md index 4dc698ef1b..bf8452b5de 100644 --- a/releases.md +++ b/releases.md @@ -16,7 +16,8 @@ The different alpha and beta builds will be compiled from their corresponding ta ### Minor Release Support Matrix | Version | Supported | |----------------------------------|--------------------| -| Firefly III v6.1.x | :white_check_mark: | +| Firefly III v6.2.x | :white_check_mark: | +| Firefly III v6.1.x | :x: | | Firefly III v6.0.x | :x: | | Firefly III v5.8.x | :x: | | Firefly III v5.7.x | :x: | diff --git a/resources/assets/v1/src/components/passport/PersonalAccessTokens.vue b/resources/assets/v1/src/components/passport/PersonalAccessTokens.vue index ffa0dea671..e6b7615ab4 100644 --- a/resources/assets/v1/src/components/passport/PersonalAccessTokens.vue +++ b/resources/assets/v1/src/components/passport/PersonalAccessTokens.vue @@ -47,6 +47,7 @@ {{ $t('firefly.name') }} + {{ $t('firefly.expires_at') }} @@ -57,6 +58,10 @@ {{ token.name }} + + + {{ new Date(token.expires_at).toLocaleString() }} + @@ -232,7 +237,7 @@ export default { }, /** - * Get all of the available scopes. + * Get all the available scopes. */ getScopes() { axios.get('./oauth/scopes') diff --git a/resources/assets/v1/src/locales/bg.json b/resources/assets/v1/src/locales/bg.json index be6391b70d..7d2fed816a 100644 --- a/resources/assets/v1/src/locales/bg.json +++ b/resources/assets/v1/src/locales/bg.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/ca.json b/resources/assets/v1/src/locales/ca.json index 8aa0bff5cd..5743119b09 100644 --- a/resources/assets/v1/src/locales/ca.json +++ b/resources/assets/v1/src/locales/ca.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/cs.json b/resources/assets/v1/src/locales/cs.json index 7e869bb037..12673a2cca 100644 --- a/resources/assets/v1/src/locales/cs.json +++ b/resources/assets/v1/src/locales/cs.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", @@ -103,7 +104,7 @@ "profile_oauth_confidential": "Soukrom\u00e1 aplikace", "profile_oauth_confidential_help": "Po\u017eadovat aby se klienti autorizovali. Soukrom\u00e9 aplikace mohou bezpe\u010dn\u011b pracovat s p\u0159\u00edstupov\u00fdmi \u00fadaji bez toho aby je zve\u0159ejnily. Ve\u0159ejn\u00e9 aplikace, nativn\u00ed nebo JavaScriptov\u00e9 SPA, toho schopn\u00e9 nejsou.", "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_withdrawal": "Zdrojov\u00fd \u00fa\u010del v\u0161ech n\u00e1sleduj\u00edc\u00edch rozd\u011blen\u00ed je ovl\u00e1dan\u00fd zdrojov\u00fdm \u00fa\u010dtem prvn\u00edho rozd\u011blen\u00ed transakce.", + "multi_account_warning_withdrawal": "Zdrojov\u00fd \u00fa\u010det cel\u00e9 transakce je ovl\u00e1dan\u00fd prvn\u00edm rozd\u011blen\u00edm.", "multi_account_warning_deposit": "C\u00edlov\u00fd \u00fa\u010del v\u0161ech n\u00e1sleduj\u00edc\u00edch rozd\u011blen\u00ed je ovl\u00e1dan\u00fd c\u00edlov\u00fdm \u00fa\u010dtem prvn\u00edho rozd\u011blen\u00ed transakce.", "multi_account_warning_transfer": "Zdrojov\u00fd i c\u00edlov\u00fd \u00fa\u010det v\u0161ech n\u00e1sleduj\u00edc\u00edch rozd\u011blen\u00ed jsou ovl\u00e1d\u00e1ny zdrojov\u00fdm a c\u00edlov\u00fdm \u00fa\u010dtem prvn\u00edho rozd\u011blen\u00ed transakce.", "webhook_trigger_STORE_TRANSACTION": "Po vytvo\u0159en\u00ed transakce", diff --git a/resources/assets/v1/src/locales/da.json b/resources/assets/v1/src/locales/da.json index a00d632dd7..24a49b6eb8 100644 --- a/resources/assets/v1/src/locales/da.json +++ b/resources/assets/v1/src/locales/da.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/de.json b/resources/assets/v1/src/locales/de.json index fbb1a252cc..c6305cab2f 100644 --- a/resources/assets/v1/src/locales/de.json +++ b/resources/assets/v1/src/locales/de.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Finanzverwaltungen", "administrations_index_menu": "Finanzverwaltung", + "expires_at": "G\u00fcltig bis", "temp_administrations_introduction": "Firefly III wird bald die M\u00f6glichkeit erhalten, mehrere Finanzverwaltungen zu verwalten. Im Moment verf\u00fcgen Sie nur \u00fcber eine. Sie k\u00f6nnen den Titel dieser Verwaltung und ihre eigene W\u00e4hrung festlegen. Dies ersetzt die bisherige Einstellung, bei der Sie Ihre \u201eStandardw\u00e4hrung\u201c festlegen konnten. Diese Einstellung ist jetzt an die Finanzverwaltung gebunden und kann f\u00fcr jede Verwaltung unterschiedlich sein.", "administration_currency_form_help": "Es kann l\u00e4nger dauern, bis die Seite geladen ist, wenn Sie die Landesw\u00e4hrung \u00e4ndern, da die Buchungen m\u00f6glicherweise in Ihre (neue) Landesw\u00e4hrung umgerechnet werden m\u00fcssen.", "administrations_page_edit_sub_title_js": "Finanzverwaltung \u201e{title}\u201c bearbeiten", diff --git a/resources/assets/v1/src/locales/el.json b/resources/assets/v1/src/locales/el.json index c219de050d..77c7086820 100644 --- a/resources/assets/v1/src/locales/el.json +++ b/resources/assets/v1/src/locales/el.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/en-gb.json b/resources/assets/v1/src/locales/en-gb.json index 996d233d6c..c98446f715 100644 --- a/resources/assets/v1/src/locales/en-gb.json +++ b/resources/assets/v1/src/locales/en-gb.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/en.json b/resources/assets/v1/src/locales/en.json index aaf38add1a..9effd02cb4 100644 --- a/resources/assets/v1/src/locales/en.json +++ b/resources/assets/v1/src/locales/en.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/es.json b/resources/assets/v1/src/locales/es.json index d11c4a0f90..2cf2af2535 100644 --- a/resources/assets/v1/src/locales/es.json +++ b/resources/assets/v1/src/locales/es.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", @@ -46,7 +47,7 @@ "tags": "Etiquetas", "no_budget": "(sin presupuesto)", "no_bill": "(no subscription)", - "category": "Categoria", + "category": "Categor\u00eda", "attachments": "Archivos adjuntos", "notes": "Notas", "external_url": "URL externa", @@ -141,13 +142,13 @@ "reset_webhook_secret": "Restablecer secreto del webhook", "header_exchange_rates": "Exchange rates", "exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in the documentation<\/a>.", - "exchange_rates_from_to": "Between {from} and {to} (and the other way around)", - "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_from_to": "Entre {from} y {to} (y viceversa)", + "exchange_rates_intro_rates": "Firefly III utiliza los siguientes tipos de cambio. El inverso se calcula autom\u00e1ticamente cuando no se proporciona. Si no existe un tipo de cambio para la fecha de la transacci\u00f3n, Firefly III retroceder\u00e1 en el tiempo para encontrar uno. Si no hay ninguno presente, se usar\u00e1 la tasa \"1\".", "header_exchange_rates_rates": "Exchange rates", - "header_exchange_rates_table": "Table with exchange rates", - "help_rate_form": "On this day, how many {to} will you get for one {from}?", - "add_new_rate": "Add a new exchange rate", - "save_new_rate": "Save new rate" + "header_exchange_rates_table": "Tabla con tipos de cambio", + "help_rate_form": "En este d\u00eda, \u00bfcu\u00e1nto {to} conseguir\u00e1s por un {from}?", + "add_new_rate": "Agregar un nuevo tipo de cambio", + "save_new_rate": "Guardar nuevo tipo de cambio" }, "form": { "url": "URL", @@ -182,6 +183,6 @@ }, "config": { "html_language": "es", - "date_time_fns": "El MMMM hacer, yyyy a las HH:mm:ss" + "date_time_fns": "'El' d 'de' MMMM 'de' yyyy 'a las' HH:mm:ss" } } \ No newline at end of file diff --git a/resources/assets/v1/src/locales/fa.json b/resources/assets/v1/src/locales/fa.json new file mode 100644 index 0000000000..dc395c9c28 --- /dev/null +++ b/resources/assets/v1/src/locales/fa.json @@ -0,0 +1,188 @@ +{ + "firefly": { + "administrations_page_title": "Financial administrations", + "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", + "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 native 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.", + "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", + "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", + "table": "\u062c\u062f\u0648\u0644", + "welcome_back": "\u0686\u0647 \u062e\u0628\u0631\u061f", + "flash_error": "\u062e\u0637\u0627!", + "flash_warning": "\u0647\u0634\u062f\u0627\u0631!", + "flash_success": "\u0645\u0648\u0641\u0642\u06cc\u062a!", + "close": "\u0628\u0633\u062a\u0646", + "select_dest_account": "Please select or type a valid destination account name", + "select_source_account": "Please select or type a valid source account name", + "split_transaction_title": "\u0634\u0631\u062d \u062a\u0631\u0627\u06a9\u0646\u0634 \u062a\u0642\u0633\u06cc\u0645\n", + "errors_submission": "\u0645\u0634\u06a9\u0644\u06cc \u062f\u0631 \u0627\u0631\u0633\u0627\u0644 \u0634\u0645\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a. \u0644\u0637\u0641\u0627\u064b \u062e\u0637\u0627\u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.\n", + "is_reconciled": "Is reconciled", + "split": "\u062a\u0641\u06a9\u06cc\u06a9", + "single_split": "\u062a\u0641\u06a9\u06cc\u06a9", + "not_enough_currencies": "Not enough currencies", + "not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.", + "transaction_stored_link": "\u0645\u0639\u0627\u0645\u0644\u0647 \u0634\u0645\u0627\u0631\u0647{ID} (\"{title}\")<\/a> \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.\n", + "webhook_stored_link": "Webhooks #{ID} (\"{title}\")<\/a> \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.\n", + "webhook_updated_link": "Webhooks #{ID}<\/a> (\"{title}\") \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.\n", + "transaction_updated_link": "\u0645\u0639\u0627\u0645\u0644\u0647 \u0634\u0645\u0627\u0631\u0647{ID}<\/a> (\"{title}\") \u0628\u0647 \u0631\u0648\u0632 \u0634\u062f\u0647 \u0627\u0633\u062a.\n", + "transaction_new_stored_link": "\u0645\u0639\u0627\u0645\u0644\u0647 \u0634\u0645\u0627\u0631\u0647{ID}<\/a> \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.\n", + "transaction_journal_information": "\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062a\u0631\u0627\u06a9\u0646\u0634", + "submission_options": "\u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u0631\u0633\u0627\u0644\n", + "apply_rules_checkbox": "\u0642\u0648\u0627\u0646\u06cc\u0646 \u0631\u0627 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f\n", + "fire_webhooks_checkbox": "\u0648\u0628\u200c\u0647\u0648\u06a9\u200c\u0647\u0627\u06cc \u0622\u062a\u0634\u06cc\u0646\n\n\n\n\n\n", + "no_budget_pointer": "\u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0647\u0646\u0648\u0632 \u0628\u0648\u062f\u062c\u0647 \u0627\u06cc \u0646\u062f\u0627\u0631\u06cc\u062f. \u0628\u0627\u06cc\u062f \u0645\u0642\u062f\u0627\u0631\u06cc \u0631\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 \u0628\u0648\u062f\u062c\u0647\u200c\u0647\u0627<\/a> \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0628\u0648\u062f\u062c\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0634\u0645\u0627 \u062f\u0631 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u0647\u0632\u06cc\u0646\u0647 \u0647\u0627 \u06a9\u0645\u06a9 \u06a9\u0646\u062f.\n", + "no_bill_pointer": "You seem to have no subscription yet. You should create some on the subscription<\/a>-page. Subscriptions can help you keep track of expenses.", + "source_account": "\u062d\u0633\u0627\u0628 \u0645\u0646\u0628\u0639\n", + "hidden_fields_preferences": "\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u06af\u0632\u06cc\u0646\u0647\u200c\u0647\u0627\u06cc \u062a\u0631\u0627\u06a9\u0646\u0634 \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0627 \u062f\u0631 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a<\/a> \u062e\u0648\u062f \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f.\n", + "destination_account": "\u062d\u0633\u0627\u0628 \u0645\u0642\u0635\u062f\n", + "add_another_split": "\u06cc\u06a9 \u062a\u0642\u0633\u06cc\u0645 \u062f\u06cc\u06af\u0631 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f\n", + "submission": "\u0627\u0631\u0633\u0627\u0644", + "stored_journal": "\u062a\u0631\u0627\u06a9\u0646\u0634 \u062c\u062f\u06cc\u062f \":description\" \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\n", + "create_another": "\u067e\u0633 \u0627\u0632 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc\u060c \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0647 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0627\u0632\u06af\u0631\u062f\u06cc\u062f.\n", + "reset_after": "\u0628\u0627\u0632\u0646\u0634\u0627\u0646\u06cc \u0641\u0631\u0645 \u067e\u0633 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644\n", + "submit": "\u0627\u0631\u0633\u0627\u0644", + "amount": "\u0645\u0628\u0644\u063a", + "date": "\u062a\u0627\u0631\u06cc\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.", + "tags": "\u0628\u0631\u0686\u0633\u0628\u200c\u0647\u0627", + "no_budget": "(\u0628\u062f\u0648\u0646 \u0628\u0648\u062f\u062c\u0647)\n", + "no_bill": "(no subscription)", + "category": "\u062f\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc", + "attachments": "\u067e\u06cc\u0648\u0633\u062a\u200c\u0647\u0627", + "notes": "\u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "external_url": "\u0622\u062f\u0631\u0633 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u062e\u0627\u0631\u062c\u06cc", + "update_transaction": "\u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u062a\u0631\u0627\u06a9\u0646\u0634\n", + "after_update_create_another": "\u067e\u0633 \u0627\u0632 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc\u060c \u0628\u0631\u0627\u06cc \u0627\u062f\u0627\u0645\u0647 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0628\u0647 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0627\u0632\u06af\u0631\u062f\u06cc\u062f.\n", + "store_as_new": "\u0630\u062e\u06cc\u0631\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0631\u0627\u06a9\u0646\u0634 \u062c\u062f\u06cc\u062f \u0628\u0647 \u062c\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc.\n", + "split_title_help": "\u0627\u06af\u0631 \u06cc\u06a9 \u062a\u0631\u0627\u06a9\u0646\u0634 \u062a\u0642\u0633\u06cc\u0645 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f\u060c \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062a\u0648\u0636\u06cc\u062d \u06a9\u0644\u06cc \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u062a\u0642\u0633\u06cc\u0645\u200c\u0628\u0646\u062f\u06cc\u200c\u0647\u0627\u06cc \u062a\u0631\u0627\u06a9\u0646\u0634 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.\n", + "none_in_select_list": "(\u0647\u06cc\u0686)", + "no_piggy_bank": "\u0628\u062f\u0648\u0646 \u0635\u0646\u062f\u0648\u0642\u0686\u0647\n\n", + "description": "\u062a\u0648\u0636\u06cc\u062d\u0627\u062a", + "split_transaction_title_help": "\u0627\u06af\u0631 \u06cc\u06a9 \u062a\u0631\u0627\u06a9\u0646\u0634 \u062a\u0642\u0633\u06cc\u0645 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f\u060c \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062a\u0648\u0636\u06cc\u062d \u06a9\u0644\u06cc \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u062a\u0642\u0633\u06cc\u0645\u200c\u0628\u0646\u062f\u06cc\u200c\u0647\u0627\u06cc \u062a\u0631\u0627\u06a9\u0646\u0634 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.\n", + "destination_account_reconciliation": "\u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062d\u0633\u0627\u0628 \u0645\u0642\u0635\u062f \u062a\u0631\u0627\u06a9\u0646\u0634 \u062a\u0637\u0628\u06cc\u0642 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f.\n", + "source_account_reconciliation": "\u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062d\u0633\u0627\u0628 \u0645\u0646\u0628\u0639 \u06cc\u06a9 \u062a\u0631\u0627\u06a9\u0646\u0634 \u062a\u0637\u0628\u06cc\u0642 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f.\n", + "budget": "\u0628\u0648\u062f\u062c\u0647", + "bill": "Subscription", + "you_create_withdrawal": "\u0634\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0628\u0631\u062f\u0627\u0634\u062a \u0647\u0633\u062a\u06cc\u062f.\n", + "you_create_transfer": "\u0634\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0627\u0646\u062a\u0642\u0627\u0644 \u0647\u0633\u062a\u06cc\u062f.\n", + "you_create_deposit": "\u0634\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0633\u067e\u0631\u062f\u0647 \u0647\u0633\u062a\u06cc\u062f.\n", + "edit": "\u0648\u06cc\u0631\u0627\u06cc\u0634", + "delete": "\u062d\u0630\u0641", + "name": "\u0646\u0627\u0645", + "profile_whoops": "\u0627\u0648\u0647!", + "profile_something_wrong": "\u0645\u0634\u06a9\u0644\u06cc \u067e\u06cc\u0634 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a!\n\n\n\n\n\n", + "profile_try_again": "\u0645\u0634\u06a9\u0644\u06cc \u067e\u06cc\u0634 \u0622\u0645\u062f. \u0644\u0637\u0641\u0627 \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0644\u0627\u0634 \u06a9\u0646\u06cc\u062f.\n", + "profile_oauth_clients": "\u0645\u0634\u062a\u0631\u06cc\u200c\u0647\u0627\u06cc OAuth\n\n\n\n\n\n", + "profile_oauth_no_clients": "\u0634\u0645\u0627 \u0647\u06cc\u0686 \u0645\u0634\u062a\u0631\u06cc OAuth \u0627\u06cc\u062c\u0627\u062f \u0646\u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u062f.\n\n\n\n\n\n", + "profile_oauth_clients_header": "\u0645\u0634\u062a\u0631\u06cc\u200c\u0647\u0627", + "profile_oauth_client_id": "\u0634\u0646\u0627\u0633\u0647 \u0645\u0634\u062a\u0631\u06cc", + "profile_oauth_client_name": "\u0646\u0627\u0645", + "profile_oauth_client_secret": "\u0645\u062d\u0631\u0645\u0627\u0646\u0647", + "profile_oauth_create_new_client": "\u0645\u0634\u062a\u0631\u06cc \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f\n", + "profile_oauth_create_client": "\u0645\u0634\u062a\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f\n", + "profile_oauth_edit_client": "\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0645\u0634\u062a\u0631\u06cc\n\n\n\n\n\n", + "profile_oauth_name_help": "\u0686\u06cc\u0632\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0634\u0645\u0627 \u0645\u06cc \u0634\u0646\u0627\u0633\u0646\u062f \u0648 \u0628\u0647 \u0622\u0646 \u0627\u0639\u062a\u0645\u0627\u062f \u0645\u06cc \u06a9\u0646\u0646\u062f.\n", + "profile_oauth_redirect_url": "\u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 URL\n", + "profile_oauth_clients_external_auth": "\u0627\u06af\u0631 \u0627\u0632 \u06cc\u06a9 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062e\u0627\u0631\u062c\u06cc \u0645\u0627\u0646\u0646\u062f Authelia \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c OAuth Clients \u06a9\u0627\u0631 \u0646\u0645\u06cc \u06a9\u0646\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0641\u0642\u0637 \u0627\u0632 \u0631\u0645\u0632\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u062e\u0635\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.\n", + "profile_oauth_redirect_url_help": "URL \u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u062a\u0645\u0627\u0633 \u0645\u062c\u0648\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627.\n", + "profile_authorized_apps": "\u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0645\u062c\u0627\u0632\n", + "profile_authorized_clients": "\u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0645\u062c\u0627\u0632\n", + "profile_scopes": "\u0645\u062d\u062f\u0648\u062f\u0647 \u0647\u0627", + "profile_revoke": "\u0644\u063a\u0648", + "profile_personal_access_tokens": "\u062a\u0648\u06a9\u0646 \u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u062e\u0635\u06cc\n", + "profile_personal_access_token": "\u062a\u0648\u06a9\u0646 \u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u062e\u0635\u06cc\n", + "profile_personal_access_token_explanation": "\u0627\u06cc\u0646 \u0631\u0645\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u062e\u0635\u06cc \u062c\u062f\u06cc\u062f \u0634\u0645\u0627\u0633\u062a. \u0627\u06cc\u0646 \u062a\u0646\u0647\u0627 \u0628\u0627\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f\u060c \u067e\u0633 \u0622\u0646 \u0631\u0627 \u0627\u0632 \u062f\u0633\u062a \u0646\u062f\u0647\u06cc\u062f! \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0646\u0634\u0627\u0646\u0647 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc API \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.\n", + "profile_no_personal_access_token": "\u0634\u0645\u0627 \u0647\u06cc\u0686 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u062e\u0635\u06cc \u0627\u06cc\u062c\u0627\u062f \u0646\u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f.\n", + "profile_create_new_token": "\u062a\u0648\u06a9\u0646 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f\n", + "profile_create_token": "\u0627\u06cc\u062c\u0627\u062f \u062a\u0648\u06a9\u0646", + "profile_create": "\u0627\u06cc\u062c\u0627\u062f", + "profile_save_changes": "\u0630\u062e\u06cc\u0631\u0647\u0654 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a", + "default_group_title_name": "(\u06af\u0631\u0648\u0647 \u0628\u0646\u062f\u06cc \u0646\u0634\u062f\u0647)\n", + "piggy_bank": "\u0635\u0646\u062f\u0648\u0642 \u067e\u0633\u200c\u0627\u0646\u062f\u0627\u0632\n\n\n\n\n\n", + "profile_oauth_client_secret_title": "\u0631\u0627\u0632 \u0645\u0634\u062a\u0631\u06cc", + "profile_oauth_client_secret_expl": "\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0631\u0627\u0632 \u0645\u0634\u062a\u0631\u06cc \u062c\u062f\u06cc\u062f \u0634\u0645\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0627\u06cc\u0646 \u062a\u0646\u0647\u0627 \u0628\u0627\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f\u060c \u067e\u0633 \u0622\u0646 \u0631\u0627 \u0627\u0632 \u062f\u0633\u062a \u0646\u062f\u0647\u06cc\u062f! \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0627\u0632 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc API \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.\n", + "profile_oauth_confidential": "\u0645\u062d\u0631\u0645\u0627\u0646\u0647", + "profile_oauth_confidential_help": "\u0627\u0632 \u0645\u0634\u062a\u0631\u06cc \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0627 \u06cc\u06a9 \u0631\u0627\u0632 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0646\u062f. \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0645\u062d\u0631\u0645\u0627\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0627\u0639\u062a\u0628\u0627\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0634\u06cc \u0627\u0645\u0646 \u0648 \u0628\u062f\u0648\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0622\u0646\u0647\u0627 \u062f\u0631 \u0645\u0639\u0631\u0636 \u0627\u0634\u062e\u0627\u0635 \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u06a9\u0646\u0646\u062f. \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc\u060c \u0645\u0627\u0646\u0646\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062f\u0633\u06a9\u062a\u0627\u067e \u0628\u0648\u0645\u06cc \u06cc\u0627 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a SPA\u060c \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0627\u0633\u0631\u0627\u0631 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0627\u06cc\u0645\u0646 \u0646\u06af\u0647 \u062f\u0627\u0631\u0646\u062f.\n", + "multi_account_warning_unknown": "\u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u0648\u0639 \u062a\u0631\u0627\u06a9\u0646\u0634\u06cc \u06a9\u0647 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f\u060c \u062d\u0633\u0627\u0628 \u0645\u0646\u0628\u0639 \u0648\/\u06cc\u0627 \u0645\u0642\u0635\u062f \u062a\u0642\u0633\u06cc\u0645\u200c\u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0627 \u0647\u0631 \u0622\u0646\u0686\u0647 \u062f\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0627\u0648\u0644 \u062a\u0631\u0627\u06a9\u0646\u0634 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u0644\u063a\u0648 \u0634\u0648\u062f.\n", + "multi_account_warning_withdrawal": "\u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062d\u0633\u0627\u0628 \u0645\u0646\u0628\u0639 \u0627\u0646\u0634\u0639\u0627\u0628\u0627\u062a \u0628\u0639\u062f\u06cc \u0628\u0627 \u0647\u0631 \u0622\u0646\u0686\u0647 \u062f\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0627\u0648\u0644 \u0628\u0631\u062f\u0627\u0634\u062a \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u0644\u063a\u0648 \u0645\u06cc \u0634\u0648\u062f.\n", + "multi_account_warning_deposit": "\u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062d\u0633\u0627\u0628 \u0645\u0642\u0635\u062f \u062a\u0642\u0633\u06cc\u0645 \u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u0628\u0627 \u0647\u0631 \u0622\u0646\u0686\u0647 \u062f\u0631 \u0627\u0648\u0644\u06cc\u0646 \u062a\u0642\u0633\u06cc\u0645 \u0633\u067e\u0631\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u0644\u063a\u0648 \u0645\u06cc \u0634\u0648\u062f.\n", + "multi_account_warning_transfer": "\u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062d\u0633\u0627\u0628 \u0645\u0628\u062f\u0627 + \u0645\u0642\u0635\u062f \u062a\u0642\u0633\u06cc\u0645\u200c\u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u0628\u0627 \u0647\u0631 \u0622\u0646\u0686\u0647 \u062f\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0627\u0648\u0644 \u0627\u0646\u062a\u0642\u0627\u0644 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u0644\u063a\u0648 \u0645\u06cc\u200c\u0634\u0648\u062f.\n", + "webhook_trigger_STORE_TRANSACTION": "\u067e\u0633 \u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u062a\u0631\u0627\u06a9\u0646\u0634\n", + "webhook_trigger_UPDATE_TRANSACTION": "\u067e\u0633 \u0627\u0632 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u062a\u0631\u0627\u06a9\u0646\u0634\n", + "webhook_trigger_DESTROY_TRANSACTION": "\u067e\u0633 \u0627\u0632 \u062a\u0631\u0627\u06a9\u0646\u0634 \u062d\u0630\u0641 \u0634\u0648\u062f\n", + "webhook_response_TRANSACTIONS": "\u062c\u0632\u0626\u06cc\u0627\u062a \u062a\u0631\u0627\u06a9\u0646\u0634", + "webhook_response_ACCOUNTS": "\u062c\u0632\u0626\u06cc\u0627\u062a \u062d\u0633\u0627\u0628", + "webhook_response_none_NONE": "\u0628\u062f\u0648\u0646 \u062c\u0632\u0626\u06cc\u0627\u062a", + "webhook_delivery_JSON": "JSON", + "actions": "\u0639\u0645\u0644\u06cc\u0627\u062a \u0647\u0627", + "meta_data": "\u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u062a\u0627\n", + "webhook_messages": "\u067e\u06cc\u0627\u0645 \u0648\u0628 \u0647\u0648\u06a9\n", + "inactive": "\u063a\u06cc\u0631 \u0641\u0639\u0627\u0644", + "no_webhook_messages": "\u0647\u06cc\u0686 \u067e\u06cc\u0627\u0645\u06cc \u0628\u0631\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f\n", + "inspect": "\u0628\u0627\u0632\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f", + "create_new_webhook": "\u0627\u06cc\u062c\u0627\u062f \u0648\u0628 \u0647\u0648\u06a9 \u062c\u062f\u06cc\u062f", + "webhooks": "\u0647\u0648\u06a9 \u0647\u0627\u06cc \u062a\u062d\u062a \u0648\u0628", + "webhook_trigger_form_help": "\u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u062f \u06a9\u0647 \u062f\u0631 \u0686\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u06cc \u0648\u0628 \u0647\u0648\u06a9 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u0634\u0648\u062f\n", + "webhook_response_form_help": "\u0622\u0646\u0686\u0647 \u0631\u0627 \u06a9\u0647 \u0648\u0628 \u0647\u0648\u06a9 \u0628\u0627\u06cc\u062f \u0628\u0647 URL \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u062f \u0631\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0646\u06cc\u062f.\n", + "webhook_delivery_form_help": "\u0648\u0628 \u0647\u0648\u06a9 \u0628\u0627\u06cc\u062f \u062f\u0631 \u0686\u0647 \u0642\u0627\u0644\u0628\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u062a\u062d\u0648\u06cc\u0644 \u062f\u0647\u062f.\n", + "webhook_active_form_help": "\u0648\u0628 \u0647\u0648\u06a9 \u0628\u0627\u06cc\u062f \u0641\u0639\u0627\u0644 \u0628\u0627\u0634\u062f \u0648\u06af\u0631\u0646\u0647 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0646\u0645\u06cc \u0634\u0648\u062f.\n", + "edit_webhook_js": "\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0648\u0628 \u0647\u0648\u06a9 \"{title}\"\n", + "webhook_was_triggered": "\u0648\u0628 \u0647\u0648\u06a9 \u062f\u0631 \u062a\u0631\u0627\u06a9\u0646\u0634 \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u0641\u0639\u0627\u0644 \u0634\u062f. \u0644\u0637\u0641\u0627 \u0635\u0628\u0631 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0646\u062a\u0627\u06cc\u062c \u0638\u0627\u0647\u0631 \u0634\u0648\u062f.\n", + "view_message": "\u0645\u0634\u0627\u0647\u062f\u0647 \u067e\u06cc\u0627\u0645", + "view_attempts": "\u0645\u0634\u0627\u0647\u062f\u0647 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0646\u0627\u0645\u0648\u0641\u0642\n", + "message_content_title": "\u0645\u062d\u062a\u0648\u0627\u06cc \u067e\u06cc\u0627\u0645 \u0648\u0628 \u0647\u0648\u06a9\n", + "message_content_help": "\u0627\u06cc\u0646 \u0645\u062d\u062a\u0648\u0627\u06cc \u067e\u06cc\u0627\u0645\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0648\u0628 \u0647\u0648\u06a9 \u0627\u0631\u0633\u0627\u0644 \u0634\u062f\u0647 (\u06cc\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u0634\u062f\u0647 \u0627\u0633\u062a).\n", + "attempt_content_title": "\u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0648\u0628 \u0647\u0648\u06a9\n", + "attempt_content_help": "\u0627\u06cc\u0646\u0647\u0627 \u0647\u0645\u0647 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0646\u0627\u0645\u0648\u0641\u0642 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u0645 \u0648\u0628 \u0647\u0648\u06a9 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0628\u0647 URL \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. \u067e\u0633 \u0627\u0632 \u0645\u062f\u062a\u06cc\u060c Firefly III \u062a\u0644\u0627\u0634 \u062e\u0648\u062f \u0631\u0627 \u0645\u062a\u0648\u0642\u0641 \u0645\u06cc \u06a9\u0646\u062f.\n", + "no_attempts": "\u0647\u06cc\u0686 \u062a\u0644\u0627\u0634 \u0646\u0627\u0645\u0648\u0641\u0642\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f. \u0627\u06cc\u0646 \u0686\u06cc\u0632 \u062e\u0648\u0628\u06cc \u0627\u0633\u062a!\n", + "webhook_attempt_at": "\u062a\u0644\u0627\u0634 \u062f\u0631 {moment}\n", + "logs": "\u06af\u0632\u0627\u0631\u0634\u200c\u0647\u0627", + "response": "\u067e\u0627\u0633\u062e", + "visit_webhook_url": "\u0627\u0632 URL webhook \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f\n", + "reset_webhook_secret": "\u0631\u0627\u0632 \u0648\u0628 \u0647\u0648\u06a9 \u0631\u0627 \u0628\u0627\u0632\u0646\u0634\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f\n", + "header_exchange_rates": "Exchange rates", + "exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in the documentation<\/a>.", + "exchange_rates_from_to": "Between {from} and {to} (and the other way around)", + "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.", + "header_exchange_rates_rates": "Exchange rates", + "header_exchange_rates_table": "Table with exchange rates", + "help_rate_form": "On this day, how many {to} will you get for one {from}?", + "add_new_rate": "Add a new exchange rate", + "save_new_rate": "Save new rate" + }, + "form": { + "url": "\u0646\u0634\u0627\u0646\u06cc \u200cURL", + "active": "\u0641\u0639\u0627\u0644", + "interest_date": "\u0646\u0631\u062e \u0628\u0647\u0631\u0647", + "administration_currency": "Native currency", + "title": "\u0639\u0646\u0648\u0627\u0646", + "date": "\u062a\u0627\u0631\u06cc\u062e", + "book_date": "\u062a\u0627\u0631\u06cc\u062e \u06a9\u062a\u0627\u0628", + "process_date": "\u062a\u0627\u0631\u06cc\u062e \u067e\u0631\u062f\u0627\u0632\u0634", + "due_date": "\u0633\u0631\u0631\u0633\u06cc\u062f", + "foreign_amount": "\u0645\u0642\u062f\u0627\u0631 \u062e\u0627\u0631\u062c\u06cc\n\n\n\n\n\n", + "payment_date": "\u062a\u0627\u0631\u06cc\u062e \u067e\u0631\u062f\u0627\u062e\u062a", + "invoice_date": "\u062a\u0627\u0631\u06cc\u062e \u0641\u0627\u06a9\u062a\u0648\u0631", + "internal_reference": "\u0645\u0631\u062c\u0639 \u062f\u0627\u062e\u0644\u06cc\n", + "webhook_response": "\u067e\u0627\u0633\u062e", + "webhook_trigger": "\u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632", + "webhook_delivery": "\u062a\u062d\u0648\u06cc\u0644", + "from_currency_to_currency": "{from} → {to}", + "to_currency_from_currency": "{to} → {from}", + "rate": "Rate" + }, + "list": { + "title": "\u0639\u0646\u0648\u0627\u0646", + "active": "\u0641\u0639\u0627\u0644 \u0627\u0633\u062a\u061f", + "native_currency": "Native currency", + "trigger": "\u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632", + "response": "\u067e\u0627\u0633\u062e", + "delivery": "\u062a\u062d\u0648\u06cc\u0644", + "url": "\u0646\u0634\u0627\u0646\u06cc \u200cURL", + "secret": "\u0645\u062d\u0631\u0645\u0627\u0646\u0647" + }, + "config": { + "html_language": "fa", + "date_time_fns": "MMMM Do, YYYY, @ HH:mm:ss" + } +} \ No newline at end of file diff --git a/resources/assets/v1/src/locales/fi.json b/resources/assets/v1/src/locales/fi.json index 671f565e17..e17ab83b40 100644 --- a/resources/assets/v1/src/locales/fi.json +++ b/resources/assets/v1/src/locales/fi.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/fr.json b/resources/assets/v1/src/locales/fr.json index 8112631d32..721bb64876 100644 --- a/resources/assets/v1/src/locales/fr.json +++ b/resources/assets/v1/src/locales/fr.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Administrations financi\u00e8res", "administrations_index_menu": "Administrations financi\u00e8res", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III aura bient\u00f4t la possibilit\u00e9 de g\u00e9rer plusieurs administrations financi\u00e8res. Pour le moment, vous n'en avez qu'une. Vous pouvez d\u00e9finir le titre de cette administration et de sa devise locale. Cela remplace le param\u00e8tre pr\u00e9c\u00e9dent o\u00f9 vous d\u00e9finissiez votre \"devise par d\u00e9faut\". Ce param\u00e8tre est d\u00e9sormais li\u00e9 \u00e0 l'administration financi\u00e8re et peut \u00eatre diff\u00e9rent par administration.", "administration_currency_form_help": "La page peut mettre longtemps \u00e0 charger si vous modifiez la devise locale, car des op\u00e9rations peuvent n\u00e9cessiter une conversion vers votre (nouvelle) devise locale.", "administrations_page_edit_sub_title_js": "Modifier l'administration financi\u00e8re \"{title}\"", diff --git a/resources/assets/v1/src/locales/hu.json b/resources/assets/v1/src/locales/hu.json index 2916f713b9..9d14edfdfd 100644 --- a/resources/assets/v1/src/locales/hu.json +++ b/resources/assets/v1/src/locales/hu.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/id.json b/resources/assets/v1/src/locales/id.json index 1bcdd59f6d..fb22dfeb81 100644 --- a/resources/assets/v1/src/locales/id.json +++ b/resources/assets/v1/src/locales/id.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", @@ -135,7 +136,7 @@ "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.", "no_attempts": "There are no unsuccessful attempts. That's a good thing!", "webhook_attempt_at": "Attempt at {moment}", - "logs": "Logs", + "logs": "Log", "response": "Response", "visit_webhook_url": "Visit webhook URL", "reset_webhook_secret": "Reset webhook secret", diff --git a/resources/assets/v1/src/locales/it.json b/resources/assets/v1/src/locales/it.json index a19428c7e5..84bf9f540a 100644 --- a/resources/assets/v1/src/locales/it.json +++ b/resources/assets/v1/src/locales/it.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Amministrazioni finanziarie", "administrations_index_menu": "Amministrazioni finanziarie", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III avr\u00e0 presto la possibilit\u00e0 di gestire pi\u00f9 amministrazioni finanziarie. In questo momento, hai solo il titolo. Puoi impostare il titolo di questa amministrazione e la sua valuta nativa. Questo sostituisce l'impostazione precedente, in cui si impostava la \"valuta predefinita\". Questa situazione \u00e8 ora legata all'amministrazione finanziaria e pu\u00f2 essere diversa per amministrazione.", "administration_currency_form_help": "Se modifichi la valuta nativa, il caricamento della pagina potrebbe richiedere molto tempo, poich\u00e9 potrebbe essere necessario convertire la transazione nella (nuova) valuta nativa.", "administrations_page_edit_sub_title_js": "Modifica amministrazione finanziaria \"{title}\"", @@ -30,7 +31,7 @@ "apply_rules_checkbox": "Applica le regole", "fire_webhooks_checkbox": "Esegui webhook", "no_budget_pointer": "Sembra che tu non abbia ancora dei budget. Dovresti crearne alcuni nella pagina dei budget<\/a>. I budget possono aiutarti a tenere traccia delle spese.", - "no_bill_pointer": "Sembra che tu non abbia ancora un abbonamento. Dovresti crearne alcuni sulla pagina abbonamento<\/a>. Gli abbonamenti possono aiutarti a tenere traccia delle spese.", + "no_bill_pointer": "Sembra che tu non abbia ancora un pagamento ricorrente. Dovresti crearne alcuni sulla pagina pagamenti ricorrenti<\/a>. I pagamenti ricorrenti possono aiutarti a tenere traccia delle spese.", "source_account": "Conto di origine", "hidden_fields_preferences": "Puoi abilitare maggiori opzioni per le transazioni nelle tue impostazioni<\/a>.", "destination_account": "Conto destinazione", diff --git a/resources/assets/v1/src/locales/ja.json b/resources/assets/v1/src/locales/ja.json index 939eace811..a7311de21a 100644 --- a/resources/assets/v1/src/locales/ja.json +++ b/resources/assets/v1/src/locales/ja.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/ko.json b/resources/assets/v1/src/locales/ko.json index 8300737cad..977547cb41 100644 --- a/resources/assets/v1/src/locales/ko.json +++ b/resources/assets/v1/src/locales/ko.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", @@ -153,7 +154,7 @@ "url": "URL", "active": "\ud65c\uc131", "interest_date": "\uc774\uc790 \ub0a0\uc9dc", - "administration_currency": "Native currency", + "administration_currency": "\uc790\uad6d \ud1b5\ud654", "title": "\uc81c\ubaa9", "date": "\ub0a0\uc9dc", "book_date": "\uc608\uc57d\uc77c", @@ -173,7 +174,7 @@ "list": { "title": "\uc81c\ubaa9", "active": "\ud65c\uc131 \uc0c1\ud0dc\uc785\ub2c8\uae4c?", - "native_currency": "Native currency", + "native_currency": "\uc790\uad6d \ud1b5\ud654", "trigger": "\ud2b8\ub9ac\uac70", "response": "\uc751\ub2f5", "delivery": "\uc804\ub2ec", diff --git a/resources/assets/v1/src/locales/nb.json b/resources/assets/v1/src/locales/nb.json index d8fb8942ab..8a45a6b939 100644 --- a/resources/assets/v1/src/locales/nb.json +++ b/resources/assets/v1/src/locales/nb.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/nl.json b/resources/assets/v1/src/locales/nl.json index f34cb79524..83ebbd6e10 100644 --- a/resources/assets/v1/src/locales/nl.json +++ b/resources/assets/v1/src/locales/nl.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Grootboeken", "administrations_index_menu": "Grootboeken", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III krijgt binnenkort het vermogen om meerdere grootboeken te beheren. Op dit moment kan dat nog niet. Je kan de titel van dit grootboek instellen en de basisvaluta. Dit vervangt de voorgaande manier waarop je je \"standaardvaluta\" zou instellen. Deze instelling is nu gekoppeld aan dit grootboek, en kan per grootboek verschillend zijn.", "administration_currency_form_help": "Het wijzigen van deze instelling betekent dat heel veel transacties omgerekend moeten worden naar je nieuwe basisvaluta en dat kan lang duren.", "administrations_page_edit_sub_title_js": "Wijzig grootboek \"{title}\"", diff --git a/resources/assets/v1/src/locales/nn.json b/resources/assets/v1/src/locales/nn.json index 62f6622672..3383de47bc 100644 --- a/resources/assets/v1/src/locales/nn.json +++ b/resources/assets/v1/src/locales/nn.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/pl.json b/resources/assets/v1/src/locales/pl.json index 111b2ee794..e197483748 100644 --- a/resources/assets/v1/src/locales/pl.json +++ b/resources/assets/v1/src/locales/pl.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Ustawienia finansowe", "administrations_index_menu": "Ustawienia finansowe", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III wkr\u00f3tce uzyska mo\u017cliwo\u015b\u0107 zarz\u0105dzania wieloma ustawieniami finansowymi. W tej chwili jest tylko jedno domy\u015blne ustawienie. Mo\u017cesz ustawi\u0107 jego tytu\u0142 i natywn\u0105 walut\u0119. To zast\u0119puje poprzednie ustawienia, w kt\u00f3rym mo\u017cna by\u0142o ustawi\u0107 \"domy\u015bln\u0105 walut\u0119\". Jest ona obecnie powi\u0105zana z wybranym ustawieniem finansowym i mo\u017ce by\u0107 zmienione w tej zak\u0142adce.", "administration_currency_form_help": "Wczytywanie strony mo\u017ce zaj\u0105\u0107 du\u017co czasu, je\u015bli zmienisz natywn\u0105 walut\u0119, poniewa\u017c transakcja mo\u017ce wymaga\u0107 przewalutowania na (now\u0105) natywn\u0105 walut\u0119.", "administrations_page_edit_sub_title_js": "Edytuj ustawienia finansowe \"{title}\"", diff --git a/resources/assets/v1/src/locales/pt-br.json b/resources/assets/v1/src/locales/pt-br.json index 30245d0767..e1cdf85137 100644 --- a/resources/assets/v1/src/locales/pt-br.json +++ b/resources/assets/v1/src/locales/pt-br.json @@ -1,10 +1,11 @@ { "firefly": { - "administrations_page_title": "Financial administrations", - "administrations_index_menu": "Financial administrations", - "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 native 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.", - "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", - "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", + "administrations_page_title": "Administra\u00e7\u00e3o financeira", + "administrations_index_menu": "Administra\u00e7\u00e3o financeira", + "expires_at": "Expira em", + "temp_administrations_introduction": "O Firefly III ter\u00e1 em breve a capacidade de gerir m\u00faltiplas administra\u00e7\u00f5es financeiras. Neste momento, voc\u00ea tem apenas um. Voc\u00ea pode definir o t\u00edtulo desta administra\u00e7\u00e3o e sua moeda nativa. Isso substitui a configura\u00e7\u00e3o anterior onde voc\u00ea definiria sua \"moeda padr\u00e3o\". Esta defini\u00e7\u00e3o est\u00e1 agora ligada \u00e0 administra\u00e7\u00e3o financeira e pode ser diferente por administra\u00e7\u00e3o.", + "administration_currency_form_help": "A p\u00e1gina poder\u00e1 levar muito tempo para ser carregada, se voc\u00ea alterar a moeda nativa, porque a transa\u00e7\u00e3o precisar\u00e1 ser convertida para a sua (nova) moeda nativa.", + "administrations_page_edit_sub_title_js": "Editar administra\u00e7\u00e3o financeira \"{title}\"", "table": "Tabela", "welcome_back": "O que est\u00e1 acontecendo?", "flash_error": "Erro!", @@ -15,11 +16,11 @@ "select_source_account": "Por favor, selecione ou digite um nome de conta de origem v\u00e1lido", "split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida", "errors_submission": "Algo deu errado com seu envio. Por favor, verifique os erros abaixo.", - "is_reconciled": "Is reconciled", + "is_reconciled": "Est\u00e1 reconciliado", "split": "Dividir", "single_split": "Divis\u00e3o", - "not_enough_currencies": "Not enough currencies", - "not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.", + "not_enough_currencies": "Moedas insuficientes", + "not_enough_currencies_enabled": "Se voc\u00ea tem apenas uma moeda ativada, n\u00e3o h\u00e1 necessidade de adicionar taxas de c\u00e2mbio.", "transaction_stored_link": "Transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi salva.", "webhook_stored_link": "Webhooh #{ID} (\"{title}\")<\/a> foi salva.", "webhook_updated_link": "Webhook #{ID}<\/a> (\"{title}\") foi atualizado.", @@ -30,7 +31,7 @@ "apply_rules_checkbox": "Aplicar regras", "fire_webhooks_checkbox": "Acionar webhooks", "no_budget_pointer": "Parece que voc\u00ea ainda n\u00e3o tem or\u00e7amentos. Voc\u00ea deve criar alguns na p\u00e1gina de or\u00e7amentos<\/a>. Or\u00e7amentos podem ajud\u00e1-lo a manter o controle das despesas.", - "no_bill_pointer": "You seem to have no subscription yet. You should create some on the subscription<\/a>-page. Subscriptions can help you keep track of expenses.", + "no_bill_pointer": "Parece que voc\u00ea n\u00e3o tem assinatura ainda. Voc\u00ea deve criar alguma na p\u00e1gina de assinaturas<\/a>. Assinaturas podem ajud\u00e1-lo a manter o controle das despesas.", "source_account": "Conta origem", "hidden_fields_preferences": "Voc\u00ea pode habilitar mais op\u00e7\u00f5es de transa\u00e7\u00e3o em suas prefer\u00eancias<\/a>.", "destination_account": "Conta destino", @@ -42,10 +43,10 @@ "submit": "Enviar", "amount": "Valor", "date": "Data", - "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": "Como a transa\u00e7\u00e3o est\u00e1 reconciliada, voc\u00ea n\u00e3o pode atualizar as contas, nem o(s) valor(es) at\u00e9 voc\u00ea remover o indicador de reconcilia\u00e7\u00e3o.", "tags": "Tags", "no_budget": "(sem or\u00e7amento)", - "no_bill": "(no subscription)", + "no_bill": "(sem assinatura)", "category": "Categoria", "attachments": "Anexos", "notes": "Notas", @@ -61,7 +62,7 @@ "destination_account_reconciliation": "Voc\u00ea n\u00e3o pode editar a conta destino de uma transa\u00e7\u00e3o de reconcilia\u00e7\u00e3o.", "source_account_reconciliation": "Voc\u00ea n\u00e3o pode editar a conta de origem de uma transa\u00e7\u00e3o de reconcilia\u00e7\u00e3o.", "budget": "Or\u00e7amento", - "bill": "Subscription", + "bill": "Assinatura", "you_create_withdrawal": "Voc\u00ea est\u00e1 criando uma sa\u00edda.", "you_create_transfer": "Voc\u00ea est\u00e1 criando uma transfer\u00eancia.", "you_create_deposit": "Voc\u00ea est\u00e1 criando uma entrada.", @@ -139,21 +140,21 @@ "response": "Resposta", "visit_webhook_url": "Acesse a URL do webhook", "reset_webhook_secret": "Redefinir chave do webhook", - "header_exchange_rates": "Exchange rates", - "exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in the documentation<\/a>.", - "exchange_rates_from_to": "Between {from} and {to} (and the other way around)", - "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.", - "header_exchange_rates_rates": "Exchange rates", - "header_exchange_rates_table": "Table with exchange rates", - "help_rate_form": "On this day, how many {to} will you get for one {from}?", - "add_new_rate": "Add a new exchange rate", - "save_new_rate": "Save new rate" + "header_exchange_rates": "Taxa de c\u00e2mbio", + "exchange_rates_intro": "O Firefly III suporta o download e uso de taxas de c\u00e2mbio. Leia mais sobre isso na documenta\u00e7\u00e3o<\/a>.", + "exchange_rates_from_to": "Entre {from} e {to} (e vice-versa)", + "exchange_rates_intro_rates": "O Firefly III usa as seguintes taxas de c\u00e2mbio. A inversa \u00e9 automaticamente calculada quando n\u00e3o \u00e9 fornecida. Se n\u00e3o existir nenhuma taxa de c\u00e2mbio para a data da transa\u00e7\u00e3o, o Firefly III voltar\u00e1 no tempo para encontrar uma. Se nenhum estiver presente, a taxa \"1\" ser\u00e1 usada.", + "header_exchange_rates_rates": "Taxa de c\u00e2mbio", + "header_exchange_rates_table": "Tabela com taxas de c\u00e2mbio", + "help_rate_form": "Neste dia, quantos {to} voc\u00ea receber\u00e1 por um {from}?", + "add_new_rate": "Adicionar uma nova taxa de c\u00e2mbio", + "save_new_rate": "Salvar nova taxa" }, "form": { "url": "URL", "active": "Ativo", "interest_date": "Data do juros", - "administration_currency": "Native currency", + "administration_currency": "Moeda nativa", "title": "T\u00edtulo", "date": "Data", "book_date": "Data de lan\u00e7amento", @@ -168,12 +169,12 @@ "webhook_delivery": "Entrega", "from_currency_to_currency": "{from} → {to}", "to_currency_from_currency": "{to} → {from}", - "rate": "Rate" + "rate": "Taxa" }, "list": { "title": "T\u00edtulo", "active": "Est\u00e1 ativo?", - "native_currency": "Native currency", + "native_currency": "Moeda nativa", "trigger": "Gatilho", "response": "Resposta", "delivery": "Entrega", diff --git a/resources/assets/v1/src/locales/pt.json b/resources/assets/v1/src/locales/pt.json index 7135c6e875..b4c3368196 100644 --- a/resources/assets/v1/src/locales/pt.json +++ b/resources/assets/v1/src/locales/pt.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/ro.json b/resources/assets/v1/src/locales/ro.json index 62c66c3b95..bc7a0bb644 100644 --- a/resources/assets/v1/src/locales/ro.json +++ b/resources/assets/v1/src/locales/ro.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/ru.json b/resources/assets/v1/src/locales/ru.json index 890bef8fe9..9f0cc390f3 100644 --- a/resources/assets/v1/src/locales/ru.json +++ b/resources/assets/v1/src/locales/ru.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b", "administrations_index_menu": "\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III \u0432\u0441\u043a\u043e\u0440\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0430\u043b\u044e\u0442\u0443. \u042d\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \"\u0432\u0430\u043b\u044e\u0442\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\". \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430.", "administration_currency_form_help": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0430\u043b\u044e\u0442\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043d\u043e\u0432\u0443\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0430\u043b\u044e\u0442\u0443.", "administrations_page_edit_sub_title_js": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438 \"{title}\"", diff --git a/resources/assets/v1/src/locales/sk.json b/resources/assets/v1/src/locales/sk.json index 5260df51e3..db7e6ad4e4 100644 --- a/resources/assets/v1/src/locales/sk.json +++ b/resources/assets/v1/src/locales/sk.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/sl.json b/resources/assets/v1/src/locales/sl.json index 00be58db83..f5f051fa10 100644 --- a/resources/assets/v1/src/locales/sl.json +++ b/resources/assets/v1/src/locales/sl.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Finan\u010dne administracije", "administrations_index_menu": "Finan\u010dne administracije", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III bo kmalu dobil mo\u017enost upravljanja ve\u010d finan\u010dnih administracij. Trenutno imate samo eno. Nastavite lahko naziv te administracije in njeno doma\u010do valuto. To nadome\u0161\u010da prej\u0161njo nastavitev, kjer bi nastavili svojo \"privzeto valuto\". Ta nastavitev je zdaj vezana na finan\u010dno administracijo in se lahko razlikuje glede na administracijo.", "administration_currency_form_help": "\u010ce spremenite doma\u010do valuto, lahko traja dolgo \u010dasa, da se stran nalo\u017ei, ker bo transakcijo morda treba pretvoriti v va\u0161o (novo) doma\u010do valuto.", "administrations_page_edit_sub_title_js": "Uredi finan\u010dno administracijo \"{title}\"", diff --git a/resources/assets/v1/src/locales/sv.json b/resources/assets/v1/src/locales/sv.json index 84e252e40f..e76e2ee29d 100644 --- a/resources/assets/v1/src/locales/sv.json +++ b/resources/assets/v1/src/locales/sv.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/tr.json b/resources/assets/v1/src/locales/tr.json index 47a5d93a04..a361cd96d3 100644 --- a/resources/assets/v1/src/locales/tr.json +++ b/resources/assets/v1/src/locales/tr.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/uk.json b/resources/assets/v1/src/locales/uk.json index fc9c1bef7c..23c44f9e84 100644 --- a/resources/assets/v1/src/locales/uk.json +++ b/resources/assets/v1/src/locales/uk.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "\u0424\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u0456 \u0430\u0434\u043c\u0456\u043d\u0456\u0441\u0442\u0440\u0430\u0446\u0456\u0457", "administrations_index_menu": "\u0424\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u0456 \u0430\u0434\u043c\u0456\u043d\u0456\u0441\u0442\u0440\u0430\u0446\u0456\u0457", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/vi.json b/resources/assets/v1/src/locales/vi.json index 6aa3d3cb14..f3886c6d3c 100644 --- a/resources/assets/v1/src/locales/vi.json +++ b/resources/assets/v1/src/locales/vi.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "Financial administrations", "administrations_index_menu": "Financial administrations", + "expires_at": "Expires at", "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 native 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.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", diff --git a/resources/assets/v1/src/locales/zh-cn.json b/resources/assets/v1/src/locales/zh-cn.json index 0fddaf8573..36e796f402 100644 --- a/resources/assets/v1/src/locales/zh-cn.json +++ b/resources/assets/v1/src/locales/zh-cn.json @@ -2,9 +2,10 @@ "firefly": { "administrations_page_title": "\u8d22\u52a1\u7ba1\u7406", "administrations_index_menu": "\u8d22\u52a1\u7ba1\u7406", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III \u4e0d\u4e45\u5c06\u80fd\u591f\u7ba1\u7406\u591a\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002 \u73b0\u5728\uff0c\u4f60\u53ea\u80fd\u6709\u4e00\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002\u4f60\u53ef\u4ee5\u8bbe\u7f6e\u8fd9\u4e2a\u8d22\u52a1\u7ba1\u7406\u7684\u6807\u9898\u53ca\u5176\u5f53\u5730\u8d27\u5e01\u3002 \u8fd9\u5c06\u53d6\u4ee3\u60a8\u5148\u524d\u8bbe\u7f6e\u7684\u201c\u9ed8\u8ba4\u8d27\u5e01\u201d\u3002 \u8fd9\u79cd\u8bbe\u7f6e\u73b0\u5728\u4e0e\u8d22\u52a1\u7ba1\u7406\u6302\u94a9\uff0c\u6bcf\u4e2a\u7ba1\u7406\u53ef\u4ee5\u6709\u4e0d\u540c\u7684\u8bbe\u7f6e\u3002", - "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", - "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", + "administration_currency_form_help": "\u5982\u679c\u60a8\u66f4\u6539\u672c\u5730\u8d27\u5e01\uff0c\u9875\u9762\u52a0\u8f7d\u53ef\u80fd\u9700\u8981\u5f88\u957f\u65f6\u95f4\uff0c\u56e0\u4e3a\u4ea4\u6613\u53ef\u80fd\u9700\u8981\u8f6c\u6362\u4e3a\u60a8\u7684(\u65b0)\u672c\u5730\u8d27\u5e01\u3002", + "administrations_page_edit_sub_title_js": "\u7f16\u8f91\u8d22\u52a1\u7ba1\u7406{title}", "table": "\u8868\u683c", "welcome_back": "\u4eca\u5929\u7406\u8d22\u4e86\u5417\uff1f", "flash_error": "\u9519\u8bef\uff01", @@ -140,12 +141,12 @@ "visit_webhook_url": "\u8bbf\u95ee webhook URL", "reset_webhook_secret": "\u91cd\u7f6e webhook \u5bc6\u94a5", "header_exchange_rates": "\u6c47\u7387", - "exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in the documentation<\/a>.", - "exchange_rates_from_to": "Between {from} and {to} (and the other way around)", - "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": "Frefly III \u652f\u6301\u4e0b\u8f7d\u548c\u4f7f\u7528\u6c47\u7387\u3002\u8bf7\u5728 \u8fd9\u4efd\u6587\u6863<\/a>\u4e2d\u9605\u8bfb\u66f4\u591a\u3002", + "exchange_rates_from_to": "\u4ece {from} \u5230 {to} \u7684\u6c47\u7387\uff08\u4ee5\u53ca\u53cd\u5411\uff09", + "exchange_rates_intro_rates": "Firefly III \u91c7\u7528\u4ee5\u4e0b\u6c47\u7387\u3002\u5982\u679c\u6ca1\u6709\u63d0\u4f9b\u53cd\u5411\u6c47\u7387\u5219\u81ea\u52a8\u8ba1\u7b97\u3002 \u5982\u679c\u4ea4\u6613\u65e5\u671f\u4e0d\u5b58\u5728\u6c47\u7387\uff0cFifrefly III \u5c06\u5bfb\u627e\u524d\u4e00\u4e2a\u53ef\u7528\u65e5\u671f\u7684\u6c47\u7387\u3002 \u5982\u679c\u6ca1\u6709\uff0c\u5c06\u6309\u6c47\u7387\u4e3a 1 \u8fdb\u884c\u8ba1\u7b97\u3002", "header_exchange_rates_rates": "\u6c47\u7387", - "header_exchange_rates_table": "Table with exchange rates", - "help_rate_form": "On this day, how many {to} will you get for one {from}?", + "header_exchange_rates_table": "\u6c47\u7387\u8868", + "help_rate_form": "\u5728\u8fd9\u4e00\u5929\uff0c\u4f60\u80fd\u4ece\u6bcf 1 \u4e2a\u5355\u4f4d\u7684 {from} \u83b7\u5f97\u591a\u5c11 {to}\uff1f", "add_new_rate": "\u6dfb\u52a0\u65b0\u6c47\u7387", "save_new_rate": "\u4fdd\u5b58\u65b0\u6c47\u7387" }, @@ -168,7 +169,7 @@ "webhook_delivery": "\u53d1\u9001\u683c\u5f0f", "from_currency_to_currency": "{from}→{to}", "to_currency_from_currency": "{to}→{from}", - "rate": "\u8bc4\u7ea7" + "rate": "\u6c47\u7387" }, "list": { "title": "\u6807\u9898", diff --git a/resources/assets/v1/src/locales/zh-tw.json b/resources/assets/v1/src/locales/zh-tw.json index efe606e10f..08d5ff0ed8 100644 --- a/resources/assets/v1/src/locales/zh-tw.json +++ b/resources/assets/v1/src/locales/zh-tw.json @@ -2,6 +2,7 @@ "firefly": { "administrations_page_title": "\u591a\u500b\u8ca1\u52d9\u7ba1\u7406", "administrations_index_menu": "\u591a\u500b\u8ca1\u52d9\u7ba1\u7406", + "expires_at": "Expires at", "temp_administrations_introduction": "Firefly III \u5373\u5c07\u652f\u63f4\u540c\u6642\u7ba1\u7406\u591a\u500b\u8ca1\u52d9\u7ba1\u7406\u3002\u76ee\u524d\u60a8\u53ea\u6709\u4e00\u500b\u3002\u60a8\u53ef\u5728\u6b64\u8a2d\u5b9a\u5176\u6a19\u984c\u8207\u672c\u5e63\uff0c\u9019\u53d6\u4ee3\u4e86\u5148\u524d\u7684\u300c\u9810\u8a2d\u8ca8\u5e63\u300d\u8a2d\u5b9a\u3002\u6b64\u8a2d\u5b9a\u73fe\u5728\u7d81\u5b9a\u65bc\u8a72\u8ca1\u52d9\u7ba1\u7406\uff0c\u4e26\u53ef\u56e0\u4e0d\u540c\u8ca1\u52d9\u7ba1\u7406\u800c\u7570\u3002", "administration_currency_form_help": "\u5982\u679c\u60a8\u66f4\u6539\u4e86\u672c\u5e63\uff0c\u53ef\u80fd\u9700\u8981\u4e00\u6bb5\u6642\u9593\u624d\u80fd\u8f09\u5165\u9801\u9762\uff0c\u56e0\u70ba\u4ea4\u6613\u53ef\u80fd\u9700\u8981\u8f49\u63db\u70ba\uff08\u65b0\uff09\u672c\u5e63\u3002", "administrations_page_edit_sub_title_js": "\u7de8\u8f2f\u8ca1\u52d9\u7ba1\u7406\u300c{title}\u300d", diff --git a/resources/assets/v2/package.json b/resources/assets/v2/package.json index 1c1018dcf9..b7eca8bc55 100644 --- a/resources/assets/v2/package.json +++ b/resources/assets/v2/package.json @@ -8,26 +8,22 @@ "postinstall": "patch-package --error-on-fail" }, "devDependencies": { - "axios": "^1.8.2", - "laravel-vite-plugin": "^1.0.5", - "patch-package": "^8.0.0", - "sass": "^1.78.0", + "axios": "^1", + "laravel-vite-plugin": "^1", + "patch-package": "^8", + "sass": "^1", "vite": "^6", "vite-plugin-manifest-sri": "^0.2.0" }, "dependencies": { - "@ag-grid-community/client-side-row-model": "^32.0.2", - "@ag-grid-community/core": "^32.0.2", - "@ag-grid-community/infinite-row-model": "^32.0.2", - "@ag-grid-community/styles": "^33.0.2", "@fortawesome/fontawesome-free": "^6.4.0", "@popperjs/core": "^2.11.8", - "admin-lte": "^4.0.0-alpha3", + "admin-lte": "^4.0.0-beta3", "alpinejs": "^3.13.7", - "bootstrap": "^5.3.0", - "bootstrap5-autocomplete": "^1.1.22", - "bootstrap5-tags": "^1.7", - "chart.js": "^4.4.0", + "bootstrap": "^5", + "bootstrap5-autocomplete": "^1", + "bootstrap5-tags": "^1", + "chart.js": "^4", "chartjs-adapter-date-fns": "^3.0.0", "chartjs-chart-sankey": "^0.14.0", "date-fns": "^4.0.0", diff --git a/resources/assets/v2/src/api/v1/chart/account/dashboard.js b/resources/assets/v2/src/api/v1/chart/account/dashboard.js new file mode 100644 index 0000000000..f5c1870393 --- /dev/null +++ b/resources/assets/v2/src/api/v1/chart/account/dashboard.js @@ -0,0 +1,36 @@ +/* + * overview.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; +import {format} from "date-fns"; + +export default class Dashboard { + dashboard(start, end) { + let startStr = format(start, 'y-MM-dd'); + let endStr = format(end, 'y-MM-dd'); + return api.get('/api/v1/chart/account/dashboard', {params: {fix: true, start: startStr, end: endStr}}); + } + + expense(start, end) { + let startStr = format(start, 'y-MM-dd'); + let endStr = format(end, 'y-MM-dd'); + return api.get('/api/v1/chart/account/expense-dashboard', {params: {start: startStr, end: endStr}}); + } +} diff --git a/resources/assets/v2/src/api/v1/chart/budget/dashboard.js b/resources/assets/v2/src/api/v1/chart/budget/dashboard.js new file mode 100644 index 0000000000..6e94a2cc7c --- /dev/null +++ b/resources/assets/v2/src/api/v1/chart/budget/dashboard.js @@ -0,0 +1,30 @@ +/* + * overview.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; +import {format} from "date-fns"; + +export default class Dashboard { + dashboard(start, end) { + let startStr = format(start, 'y-MM-dd'); + let endStr = format(end, 'y-MM-dd'); + return api.get('/api/v1/chart/budget/dashboard', {params: {start: startStr, end: endStr}}); + } +} diff --git a/resources/assets/v2/src/api/v1/chart/category/dashboard.js b/resources/assets/v2/src/api/v1/chart/category/dashboard.js new file mode 100644 index 0000000000..46afdc01b0 --- /dev/null +++ b/resources/assets/v2/src/api/v1/chart/category/dashboard.js @@ -0,0 +1,30 @@ +/* + * overview.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; +import {format} from "date-fns"; + +export default class Dashboard { + dashboard(start, end) { + let startStr = format(start, 'y-MM-dd'); + let endStr = format(end, 'y-MM-dd'); + return api.get('/api/v1/chart/category/dashboard', {params: {start: startStr, end: endStr}}); + } +} diff --git a/resources/assets/v2/src/api/v1/accounts/get.js b/resources/assets/v2/src/api/v1/model/account/get.js similarity index 84% rename from resources/assets/v2/src/api/v1/accounts/get.js rename to resources/assets/v2/src/api/v1/model/account/get.js index ce6fc50d57..a8d014a42c 100644 --- a/resources/assets/v2/src/api/v1/accounts/get.js +++ b/resources/assets/v2/src/api/v1/model/account/get.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -import {api} from "../../../boot/axios"; +import {api} from "../../../../boot/axios"; import format from "date-fns/format"; export default class Get { @@ -37,6 +37,18 @@ export default class Get { return api.get('/api/v1/accounts/' + identifier, {params: params}); } + + /** + * + * @param identifier + * @param params + * @returns {Promise>} + */ + show(identifier, params) { + return api.get('/api/v1/accounts/' + identifier, {params: params}); + } + + /** * * @param identifier diff --git a/resources/assets/v2/src/api/v1/model/account/put.js b/resources/assets/v2/src/api/v1/model/account/put.js new file mode 100644 index 0000000000..d2ac8a8310 --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/account/put.js @@ -0,0 +1,36 @@ +/* + * list.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; +import format from "date-fns/format"; + +export default class Put { + + /** + * + * @param identifier + * @param params + * @returns {Promise>} + */ + put(identifier, params) { + return api.put('/api/v2/accounts/' + identifier, params); + } + +} diff --git a/resources/assets/v2/src/api/v1/attachments/post.js b/resources/assets/v2/src/api/v1/model/attachment/post.js similarity index 96% rename from resources/assets/v2/src/api/v1/attachments/post.js rename to resources/assets/v2/src/api/v1/model/attachment/post.js index 9954feabca..0a6ccfe01c 100644 --- a/resources/assets/v2/src/api/v1/attachments/post.js +++ b/resources/assets/v2/src/api/v1/model/attachment/post.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -import {api} from "../../../boot/axios"; +import {api} from "../../../../boot/axios"; export default class Post { post(fileName, attachableType, attachableId) { diff --git a/resources/assets/v2/src/api/v1/model/budget/get.js b/resources/assets/v2/src/api/v1/model/budget/get.js new file mode 100644 index 0000000000..010ebcb7b5 --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/budget/get.js @@ -0,0 +1,35 @@ +/* + * list.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; +import format from "date-fns/format"; + +export default class Get { + + /** + * + * @param params + * @returns {Promise>} + */ + list(params) { + return api.get('/api/v2/budgets', {params: params}); + } + +} diff --git a/resources/assets/v2/src/api/v1/model/currency/get.js b/resources/assets/v2/src/api/v1/model/currency/get.js new file mode 100644 index 0000000000..576df40041 --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/currency/get.js @@ -0,0 +1,35 @@ +/* + * list.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; +import format from "date-fns/format"; + +export default class Get { + + /** + * + * @param params + * @returns {Promise>} + */ + list(params) { + return api.get('/api/v2/currencies', {params: params}); + } + +} diff --git a/resources/assets/v2/src/api/v1/model/piggy-bank/get.js b/resources/assets/v2/src/api/v1/model/piggy-bank/get.js new file mode 100644 index 0000000000..512120b50a --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/piggy-bank/get.js @@ -0,0 +1,35 @@ +/* + * get.js + * Copyright (c) 2023 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + + +import {api} from "../../../../boot/axios"; + +export default class Get { + + /** + * + * @param params + * @returns {Promise>} + */ + list(params) { + return api.get('/api/v1/piggy-banks', {params: params}); + } + +} diff --git a/resources/assets/v2/src/api/v1/model/subscription/get.js b/resources/assets/v2/src/api/v1/model/subscription/get.js new file mode 100644 index 0000000000..a1ba57460d --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/subscription/get.js @@ -0,0 +1,42 @@ +/* + * get.js + * Copyright (c) 2023 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + + +import {api} from "../../../../boot/axios"; + +export default class Get { + + /** + * + * @param params + * @returns {Promise>} + */ + list(params) { + return api.get('/api/v1/subscriptions', {params: params}); + } + + paid(params) { + return api.get('/api/v1/subscriptions/sum/paid', {params: params}); + } + + unpaid(params) { + return api.get('/api/v1/subscriptions/sum/unpaid', {params: params}); + } +} diff --git a/resources/assets/v2/src/api/v1/model/transaction/get.js b/resources/assets/v2/src/api/v1/model/transaction/get.js new file mode 100644 index 0000000000..a00b59064a --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/transaction/get.js @@ -0,0 +1,37 @@ +/* + * get.js + * Copyright (c) 2023 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + + +import {api} from "../../../../boot/axios"; + +export default class Get { + + /** + * + * @param params + * @returns {Promise>} + */ + list(params) { + return api.get('/api/v1/transactions', {params: params}); + } + show(id, params){ + return api.get('/api/v1/transactions/' + id, {params: params}); + } +} diff --git a/resources/assets/v2/src/api/v1/model/transaction/post.js b/resources/assets/v2/src/api/v1/model/transaction/post.js new file mode 100644 index 0000000000..59b97de988 --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/transaction/post.js @@ -0,0 +1,28 @@ +/* + * post.js + * Copyright (c) 2023 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; + +export default class Post { + post(submission) { + let url = '/api/v1/transactions'; + return api.post(url, submission); + } +} diff --git a/resources/assets/v2/src/api/v1/model/transaction/put.js b/resources/assets/v2/src/api/v1/model/transaction/put.js new file mode 100644 index 0000000000..ad38c699e7 --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/transaction/put.js @@ -0,0 +1,28 @@ +/* + * post.js + * Copyright (c) 2023 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; + +export default class Put { + put(submission, params) { + let url = '/api/v1/transactions/' + parseInt(params.id); + return api.put(url, submission); + } +} diff --git a/resources/assets/v2/src/api/v1/model/user-group/get.js b/resources/assets/v2/src/api/v1/model/user-group/get.js new file mode 100644 index 0000000000..3aed6dc5d9 --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/user-group/get.js @@ -0,0 +1,45 @@ +/* + * list.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; +import format from "date-fns/format"; + +export default class Get { + + /** + * + * @param identifier + * @param params + * @returns {Promise>} + */ + show(identifier, params) { + return api.get('/api/v2/user-groups/' + identifier, {params: params}); + } + + /** + * + * @param params + * @returns {Promise>} + */ + index(params) { + return api.get('/api/v2/user-groups', {params: params}); + } + +} diff --git a/resources/assets/v2/src/api/v1/model/user-group/post.js b/resources/assets/v2/src/api/v1/model/user-group/post.js new file mode 100644 index 0000000000..9b761ba000 --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/user-group/post.js @@ -0,0 +1,33 @@ +/* + * post.js + * Copyright (c) 2024 james@firefly-iii.org. + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ + +import {api} from "../../../../boot/axios"; + +export default class Post { + post(submission) { + let url = './api/v2/user-groups'; + return api.post(url, submission); + } + + use(groupId) { + let url = './api/v2/user-groups/' + groupId + '/use'; + return api.post(url, {}); + } +} diff --git a/resources/assets/v2/src/api/v1/model/user-group/put.js b/resources/assets/v2/src/api/v1/model/user-group/put.js new file mode 100644 index 0000000000..27c4138c0e --- /dev/null +++ b/resources/assets/v2/src/api/v1/model/user-group/put.js @@ -0,0 +1,28 @@ +/* + * post.js + * Copyright (c) 2023 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "../../../../boot/axios"; + +export default class Put { + put(submission, params) { + let url = '/api/v2/user-groups/' + parseInt(params.id); + return api.put(url, submission); + } +} diff --git a/resources/assets/v2/src/api/v2/chart/account/dashboard.js b/resources/assets/v2/src/api/v2/chart/account/dashboard.js index eb0c336ea0..521bf7405b 100644 --- a/resources/assets/v2/src/api/v2/chart/account/dashboard.js +++ b/resources/assets/v2/src/api/v2/chart/account/dashboard.js @@ -25,7 +25,7 @@ export default class Dashboard { dashboard(start, end) { let startStr = format(start, 'y-MM-dd'); let endStr = format(end, 'y-MM-dd'); - return api.get('/api/v2/chart/account/dashboard', {params: {filter: {start: startStr, end: endStr}}}); + return api.get('/api/v2/chart/account/dashboard', {params: {start: startStr, end: endStr}}); } expense(start, end) { diff --git a/resources/assets/v2/src/pages/accounts/index.js b/resources/assets/v2/src/pages/accounts/index.js index 422202ee24..80f4b34649 100644 --- a/resources/assets/v2/src/pages/accounts/index.js +++ b/resources/assets/v2/src/pages/accounts/index.js @@ -24,8 +24,8 @@ import i18next from "i18next"; import {format} from "date-fns"; import formatMoney from "../../util/format-money.js"; -import Get from "../../api/v2/model/account/get.js"; -import Put from "../../api/v2/model/account/put.js"; +import Get from "../../api/v1/model/account/get.js"; +import Put from "../../api/v1/model/account/put.js"; import AccountRenderer from "../../support/renderers/AccountRenderer.js"; import {showInternalsButton} from "../../support/page-settings/show-internals-button.js"; import {showWizardButton} from "../../support/page-settings/show-wizard-button.js"; diff --git a/resources/assets/v2/src/pages/administrations/create.js b/resources/assets/v2/src/pages/administrations/create.js index 0def2cdce6..ef0ccd6231 100644 --- a/resources/assets/v2/src/pages/administrations/create.js +++ b/resources/assets/v2/src/pages/administrations/create.js @@ -20,7 +20,7 @@ import '../../boot/bootstrap.js'; import dates from "../shared/dates.js"; -import Post from "../../api/v2/model/user-group/post.js"; +import Post from "../../api/v1/model/user-group/post.js"; import i18next from "i18next"; diff --git a/resources/assets/v2/src/pages/administrations/edit.js b/resources/assets/v2/src/pages/administrations/edit.js index 1cca799b6f..5237b770cd 100644 --- a/resources/assets/v2/src/pages/administrations/edit.js +++ b/resources/assets/v2/src/pages/administrations/edit.js @@ -20,10 +20,10 @@ import '../../boot/bootstrap.js'; import dates from "../shared/dates.js"; -import Post from "../../api/v2/model/user-group/post.js"; +import Post from "../../api/v1/model/user-group/post.js"; import i18next from "i18next"; -import Get from "../../api/v2/model/user-group/get.js"; -import Put from "../../api/v2/model/user-group/put.js"; +import Get from "../../api/v1/model/user-group/get.js"; +import Put from "../../api/v1/model/user-group/put.js"; let administrations = function () { diff --git a/resources/assets/v2/src/pages/administrations/index.js b/resources/assets/v2/src/pages/administrations/index.js index 40fe046ceb..bae286d55a 100644 --- a/resources/assets/v2/src/pages/administrations/index.js +++ b/resources/assets/v2/src/pages/administrations/index.js @@ -23,11 +23,9 @@ import dates from "../shared/dates.js"; import i18next from "i18next"; import {format} from "date-fns"; -import '@ag-grid-community/styles/ag-grid.css'; -import '@ag-grid-community/styles/ag-theme-alpine.css'; import '../../css/grid-ff3-theme.css'; -import Get from "../../api/v2/model/user-group/get.js"; -import Post from "../../api/v2/model/user-group/post.js"; +import Get from "../../api/v1/model/user-group/get.js"; +import Post from "../../api/v1/model/user-group/post.js"; let index = function () { return { diff --git a/resources/assets/v2/src/pages/dashboard/accounts.js b/resources/assets/v2/src/pages/dashboard/accounts.js index e22da6a86c..83567dbae4 100644 --- a/resources/assets/v2/src/pages/dashboard/accounts.js +++ b/resources/assets/v2/src/pages/dashboard/accounts.js @@ -20,9 +20,9 @@ import {getVariable} from "../../store/get-variable.js"; import {setVariable} from "../../store/set-variable.js"; -import Dashboard from "../../api/v2/chart/account/dashboard.js"; +import Dashboard from "../../api/v1/chart/account/dashboard.js"; import formatMoney from "../../util/format-money.js"; -import Get from "../../api/v2/model/account/get.js"; +import Get from "../../api/v1/model/account/get.js"; import {Chart} from 'chart.js'; import {getDefaultChartSettings} from "../../support/default-chart-settings.js"; import {getCacheKey} from "../../support/get-cache-key.js"; @@ -39,12 +39,12 @@ export default () => ({ loading: false, loadingAccounts: false, accountList: [], - autoConversion: false, - autoConversionAvailable: false, + convertToNative: false, + convertToNativeAvailable: false, chartOptions: null, - switchAutoConversion() { - this.autoConversion = !this.autoConversion; - setVariable('autoConversion', this.autoConversion); + switchConvertToNative() { + this.convertToNative = !this.convertToNative; + setVariable('convertToNative', this.convertToNative); }, localCacheKey(type) { return 'ds_accounts_' + type; @@ -90,18 +90,18 @@ export default () => ({ dataset.label = current.label; // use the "native" currency code and use the "native_entries" as array - if (this.autoConversion) { - currencies.push(current.native_currency_code); - dataset.currency_code = current.native_currency_code; - collection = Object.values(current.native_entries); - yAxis = 'y' + current.native_currency_code; - } - if (!this.autoConversion) { + // if (this.convertToNative) { + // currencies.push(current.native_currency_code); + // dataset.currency_code = current.native_currency_code; + // collection = Object.values(current.native_entries); + // yAxis = 'y' + current.native_currency_code; + // } + // if (!this.convertToNative) { yAxis = 'y' + current.currency_code; dataset.currency_code = current.currency_code; currencies.push(current.currency_code); collection = Object.values(current.entries); - } + // } dataset.yAxisID = yAxis; dataset.data = collection; @@ -217,12 +217,12 @@ export default () => ({ for (let iii = 0; iii < current.attributes.transactions.length; iii++) { let currentTransaction = current.attributes.transactions[iii]; //console.log(currentTransaction); - let nativeAmountRaw = 'withdrawal' === currentTransaction.type ? parseFloat(currentTransaction.native_amount) * -1 : parseFloat(currentTransaction.native_amount); + //let nativeAmountRaw = 'withdrawal' === currentTransaction.type ? parseFloat(currentTransaction.native_amount) * -1 : parseFloat(currentTransaction.native_amount); let amountRaw = 'withdrawal' === currentTransaction.type ? parseFloat(currentTransaction.amount) * -1 : parseFloat(currentTransaction.amount); // if transfer and source is this account, multiply again if('transfer' === currentTransaction.type && parseInt(currentTransaction.source_id) === accountId) { // - nativeAmountRaw = nativeAmountRaw * -1; + // nativeAmountRaw = nativeAmountRaw * -1; amountRaw = amountRaw * -1; } @@ -232,8 +232,8 @@ export default () => ({ type: currentTransaction.type, amount_raw: amountRaw, amount: formatMoney(amountRaw, currentTransaction.currency_code), - native_amount_raw: nativeAmountRaw, - native_amount: formatMoney(nativeAmountRaw, currentTransaction.native_currency_code), + // native_amount_raw: nativeAmountRaw, + // native_amount: formatMoney(nativeAmountRaw, currentTransaction.native_currency_code), }); } groups.push(group); @@ -244,7 +244,7 @@ export default () => ({ order: parent.attributes.order, id: parent.id, balance: parent.attributes.balance, - native_balance: parent.attributes.native_balance, + //native_balance: parent.attributes.native_balance, groups: groups, }); // console.log(parent.attributes); @@ -266,12 +266,12 @@ export default () => ({ init() { // console.log('accounts init'); - Promise.all([getVariable('viewRange', '1M'), getVariable('autoConversion', false), getVariable('language', 'en_US'), + Promise.all([getVariable('viewRange', '1M'), getVariable('convertToNative', false), getVariable('language', 'en_US'), getConfiguration('cer.enabled', false) ]).then((values) => { //console.log('accounts after promises'); - this.autoConversion = values[1] && values[3]; - this.autoConversionAvailable = values[3]; + this.convertToNative = values[1] && values[3]; + this.convertToNativeAvailable = values[3]; afterPromises = true; // main dashboard chart: @@ -289,11 +289,11 @@ export default () => ({ this.loadChart(); this.loadAccounts(); }); - window.store.observe('autoConversion', () => { + window.store.observe('convertToNative', () => { if (!afterPromises) { return; } - // console.log('accounts observe autoconversion'); + // console.log('accounts observe convertToNative'); this.loadChart(); this.loadAccounts(); }); diff --git a/resources/assets/v2/src/pages/dashboard/boxes.js b/resources/assets/v2/src/pages/dashboard/boxes.js index 1bcc66497a..911233af94 100644 --- a/resources/assets/v2/src/pages/dashboard/boxes.js +++ b/resources/assets/v2/src/pages/dashboard/boxes.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -import Summary from "../../api/v2/summary/index.js"; +import Summary from "../../api/v1/summary/index.js"; import {format} from "date-fns"; import {getVariable} from "../../store/get-variable.js"; import formatMoney from "../../util/format-money.js"; @@ -31,7 +31,7 @@ export default () => ({ billBox: {paid: [], unpaid: []}, leftBox: {left: [], perDay: []}, netBox: {net: []}, - autoConversion: false, + convertToNative: false, loading: false, boxData: null, boxOptions: null, @@ -42,8 +42,9 @@ export default () => ({ const boxesCacheKey = getCacheKey('ds_boxes_data', {start: start, end: end}); cleanupCache(); - const cacheValid = window.store.get('cacheValid'); + //const cacheValid = window.store.get('cacheValid'); let cachedData = window.store.get(boxesCacheKey); + const cacheValid = false; // force refresh if (cacheValid && typeof cachedData !== 'undefined') { this.boxData = cachedData; @@ -75,114 +76,56 @@ export default () => ({ continue; } let key = current.key; - // native (auto conversion): - if (this.autoConversion) { - if (key.startsWith('balance-in-native')) { - this.balanceBox.amounts.push(formatMoney(current.value, current.currency_code)); - // prep subtitles (for later) - if (!subtitles.hasOwnProperty(current.currency_code)) { - subtitles[current.currency_code] = ''; - } - continue; - } - // spent info is used in subtitle: - if (key.startsWith('spent-in-native')) { - // prep subtitles (for later) - if (!subtitles.hasOwnProperty(current.currency_code)) { - subtitles[current.currency_code] = ''; - } - // append the amount spent. - subtitles[current.currency_code] = - subtitles[current.currency_code] + - formatMoney(current.value, current.currency_code); - continue; - } - // earned info is used in subtitle: - if (key.startsWith('earned-in-native')) { - // prep subtitles (for later) - if (!subtitles.hasOwnProperty(current.currency_code)) { - subtitles[current.currency_code] = ''; - } - // prepend the amount earned. - subtitles[current.currency_code] = - formatMoney(current.value, current.currency_code) + ' + ' + - subtitles[current.currency_code]; - continue; - } - - if (key.startsWith('bills-unpaid-in-native')) { - this.billBox.unpaid.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('bills-paid-in-native')) { - this.billBox.paid.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('left-to-spend-in-native')) { - this.leftBox.left.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('left-per-day-to-spend-in-native')) { // per day - this.leftBox.perDay.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('net-worth-in-native')) { - this.netBox.net.push(formatMoney(current.value, current.currency_code)); - continue; - } + console.log('NOT NATIVE'); + if (key.startsWith('balance-in-')) { + this.balanceBox.amounts.push(formatMoney(current.monetary_value, current.currency_code)); + continue; } - // not native - if (!this.autoConversion && !key.endsWith('native')) { - if (key.startsWith('balance-in-')) { - this.balanceBox.amounts.push(formatMoney(current.value, current.currency_code)); - continue; + // spent info is used in subtitle: + if (key.startsWith('spent-in-')) { + // prep subtitles (for later) + if (!subtitles.hasOwnProperty(current.currency_code)) { + subtitles[current.currency_code] = ''; } - // spent info is used in subtitle: - if (key.startsWith('spent-in-')) { - // prep subtitles (for later) - if (!subtitles.hasOwnProperty(current.currency_code)) { - subtitles[current.currency_code] = ''; - } - // append the amount spent. - subtitles[current.currency_code] = - subtitles[current.currency_code] + - formatMoney(current.value, current.currency_code); - continue; - } - // earned info is used in subtitle: - if (key.startsWith('earned-in-')) { - // prep subtitles (for later) - if (!subtitles.hasOwnProperty(current.currency_code)) { - subtitles[current.currency_code] = ''; - } - // prepend the amount earned. - subtitles[current.currency_code] = - formatMoney(current.value, current.currency_code) + ' + ' + - subtitles[current.currency_code]; - continue; + // append the amount spent. + subtitles[current.currency_code] = + subtitles[current.currency_code] + + formatMoney(current.monetary_value, current.currency_code); + continue; + } + // earned info is used in subtitle: + if (key.startsWith('earned-in-')) { + // prep subtitles (for later) + if (!subtitles.hasOwnProperty(current.currency_code)) { + subtitles[current.currency_code] = ''; } + // prepend the amount earned. + subtitles[current.currency_code] = + formatMoney(current.monetary_value, current.currency_code) + ' + ' + + subtitles[current.currency_code]; + continue; + } - if (key.startsWith('bills-unpaid-in-')) { - this.billBox.unpaid.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('bills-paid-in-')) { - this.billBox.paid.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('left-to-spend-in-')) { - this.leftBox.left.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('left-per-day-to-spend-in-')) { - this.leftBox.perDay.push(formatMoney(current.value, current.currency_code)); - continue; - } - if (key.startsWith('net-worth-in-')) { - this.netBox.net.push(formatMoney(current.value, current.currency_code)); + if (key.startsWith('bills-unpaid-in-')) { + this.billBox.unpaid.push(formatMoney(current.monetary_value, current.currency_code)); + continue; + } + if (key.startsWith('bills-paid-in-')) { + this.billBox.paid.push(formatMoney(current.monetary_value, current.currency_code)); + continue; + } + if (key.startsWith('left-to-spend-in-')) { + this.leftBox.left.push(formatMoney(current.monetary_value, current.currency_code)); + continue; + } + if (key.startsWith('left-per-day-to-spend-in-')) { + this.leftBox.perDay.push(formatMoney(current.monetary_value, current.currency_code)); + continue; + } + if (key.startsWith('net-worth-in-')) { + this.netBox.net.push(formatMoney(current.monetary_value, current.currency_code)); - } } } } @@ -210,10 +153,10 @@ export default () => ({ init() { // console.log('boxes init'); // TODO can be replaced by "getVariables" - Promise.all([getVariable('viewRange'), getVariable('autoConversion', false)]).then((values) => { + Promise.all([getVariable('viewRange'), getVariable('convertToNative', false)]).then((values) => { // console.log('boxes after promises'); afterPromises = true; - this.autoConversion = values[1]; + this.convertToNative = values[1]; this.loadBoxes(); }); window.store.observe('end', () => { @@ -224,12 +167,12 @@ export default () => ({ this.boxData = null; this.loadBoxes(); }); - window.store.observe('autoConversion', (newValue) => { + window.store.observe('convertToNative', (newValue) => { if (!afterPromises) { return; } - // console.log('boxes observe autoConversion'); - this.autoConversion = newValue; + // console.log('boxes observe convertToNative'); + this.convertToNative = newValue; this.loadBoxes(); }); }, diff --git a/resources/assets/v2/src/pages/dashboard/budgets.js b/resources/assets/v2/src/pages/dashboard/budgets.js index fe7dc039af..5f8a4d800a 100644 --- a/resources/assets/v2/src/pages/dashboard/budgets.js +++ b/resources/assets/v2/src/pages/dashboard/budgets.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ import {getVariable} from "../../store/get-variable.js"; -import Dashboard from "../../api/v2/chart/budget/dashboard.js"; +import Dashboard from "../../api/v1/chart/budget/dashboard.js"; import {getDefaultChartSettings} from "../../support/default-chart-settings.js"; import formatMoney from "../../util/format-money.js"; import {Chart} from 'chart.js'; @@ -34,7 +34,7 @@ let afterPromises = false; export default () => ({ loading: false, - autoConversion: false, + convertToNative: false, loadChart() { if (true === this.loading) { return; @@ -134,7 +134,7 @@ export default () => ({ // // convert to EUR yes no? let label = current.label + ' (' + current.currency_code + ')'; options.data.labels.push(label); - if (this.autoConversion) { + if (this.convertToNative) { currencies.push(current.native_currency_code); // series 0: spent options.data.datasets[0].data.push(parseFloat(current.native_entries.spent) * -1); @@ -143,7 +143,7 @@ export default () => ({ // series 2: overspent options.data.datasets[2].data.push(parseFloat(current.native_entries.overspent)); } - if (!this.autoConversion) { + if (!this.convertToNative) { currencies.push(current.currency_code); // series 0: spent options.data.datasets[0].data.push(parseFloat(current.entries.spent) * -1); @@ -172,8 +172,8 @@ export default () => ({ init() { - Promise.all([getVariable('autoConversion', false)]).then((values) => { - this.autoConversion = values[0]; + Promise.all([getVariable('convertToNative', false)]).then((values) => { + this.convertToNative = values[0]; afterPromises = true; if (false === this.loading) { this.loadChart(); @@ -189,12 +189,12 @@ export default () => ({ this.loadChart(); } }); - window.store.observe('autoConversion', (newValue) => { + window.store.observe('convertToNative', (newValue) => { if (!afterPromises) { return; } - // console.log('boxes observe autoConversion'); - this.autoConversion = newValue; + // console.log('boxes observe convertToNative'); + this.convertToNative = newValue; if (false === this.loading) { this.loadChart(); } diff --git a/resources/assets/v2/src/pages/dashboard/categories.js b/resources/assets/v2/src/pages/dashboard/categories.js index 8f68e28b38..b655947c0b 100644 --- a/resources/assets/v2/src/pages/dashboard/categories.js +++ b/resources/assets/v2/src/pages/dashboard/categories.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ import {getVariable} from "../../store/get-variable.js"; -import Dashboard from "../../api/v2/chart/category/dashboard.js"; +import Dashboard from "../../api/v1/chart/category/dashboard.js"; import {getDefaultChartSettings} from "../../support/default-chart-settings.js"; import {Chart} from "chart.js"; import formatMoney from "../../util/format-money.js"; @@ -32,7 +32,7 @@ let afterPromises = false; export default () => ({ loading: false, - autoConversion: false, + convertToNative: false, generateOptions(data) { currencies = []; let options = getDefaultChartSettings('column'); @@ -44,7 +44,7 @@ export default () => ({ let current = data[i]; let code = current.currency_code; // only use native code when doing auto conversion. - if (this.autoConversion) { + if (this.convertToNative) { code = current.native_currency_code; } @@ -65,7 +65,7 @@ export default () => ({ let yAxis = 'y'; let current = data[i]; let code = current.currency_code; - if (this.autoConversion) { + if (this.convertToNative) { code = current.native_currency_code; } @@ -77,7 +77,7 @@ export default () => ({ // this series' currency matches this column's currency. amount = parseFloat(current.amount); yAxis = 'y' + current.currency_code; - if (this.autoConversion) { + if (this.convertToNative) { amount = parseFloat(current.native_amount); yAxis = 'y' + current.native_currency_code; } @@ -183,8 +183,8 @@ export default () => ({ }, init() { // console.log('categories init'); - Promise.all([getVariable('autoConversion', false),]).then((values) => { - this.autoConversion = values[0]; + Promise.all([getVariable('convertToNative', false),]).then((values) => { + this.convertToNative = values[0]; afterPromises = true; this.loadChart(); }); @@ -195,11 +195,11 @@ export default () => ({ this.chartData = null; this.loadChart(); }); - window.store.observe('autoConversion', (newValue) => { + window.store.observe('convertToNative', (newValue) => { if (!afterPromises) { return; } - this.autoConversion = newValue; + this.convertToNative = newValue; this.loadChart(); }); }, diff --git a/resources/assets/v2/src/pages/dashboard/piggies.js b/resources/assets/v2/src/pages/dashboard/piggies.js index 037932f9f2..a23bd4e63e 100644 --- a/resources/assets/v2/src/pages/dashboard/piggies.js +++ b/resources/assets/v2/src/pages/dashboard/piggies.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ import {getVariable} from "../../store/get-variable.js"; -import Get from "../../api/v2/model/piggy-bank/get.js"; +import Get from "../../api/v1/model/piggy-bank/get.js"; import {getCacheKey} from "../../support/get-cache-key.js"; import {format} from "date-fns"; import i18next from "i18next"; @@ -29,7 +29,7 @@ const PIGGY_CACHE_KEY = 'ds_pg_data'; export default () => ({ loading: false, - autoConversion: false, + convertToNative: false, sankeyGrouping: 'account', piggies: [], getFreshData() { @@ -96,14 +96,14 @@ export default () => ({ id: current.id, name: current.attributes.name, percentage: parseInt(current.attributes.percentage), - amount: this.autoConversion ? current.attributes.native_current_amount : current.attributes.current_amount, + amount: this.convertToNative ? current.attributes.native_current_amount : current.attributes.current_amount, // left to save - left_to_save: this.autoConversion ? current.attributes.native_left_to_save : current.attributes.left_to_save, + left_to_save: this.convertToNative ? current.attributes.native_left_to_save : current.attributes.left_to_save, // target amount - target_amount: this.autoConversion ? current.attributes.native_target_amount : current.attributes.target_amount, + target_amount: this.convertToNative ? current.attributes.native_target_amount : current.attributes.target_amount, // save per month - save_per_month: this.autoConversion ? current.attributes.native_save_per_month : current.attributes.save_per_month, - currency_code: this.autoConversion ? current.attributes.native_currency_code : current.attributes.currency_code, + save_per_month: this.convertToNative ? current.attributes.native_save_per_month : current.attributes.save_per_month, + currency_code: this.convertToNative ? current.attributes.native_currency_code : current.attributes.currency_code, }; dataSet[groupName].piggies.push(piggy); @@ -129,10 +129,10 @@ export default () => ({ init() { // console.log('piggies init'); apiData = []; - Promise.all([getVariable('autoConversion', false)]).then((values) => { + Promise.all([getVariable('convertToNative', false)]).then((values) => { afterPromises = true; - this.autoConversion = values[0]; + this.convertToNative = values[0]; this.loadPiggyBanks(); }); @@ -144,12 +144,12 @@ export default () => ({ apiData = []; this.loadPiggyBanks(); }); - window.store.observe('autoConversion', (newValue) => { + window.store.observe('convertToNative', (newValue) => { if (!afterPromises) { return; } - // console.log('piggies observe autoConversion'); - this.autoConversion = newValue; + // console.log('piggies observe convertToNative'); + this.convertToNative = newValue; this.loadPiggyBanks(); }); }, diff --git a/resources/assets/v2/src/pages/dashboard/sankey.js b/resources/assets/v2/src/pages/dashboard/sankey.js index 40a73e5aaa..6705883ad2 100644 --- a/resources/assets/v2/src/pages/dashboard/sankey.js +++ b/resources/assets/v2/src/pages/dashboard/sankey.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ import {getVariable} from "../../store/get-variable.js"; -import Get from "../../api/v2/model/transaction/get.js"; +import Get from "../../api/v1/model/transaction/get.js"; import {getDefaultChartSettings} from "../../support/default-chart-settings.js"; import {Chart} from 'chart.js'; import {Flow, SankeyController} from 'chartjs-chart-sankey'; @@ -33,7 +33,7 @@ let currencies = []; let afterPromises = false; let chart = null; let transactions = []; -let autoConversion = false; +let convertToNative = false; let translations = { category: null, unknown_category: null, @@ -83,37 +83,37 @@ function getObjectName(type, name, direction, code) { // category 4x if ('category' === type && null !== name && 'in' === direction) { - return translations.category + ' "' + name + '" (' + translations.in + (autoConversion ? ', ' + code + ')' : ')'); + return translations.category + ' "' + name + '" (' + translations.in + (convertToNative ? ', ' + code + ')' : ')'); } if ('category' === type && null === name && 'in' === direction) { - return translations.unknown_category + ' (' + translations.in + (autoConversion ? ', ' + code + ')' : ')'); + return translations.unknown_category + ' (' + translations.in + (convertToNative ? ', ' + code + ')' : ')'); } if ('category' === type && null !== name && 'out' === direction) { - return translations.category + ' "' + name + '" (' + translations.out + (autoConversion ? ', ' + code + ')' : ')'); + return translations.category + ' "' + name + '" (' + translations.out + (convertToNative ? ', ' + code + ')' : ')'); } if ('category' === type && null === name && 'out' === direction) { - return translations.unknown_category + ' (' + translations.out + (autoConversion ? ', ' + code + ')' : ')'); + return translations.unknown_category + ' (' + translations.out + (convertToNative ? ', ' + code + ')' : ')'); } // account 4x if ('account' === type && null === name && 'in' === direction) { - return translations.unknown_source + (autoConversion ? ' (' + code + ')' : ''); + return translations.unknown_source + (convertToNative ? ' (' + code + ')' : ''); } if ('account' === type && null !== name && 'in' === direction) { - return translations.revenue_account + '"' + name + '"' + (autoConversion ? ' (' + code + ')' : ''); + return translations.revenue_account + '"' + name + '"' + (convertToNative ? ' (' + code + ')' : ''); } if ('account' === type && null === name && 'out' === direction) { - return translations.unknown_dest + (autoConversion ? ' (' + code + ')' : ''); + return translations.unknown_dest + (convertToNative ? ' (' + code + ')' : ''); } if ('account' === type && null !== name && 'out' === direction) { - return translations.expense_account + ' "' + name + '"' + (autoConversion ? ' (' + code + ')' : ''); + return translations.expense_account + ' "' + name + '"' + (convertToNative ? ' (' + code + ')' : ''); } // budget 2x if ('budget' === type && null !== name) { - return translations.budget + ' "' + name + '"' + (autoConversion ? ' (' + code + ')' : ''); + return translations.budget + ' "' + name + '"' + (convertToNative ? ' (' + code + ')' : ''); } if ('budget' === type && null === name) { - return translations.unknown_budget + (autoConversion ? ' (' + code + ')' : ''); + return translations.unknown_budget + (convertToNative ? ' (' + code + ')' : ''); } console.error('Cannot handle: type:"' + type + '", dir: "' + direction + '"'); } @@ -121,25 +121,25 @@ function getObjectName(type, name, direction, code) { function getLabelName(type, name, code) { // category if ('category' === type && null !== name) { - return translations.category + ' "' + name + '"' + (autoConversion ? ' (' + code + ')' : ''); + return translations.category + ' "' + name + '"' + (convertToNative ? ' (' + code + ')' : ''); } if ('category' === type && null === name) { - return translations.unknown_category + (autoConversion ? ' (' + code + ')' : ''); + return translations.unknown_category + (convertToNative ? ' (' + code + ')' : ''); } // account if ('account' === type && null === name) { - return translations.unknown_account + (autoConversion ? ' (' + code + ')' : ''); + return translations.unknown_account + (convertToNative ? ' (' + code + ')' : ''); } if ('account' === type && null !== name) { - return name + (autoConversion ? ' (' + code + ')' : ''); + return name + (convertToNative ? ' (' + code + ')' : ''); } // budget 2x if ('budget' === type && null !== name) { - return translations.budget + ' "' + name + '"' + (autoConversion ? ' (' + code + ')' : ''); + return translations.budget + ' "' + name + '"' + (convertToNative ? ' (' + code + ')' : ''); } if ('budget' === type && null === name) { - return translations.unknown_budget + (autoConversion ? ' (' + code + ')' : ''); + return translations.unknown_budget + (convertToNative ? ' (' + code + ')' : ''); } console.error('Cannot handle: type:"' + type + '"'); } @@ -147,7 +147,7 @@ function getLabelName(type, name, code) { export default () => ({ loading: false, - autoConversion: false, + convertToNative: false, generateOptions() { let options = getDefaultChartSettings('sankey'); @@ -164,8 +164,8 @@ export default () => ({ if (group.attributes.transactions.hasOwnProperty(ii)) { // properties of the transaction, used in the generation of the chart: let transaction = group.attributes.transactions[ii]; - let currencyCode = this.autoConversion ? transaction.native_currency_code : transaction.currency_code; - let amount = this.autoConversion ? parseFloat(transaction.native_amount) : parseFloat(transaction.amount); + let currencyCode = this.convertToNative ? transaction.native_currency_code : transaction.currency_code; + let amount = this.convertToNative ? parseFloat(transaction.native_amount) : parseFloat(transaction.amount); let flowKey; /* @@ -194,7 +194,7 @@ export default () => ({ if (!amounts.hasOwnProperty(flowKey)) { amounts[flowKey] = { from: category, - to: translations.all_money + (this.autoConversion ? ' (' + currencyCode + ')' : ''), + to: translations.all_money + (this.convertToNative ? ' (' + currencyCode + ')' : ''), amount: 0 }; } @@ -214,7 +214,7 @@ export default () => ({ if (!amounts.hasOwnProperty(flowKey)) { amounts[flowKey] = { - from: translations.all_money + (this.autoConversion ? ' (' + currencyCode + ')' : ''), + from: translations.all_money + (this.convertToNative ? ' (' + currencyCode + ')' : ''), to: budget, amount: 0 }; @@ -348,9 +348,9 @@ export default () => ({ init() { // console.log('sankey init'); transactions = []; - Promise.all([getVariable('autoConversion', false)]).then((values) => { - this.autoConversion = values[0]; - autoConversion = values[0]; + Promise.all([getVariable('convertToNative', false)]).then((values) => { + this.convertToNative = values[0]; + convertToNative = values[0]; // some translations: translations.all_money = i18next.t('firefly.all_money'); translations.category = i18next.t('firefly.category'); @@ -378,12 +378,12 @@ export default () => ({ this.transactions = []; this.loadChart(); }); - window.store.observe('autoConversion', (newValue) => { + window.store.observe('convertToNative', (newValue) => { if (!afterPromises) { return; } - // console.log('sankey observe autoConversion'); - this.autoConversion = newValue; + // console.log('sankey observe convertToNative'); + this.convertToNative = newValue; this.loadChart(); }); }, diff --git a/resources/assets/v2/src/pages/dashboard/subscriptions.js b/resources/assets/v2/src/pages/dashboard/subscriptions.js index 9cca5c9c7e..6b1f35da7a 100644 --- a/resources/assets/v2/src/pages/dashboard/subscriptions.js +++ b/resources/assets/v2/src/pages/dashboard/subscriptions.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ import {getVariable} from "../../store/get-variable.js"; -import Get from "../../api/v2/model/subscription/get.js"; +import Get from "../../api/v1/model/subscription/get.js"; import {format} from "date-fns"; import {getCacheKey} from "../../support/get-cache-key.js"; import {Chart} from "chart.js"; @@ -66,10 +66,10 @@ function downloadSubscriptions(params) { currency_code: current.attributes.currency_code, // native amount - native_amount_min: current.attributes.native_amount_min, - native_amount_max: current.attributes.native_amount_max, - native_amount: (parseFloat(current.attributes.native_amount_max) + parseFloat(current.attributes.native_amount_min)) / 2, - native_currency_code: current.attributes.native_currency_code, + // native_amount_min: current.attributes.native_amount_min, + // native_amount_max: current.attributes.native_amount_max, + // native_amount: (parseFloat(current.attributes.native_amount_max) + parseFloat(current.attributes.native_amount_min)) / 2, + // native_currency_code: current.attributes.native_currency_code, // paid transactions: transactions: [], @@ -79,8 +79,7 @@ function downloadSubscriptions(params) { paid: current.attributes.paid_dates.length > 0, }; // set variables - bill.expected_amount = params.autoConversion ? formatMoney(bill.native_amount, bill.native_currency_code) : - formatMoney(bill.amount, bill.currency_code); + bill.expected_amount = formatMoney(bill.amount, bill.currency_code); bill.expected_times = i18next.t('firefly.subscr_expected_x_times', { times: current.attributes.pay_dates.length, amount: bill.expected_amount @@ -92,22 +91,25 @@ function downloadSubscriptions(params) { const currentPayment = current.attributes.paid_dates[iii]; let percentage = 100; // math: -100+(paid/expected)*100 - if (params.autoConversion) { + if (params.convertToNative) { percentage = Math.round(-100 + ((parseFloat(currentPayment.native_amount) * -1) / parseFloat(bill.native_amount)) * 100); } - if (!params.autoConversion) { + if (!params.convertToNative) { percentage = Math.round(-100 + ((parseFloat(currentPayment.amount) * -1) / parseFloat(bill.amount)) * 100); } - + // TODO fix me + currentPayment.currency_code = 'EUR'; + console.log('Currency code: "'+currentPayment+'"'); + console.log(currentPayment); let currentTransaction = { - amount: params.autoConversion ? formatMoney(currentPayment.native_amount, currentPayment.native_currency_code) : formatMoney(currentPayment.amount, currentPayment.currency_code), + amount: formatMoney(currentPayment.amount, currentPayment.currency_code), percentage: percentage, date: format(new Date(currentPayment.date), 'PP'), foreign_amount: null, }; if (null !== currentPayment.foreign_currency_code) { - currentTransaction.foreign_amount = params.autoConversion ? currentPayment.foreign_native_amount : currentPayment.foreign_amount; - currentTransaction.foreign_currency_code = params.autoConversion ? currentPayment.native_currency_code : currentPayment.foreign_currency_code; + currentTransaction.foreign_amount = currentPayment.foreign_amount; + currentTransaction.foreign_currency_code = currentPayment.foreign_currency_code; } bill.transactions.push(currentTransaction); @@ -119,7 +121,7 @@ function downloadSubscriptions(params) { // bill is unpaid, count the "pay_dates" and multiply with the "amount". // since bill is unpaid, this can only be in currency amount and native currency amount. const totalAmount = current.attributes.pay_dates.length * bill.amount; - const totalNativeAmount = current.attributes.pay_dates.length * bill.native_amount; + // const totalNativeAmount = current.attributes.pay_dates.length * bill.native_amount; // for bill's currency if (!subscriptionData[objectGroupId].payment_info.hasOwnProperty(bill.currency_code)) { subscriptionData[objectGroupId].payment_info[bill.currency_code] = { @@ -128,11 +130,11 @@ function downloadSubscriptions(params) { unpaid: 0, native_currency_code: bill.native_currency_code, native_paid: 0, - native_unpaid: 0, + //native_unpaid: 0, }; } subscriptionData[objectGroupId].payment_info[bill.currency_code].unpaid += totalAmount; - subscriptionData[objectGroupId].payment_info[bill.currency_code].native_unpaid += totalNativeAmount; + //subscriptionData[objectGroupId].payment_info[bill.currency_code].native_unpaid += totalNativeAmount; } if (current.attributes.paid_dates.length > 0) { @@ -149,15 +151,15 @@ function downloadSubscriptions(params) { currency_code: bill.currency_code, paid: 0, unpaid: 0, - native_currency_code: bill.native_currency_code, - native_paid: 0, - native_unpaid: 0, + // native_currency_code: bill.native_currency_code, + // native_paid: 0, + //native_unpaid: 0, }; } const amount = parseFloat(currentJournal.amount) * -1; - const nativeAmount = parseFloat(currentJournal.native_amount) * -1; + // const nativeAmount = parseFloat(currentJournal.native_amount) * -1; subscriptionData[objectGroupId].payment_info[currentJournal.currency_code].paid += amount; - subscriptionData[objectGroupId].payment_info[currentJournal.currency_code].native_paid += nativeAmount; + // subscriptionData[objectGroupId].payment_info[currentJournal.currency_code].native_paid += nativeAmount; } } } @@ -178,7 +180,7 @@ function downloadSubscriptions(params) { export default () => ({ loading: false, - autoConversion: false, + convertToNative: false, subscriptions: [], startSubscriptions() { this.loading = true; @@ -198,7 +200,7 @@ export default () => ({ let params = { start: format(start, 'y-MM-dd'), end: format(end, 'y-MM-dd'), - autoConversion: this.autoConversion, + // convertToNative: this.convertToNative, page: 1 }; downloadSubscriptions(params).then(() => { @@ -226,9 +228,9 @@ export default () => ({ drawPieChart(groupId, groupTitle, data) { let id = '#pie_' + groupId + '_' + data.currency_code; //console.log(data); - const unpaidAmount = this.autoConversion ? data.native_unpaid : data.unpaid; - const paidAmount = this.autoConversion ? data.native_paid : data.paid; - const currencyCode = this.autoConversion ? data.native_currency_code : data.currency_code; + const unpaidAmount = data.unpaid; + const paidAmount = data.paid; + const currencyCode = data.currency_code; const chartData = { labels: [ i18next.t('firefly.paid'), @@ -267,8 +269,8 @@ export default () => ({ }, init() { - Promise.all([getVariable('autoConversion', false)]).then((values) => { - this.autoConversion = values[0]; + Promise.all([getVariable('convertToNative', false)]).then((values) => { + this.convertToNative = values[0]; afterPromises = true; if (false === this.loading) { @@ -285,11 +287,11 @@ export default () => ({ this.startSubscriptions(); } }); - window.store.observe('autoConversion', (newValue) => { + window.store.observe('convertToNative', (newValue) => { if (!afterPromises) { return; } - this.autoConversion = newValue; + this.convertToNative = newValue; if (false === this.loading) { this.startSubscriptions(); } diff --git a/resources/assets/v2/src/pages/transactions/create.js b/resources/assets/v2/src/pages/transactions/create.js index 18682d0e98..a876f78e88 100644 --- a/resources/assets/v2/src/pages/transactions/create.js +++ b/resources/assets/v2/src/pages/transactions/create.js @@ -23,7 +23,7 @@ import dates from '../../pages/shared/dates.js'; import {createEmptySplit, defaultErrorSet} from "./shared/create-empty-split.js"; import {parseFromEntries} from "./shared/parse-from-entries.js"; import formatMoney from "../../util/format-money.js"; -import Post from "../../api/v2/model/transaction/post.js"; +import Post from "../../api/v1/model/transaction/post.js"; import {loadCurrencies} from "./shared/load-currencies.js"; import {loadBudgets} from "./shared/load-budgets.js"; import {loadPiggyBanks} from "./shared/load-piggy-banks.js"; diff --git a/resources/assets/v2/src/pages/transactions/edit.js b/resources/assets/v2/src/pages/transactions/edit.js index 9d3fcc38d7..7698a1b131 100644 --- a/resources/assets/v2/src/pages/transactions/edit.js +++ b/resources/assets/v2/src/pages/transactions/edit.js @@ -21,7 +21,7 @@ import '../../boot/bootstrap.js'; import dates from '../../pages/shared/dates.js'; import formatMoney from "../../util/format-money.js"; -import Get from "../../api/v2/model/transaction/get.js"; +import Get from "../../api/v1/model/transaction/get.js"; import {parseDownloadedSplits} from "./shared/parse-downloaded-splits.js"; import {addAutocomplete, getUrls} from "./shared/add-autocomplete.js"; import { @@ -40,7 +40,7 @@ import Tags from "bootstrap5-tags"; import i18next from "i18next"; import {defaultErrorSet} from "./shared/create-empty-split.js"; import {parseFromEntries} from "./shared/parse-from-entries.js"; -import Put from "../../api/v2/model/transaction/put.js"; +import Put from "../../api/v1/model/transaction/put.js"; import {processAttachments} from "./shared/process-attachments.js"; import {spliceErrorsIntoTransactions} from "./shared/splice-errors-into-transactions.js"; diff --git a/resources/assets/v2/src/pages/transactions/index.js b/resources/assets/v2/src/pages/transactions/index.js index 7b8d3c759d..e9f587b624 100644 --- a/resources/assets/v2/src/pages/transactions/index.js +++ b/resources/assets/v2/src/pages/transactions/index.js @@ -24,10 +24,8 @@ import i18next from "i18next"; import {format} from "date-fns"; import formatMoney from "../../util/format-money.js"; -import '@ag-grid-community/styles/ag-grid.css'; -import '@ag-grid-community/styles/ag-theme-alpine.css'; import '../../css/grid-ff3-theme.css'; -import Get from "../../api/v2/model/transaction/get.js"; +import Get from "../../api/v1/model/transaction/get.js"; let index = function () { return { diff --git a/resources/assets/v2/src/pages/transactions/shared/add-autocomplete.js b/resources/assets/v2/src/pages/transactions/shared/add-autocomplete.js index d037448707..c648579df0 100644 --- a/resources/assets/v2/src/pages/transactions/shared/add-autocomplete.js +++ b/resources/assets/v2/src/pages/transactions/shared/add-autocomplete.js @@ -22,10 +22,10 @@ import Autocomplete from "bootstrap5-autocomplete"; export function getUrls() { return { - description: '/api/v2/autocomplete/transaction-descriptions', - account: '/api/v2/autocomplete/accounts', - category: '/api/v2/autocomplete/categories', - tag: '/api/v2/autocomplete/tags', + description: '/api/v1/autocomplete/transaction-descriptions', + account: '/api/v1/autocomplete/accounts', + category: '/api/v1/autocomplete/categories', + tag: '/api/v1/autocomplete/tags', } } diff --git a/resources/assets/v2/src/pages/transactions/shared/load-budgets.js b/resources/assets/v2/src/pages/transactions/shared/load-budgets.js index 27ba98b582..8416953fc3 100644 --- a/resources/assets/v2/src/pages/transactions/shared/load-budgets.js +++ b/resources/assets/v2/src/pages/transactions/shared/load-budgets.js @@ -19,7 +19,7 @@ */ -import Get from "../../../api/v2/model/budget/get.js"; +import Get from "../../../api/v1/model/budget/get.js"; export function loadBudgets() { let params = { diff --git a/resources/assets/v2/src/pages/transactions/shared/load-currencies.js b/resources/assets/v2/src/pages/transactions/shared/load-currencies.js index 048baa5701..02497d5a3a 100644 --- a/resources/assets/v2/src/pages/transactions/shared/load-currencies.js +++ b/resources/assets/v2/src/pages/transactions/shared/load-currencies.js @@ -19,7 +19,7 @@ */ -import Get from "../../../api/v2/model/currency/get.js"; +import Get from "../../../api/v1/model/currency/get.js"; export function loadCurrencies() { let params = { diff --git a/resources/assets/v2/src/pages/transactions/shared/load-piggy-banks.js b/resources/assets/v2/src/pages/transactions/shared/load-piggy-banks.js index 3e32d8afb6..c014345539 100644 --- a/resources/assets/v2/src/pages/transactions/shared/load-piggy-banks.js +++ b/resources/assets/v2/src/pages/transactions/shared/load-piggy-banks.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -import Get from "../../../api/v2/model/piggy-bank/get.js"; +import Get from "../../../api/v1/model/piggy-bank/get.js"; export function loadPiggyBanks() { let params = { diff --git a/resources/assets/v2/src/pages/transactions/shared/load-subscriptions.js b/resources/assets/v2/src/pages/transactions/shared/load-subscriptions.js index 29dea7b13b..a3ecb8b657 100644 --- a/resources/assets/v2/src/pages/transactions/shared/load-subscriptions.js +++ b/resources/assets/v2/src/pages/transactions/shared/load-subscriptions.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -import SubscriptionGet from "../../../api/v2/model/subscription/get.js"; +import SubscriptionGet from "../../../api/v1/model/subscription/get.js"; export function loadSubscriptions() { let params = { diff --git a/resources/assets/v2/src/pages/transactions/shared/process-attachments.js b/resources/assets/v2/src/pages/transactions/shared/process-attachments.js index a842671942..3e493ecc1d 100644 --- a/resources/assets/v2/src/pages/transactions/shared/process-attachments.js +++ b/resources/assets/v2/src/pages/transactions/shared/process-attachments.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -import AttachmentPost from "../../../api/v1/attachments/post.js"; +import AttachmentPost from "../../../api/v1/model/attachment/post.js"; let uploadFiles = function (fileData) { let count = fileData.length; diff --git a/resources/assets/v2/src/pages/transactions/show.js b/resources/assets/v2/src/pages/transactions/show.js index 5b24c388c8..ad5a3f55ab 100644 --- a/resources/assets/v2/src/pages/transactions/show.js +++ b/resources/assets/v2/src/pages/transactions/show.js @@ -21,7 +21,7 @@ import '../../boot/bootstrap.js'; import dates from "../shared/dates.js"; import i18next from "i18next"; -import Get from "../../api/v2/model/transaction/get.js"; +import Get from "../../api/v1/model/transaction/get.js"; import {parseDownloadedSplits} from "./shared/parse-downloaded-splits.js"; import {format} from "date-fns"; import formatMoney from "../../util/format-money.js"; diff --git a/resources/assets/v2/src/support/page-settings/show-internals-button.js b/resources/assets/v2/src/support/page-settings/show-internals-button.js index a0d8e022a3..d9b466718d 100644 --- a/resources/assets/v2/src/support/page-settings/show-internals-button.js +++ b/resources/assets/v2/src/support/page-settings/show-internals-button.js @@ -20,6 +20,6 @@ export function showInternalsButton() { - console.log('showInternalsButton'); + // console.log('showInternalsButton'); document.querySelector('.toggle-page-internals').classList.remove('d-none'); } diff --git a/resources/assets/v2/vite.config.js b/resources/assets/v2/vite.config.js index 74c6bde199..f3f18671bb 100644 --- a/resources/assets/v2/vite.config.js +++ b/resources/assets/v2/vite.config.js @@ -36,8 +36,8 @@ export default defineConfig(({command, mode, isSsrBuild, isPreview}) => { let https = null; if (command === 'serve') { https = { - key: fs.readFileSync(`/sites/vm/tls-certificates/wildcard.sd.internal.key`), - cert: fs.readFileSync(`/sites/vm/tls-certificates/wildcard.sd.internal.crt`), + key: fs.readFileSync(`/vagrant/tls-certificates/wildcard.sd.internal.key`), + cert: fs.readFileSync(`/vagrant/tls-certificates/wildcard.sd.internal.crt`), }; } @@ -82,11 +82,13 @@ export default defineConfig(({command, mode, isSsrBuild, isPreview}) => { server: { - origin: 'http://127.0.0.1:8000', + cors: true, + origin: 'https://firefly.sd.internal:5173', watch: { usePolling: true, }, - host: '10.0.0.15', + port: 5173, + host: true, // hmr: { // protocol: 'wss', // }, diff --git a/resources/lang/en_US/email.php b/resources/lang/en_US/email.php index bb8ad63788..2bdb563656 100644 --- a/resources/lang/en_US/email.php +++ b/resources/lang/en_US/email.php @@ -64,8 +64,8 @@ return [ // unknown user login attempt 'unknown_user_subject' => 'An unknown user tried to log in', - 'unknown_user_body' => 'An unknown user tried to log in to Firefly III. The email address they used was ":address".', - 'unknown_user_message' => 'The email address they used was ":address".', + 'unknown_user_body' => 'An unknown user (:ip) tried to log in to Firefly III. The email address they used was ":address".', + 'unknown_user_message' => 'The email address they (:ip) used was ":address".', // known user login attempt 'failed_login_subject' => 'Firefly III detected a failed login attempt', diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 34207428f1..e7d4b8c1a4 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -2447,6 +2447,7 @@ return [ 'min-amount' => 'Minimum amount', 'journal-amount' => 'Current subscription entry', 'name' => 'Name', + 'expires_at' => 'Expires at', 'date' => 'Date', 'date_and_time' => 'Date and time', 'time' => 'Time', diff --git a/resources/locales/fa_IR/locales.json b/resources/locales/fa_IR/locales.json new file mode 100644 index 0000000000..7e8f75bc72 --- /dev/null +++ b/resources/locales/fa_IR/locales.json @@ -0,0 +1 @@ +{"as":"\u0622\u0633\u0627\u0645\u06cc","as_IN":"\u0622\u0633\u0627\u0645\u06cc (\u0647\u0646\u062f)","os":"\u0622\u0633\u06cc","os_RU":"\u0622\u0633\u06cc (\u0631\u0648\u0633\u06cc\u0647)","os_GE":"\u0622\u0633\u06cc (\u06af\u0631\u062c\u0633\u062a\u0627\u0646)","af":"\u0622\u0641\u0631\u06cc\u06a9\u0627\u0646\u0633","af_ZA":"\u0622\u0641\u0631\u06cc\u06a9\u0627\u0646\u0633 (\u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc)","af_NA":"\u0622\u0641\u0631\u06cc\u06a9\u0627\u0646\u0633 (\u0646\u0627\u0645\u06cc\u0628\u06cc\u0627)","ak":"\u0622\u06a9\u0627\u0646","ak_GH":"\u0622\u06a9\u0627\u0646 (\u063a\u0646\u0627)","sq":"\u0622\u0644\u0628\u0627\u0646\u06cc\u0627\u06cc\u06cc","sq_AL":"\u0622\u0644\u0628\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0622\u0644\u0628\u0627\u0646\u06cc)","sq_XK":"\u0622\u0644\u0628\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u06a9\u0648\u0632\u0648\u0648)","sq_MK":"\u0622\u0644\u0628\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0645\u0642\u062f\u0648\u0646\u06cc\u0647)","de":"\u0622\u0644\u0645\u0627\u0646\u06cc","de_DE":"\u0622\u0644\u0645\u0627\u0646\u06cc (\u0622\u0644\u0645\u0627\u0646)","de_AT":"\u0622\u0644\u0645\u0627\u0646\u06cc (\u0627\u062a\u0631\u06cc\u0634)","de_BE":"\u0622\u0644\u0645\u0627\u0646\u06cc (\u0628\u0644\u0698\u06cc\u06a9)","de_CH":"\u0622\u0644\u0645\u0627\u0646\u06cc (\u0633\u0648\u0626\u06cc\u0633)","de_LU":"\u0622\u0644\u0645\u0627\u0646\u06cc (\u0644\u0648\u06a9\u0632\u0627\u0645\u0628\u0648\u0631\u06af)","de_LI":"\u0622\u0644\u0645\u0627\u0646\u06cc (\u0644\u06cc\u062e\u062a\u0646\u200c\u0627\u0634\u062a\u0627\u06cc\u0646)","ur":"\u0627\u0631\u062f\u0648","ur_PK":"\u0627\u0631\u062f\u0648 (\u067e\u0627\u06a9\u0633\u062a\u0627\u0646)","ur_IN":"\u0627\u0631\u062f\u0648 (\u0647\u0646\u062f)","hy":"\u0627\u0631\u0645\u0646\u06cc","hy_AM":"\u0627\u0631\u0645\u0646\u06cc (\u0627\u0631\u0645\u0646\u0633\u062a\u0627\u0646)","uz":"\u0627\u0632\u0628\u06a9\u06cc","uz_UZ":"\u0627\u0632\u0628\u06a9\u06cc (\u0627\u0632\u0628\u06a9\u0633\u062a\u0627\u0646)","uz_AF":"\u0627\u0632\u0628\u06a9\u06cc (\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646)","uz_Cyrl_UZ":"\u0627\u0632\u0628\u06a9\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0627\u0632\u0628\u06a9\u0633\u062a\u0627\u0646)","uz_Cyrl":"\u0627\u0632\u0628\u06a9\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc)","uz_Arab_AF":"\u0627\u0632\u0628\u06a9\u06cc (\u0639\u0631\u0628\u06cc, \u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646)","uz_Arab":"\u0627\u0632\u0628\u06a9\u06cc (\u0639\u0631\u0628\u06cc)","uz_Latn_UZ":"\u0627\u0632\u0628\u06a9\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0627\u0632\u0628\u06a9\u0633\u062a\u0627\u0646)","uz_Latn":"\u0627\u0632\u0628\u06a9\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc)","es":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc","es_AR":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0622\u0631\u0698\u0627\u0646\u062a\u06cc\u0646)","es_UY":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u0631\u0648\u06af\u0648\u0626\u0647)","es_ES":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u0633\u067e\u0627\u0646\u06cc\u0627)","es_EC":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u06a9\u0648\u0627\u062f\u0648\u0631)","es_SV":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u0644\u0633\u0627\u0644\u0648\u0627\u062f\u0648\u0631)","es_US":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u0654 \u0627\u0645\u0631\u06cc\u06a9\u0627)","es_BO":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0628\u0648\u0644\u06cc\u0648\u06cc)","es_PY":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u067e\u0627\u0631\u0627\u06af\u0648\u0626\u0647)","es_PA":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u067e\u0627\u0646\u0627\u0645\u0627)","es_PE":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u067e\u0631\u0648)","es_PR":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u067e\u0648\u0631\u062a\u0648\u0631\u06cc\u06a9\u0648)","es_IC":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0642\u0646\u0627\u0631\u06cc)","es_DO":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u062c\u0645\u0647\u0648\u0631\u06cc \u062f\u0648\u0645\u06cc\u0646\u06cc\u06a9\u0646)","es_EA":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0633\u0628\u062a\u0647 \u0648 \u0645\u0644\u06cc\u0644\u0647)","es_CL":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0634\u06cc\u0644\u06cc)","es_PH":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0641\u06cc\u0644\u06cc\u067e\u06cc\u0646)","es_CR":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u06a9\u0627\u0633\u062a\u0627\u0631\u06cc\u06a9\u0627)","es_CO":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u06a9\u0644\u0645\u0628\u06cc\u0627)","es_CU":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u06a9\u0648\u0628\u0627)","es_GT":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u06af\u0648\u0627\u062a\u0645\u0627\u0644\u0627)","es_GQ":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u06af\u06cc\u0646\u0647\u0654 \u0627\u0633\u062a\u0648\u0627\u06cc\u06cc)","es_MX":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0645\u06a9\u0632\u06cc\u06a9)","es_NI":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0646\u06cc\u06a9\u0627\u0631\u0627\u06af\u0648\u0626\u0647)","es_VE":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0648\u0646\u0632\u0648\u0626\u0644\u0627)","es_HN":"\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0647\u0646\u062f\u0648\u0631\u0627\u0633)","eo":"\u0627\u0633\u067e\u0631\u0627\u0646\u062a\u0648","et":"\u0627\u0633\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc","et_EE":"\u0627\u0633\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u0633\u062a\u0648\u0646\u06cc)","sk":"\u0627\u0633\u0644\u0648\u0627\u06a9\u06cc","sk_SK":"\u0627\u0633\u0644\u0648\u0627\u06a9\u06cc (\u0627\u0633\u0644\u0648\u0627\u06a9\u06cc)","sl":"\u0627\u0633\u0644\u0648\u0648\u06cc\u0646\u06cc\u0627\u06cc\u06cc","sl_SI":"\u0627\u0633\u0644\u0648\u0648\u06cc\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u0633\u0644\u0648\u0648\u0646\u06cc)","am":"\u0627\u0645\u0647\u0631\u06cc","am_ET":"\u0627\u0645\u0647\u0631\u06cc (\u0627\u062a\u06cc\u0648\u067e\u06cc)","id":"\u0627\u0646\u062f\u0648\u0646\u0632\u06cc\u0627\u06cc\u06cc","id_ID":"\u0627\u0646\u062f\u0648\u0646\u0632\u06cc\u0627\u06cc\u06cc (\u0627\u0646\u062f\u0648\u0646\u0632\u06cc)","nd":"\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc","nd_ZW":"\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc (\u0632\u06cc\u0645\u0628\u0627\u0628\u0648\u0647)","en":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc","en_AG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0622\u0646\u062a\u06cc\u06af\u0648\u0627 \u0648 \u0628\u0627\u0631\u0628\u0648\u062f\u0627)","en_AI":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0622\u0646\u06af\u0648\u06cc\u0644\u0627)","en_ER":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0627\u0631\u06cc\u062a\u0631\u0647)","en_AU":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627)","en_ZA":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc)","en_UG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0627\u0648\u06af\u0627\u0646\u062f\u0627)","en_US":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u0654 \u0627\u0645\u0631\u06cc\u06a9\u0627)","en_IE":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0627\u06cc\u0631\u0644\u0646\u062f)","en_BB":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0628\u0627\u0631\u0628\u0627\u062f\u0648\u0633)","en_BS":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0628\u0627\u0647\u0627\u0645\u0627)","en_BM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0628\u0631\u0645\u0648\u062f\u0627)","en_GB":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627)","en_BE":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0628\u0644\u0698\u06cc\u06a9)","en_BZ":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0628\u0644\u06cc\u0632)","en_BW":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627)","en_PG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u067e\u0627\u067e\u0648\u0627 \u06af\u06cc\u0646\u0647\u0654 \u0646\u0648)","en_PK":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u067e\u0627\u06a9\u0633\u062a\u0627\u0646)","en_PW":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u067e\u0627\u0644\u0627\u0626\u0648)","en_PR":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u067e\u0648\u0631\u062a\u0648\u0631\u06cc\u06a9\u0648)","en_TZ":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062a\u0627\u0646\u0632\u0627\u0646\u06cc\u0627)","en_TT":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062a\u0631\u06cc\u0646\u06cc\u062f\u0627\u062f \u0648 \u062a\u0648\u0628\u0627\u06af\u0648)","en_TK":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062a\u0648\u06a9\u0644\u0627\u0626\u0648)","en_TO":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062a\u0648\u0646\u06af\u0627)","en_TV":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062a\u0648\u0648\u0627\u0644\u0648)","en_JM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0627\u0645\u0627\u0626\u06cc\u06a9\u0627)","en_GI":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0628\u0644\u200c\u0627\u0644\u0637\u0627\u0631\u0642)","en_JE":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0631\u0632\u06cc)","en_PN":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u067e\u06cc\u062a\u200c\u06a9\u0631\u0646)","en_TC":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u062a\u0648\u0631\u06a9\u0633 \u0648 \u06a9\u0627\u06cc\u06a9\u0648\u0633)","en_UM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u062f\u0648\u0631\u0627\u0641\u062a\u0627\u062f\u0647\u0654 \u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647)","en_SB":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0633\u0644\u06cc\u0645\u0627\u0646)","en_FK":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0641\u0627\u0644\u06a9\u0644\u0646\u062f)","en_CK":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u06a9)","en_CC":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u06a9\u0648\u0633 (\u06a9\u06cc\u0644\u06cc\u0646\u06af))","en_KY":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0650\u06cc\u0645\u0646)","en_MH":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0645\u0627\u0631\u0634\u0627\u0644)","en_MP":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0645\u0627\u0631\u06cc\u0627\u0646\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc)","en_VI":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0648\u06cc\u0631\u062c\u06cc\u0646 \u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647)","en_VG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0648\u06cc\u0631\u062c\u06cc\u0646 \u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627)","en_CX":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u06cc\u0631\u0647\u0654 \u06a9\u0631\u06cc\u0633\u0645\u0633)","en_IM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u06cc\u0631\u0647\u0654 \u0645\u0646)","en_NF":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062c\u0632\u06cc\u0631\u0647 \u0646\u0648\u0631\u0641\u06a9)","en_DM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062f\u0648\u0645\u06cc\u0646\u06cc\u06a9\u0627)","en_DG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062f\u06cc\u0647\u200c\u06af\u0648 \u06af\u0627\u0631\u0633\u06cc\u0627)","en_RW":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0631\u0648\u0627\u0646\u062f\u0627)","en_ZM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0632\u0627\u0645\u0628\u06cc\u0627)","en_NZ":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0632\u0644\u0627\u0646\u062f \u0646\u0648)","en_ZW":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0632\u06cc\u0645\u0628\u0627\u0628\u0648\u0647)","en_WS":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0627\u0645\u0648\u0622)","en_AS":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0627\u0645\u0648\u0622\u06cc \u0622\u0645\u0631\u06cc\u06a9\u0627)","en_KN":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0646\u062a \u06a9\u06cc\u062a\u0633 \u0648 \u0646\u0648\u06cc\u0633)","en_LC":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0646\u062a \u0644\u0648\u0633\u06cc\u0627)","en_SX":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0646\u062a \u0645\u0627\u0631\u062a\u0646)","en_VC":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0646\u062a \u0648\u06cc\u0646\u0633\u0646\u062a \u0648 \u06af\u0631\u0646\u0627\u062f\u06cc\u0646\u200c\u0647\u0627)","en_SH":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0646\u062a \u0647\u0644\u0646)","en_SG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0646\u06af\u0627\u067e\u0648\u0631)","en_SZ":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0648\u0627\u0632\u06cc\u0644\u0646\u062f)","en_SS":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0648\u062f\u0627\u0646 \u062c\u0646\u0648\u0628\u06cc)","en_SD":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u0648\u062f\u0627\u0646)","en_SL":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u06cc\u0631\u0627\u0644\u0626\u0648\u0646)","en_SC":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0633\u06cc\u0634\u0644)","en_GH":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u063a\u0646\u0627)","en_FJ":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0641\u06cc\u062c\u06cc)","en_PH":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0641\u06cc\u0644\u06cc\u067e\u06cc\u0646)","en_IO":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0642\u0644\u0645\u0631\u0648 \u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627 \u062f\u0631 \u0627\u0642\u06cc\u0627\u0646\u0648\u0633 \u0647\u0646\u062f)","en_CM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06a9\u0627\u0645\u0631\u0648\u0646)","en_CA":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06a9\u0627\u0646\u0627\u062f\u0627)","en_KE":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06a9\u0646\u06cc\u0627)","en_KI":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06a9\u06cc\u0631\u06cc\u0628\u0627\u062a\u06cc)","en_GM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06af\u0627\u0645\u0628\u06cc\u0627)","en_GD":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06af\u0631\u0646\u0627\u062f\u0627)","en_GG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06af\u0631\u0646\u0632\u06cc)","en_GU":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06af\u0648\u0627\u0645)","en_GY":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u06af\u0648\u06cc\u0627\u0646)","en_LS":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0644\u0633\u0648\u062a\u0648)","en_LR":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0644\u06cc\u0628\u0631\u06cc\u0627)","en_MG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u0627\u062f\u0627\u06af\u0627\u0633\u06a9\u0627\u0631)","en_MO":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u0627\u06a9\u0627\u0626\u0648\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","en_MW":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u0627\u0644\u0627\u0648\u06cc)","en_MT":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u0627\u0644\u062a)","en_MY":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u0627\u0644\u0632\u06cc)","en_MU":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u0648\u0631\u06cc\u0633)","en_MS":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u0648\u0646\u062a\u200c\u0633\u0631\u0627\u062a)","en_FM":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0645\u06cc\u06a9\u0631\u0648\u0646\u0632\u06cc)","en_NR":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0646\u0627\u0626\u0648\u0631\u0648)","en_NA":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0646\u0627\u0645\u06cc\u0628\u06cc\u0627)","en_NG":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0646\u06cc\u062c\u0631\u06cc\u0647)","en_NU":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0646\u06cc\u0648\u0626\u0647)","en_VU":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0648\u0627\u0646\u0648\u0627\u062a\u0648)","en_IN":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0647\u0646\u062f)","en_HK":"\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u0647\u0646\u06af\u200c\u06a9\u0646\u06af\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","om":"\u0627\u0648\u0631\u0648\u0645\u0648\u06cc\u06cc","om_ET":"\u0627\u0648\u0631\u0648\u0645\u0648\u06cc\u06cc (\u0627\u062a\u06cc\u0648\u067e\u06cc)","om_KE":"\u0627\u0648\u0631\u0648\u0645\u0648\u06cc\u06cc (\u06a9\u0646\u06cc\u0627)","or":"\u0627\u0648\u0631\u06cc\u0647\u200c\u0627\u06cc","or_IN":"\u0627\u0648\u0631\u06cc\u0647\u200c\u0627\u06cc (\u0647\u0646\u062f)","uk":"\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646\u06cc","uk_UA":"\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646\u06cc (\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646)","ee":"\u0627\u0648\u0647\u200c\u0627\u06cc","ee_TG":"\u0627\u0648\u0647\u200c\u0627\u06cc (\u062a\u0648\u06af\u0648)","ee_GH":"\u0627\u0648\u0647\u200c\u0627\u06cc (\u063a\u0646\u0627)","ug":"\u0627\u0648\u06cc\u063a\u0648\u0631\u06cc","ug_CN":"\u0627\u0648\u06cc\u063a\u0648\u0631\u06cc (\u0686\u06cc\u0646)","ug_Arab_CN":"\u0627\u0648\u06cc\u063a\u0648\u0631\u06cc (\u0639\u0631\u0628\u06cc, \u0686\u06cc\u0646)","ug_Arab":"\u0627\u0648\u06cc\u063a\u0648\u0631\u06cc (\u0639\u0631\u0628\u06cc)","it":"\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627\u06cc\u06cc","it_IT":"\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627\u06cc\u06cc (\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627)","it_SM":"\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627\u06cc\u06cc (\u0633\u0646 \u0645\u0627\u0631\u06cc\u0646\u0648)","it_CH":"\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627\u06cc\u06cc (\u0633\u0648\u0626\u06cc\u0633)","ga":"\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc","ga_IE":"\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc (\u0627\u06cc\u0631\u0644\u0646\u062f)","is":"\u0627\u06cc\u0633\u0644\u0646\u062f\u06cc","is_IS":"\u0627\u06cc\u0633\u0644\u0646\u062f\u06cc (\u0627\u06cc\u0633\u0644\u0646\u062f)","ig":"\u0627\u06cc\u06af\u0628\u0648\u06cc\u06cc","ig_NG":"\u0627\u06cc\u06af\u0628\u0648\u06cc\u06cc (\u0646\u06cc\u062c\u0631\u06cc\u0647)","eu":"\u0628\u0627\u0633\u06a9\u06cc","eu_ES":"\u0628\u0627\u0633\u06a9\u06cc (\u0627\u0633\u067e\u0627\u0646\u06cc\u0627)","bm":"\u0628\u0627\u0645\u0628\u0627\u0631\u0627\u06cc\u06cc","bm_Latn_ML":"\u0628\u0627\u0645\u0628\u0627\u0631\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0645\u0627\u0644\u06cc)","bm_Latn":"\u0628\u0627\u0645\u0628\u0627\u0631\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc)","br":"\u0628\u0631\u062a\u0627\u0646\u06cc\u0627\u06cc\u06cc","br_FR":"\u0628\u0631\u062a\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0641\u0631\u0627\u0646\u0633\u0647)","my":"\u0628\u0631\u0645\u0647\u200c\u0627\u06cc","my_MM":"\u0628\u0631\u0645\u0647\u200c\u0627\u06cc (\u0645\u06cc\u0627\u0646\u0645\u0627\u0631 (\u0628\u0631\u0645\u0647))","bg":"\u0628\u0644\u063a\u0627\u0631\u06cc","bg_BG":"\u0628\u0644\u063a\u0627\u0631\u06cc (\u0628\u0644\u063a\u0627\u0631\u0633\u062a\u0627\u0646)","be":"\u0628\u0644\u0648\u0631\u0648\u0633\u06cc","be_BY":"\u0628\u0644\u0648\u0631\u0648\u0633\u06cc (\u0628\u0644\u0627\u0631\u0648\u0633)","bn":"\u0628\u0646\u06af\u0627\u0644\u06cc","bn_BD":"\u0628\u0646\u06af\u0627\u0644\u06cc (\u0628\u0646\u06af\u0644\u0627\u062f\u0634)","bn_IN":"\u0628\u0646\u06af\u0627\u0644\u06cc (\u0647\u0646\u062f)","bs":"\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc","bs_BA":"\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc (\u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","bs_Cyrl_BA":"\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","bs_Cyrl":"\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc)","bs_Latn_BA":"\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","bs_Latn":"\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc)","nb":"\u0628\u0648\u06a9\u0633\u0645\u0627\u0644 \u0646\u0631\u0648\u0698\u06cc","nb_SJ":"\u0628\u0648\u06a9\u0633\u0645\u0627\u0644 \u0646\u0631\u0648\u0698\u06cc (\u0627\u0633\u0648\u0627\u0644\u0628\u0627\u0631\u062f \u0648 \u062c\u0627\u0646\u200c\u0645\u0627\u06cc\u0646)","nb_NO":"\u0628\u0648\u06a9\u0633\u0645\u0627\u0644 \u0646\u0631\u0648\u0698\u06cc (\u0646\u0631\u0648\u0698)","pt":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc","pt_AO":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u0622\u0646\u06af\u0648\u0644\u0627)","pt_BR":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u0628\u0631\u0632\u06cc\u0644)","pt_PT":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u067e\u0631\u062a\u063a\u0627\u0644)","pt_TL":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u062a\u06cc\u0645\u0648\u0631 \u0634\u0631\u0642\u06cc)","pt_ST":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u0633\u0627\u0626\u0648\u062a\u0648\u0645\u0647 \u0648 \u067e\u0631\u06cc\u0646\u0633\u06cc\u067e)","pt_CV":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u06a9\u06cc\u067e\u200c\u0648\u0631\u062f)","pt_GW":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u06af\u06cc\u0646\u0647\u0654 \u0628\u06cc\u0633\u0627\u0626\u0648)","pt_MO":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u0645\u0627\u06a9\u0627\u0626\u0648\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","pt_MZ":"\u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u0645\u0648\u0632\u0627\u0645\u0628\u06cc\u06a9)","ps":"\u067e\u0634\u062a\u0648","ps_AF":"\u067e\u0634\u062a\u0648 (\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646)","pa":"\u067e\u0646\u062c\u0627\u0628\u06cc","pa_PK":"\u067e\u0646\u062c\u0627\u0628\u06cc (\u067e\u0627\u06a9\u0633\u062a\u0627\u0646)","pa_Arab_PK":"\u067e\u0646\u062c\u0627\u0628\u06cc (\u0639\u0631\u0628\u06cc, \u067e\u0627\u06a9\u0633\u062a\u0627\u0646)","pa_Arab":"\u067e\u0646\u062c\u0627\u0628\u06cc (\u0639\u0631\u0628\u06cc)","pa_Guru_IN":"\u067e\u0646\u062c\u0627\u0628\u06cc (\u06af\u0648\u0631\u0648\u0645\u062e\u06cc, \u0647\u0646\u062f)","pa_Guru":"\u067e\u0646\u062c\u0627\u0628\u06cc (\u06af\u0648\u0631\u0648\u0645\u062e\u06cc)","pa_IN":"\u067e\u0646\u062c\u0627\u0628\u06cc (\u0647\u0646\u062f)","tl":"\u062a\u0627\u06af\u0627\u0644\u0648\u06af\u06cc","tl_PH":"\u062a\u0627\u06af\u0627\u0644\u0648\u06af\u06cc (\u0641\u06cc\u0644\u06cc\u067e\u06cc\u0646)","ta":"\u062a\u0627\u0645\u06cc\u0644\u06cc","ta_LK":"\u062a\u0627\u0645\u06cc\u0644\u06cc (\u0633\u0631\u06cc\u200c\u0644\u0627\u0646\u06a9\u0627)","ta_SG":"\u062a\u0627\u0645\u06cc\u0644\u06cc (\u0633\u0646\u06af\u0627\u067e\u0648\u0631)","ta_MY":"\u062a\u0627\u0645\u06cc\u0644\u06cc (\u0645\u0627\u0644\u0632\u06cc)","ta_IN":"\u062a\u0627\u0645\u06cc\u0644\u06cc (\u0647\u0646\u062f)","th":"\u062a\u0627\u06cc\u0644\u0646\u062f\u06cc","th_TH":"\u062a\u0627\u06cc\u0644\u0646\u062f\u06cc (\u062a\u0627\u06cc\u0644\u0646\u062f)","bo":"\u062a\u0628\u062a\u06cc","bo_CN":"\u062a\u0628\u062a\u06cc (\u0686\u06cc\u0646)","bo_IN":"\u062a\u0628\u062a\u06cc (\u0647\u0646\u062f)","az":"\u062a\u0631\u06a9\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc","az_AZ":"\u062a\u0631\u06a9\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc (\u062c\u0645\u0647\u0648\u0631\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646)","az_Cyrl_AZ":"\u062a\u0631\u06a9\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u062c\u0645\u0647\u0648\u0631\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646)","az_Cyrl":"\u062a\u0631\u06a9\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc)","az_Latn_AZ":"\u062a\u0631\u06a9\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u062c\u0645\u0647\u0648\u0631\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646)","az_Latn":"\u062a\u0631\u06a9\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc)","tr":"\u062a\u0631\u06a9\u06cc \u0627\u0633\u062a\u0627\u0646\u0628\u0648\u0644\u06cc","tr_TR":"\u062a\u0631\u06a9\u06cc \u0627\u0633\u062a\u0627\u0646\u0628\u0648\u0644\u06cc (\u062a\u0631\u06a9\u06cc\u0647)","tr_CY":"\u062a\u0631\u06a9\u06cc \u0627\u0633\u062a\u0627\u0646\u0628\u0648\u0644\u06cc (\u0642\u0628\u0631\u0633)","te":"\u062a\u0644\u0648\u06af\u0648\u06cc\u06cc","te_IN":"\u062a\u0644\u0648\u06af\u0648\u06cc\u06cc (\u0647\u0646\u062f)","to":"\u062a\u0648\u0646\u06af\u0627\u06cc\u06cc","to_TO":"\u062a\u0648\u0646\u06af\u0627\u06cc\u06cc (\u062a\u0648\u0646\u06af\u0627)","ti":"\u062a\u06cc\u06af\u0631\u06cc\u0646\u06cc\u0627\u06cc\u06cc","ti_ET":"\u062a\u06cc\u06af\u0631\u06cc\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u062a\u06cc\u0648\u067e\u06cc)","ti_ER":"\u062a\u06cc\u06af\u0631\u06cc\u0646\u06cc\u0627\u06cc\u06cc (\u0627\u0631\u06cc\u062a\u0631\u0647)","dz":"\u062c\u0648\u0646\u062e\u0627\u06cc\u06cc","dz_BT":"\u062c\u0648\u0646\u062e\u0627\u06cc\u06cc (\u0628\u0648\u062a\u0627\u0646)","cs":"\u0686\u06a9\u06cc","cs_CZ":"\u0686\u06a9\u06cc (\u062c\u0645\u0647\u0648\u0631\u06cc \u0686\u06a9)","zh":"\u0686\u06cc\u0646\u06cc","zh_TW":"\u0686\u06cc\u0646\u06cc (\u062a\u0627\u06cc\u0648\u0627\u0646)","zh_CN":"\u0686\u06cc\u0646\u06cc (\u0686\u06cc\u0646)","zh_Hans_CN":"\u0686\u06cc\u0646\u06cc (\u0633\u0627\u062f\u0647\u200c\u0634\u062f\u0647, \u0686\u06cc\u0646)","zh_Hans_SG":"\u0686\u06cc\u0646\u06cc (\u0633\u0627\u062f\u0647\u200c\u0634\u062f\u0647, \u0633\u0646\u06af\u0627\u067e\u0648\u0631)","zh_Hans_MO":"\u0686\u06cc\u0646\u06cc (\u0633\u0627\u062f\u0647\u200c\u0634\u062f\u0647, \u0645\u0627\u06a9\u0627\u0626\u0648\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","zh_Hans_HK":"\u0686\u06cc\u0646\u06cc (\u0633\u0627\u062f\u0647\u200c\u0634\u062f\u0647, \u0647\u0646\u06af\u200c\u06a9\u0646\u06af\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","zh_Hans":"\u0686\u06cc\u0646\u06cc (\u0633\u0627\u062f\u0647\u200c\u0634\u062f\u0647)","zh_Hant_TW":"\u0686\u06cc\u0646\u06cc (\u0633\u0646\u062a\u06cc, \u062a\u0627\u06cc\u0648\u0627\u0646)","zh_Hant_MO":"\u0686\u06cc\u0646\u06cc (\u0633\u0646\u062a\u06cc, \u0645\u0627\u06a9\u0627\u0626\u0648\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","zh_Hant_HK":"\u0686\u06cc\u0646\u06cc (\u0633\u0646\u062a\u06cc, \u0647\u0646\u06af\u200c\u06a9\u0646\u06af\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","zh_Hant":"\u0686\u06cc\u0646\u06cc (\u0633\u0646\u062a\u06cc)","zh_SG":"\u0686\u06cc\u0646\u06cc (\u0633\u0646\u06af\u0627\u067e\u0648\u0631)","zh_MO":"\u0686\u06cc\u0646\u06cc (\u0645\u0627\u06a9\u0627\u0626\u0648\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","zh_HK":"\u0686\u06cc\u0646\u06cc (\u0647\u0646\u06af\u200c\u06a9\u0646\u06af\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646)","km":"\u062e\u0645\u0631\u06cc","km_KH":"\u062e\u0645\u0631\u06cc (\u06a9\u0627\u0645\u0628\u0648\u062c)","da":"\u062f\u0627\u0646\u0645\u0627\u0631\u06a9\u06cc","da_DK":"\u062f\u0627\u0646\u0645\u0627\u0631\u06a9\u06cc (\u062f\u0627\u0646\u0645\u0627\u0631\u06a9)","da_GL":"\u062f\u0627\u0646\u0645\u0627\u0631\u06a9\u06cc (\u06af\u0631\u06cc\u0646\u0644\u0646\u062f)","ru":"\u0631\u0648\u0633\u06cc","ru_UA":"\u0631\u0648\u0633\u06cc (\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646)","ru_BY":"\u0631\u0648\u0633\u06cc (\u0628\u0644\u0627\u0631\u0648\u0633)","ru_RU":"\u0631\u0648\u0633\u06cc (\u0631\u0648\u0633\u06cc\u0647)","ru_KG":"\u0631\u0648\u0633\u06cc (\u0642\u0631\u0642\u06cc\u0632\u0633\u062a\u0627\u0646)","ru_KZ":"\u0631\u0648\u0633\u06cc (\u0642\u0632\u0627\u0642\u0633\u062a\u0627\u0646)","ru_MD":"\u0631\u0648\u0633\u06cc (\u0645\u0648\u0644\u062f\u0627\u0648\u06cc)","rm":"\u0631\u0648\u0645\u0627\u0646\u0634","rm_CH":"\u0631\u0648\u0645\u0627\u0646\u0634 (\u0633\u0648\u0626\u06cc\u0633)","ro":"\u0631\u0648\u0645\u0627\u0646\u06cc\u0627\u06cc\u06cc","ro_RO":"\u0631\u0648\u0645\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0631\u0648\u0645\u0627\u0646\u06cc)","ro_MD":"\u0631\u0648\u0645\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0645\u0648\u0644\u062f\u0627\u0648\u06cc)","rn":"\u0631\u0648\u0646\u062f\u06cc\u0627\u06cc\u06cc","rn_BI":"\u0631\u0648\u0646\u062f\u06cc\u0627\u06cc\u06cc (\u0628\u0648\u0631\u0648\u0646\u062f\u06cc)","zu":"\u0632\u0648\u0644\u0648\u06cc\u06cc","zu_ZA":"\u0632\u0648\u0644\u0648\u06cc\u06cc (\u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc)","ja":"\u0698\u0627\u067e\u0646\u06cc","ja_JP":"\u0698\u0627\u067e\u0646\u06cc (\u0698\u0627\u067e\u0646)","se":"\u0633\u0627\u0645\u06cc \u0634\u0645\u0627\u0644\u06cc","se_SE":"\u0633\u0627\u0645\u06cc \u0634\u0645\u0627\u0644\u06cc (\u0633\u0648\u0626\u062f)","se_FI":"\u0633\u0627\u0645\u06cc \u0634\u0645\u0627\u0644\u06cc (\u0641\u0646\u0644\u0627\u0646\u062f)","se_NO":"\u0633\u0627\u0645\u06cc \u0634\u0645\u0627\u0644\u06cc (\u0646\u0631\u0648\u0698)","sg":"\u0633\u0627\u0646\u06af\u0648\u06cc\u06cc","sg_CF":"\u0633\u0627\u0646\u06af\u0648\u06cc\u06cc (\u062c\u0645\u0647\u0648\u0631\u06cc \u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc)","sw":"\u0633\u0648\u0627\u062d\u0644\u06cc","sw_UG":"\u0633\u0648\u0627\u062d\u0644\u06cc (\u0627\u0648\u06af\u0627\u0646\u062f\u0627)","sw_TZ":"\u0633\u0648\u0627\u062d\u0644\u06cc (\u062a\u0627\u0646\u0632\u0627\u0646\u06cc\u0627)","sw_KE":"\u0633\u0648\u0627\u062d\u0644\u06cc (\u06a9\u0646\u06cc\u0627)","sv":"\u0633\u0648\u0626\u062f\u06cc","sv_AX":"\u0633\u0648\u0626\u062f\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0627\u064f\u0644\u0646\u062f)","sv_SE":"\u0633\u0648\u0626\u062f\u06cc (\u0633\u0648\u0626\u062f)","sv_FI":"\u0633\u0648\u0626\u062f\u06cc (\u0641\u0646\u0644\u0627\u0646\u062f)","so":"\u0633\u0648\u0645\u0627\u0644\u06cc\u0627\u06cc\u06cc","so_ET":"\u0633\u0648\u0645\u0627\u0644\u06cc\u0627\u06cc\u06cc (\u0627\u062a\u06cc\u0648\u067e\u06cc)","so_DJ":"\u0633\u0648\u0645\u0627\u0644\u06cc\u0627\u06cc\u06cc (\u062c\u06cc\u0628\u0648\u062a\u06cc)","so_SO":"\u0633\u0648\u0645\u0627\u0644\u06cc\u0627\u06cc\u06cc (\u0633\u0648\u0645\u0627\u0644\u06cc)","so_KE":"\u0633\u0648\u0645\u0627\u0644\u06cc\u0627\u06cc\u06cc (\u06a9\u0646\u06cc\u0627)","si":"\u0633\u06cc\u0646\u0647\u0627\u0644\u06cc","si_LK":"\u0633\u06cc\u0646\u0647\u0627\u0644\u06cc (\u0633\u0631\u06cc\u200c\u0644\u0627\u0646\u06a9\u0627)","sn":"\u0634\u0648\u0646\u0627\u06cc\u06cc","sn_ZW":"\u0634\u0648\u0646\u0627\u06cc\u06cc (\u0632\u06cc\u0645\u0628\u0627\u0628\u0648\u0647)","sh":"\u0635\u0631\u0628 \u0648 \u06a9\u0631\u0648\u0627\u062a\u06cc","sh_BA":"\u0635\u0631\u0628 \u0648 \u06a9\u0631\u0648\u0627\u062a\u06cc (\u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","sr":"\u0635\u0631\u0628\u06cc","sr_BA":"\u0635\u0631\u0628\u06cc (\u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","sr_Cyrl_BA":"\u0635\u0631\u0628\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","sr_Cyrl_RS":"\u0635\u0631\u0628\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0635\u0631\u0628\u0633\u062a\u0627\u0646)","sr_Cyrl_XK":"\u0635\u0631\u0628\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u06a9\u0648\u0632\u0648\u0648)","sr_Cyrl_ME":"\u0635\u0631\u0628\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0645\u0648\u0646\u062a\u0647\u200c\u0646\u06af\u0631\u0648)","sr_Cyrl":"\u0635\u0631\u0628\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc)","sr_RS":"\u0635\u0631\u0628\u06cc (\u0635\u0631\u0628\u0633\u062a\u0627\u0646)","sr_XK":"\u0635\u0631\u0628\u06cc (\u06a9\u0648\u0632\u0648\u0648)","sr_Latn_BA":"\u0635\u0631\u0628\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","sr_Latn_RS":"\u0635\u0631\u0628\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0635\u0631\u0628\u0633\u062a\u0627\u0646)","sr_Latn_XK":"\u0635\u0631\u0628\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u06a9\u0648\u0632\u0648\u0648)","sr_Latn_ME":"\u0635\u0631\u0628\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0645\u0648\u0646\u062a\u0647\u200c\u0646\u06af\u0631\u0648)","sr_Latn":"\u0635\u0631\u0628\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc)","sr_ME":"\u0635\u0631\u0628\u06cc (\u0645\u0648\u0646\u062a\u0647\u200c\u0646\u06af\u0631\u0648)","he":"\u0639\u0628\u0631\u06cc","he_IL":"\u0639\u0628\u0631\u06cc (\u0627\u0633\u0631\u0627\u0626\u06cc\u0644)","ar":"\u0639\u0631\u0628\u06cc","ar_JO":"\u0639\u0631\u0628\u06cc (\u0627\u0631\u062f\u0646)","ar_ER":"\u0639\u0631\u0628\u06cc (\u0627\u0631\u06cc\u062a\u0631\u0647)","ar_IL":"\u0639\u0631\u0628\u06cc (\u0627\u0633\u0631\u0627\u0626\u06cc\u0644)","ar_DZ":"\u0639\u0631\u0628\u06cc (\u0627\u0644\u062c\u0632\u0627\u06cc\u0631)","ar_AE":"\u0639\u0631\u0628\u06cc (\u0627\u0645\u0627\u0631\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u0654 \u0639\u0631\u0628\u06cc)","ar_BH":"\u0639\u0631\u0628\u06cc (\u0628\u062d\u0631\u06cc\u0646)","ar_TN":"\u0639\u0631\u0628\u06cc (\u062a\u0648\u0646\u0633)","ar_DJ":"\u0639\u0631\u0628\u06cc (\u062c\u06cc\u0628\u0648\u062a\u06cc)","ar_TD":"\u0639\u0631\u0628\u06cc (\u0686\u0627\u062f)","ar_PS":"\u0639\u0631\u0628\u06cc (\u0633\u0631\u0632\u0645\u06cc\u0646\u200c\u0647\u0627\u06cc \u0641\u0644\u0633\u0637\u06cc\u0646\u06cc)","ar_SS":"\u0639\u0631\u0628\u06cc (\u0633\u0648\u062f\u0627\u0646 \u062c\u0646\u0648\u0628\u06cc)","ar_SD":"\u0639\u0631\u0628\u06cc (\u0633\u0648\u062f\u0627\u0646)","ar_SY":"\u0639\u0631\u0628\u06cc (\u0633\u0648\u0631\u06cc\u0647)","ar_SO":"\u0639\u0631\u0628\u06cc (\u0633\u0648\u0645\u0627\u0644\u06cc)","ar_EH":"\u0639\u0631\u0628\u06cc (\u0635\u062d\u0631\u0627\u06cc \u063a\u0631\u0628\u06cc)","ar_IQ":"\u0639\u0631\u0628\u06cc (\u0639\u0631\u0627\u0642)","ar_SA":"\u0639\u0631\u0628\u06cc (\u0639\u0631\u0628\u0633\u062a\u0627\u0646 \u0633\u0639\u0648\u062f\u06cc)","ar_OM":"\u0639\u0631\u0628\u06cc (\u0639\u0645\u0627\u0646)","ar_QA":"\u0639\u0631\u0628\u06cc (\u0642\u0637\u0631)","ar_KM":"\u0639\u0631\u0628\u06cc (\u06a9\u0648\u0645\u0648\u0631)","ar_KW":"\u0639\u0631\u0628\u06cc (\u06a9\u0648\u06cc\u062a)","ar_LB":"\u0639\u0631\u0628\u06cc (\u0644\u0628\u0646\u0627\u0646)","ar_LY":"\u0639\u0631\u0628\u06cc (\u0644\u06cc\u0628\u06cc)","ar_MA":"\u0639\u0631\u0628\u06cc (\u0645\u0631\u0627\u06a9\u0634)","ar_EG":"\u0639\u0631\u0628\u06cc (\u0645\u0635\u0631)","ar_MR":"\u0639\u0631\u0628\u06cc (\u0645\u0648\u0631\u06cc\u062a\u0627\u0646\u06cc)","ar_YE":"\u0639\u0631\u0628\u06cc (\u06cc\u0645\u0646)","fa":"\u0641\u0627\u0631\u0633\u06cc","fa_AF":"\u0641\u0627\u0631\u0633\u06cc (\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646)","fa_IR":"\u0641\u0627\u0631\u0633\u06cc (\u0627\u06cc\u0631\u0627\u0646)","fo":"\u0641\u0627\u0631\u0648\u06cc\u06cc","fo_FO":"\u0641\u0627\u0631\u0648\u06cc\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u0641\u0627\u0631\u0648)","fr":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc","fr_DZ":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0627\u0644\u062c\u0632\u0627\u06cc\u0631)","fr_BE":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0628\u0644\u0698\u06cc\u06a9)","fr_BJ":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0628\u0646\u06cc\u0646)","fr_BF":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0628\u0648\u0631\u06a9\u06cc\u0646\u0627\u0641\u0627\u0633\u0648)","fr_BI":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0628\u0648\u0631\u0648\u0646\u062f\u06cc)","fr_PF":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u067e\u0644\u06cc\u200c\u0646\u0632\u06cc \u0641\u0631\u0627\u0646\u0633\u0647)","fr_TG":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u062a\u0648\u06af\u0648)","fr_TN":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u062a\u0648\u0646\u0633)","fr_CF":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u062c\u0645\u0647\u0648\u0631\u06cc \u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc)","fr_DJ":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u062c\u06cc\u0628\u0648\u062a\u06cc)","fr_TD":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0686\u0627\u062f)","fr_RE":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0631\u0626\u0648\u0646\u06cc\u0648\u0646)","fr_RW":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0631\u0648\u0627\u0646\u062f\u0627)","fr_CI":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u0627\u062d\u0644 \u0639\u0627\u062c)","fr_BL":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u0646 \u0628\u0627\u0631\u062a\u0644\u0645\u06cc)","fr_PM":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u0646 \u067e\u06cc\u0631 \u0648 \u0645\u06cc\u06a9\u0644\u0646)","fr_MF":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u0646\u062a \u0645\u0627\u0631\u062a\u06cc\u0646)","fr_SN":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u0646\u06af\u0627\u0644)","fr_CH":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u0648\u0626\u06cc\u0633)","fr_SY":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u0648\u0631\u06cc\u0647)","fr_SC":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0633\u06cc\u0634\u0644)","fr_FR":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0641\u0631\u0627\u0646\u0633\u0647)","fr_NC":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06a9\u0627\u0644\u062f\u0648\u0646\u06cc\u0627\u06cc \u062c\u062f\u06cc\u062f)","fr_CM":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06a9\u0627\u0645\u0631\u0648\u0646)","fr_CA":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06a9\u0627\u0646\u0627\u062f\u0627)","fr_CG":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06a9\u0646\u06af\u0648 - \u0628\u0631\u0627\u0632\u0648\u06cc\u0644)","fr_CD":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06a9\u0646\u06af\u0648 - \u06a9\u06cc\u0646\u0634\u0627\u0633\u0627)","fr_KM":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06a9\u0648\u0645\u0648\u0631)","fr_GA":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06af\u0627\u0628\u0646)","fr_GP":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06af\u0648\u0627\u062f\u0644\u0648\u067e)","fr_GF":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06af\u0648\u06cc\u0627\u0646 \u0641\u0631\u0627\u0646\u0633\u0647)","fr_GQ":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06af\u06cc\u0646\u0647\u0654 \u0627\u0633\u062a\u0648\u0627\u06cc\u06cc)","fr_GN":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u06af\u06cc\u0646\u0647)","fr_LU":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0644\u0648\u06a9\u0632\u0627\u0645\u0628\u0648\u0631\u06af)","fr_MG":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0627\u062f\u0627\u06af\u0627\u0633\u06a9\u0627\u0631)","fr_MQ":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0627\u0631\u062a\u06cc\u0646\u06cc\u06a9)","fr_ML":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0627\u0644\u06cc)","fr_YT":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0627\u06cc\u0648\u062a)","fr_MA":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0631\u0627\u06a9\u0634)","fr_MR":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0648\u0631\u06cc\u062a\u0627\u0646\u06cc)","fr_MU":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0648\u0631\u06cc\u0633)","fr_MC":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0645\u0648\u0646\u0627\u06a9\u0648)","fr_NE":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0646\u06cc\u062c\u0631)","fr_WF":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0648\u0627\u0644\u06cc\u0633 \u0648 \u0641\u0648\u062a\u0648\u0646\u0627)","fr_VU":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0648\u0627\u0646\u0648\u0627\u062a\u0648)","fr_HT":"\u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u0647\u0627\u0626\u06cc\u062a\u06cc)","fy":"\u0641\u0631\u06cc\u0632\u06cc \u063a\u0631\u0628\u06cc","fy_NL":"\u0641\u0631\u06cc\u0632\u06cc \u063a\u0631\u0628\u06cc (\u0647\u0644\u0646\u062f)","fi":"\u0641\u0646\u0644\u0627\u0646\u062f\u06cc","fi_FI":"\u0641\u0646\u0644\u0627\u0646\u062f\u06cc (\u0641\u0646\u0644\u0627\u0646\u062f)","ff":"\u0641\u0648\u0644\u0627\u06cc\u06cc","ff_SN":"\u0641\u0648\u0644\u0627\u06cc\u06cc (\u0633\u0646\u06af\u0627\u0644)","ff_CM":"\u0641\u0648\u0644\u0627\u06cc\u06cc (\u06a9\u0627\u0645\u0631\u0648\u0646)","ff_GN":"\u0641\u0648\u0644\u0627\u06cc\u06cc (\u06af\u06cc\u0646\u0647)","ff_MR":"\u0641\u0648\u0644\u0627\u06cc\u06cc (\u0645\u0648\u0631\u06cc\u062a\u0627\u0646\u06cc)","ky":"\u0642\u0631\u0642\u06cc\u0632\u06cc","ky_Cyrl_KG":"\u0642\u0631\u0642\u06cc\u0632\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0642\u0631\u0642\u06cc\u0632\u0633\u062a\u0627\u0646)","ky_Cyrl":"\u0642\u0631\u0642\u06cc\u0632\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc)","ky_KG":"\u0642\u0631\u0642\u06cc\u0632\u06cc (\u0642\u0631\u0642\u06cc\u0632\u0633\u062a\u0627\u0646)","kk":"\u0642\u0632\u0627\u0642\u06cc","kk_Cyrl_KZ":"\u0642\u0632\u0627\u0642\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0642\u0632\u0627\u0642\u0633\u062a\u0627\u0646)","kk_Cyrl":"\u0642\u0632\u0627\u0642\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc)","kk_KZ":"\u0642\u0632\u0627\u0642\u06cc (\u0642\u0632\u0627\u0642\u0633\u062a\u0627\u0646)","ca":"\u06a9\u0627\u062a\u0627\u0644\u0627\u0646","ca_AD":"\u06a9\u0627\u062a\u0627\u0644\u0627\u0646 (\u0622\u0646\u062f\u0648\u0631\u0627)","ca_ES":"\u06a9\u0627\u062a\u0627\u0644\u0627\u0646 (\u0627\u0633\u067e\u0627\u0646\u06cc\u0627)","ca_IT":"\u06a9\u0627\u062a\u0627\u0644\u0627\u0646 (\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627)","ca_FR":"\u06a9\u0627\u062a\u0627\u0644\u0627\u0646 (\u0641\u0631\u0627\u0646\u0633\u0647)","kn":"\u06a9\u0627\u0646\u0627\u062f\u0647\u200c\u0627\u06cc","kn_IN":"\u06a9\u0627\u0646\u0627\u062f\u0647\u200c\u0627\u06cc (\u0647\u0646\u062f)","qu":"\u06a9\u0686\u0648\u0627\u06cc\u06cc","qu_EC":"\u06a9\u0686\u0648\u0627\u06cc\u06cc (\u0627\u06a9\u0648\u0627\u062f\u0648\u0631)","qu_BO":"\u06a9\u0686\u0648\u0627\u06cc\u06cc (\u0628\u0648\u0644\u06cc\u0648\u06cc)","qu_PE":"\u06a9\u0686\u0648\u0627\u06cc\u06cc (\u067e\u0631\u0648)","kw":"\u06a9\u0631\u0646\u0648\u0627\u0644\u06cc","kw_GB":"\u06a9\u0631\u0646\u0648\u0627\u0644\u06cc (\u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627)","hr":"\u06a9\u0631\u0648\u0627\u062a","hr_BA":"\u06a9\u0631\u0648\u0627\u062a (\u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646)","hr_HR":"\u06a9\u0631\u0648\u0627\u062a (\u06a9\u0631\u0648\u0627\u0633\u06cc)","ko":"\u06a9\u0631\u0647\u200c\u0627\u06cc","ko_KR":"\u06a9\u0631\u0647\u200c\u0627\u06cc (\u06a9\u0631\u0647\u0654 \u062c\u0646\u0648\u0628\u06cc)","ko_KP":"\u06a9\u0631\u0647\u200c\u0627\u06cc (\u06a9\u0631\u0647\u0654 \u0634\u0645\u0627\u0644\u06cc)","ks":"\u06a9\u0634\u0645\u06cc\u0631\u06cc","ks_Arab_IN":"\u06a9\u0634\u0645\u06cc\u0631\u06cc (\u0639\u0631\u0628\u06cc, \u0647\u0646\u062f)","ks_Arab":"\u06a9\u0634\u0645\u06cc\u0631\u06cc (\u0639\u0631\u0628\u06cc)","ks_IN":"\u06a9\u0634\u0645\u06cc\u0631\u06cc (\u0647\u0646\u062f)","ki":"\u06a9\u06cc\u06a9\u0648\u06cc\u0648\u06cc\u06cc","ki_KE":"\u06a9\u06cc\u06a9\u0648\u06cc\u0648\u06cc\u06cc (\u06a9\u0646\u06cc\u0627)","rw":"\u06a9\u06cc\u0646\u06cc\u0627\u0631\u0648\u0627\u0646\u062f\u0627\u06cc\u06cc","rw_RW":"\u06a9\u06cc\u0646\u06cc\u0627\u0631\u0648\u0627\u0646\u062f\u0627\u06cc\u06cc (\u0631\u0648\u0627\u0646\u062f\u0627)","gl":"\u06af\u0627\u0644\u06cc\u0633\u06cc\u0627\u06cc\u06cc","gl_ES":"\u06af\u0627\u0644\u06cc\u0633\u06cc\u0627\u06cc\u06cc (\u0627\u0633\u067e\u0627\u0646\u06cc\u0627)","lg":"\u06af\u0627\u0646\u062f\u0627\u06cc\u06cc","lg_UG":"\u06af\u0627\u0646\u062f\u0627\u06cc\u06cc (\u0627\u0648\u06af\u0627\u0646\u062f\u0627)","gu":"\u06af\u062c\u0631\u0627\u062a\u06cc","gu_IN":"\u06af\u062c\u0631\u0627\u062a\u06cc (\u0647\u0646\u062f)","ka":"\u06af\u0631\u062c\u06cc","ka_GE":"\u06af\u0631\u062c\u06cc (\u06af\u0631\u062c\u0633\u062a\u0627\u0646)","kl":"\u06af\u0631\u06cc\u0646\u0644\u0646\u062f\u06cc","kl_GL":"\u06af\u0631\u06cc\u0646\u0644\u0646\u062f\u06cc (\u06af\u0631\u06cc\u0646\u0644\u0646\u062f)","gd":"\u06af\u06cc\u0644\u06cc \u0627\u0633\u06a9\u0627\u062a\u0644\u0646\u062f\u06cc","gd_GB":"\u06af\u06cc\u0644\u06cc \u0627\u0633\u06a9\u0627\u062a\u0644\u0646\u062f\u06cc (\u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627)","lo":"\u0644\u0627\u0626\u0648\u0633\u06cc","lo_LA":"\u0644\u0627\u0626\u0648\u0633\u06cc (\u0644\u0627\u0626\u0648\u0633)","lv":"\u0644\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc","lv_LV":"\u0644\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc (\u0644\u062a\u0648\u0646\u06cc)","lu":"\u0644\u0648\u0628\u0627\u06cc\u06cc\u2010\u06a9\u0627\u062a\u0627\u0646\u06af\u0627","lu_CD":"\u0644\u0648\u0628\u0627\u06cc\u06cc\u2010\u06a9\u0627\u062a\u0627\u0646\u06af\u0627 (\u06a9\u0646\u06af\u0648 - \u06a9\u06cc\u0646\u0634\u0627\u0633\u0627)","lb":"\u0644\u0648\u06af\u0632\u0627\u0645\u0628\u0648\u0631\u06af\u06cc","lb_LU":"\u0644\u0648\u06af\u0632\u0627\u0645\u0628\u0648\u0631\u06af\u06cc (\u0644\u0648\u06a9\u0632\u0627\u0645\u0628\u0648\u0631\u06af)","pl":"\u0644\u0647\u0633\u062a\u0627\u0646\u06cc","pl_PL":"\u0644\u0647\u0633\u062a\u0627\u0646\u06cc (\u0644\u0647\u0633\u062a\u0627\u0646)","lt":"\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc\u0627\u06cc\u06cc","lt_LT":"\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc\u0627\u06cc\u06cc (\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc)","ln":"\u0644\u06cc\u0646\u06af\u0627\u0644\u0627","ln_AO":"\u0644\u06cc\u0646\u06af\u0627\u0644\u0627 (\u0622\u0646\u06af\u0648\u0644\u0627)","ln_CF":"\u0644\u06cc\u0646\u06af\u0627\u0644\u0627 (\u062c\u0645\u0647\u0648\u0631\u06cc \u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc)","ln_CG":"\u0644\u06cc\u0646\u06af\u0627\u0644\u0627 (\u06a9\u0646\u06af\u0648 - \u0628\u0631\u0627\u0632\u0648\u06cc\u0644)","ln_CD":"\u0644\u06cc\u0646\u06af\u0627\u0644\u0627 (\u06a9\u0646\u06af\u0648 - \u06a9\u06cc\u0646\u0634\u0627\u0633\u0627)","mg":"\u0645\u0627\u0644\u0627\u06af\u0627\u0633\u06cc\u0627\u06cc\u06cc","mg_MG":"\u0645\u0627\u0644\u0627\u06af\u0627\u0633\u06cc\u0627\u06cc\u06cc (\u0645\u0627\u062f\u0627\u06af\u0627\u0633\u06a9\u0627\u0631)","ml":"\u0645\u0627\u0644\u0627\u06cc\u0627\u0644\u0627\u0645\u06cc","ml_IN":"\u0645\u0627\u0644\u0627\u06cc\u0627\u0644\u0627\u0645\u06cc (\u0647\u0646\u062f)","ms":"\u0645\u0627\u0644\u0627\u06cc\u06cc","ms_BN":"\u0645\u0627\u0644\u0627\u06cc\u06cc (\u0628\u0631\u0648\u0646\u0626\u06cc)","ms_SG":"\u0645\u0627\u0644\u0627\u06cc\u06cc (\u0633\u0646\u06af\u0627\u067e\u0648\u0631)","ms_Latn_BN":"\u0645\u0627\u0644\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0628\u0631\u0648\u0646\u0626\u06cc)","ms_Latn_SG":"\u0645\u0627\u0644\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0633\u0646\u06af\u0627\u067e\u0648\u0631)","ms_Latn_MY":"\u0645\u0627\u0644\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0645\u0627\u0644\u0632\u06cc)","ms_Latn":"\u0645\u0627\u0644\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc)","ms_MY":"\u0645\u0627\u0644\u0627\u06cc\u06cc (\u0645\u0627\u0644\u0632\u06cc)","mt":"\u0645\u0627\u0644\u062a\u06cc","mt_MT":"\u0645\u0627\u0644\u062a\u06cc (\u0645\u0627\u0644\u062a)","gv":"\u0645\u0627\u0646\u06cc","gv_IM":"\u0645\u0627\u0646\u06cc (\u062c\u0632\u06cc\u0631\u0647\u0654 \u0645\u0646)","hu":"\u0645\u062c\u0627\u0631\u06cc","hu_HU":"\u0645\u062c\u0627\u0631\u06cc (\u0645\u062c\u0627\u0631\u0633\u062a\u0627\u0646)","mr":"\u0645\u0631\u0627\u062a\u06cc","mr_IN":"\u0645\u0631\u0627\u062a\u06cc (\u0647\u0646\u062f)","mn":"\u0645\u063a\u0648\u0644\u06cc","mn_Cyrl_MN":"\u0645\u063a\u0648\u0644\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc, \u0645\u063a\u0648\u0644\u0633\u062a\u0627\u0646)","mn_Cyrl":"\u0645\u063a\u0648\u0644\u06cc (\u0633\u06cc\u0631\u06cc\u0644\u06cc)","mn_MN":"\u0645\u063a\u0648\u0644\u06cc (\u0645\u063a\u0648\u0644\u0633\u062a\u0627\u0646)","mk":"\u0645\u0642\u062f\u0648\u0646\u06cc","mk_MK":"\u0645\u0642\u062f\u0648\u0646\u06cc (\u0645\u0642\u062f\u0648\u0646\u06cc\u0647)","ne":"\u0646\u067e\u0627\u0644\u06cc","ne_NP":"\u0646\u067e\u0627\u0644\u06cc (\u0646\u067e\u0627\u0644)","ne_IN":"\u0646\u067e\u0627\u0644\u06cc (\u0647\u0646\u062f)","nn":"\u0646\u0631\u0633 \u062c\u062f\u06cc\u062f \u0646\u0631\u0648\u0698\u06cc","nn_NO":"\u0646\u0631\u0633 \u062c\u062f\u06cc\u062f \u0646\u0631\u0648\u0698\u06cc (\u0646\u0631\u0648\u0698)","no":"\u0646\u0631\u0648\u0698\u06cc","no_NO":"\u0646\u0631\u0648\u0698\u06cc (\u0646\u0631\u0648\u0698)","vi":"\u0648\u06cc\u062a\u0646\u0627\u0645\u06cc","vi_VN":"\u0648\u06cc\u062a\u0646\u0627\u0645\u06cc (\u0648\u06cc\u062a\u0646\u0627\u0645)","cy":"\u0648\u06cc\u0644\u0632\u06cc","cy_GB":"\u0648\u06cc\u0644\u0632\u06cc (\u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627)","nl":"\u0647\u0644\u0646\u062f\u06cc","nl_AW":"\u0647\u0644\u0646\u062f\u06cc (\u0622\u0631\u0648\u0628\u0627)","nl_BE":"\u0647\u0644\u0646\u062f\u06cc (\u0628\u0644\u0698\u06cc\u06a9)","nl_BQ":"\u0647\u0644\u0646\u062f\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0627\u0631\u0627\u0626\u06cc\u0628 \u0647\u0644\u0646\u062f)","nl_SX":"\u0647\u0644\u0646\u062f\u06cc (\u0633\u0646\u062a \u0645\u0627\u0631\u062a\u0646)","nl_SR":"\u0647\u0644\u0646\u062f\u06cc (\u0633\u0648\u0631\u06cc\u0646\u0627\u0645)","nl_CW":"\u0647\u0644\u0646\u062f\u06cc (\u06a9\u0648\u0631\u0627\u0633\u0627\u0626\u0648)","nl_NL":"\u0647\u0644\u0646\u062f\u06cc (\u0647\u0644\u0646\u062f)","hi":"\u0647\u0646\u062f\u06cc","hi_IN":"\u0647\u0646\u062f\u06cc (\u0647\u0646\u062f)","ha":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc","ha_GH":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc (\u063a\u0646\u0627)","ha_Latn_GH":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u063a\u0646\u0627)","ha_Latn_NE":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0646\u06cc\u062c\u0631)","ha_Latn_NG":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc, \u0646\u06cc\u062c\u0631\u06cc\u0647)","ha_Latn":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc (\u0644\u0627\u062a\u06cc\u0646\u06cc)","ha_NE":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc (\u0646\u06cc\u062c\u0631)","ha_NG":"\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc (\u0646\u06cc\u062c\u0631\u06cc\u0647)","yi":"\u06cc\u062f\u06cc","yo":"\u06cc\u0648\u0631\u0648\u0628\u0627\u06cc\u06cc","yo_BJ":"\u06cc\u0648\u0631\u0648\u0628\u0627\u06cc\u06cc (\u0628\u0646\u06cc\u0646)","yo_NG":"\u06cc\u0648\u0631\u0648\u0628\u0627\u06cc\u06cc (\u0646\u06cc\u062c\u0631\u06cc\u0647)","el":"\u06cc\u0648\u0646\u0627\u0646\u06cc","el_CY":"\u06cc\u0648\u0646\u0627\u0646\u06cc (\u0642\u0628\u0631\u0633)","el_GR":"\u06cc\u0648\u0646\u0627\u0646\u06cc (\u06cc\u0648\u0646\u0627\u0646)","ii":"\u06cc\u06cc \u0633\u06cc\u0686\u0648\u0627\u0646","ii_CN":"\u06cc\u06cc \u0633\u06cc\u0686\u0648\u0627\u0646 (\u0686\u06cc\u0646)"} \ No newline at end of file diff --git a/resources/views/json/piggy-banks.twig b/resources/views/json/piggy-banks.twig index 63c08e3a6d..bb0fe0959f 100644 --- a/resources/views/json/piggy-banks.twig +++ b/resources/views/json/piggy-banks.twig @@ -10,7 +10,7 @@
{% if entry.percentage >=20 %} - {% if convertToNative %} + {% if convertToNative and 0 != avg.native_amount %} {{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }} ({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }}) {% else %} @@ -20,7 +20,7 @@
{% if entry.percentage < 20 %}   - {% if convertToNative %} + {% if convertToNative and 0 != avg.native_amount %} {{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }} ({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }}) {% else %} diff --git a/resources/views/list/groups.twig b/resources/views/list/groups.twig index 02edb9fe45..c3e4606881 100644 --- a/resources/views/list/groups.twig +++ b/resources/views/list/groups.twig @@ -295,6 +295,7 @@
@@ -316,12 +318,14 @@ {% endif %} + {% if transaction.transaction_type_type != 'Reconciliation' and transaction.transaction_type_type != 'Opening balance' and transaction.transaction_type_type != 'Liability credit' %}
+ {% endif %}
diff --git a/resources/views/transactions/show.twig b/resources/views/transactions/show.twig index dac9ece27e..f8ff13b81a 100644 --- a/resources/views/transactions/show.twig +++ b/resources/views/transactions/show.twig @@ -19,8 +19,11 @@ {# edit + delete #}
  • {{ 'edit'|_ }}
  • + {% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %}
  • {{ 'delete'|_ }}
  • + {% endif %} + {% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %} {# convert to different type #} @@ -42,6 +45,7 @@ class="fa fa-exchange"> {{ 'convert_to_transfer'|_ }} {% endif %} + {# clone #} {% if groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'reconciliation' %} @@ -50,6 +54,7 @@
  • {{ 'clone_and_edit'|_ }}
  • {% endif %} + {% endif %} @@ -223,12 +228,15 @@ {# edit + delete #}
  • {{ 'edit'|_ }}
  • + {% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %}
  • {{ 'delete'|_ }}
  • + {% endif %} {% if journal.reconciled %}
  • {{ 'unreconcile'|_ }}
  • {% endif %} + {% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %} {# convert to different type #} @@ -273,6 +281,7 @@ {{ 'create_recurring_from_transaction'|_ }} + {% endif %} diff --git a/resources/views/v2/index.blade.php b/resources/views/v2/index.blade.php index fd5ae016d1..52f8ce6344 100644 --- a/resources/views/v2/index.blade.php +++ b/resources/views/v2/index.blade.php @@ -59,7 +59,7 @@