mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-12-22 03:01:21 +00:00
Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19c746a865 | ||
|
|
503d2aa786 | ||
|
|
70d83ab501 | ||
|
|
edab602bb7 | ||
|
|
f9bcc4b1fa | ||
|
|
f3fe86167c | ||
|
|
2189fb46a2 | ||
|
|
7ff4178c8b | ||
|
|
fffd695ef8 | ||
|
|
ee592de035 | ||
|
|
7394e50ae2 | ||
|
|
f42fcff04a | ||
|
|
4eb3ce7c14 | ||
|
|
a977c567ce | ||
|
|
785bd7e905 | ||
|
|
df19f699d4 | ||
|
|
5e6e932e7e | ||
|
|
5bc397f01a | ||
|
|
42209e367f | ||
|
|
d53b1670d3 | ||
|
|
a6d450ba18 | ||
|
|
e8c1a95128 | ||
|
|
edb201f210 | ||
|
|
fe57367a8c | ||
|
|
134194a95b | ||
|
|
41c0e6fe2d | ||
|
|
c07914e733 | ||
|
|
52e2302f4f | ||
|
|
0a6b34b4f2 | ||
|
|
1e06b4dd0b | ||
|
|
5701f95e0b | ||
|
|
60d3572d37 | ||
|
|
ffa6e6a571 | ||
|
|
d6453cd735 | ||
|
|
fd79f9df44 | ||
|
|
4587340293 | ||
|
|
90bfdc7573 | ||
|
|
eca12f661f | ||
|
|
f85878b843 | ||
|
|
6499b5eaab | ||
|
|
7e4fece63d | ||
|
|
512eddf8be | ||
|
|
f0fa93a811 | ||
|
|
3c8de21709 | ||
|
|
81173e8340 | ||
|
|
35a8fa5f02 | ||
|
|
443036936d | ||
|
|
ac88007593 | ||
|
|
2297589dca | ||
|
|
6ada5fa560 | ||
|
|
8f6eefb5e7 | ||
|
|
b36a50381b | ||
|
|
51f84b3060 | ||
|
|
72132a19b0 | ||
|
|
065d165211 | ||
|
|
cabedf39b2 | ||
|
|
5d3806fcd4 | ||
|
|
01695b3342 | ||
|
|
71fb5fe077 | ||
|
|
3bec106840 | ||
|
|
fb01c36be1 | ||
|
|
26d851e69e | ||
|
|
28c18c046b | ||
|
|
318cef7e3b | ||
|
|
e8dc8f25be | ||
|
|
10ccc30240 | ||
|
|
5adc877d5e | ||
|
|
30923afb2b | ||
|
|
4eb6813b43 | ||
|
|
7521a31619 | ||
|
|
fc05beb452 | ||
|
|
1103428a83 | ||
|
|
d06d521bf0 | ||
|
|
8f64f1c0eb | ||
|
|
d11c232171 | ||
|
|
93c73248de | ||
|
|
5bed081ab9 | ||
|
|
c5188c503e | ||
|
|
98ffcac7b6 | ||
|
|
df1e81d611 | ||
|
|
9711170b08 | ||
|
|
e43264bdce | ||
|
|
e0643bed7a | ||
|
|
7f0eb3b064 | ||
|
|
f38e510526 | ||
|
|
25f99b23b2 | ||
|
|
44281fc8a0 | ||
|
|
eed3902cb7 | ||
|
|
94a3bb0443 | ||
|
|
8dcc36880e | ||
|
|
695bb31894 | ||
|
|
f8ded66869 | ||
|
|
8e4bdbc584 | ||
|
|
f7b14b01bc | ||
|
|
705b9bf0f2 | ||
|
|
f0226dbc54 | ||
|
|
1b1dfb0d7b | ||
|
|
8ed5092a76 | ||
|
|
d609821be6 |
33
.github/label-actions.yml
vendored
33
.github/label-actions.yml
vendored
@@ -1,16 +1,29 @@
|
|||||||
# Configuration for Label Actions - https://github.com/dessant/label-actions
|
# Configuration for Label Actions - https://github.com/dessant/label-actions
|
||||||
|
|
||||||
# The `feature` label is added to issues
|
# The `feature` label is added to issues
|
||||||
|
fixed:
|
||||||
|
issues:
|
||||||
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
|
comment: |
|
||||||
|
Hi there!
|
||||||
|
|
||||||
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
|
This issue has been marked as fixed. Thanks for reporting! A new version will be released in due time. Unfortunately, [I cannot give an estimate](https://docs.firefly-iii.org/references/faq/firefly-iii/general/#when-will-you-release-version-the-next-version), but [the roadmap](https://roadmap.firefly-iii.org/) is available for your reading pleasure.
|
||||||
|
|
||||||
|
There is no need to close the issue. It will be closed automatically.
|
||||||
|
|
||||||
|
Thank you for your contributions.
|
||||||
feature:
|
feature:
|
||||||
issues:
|
issues:
|
||||||
# Post a comment, `{issue-author}` is an optional placeholder
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
unlabel: feature
|
unlabel: feature
|
||||||
comment: |
|
comment: |
|
||||||
Hi there!
|
Hi there!
|
||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
This issue has been marked as a feature request. The requested (new) feature will become a part of Firefly III or the data importer in due course.
|
This issue has been marked as a feature request.
|
||||||
|
|
||||||
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
||||||
|
|
||||||
@@ -20,13 +33,13 @@ epic:
|
|||||||
issues:
|
issues:
|
||||||
# Post a comment, `{issue-author}` is an optional placeholder
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
comment: |
|
comment: |
|
||||||
Hi there!
|
Hi there!
|
||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
This issue has been marked as an epic. In epics, large amounts of works are collected that will be part of a major new feature. If you have more ideas that could be a part of this epic, feel free to reply.
|
This issue has been marked as an epic. In epics, large amounts of works are collected that will be part of a major new feature. If you have more ideas that could be a part of this epic, feel free to reply.
|
||||||
|
|
||||||
*However*, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted.
|
*However*, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted.
|
||||||
|
|
||||||
If you are merely interested in this epic's progress, you can subscribe to this issue to get updates.
|
If you are merely interested in this epic's progress, you can subscribe to this issue to get updates.
|
||||||
|
|
||||||
@@ -37,11 +50,11 @@ enhancement:
|
|||||||
issues:
|
issues:
|
||||||
# Post a comment, `{issue-author}` is an optional placeholder
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
comment: |
|
comment: |
|
||||||
Hi there!
|
Hi there!
|
||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
This issue has been marked as an enhancement. The requested enhancement to an existing feature will become a part of Firefly III or the data importer in due course.
|
This issue has been marked as an enhancement.
|
||||||
|
|
||||||
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
||||||
|
|
||||||
@@ -51,7 +64,7 @@ triage:
|
|||||||
issues:
|
issues:
|
||||||
# Post a comment, `{issue-author}` is an optional placeholder
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
comment: |
|
comment: |
|
||||||
Hi there!
|
Hi there!
|
||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
@@ -62,7 +75,7 @@ triage:
|
|||||||
needs-moar-debug:
|
needs-moar-debug:
|
||||||
issues:
|
issues:
|
||||||
comment: |
|
comment: |
|
||||||
Hi there!
|
Hi there!
|
||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
@@ -80,7 +93,7 @@ needs-moar-debug:
|
|||||||
needs-moar-logs:
|
needs-moar-logs:
|
||||||
issues:
|
issues:
|
||||||
comment: |
|
comment: |
|
||||||
Hi there!
|
Hi there!
|
||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
@@ -96,7 +109,7 @@ needs-moar-logs:
|
|||||||
v2-layout-issue:
|
v2-layout-issue:
|
||||||
issues:
|
issues:
|
||||||
comment: |
|
comment: |
|
||||||
Hi there!
|
Hi there!
|
||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/closed-issues.yml
vendored
2
.github/workflows/closed-issues.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
|||||||
command_and_close:
|
command_and_close:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: aws-actions/closed-issue-message@v1
|
- uses: aws-actions/closed-issue-message@v2
|
||||||
with:
|
with:
|
||||||
message: |
|
message: |
|
||||||
Hi there! This is an automatic reply. `Share and enjoy`
|
Hi there! This is an automatic reply. `Share and enjoy`
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
Over time, many people have contributed to Firefly III. Their efforts are not always visible, but always remembered and appreciated.
|
Over time, many people have contributed to Firefly III. Their efforts are not always visible, but always remembered and appreciated.
|
||||||
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
|
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
|
||||||
|
- SoftBrix
|
||||||
|
|
||||||
## 2024
|
## 2024
|
||||||
- Sobuno
|
- Sobuno
|
||||||
- TasneemTantawy
|
- TasneemTantawy
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class AccountController extends Controller
|
class AccountController extends Controller
|
||||||
{
|
{
|
||||||
use AccountFilter;
|
use AccountFilter;
|
||||||
protected array $accepts = ['application/json'];
|
// this array only exists to test if the constructor will use it properly.
|
||||||
|
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
||||||
|
|
||||||
/** @var array<int, string> */
|
/** @var array<int, string> */
|
||||||
private array $balanceTypes;
|
private array $balanceTypes;
|
||||||
@@ -82,6 +83,9 @@ class AccountController extends Controller
|
|||||||
$return = [];
|
$return = [];
|
||||||
$result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit'));
|
$result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit'));
|
||||||
|
|
||||||
|
// set date to end-of-day for account balance.
|
||||||
|
$date->endOfDay();
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($result as $account) {
|
foreach ($result as $account) {
|
||||||
$nameWithBalance = $account->name;
|
$nameWithBalance = $account->name;
|
||||||
@@ -100,15 +104,20 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$return[] = [
|
$return[] = [
|
||||||
'id' => (string) $account->id,
|
'id' => (string) $account->id,
|
||||||
'name' => $account->name,
|
'name' => $account->name,
|
||||||
'name_with_balance' => $nameWithBalance,
|
'name_with_balance' => $nameWithBalance,
|
||||||
'type' => $account->accountType->type,
|
'type' => $account->accountType->type,
|
||||||
'currency_id' => (string) $useCurrency->id,
|
'currency_id' => (string) $useCurrency->id,
|
||||||
'currency_name' => $useCurrency->name,
|
'currency_name' => $useCurrency->name,
|
||||||
'currency_code' => $useCurrency->code,
|
'currency_code' => $useCurrency->code,
|
||||||
'currency_symbol' => $useCurrency->symbol,
|
'currency_symbol' => $useCurrency->symbol,
|
||||||
'currency_decimal_places' => $useCurrency->decimal_places,
|
'currency_decimal_places' => $useCurrency->decimal_places,
|
||||||
|
'account_currency_id' => (string) $currency->id,
|
||||||
|
'account_currency_name' => $currency->name,
|
||||||
|
'account_currency_code' => $currency->code,
|
||||||
|
'account_currency_symbol' => $currency->symbol,
|
||||||
|
'account_currency_decimal_places' => $currency->decimal_places,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Preference;
|
use FireflyIII\Models\Preference;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Api\ApiSupport;
|
use FireflyIII\Support\Http\Api\ApiSupport;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -80,6 +81,10 @@ class AccountController extends Controller
|
|||||||
/** @var Carbon $end */
|
/** @var Carbon $end */
|
||||||
$end = $dates['end'];
|
$end = $dates['end'];
|
||||||
|
|
||||||
|
// set dates to end of day + start of day:
|
||||||
|
$start->startOfDay();
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
// user's preferences
|
// user's preferences
|
||||||
$defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
$defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
||||||
|
|
||||||
@@ -113,7 +118,7 @@ class AccountController extends Controller
|
|||||||
];
|
];
|
||||||
// TODO this code is also present in the V2 chart account controller so this method is due to be deprecated.
|
// TODO this code is also present in the V2 chart account controller so this method is due to be deprecated.
|
||||||
$currentStart = clone $start;
|
$currentStart = clone $start;
|
||||||
$range = app('steam')->finalAccountBalanceInRange($account, $start, clone $end, $this->convertToNative);
|
$range = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToNative);
|
||||||
$previous = array_values($range)[0][$field];
|
$previous = array_values($range)[0][$field];
|
||||||
while ($currentStart <= $end) {
|
while ($currentStart <= $end) {
|
||||||
$format = $currentStart->format('Y-m-d');
|
$format = $currentStart->format('Y-m-d');
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ abstract class Controller extends BaseController
|
|||||||
protected array $allowedSort;
|
protected array $allowedSort;
|
||||||
protected ParameterBag $parameters;
|
protected ParameterBag $parameters;
|
||||||
protected bool $convertToNative = false;
|
protected bool $convertToNative = false;
|
||||||
protected array $accepts = ['application/json'];
|
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
||||||
protected TransactionCurrency $nativeCurrency;
|
protected TransactionCurrency $nativeCurrency;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -57,11 +57,11 @@ class IndexController extends Controller
|
|||||||
|
|
||||||
public function index(): JsonResponse
|
public function index(): JsonResponse
|
||||||
{
|
{
|
||||||
$piggies = $this->repository->getAll();
|
$entries = $this->repository->getAll();
|
||||||
$pageSize = $this->parameters->get('limit');
|
$pageSize = $this->parameters->get('limit');
|
||||||
$count = $piggies->count();
|
$count = $entries->count();
|
||||||
$piggies = $piggies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$entries = $entries->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
$paginator = new LengthAwarePaginator($piggies, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($entries, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$transformer = new ExchangeRateTransformer();
|
$transformer = new ExchangeRateTransformer();
|
||||||
$transformer->setParameters($this->parameters); // give params to transformer
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ class ListController extends Controller
|
|||||||
// get list of budgets. Count it and split it.
|
// get list of budgets. Count it and split it.
|
||||||
/** @var RecurringRepositoryInterface $recurringRepos */
|
/** @var RecurringRepositoryInterface $recurringRepos */
|
||||||
$recurringRepos = app(RecurringRepositoryInterface::class);
|
$recurringRepos = app(RecurringRepositoryInterface::class);
|
||||||
$unfiltered = $recurringRepos->getAll();
|
$unfiltered = $recurringRepos->get();
|
||||||
|
|
||||||
// filter selection
|
// filter selection
|
||||||
$collection = $unfiltered->filter(
|
$collection = $unfiltered->filter(
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ use FireflyIII\Models\Account;
|
|||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Chart\ChartData;
|
use FireflyIII\Support\Chart\ChartData;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
@@ -118,7 +119,7 @@ class AccountController extends Controller
|
|||||||
'native_entries' => [],
|
'native_entries' => [],
|
||||||
];
|
];
|
||||||
$currentStart = clone $params['start'];
|
$currentStart = clone $params['start'];
|
||||||
$range = app('steam')->finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToNative);
|
$range = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToNative);
|
||||||
|
|
||||||
$previous = array_values($range)[0]['balance'];
|
$previous = array_values($range)[0]['balance'];
|
||||||
$previousNative = array_values($range)[0]['native_balance'];
|
$previousNative = array_values($range)[0]['native_balance'];
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Console\Commands\Correction;
|
namespace FireflyIII\Console\Commands\Correction;
|
||||||
|
|
||||||
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
|
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Models\AutoBudget;
|
use FireflyIII\Models\AutoBudget;
|
||||||
use FireflyIII\Models\AvailableBudget;
|
use FireflyIII\Models\AvailableBudget;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
@@ -33,8 +34,14 @@ use FireflyIII\Models\CurrencyExchangeRate;
|
|||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Models\RecurrenceTransaction;
|
use FireflyIII\Models\RecurrenceTransaction;
|
||||||
use FireflyIII\Models\RuleTrigger;
|
use FireflyIII\Models\RuleTrigger;
|
||||||
|
use FireflyIII\Models\Transaction;
|
||||||
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
class CorrectsAmounts extends Command
|
class CorrectsAmounts extends Command
|
||||||
{
|
{
|
||||||
@@ -45,6 +52,8 @@ class CorrectsAmounts extends Command
|
|||||||
|
|
||||||
public function handle(): int
|
public function handle(): int
|
||||||
{
|
{
|
||||||
|
// transfers must not have foreign currency info if both accounts have the same currency.
|
||||||
|
$this->correctTransfers();
|
||||||
// auto budgets must be positive
|
// auto budgets must be positive
|
||||||
$this->fixAutoBudgets();
|
$this->fixAutoBudgets();
|
||||||
// available budgets must be positive
|
// available budgets must be positive
|
||||||
@@ -62,6 +71,7 @@ class CorrectsAmounts extends Command
|
|||||||
// rule_triggers must be positive or zero (amount_less, amount_more, amount_is)
|
// rule_triggers must be positive or zero (amount_less, amount_more, amount_is)
|
||||||
$this->fixRuleTriggers();
|
$this->fixRuleTriggers();
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,4 +192,63 @@ class CorrectsAmounts extends Command
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function correctTransfers(): void
|
||||||
|
{
|
||||||
|
/** @var AccountRepositoryInterface $repository */
|
||||||
|
$repository = app(AccountRepositoryInterface::class);
|
||||||
|
$type = TransactionType::where('type', TransactionTypeEnum::TRANSFER->value)->first();
|
||||||
|
$journals = TransactionJournal::where('transaction_type_id', $type->id)->get();
|
||||||
|
|
||||||
|
/** @var TransactionJournal $journal */
|
||||||
|
foreach ($journals as $journal) {
|
||||||
|
$repository->setUser($journal->user);
|
||||||
|
$native = Amount::getNativeCurrencyByUserGroup($journal->userGroup);
|
||||||
|
|
||||||
|
/** @var null|Transaction $source */
|
||||||
|
$source = $journal->transactions()->where('amount', '<', 0)->first();
|
||||||
|
|
||||||
|
/** @var null|Transaction $destination */
|
||||||
|
$destination = $journal->transactions()->where('amount', '>', 0)->first();
|
||||||
|
if (null === $source || null === $destination) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (null === $source->foreign_currency_id || null === $destination->foreign_currency_id) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$sourceAccount = $source->account;
|
||||||
|
$destAccount = $destination->account;
|
||||||
|
if (null === $sourceAccount || null === $destAccount) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$sourceCurrency = $repository->getAccountCurrency($sourceAccount) ?? $native;
|
||||||
|
$destCurrency = $repository->getAccountCurrency($destAccount) ?? $native;
|
||||||
|
|
||||||
|
if ($sourceCurrency->id === $destCurrency->id) {
|
||||||
|
Log::debug('Both accounts have the same currency. Removing foreign currency info.');
|
||||||
|
$source->foreign_currency_id = null;
|
||||||
|
$source->foreign_amount = null;
|
||||||
|
$source->save();
|
||||||
|
$destination->foreign_currency_id = null;
|
||||||
|
$destination->foreign_amount = null;
|
||||||
|
$destination->save();
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate source
|
||||||
|
if ($destCurrency->id !== $source->foreign_currency_id) {
|
||||||
|
Log::debug(sprintf('Journal #%d: Transaction #%d refers to "%s" but should refer to "%s".', $journal->id, $source->id, $source->foreignCurrency->code, $destCurrency->code));
|
||||||
|
$source->foreign_currency_id = $destCurrency->id;
|
||||||
|
$source->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate destination:
|
||||||
|
if ($sourceCurrency->id !== $destination->foreign_currency_id) {
|
||||||
|
Log::debug(sprintf('Journal #%d: Transaction #%d refers to "%s" but should refer to "%s".', $journal->id, $destination->id, $destination->foreignCurrency->code, $sourceCurrency->code));
|
||||||
|
$destination->foreign_currency_id = $sourceCurrency->id;
|
||||||
|
$destination->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,7 +102,14 @@ class CorrectsNativeAmounts extends Command
|
|||||||
{
|
{
|
||||||
$set = $userGroup->accounts()->where(function (EloquentBuilder $q): void {
|
$set = $userGroup->accounts()->where(function (EloquentBuilder $q): void {
|
||||||
$q->whereNotNull('virtual_balance');
|
$q->whereNotNull('virtual_balance');
|
||||||
$q->orWhere('virtual_balance', '!=', '');
|
|
||||||
|
// this needs a different piece of code for postgres.
|
||||||
|
if ('pgsql' === config('database.default')) {
|
||||||
|
$q->orWhere(DB::raw('CAST(virtual_balance AS TEXT)'), '!=', '');
|
||||||
|
}
|
||||||
|
if ('pgsql' !== config('database.default')) {
|
||||||
|
$q->orWhere('virtual_balance', '!=', '');
|
||||||
|
}
|
||||||
})->get();
|
})->get();
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
@@ -218,7 +225,6 @@ class CorrectsNativeAmounts extends Command
|
|||||||
$set = DB::table('transactions')
|
$set = DB::table('transactions')
|
||||||
->join('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
->join('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||||
->where('transaction_journals.user_group_id', $userGroup->id)
|
->where('transaction_journals.user_group_id', $userGroup->id)
|
||||||
|
|
||||||
->where(function (DatabaseBuilder $q1) use ($currency): void {
|
->where(function (DatabaseBuilder $q1) use ($currency): void {
|
||||||
$q1->where(function (DatabaseBuilder $q2) use ($currency): void {
|
$q1->where(function (DatabaseBuilder $q2) use ($currency): void {
|
||||||
$q2->whereNot('transactions.transaction_currency_id', $currency->id)->whereNull('transactions.foreign_currency_id');
|
$q2->whereNot('transactions.transaction_currency_id', $currency->id)->whereNull('transactions.foreign_currency_id');
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class ExportsData extends Command
|
|||||||
{--export-tags : Create a file with all your tags and some meta data.}
|
{--export-tags : Create a file with all your tags and some meta data.}
|
||||||
{--export-recurring : Create a file with all your recurring transactions and some meta data.}
|
{--export-recurring : Create a file with all your recurring transactions and some meta data.}
|
||||||
{--export-rules : Create a file with all your rules and some meta data.}
|
{--export-rules : Create a file with all your rules and some meta data.}
|
||||||
{--export-bills : Create a file with all your bills and some meta data.}
|
{--export-subscriptions : Create a file with all your subscriptions and some meta data.}
|
||||||
{--export-piggies : Create a file with all your piggy banks and some meta data.}
|
{--export-piggies : Create a file with all your piggy banks and some meta data.}
|
||||||
{--force : Force overwriting of previous exports if found.}';
|
{--force : Force overwriting of previous exports if found.}';
|
||||||
private AccountRepositoryInterface $accountRepository;
|
private AccountRepositoryInterface $accountRepository;
|
||||||
@@ -106,7 +106,7 @@ class ExportsData extends Command
|
|||||||
$exporter->setExportTags($options['export']['tags']);
|
$exporter->setExportTags($options['export']['tags']);
|
||||||
$exporter->setExportRecurring($options['export']['recurring']);
|
$exporter->setExportRecurring($options['export']['recurring']);
|
||||||
$exporter->setExportRules($options['export']['rules']);
|
$exporter->setExportRules($options['export']['rules']);
|
||||||
$exporter->setExportBills($options['export']['bills']);
|
$exporter->setExportBills($options['export']['subscriptions']);
|
||||||
$exporter->setExportPiggies($options['export']['piggies']);
|
$exporter->setExportPiggies($options['export']['piggies']);
|
||||||
$data = $exporter->export();
|
$data = $exporter->export();
|
||||||
if (0 === count($data)) {
|
if (0 === count($data)) {
|
||||||
@@ -157,7 +157,7 @@ class ExportsData extends Command
|
|||||||
'tags' => $this->option('export-tags'),
|
'tags' => $this->option('export-tags'),
|
||||||
'recurring' => $this->option('export-recurring'),
|
'recurring' => $this->option('export-recurring'),
|
||||||
'rules' => $this->option('export-rules'),
|
'rules' => $this->option('export-rules'),
|
||||||
'bills' => $this->option('export-bills'),
|
'bills' => $this->option('export-subscriptions'),
|
||||||
'piggies' => $this->option('export-piggies'),
|
'piggies' => $this->option('export-piggies'),
|
||||||
],
|
],
|
||||||
'start' => $start,
|
'start' => $start,
|
||||||
|
|||||||
@@ -54,6 +54,9 @@ class MonthReportGenerator implements ReportGeneratorInterface
|
|||||||
$dayBefore = clone $this->start;
|
$dayBefore = clone $this->start;
|
||||||
$dayBefore->subDay();
|
$dayBefore->subDay();
|
||||||
|
|
||||||
|
// move to end of day
|
||||||
|
$dayBefore->endOfDay();
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($this->accounts as $account) {
|
foreach ($this->accounts as $account) {
|
||||||
// balance the day before:
|
// balance the day before:
|
||||||
|
|||||||
@@ -61,8 +61,12 @@ class PreferencesEventHandler
|
|||||||
$this->resetTransactions($event->userGroup);
|
$this->resetTransactions($event->userGroup);
|
||||||
// fire laravel command to recalculate them all.
|
// fire laravel command to recalculate them all.
|
||||||
if (Amount::convertToNative()) {
|
if (Amount::convertToNative()) {
|
||||||
|
Log::debug('Will now convert to native.');
|
||||||
Artisan::call('correction:recalculate-native-amounts');
|
Artisan::call('correction:recalculate-native-amounts');
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
Log::debug('Will NOT convert to native.');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function resetPiggyBanks(UserGroup $userGroup): void
|
private function resetPiggyBanks(UserGroup $userGroup): void
|
||||||
|
|||||||
@@ -38,10 +38,17 @@ use Illuminate\Support\Collection;
|
|||||||
*/
|
*/
|
||||||
class StoredGroupEventHandler
|
class StoredGroupEventHandler
|
||||||
{
|
{
|
||||||
|
public function runAllHandlers(StoredTransactionGroup $event): void
|
||||||
|
{
|
||||||
|
$this->processRules($event);
|
||||||
|
$this->recalculateCredit($event);
|
||||||
|
$this->triggerWebhooks($event);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method grabs all the users rules and processes them.
|
* This method grabs all the users rules and processes them.
|
||||||
*/
|
*/
|
||||||
public function processRules(StoredTransactionGroup $storedGroupEvent): void
|
private function processRules(StoredTransactionGroup $storedGroupEvent): void
|
||||||
{
|
{
|
||||||
if (false === $storedGroupEvent->applyRules) {
|
if (false === $storedGroupEvent->applyRules) {
|
||||||
app('log')->info(sprintf('Will not run rules on group #%d', $storedGroupEvent->transactionGroup->id));
|
app('log')->info(sprintf('Will not run rules on group #%d', $storedGroupEvent->transactionGroup->id));
|
||||||
@@ -76,7 +83,7 @@ class StoredGroupEventHandler
|
|||||||
$newRuleEngine->fire();
|
$newRuleEngine->fire();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function recalculateCredit(StoredTransactionGroup $event): void
|
private function recalculateCredit(StoredTransactionGroup $event): void
|
||||||
{
|
{
|
||||||
$group = $event->transactionGroup;
|
$group = $event->transactionGroup;
|
||||||
|
|
||||||
@@ -89,7 +96,7 @@ class StoredGroupEventHandler
|
|||||||
/**
|
/**
|
||||||
* This method processes all webhooks that respond to the "stored transaction group" trigger (100)
|
* This method processes all webhooks that respond to the "stored transaction group" trigger (100)
|
||||||
*/
|
*/
|
||||||
public function triggerWebhooks(StoredTransactionGroup $storedGroupEvent): void
|
private function triggerWebhooks(StoredTransactionGroup $storedGroupEvent): void
|
||||||
{
|
{
|
||||||
app('log')->debug(__METHOD__);
|
app('log')->debug(__METHOD__);
|
||||||
$group = $storedGroupEvent->transactionGroup;
|
$group = $storedGroupEvent->transactionGroup;
|
||||||
|
|||||||
@@ -41,10 +41,19 @@ use Illuminate\Support\Collection;
|
|||||||
*/
|
*/
|
||||||
class UpdatedGroupEventHandler
|
class UpdatedGroupEventHandler
|
||||||
{
|
{
|
||||||
|
public function runAllHandlers(UpdatedTransactionGroup $event): void
|
||||||
|
{
|
||||||
|
$this->unifyAccounts($event);
|
||||||
|
$this->processRules($event);
|
||||||
|
$this->recalculateCredit($event);
|
||||||
|
$this->triggerWebhooks($event);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method will check all the rules when a journal is updated.
|
* This method will check all the rules when a journal is updated.
|
||||||
*/
|
*/
|
||||||
public function processRules(UpdatedTransactionGroup $updatedGroupEvent): void
|
private function processRules(UpdatedTransactionGroup $updatedGroupEvent): void
|
||||||
{
|
{
|
||||||
if (false === $updatedGroupEvent->applyRules) {
|
if (false === $updatedGroupEvent->applyRules) {
|
||||||
app('log')->info(sprintf('Will not run rules on group #%d', $updatedGroupEvent->transactionGroup->id));
|
app('log')->info(sprintf('Will not run rules on group #%d', $updatedGroupEvent->transactionGroup->id));
|
||||||
@@ -76,7 +85,7 @@ class UpdatedGroupEventHandler
|
|||||||
$newRuleEngine->fire();
|
$newRuleEngine->fire();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function recalculateCredit(UpdatedTransactionGroup $event): void
|
private function recalculateCredit(UpdatedTransactionGroup $event): void
|
||||||
{
|
{
|
||||||
$group = $event->transactionGroup;
|
$group = $event->transactionGroup;
|
||||||
|
|
||||||
@@ -86,7 +95,7 @@ class UpdatedGroupEventHandler
|
|||||||
$object->recalculate();
|
$object->recalculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function triggerWebhooks(UpdatedTransactionGroup $updatedGroupEvent): void
|
private function triggerWebhooks(UpdatedTransactionGroup $updatedGroupEvent): void
|
||||||
{
|
{
|
||||||
app('log')->debug(__METHOD__);
|
app('log')->debug(__METHOD__);
|
||||||
$group = $updatedGroupEvent->transactionGroup;
|
$group = $updatedGroupEvent->transactionGroup;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Handlers\Observer;
|
|||||||
|
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
@@ -52,6 +53,7 @@ class AccountObserver
|
|||||||
$currency = $repository->getAccountCurrency($account);
|
$currency = $repository->getAccountCurrency($account);
|
||||||
if (null !== $currency && $currency->id !== $userCurrency->id && '' !== (string) $account->virtual_balance && 0 !== bccomp($account->virtual_balance, '0')) {
|
if (null !== $currency && $currency->id !== $userCurrency->id && '' !== (string) $account->virtual_balance && 0 !== bccomp($account->virtual_balance, '0')) {
|
||||||
$converter = new ExchangeRateConverter();
|
$converter = new ExchangeRateConverter();
|
||||||
|
$converter->setUserGroup($account->user->userGroup);
|
||||||
$converter->setIgnoreSettings(true);
|
$converter->setIgnoreSettings(true);
|
||||||
$account->native_virtual_balance = $converter->convert($currency, $userCurrency, today(), $account->virtual_balance);
|
$account->native_virtual_balance = $converter->convert($currency, $userCurrency, today(), $account->virtual_balance);
|
||||||
|
|
||||||
@@ -72,12 +74,15 @@ class AccountObserver
|
|||||||
// app('log')->debug('Observe "deleting" of an account.');
|
// app('log')->debug('Observe "deleting" of an account.');
|
||||||
$account->accountMeta()->delete();
|
$account->accountMeta()->delete();
|
||||||
|
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($account->user);
|
||||||
|
|
||||||
/** @var PiggyBank $piggy */
|
/** @var PiggyBank $piggy */
|
||||||
foreach ($account->piggyBanks()->get() as $piggy) {
|
foreach ($account->piggyBanks()->get() as $piggy) {
|
||||||
$piggy->accounts()->detach($account);
|
$piggy->accounts()->detach($account);
|
||||||
}
|
}
|
||||||
foreach ($account->attachments()->get() as $attachment) {
|
foreach ($account->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
foreach ($account->transactions()->get() as $transaction) {
|
foreach ($account->transactions()->get() as $transaction) {
|
||||||
$transaction->delete();
|
$transaction->delete();
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ class AutoBudgetObserver
|
|||||||
$autoBudget->native_amount = null;
|
$autoBudget->native_amount = null;
|
||||||
if ($autoBudget->transactionCurrency->id !== $userCurrency->id) {
|
if ($autoBudget->transactionCurrency->id !== $userCurrency->id) {
|
||||||
$converter = new ExchangeRateConverter();
|
$converter = new ExchangeRateConverter();
|
||||||
|
$converter->setUserGroup($autoBudget->budget->user->userGroup);
|
||||||
$converter->setIgnoreSettings(true);
|
$converter->setIgnoreSettings(true);
|
||||||
$autoBudget->native_amount = $converter->convert($autoBudget->transactionCurrency, $userCurrency, today(), $autoBudget->amount);
|
$autoBudget->native_amount = $converter->convert($autoBudget->transactionCurrency, $userCurrency, today(), $autoBudget->amount);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
@@ -41,9 +42,12 @@ class BillObserver
|
|||||||
|
|
||||||
public function deleting(Bill $bill): void
|
public function deleting(Bill $bill): void
|
||||||
{
|
{
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($bill->user);
|
||||||
|
|
||||||
// app('log')->debug('Observe "deleting" of a bill.');
|
// app('log')->debug('Observe "deleting" of a bill.');
|
||||||
foreach ($bill->attachments()->get() as $attachment) {
|
foreach ($bill->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
$bill->notes()->delete();
|
$bill->notes()->delete();
|
||||||
}
|
}
|
||||||
@@ -64,6 +68,7 @@ class BillObserver
|
|||||||
$bill->native_amount_max = null;
|
$bill->native_amount_max = null;
|
||||||
if ($bill->transactionCurrency->id !== $userCurrency->id) {
|
if ($bill->transactionCurrency->id !== $userCurrency->id) {
|
||||||
$converter = new ExchangeRateConverter();
|
$converter = new ExchangeRateConverter();
|
||||||
|
$converter->setUserGroup($bill->user->userGroup);
|
||||||
$converter->setIgnoreSettings(true);
|
$converter->setIgnoreSettings(true);
|
||||||
$bill->native_amount_min = $converter->convert($bill->transactionCurrency, $userCurrency, today(), $bill->amount_min);
|
$bill->native_amount_min = $converter->convert($bill->transactionCurrency, $userCurrency, today(), $bill->amount_min);
|
||||||
$bill->native_amount_max = $converter->convert($bill->transactionCurrency, $userCurrency, today(), $bill->amount_max);
|
$bill->native_amount_max = $converter->convert($bill->transactionCurrency, $userCurrency, today(), $bill->amount_max);
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ class BudgetLimitObserver
|
|||||||
$budgetLimit->native_amount = null;
|
$budgetLimit->native_amount = null;
|
||||||
if ($budgetLimit->transactionCurrency->id !== $userCurrency->id) {
|
if ($budgetLimit->transactionCurrency->id !== $userCurrency->id) {
|
||||||
$converter = new ExchangeRateConverter();
|
$converter = new ExchangeRateConverter();
|
||||||
|
$converter->setUserGroup($budgetLimit->budget->user->userGroup);
|
||||||
$converter->setIgnoreSettings(true);
|
$converter->setIgnoreSettings(true);
|
||||||
$budgetLimit->native_amount = $converter->convert($budgetLimit->transactionCurrency, $userCurrency, today(), $budgetLimit->amount);
|
$budgetLimit->native_amount = $converter->convert($budgetLimit->transactionCurrency, $userCurrency, today(), $budgetLimit->amount);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace FireflyIII\Handlers\Observer;
|
|||||||
|
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class BudgetObserver
|
* Class BudgetObserver
|
||||||
@@ -34,8 +35,12 @@ class BudgetObserver
|
|||||||
public function deleting(Budget $budget): void
|
public function deleting(Budget $budget): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Observe "deleting" of a budget.');
|
app('log')->debug('Observe "deleting" of a budget.');
|
||||||
|
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($budget->user);
|
||||||
|
|
||||||
foreach ($budget->attachments()->get() as $attachment) {
|
foreach ($budget->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
$budgetLimits = $budget->budgetlimits()->get();
|
$budgetLimits = $budget->budgetlimits()->get();
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class CategoryObserver
|
* Class CategoryObserver
|
||||||
@@ -33,8 +34,12 @@ class CategoryObserver
|
|||||||
public function deleting(Category $category): void
|
public function deleting(Category $category): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Observe "deleting" of a category.');
|
app('log')->debug('Observe "deleting" of a category.');
|
||||||
|
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($category->user);
|
||||||
|
|
||||||
foreach ($category->attachments()->get() as $attachment) {
|
foreach ($category->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
$category->notes()->delete();
|
$category->notes()->delete();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ class PiggyBankEventObserver
|
|||||||
$event->native_amount = null;
|
$event->native_amount = null;
|
||||||
if ($event->piggyBank->transactionCurrency->id !== $userCurrency->id) {
|
if ($event->piggyBank->transactionCurrency->id !== $userCurrency->id) {
|
||||||
$converter = new ExchangeRateConverter();
|
$converter = new ExchangeRateConverter();
|
||||||
|
$converter->setUserGroup($event->piggyBank->accounts()->first()->user->userGroup);
|
||||||
$converter->setIgnoreSettings(true);
|
$converter->setIgnoreSettings(true);
|
||||||
$event->native_amount = $converter->convert($event->piggyBank->transactionCurrency, $userCurrency, today(), $event->amount);
|
$event->native_amount = $converter->convert($event->piggyBank->transactionCurrency, $userCurrency, today(), $event->amount);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
@@ -46,8 +47,11 @@ class PiggyBankObserver
|
|||||||
{
|
{
|
||||||
app('log')->debug('Observe "deleting" of a piggy bank.');
|
app('log')->debug('Observe "deleting" of a piggy bank.');
|
||||||
|
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($piggyBank->accounts()->first()->user);
|
||||||
|
|
||||||
foreach ($piggyBank->attachments()->get() as $attachment) {
|
foreach ($piggyBank->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
$piggyBank->piggyBankEvents()->delete();
|
$piggyBank->piggyBankEvents()->delete();
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class RecurrenceObserver
|
* Class RecurrenceObserver
|
||||||
@@ -33,8 +34,12 @@ class RecurrenceObserver
|
|||||||
public function deleting(Recurrence $recurrence): void
|
public function deleting(Recurrence $recurrence): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Observe "deleting" of a recurrence.');
|
app('log')->debug('Observe "deleting" of a recurrence.');
|
||||||
|
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($recurrence->user);
|
||||||
|
|
||||||
foreach ($recurrence->attachments()->get() as $attachment) {
|
foreach ($recurrence->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
$recurrence->recurrenceRepetitions()->delete();
|
$recurrence->recurrenceRepetitions()->delete();
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
use FireflyIII\Models\Tag;
|
use FireflyIII\Models\Tag;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class TagObserver
|
* Class TagObserver
|
||||||
@@ -34,8 +35,11 @@ class TagObserver
|
|||||||
{
|
{
|
||||||
app('log')->debug('Observe "deleting" of a tag.');
|
app('log')->debug('Observe "deleting" of a tag.');
|
||||||
|
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($tag->user);
|
||||||
|
|
||||||
foreach ($tag->attachments()->get() as $attachment) {
|
foreach ($tag->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
$tag->locations()->delete();
|
$tag->locations()->delete();
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class TransactionJournalObserver
|
* Class TransactionJournalObserver
|
||||||
@@ -34,6 +35,10 @@ class TransactionJournalObserver
|
|||||||
{
|
{
|
||||||
app('log')->debug('Observe "deleting" of a transaction journal.');
|
app('log')->debug('Observe "deleting" of a transaction journal.');
|
||||||
|
|
||||||
|
$repository = app(AttachmentRepositoryInterface::class);
|
||||||
|
$repository->setUser($transactionJournal->user);
|
||||||
|
|
||||||
|
|
||||||
// to make sure the listener doesn't get back to use and loop
|
// to make sure the listener doesn't get back to use and loop
|
||||||
TransactionJournal::withoutEvents(static function () use ($transactionJournal): void {
|
TransactionJournal::withoutEvents(static function () use ($transactionJournal): void {
|
||||||
foreach ($transactionJournal->transactions()->get() as $transaction) {
|
foreach ($transactionJournal->transactions()->get() as $transaction) {
|
||||||
@@ -41,7 +46,7 @@ class TransactionJournalObserver
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
foreach ($transactionJournal->attachments()->get() as $attachment) {
|
foreach ($transactionJournal->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
$transactionJournal->locations()->delete();
|
$transactionJournal->locations()->delete();
|
||||||
$transactionJournal->sourceJournalLinks()->delete();
|
$transactionJournal->sourceJournalLinks()->delete();
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'external_id');
|
$this->query->where('journal_meta.name', '=', 'external_id');
|
||||||
$this->query->where('journal_meta.data', '!=', sprintf('%s', json_encode($externalId)));
|
$this->query->where('journal_meta.data', '!=', sprintf('%s', json_encode($externalId)));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -405,6 +406,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
||||||
$this->query->whereLike('journal_meta.data', sprintf('%%%s%%', $internalReference));
|
$this->query->whereLike('journal_meta.data', sprintf('%%%s%%', $internalReference));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -417,6 +419,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
||||||
$this->query->whereNotLike('journal_meta.data', sprintf('%%%s%%', $internalReference));
|
$this->query->whereNotLike('journal_meta.data', sprintf('%%%s%%', $internalReference));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -429,6 +432,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
||||||
$this->query->whereNotLike('journal_meta.data', sprintf('%%%s"', $internalReference));
|
$this->query->whereNotLike('journal_meta.data', sprintf('%%%s"', $internalReference));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -441,6 +445,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
||||||
$this->query->whereLike('journal_meta.data', sprintf('"%s%%', $internalReference));
|
$this->query->whereLike('journal_meta.data', sprintf('"%s%%', $internalReference));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -453,6 +458,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
||||||
$this->query->whereLike('journal_meta.data', sprintf('%%%s"', $internalReference));
|
$this->query->whereLike('journal_meta.data', sprintf('%%%s"', $internalReference));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -465,6 +471,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
||||||
$this->query->whereLike('journal_meta.data', sprintf('"%s%%', $internalReference));
|
$this->query->whereLike('journal_meta.data', sprintf('"%s%%', $internalReference));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -697,6 +704,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'external_id');
|
$this->query->where('journal_meta.name', '=', 'external_id');
|
||||||
$this->query->where('journal_meta.data', '=', sprintf('%s', json_encode($externalId)));
|
$this->query->where('journal_meta.data', '=', sprintf('%s', json_encode($externalId)));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -706,6 +714,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'external_url');
|
$this->query->where('journal_meta.name', '=', 'external_url');
|
||||||
$this->query->where('journal_meta.data', '=', json_encode($url));
|
$this->query->where('journal_meta.data', '=', json_encode($url));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -718,6 +727,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
$this->query->where('journal_meta.name', '=', 'internal_reference');
|
||||||
$this->query->where('journal_meta.data', '=', sprintf('%s', json_encode($internalReference)));
|
$this->query->where('journal_meta.data', '=', sprintf('%s', json_encode($internalReference)));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -727,6 +737,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'recurrence_id');
|
$this->query->where('journal_meta.name', '=', 'recurrence_id');
|
||||||
$this->query->where('journal_meta.data', '=', sprintf('%s', json_encode($recurringId)));
|
$this->query->where('journal_meta.data', '=', sprintf('%s', json_encode($recurringId)));
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -862,6 +873,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'external_id');
|
$this->query->where('journal_meta.name', '=', 'external_id');
|
||||||
$this->query->whereNotNull('journal_meta.data');
|
$this->query->whereNotNull('journal_meta.data');
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -871,6 +883,7 @@ trait MetaCollection
|
|||||||
$this->joinMetaDataTables();
|
$this->joinMetaDataTables();
|
||||||
$this->query->where('journal_meta.name', '=', 'external_url');
|
$this->query->where('journal_meta.name', '=', 'external_url');
|
||||||
$this->query->whereNotNull('journal_meta.data');
|
$this->query->whereNotNull('journal_meta.data');
|
||||||
|
$this->query->whereNull('journal_meta.deleted_at');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -915,10 +928,13 @@ trait MetaCollection
|
|||||||
$q1->where(static function (Builder $q2): void {
|
$q1->where(static function (Builder $q2): void {
|
||||||
$q2->where('journal_meta.name', '=', 'external_id');
|
$q2->where('journal_meta.name', '=', 'external_id');
|
||||||
$q2->whereNull('journal_meta.data');
|
$q2->whereNull('journal_meta.data');
|
||||||
|
$q2->whereNull('journal_meta.deleted_at');
|
||||||
})->orWhere(static function (Builder $q3): void {
|
})->orWhere(static function (Builder $q3): void {
|
||||||
$q3->where('journal_meta.name', '!=', 'external_id');
|
$q3->where('journal_meta.name', '!=', 'external_id');
|
||||||
|
$q3->whereNull('journal_meta.deleted_at');
|
||||||
})->orWhere(static function (Builder $q4): void {
|
})->orWhere(static function (Builder $q4): void {
|
||||||
$q4->whereNull('journal_meta.name');
|
$q4->whereNull('journal_meta.name');
|
||||||
|
$q4->whereNull('journal_meta.deleted_at');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -933,10 +949,13 @@ trait MetaCollection
|
|||||||
$q1->where(static function (Builder $q2): void {
|
$q1->where(static function (Builder $q2): void {
|
||||||
$q2->where('journal_meta.name', '=', 'external_url');
|
$q2->where('journal_meta.name', '=', 'external_url');
|
||||||
$q2->whereNull('journal_meta.data');
|
$q2->whereNull('journal_meta.data');
|
||||||
|
$q2->whereNull('journal_meta.deleted_at');
|
||||||
})->orWhere(static function (Builder $q3): void {
|
})->orWhere(static function (Builder $q3): void {
|
||||||
$q3->where('journal_meta.name', '!=', 'external_url');
|
$q3->where('journal_meta.name', '!=', 'external_url');
|
||||||
|
$q3->whereNull('journal_meta.deleted_at');
|
||||||
})->orWhere(static function (Builder $q4): void {
|
})->orWhere(static function (Builder $q4): void {
|
||||||
$q4->whereNull('journal_meta.name');
|
$q4->whereNull('journal_meta.name');
|
||||||
|
$q4->whereNull('journal_meta.deleted_at');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class GroupCollector implements GroupCollectorInterface
|
|||||||
'category_id',
|
'category_id',
|
||||||
'budget_id',
|
'budget_id',
|
||||||
];
|
];
|
||||||
$this->stringFields = ['amount', 'foreign_amount'];
|
$this->stringFields = ['amount', 'foreign_amount', 'native_amount', 'native_foreign_amount'];
|
||||||
$this->total = 0;
|
$this->total = 0;
|
||||||
$this->fields = [
|
$this->fields = [
|
||||||
// group
|
// group
|
||||||
@@ -710,10 +710,13 @@ class GroupCollector implements GroupCollectorInterface
|
|||||||
foreach ($groups as $groudId => $group) {
|
foreach ($groups as $groudId => $group) {
|
||||||
/** @var array $transaction */
|
/** @var array $transaction */
|
||||||
foreach ($group['transactions'] as $transaction) {
|
foreach ($group['transactions'] as $transaction) {
|
||||||
$currencyId = (int) $transaction['currency_id'];
|
$currencyId = (int) $transaction['currency_id'];
|
||||||
if (null === $transaction['amount']) {
|
if (null === $transaction['amount']) {
|
||||||
throw new FireflyException(sprintf('Amount is NULL for a transaction in group #%d, please investigate.', $groudId));
|
throw new FireflyException(sprintf('Amount is NULL for a transaction in group #%d, please investigate.', $groudId));
|
||||||
}
|
}
|
||||||
|
$nativeAmount = (string) ('' === $transaction['native_amount'] ? '0' : $transaction['native_amount']);
|
||||||
|
$nativeForeignAmount = (string) ('' === $transaction['native_foreign_amount'] ? '0' : $transaction['native_foreign_amount']);
|
||||||
|
$foreignAmount = (string) ('' === $transaction['foreign_amount'] ? '0' : $transaction['foreign_amount']);
|
||||||
|
|
||||||
// set default:
|
// set default:
|
||||||
if (!array_key_exists($currencyId, $groups[$groudId]['sums'])) {
|
if (!array_key_exists($currencyId, $groups[$groudId]['sums'])) {
|
||||||
@@ -722,11 +725,13 @@ class GroupCollector implements GroupCollectorInterface
|
|||||||
$groups[$groudId]['sums'][$currencyId]['currency_symbol'] = $transaction['currency_symbol'];
|
$groups[$groudId]['sums'][$currencyId]['currency_symbol'] = $transaction['currency_symbol'];
|
||||||
$groups[$groudId]['sums'][$currencyId]['currency_decimal_places'] = $transaction['currency_decimal_places'];
|
$groups[$groudId]['sums'][$currencyId]['currency_decimal_places'] = $transaction['currency_decimal_places'];
|
||||||
$groups[$groudId]['sums'][$currencyId]['amount'] = '0';
|
$groups[$groudId]['sums'][$currencyId]['amount'] = '0';
|
||||||
|
$groups[$groudId]['sums'][$currencyId]['native_amount'] = '0';
|
||||||
}
|
}
|
||||||
$groups[$groudId]['sums'][$currencyId]['amount'] = bcadd($groups[$groudId]['sums'][$currencyId]['amount'], $transaction['amount']);
|
$groups[$groudId]['sums'][$currencyId]['amount'] = bcadd($groups[$groudId]['sums'][$currencyId]['amount'], $transaction['amount']);
|
||||||
|
$groups[$groudId]['sums'][$currencyId]['native_amount'] = bcadd($groups[$groudId]['sums'][$currencyId]['native_amount'], $nativeAmount);
|
||||||
|
|
||||||
if (null !== $transaction['foreign_amount'] && null !== $transaction['foreign_currency_id']) {
|
if (null !== $transaction['foreign_amount'] && null !== $transaction['foreign_currency_id']) {
|
||||||
$currencyId = (int) $transaction['foreign_currency_id'];
|
$currencyId = (int) $transaction['foreign_currency_id'];
|
||||||
|
|
||||||
// set default:
|
// set default:
|
||||||
if (!array_key_exists($currencyId, $groups[$groudId]['sums'])) {
|
if (!array_key_exists($currencyId, $groups[$groudId]['sums'])) {
|
||||||
@@ -735,8 +740,10 @@ class GroupCollector implements GroupCollectorInterface
|
|||||||
$groups[$groudId]['sums'][$currencyId]['currency_symbol'] = $transaction['foreign_currency_symbol'];
|
$groups[$groudId]['sums'][$currencyId]['currency_symbol'] = $transaction['foreign_currency_symbol'];
|
||||||
$groups[$groudId]['sums'][$currencyId]['currency_decimal_places'] = $transaction['foreign_currency_decimal_places'];
|
$groups[$groudId]['sums'][$currencyId]['currency_decimal_places'] = $transaction['foreign_currency_decimal_places'];
|
||||||
$groups[$groudId]['sums'][$currencyId]['amount'] = '0';
|
$groups[$groudId]['sums'][$currencyId]['amount'] = '0';
|
||||||
|
$groups[$groudId]['sums'][$currencyId]['native_amount'] = '0';
|
||||||
}
|
}
|
||||||
$groups[$groudId]['sums'][$currencyId]['amount'] = bcadd($groups[$groudId]['sums'][$currencyId]['amount'], $transaction['foreign_amount']);
|
$groups[$groudId]['sums'][$currencyId]['amount'] = bcadd($groups[$groudId]['sums'][$currencyId]['amount'], $foreignAmount);
|
||||||
|
$groups[$groudId]['sums'][$currencyId]['native_amount'] = bcadd($groups[$groudId]['sums'][$currencyId]['amount'], $nativeForeignAmount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,11 +108,14 @@ class ReconcileController extends Controller
|
|||||||
if ($end->lt($start)) {
|
if ($end->lt($start)) {
|
||||||
[$start, $end] = [$end, $start];
|
[$start, $end] = [$end, $start];
|
||||||
}
|
}
|
||||||
|
// move dates to end of day and start of day:
|
||||||
|
$start->startOfDay();
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
$startDate = clone $start;
|
$startDate = clone $start;
|
||||||
$startDate->subDay();
|
$startDate->subDay()->endOfDay();
|
||||||
$startBalance = Steam::finalAccountBalance($account, $startDate)['balance'];
|
$startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
||||||
$endBalance = Steam::finalAccountBalance($account, $end)['balance'];
|
$endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places);
|
||||||
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type));
|
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type));
|
||||||
$subTitle = (string) trans('firefly.reconcile_account', ['account' => $account->name]);
|
$subTitle = (string) trans('firefly.reconcile_account', ['account' => $account->name]);
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,11 @@ class ShowController extends Controller
|
|||||||
if ($end->lt($start)) {
|
if ($end->lt($start)) {
|
||||||
[$start, $end] = [$end, $start];
|
[$start, $end] = [$end, $start];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure dates are end of day and start of day:
|
||||||
|
$start->startOfDay();
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
$location = $this->repository->getLocation($account);
|
$location = $this->repository->getLocation($account);
|
||||||
$attachments = $this->repository->getAttachments($account);
|
$attachments = $this->repository->getAttachments($account);
|
||||||
$today = today(config('app.timezone'));
|
$today = today(config('app.timezone'));
|
||||||
@@ -181,6 +186,8 @@ class ShowController extends Controller
|
|||||||
$subTitle = (string) trans('firefly.all_journals_for_account', ['name' => $account->name]);
|
$subTitle = (string) trans('firefly.all_journals_for_account', ['name' => $account->name]);
|
||||||
$periods = new Collection();
|
$periods = new Collection();
|
||||||
|
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
/** @var GroupCollectorInterface $collector */
|
/** @var GroupCollectorInterface $collector */
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setAccounts(new Collection([$account]))->setLimit($pageSize)->setPage($page)->withAccountInformation()->withCategoryInformation();
|
$collector->setAccounts(new Collection([$account]))->setLimit($pageSize)->setPage($page)->withAccountInformation()->withCategoryInformation();
|
||||||
|
|||||||
@@ -109,8 +109,8 @@ class AccountController extends Controller
|
|||||||
$accountNames = $this->extractNames($accounts);
|
$accountNames = $this->extractNames($accounts);
|
||||||
|
|
||||||
// grab all balances
|
// grab all balances
|
||||||
$startBalances = app('steam')->finalAccountsBalance($accounts, $start);
|
$startBalances = Steam::finalAccountsBalance($accounts, $start);
|
||||||
$endBalances = app('steam')->finalAccountsBalance($accounts, $end);
|
$endBalances = Steam::finalAccountsBalance($accounts, $end);
|
||||||
|
|
||||||
// loop the accounts, then check for balance and currency info.
|
// loop the accounts, then check for balance and currency info.
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
@@ -139,6 +139,7 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
// Log::debug(sprintf('Will process expense array "%s" with amount %s', $key, $endBalance));
|
// Log::debug(sprintf('Will process expense array "%s" with amount %s', $key, $endBalance));
|
||||||
$searchCode = $this->convertToNative ? $this->defaultCurrency->code : $key;
|
$searchCode = $this->convertToNative ? $this->defaultCurrency->code : $key;
|
||||||
|
$searchCode = 'balance' === $searchCode || 'native_balance' === $searchCode ? $this->defaultCurrency->code : $searchCode;
|
||||||
// Log::debug(sprintf('Search code is %s', $searchCode));
|
// Log::debug(sprintf('Search code is %s', $searchCode));
|
||||||
// see if there is an accompanying start amount.
|
// see if there is an accompanying start amount.
|
||||||
// grab the difference and find the currency.
|
// grab the difference and find the currency.
|
||||||
@@ -334,7 +335,7 @@ class AccountController extends Controller
|
|||||||
$start = clone session('start', today(config('app.timezone'))->startOfMonth());
|
$start = clone session('start', today(config('app.timezone'))->startOfMonth());
|
||||||
$end = clone session('end', today(config('app.timezone'))->endOfMonth());
|
$end = clone session('end', today(config('app.timezone'))->endOfMonth());
|
||||||
$defaultSet = $repository->getAccountsByType([AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
$defaultSet = $repository->getAccountsByType([AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
||||||
Log::debug('Default set is ', $defaultSet);
|
// Log::debug('Default set is ', $defaultSet);
|
||||||
$frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
|
$frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
|
||||||
$frontpageArray = !is_array($frontpage->data) ? [] : $frontpage->data;
|
$frontpageArray = !is_array($frontpage->data) ? [] : $frontpage->data;
|
||||||
Log::debug('Frontpage preference set is ', $frontpageArray);
|
Log::debug('Frontpage preference set is ', $frontpageArray);
|
||||||
@@ -344,6 +345,9 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
$accounts = $repository->getAccountsById($frontpageArray);
|
$accounts = $repository->getAccountsById($frontpageArray);
|
||||||
|
|
||||||
|
// move to end of day for $end.
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
return response()->json($this->accountBalanceChart($accounts, $start, $end));
|
return response()->json($this->accountBalanceChart($accounts, $start, $end));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,7 +420,9 @@ class AccountController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function period(Account $account, Carbon $start, Carbon $end): JsonResponse
|
public function period(Account $account, Carbon $start, Carbon $end): JsonResponse
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('Now in period("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d')));
|
$start->startOfDay();
|
||||||
|
$end->endOfDay();
|
||||||
|
Log::debug(sprintf('Now in period("%s", "%s")', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
|
||||||
$chartData = [];
|
$chartData = [];
|
||||||
$cache = new CacheProperties();
|
$cache = new CacheProperties();
|
||||||
$cache->addProperty('chart.account.period');
|
$cache->addProperty('chart.account.period');
|
||||||
@@ -431,7 +437,7 @@ class AccountController extends Controller
|
|||||||
// collect and filter balances for the entire period.
|
// collect and filter balances for the entire period.
|
||||||
$step = $this->calculateStep($start, $end);
|
$step = $this->calculateStep($start, $end);
|
||||||
Log::debug(sprintf('Step is %s', $step));
|
Log::debug(sprintf('Step is %s', $step));
|
||||||
$locale = app('steam')->getLocale();
|
$locale = Steam::getLocale();
|
||||||
$return = [];
|
$return = [];
|
||||||
|
|
||||||
// fix for issue https://github.com/firefly-iii/firefly-iii/issues/8041
|
// fix for issue https://github.com/firefly-iii/firefly-iii/issues/8041
|
||||||
@@ -442,11 +448,8 @@ class AccountController extends Controller
|
|||||||
$format = (string) trans('config.month_and_day_js', [], $locale);
|
$format = (string) trans('config.month_and_day_js', [], $locale);
|
||||||
$accountCurrency = $this->accountRepository->getAccountCurrency($account);
|
$accountCurrency = $this->accountRepository->getAccountCurrency($account);
|
||||||
|
|
||||||
Log::debug('One');
|
|
||||||
$range = Steam::finalAccountBalanceInRange($account, $start, $end, $this->convertToNative);
|
$range = Steam::finalAccountBalanceInRange($account, $start, $end, $this->convertToNative);
|
||||||
Log::debug('Two');
|
|
||||||
$range = Steam::filterAccountBalances($range, $account, $this->convertToNative, $accountCurrency);
|
$range = Steam::filterAccountBalances($range, $account, $this->convertToNative, $accountCurrency);
|
||||||
Log::debug('Three');
|
|
||||||
|
|
||||||
// temp, get end balance.
|
// temp, get end balance.
|
||||||
Log::debug('temp get end balance');
|
Log::debug('temp get end balance');
|
||||||
@@ -462,25 +465,32 @@ class AccountController extends Controller
|
|||||||
Log::debug('Balances exist at:');
|
Log::debug('Balances exist at:');
|
||||||
foreach ($range as $key => $value) {
|
foreach ($range as $key => $value) {
|
||||||
$newRange[] = ['date' => $key, 'info' => $value];
|
$newRange[] = ['date' => $key, 'info' => $value];
|
||||||
Log::debug(sprintf(' - %s', $key));
|
Log::debug(sprintf('%d - %s (%s)', count($newRange) - 1, $key, json_encode($value)));
|
||||||
}
|
}
|
||||||
$carbon = Carbon::createFromFormat('Y-m-d', $newRange[0]['date']);
|
$carbon = Carbon::createFromFormat('Y-m-d', $newRange[0]['date'])->endOfDay();
|
||||||
|
Log::debug(sprintf('Start of loop, $carbon is %s', $carbon->format('Y-m-d H:i:s')));
|
||||||
while ($end->gte($current)) {
|
while ($end->gte($current)) {
|
||||||
$momentBalance = $previous;
|
$momentBalance = $previous;
|
||||||
$theDate = $current->format('Y-m-d');
|
// $theDate = $current->format('Y-m-d');
|
||||||
while ($carbon->lte($current) && array_key_exists($expectedIndex, $newRange)) {
|
Log::debug(sprintf('Now at %s, with momentBalance %s', $current->format('Y-m-d H:i:s'), json_encode($momentBalance)));
|
||||||
$momentBalance = $newRange[$expectedIndex]['info'];
|
|
||||||
Log::debug(sprintf('Expected index is %d!, date is %s, current is %s', $expectedIndex, $carbon->format('Y-m-d'), $current->format('Y-m-d')));
|
|
||||||
$carbon = Carbon::createFromFormat('Y-m-d', $newRange[$expectedIndex]['date']);
|
|
||||||
++$expectedIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// loop over the array with balances, find one that is earlier or on the same day.
|
||||||
|
while ($carbon->lte($current) && array_key_exists($expectedIndex, $newRange)) {
|
||||||
|
Log::debug(sprintf('[a] Expected index is %d, $carbon is %s, current is %s', $expectedIndex, $carbon->format('Y-m-d H:i:s'), $current->format('Y-m-d H:i:s')));
|
||||||
|
|
||||||
|
// grab the balance from that particular $expectedIndex
|
||||||
|
$momentBalance = $newRange[$expectedIndex]['info'];
|
||||||
|
++$expectedIndex;
|
||||||
|
|
||||||
|
// make new carbon based on the next found date. this should stop the loop.
|
||||||
|
if (array_key_exists($expectedIndex, $newRange)) {
|
||||||
|
$carbon = Carbon::createFromFormat('Y-m-d', $newRange[$expectedIndex]['date'])->endOfDay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log::debug(sprintf('momentBalance is now %s', json_encode($momentBalance)));
|
||||||
$return = $this->updateChartKeys($return, $momentBalance);
|
$return = $this->updateChartKeys($return, $momentBalance);
|
||||||
$previous = $momentBalance;
|
$previous = $momentBalance;
|
||||||
|
|
||||||
Log::debug(sprintf('Now at %s', $theDate), $momentBalance);
|
|
||||||
|
|
||||||
|
|
||||||
// process each balance thing.
|
// process each balance thing.
|
||||||
foreach ($momentBalance as $key => $amount) {
|
foreach ($momentBalance as $key => $amount) {
|
||||||
$label = $current->isoFormat($format);
|
$label = $current->isoFormat($format);
|
||||||
@@ -489,8 +499,6 @@ class AccountController extends Controller
|
|||||||
$current = app('navigation')->addPeriod($current, $step, 0);
|
$current = app('navigation')->addPeriod($current, $step, 0);
|
||||||
// here too, to fix #8041, the data is corrected to the end of the period.
|
// here too, to fix #8041, the data is corrected to the end of the period.
|
||||||
$current = app('navigation')->endOfX($current, $step, null);
|
$current = app('navigation')->endOfX($current, $step, null);
|
||||||
Log::debug(sprintf('Next moment is %s', $current->format('Y-m-d')));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Log::debug('End of chart loop.');
|
Log::debug('End of chart loop.');
|
||||||
// second loop (yes) to create nice array with info! Yay!
|
// second loop (yes) to create nice array with info! Yay!
|
||||||
@@ -567,8 +575,8 @@ class AccountController extends Controller
|
|||||||
$accountNames = $this->extractNames($accounts);
|
$accountNames = $this->extractNames($accounts);
|
||||||
|
|
||||||
// grab all balances
|
// grab all balances
|
||||||
$startBalances = app('steam')->finalAccountsBalance($accounts, $start);
|
$startBalances = Steam::finalAccountsBalance($accounts, $start);
|
||||||
$endBalances = app('steam')->finalAccountsBalance($accounts, $end);
|
$endBalances = Steam::finalAccountsBalance($accounts, $end);
|
||||||
|
|
||||||
|
|
||||||
// loop the accounts, then check for balance and currency info.
|
// loop the accounts, then check for balance and currency info.
|
||||||
@@ -598,6 +606,7 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
// Log::debug(sprintf('Will process expense array "%s" with amount %s', $key, $endBalance));
|
// Log::debug(sprintf('Will process expense array "%s" with amount %s', $key, $endBalance));
|
||||||
$searchCode = $this->convertToNative ? $this->defaultCurrency->code : $key;
|
$searchCode = $this->convertToNative ? $this->defaultCurrency->code : $key;
|
||||||
|
$searchCode = 'balance' === $searchCode || 'native_balance' === $searchCode ? $this->defaultCurrency->code : $searchCode;
|
||||||
// Log::debug(sprintf('Search code is %s', $searchCode));
|
// Log::debug(sprintf('Search code is %s', $searchCode));
|
||||||
// see if there is an accompanying start amount.
|
// see if there is an accompanying start amount.
|
||||||
// grab the difference and find the currency.
|
// grab the difference and find the currency.
|
||||||
|
|||||||
@@ -381,6 +381,7 @@ class DebugController extends Controller
|
|||||||
'user_count' => User::count(),
|
'user_count' => User::count(),
|
||||||
'user_flags' => $userFlags,
|
'user_flags' => $userFlags,
|
||||||
'user_agent' => $userAgent,
|
'user_agent' => $userAgent,
|
||||||
|
'native' => Amount::getNativeCurrency(),
|
||||||
'convert_to_native' => Amount::convertToNative(),
|
'convert_to_native' => Amount::convertToNative(),
|
||||||
'locale_attempts' => $localeAttempts,
|
'locale_attempts' => $localeAttempts,
|
||||||
'locale' => Steam::getLocale(),
|
'locale' => Steam::getLocale(),
|
||||||
|
|||||||
@@ -189,13 +189,14 @@ class ReconcileController extends Controller
|
|||||||
if ($end->lt($start)) {
|
if ($end->lt($start)) {
|
||||||
[$end, $start] = [$start, $end];
|
[$end, $start] = [$start, $end];
|
||||||
}
|
}
|
||||||
|
$start->endOfDay();
|
||||||
|
$end->endOfDay();
|
||||||
$startDate = clone $start;
|
$startDate = clone $start;
|
||||||
$startDate->subDay();
|
$startDate->subDay();
|
||||||
$end->endOfDay();
|
|
||||||
|
|
||||||
$currency = $this->accountRepos->getAccountCurrency($account) ?? $this->defaultCurrency;
|
$currency = $this->accountRepos->getAccountCurrency($account) ?? $this->defaultCurrency;
|
||||||
$startBalance = Steam::finalAccountBalance($account, $startDate)['balance'];
|
$startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
||||||
$endBalance = Steam::finalAccountBalance($account, $end)['balance'];
|
$endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places);
|
||||||
|
|
||||||
// get the transactions
|
// get the transactions
|
||||||
$selectionStart = clone $start;
|
$selectionStart = clone $start;
|
||||||
|
|||||||
@@ -68,14 +68,16 @@ class AmountController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function add(PiggyBank $piggyBank)
|
public function add(PiggyBank $piggyBank)
|
||||||
{
|
{
|
||||||
|
/** @var Carbon $date */
|
||||||
|
$date = session('end', today(config('app.timezone')));
|
||||||
$accounts = [];
|
$accounts = [];
|
||||||
$total = '0';
|
$total = '0';
|
||||||
$totalSaved = $this->piggyRepos->getCurrentAmount($piggyBank);
|
$totalSaved = $this->piggyRepos->getCurrentAmount($piggyBank);
|
||||||
$leftToSave = bcsub($piggyBank->target_amount, $totalSaved);
|
|
||||||
foreach ($piggyBank->accounts as $account) {
|
foreach ($piggyBank->accounts as $account) {
|
||||||
$leftOnAccount = $this->piggyRepos->leftOnAccount($piggyBank, $account, today(config('app.timezone'))->endOfDay());
|
$leftOnAccount = $this->piggyRepos->leftOnAccount($piggyBank, $account, $date);
|
||||||
$savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank, $account);
|
$savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank, $account);
|
||||||
$maxAmount = 0 === bccomp($piggyBank->target_amount, '0') ? $leftToSave : min($leftOnAccount, $leftToSave);
|
$leftToSave = bcsub($piggyBank->target_amount, $savedSoFar);
|
||||||
|
$maxAmount = 0 === bccomp($piggyBank->target_amount, '0') ? $leftOnAccount : min($leftOnAccount, $leftToSave);
|
||||||
$accounts[] = [
|
$accounts[] = [
|
||||||
'account' => $account,
|
'account' => $account,
|
||||||
'left_on_account' => $leftOnAccount,
|
'left_on_account' => $leftOnAccount,
|
||||||
@@ -105,12 +107,13 @@ class AmountController extends Controller
|
|||||||
$leftOnAccount = $this->piggyRepos->leftOnAccount($piggyBank, $account, $date);
|
$leftOnAccount = $this->piggyRepos->leftOnAccount($piggyBank, $account, $date);
|
||||||
$savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank, $account);
|
$savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank, $account);
|
||||||
$leftToSave = bcsub($piggyBank->target_amount, $savedSoFar);
|
$leftToSave = bcsub($piggyBank->target_amount, $savedSoFar);
|
||||||
|
$maxAmount = 0 === bccomp($piggyBank->target_amount, '0') ? $leftOnAccount : min($leftOnAccount, $leftToSave);
|
||||||
$accounts[] = [
|
$accounts[] = [
|
||||||
'account' => $account,
|
'account' => $account,
|
||||||
'left_on_account' => $leftOnAccount,
|
'left_on_account' => $leftOnAccount,
|
||||||
'saved_so_far' => $savedSoFar,
|
'saved_so_far' => $savedSoFar,
|
||||||
'left_to_save' => $leftToSave,
|
'left_to_save' => $leftToSave,
|
||||||
'max_amount' => 0 === bccomp($piggyBank->target_amount, '0') ? $leftOnAccount : min($leftOnAccount, $leftToSave),
|
'max_amount' => $maxAmount,
|
||||||
];
|
];
|
||||||
$total = bcadd($total, $leftOnAccount);
|
$total = bcadd($total, $leftOnAccount);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ class PreferencesController extends Controller
|
|||||||
$pushoverUserToken = (string) Preferences::getEncrypted('pushover_user_token', '')->data;
|
$pushoverUserToken = (string) Preferences::getEncrypted('pushover_user_token', '')->data;
|
||||||
$ntfyServer = Preferences::getEncrypted('ntfy_server', 'https://ntfy.sh')->data;
|
$ntfyServer = Preferences::getEncrypted('ntfy_server', 'https://ntfy.sh')->data;
|
||||||
$ntfyTopic = (string) Preferences::getEncrypted('ntfy_topic', '')->data;
|
$ntfyTopic = (string) Preferences::getEncrypted('ntfy_topic', '')->data;
|
||||||
$ntfyAuth = Preferences::get('ntfy_auth', false)->data;
|
$ntfyAuth = '1' === Preferences::get('ntfy_auth', false)->data;
|
||||||
$ntfyUser = Preferences::getEncrypted('ntfy_user', '')->data;
|
$ntfyUser = Preferences::getEncrypted('ntfy_user', '')->data;
|
||||||
$ntfyPass = (string) Preferences::getEncrypted('ntfy_pass', '')->data;
|
$ntfyPass = (string) Preferences::getEncrypted('ntfy_pass', '')->data;
|
||||||
$channels = config('notifications.channels');
|
$channels = config('notifications.channels');
|
||||||
@@ -264,6 +264,7 @@ class PreferencesController extends Controller
|
|||||||
if ($convertToNative && !$this->convertToNative) {
|
if ($convertToNative && !$this->convertToNative) {
|
||||||
// set to true!
|
// set to true!
|
||||||
Log::debug('User sets convertToNative to true.');
|
Log::debug('User sets convertToNative to true.');
|
||||||
|
Preferences::set('convert_to_native', $convertToNative);
|
||||||
event(new UserGroupChangedDefaultCurrency(auth()->user()->userGroup));
|
event(new UserGroupChangedDefaultCurrency(auth()->user()->userGroup));
|
||||||
}
|
}
|
||||||
Preferences::set('convert_to_native', $convertToNative);
|
Preferences::set('convert_to_native', $convertToNative);
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ class ReportController extends Controller
|
|||||||
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
||||||
}
|
}
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
'subTitle',
|
'subTitle',
|
||||||
@@ -114,6 +116,8 @@ class ReportController extends Controller
|
|||||||
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
||||||
}
|
}
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
'subTitle',
|
'subTitle',
|
||||||
@@ -146,6 +150,8 @@ class ReportController extends Controller
|
|||||||
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
||||||
}
|
}
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
'subTitle',
|
'subTitle',
|
||||||
@@ -179,6 +185,8 @@ class ReportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
'subTitle',
|
'subTitle',
|
||||||
@@ -211,6 +219,8 @@ class ReportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
'subTitle',
|
'subTitle',
|
||||||
@@ -367,6 +377,8 @@ class ReportController extends Controller
|
|||||||
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
|
||||||
}
|
}
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
'subTitle',
|
'subTitle',
|
||||||
|
|||||||
@@ -112,6 +112,11 @@ class TransactionJournal extends Model
|
|||||||
return $this->belongsTo(User::class);
|
return $this->belongsTo(User::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function userGroup(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(UserGroup::class);
|
||||||
|
}
|
||||||
|
|
||||||
public function attachments(): MorphMany
|
public function attachments(): MorphMany
|
||||||
{
|
{
|
||||||
return $this->morphMany(Attachment::class, 'attachable');
|
return $this->morphMany(Attachment::class, 'attachable');
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Support\Facades\FireflyConfig;
|
use FireflyIII\Support\Facades\FireflyConfig;
|
||||||
use FireflyIII\Support\Facades\Preferences;
|
use FireflyIII\Support\Facades\Preferences;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
class ReturnsSettings
|
class ReturnsSettings
|
||||||
{
|
{
|
||||||
@@ -42,6 +43,7 @@ class ReturnsSettings
|
|||||||
|
|
||||||
private static function getNtfySettings(string $type, ?User $user): array
|
private static function getNtfySettings(string $type, ?User $user): array
|
||||||
{
|
{
|
||||||
|
Log::debug(sprintf('Getting Ntfy settings for %s and user #%d', $type, $user?->id));
|
||||||
$settings = [
|
$settings = [
|
||||||
'ntfy_server' => 'https://ntfy.sh',
|
'ntfy_server' => 'https://ntfy.sh',
|
||||||
'ntfy_topic' => '',
|
'ntfy_topic' => '',
|
||||||
@@ -56,6 +58,7 @@ class ReturnsSettings
|
|||||||
$settings['ntfy_auth'] = Preferences::getForUser($user, 'ntfy_auth', false)->data;
|
$settings['ntfy_auth'] = Preferences::getForUser($user, 'ntfy_auth', false)->data;
|
||||||
$settings['ntfy_user'] = Preferences::getEncryptedForUser($user, 'ntfy_user', '')->data;
|
$settings['ntfy_user'] = Preferences::getEncryptedForUser($user, 'ntfy_user', '')->data;
|
||||||
$settings['ntfy_pass'] = Preferences::getEncryptedForUser($user, 'ntfy_pass', '')->data;
|
$settings['ntfy_pass'] = Preferences::getEncryptedForUser($user, 'ntfy_pass', '')->data;
|
||||||
|
Log::debug(sprintf('Auth is %s, user = "%s"', var_export($settings['ntfy_auth'], true), $settings['ntfy_user']));
|
||||||
}
|
}
|
||||||
if ('owner' === $type) {
|
if ('owner' === $type) {
|
||||||
$settings['ntfy_server'] = FireflyConfig::getEncrypted('ntfy_server', 'https://ntfy.sh')->data;
|
$settings['ntfy_server'] = FireflyConfig::getEncrypted('ntfy_server', 'https://ntfy.sh')->data;
|
||||||
@@ -63,6 +66,7 @@ class ReturnsSettings
|
|||||||
$settings['ntfy_auth'] = FireflyConfig::get('ntfy_auth', false)->data;
|
$settings['ntfy_auth'] = FireflyConfig::get('ntfy_auth', false)->data;
|
||||||
$settings['ntfy_user'] = FireflyConfig::getEncrypted('ntfy_user', '')->data;
|
$settings['ntfy_user'] = FireflyConfig::getEncrypted('ntfy_user', '')->data;
|
||||||
$settings['ntfy_pass'] = FireflyConfig::getEncrypted('ntfy_pass', '')->data;
|
$settings['ntfy_pass'] = FireflyConfig::getEncrypted('ntfy_pass', '')->data;
|
||||||
|
Log::debug(sprintf('Auth is %s, user = "%s"', var_export($settings['ntfy_auth'], true), $settings['ntfy_user']));
|
||||||
}
|
}
|
||||||
|
|
||||||
// overrule config.
|
// overrule config.
|
||||||
@@ -74,7 +78,9 @@ class ReturnsSettings
|
|||||||
config(['ntfy-notification-channel.authentication.enabled' => true]);
|
config(['ntfy-notification-channel.authentication.enabled' => true]);
|
||||||
config(['ntfy-notification-channel.authentication.username' => $settings['ntfy_user']]);
|
config(['ntfy-notification-channel.authentication.username' => $settings['ntfy_user']]);
|
||||||
config(['ntfy-notification-channel.authentication.password' => $settings['ntfy_pass']]);
|
config(['ntfy-notification-channel.authentication.password' => $settings['ntfy_pass']]);
|
||||||
|
Log::debug('Authentication enabled for Ntfy.');
|
||||||
}
|
}
|
||||||
|
Log::debug('Return ntfy settings.');
|
||||||
|
|
||||||
return $settings;
|
return $settings;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,16 +169,11 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
|
|
||||||
// is a Transaction Journal related event.
|
// is a Transaction Journal related event.
|
||||||
StoredTransactionGroup::class => [
|
StoredTransactionGroup::class => [
|
||||||
'FireflyIII\Handlers\Events\StoredGroupEventHandler@processRules',
|
'FireflyIII\Handlers\Events\StoredGroupEventHandler@runAllHandlers',
|
||||||
'FireflyIII\Handlers\Events\StoredGroupEventHandler@recalculateCredit',
|
|
||||||
'FireflyIII\Handlers\Events\StoredGroupEventHandler@triggerWebhooks',
|
|
||||||
],
|
],
|
||||||
// is a Transaction Journal related event.
|
// is a Transaction Journal related event.
|
||||||
UpdatedTransactionGroup::class => [
|
UpdatedTransactionGroup::class => [
|
||||||
'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@unifyAccounts',
|
'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@runAllHandlers',
|
||||||
'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@processRules',
|
|
||||||
'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@recalculateCredit',
|
|
||||||
'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@triggerWebhooks',
|
|
||||||
],
|
],
|
||||||
DestroyedTransactionGroup::class => [
|
DestroyedTransactionGroup::class => [
|
||||||
'FireflyIII\Handlers\Events\DestroyedGroupEventHandler@triggerWebhooks',
|
'FireflyIII\Handlers\Events\DestroyedGroupEventHandler@triggerWebhooks',
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function getCompleteSet(): Collection
|
public function getCompleteSet(): Collection
|
||||||
{
|
{
|
||||||
return TransactionCurrency::orderBy('code', 'ASC')->get();
|
return TransactionCurrency::where('enabled', true)->orderBy('code', 'ASC')->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ class RecurringRepository implements RecurringRepositoryInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all of the user's recurring transactions.
|
* Returns all the user's recurring transactions.
|
||||||
*/
|
*/
|
||||||
public function get(): Collection
|
public function get(): Collection
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -108,6 +108,6 @@ class ExchangeRateRepository implements ExchangeRateRepositoryInterface
|
|||||||
#[\Override]
|
#[\Override]
|
||||||
public function getAll(): Collection
|
public function getAll(): Collection
|
||||||
{
|
{
|
||||||
return $this->userGroup->currencyExchangeRates()->get();
|
return $this->userGroup->currencyExchangeRates()->orderBy('date', 'ASC')->get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -513,7 +513,7 @@ class ExportDataGenerator
|
|||||||
'currency_code', 'foreign_currency_code', 'source_name', 'source_type', 'destination_name', 'destination_type', 'amount', 'foreign_amount', 'category', 'budget', 'piggy_bank', 'tags',
|
'currency_code', 'foreign_currency_code', 'source_name', 'source_type', 'destination_name', 'destination_type', 'amount', 'foreign_amount', 'category', 'budget', 'piggy_bank', 'tags',
|
||||||
];
|
];
|
||||||
$records = [];
|
$records = [];
|
||||||
$recurrences = $recurringRepos->getAll();
|
$recurrences = $recurringRepos->get();
|
||||||
|
|
||||||
/** @var Recurrence $recurrence */
|
/** @var Recurrence $recurrence */
|
||||||
foreach ($recurrences as $recurrence) {
|
foreach ($recurrences as $recurrence) {
|
||||||
|
|||||||
@@ -88,6 +88,11 @@ class ExchangeRateConverter
|
|||||||
|
|
||||||
return '1';
|
return '1';
|
||||||
}
|
}
|
||||||
|
if ($from->id === $to->id) {
|
||||||
|
Log::debug('ExchangeRateConverter: From and to are the same, return "1".');
|
||||||
|
|
||||||
|
return '1';
|
||||||
|
}
|
||||||
$rate = $this->getRate($from, $to, $date);
|
$rate = $this->getRate($from, $to, $date);
|
||||||
|
|
||||||
return '0' === $rate ? '1' : $rate;
|
return '0' === $rate ? '1' : $rate;
|
||||||
@@ -103,7 +108,7 @@ class ExchangeRateConverter
|
|||||||
|
|
||||||
// find in cache
|
// find in cache
|
||||||
if (null !== $res) {
|
if (null !== $res) {
|
||||||
Log::debug(sprintf('ExchangeRateConverter: Return cached rate from #%d to #%d on %s.', $from->id, $to->id, $date->format('Y-m-d')));
|
Log::debug(sprintf('ExchangeRateConverter: Return cached rate from %s to %s on %s.', $from->code, $to->code, $date->format('Y-m-d')));
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
@@ -112,7 +117,7 @@ class ExchangeRateConverter
|
|||||||
$rate = $this->getFromDB($from->id, $to->id, $date->format('Y-m-d'));
|
$rate = $this->getFromDB($from->id, $to->id, $date->format('Y-m-d'));
|
||||||
if (null !== $rate) {
|
if (null !== $rate) {
|
||||||
Cache::forever($key, $rate);
|
Cache::forever($key, $rate);
|
||||||
Log::debug(sprintf('ExchangeRateConverter: Return DB rate from #%d to #%d on %s.', $from->id, $to->id, $date->format('Y-m-d')));
|
Log::debug(sprintf('ExchangeRateConverter: Return DB rate from %s to %s on %s.', $from->code, $to->code, $date->format('Y-m-d')));
|
||||||
|
|
||||||
return $rate;
|
return $rate;
|
||||||
}
|
}
|
||||||
@@ -122,7 +127,7 @@ class ExchangeRateConverter
|
|||||||
if (null !== $rate) {
|
if (null !== $rate) {
|
||||||
$rate = bcdiv('1', $rate);
|
$rate = bcdiv('1', $rate);
|
||||||
Cache::forever($key, $rate);
|
Cache::forever($key, $rate);
|
||||||
Log::debug(sprintf('ExchangeRateConverter: Return inverse DB rate from #%d to #%d on %s.', $from->id, $to->id, $date->format('Y-m-d')));
|
Log::debug(sprintf('ExchangeRateConverter: Return inverse DB rate from %s to %s on %s.', $from->code, $to->code, $date->format('Y-m-d')));
|
||||||
|
|
||||||
return $rate;
|
return $rate;
|
||||||
}
|
}
|
||||||
@@ -133,14 +138,14 @@ class ExchangeRateConverter
|
|||||||
|
|
||||||
// combined (if present), they can be used to calculate the necessary conversion rate.
|
// combined (if present), they can be used to calculate the necessary conversion rate.
|
||||||
if (0 === bccomp('0', $first) || 0 === bccomp('0', $second)) {
|
if (0 === bccomp('0', $first) || 0 === bccomp('0', $second)) {
|
||||||
Log::warning(sprintf('$first is "%s" and $second is "%s"', $first, $second));
|
Log::warning(sprintf('There is not enough information to convert %s to %s on date %s', $from->code, $to->code, $date->format('Y-m-d')));
|
||||||
|
|
||||||
return '1';
|
return '1';
|
||||||
}
|
}
|
||||||
|
|
||||||
$second = bcdiv('1', $second);
|
$second = bcdiv('1', $second);
|
||||||
$rate = bcmul($first, $second);
|
$rate = bcmul($first, $second);
|
||||||
Log::debug(sprintf('ExchangeRateConverter: Return DB rate from #%d to #%d on %s.', $from->id, $to->id, $date->format('Y-m-d')));
|
Log::debug(sprintf('ExchangeRateConverter: Return DB rate from %s to %s on %s.', $from->code, $to->code, $date->format('Y-m-d')));
|
||||||
Cache::forever($key, $rate);
|
Cache::forever($key, $rate);
|
||||||
|
|
||||||
return $rate;
|
return $rate;
|
||||||
@@ -154,6 +159,8 @@ class ExchangeRateConverter
|
|||||||
private function getFromDB(int $from, int $to, string $date): ?string
|
private function getFromDB(int $from, int $to, string $date): ?string
|
||||||
{
|
{
|
||||||
if ($from === $to) {
|
if ($from === $to) {
|
||||||
|
Log::debug('ExchangeRateConverter: From and to are the same, return "1".');
|
||||||
|
|
||||||
return '1';
|
return '1';
|
||||||
}
|
}
|
||||||
$key = sprintf('cer-%d-%d-%s', $from, $to, $date);
|
$key = sprintf('cer-%d-%d-%s', $from, $to, $date);
|
||||||
@@ -173,7 +180,7 @@ class ExchangeRateConverter
|
|||||||
if ('' === $rate) {
|
if ('' === $rate) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Log::debug(sprintf('ExchangeRateConverter: Found !cached! rate from #%d to #%d on %s.', $from, $to, $date));
|
Log::debug(sprintf('ExchangeRateConverter: Found cached rate from #%d to #%d on %s.', $from, $to, $date));
|
||||||
|
|
||||||
return $rate;
|
return $rate;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ use FireflyIII\Support\CacheProperties;
|
|||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trait ChartGeneration
|
* Trait ChartGeneration
|
||||||
@@ -57,7 +58,7 @@ trait ChartGeneration
|
|||||||
if ($cache->has()) {
|
if ($cache->has()) {
|
||||||
return $cache->get();
|
return $cache->get();
|
||||||
}
|
}
|
||||||
app('log')->debug('Regenerate chart.account.account-balance-chart from scratch.');
|
Log::debug('Regenerate chart.account.account-balance-chart from scratch.');
|
||||||
$locale = app('steam')->getLocale();
|
$locale = app('steam')->getLocale();
|
||||||
|
|
||||||
/** @var GeneratorInterface $generator */
|
/** @var GeneratorInterface $generator */
|
||||||
@@ -69,8 +70,11 @@ trait ChartGeneration
|
|||||||
$default = app('amount')->getNativeCurrency();
|
$default = app('amount')->getNativeCurrency();
|
||||||
$chartData = [];
|
$chartData = [];
|
||||||
|
|
||||||
|
Log::debug(sprintf('Start of accountBalanceChart(list, %s, %s)', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
|
Log::debug(sprintf('Now at account #%d ("%s)', $account->id, $account->name));
|
||||||
$currency = $accountRepos->getAccountCurrency($account) ?? $default;
|
$currency = $accountRepos->getAccountCurrency($account) ?? $default;
|
||||||
$useNative = $convertToNative && $default->id !== $currency->id;
|
$useNative = $convertToNative && $default->id !== $currency->id;
|
||||||
$field = $useNative ? 'native_balance' : 'balance';
|
$field = $useNative ? 'native_balance' : 'balance';
|
||||||
@@ -82,8 +86,9 @@ trait ChartGeneration
|
|||||||
];
|
];
|
||||||
|
|
||||||
$currentStart = clone $start;
|
$currentStart = clone $start;
|
||||||
$range = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToNative);
|
$range = Steam::finalAccountBalanceInRange($account, clone $start, clone $end, $this->convertToNative);
|
||||||
$previous = array_values($range)[0];
|
$previous = array_values($range)[0];
|
||||||
|
Log::debug(sprintf('Start balance for account #%d ("%s) is', $account->id, $account->name), $previous);
|
||||||
while ($currentStart <= $end) {
|
while ($currentStart <= $end) {
|
||||||
$format = $currentStart->format('Y-m-d');
|
$format = $currentStart->format('Y-m-d');
|
||||||
$label = trim($currentStart->isoFormat((string) trans('config.month_and_day_js', [], $locale)));
|
$label = trim($currentStart->isoFormat((string) trans('config.month_and_day_js', [], $locale)));
|
||||||
|
|||||||
@@ -203,11 +203,10 @@ trait PeriodOverview
|
|||||||
$currencySymbol = $journal['currency_symbol'];
|
$currencySymbol = $journal['currency_symbol'];
|
||||||
$currencyDecimalPlaces = $journal['currency_decimal_places'];
|
$currencyDecimalPlaces = $journal['currency_decimal_places'];
|
||||||
$foreignCurrencyId = $journal['foreign_currency_id'];
|
$foreignCurrencyId = $journal['foreign_currency_id'];
|
||||||
$amount = $journal['amount'];
|
$amount = $journal['amount'] ?? '0';
|
||||||
|
|
||||||
|
|
||||||
if ($this->convertToNative && $currencyId !== $this->defaultCurrency->id && $foreignCurrencyId !== $this->defaultCurrency->id) {
|
if ($this->convertToNative && $currencyId !== $this->defaultCurrency->id && $foreignCurrencyId !== $this->defaultCurrency->id) {
|
||||||
$amount = $journal['native_amount'];
|
$amount = $journal['native_amount'] ?? '0';
|
||||||
$currencyId = $this->defaultCurrency->id;
|
$currencyId = $this->defaultCurrency->id;
|
||||||
$currencyCode = $this->defaultCurrency->code;
|
$currencyCode = $this->defaultCurrency->code;
|
||||||
$currencyName = $this->defaultCurrency->name;
|
$currencyName = $this->defaultCurrency->name;
|
||||||
@@ -220,7 +219,7 @@ trait PeriodOverview
|
|||||||
$currencyName = $journal['foreign_currency_name'];
|
$currencyName = $journal['foreign_currency_name'];
|
||||||
$currencySymbol = $journal['foreign_currency_symbol'];
|
$currencySymbol = $journal['foreign_currency_symbol'];
|
||||||
$currencyDecimalPlaces = $journal['foreign_currency_decimal_places'];
|
$currencyDecimalPlaces = $journal['foreign_currency_decimal_places'];
|
||||||
$amount = $journal['foreign_amount'];
|
$amount = $journal['foreign_amount'] ?? '0';
|
||||||
}
|
}
|
||||||
$return[$currencyId] ??= [
|
$return[$currencyId] ??= [
|
||||||
'amount' => '0',
|
'amount' => '0',
|
||||||
|
|||||||
@@ -55,4 +55,43 @@ abstract class Node
|
|||||||
return $this->prohibited;
|
return $this->prohibited;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function equals(self $compare): bool
|
||||||
|
{
|
||||||
|
if ($compare->isProhibited(false) !== $this->isProhibited(false)) {
|
||||||
|
Log::debug('Return false because prohibited status is different');
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($compare instanceof NodeGroup) {
|
||||||
|
if (count($compare->getNodes()) !== count($this->getNodes())) {
|
||||||
|
Log::debug(sprintf('Return false because node count is different. Original is %d, compare is %d', count($this->getNodes()), count($compare->getNodes())));
|
||||||
|
|
||||||
|
// var_dump($this);
|
||||||
|
// var_dump($compare);
|
||||||
|
// exit;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int $index
|
||||||
|
* @var Node $node
|
||||||
|
*/
|
||||||
|
foreach ($this->getNodes() as $index => $node) {
|
||||||
|
if (false === $node->equals($compare->getNodes()[$index])) {
|
||||||
|
Log::debug('Return false because nodes are different!');
|
||||||
|
var_dump($this);
|
||||||
|
var_dump($compare);
|
||||||
|
|
||||||
|
exit;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ class QueryParser implements QueryParserInterface
|
|||||||
|
|
||||||
while ($this->position < strlen($this->query)) {
|
while ($this->position < strlen($this->query)) {
|
||||||
$char = $this->query[$this->position];
|
$char = $this->query[$this->position];
|
||||||
|
// Log::debug(sprintf('Char #%d: %s', $this->position, $char));
|
||||||
|
|
||||||
// If we're in a quoted string, we treat all characters except another quote as ordinary characters
|
// If we're in a quoted string, we treat all characters except another quote as ordinary characters
|
||||||
if ($inQuotes) {
|
if ($inQuotes) {
|
||||||
@@ -150,15 +151,19 @@ class QueryParser implements QueryParserInterface
|
|||||||
|
|
||||||
|
|
||||||
case ':':
|
case ':':
|
||||||
if ('' !== $tokenUnderConstruction) {
|
$skipNext = false;
|
||||||
|
if ('' === $tokenUnderConstruction) { // @phpstan-ignore-line
|
||||||
|
// In any other location, it's just a normal character
|
||||||
|
$tokenUnderConstruction .= $char;
|
||||||
|
$skipNext = true;
|
||||||
|
}
|
||||||
|
if ('' !== $tokenUnderConstruction && !$skipNext) {
|
||||||
|
Log::debug(sprintf('Turns out that "%s" is a field name. Reset the token.', $tokenUnderConstruction));
|
||||||
// If we meet a colon with a left-hand side string, we know we're in a field and are about to set up the value
|
// If we meet a colon with a left-hand side string, we know we're in a field and are about to set up the value
|
||||||
$fieldName = $tokenUnderConstruction;
|
$fieldName = $tokenUnderConstruction;
|
||||||
$tokenUnderConstruction = '';
|
$tokenUnderConstruction = '';
|
||||||
}
|
}
|
||||||
if ('' === $tokenUnderConstruction) { // @phpstan-ignore-line
|
|
||||||
// In any other location, it's just a normal character
|
|
||||||
$tokenUnderConstruction .= $char;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -28,10 +28,11 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Transaction;
|
use FireflyIII\Models\Transaction;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Steam.
|
* Class Steam.
|
||||||
@@ -58,8 +59,8 @@ class Steam
|
|||||||
public function finalAccountBalanceInRange(Account $account, Carbon $start, Carbon $end, bool $convertToNative): array
|
public function finalAccountBalanceInRange(Account $account, Carbon $start, Carbon $end, bool $convertToNative): array
|
||||||
{
|
{
|
||||||
// expand period.
|
// expand period.
|
||||||
$start->subDay()->startOfDay();
|
$start->startOfDay();
|
||||||
$end->addDay()->endOfDay();
|
$end->endOfDay();
|
||||||
Log::debug(sprintf('finalAccountBalanceInRange(#%d, %s, %s)', $account->id, $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
|
Log::debug(sprintf('finalAccountBalanceInRange(#%d, %s, %s)', $account->id, $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
|
||||||
|
|
||||||
// set up cache
|
// set up cache
|
||||||
@@ -75,100 +76,84 @@ class Steam
|
|||||||
$balances = [];
|
$balances = [];
|
||||||
$formatted = $start->format('Y-m-d');
|
$formatted = $start->format('Y-m-d');
|
||||||
$startBalance = $this->finalAccountBalance($account, $start);
|
$startBalance = $this->finalAccountBalance($account, $start);
|
||||||
$defaultCurrency = app('amount')->getNativeCurrencyByUserGroup($account->user->userGroup);
|
$nativeCurrency = app('amount')->getNativeCurrencyByUserGroup($account->user->userGroup);
|
||||||
$accountCurrency = $this->getAccountCurrency($account);
|
$accountCurrency = $this->getAccountCurrency($account);
|
||||||
$hasCurrency = null !== $accountCurrency;
|
$hasCurrency = null !== $accountCurrency;
|
||||||
$currency = $accountCurrency ?? $defaultCurrency;
|
$currency = $accountCurrency ?? $nativeCurrency;
|
||||||
Log::debug(sprintf('Currency is %s', $currency->code));
|
Log::debug(sprintf('Currency is %s', $currency->code));
|
||||||
|
|
||||||
|
|
||||||
|
// set start balances:
|
||||||
|
$startBalance[$currency->code] ??= '0';
|
||||||
|
if ($hasCurrency) {
|
||||||
|
$startBalance[$accountCurrency->code] ??= '0';
|
||||||
|
}
|
||||||
if (!$hasCurrency) {
|
if (!$hasCurrency) {
|
||||||
Log::debug(sprintf('Also set start balance in %s', $defaultCurrency->code));
|
Log::debug(sprintf('Also set start balance in %s', $nativeCurrency->code));
|
||||||
$startBalance[$defaultCurrency->code] ??= '0';
|
$startBalance[$nativeCurrency->code] ??= '0';
|
||||||
}
|
}
|
||||||
$currencies = [
|
$currencies = [
|
||||||
$currency->id => $currency,
|
$currency->id => $currency,
|
||||||
$defaultCurrency->id => $defaultCurrency,
|
$nativeCurrency->id => $nativeCurrency,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
$startBalance[$currency->code] ??= '0';
|
|
||||||
$balances[$formatted] = $startBalance;
|
$balances[$formatted] = $startBalance;
|
||||||
Log::debug('Final start balance: ', $startBalance);
|
Log::debug('Final start balance: ', $startBalance);
|
||||||
|
|
||||||
|
// sums up the balance changes per day.
|
||||||
// sums up the balance changes per day, for foreign, native and normal amounts.
|
Log::debug(sprintf('Date >= %s and <= %s', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
|
||||||
$set = $account->transactions()
|
$set = $account->transactions()
|
||||||
->leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
|
->leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
|
||||||
->where('transaction_journals.date', '>=', $start->format('Y-m-d H:i:s'))
|
->where('transaction_journals.date', '>=', $start->format('Y-m-d H:i:s'))
|
||||||
->where('transaction_journals.date', '<=', $end->format('Y-m-d H:i:s'))
|
->where('transaction_journals.date', '<=', $end->format('Y-m-d H:i:s'))
|
||||||
->groupBy('transaction_journals.date')
|
->groupBy('transaction_journals.date')
|
||||||
->groupBy('transactions.transaction_currency_id')
|
->groupBy('transactions.transaction_currency_id')
|
||||||
->groupBy('transactions.foreign_currency_id')
|
|
||||||
->orderBy('transaction_journals.date', 'ASC')
|
->orderBy('transaction_journals.date', 'ASC')
|
||||||
->whereNull('transaction_journals.deleted_at')
|
->whereNull('transaction_journals.deleted_at')
|
||||||
->get(
|
->get(
|
||||||
[ // @phpstan-ignore-line
|
[ // @phpstan-ignore-line
|
||||||
'transaction_journals.date',
|
'transaction_journals.date',
|
||||||
'transactions.transaction_currency_id',
|
'transactions.transaction_currency_id',
|
||||||
DB::raw('SUM(transactions.amount) AS modified'),
|
DB::raw('SUM(transactions.amount) AS sum_of_day'),
|
||||||
'transactions.foreign_currency_id',
|
|
||||||
DB::raw('SUM(transactions.foreign_amount) AS modified_foreign'),
|
|
||||||
DB::raw('SUM(transactions.native_amount) AS modified_native'),
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
$currentBalance = $startBalance;
|
$currentBalance = $startBalance;
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
|
||||||
|
|
||||||
/** @var Transaction $entry */
|
/** @var Transaction $entry */
|
||||||
foreach ($set as $entry) {
|
foreach ($set as $entry) {
|
||||||
// normal, native and foreign amount
|
// get date object
|
||||||
$carbon = new Carbon($entry->date, $entry->date_tz);
|
$carbon = new Carbon($entry->date, $entry->date_tz);
|
||||||
$modified = (string) (null === $entry->modified ? '0' : $entry->modified);
|
$carbonKey = $carbon->format('Y-m-d');
|
||||||
$foreignModified = (string) (null === $entry->modified_foreign ? '0' : $entry->modified_foreign);
|
// make sure sum is a string:
|
||||||
$nativeModified = (string) (null === $entry->modified_native ? '0' : $entry->modified_native);
|
$sumOfDay = (string) (null === $entry->sum_of_day ? '0' : $entry->sum_of_day);
|
||||||
|
|
||||||
// find currency of this entry.
|
// find currency of this entry, does not have to exist.
|
||||||
$currencies[$entry->transaction_currency_id] ??= TransactionCurrency::find($entry->transaction_currency_id);
|
$currencies[$entry->transaction_currency_id] ??= TransactionCurrency::find($entry->transaction_currency_id);
|
||||||
|
|
||||||
|
// make sure this $entry has its own $entryCurrency
|
||||||
/** @var TransactionCurrency $entryCurrency */
|
/** @var TransactionCurrency $entryCurrency */
|
||||||
$entryCurrency = $currencies[$entry->transaction_currency_id];
|
$entryCurrency = $currencies[$entry->transaction_currency_id];
|
||||||
|
|
||||||
Log::debug(sprintf('Processing transaction(s) on date %s', $carbon->format('Y-m-d H:i:s')));
|
Log::debug(sprintf('Processing transaction(s) on moment %s', $carbon->format('Y-m-d H:i:s')));
|
||||||
|
$currentBalance[$entryCurrency->code] ??= '0';
|
||||||
|
$currentBalance[$entryCurrency->code] = bcadd($sumOfDay, $currentBalance[$entryCurrency->code]);
|
||||||
|
|
||||||
// if convert to native, if NOT convert to native.
|
// if not convert to native, add the amount to "balance", do nothing else.
|
||||||
if ($convertToNative) {
|
|
||||||
Log::debug(sprintf('Amount is %s %s, foreign amount is %s, native amount is %s', $entryCurrency->code, $this->bcround($modified, 2), $this->bcround($foreignModified, 2), $this->bcround($nativeModified, 2)));
|
|
||||||
// if the currency is the default currency add to native balance + currency balance
|
|
||||||
if ($entry->transaction_currency_id === $defaultCurrency->id) {
|
|
||||||
Log::debug('Add amount to native.');
|
|
||||||
$currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add to native balance.
|
|
||||||
if ($entry->foreign_currency_id !== $defaultCurrency->id) {
|
|
||||||
// this check is not necessary, because if the foreign currency is the same as the default currency, the native amount is zero.
|
|
||||||
// so adding this would mean nothing.
|
|
||||||
$currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $nativeModified);
|
|
||||||
}
|
|
||||||
if ($entry->foreign_currency_id === $defaultCurrency->id) {
|
|
||||||
$currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $foreignModified);
|
|
||||||
}
|
|
||||||
// add to balance if is the same.
|
|
||||||
if ($entry->transaction_currency_id === $accountCurrency?->id) {
|
|
||||||
$currentBalance['balance'] = bcadd($currentBalance['balance'], $modified);
|
|
||||||
}
|
|
||||||
// add currency balance
|
|
||||||
$currentBalance[$entryCurrency->code] = bcadd($currentBalance[$entryCurrency->code] ?? '0', $modified);
|
|
||||||
}
|
|
||||||
if (!$convertToNative) {
|
if (!$convertToNative) {
|
||||||
Log::debug(sprintf('Amount is %s %s, foreign amount is %s, native amount is %s', $entryCurrency->code, $modified, $foreignModified, $nativeModified));
|
$currentBalance['balance'] = bcadd($currentBalance['balance'], $sumOfDay);
|
||||||
// add to balance, as expected.
|
|
||||||
$currentBalance['balance'] = bcadd($currentBalance['balance'] ?? '0', $modified);
|
|
||||||
// add to GBP, as expected.
|
|
||||||
$currentBalance[$entryCurrency->code] = bcadd($currentBalance[$entryCurrency->code] ?? '0', $modified);
|
|
||||||
}
|
}
|
||||||
$balances[$carbon->format('Y-m-d')] = $currentBalance;
|
// if convert to native add the converted amount to "native_balance".
|
||||||
Log::debug('Updated entry', $currentBalance);
|
if ($convertToNative) {
|
||||||
|
$nativeSumOfDay = $converter->convert($entryCurrency, $nativeCurrency, $carbon, $sumOfDay);
|
||||||
|
$currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $nativeSumOfDay);
|
||||||
|
}
|
||||||
|
// just set it.
|
||||||
|
$balances[$carbonKey] = $currentBalance;
|
||||||
|
Log::debug(sprintf('Updated entry [%s]', $carbonKey), $currentBalance);
|
||||||
}
|
}
|
||||||
$cache->store($balances);
|
$cache->store($balances);
|
||||||
Log::debug('End of method');
|
Log::debug('End of method');
|
||||||
@@ -275,116 +260,77 @@ class Steam
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the balance of an account at exact moment given. Array with at least one value.
|
* Returns the balance of an account at exact moment given. Array with at least one value.
|
||||||
|
* Always returns:
|
||||||
|
* "balance": balance in the account's currency OR user's native currency if the account has no currency
|
||||||
|
* "EUR": balance in EUR (or whatever currencies the account has balance in)
|
||||||
*
|
*
|
||||||
* "balance" the balance in whatever currency the account has, so the sum of all transaction that happen to have
|
* If the user has $convertToNative:
|
||||||
* THAT currency.
|
* "balance": balance in the account's currency OR user's native currency if the account has no currency
|
||||||
* "native_balance" the balance according to the "native_amount" + "native_foreign_amount" fields.
|
* --> "native_balance": balance in the user's native balance, with all amounts converted to native.
|
||||||
* "ABC" the balance in this particular currency code (may repeat for each found currency).
|
* "EUR": balance in EUR (or whatever currencies the account has balance in)
|
||||||
*
|
|
||||||
* Het maakt niet uit of de native currency wel of niet gelijk is aan de account currency.
|
|
||||||
* Optelsom zou hetzelfde moeten zijn. Als het EUR is en de rekening ook is native_amount 0.
|
|
||||||
* Zo niet is amount 0 en native_amount het bedrag.
|
|
||||||
*
|
|
||||||
* Eerst een som van alle transacties in de native currency. Alle EUR bij elkaar opgeteld.
|
|
||||||
* Om te weten wat er nog meer op de rekening gebeurt, pak alles waar currency niet EUR is, en de foreign ook niet,
|
|
||||||
* en tel native_amount erbij op.
|
|
||||||
* Daarna pak je alle transacties waar currency niet EUR is, en de foreign wel, en tel foreign_amount erbij op.
|
|
||||||
*
|
|
||||||
* Wil je niks weten van native currencies, pak je:
|
|
||||||
*
|
|
||||||
* Eerst een som van alle transacties gegroepeerd op currency. Einde.
|
|
||||||
*/
|
*/
|
||||||
public function finalAccountBalance(Account $account, Carbon $date): array
|
public function finalAccountBalance(Account $account, Carbon $date): array
|
||||||
{
|
{
|
||||||
$cache = new CacheProperties();
|
|
||||||
|
$cache = new CacheProperties();
|
||||||
$cache->addProperty($account->id);
|
$cache->addProperty($account->id);
|
||||||
$cache->addProperty($date);
|
$cache->addProperty($date);
|
||||||
if ($cache->has()) {
|
if ($cache->has()) {
|
||||||
return $cache->get();
|
// Log::debug(sprintf('CACHED finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s')));
|
||||||
|
// return $cache->get();
|
||||||
}
|
}
|
||||||
|
Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s')));
|
||||||
|
|
||||||
Log::debug(sprintf('Now in finalAccountBalance(#%d, "%s", "%s")', $account->id, $account->name, $date->format('Y-m-d H:i:s')));
|
$native = Amount::getNativeCurrencyByUserGroup($account->user->userGroup);
|
||||||
|
$convertToNative = Amount::convertToNative($account->user);
|
||||||
$native = Amount::getNativeCurrencyByUserGroup($account->user->userGroup);
|
$accountCurrency = $this->getAccountCurrency($account);
|
||||||
$convertToNative = Amount::convertToNative($account->user);
|
$hasCurrency = null !== $accountCurrency;
|
||||||
$accountCurrency = $this->getAccountCurrency($account);
|
$currency = $hasCurrency ? $accountCurrency : $native;
|
||||||
$hasCurrency = null !== $accountCurrency;
|
$return = [
|
||||||
$currency = $hasCurrency ? $accountCurrency : $native;
|
'native_balance' => '0',
|
||||||
$return = [];
|
'balance' => '0', // this key is overwritten right away, but I must remember it is always created.
|
||||||
|
];
|
||||||
// first, the "balance", as described earlier.
|
// balance(s) in all currencies.
|
||||||
if ($convertToNative) {
|
$array = $account->transactions()
|
||||||
// normal balance
|
|
||||||
$return['balance'] = (string) $account->transactions()
|
|
||||||
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
|
||||||
->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'))
|
|
||||||
->where('transactions.transaction_currency_id', $native->id)
|
|
||||||
->sum('transactions.amount')
|
|
||||||
;
|
|
||||||
// plus virtual balance, if the account has a virtual_balance in the native currency
|
|
||||||
if ($native->id === $accountCurrency?->id) {
|
|
||||||
$return['balance'] = bcadd('' === (string) $account->virtual_balance ? '0' : $account->virtual_balance, $return['balance']);
|
|
||||||
}
|
|
||||||
// Log::debug(sprintf('balance is (%s only) %s (with virtual balance)', $native->code, $this->bcround($return['balance'], 2)));
|
|
||||||
|
|
||||||
// native balance
|
|
||||||
$return['native_balance'] = (string) $account->transactions()
|
|
||||||
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
|
||||||
->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'))
|
|
||||||
->whereNot('transactions.transaction_currency_id', $native->id)
|
|
||||||
->sum('transactions.native_amount')
|
|
||||||
;
|
|
||||||
// plus native virtual balance.
|
|
||||||
$return['native_balance'] = bcadd('' === (string) $account->native_virtual_balance ? '0' : $account->native_virtual_balance, $return['native_balance']);
|
|
||||||
// Log::debug(sprintf('native_balance is (all transactions to %s) %s (with virtual balance)', $native->code, $this->bcround($return['native_balance'])));
|
|
||||||
|
|
||||||
// plus foreign transactions in THIS currency.
|
|
||||||
$sum = (string) $account->transactions()
|
|
||||||
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
|
||||||
->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'))
|
|
||||||
->whereNot('transactions.transaction_currency_id', $native->id)
|
|
||||||
->where('transactions.foreign_currency_id', $native->id)
|
|
||||||
->sum('transactions.foreign_amount')
|
|
||||||
;
|
|
||||||
$return['native_balance'] = bcadd($return['native_balance'], $sum);
|
|
||||||
|
|
||||||
// Log::debug(sprintf('Foreign amount transactions add (%s only) %s, total native_balance is now %s', $native->code, $this->bcround($sum), $this->bcround($return['native_balance'])));
|
|
||||||
}
|
|
||||||
|
|
||||||
// balance(s) in other (all) currencies.
|
|
||||||
$array = $account->transactions()
|
|
||||||
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||||
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
|
->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id')
|
||||||
->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'))
|
->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'))
|
||||||
->get(['transaction_currencies.code', 'transactions.amount'])->toArray()
|
->get(['transaction_currencies.code', 'transactions.amount'])->toArray()
|
||||||
;
|
;
|
||||||
$others = $this->groupAndSumTransactions($array, 'code', 'amount');
|
$others = $this->groupAndSumTransactions($array, 'code', 'amount');
|
||||||
// Log::debug('All balances are (joined)', $others);
|
// Log::debug('All balances are (joined)', $others);
|
||||||
// if the account has no own currency preference, drop balance in favor of native balance
|
// if there is no request to convert, take this as "balance" and "native_balance".
|
||||||
if ($hasCurrency && !$convertToNative) {
|
$return['balance'] = $others[$currency->code] ?? '0';
|
||||||
$return['balance'] = $others[$currency->code] ?? '0';
|
if (!$convertToNative) {
|
||||||
$return['native_balance'] = $others[$currency->code] ?? '0';
|
unset($return['native_balance']);
|
||||||
// Log::debug(sprintf('Set balance + native_balance to %s', $return['balance']));
|
// Log::debug(sprintf('Set balance to %s, unset native_balance', $return['balance']));
|
||||||
|
}
|
||||||
|
// if there is a request to convert, convert to "native_balance" and use "balance" for whichever amount is in the native currency.
|
||||||
|
if ($convertToNative) {
|
||||||
|
$return['native_balance'] = $this->convertAllBalances($others, $native, $date); // todo sum all and convert.
|
||||||
|
// Log::debug(sprintf('Set native_balance to %s', $return['native_balance']));
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the currency is the same as the native currency, set the native_balance to the balance for consistency.
|
// either way, the balance is always combined with the virtual balance:
|
||||||
// if($currency->id === $native->id) {
|
$virtualBalance = (string) ('' === (string) $account->virtual_balance ? '0' : $account->virtual_balance);
|
||||||
// $return['native_balance'] = $return['balance'];
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (!$hasCurrency && array_key_exists('balance', $return)) {
|
if ($convertToNative) {
|
||||||
// Log::debug('Account has no currency preference, dropping balance in favor of native balance.');
|
// the native balance is combined with a converted virtual_balance:
|
||||||
$sum = bcadd($return['balance'], $return['native_balance']);
|
$converter = new ExchangeRateConverter();
|
||||||
// Log::debug(sprintf('%s + %s = %s', $return['balance'], $return['native_balance'], $sum));
|
$nativeVirtualBalance = $converter->convert($currency, $native, $date, $virtualBalance);
|
||||||
$return['native_balance'] = $sum;
|
$return['native_balance'] = bcadd($nativeVirtualBalance, $return['native_balance']);
|
||||||
unset($return['balance']);
|
// Log::debug(sprintf('Native virtual balance makes the native total %s', $return['native_balance']));
|
||||||
}
|
}
|
||||||
$final = array_merge($return, $others);
|
if (!$convertToNative) {
|
||||||
// Log::debug('Return is', $final);
|
// if not, also increase the balance + native balance for consistency.
|
||||||
|
$return['balance'] = bcadd($return['balance'], $virtualBalance);
|
||||||
|
// Log::debug(sprintf('Virtual balance makes the (native) total %s', $return['balance']));
|
||||||
|
}
|
||||||
|
$final = array_merge($return, $others);
|
||||||
|
Log::debug('Final balance is', $final);
|
||||||
$cache->store($final);
|
$cache->store($final);
|
||||||
|
|
||||||
return array_merge($return, $others);
|
return $final;
|
||||||
// Log::debug('Return is', $final);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function filterAccountBalances(array $total, Account $account, bool $convertToNative, ?TransactionCurrency $currency = null): array
|
public function filterAccountBalances(array $total, Account $account, bool $convertToNative, ?TransactionCurrency $currency = null): array
|
||||||
@@ -410,17 +356,18 @@ class Steam
|
|||||||
$defaultCurrency = app('amount')->getNativeCurrency();
|
$defaultCurrency = app('amount')->getNativeCurrency();
|
||||||
if ($convertToNative) {
|
if ($convertToNative) {
|
||||||
if ($defaultCurrency->id === $currency?->id) {
|
if ($defaultCurrency->id === $currency?->id) {
|
||||||
Log::debug(sprintf('Unset "native_balance" and "%s" for account #%d', $defaultCurrency->code, $account->id));
|
Log::debug(sprintf('Unset "native_balance" and [%s] for account #%d', $defaultCurrency->code, $account->id));
|
||||||
unset($set['native_balance'], $set[$defaultCurrency->code]);
|
unset($set['native_balance'], $set[$defaultCurrency->code]);
|
||||||
}
|
}
|
||||||
|
// todo rethink this logic.
|
||||||
if (null !== $currency && $defaultCurrency->id !== $currency->id) {
|
if (null !== $currency && $defaultCurrency->id !== $currency->id) {
|
||||||
Log::debug(sprintf('Unset balance for account #%d', $account->id));
|
Log::debug(sprintf('Unset balance for account #%d', $account->id));
|
||||||
unset($set['balance']);
|
unset($set['balance']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $currency) {
|
if (null === $currency) {
|
||||||
Log::debug(sprintf('TEMP DO NOT Drop defaultCurrency balance for account #%d', $account->id));
|
Log::debug(sprintf('Unset balance for account #%d', $account->id));
|
||||||
// unset($set[$this->defaultCurrency->code]);
|
unset($set['balance']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,16 +375,15 @@ class Steam
|
|||||||
if (null === $currency) {
|
if (null === $currency) {
|
||||||
Log::debug(sprintf('Unset native_balance and make defaultCurrency balance the balance for account #%d', $account->id));
|
Log::debug(sprintf('Unset native_balance and make defaultCurrency balance the balance for account #%d', $account->id));
|
||||||
$set['balance'] = $set[$defaultCurrency->code] ?? '0';
|
$set['balance'] = $set[$defaultCurrency->code] ?? '0';
|
||||||
unset($set['native_balance'], $set[$defaultCurrency->code]);
|
unset($set[$defaultCurrency->code]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null !== $currency) {
|
if (null !== $currency) {
|
||||||
Log::debug(sprintf('Unset native_balance + defaultCurrency + currencyCode balance for account #%d', $account->id));
|
Log::debug(sprintf('Unset [%s] + [%s] balance for account #%d', $defaultCurrency->code, $currency->code, $account->id));
|
||||||
unset($set['native_balance'], $set[$defaultCurrency->code], $set[$currency->code]);
|
unset($set[$defaultCurrency->code], $set[$currency->code]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// put specific value first in array.
|
// put specific value first in array.
|
||||||
if (array_key_exists('native_balance', $set)) {
|
if (array_key_exists('native_balance', $set)) {
|
||||||
$set = ['native_balance' => $set['native_balance']] + $set;
|
$set = ['native_balance' => $set['native_balance']] + $set;
|
||||||
@@ -687,4 +633,21 @@ class Steam
|
|||||||
|
|
||||||
return $amount;
|
return $amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function convertAllBalances(array $others, TransactionCurrency $native, Carbon $date): string
|
||||||
|
{
|
||||||
|
$total = '0';
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
foreach ($others as $key => $amount) {
|
||||||
|
$currency = TransactionCurrency::where('code', $key)->first();
|
||||||
|
if (null === $currency) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$current = $converter->convert($currency, $native, $date, $amount);
|
||||||
|
Log::debug(sprintf('Convert %s %s to %s %s', $currency->code, $amount, $native->code, $current));
|
||||||
|
$total = bcadd($current, $total);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $total;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ namespace FireflyIII\Support\Twig;
|
|||||||
use FireflyIII\Models\Account as AccountModel;
|
use FireflyIII\Models\Account as AccountModel;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
use Twig\TwigFilter;
|
use Twig\TwigFilter;
|
||||||
use Twig\TwigFunction;
|
use Twig\TwigFunction;
|
||||||
@@ -114,6 +116,11 @@ class AmountFormat extends AbstractExtension
|
|||||||
|
|
||||||
/** @var TransactionCurrency $currency */
|
/** @var TransactionCurrency $currency */
|
||||||
$currency = TransactionCurrency::whereCode($code)->first();
|
$currency = TransactionCurrency::whereCode($code)->first();
|
||||||
|
if (null === $currency) {
|
||||||
|
Log::error(sprintf('Could not find currency with code "%s". Fallback to native currency.', $code));
|
||||||
|
$currency = Amount::getNativeCurrency();
|
||||||
|
Log::error(sprintf('Fallback currency is "%s".', $currency->code));
|
||||||
|
}
|
||||||
|
|
||||||
return app('amount')->formatAnything($currency, $amount, $coloured);
|
return app('amount')->formatAnything($currency, $amount, $coloured);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ class General extends AbstractExtension
|
|||||||
$default = Amount::getNativeCurrency();
|
$default = Amount::getNativeCurrency();
|
||||||
$convertToNative = Amount::convertToNative();
|
$convertToNative = Amount::convertToNative();
|
||||||
$useNative = $convertToNative && $default->id !== $currency->id;
|
$useNative = $convertToNative && $default->id !== $currency->id;
|
||||||
|
$currency = null === $currency ? $default : $currency;
|
||||||
$strings = [];
|
$strings = [];
|
||||||
foreach ($info as $key => $balance) {
|
foreach ($info as $key => $balance) {
|
||||||
if ('balance' === $key) {
|
if ('balance' === $key) {
|
||||||
|
|||||||
@@ -99,10 +99,8 @@ class PiggyBankTransformer extends AbstractTransformer
|
|||||||
'id' => (string) $piggyBank->id,
|
'id' => (string) $piggyBank->id,
|
||||||
'created_at' => $piggyBank->created_at->toAtomString(),
|
'created_at' => $piggyBank->created_at->toAtomString(),
|
||||||
'updated_at' => $piggyBank->updated_at->toAtomString(),
|
'updated_at' => $piggyBank->updated_at->toAtomString(),
|
||||||
'accounts' => $this->renderAccounts($piggyBank),
|
|
||||||
// 'account_id' => (string)$piggyBank->account_id,
|
|
||||||
// 'account_name' => $piggyBank->account->name,
|
|
||||||
'name' => $piggyBank->name,
|
'name' => $piggyBank->name,
|
||||||
|
'accounts' => $this->renderAccounts($piggyBank),
|
||||||
'currency_id' => (string) $currency->id,
|
'currency_id' => (string) $currency->id,
|
||||||
'currency_code' => $currency->code,
|
'currency_code' => $currency->code,
|
||||||
'currency_symbol' => $currency->symbol,
|
'currency_symbol' => $currency->symbol,
|
||||||
@@ -134,9 +132,10 @@ class PiggyBankTransformer extends AbstractTransformer
|
|||||||
$return = [];
|
$return = [];
|
||||||
foreach ($piggyBank->accounts()->get() as $account) {
|
foreach ($piggyBank->accounts()->get() as $account) {
|
||||||
$return[] = [
|
$return[] = [
|
||||||
'id' => $account->id,
|
'id' => (string) $account->id,
|
||||||
'name' => $account->name,
|
'name' => $account->name,
|
||||||
'current_amount' => (string) $account->pivot->current_amount,
|
'current_amount' => (string) $account->pivot->current_amount,
|
||||||
|
'native_current_amount' => (string) $account->pivot->native_current_amount,
|
||||||
// TODO add balance, add left to save.
|
// TODO add balance, add left to save.
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
89
changelog.md
89
changelog.md
@@ -3,7 +3,94 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
## 6.2.0 - 2025-01-26 (or later)
|
## 6.2.5 - 2025-02-08
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 9736](https://github.com/firefly-iii/firefly-iii/issues/9736) (Wrong `finalAccountBalance` result) reported by @gthbusrr
|
||||||
|
- [Issue 9747](https://github.com/firefly-iii/firefly-iii/issues/9747) (Data entry issues with exchange rates) reported by @Azmodeszer
|
||||||
|
- [Issue 9769](https://github.com/firefly-iii/firefly-iii/issues/9769) ("Your accounts" graph shows changes at wrong dates - not fixed by v6.2.4) reported by @SteffoSpieler
|
||||||
|
- [Discussion 9780](https://github.com/orgs/firefly-iii/discussions/9780) (Rules or webhook precedence?) started by @joeshmoe57
|
||||||
|
- [Issue 9781](https://github.com/firefly-iii/firefly-iii/issues/9781) (Search key `has_any_external_url:false` returns all transactions) reported by @joeshmoe57
|
||||||
|
- [Issue 9783](https://github.com/firefly-iii/firefly-iii/issues/9783) (Subscriptions: Make "Not expected this period" and "expected x days from now" different colors) reported by @SteffoSpieler
|
||||||
|
- [Issue 9784](https://github.com/firefly-iii/firefly-iii/issues/9784) (Transfers with external currency not considered for account balance?) reported by @pvieira84
|
||||||
|
- [Issue 9786](https://github.com/firefly-iii/firefly-iii/issues/9786) (The error 500 information page has non-clickable links to github and the debug page) reported by @tjmv
|
||||||
|
- [Issue 9787](https://github.com/firefly-iii/firefly-iii/issues/9787) (Twig general template error formatting TransactionCurrency on main page) reported by @tjmv
|
||||||
|
- [Issue 9789](https://github.com/firefly-iii/firefly-iii/issues/9789) (Can't open expense and revenue accounts view) reported by @puffer-duck
|
||||||
|
|
||||||
|
## 6.2.4 - 2025-02-05
|
||||||
|
|
||||||
|
> ⚠️ _Most pressing issues are fixed. Please open [an issue here](https://github.com/firefly-iii/firefly-iii/issues/new?template=bug.yml) if you run into problems._
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 9327](https://github.com/firefly-iii/firefly-iii/issues/9327) (Add Link to Search-Page to the help file) reported by @nottheend
|
||||||
|
- [Issue 9713](https://github.com/firefly-iii/firefly-iii/issues/9713) (Many decimal points in amounts) reported by @memo-567
|
||||||
|
- [Issue 9736](https://github.com/firefly-iii/firefly-iii/issues/9736) (Wrong `finalAccountBalance` result) reported by @gthbusrr
|
||||||
|
- [Discussion 9737](https://github.com/orgs/firefly-iii/discussions/9737) (API returns 0 as current balance) started by @eps90
|
||||||
|
- [Issue 9745](https://github.com/firefly-iii/firefly-iii/issues/9745) (Type mismatch in period overview) reported by @electrofloat
|
||||||
|
- [Issue 9747](https://github.com/firefly-iii/firefly-iii/issues/9747) (Data entry issues with exchange rates) reported by @Azmodeszer
|
||||||
|
- [Issue 9751](https://github.com/firefly-iii/firefly-iii/issues/9751) (Net worth changes since 6.2 update) reported by @ahmaddxb
|
||||||
|
- [Issue 9754](https://github.com/firefly-iii/firefly-iii/issues/9754) (Deleting account - Attachments remain) reported by @memo-567
|
||||||
|
- [Issue 9762](https://github.com/firefly-iii/firefly-iii/issues/9762) (Piggy bank show: start/target date not displayed) reported by @Simeam
|
||||||
|
- Various other balance related fixes.
|
||||||
|
- Hotfix for account charts.
|
||||||
|
|
||||||
|
## 6.2.3 - 2025-02-05
|
||||||
|
|
||||||
|
> ⚠️ _Most pressing issues are fixed. Please open [an issue here](https://github.com/firefly-iii/firefly-iii/issues/new?template=bug.yml) if you run into problems._
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 9327](https://github.com/firefly-iii/firefly-iii/issues/9327) (Add Link to Search-Page to the help file) reported by @nottheend
|
||||||
|
- [Issue 9713](https://github.com/firefly-iii/firefly-iii/issues/9713) (Many decimal points in amounts) reported by @memo-567
|
||||||
|
- [Issue 9736](https://github.com/firefly-iii/firefly-iii/issues/9736) (Wrong `finalAccountBalance` result) reported by @gthbusrr
|
||||||
|
- [Discussion 9737](https://github.com/orgs/firefly-iii/discussions/9737) (API returns 0 as current balance) started by @eps90
|
||||||
|
- [Issue 9745](https://github.com/firefly-iii/firefly-iii/issues/9745) (Type mismatch in period overview) reported by @electrofloat
|
||||||
|
- [Issue 9747](https://github.com/firefly-iii/firefly-iii/issues/9747) (Data entry issues with exchange rates) reported by @Azmodeszer
|
||||||
|
- [Issue 9751](https://github.com/firefly-iii/firefly-iii/issues/9751) (Net worth changes since 6.2 update) reported by @ahmaddxb
|
||||||
|
- [Issue 9754](https://github.com/firefly-iii/firefly-iii/issues/9754) (Deleting account - Attachments remain) reported by @memo-567
|
||||||
|
- [Issue 9762](https://github.com/firefly-iii/firefly-iii/issues/9762) (Piggy bank show: start/target date not displayed) reported by @Simeam
|
||||||
|
- Various other balance related fixes.
|
||||||
|
|
||||||
|
## 6.2.2 - 2025-02-02
|
||||||
|
|
||||||
|
> ⚠️ _This release comes with many changes, small and large. I expect you will run into issue, and I appreciate your feedback and your patience as I fix them. I've tested many things, but I'm 100% sure I've missed things. Please open [an issue here](https://github.com/firefly-iii/firefly-iii/issues/new?template=bug.yml) if you run into problems._
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 9713](https://github.com/firefly-iii/firefly-iii/issues/9713) (Many decimal points in amounts) reported by @memo-567
|
||||||
|
- [Discussion 9727](https://github.com/orgs/firefly-iii/discussions/9727) (Odd behavior from graphs) started by @jbrandwi
|
||||||
|
- [Issue 9729](https://github.com/firefly-iii/firefly-iii/issues/9729) (Type mismatch in transaction collector) reported by @electrofloat
|
||||||
|
- [Issue 9730](https://github.com/firefly-iii/firefly-iii/issues/9730) (API: `PiggyBankAccountRead.id` should return string, returns int) reported by @dreautall
|
||||||
|
- [Issue 9731](https://github.com/firefly-iii/firefly-iii/issues/9731) ($userGroup must not be accessed before initialization) reported by @Azmodeszer
|
||||||
|
- [Issue 9732](https://github.com/firefly-iii/firefly-iii/issues/9732) (Editing dates of a piggy bank does not save) reported by @Simeam
|
||||||
|
- [Issue 9736](https://github.com/firefly-iii/firefly-iii/issues/9736) (Wrong `finalAccountBalance` result) reported by @gthbusrr
|
||||||
|
- [Issue 9738](https://github.com/firefly-iii/firefly-iii/issues/9738) (Missing pagination controls on exchange rate page) reported by @dicksonleong
|
||||||
|
- [Discussion 9744](https://github.com/orgs/firefly-iii/discussions/9744) (Downloading exchange rates results in 404 error) started by @electrofloat
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- [PR 9743](https://github.com/firefly-iii/firefly-iii/pull/9743) (Feature nordic currencies) reported by @mansehr
|
||||||
|
|
||||||
|
|
||||||
|
## 6.2.1 - 2025-02-01
|
||||||
|
|
||||||
|
> ⚠️ _This release comes with many changes, small and large. I expect you will run into issue, and I appreciate your feedback and your patience as I fix them. I've tested many things, but I'm 100% sure I've missed things. Please open [an issue here](https://github.com/firefly-iii/firefly-iii/issues/new?template=bug.yml) if you run into problems._
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 9714](https://github.com/firefly-iii/firefly-iii/issues/9714) (current transaction is aborted, commands ignored until end of transaction block) reported by @captainark
|
||||||
|
- [Issue 9717](https://github.com/firefly-iii/firefly-iii/issues/9717) (API api/v1/accounts broken) reported by @brot
|
||||||
|
- [Issue 9719](https://github.com/firefly-iii/firefly-iii/issues/9719) (A couple of TODOs left in resources/views/list/groups.twig) reported by @lostfocus
|
||||||
|
- [Issue 9720](https://github.com/firefly-iii/firefly-iii/issues/9720) (Piggy Bank with no Target amount: unable to add money) reported by @maxsmooth
|
||||||
|
- [Issue 9721](https://github.com/firefly-iii/firefly-iii/issues/9721) (Documentation on exchange-rates page leads to non-existent page) reported by @electrofloat
|
||||||
|
- [Issue 9722](https://github.com/firefly-iii/firefly-iii/issues/9722) (Error 500 on tags page after enabling native currency) reported by @lostfocus
|
||||||
|
- [Issue 9723](https://github.com/firefly-iii/firefly-iii/issues/9723) (Convert to native routine is not called when convert to native is activated) reported by @JC5
|
||||||
|
- [Issue 9726](https://github.com/firefly-iii/firefly-iii/issues/9726) (Postgres cannot deal with "virtual_balance" column) reported by @dicksonleong
|
||||||
|
|
||||||
|
## 6.2.0 - 2025-01-31
|
||||||
|
|
||||||
> ⚠️ _This release comes with many changes, small and large. I expect you will run into issue, and I appreciate your feedback and your patience as I fix them. I've tested many things, but I'm 100% sure I've missed things. Please open [an issue here](https://github.com/firefly-iii/firefly-iii/issues/new?template=bug.yml) if you run into problems._
|
> ⚠️ _This release comes with many changes, small and large. I expect you will run into issue, and I appreciate your feedback and your patience as I fix them. I've tested many things, but I'm 100% sure I've missed things. Please open [an issue here](https://github.com/firefly-iii/firefly-iii/issues/new?template=bug.yml) if you run into problems._
|
||||||
|
|
||||||
|
|||||||
92
composer.lock
generated
92
composer.lock
generated
@@ -1571,16 +1571,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/uri-template",
|
"name": "guzzlehttp/uri-template",
|
||||||
"version": "v1.0.3",
|
"version": "v1.0.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/uri-template.git",
|
"url": "https://github.com/guzzle/uri-template.git",
|
||||||
"reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c"
|
"reference": "30e286560c137526eccd4ce21b2de477ab0676d2"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c",
|
"url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2",
|
||||||
"reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c",
|
"reference": "30e286560c137526eccd4ce21b2de477ab0676d2",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1637,7 +1637,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/uri-template/issues",
|
"issues": "https://github.com/guzzle/uri-template/issues",
|
||||||
"source": "https://github.com/guzzle/uri-template/tree/v1.0.3"
|
"source": "https://github.com/guzzle/uri-template/tree/v1.0.4"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1653,7 +1653,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-12-03T19:50:20+00:00"
|
"time": "2025-02-03T10:55:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "jc5/google2fa-laravel",
|
"name": "jc5/google2fa-laravel",
|
||||||
@@ -6196,16 +6196,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/laravel-html",
|
"name": "spatie/laravel-html",
|
||||||
"version": "3.11.1",
|
"version": "3.11.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/spatie/laravel-html.git",
|
"url": "https://github.com/spatie/laravel-html.git",
|
||||||
"reference": "167e5b8243103072155b562e5cc396c90a3c1055"
|
"reference": "248508f3ed50e6538707fc54a4b3b23fb53e8045"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/spatie/laravel-html/zipball/167e5b8243103072155b562e5cc396c90a3c1055",
|
"url": "https://api.github.com/repos/spatie/laravel-html/zipball/248508f3ed50e6538707fc54a4b3b23fb53e8045",
|
||||||
"reference": "167e5b8243103072155b562e5cc396c90a3c1055",
|
"reference": "248508f3ed50e6538707fc54a4b3b23fb53e8045",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6262,7 +6262,7 @@
|
|||||||
"spatie"
|
"spatie"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/spatie/laravel-html/tree/3.11.1"
|
"source": "https://github.com/spatie/laravel-html/tree/3.11.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6270,7 +6270,7 @@
|
|||||||
"type": "custom"
|
"type": "custom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-10-18T14:37:21+00:00"
|
"time": "2025-02-05T08:27:24+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/laravel-ignition",
|
"name": "spatie/laravel-ignition",
|
||||||
@@ -6365,27 +6365,27 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/laravel-package-tools",
|
"name": "spatie/laravel-package-tools",
|
||||||
"version": "1.18.3",
|
"version": "1.19.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/spatie/laravel-package-tools.git",
|
"url": "https://github.com/spatie/laravel-package-tools.git",
|
||||||
"reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78"
|
"reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78",
|
"url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa",
|
||||||
"reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78",
|
"reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"illuminate/contracts": "^9.28|^10.0|^11.0",
|
"illuminate/contracts": "^9.28|^10.0|^11.0|^12.0",
|
||||||
"php": "^8.0"
|
"php": "^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"mockery/mockery": "^1.5",
|
"mockery/mockery": "^1.5",
|
||||||
"orchestra/testbench": "^7.7|^8.0|^9.0",
|
"orchestra/testbench": "^7.7|^8.0|^9.0|^10.0",
|
||||||
"pestphp/pest": "^1.22|^2",
|
"pestphp/pest": "^1.23|^2.1|^3.1",
|
||||||
"phpunit/phpunit": "^9.5.24|^10.5",
|
"phpunit/phpunit": "^9.5.24|^10.5|^11.5",
|
||||||
"spatie/pest-plugin-test-time": "^1.1|^2.2"
|
"spatie/pest-plugin-test-time": "^1.1|^2.2"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
@@ -6413,7 +6413,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/spatie/laravel-package-tools/issues",
|
"issues": "https://github.com/spatie/laravel-package-tools/issues",
|
||||||
"source": "https://github.com/spatie/laravel-package-tools/tree/1.18.3"
|
"source": "https://github.com/spatie/laravel-package-tools/tree/1.19.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6421,7 +6421,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-01-22T08:51:18+00:00"
|
"time": "2025-02-06T14:58:20+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/period",
|
"name": "spatie/period",
|
||||||
@@ -10398,16 +10398,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/class-map-generator",
|
"name": "composer/class-map-generator",
|
||||||
"version": "1.5.0",
|
"version": "1.6.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/composer/class-map-generator.git",
|
"url": "https://github.com/composer/class-map-generator.git",
|
||||||
"reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915"
|
"reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
|
"url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9",
|
||||||
"reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
|
"reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10451,7 +10451,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/composer/class-map-generator/issues",
|
"issues": "https://github.com/composer/class-map-generator/issues",
|
||||||
"source": "https://github.com/composer/class-map-generator/tree/1.5.0"
|
"source": "https://github.com/composer/class-map-generator/tree/1.6.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10467,7 +10467,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-11-25T16:11:06+00:00"
|
"time": "2025-02-05T10:05:34+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/pcre",
|
"name": "composer/pcre",
|
||||||
@@ -10664,16 +10664,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "larastan/larastan",
|
"name": "larastan/larastan",
|
||||||
"version": "v3.0.2",
|
"version": "v3.0.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/larastan/larastan.git",
|
"url": "https://github.com/larastan/larastan.git",
|
||||||
"reference": "b2e24e1605cff1d1097ccb6fb8af3bbd1dfe1c6f"
|
"reference": "b394eba5805727423071fac9b53ea50dd7e920f4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/larastan/larastan/zipball/b2e24e1605cff1d1097ccb6fb8af3bbd1dfe1c6f",
|
"url": "https://api.github.com/repos/larastan/larastan/zipball/b394eba5805727423071fac9b53ea50dd7e920f4",
|
||||||
"reference": "b2e24e1605cff1d1097ccb6fb8af3bbd1dfe1c6f",
|
"reference": "b394eba5805727423071fac9b53ea50dd7e920f4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10687,7 +10687,7 @@
|
|||||||
"illuminate/support": "^11.15.0",
|
"illuminate/support": "^11.15.0",
|
||||||
"php": "^8.2",
|
"php": "^8.2",
|
||||||
"phpmyadmin/sql-parser": "^5.9.0",
|
"phpmyadmin/sql-parser": "^5.9.0",
|
||||||
"phpstan/phpstan": "^2.0.2"
|
"phpstan/phpstan": "^2.1.3"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"doctrine/coding-standard": "^12.0",
|
"doctrine/coding-standard": "^12.0",
|
||||||
@@ -10745,7 +10745,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/larastan/larastan/issues",
|
"issues": "https://github.com/larastan/larastan/issues",
|
||||||
"source": "https://github.com/larastan/larastan/tree/v3.0.2"
|
"source": "https://github.com/larastan/larastan/tree/v3.0.4"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10753,7 +10753,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-11-26T23:15:21+00:00"
|
"time": "2025-02-06T21:03:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel-json-api/testing",
|
"name": "laravel-json-api/testing",
|
||||||
@@ -11344,16 +11344,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan",
|
"name": "phpstan/phpstan",
|
||||||
"version": "2.1.2",
|
"version": "2.1.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan.git",
|
"url": "https://github.com/phpstan/phpstan.git",
|
||||||
"reference": "7d08f569e582ade182a375c366cbd896eccadd3a"
|
"reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/7d08f569e582ade182a375c366cbd896eccadd3a",
|
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/64ae44e48214f3deebdaeebf2694297a10a2bea9",
|
||||||
"reference": "7d08f569e582ade182a375c366cbd896eccadd3a",
|
"reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11398,7 +11398,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-01-21T14:54:06+00:00"
|
"time": "2025-02-07T15:05:24+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-deprecation-rules",
|
"name": "phpstan/phpstan-deprecation-rules",
|
||||||
@@ -11820,16 +11820,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "11.5.6",
|
"version": "11.5.7",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c"
|
"reference": "e1cb706f019e2547039ca2c839898cd5f557ee5d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c3ae14c90f244cdda95028c3e469028e8d1c02c",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e1cb706f019e2547039ca2c839898cd5f557ee5d",
|
||||||
"reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c",
|
"reference": "e1cb706f019e2547039ca2c839898cd5f557ee5d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11901,7 +11901,7 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
||||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.6"
|
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.7"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -11917,7 +11917,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-01-31T07:03:30+00:00"
|
"time": "2025-02-06T16:10:05+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/cli-parser",
|
"name": "sebastian/cli-parser",
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ return [
|
|||||||
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
||||||
// see cer.php for exchange rates feature flag.
|
// see cer.php for exchange rates feature flag.
|
||||||
],
|
],
|
||||||
'version' => '6.2.0',
|
'version' => '6.2.5',
|
||||||
'api_version' => '2.1.0', // field is no longer used.
|
'api_version' => '2.1.0', // field is no longer used.
|
||||||
'db_version' => 25,
|
'db_version' => 25,
|
||||||
|
|
||||||
|
|||||||
@@ -24,234 +24,239 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
'operators' => [
|
'operators' => [
|
||||||
'user_action' => ['alias' => false, 'needs_context' => true],
|
'user_action' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_id' => ['alias' => false, 'needs_context' => true],
|
'account_id' => ['alias' => false, 'needs_context' => true],
|
||||||
'reconciled' => ['alias' => false, 'needs_context' => false],
|
'reconciled' => ['alias' => false, 'needs_context' => false],
|
||||||
'source_account_id' => ['alias' => false, 'needs_context' => true],
|
'source_account_id' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination_account_id' => ['alias' => false, 'needs_context' => true],
|
'destination_account_id' => ['alias' => false, 'needs_context' => true],
|
||||||
'transaction_type' => ['alias' => false, 'needs_context' => true],
|
'transaction_type' => ['alias' => false, 'needs_context' => true],
|
||||||
'type' => ['alias' => true, 'alias_for' => 'transaction_type', 'needs_context' => true],
|
'type' => ['alias' => true, 'alias_for' => 'transaction_type', 'needs_context' => true],
|
||||||
'tag_is' => ['alias' => false, 'needs_context' => true],
|
'tag_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'tag_is_not' => ['alias' => false, 'needs_context' => true],
|
'tag_is_not' => ['alias' => false, 'needs_context' => true],
|
||||||
'tag' => ['alias' => true, 'alias_for' => 'tag_is', 'needs_context' => true],
|
'tag' => ['alias' => true, 'alias_for' => 'tag_is', 'needs_context' => true],
|
||||||
'tag_contains' => ['alias' => false, 'needs_context' => true],
|
'tag_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'tag_ends' => ['alias' => false, 'needs_context' => true],
|
'tag_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'tag_starts' => ['alias' => false, 'needs_context' => true],
|
'tag_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'description_is' => ['alias' => false, 'needs_context' => true],
|
'description_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'description' => ['alias' => true, 'alias_for' => 'description_is', 'needs_context' => true],
|
'description' => ['alias' => true, 'alias_for' => 'description_is', 'needs_context' => true],
|
||||||
'description_contains' => ['alias' => false, 'needs_context' => true],
|
'description_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'description_ends' => ['alias' => false, 'needs_context' => true],
|
'description_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'description_starts' => ['alias' => false, 'needs_context' => true],
|
'description_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'notes_is' => ['alias' => false, 'needs_context' => true],
|
'notes_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'notes_are' => ['alias' => true, 'alias_for' => 'notes_is', 'needs_context' => true],
|
'notes_are' => ['alias' => true, 'alias_for' => 'notes_is', 'needs_context' => true],
|
||||||
'notes_contains' => ['alias' => false, 'needs_context' => true],
|
'notes_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'notes_contain' => ['alias' => true, 'alias_for' => 'notes_contains', 'needs_context' => true],
|
'notes_contain' => ['alias' => true, 'alias_for' => 'notes_contains', 'needs_context' => true],
|
||||||
'notes' => ['alias' => true, 'alias_for' => 'notes_contains', 'needs_context' => true],
|
'notes' => ['alias' => true, 'alias_for' => 'notes_contains', 'needs_context' => true],
|
||||||
'notes_ends' => ['alias' => false, 'needs_context' => true],
|
'notes_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'notes_end' => ['alias' => true, 'alias_for' => 'notes_ends', 'needs_context' => true],
|
'notes_end' => ['alias' => true, 'alias_for' => 'notes_ends', 'needs_context' => true],
|
||||||
'notes_starts' => ['alias' => false, 'needs_context' => true],
|
'notes_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'notes_start' => ['alias' => true, 'alias_for' => 'notes_starts', 'needs_context' => true],
|
'notes_start' => ['alias' => true, 'alias_for' => 'notes_starts', 'needs_context' => true],
|
||||||
'source_account_is' => ['alias' => false, 'needs_context' => true],
|
'source_account_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'from_account_is' => ['alias' => true, 'alias_for' => 'source_account_is', 'needs_context' => true],
|
'from_account_is' => ['alias' => true, 'alias_for' => 'source_account_is', 'needs_context' => true],
|
||||||
'source_account_contains' => ['alias' => false, 'needs_context' => true],
|
'source_account_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'source' => ['alias' => true, 'alias_for' => 'source_account_contains', 'needs_context' => true],
|
'source' => ['alias' => true, 'alias_for' => 'source_account_contains', 'needs_context' => true],
|
||||||
'from' => ['alias' => true, 'alias_for' => 'source_account_contains', 'needs_context' => true],
|
'from' => ['alias' => true, 'alias_for' => 'source_account_contains', 'needs_context' => true],
|
||||||
'from_account_contains' => ['alias' => true, 'alias_for' => 'source_account_contains', 'needs_context' => true],
|
'from_account_contains' => ['alias' => true, 'alias_for' => 'source_account_contains', 'needs_context' => true],
|
||||||
'source_account_ends' => ['alias' => false, 'needs_context' => true],
|
'source_account_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'from_account_ends' => ['alias' => true, 'alias_for' => 'source_account_ends', 'needs_context' => true],
|
'from_account_ends' => ['alias' => true, 'alias_for' => 'source_account_ends', 'needs_context' => true],
|
||||||
'source_account_starts' => ['alias' => false, 'needs_context' => true],
|
'source_account_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'from_account_starts' => ['alias' => true, 'alias_for' => 'source_account_starts', 'needs_context' => true],
|
'from_account_starts' => ['alias' => true, 'alias_for' => 'source_account_starts', 'needs_context' => true],
|
||||||
'source_account_nr_is' => ['alias' => false, 'needs_context' => true],
|
'source_account_nr_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'from_account_nr_is' => ['alias' => true, 'alias_for' => 'source_account_nr_is', 'needs_context' => true],
|
'from_account_nr_is' => ['alias' => true, 'alias_for' => 'source_account_nr_is', 'needs_context' => true],
|
||||||
'source_account_nr_contains' => ['alias' => false, 'needs_context' => true],
|
'source_account_nr_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'from_account_nr_contains' => ['alias' => true, 'alias_for' => 'source_account_nr_contains', 'needs_context' => true],
|
'from_account_nr_contains' => ['alias' => true, 'alias_for' => 'source_account_nr_contains', 'needs_context' => true],
|
||||||
'source_account_nr_ends' => ['alias' => false, 'needs_context' => true],
|
'source_account_nr_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'from_account_nr_ends' => ['alias' => true, 'alias_for' => 'source_account_nr_ends', 'needs_context' => true],
|
'from_account_nr_ends' => ['alias' => true, 'alias_for' => 'source_account_nr_ends', 'needs_context' => true],
|
||||||
'source_account_nr_starts' => ['alias' => false, 'needs_context' => true],
|
'source_account_nr_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'from_account_nr_starts' => ['alias' => true, 'alias_for' => 'source_account_nr_starts', 'needs_context' => true],
|
'from_account_nr_starts' => ['alias' => true, 'alias_for' => 'source_account_nr_starts', 'needs_context' => true],
|
||||||
'destination_account_is' => ['alias' => false, 'needs_context' => true],
|
'destination_account_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'to_account_is' => ['alias' => true, 'alias_for' => 'destination_account_is', 'needs_context' => true],
|
'to_account_is' => ['alias' => true, 'alias_for' => 'destination_account_is', 'needs_context' => true],
|
||||||
'destination_account_contains' => ['alias' => false, 'needs_context' => true],
|
'destination_account_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination' => ['alias' => true, 'alias_for' => 'destination_account_contains', 'needs_context' => true],
|
'destination' => ['alias' => true, 'alias_for' => 'destination_account_contains', 'needs_context' => true],
|
||||||
'to' => ['alias' => true, 'alias_for' => 'destination_account_contains', 'needs_context' => true],
|
'to' => ['alias' => true, 'alias_for' => 'destination_account_contains', 'needs_context' => true],
|
||||||
'to_account_contains' => ['alias' => true, 'alias_for' => 'destination_account_contains', 'needs_context' => true],
|
'to_account_contains' => ['alias' => true, 'alias_for' => 'destination_account_contains', 'needs_context' => true],
|
||||||
'destination_account_ends' => ['alias' => false, 'needs_context' => true],
|
'destination_account_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'to_account_ends' => ['alias' => true, 'alias_for' => 'destination_account_ends', 'needs_context' => true],
|
'to_account_ends' => ['alias' => true, 'alias_for' => 'destination_account_ends', 'needs_context' => true],
|
||||||
'destination_account_starts' => ['alias' => false, 'needs_context' => true],
|
'destination_account_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'to_account_starts' => ['alias' => true, 'alias_for' => 'destination_account_starts', 'needs_context' => true],
|
'to_account_starts' => ['alias' => true, 'alias_for' => 'destination_account_starts', 'needs_context' => true],
|
||||||
'destination_account_nr_is' => ['alias' => false, 'needs_context' => true],
|
'destination_account_nr_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'to_account_nr_is' => ['alias' => true, 'alias_for' => 'destination_account_nr_is', 'needs_context' => true],
|
'to_account_nr_is' => ['alias' => true, 'alias_for' => 'destination_account_nr_is', 'needs_context' => true],
|
||||||
'destination_account_nr_contains' => ['alias' => false, 'needs_context' => true],
|
'destination_account_nr_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'to_account_nr_contains' => ['alias' => true, 'alias_for' => 'destination_account_nr_contains', 'needs_context' => true],
|
'to_account_nr_contains' => ['alias' => true, 'alias_for' => 'destination_account_nr_contains', 'needs_context' => true],
|
||||||
'destination_account_nr_ends' => ['alias' => false, 'needs_context' => true],
|
'destination_account_nr_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'to_account_nr_ends' => ['alias' => true, 'alias_for' => 'destination_account_nr_ends', 'needs_context' => true],
|
'to_account_nr_ends' => ['alias' => true, 'alias_for' => 'destination_account_nr_ends', 'needs_context' => true],
|
||||||
'destination_account_nr_starts' => ['alias' => false, 'needs_context' => true],
|
'destination_account_nr_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'to_account_nr_starts' => ['alias' => true, 'alias_for' => 'destination_account_nr_starts', 'needs_context' => true],
|
'to_account_nr_starts' => ['alias' => true, 'alias_for' => 'destination_account_nr_starts', 'needs_context' => true],
|
||||||
'account_is' => ['alias' => false, 'needs_context' => true],
|
'account_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_contains' => ['alias' => false, 'needs_context' => true],
|
'account_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_ends' => ['alias' => false, 'needs_context' => true],
|
'account_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_starts' => ['alias' => false, 'needs_context' => true],
|
'account_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_nr_is' => ['alias' => false, 'needs_context' => true],
|
'account_nr_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_nr_contains' => ['alias' => false, 'needs_context' => true],
|
'account_nr_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_nr_ends' => ['alias' => false, 'needs_context' => true],
|
'account_nr_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'account_nr_starts' => ['alias' => false, 'needs_context' => true],
|
'account_nr_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'category_is' => ['alias' => false, 'needs_context' => true],
|
'category_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'category_contains' => ['alias' => false, 'needs_context' => true],
|
'category_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'category' => ['alias' => true, 'alias_for' => 'category_contains', 'needs_context' => true],
|
'category' => ['alias' => true, 'alias_for' => 'category_contains', 'needs_context' => true],
|
||||||
'category_ends' => ['alias' => false, 'needs_context' => true],
|
'category_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'category_starts' => ['alias' => false, 'needs_context' => true],
|
'category_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'budget_is' => ['alias' => false, 'needs_context' => true],
|
'budget_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'budget_contains' => ['alias' => false, 'needs_context' => true],
|
'budget_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'budget' => ['alias' => true, 'alias_for' => 'budget_contains', 'needs_context' => true],
|
'budget' => ['alias' => true, 'alias_for' => 'budget_contains', 'needs_context' => true],
|
||||||
'budget_ends' => ['alias' => false, 'needs_context' => true],
|
'budget_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'budget_starts' => ['alias' => false, 'needs_context' => true],
|
'budget_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'bill_is' => ['alias' => false, 'needs_context' => true],
|
'bill_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'bill_contains' => ['alias' => false, 'needs_context' => true],
|
'bill_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'bill' => ['alias' => true, 'alias_for' => 'bill_contains', 'needs_context' => true],
|
'bill' => ['alias' => true, 'alias_for' => 'bill_contains', 'needs_context' => true],
|
||||||
'bill_ends' => ['alias' => false, 'needs_context' => true],
|
'bill_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'bill_starts' => ['alias' => false, 'needs_context' => true],
|
'bill_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'external_id_is' => ['alias' => false, 'needs_context' => true],
|
'subscription_is' => ['alias' => true, 'alias_for' => 'bill_is', 'needs_context' => true],
|
||||||
'external_id_contains' => ['alias' => false, 'needs_context' => true],
|
'subscription_contains' => ['alias' => true, 'alias_for' => 'bill_contains', 'needs_context' => true],
|
||||||
'external_id' => ['alias' => true, 'alias_for' => 'external_id_contains', 'needs_context' => true],
|
'subscription' => ['alias' => true, 'alias_for' => 'bill_contains', 'needs_context' => true],
|
||||||
'external_id_ends' => ['alias' => false, 'needs_context' => true],
|
'subscription_ends' => ['alias' => true, 'alias_for' => 'bill_ends', 'needs_context' => true],
|
||||||
'external_id_starts' => ['alias' => false, 'needs_context' => true],
|
'subscription_starts' => ['alias' => true, 'alias_for' => 'bill_starts', 'needs_context' => true],
|
||||||
'internal_reference_is' => ['alias' => false, 'needs_context' => true],
|
'external_id_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'internal_reference_contains' => ['alias' => false, 'needs_context' => true],
|
'external_id_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'internal_reference' => ['alias' => true, 'alias_for' => 'internal_reference_contains', 'needs_context' => true],
|
'external_id' => ['alias' => true, 'alias_for' => 'external_id_contains', 'needs_context' => true],
|
||||||
'internal_reference_ends' => ['alias' => false, 'needs_context' => true],
|
'external_id_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'internal_reference_starts' => ['alias' => false, 'needs_context' => true],
|
'external_id_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'external_url_is' => ['alias' => false, 'needs_context' => true],
|
'internal_reference_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'external_url_contains' => ['alias' => false, 'needs_context' => true],
|
'internal_reference_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'external_url' => ['alias' => true, 'alias_for' => 'external_url_contains', 'needs_context' => true],
|
'internal_reference' => ['alias' => true, 'alias_for' => 'internal_reference_contains', 'needs_context' => true],
|
||||||
'external_url_ends' => ['alias' => false, 'needs_context' => true],
|
'internal_reference_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'external_url_starts' => ['alias' => false, 'needs_context' => true],
|
'internal_reference_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'has_attachments' => ['alias' => false, 'needs_context' => false],
|
'external_url_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'has_any_category' => ['alias' => false, 'needs_context' => false],
|
'external_url_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'has_any_budget' => ['alias' => false, 'needs_context' => false],
|
'external_url' => ['alias' => true, 'alias_for' => 'external_url_contains', 'needs_context' => true],
|
||||||
'has_any_bill' => ['alias' => false, 'needs_context' => false],
|
'external_url_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'has_any_tag' => ['alias' => false, 'needs_context' => false],
|
'external_url_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'any_notes' => ['alias' => false, 'needs_context' => false],
|
'has_attachments' => ['alias' => false, 'needs_context' => false],
|
||||||
'has_any_notes' => ['alias' => true, 'alias_for' => 'any_notes', 'needs_context' => false],
|
'has_any_category' => ['alias' => false, 'needs_context' => false],
|
||||||
'has_notes' => ['alias' => true, 'alias_for' => 'any_notes', 'needs_context' => false],
|
'has_any_budget' => ['alias' => false, 'needs_context' => false],
|
||||||
'any_external_url' => ['alias' => false, 'needs_context' => false],
|
'has_any_bill' => ['alias' => false, 'needs_context' => false],
|
||||||
'has_any_external_url' => ['alias' => true, 'alias_for' => 'any_external_url', 'needs_context' => false],
|
'has_any_tag' => ['alias' => false, 'needs_context' => false],
|
||||||
'has_no_attachments' => ['alias' => false, 'needs_context' => false],
|
'any_notes' => ['alias' => false, 'needs_context' => false],
|
||||||
'has_no_category' => ['alias' => false, 'needs_context' => false],
|
'has_any_notes' => ['alias' => true, 'alias_for' => 'any_notes', 'needs_context' => false],
|
||||||
'has_no_budget' => ['alias' => false, 'needs_context' => false],
|
'has_notes' => ['alias' => true, 'alias_for' => 'any_notes', 'needs_context' => false],
|
||||||
'has_no_bill' => ['alias' => false, 'needs_context' => false],
|
'any_external_url' => ['alias' => false, 'needs_context' => false],
|
||||||
'has_no_tag' => ['alias' => false, 'needs_context' => false],
|
'has_any_external_url' => ['alias' => true, 'alias_for' => 'any_external_url', 'needs_context' => false],
|
||||||
'no_notes' => ['alias' => false, 'needs_context' => false],
|
'has_no_attachments' => ['alias' => false, 'needs_context' => false],
|
||||||
'no_external_url' => ['alias' => false, 'needs_context' => false],
|
'has_no_category' => ['alias' => false, 'needs_context' => false],
|
||||||
'source_is_cash' => ['alias' => false, 'needs_context' => false],
|
'has_no_budget' => ['alias' => false, 'needs_context' => false],
|
||||||
'destination_is_cash' => ['alias' => false, 'needs_context' => false],
|
'has_no_bill' => ['alias' => false, 'needs_context' => false],
|
||||||
'account_is_cash' => ['alias' => false, 'needs_context' => false],
|
'has_no_tag' => ['alias' => false, 'needs_context' => false],
|
||||||
'currency_is' => ['alias' => false, 'needs_context' => true],
|
'no_notes' => ['alias' => false, 'needs_context' => false],
|
||||||
'foreign_currency_is' => ['alias' => false, 'needs_context' => true],
|
'no_external_url' => ['alias' => false, 'needs_context' => false],
|
||||||
'id' => ['alias' => false, 'trigger_class' => '', 'needs_context' => true],
|
'source_is_cash' => ['alias' => false, 'needs_context' => false],
|
||||||
'journal_id' => ['alias' => false, 'trigger_class' => '', 'needs_context' => true],
|
'destination_is_cash' => ['alias' => false, 'needs_context' => false],
|
||||||
'recurrence_id' => ['alias' => false, 'trigger_class' => '', 'needs_context' => true],
|
'account_is_cash' => ['alias' => false, 'needs_context' => false],
|
||||||
'date_on' => ['alias' => false, 'needs_context' => true],
|
'currency_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'date' => ['alias' => true, 'alias_for' => 'date_on', 'needs_context' => true],
|
'foreign_currency_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'date_is' => ['alias' => true, 'alias_for' => 'date_on', 'needs_context' => true],
|
'id' => ['alias' => false, 'trigger_class' => '', 'needs_context' => true],
|
||||||
'on' => ['alias' => true, 'alias_for' => 'date_on', 'needs_context' => true],
|
'journal_id' => ['alias' => false, 'trigger_class' => '', 'needs_context' => true],
|
||||||
'date_before' => ['alias' => false, 'needs_context' => true],
|
'recurrence_id' => ['alias' => false, 'trigger_class' => '', 'needs_context' => true],
|
||||||
'before' => ['alias' => true, 'alias_for' => 'date_before', 'needs_context' => true],
|
'date_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'date_after' => ['alias' => false, 'needs_context' => true],
|
'date' => ['alias' => true, 'alias_for' => 'date_on', 'needs_context' => true],
|
||||||
'after' => ['alias' => true, 'alias_for' => 'date_after', 'needs_context' => true],
|
'date_is' => ['alias' => true, 'alias_for' => 'date_on', 'needs_context' => true],
|
||||||
'interest_date_on' => ['alias' => false, 'needs_context' => true],
|
'on' => ['alias' => true, 'alias_for' => 'date_on', 'needs_context' => true],
|
||||||
'interest_date' => ['alias' => true, 'alias_for' => 'interest_date_on', 'needs_context' => true],
|
'date_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'interest_date_is' => ['alias' => true, 'alias_for' => 'interest_date_on', 'needs_context' => true],
|
'before' => ['alias' => true, 'alias_for' => 'date_before', 'needs_context' => true],
|
||||||
'interest_date_before' => ['alias' => false, 'needs_context' => true],
|
'date_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'interest_date_after' => ['alias' => false, 'needs_context' => true],
|
'after' => ['alias' => true, 'alias_for' => 'date_after', 'needs_context' => true],
|
||||||
'book_date_on' => ['alias' => false, 'needs_context' => true],
|
'interest_date_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'book_date' => ['alias' => true, 'alias_for' => 'book_date_on', 'needs_context' => true],
|
'interest_date' => ['alias' => true, 'alias_for' => 'interest_date_on', 'needs_context' => true],
|
||||||
'book_date_is' => ['alias' => true, 'alias_for' => 'book_date_on', 'needs_context' => true],
|
'interest_date_is' => ['alias' => true, 'alias_for' => 'interest_date_on', 'needs_context' => true],
|
||||||
'book_date_before' => ['alias' => false, 'needs_context' => true],
|
'interest_date_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'book_date_after' => ['alias' => false, 'needs_context' => true],
|
'interest_date_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'process_date_on' => ['alias' => false, 'needs_context' => true],
|
'book_date_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'process_date' => ['alias' => true, 'alias_for' => 'process_date_on', 'needs_context' => true],
|
'book_date' => ['alias' => true, 'alias_for' => 'book_date_on', 'needs_context' => true],
|
||||||
'process_date_is' => ['alias' => true, 'alias_for' => 'process_date_on', 'needs_context' => true],
|
'book_date_is' => ['alias' => true, 'alias_for' => 'book_date_on', 'needs_context' => true],
|
||||||
'process_date_before' => ['alias' => false, 'needs_context' => true],
|
'book_date_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'process_date_after' => ['alias' => false, 'needs_context' => true],
|
'book_date_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'due_date_on' => ['alias' => false, 'needs_context' => true],
|
'process_date_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'due_date' => ['alias' => true, 'alias_for' => 'due_date_on', 'needs_context' => true],
|
'process_date' => ['alias' => true, 'alias_for' => 'process_date_on', 'needs_context' => true],
|
||||||
'due_date_is' => ['alias' => true, 'alias_for' => 'due_date_on', 'needs_context' => true],
|
'process_date_is' => ['alias' => true, 'alias_for' => 'process_date_on', 'needs_context' => true],
|
||||||
'due_date_before' => ['alias' => false, 'needs_context' => true],
|
'process_date_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'due_date_after' => ['alias' => false, 'needs_context' => true],
|
'process_date_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'payment_date_on' => ['alias' => false, 'needs_context' => true],
|
'due_date_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'payment_date' => ['alias' => true, 'alias_for' => 'payment_date_on', 'needs_context' => true],
|
'due_date' => ['alias' => true, 'alias_for' => 'due_date_on', 'needs_context' => true],
|
||||||
'payment_date_is' => ['alias' => true, 'alias_for' => 'payment_date_on', 'needs_context' => true],
|
'due_date_is' => ['alias' => true, 'alias_for' => 'due_date_on', 'needs_context' => true],
|
||||||
'payment_date_before' => ['alias' => false, 'needs_context' => true],
|
'due_date_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'payment_date_after' => ['alias' => false, 'needs_context' => true],
|
'due_date_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'invoice_date_on' => ['alias' => false, 'needs_context' => true],
|
'payment_date_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'invoice_date' => ['alias' => true, 'alias_for' => 'invoice_date_on', 'needs_context' => true],
|
'payment_date' => ['alias' => true, 'alias_for' => 'payment_date_on', 'needs_context' => true],
|
||||||
'invoice_date_is' => ['alias' => true, 'alias_for' => 'invoice_date_on', 'needs_context' => true],
|
'payment_date_is' => ['alias' => true, 'alias_for' => 'payment_date_on', 'needs_context' => true],
|
||||||
'invoice_date_before' => ['alias' => false, 'needs_context' => true],
|
'payment_date_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'invoice_date_after' => ['alias' => false, 'needs_context' => true],
|
'payment_date_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'created_at_on' => ['alias' => false, 'needs_context' => true],
|
'invoice_date_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'created_at' => ['alias' => true, 'alias_for' => 'created_at_on', 'needs_context' => true],
|
'invoice_date' => ['alias' => true, 'alias_for' => 'invoice_date_on', 'needs_context' => true],
|
||||||
'created_at_is' => ['alias' => true, 'alias_for' => 'created_at_on', 'needs_context' => true],
|
'invoice_date_is' => ['alias' => true, 'alias_for' => 'invoice_date_on', 'needs_context' => true],
|
||||||
'created_at_before' => ['alias' => false, 'needs_context' => true],
|
'invoice_date_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'created_at_after' => ['alias' => false, 'needs_context' => true],
|
'invoice_date_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'updated_at_on' => ['alias' => false, 'needs_context' => true],
|
'created_at_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'updated_at' => ['alias' => true, 'alias_for' => 'updated_at_on', 'needs_context' => true],
|
'created_at' => ['alias' => true, 'alias_for' => 'created_at_on', 'needs_context' => true],
|
||||||
'updated_at_is' => ['alias' => true, 'alias_for' => 'updated_at_on', 'needs_context' => true],
|
'created_at_is' => ['alias' => true, 'alias_for' => 'created_at_on', 'needs_context' => true],
|
||||||
'updated_at_before' => ['alias' => false, 'needs_context' => true],
|
'created_at_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'updated_at_after' => ['alias' => false, 'needs_context' => true],
|
'created_at_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'created_on_on' => ['alias' => true, 'alias_for' => 'created_at_on', 'needs_context' => true],
|
'updated_at_on' => ['alias' => false, 'needs_context' => true],
|
||||||
'created_on' => ['alias' => true, 'alias_for' => 'created_at', 'needs_context' => true],
|
'updated_at' => ['alias' => true, 'alias_for' => 'updated_at_on', 'needs_context' => true],
|
||||||
'created_on_before' => ['alias' => true, 'alias_for' => 'created_at_before', 'needs_context' => true],
|
'updated_at_is' => ['alias' => true, 'alias_for' => 'updated_at_on', 'needs_context' => true],
|
||||||
'created_on_after' => ['alias' => true, 'alias_for' => 'created_at_after', 'needs_context' => true],
|
'updated_at_before' => ['alias' => false, 'needs_context' => true],
|
||||||
'updated_on_on' => ['alias' => true, 'alias_for' => 'updated_at_on', 'needs_context' => true],
|
'updated_at_after' => ['alias' => false, 'needs_context' => true],
|
||||||
'updated_on' => ['alias' => true, 'alias_for' => 'updated_at', 'needs_context' => true],
|
'created_on_on' => ['alias' => true, 'alias_for' => 'created_at_on', 'needs_context' => true],
|
||||||
'updated_on_before' => ['alias' => true, 'alias_for' => 'updated_at_before', 'needs_context' => true],
|
'created_on' => ['alias' => true, 'alias_for' => 'created_at', 'needs_context' => true],
|
||||||
'updated_on_after' => ['alias' => true, 'alias_for' => 'updated_at_after', 'needs_context' => true],
|
'created_on_before' => ['alias' => true, 'alias_for' => 'created_at_before', 'needs_context' => true],
|
||||||
'amount_is' => ['alias' => false, 'needs_context' => true],
|
'created_on_after' => ['alias' => true, 'alias_for' => 'created_at_after', 'needs_context' => true],
|
||||||
'amount' => ['alias' => true, 'alias_for' => 'amount_is', 'needs_context' => true],
|
'updated_on_on' => ['alias' => true, 'alias_for' => 'updated_at_on', 'needs_context' => true],
|
||||||
'amount_exactly' => ['alias' => true, 'alias_for' => 'amount_is', 'needs_context' => true],
|
'updated_on' => ['alias' => true, 'alias_for' => 'updated_at', 'needs_context' => true],
|
||||||
'amount_less' => ['alias' => false, 'needs_context' => true],
|
'updated_on_before' => ['alias' => true, 'alias_for' => 'updated_at_before', 'needs_context' => true],
|
||||||
'amount_max' => ['alias' => true, 'alias_for' => 'amount_less', 'needs_context' => true],
|
'updated_on_after' => ['alias' => true, 'alias_for' => 'updated_at_after', 'needs_context' => true],
|
||||||
'less' => ['alias' => true, 'alias_for' => 'amount_less', 'needs_context' => true],
|
'amount_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'amount_more' => ['alias' => false, 'needs_context' => true],
|
'amount' => ['alias' => true, 'alias_for' => 'amount_is', 'needs_context' => true],
|
||||||
'amount_min' => ['alias' => true, 'alias_for' => 'amount_more', 'needs_context' => true],
|
'amount_exactly' => ['alias' => true, 'alias_for' => 'amount_is', 'needs_context' => true],
|
||||||
'more' => ['alias' => true, 'alias_for' => 'amount_more', 'needs_context' => true],
|
'amount_less' => ['alias' => false, 'needs_context' => true],
|
||||||
'foreign_amount_is' => ['alias' => false, 'needs_context' => true],
|
'amount_max' => ['alias' => true, 'alias_for' => 'amount_less', 'needs_context' => true],
|
||||||
'foreign_amount' => ['alias' => true, 'alias_for' => 'foreign_amount_is', 'needs_context' => true],
|
'less' => ['alias' => true, 'alias_for' => 'amount_less', 'needs_context' => true],
|
||||||
'foreign_amount_less' => ['alias' => false, 'needs_context' => true],
|
'amount_more' => ['alias' => false, 'needs_context' => true],
|
||||||
'foreign_amount_max' => ['alias' => true, 'alias_for' => 'foreign_amount_less', 'needs_context' => true],
|
'amount_min' => ['alias' => true, 'alias_for' => 'amount_more', 'needs_context' => true],
|
||||||
'foreign_amount_more' => ['alias' => false, 'needs_context' => true],
|
'more' => ['alias' => true, 'alias_for' => 'amount_more', 'needs_context' => true],
|
||||||
'foreign_amount_min' => ['alias' => true, 'alias_for' => 'foreign_amount_more', 'needs_context' => true],
|
'foreign_amount_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_name_is' => ['alias' => false, 'needs_context' => true],
|
'foreign_amount' => ['alias' => true, 'alias_for' => 'foreign_amount_is', 'needs_context' => true],
|
||||||
'attachment' => ['alias' => true, 'alias_for' => 'attachment_name_is', 'needs_context' => true],
|
'foreign_amount_less' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_is' => ['alias' => true, 'alias_for' => 'attachment_name_is', 'needs_context' => true],
|
'foreign_amount_max' => ['alias' => true, 'alias_for' => 'foreign_amount_less', 'needs_context' => true],
|
||||||
'attachment_name' => ['alias' => true, 'alias_for' => 'attachment_name_is', 'needs_context' => true],
|
'foreign_amount_more' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_name_contains' => ['alias' => false, 'needs_context' => true],
|
'foreign_amount_min' => ['alias' => true, 'alias_for' => 'foreign_amount_more', 'needs_context' => true],
|
||||||
'attachment_name_starts' => ['alias' => false, 'needs_context' => true],
|
'attachment_name_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_name_ends' => ['alias' => false, 'needs_context' => true],
|
'attachment' => ['alias' => true, 'alias_for' => 'attachment_name_is', 'needs_context' => true],
|
||||||
'attachment_notes' => ['alias' => true, 'alias_for' => 'attachment_notes_are', 'needs_context' => true],
|
'attachment_is' => ['alias' => true, 'alias_for' => 'attachment_name_is', 'needs_context' => true],
|
||||||
'attachment_notes_are' => ['alias' => false, 'needs_context' => true],
|
'attachment_name' => ['alias' => true, 'alias_for' => 'attachment_name_is', 'needs_context' => true],
|
||||||
'attachment_notes_contains' => ['alias' => false, 'needs_context' => true],
|
'attachment_name_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_notes_contain' => ['alias' => true, 'alias_for' => 'attachment_notes_contains', 'needs_context' => true],
|
'attachment_name_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_notes_starts' => ['alias' => false, 'needs_context' => true],
|
'attachment_name_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_notes_start' => ['alias' => true, 'alias_for' => 'attachment_notes_starts', 'needs_context' => true],
|
'attachment_notes' => ['alias' => true, 'alias_for' => 'attachment_notes_are', 'needs_context' => true],
|
||||||
'attachment_notes_ends' => ['alias' => false, 'needs_context' => true],
|
'attachment_notes_are' => ['alias' => false, 'needs_context' => true],
|
||||||
'attachment_notes_end' => ['alias' => true, 'alias_for' => 'attachment_notes_ends', 'needs_context' => true],
|
'attachment_notes_contains' => ['alias' => false, 'needs_context' => true],
|
||||||
'exists' => ['alias' => false, 'needs_context' => false],
|
'attachment_notes_contain' => ['alias' => true, 'alias_for' => 'attachment_notes_contains', 'needs_context' => true],
|
||||||
'sepa_ct_is' => ['alias' => false, 'needs_context' => true],
|
'attachment_notes_starts' => ['alias' => false, 'needs_context' => true],
|
||||||
'no_external_id' => ['alias' => false, 'needs_context' => false],
|
'attachment_notes_start' => ['alias' => true, 'alias_for' => 'attachment_notes_starts', 'needs_context' => true],
|
||||||
'any_external_id' => ['alias' => false, 'needs_context' => false],
|
'attachment_notes_ends' => ['alias' => false, 'needs_context' => true],
|
||||||
|
'attachment_notes_end' => ['alias' => true, 'alias_for' => 'attachment_notes_ends', 'needs_context' => true],
|
||||||
|
'exists' => ['alias' => false, 'needs_context' => false],
|
||||||
|
'sepa_ct_is' => ['alias' => false, 'needs_context' => true],
|
||||||
|
'no_external_id' => ['alias' => false, 'needs_context' => false],
|
||||||
|
'any_external_id' => ['alias' => false, 'needs_context' => false],
|
||||||
|
|
||||||
// based on source or destination balance. Very heavy search.
|
// based on source or destination balance. Very heavy search.
|
||||||
'source_balance_gte' => ['alias' => false, 'needs_context' => true],
|
'source_balance_gte' => ['alias' => false, 'needs_context' => true],
|
||||||
'source_balance_gt' => ['alias' => false, 'needs_context' => true],
|
'source_balance_gt' => ['alias' => false, 'needs_context' => true],
|
||||||
'source_balance_lte' => ['alias' => false, 'needs_context' => true],
|
'source_balance_lte' => ['alias' => false, 'needs_context' => true],
|
||||||
'source_balance_lt' => ['alias' => false, 'needs_context' => true],
|
'source_balance_lt' => ['alias' => false, 'needs_context' => true],
|
||||||
'source_balance_is' => ['alias' => false, 'needs_context' => true],
|
'source_balance_is' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination_balance_gte' => ['alias' => false, 'needs_context' => true],
|
'destination_balance_gte' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination_balance_gt' => ['alias' => false, 'needs_context' => true],
|
'destination_balance_gt' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination_balance_lte' => ['alias' => false, 'needs_context' => true],
|
'destination_balance_lte' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination_balance_lt' => ['alias' => false, 'needs_context' => true],
|
'destination_balance_lt' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination_balance_is' => ['alias' => false, 'needs_context' => true],
|
'destination_balance_is' => ['alias' => false, 'needs_context' => true],
|
||||||
],
|
],
|
||||||
/**
|
/**
|
||||||
* Which query parser to use - 'new' or 'legacy'
|
* Which query parser to use - 'new' or 'legacy'
|
||||||
|
|||||||
@@ -155,6 +155,8 @@ return [
|
|||||||
'is_reconciled',
|
'is_reconciled',
|
||||||
'split',
|
'split',
|
||||||
'single_split',
|
'single_split',
|
||||||
|
'not_enough_currencies',
|
||||||
|
'not_enough_currencies_enabled',
|
||||||
'transaction_stored_link',
|
'transaction_stored_link',
|
||||||
'webhook_stored_link',
|
'webhook_stored_link',
|
||||||
'webhook_updated_link',
|
'webhook_updated_link',
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
use Illuminate\Database\Migrations\Migration;
|
use Illuminate\Database\Migrations\Migration;
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Support\Facades\Schema;
|
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
return new class () extends Migration {
|
return new class () extends Migration {
|
||||||
/**
|
/**
|
||||||
@@ -37,8 +37,9 @@ return new class () extends Migration {
|
|||||||
// make account_id nullable and the relation also nullable.
|
// make account_id nullable and the relation also nullable.
|
||||||
try {
|
try {
|
||||||
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
||||||
// 1. drop index
|
if (self::hasForeign('piggy_banks', 'piggy_banks_account_id_foreign')) {
|
||||||
$table->dropForeign('piggy_banks_account_id_foreign');
|
$table->dropForeign('piggy_banks_account_id_foreign');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} catch (RuntimeException $e) {
|
} catch (RuntimeException $e) {
|
||||||
Log::error('Could not drop foreign key "piggy_banks_account_id_foreign". Probably not an issue.');
|
Log::error('Could not drop foreign key "piggy_banks_account_id_foreign". Probably not an issue.');
|
||||||
@@ -49,42 +50,70 @@ return new class () extends Migration {
|
|||||||
});
|
});
|
||||||
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
||||||
// 3. add currency
|
// 3. add currency
|
||||||
$table->integer('transaction_currency_id', false, true)->after('account_id')->nullable();
|
if (!Schema::hasColumn('piggy_banks', 'transaction_currency_id')) {
|
||||||
$table->foreign('transaction_currency_id', 'unique_currency')->references('id')->on('transaction_currencies')->onDelete('cascade');
|
$table->integer('transaction_currency_id', false, true)->after('account_id')->nullable();
|
||||||
|
}
|
||||||
|
if (!self::hasForeign('piggy_banks', 'unique_currency')) {
|
||||||
|
$table->foreign('transaction_currency_id', 'unique_currency')->references('id')->on('transaction_currencies')->onDelete('cascade');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
||||||
// 4. rename columns
|
// 4. rename columns
|
||||||
$table->renameColumn('targetamount', 'target_amount');
|
if (Schema::hasColumn('piggy_banks', 'targetamount') && !Schema::hasColumn('piggy_banks', 'target_amount')) {
|
||||||
$table->renameColumn('startdate', 'start_date');
|
$table->renameColumn('targetamount', 'target_amount');
|
||||||
$table->renameColumn('targetdate', 'target_date');
|
}
|
||||||
$table->renameColumn('startdate_tz', 'start_date_tz');
|
if (Schema::hasColumn('piggy_banks', 'startdate') && !Schema::hasColumn('piggy_banks', 'start_date')) {
|
||||||
$table->renameColumn('targetdate_tz', 'target_date_tz');
|
$table->renameColumn('startdate', 'start_date');
|
||||||
|
}
|
||||||
|
if (Schema::hasColumn('piggy_banks', 'targetdate') && !Schema::hasColumn('piggy_banks', 'target_date')) {
|
||||||
|
$table->renameColumn('targetdate', 'target_date');
|
||||||
|
}
|
||||||
|
if (Schema::hasColumn('piggy_banks', 'targetdate') && !Schema::hasColumn('startdate_tz', 'start_date_tz')) {
|
||||||
|
$table->renameColumn('startdate_tz', 'start_date_tz');
|
||||||
|
}
|
||||||
|
if (Schema::hasColumn('piggy_banks', 'targetdate_tz') && !Schema::hasColumn('target_date_tz', 'start_date_tz')) {
|
||||||
|
$table->renameColumn('targetdate_tz', 'target_date_tz');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
Schema::table('piggy_banks', static function (Blueprint $table): void {
|
||||||
// 5. add new index
|
// 5. add new index
|
||||||
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('set null');
|
if (!self::hasForeign('piggy_banks', 'piggy_banks_account_id_foreign')) {
|
||||||
|
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('set null');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// rename some fields in piggy bank reps.
|
// rename some fields in piggy bank reps.
|
||||||
Schema::table('piggy_bank_repetitions', static function (Blueprint $table): void {
|
Schema::table('piggy_bank_repetitions', static function (Blueprint $table): void {
|
||||||
// 6. rename columns
|
// 6. rename columns
|
||||||
$table->renameColumn('currentamount', 'current_amount');
|
if (Schema::hasColumn('piggy_bank_repetitions', 'currentamount') && !Schema::hasColumn('piggy_bank_repetitions', 'current_amount')) {
|
||||||
$table->renameColumn('startdate', 'start_date');
|
$table->renameColumn('currentamount', 'current_amount');
|
||||||
$table->renameColumn('targetdate', 'target_date');
|
}
|
||||||
$table->renameColumn('startdate_tz', 'start_date_tz');
|
if (Schema::hasColumn('piggy_bank_repetitions', 'startdate') && !Schema::hasColumn('piggy_bank_repetitions', 'start_date')) {
|
||||||
$table->renameColumn('targetdate_tz', 'target_date_tz');
|
$table->renameColumn('startdate', 'start_date');
|
||||||
|
}
|
||||||
|
if (Schema::hasColumn('piggy_bank_repetitions', 'targetdate') && !Schema::hasColumn('piggy_bank_repetitions', 'target_date')) {
|
||||||
|
$table->renameColumn('targetdate', 'target_date');
|
||||||
|
}
|
||||||
|
if (Schema::hasColumn('piggy_bank_repetitions', 'startdate_tz') && !Schema::hasColumn('piggy_bank_repetitions', 'start_date_tz')) {
|
||||||
|
$table->renameColumn('startdate_tz', 'start_date_tz');
|
||||||
|
}
|
||||||
|
if (Schema::hasColumn('piggy_bank_repetitions', 'targetdate_tz') && !Schema::hasColumn('piggy_bank_repetitions', 'target_date_tz')) {
|
||||||
|
$table->renameColumn('targetdate_tz', 'target_date_tz');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// create table account_piggy_bank
|
// create table account_piggy_bank
|
||||||
Schema::create('account_piggy_bank', static function (Blueprint $table): void {
|
if (!Schema::hasTable('account_piggy_bank')) {
|
||||||
$table->id();
|
Schema::create('account_piggy_bank', static function (Blueprint $table): void {
|
||||||
$table->integer('account_id', false, true);
|
$table->id();
|
||||||
$table->integer('piggy_bank_id', false, true);
|
$table->integer('account_id', false, true);
|
||||||
$table->decimal('current_amount', 32, 12)->default('0');
|
$table->integer('piggy_bank_id', false, true);
|
||||||
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
|
$table->decimal('current_amount', 32, 12)->default('0');
|
||||||
$table->foreign('piggy_bank_id')->references('id')->on('piggy_banks')->onDelete('cascade');
|
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
|
||||||
$table->unique(['account_id', 'piggy_bank_id'], 'unique_piggy_save');
|
$table->foreign('piggy_bank_id')->references('id')->on('piggy_banks')->onDelete('cascade');
|
||||||
});
|
$table->unique(['account_id', 'piggy_bank_id'], 'unique_piggy_save');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +134,9 @@ return new class () extends Migration {
|
|||||||
$table->renameColumn('target_date_tz', 'targetdate_tz');
|
$table->renameColumn('target_date_tz', 'targetdate_tz');
|
||||||
|
|
||||||
// 3. drop currency again + index
|
// 3. drop currency again + index
|
||||||
$table->dropForeign('unique_currency');
|
if (self::hasForeign('piggy_banks', 'unique_currency')) {
|
||||||
|
$table->dropForeign('unique_currency');
|
||||||
|
}
|
||||||
$table->dropColumn('transaction_currency_id');
|
$table->dropColumn('transaction_currency_id');
|
||||||
|
|
||||||
// 2. make column non-nullable.
|
// 2. make column non-nullable.
|
||||||
@@ -127,4 +158,17 @@ return new class () extends Migration {
|
|||||||
|
|
||||||
Schema::dropIfExists('account_piggy_bank');
|
Schema::dropIfExists('account_piggy_bank');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static function hasForeign(string $table, string $column)
|
||||||
|
{
|
||||||
|
|
||||||
|
$foreignKeysDefinitions = Schema::getForeignKeys($table);
|
||||||
|
foreach ($foreignKeysDefinitions as $foreignKeyDefinition) {
|
||||||
|
if ($foreignKeyDefinition['name'] === $column) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ return new class () extends Migration {
|
|||||||
'piggy_banks' => ['native_target_amount'], // works
|
'piggy_banks' => ['native_target_amount'], // works
|
||||||
'transactions' => ['native_amount', 'native_foreign_amount'], // works
|
'transactions' => ['native_amount', 'native_foreign_amount'], // works
|
||||||
|
|
||||||
// TODO button to recalculate all native amounts on selected pages?
|
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,9 +50,11 @@ return new class () extends Migration {
|
|||||||
{
|
{
|
||||||
foreach ($this->tables as $table => $fields) {
|
foreach ($this->tables as $table => $fields) {
|
||||||
foreach ($fields as $field) {
|
foreach ($fields as $field) {
|
||||||
Schema::table($table, static function (Blueprint $table) use ($field): void {
|
Schema::table($table, static function (Blueprint $tableObject) use ($table, $field): void {
|
||||||
// add amount column
|
// add amount column
|
||||||
$table->decimal($field, 32, 12)->nullable();
|
if (!Schema::hasColumn($table, $field)) {
|
||||||
|
$tableObject->decimal($field, 32, 12)->nullable();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ class TransactionCurrencySeeder extends Seeder
|
|||||||
$currencies[] = ['code' => 'PLN', 'name' => 'Polish złoty', 'symbol' => 'zł', 'decimal_places' => 2];
|
$currencies[] = ['code' => 'PLN', 'name' => 'Polish złoty', 'symbol' => 'zł', 'decimal_places' => 2];
|
||||||
$currencies[] = ['code' => 'TRY', 'name' => 'Turkish lira', 'symbol' => '₺', 'decimal_places' => 2];
|
$currencies[] = ['code' => 'TRY', 'name' => 'Turkish lira', 'symbol' => '₺', 'decimal_places' => 2];
|
||||||
$currencies[] = ['code' => 'DKK', 'name' => 'Dansk krone', 'symbol' => 'kr.', 'decimal_places' => 2];
|
$currencies[] = ['code' => 'DKK', 'name' => 'Dansk krone', 'symbol' => 'kr.', 'decimal_places' => 2];
|
||||||
|
$currencies[] = ['code' => 'ISK', 'name' => 'Íslensk króna', 'symbol' => 'kr.', 'decimal_places' => 2];
|
||||||
|
$currencies[] = ['code' => 'NOK', 'name' => 'Norsk krone', 'symbol' => 'kr.', 'decimal_places' => 2];
|
||||||
|
$currencies[] = ['code' => 'SEK', 'name' => 'Svensk krona', 'symbol' => 'kr.', 'decimal_places' => 2];
|
||||||
$currencies[] = ['code' => 'RON', 'name' => 'Romanian leu', 'symbol' => 'lei', 'decimal_places' => 2];
|
$currencies[] = ['code' => 'RON', 'name' => 'Romanian leu', 'symbol' => 'lei', 'decimal_places' => 2];
|
||||||
|
|
||||||
// american currencies
|
// american currencies
|
||||||
|
|||||||
376
package-lock.json
generated
376
package-lock.json
generated
@@ -79,9 +79,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/compat-data": {
|
"node_modules/@babel/compat-data": {
|
||||||
"version": "7.26.5",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
|
||||||
"integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
|
"integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -89,22 +89,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/core": {
|
"node_modules/@babel/core": {
|
||||||
"version": "7.26.7",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz",
|
||||||
"integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
|
"integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
"@ampproject/remapping": "^2.2.0",
|
||||||
"@babel/code-frame": "^7.26.2",
|
"@babel/code-frame": "^7.26.2",
|
||||||
"@babel/generator": "^7.26.5",
|
"@babel/generator": "^7.26.8",
|
||||||
"@babel/helper-compilation-targets": "^7.26.5",
|
"@babel/helper-compilation-targets": "^7.26.5",
|
||||||
"@babel/helper-module-transforms": "^7.26.0",
|
"@babel/helper-module-transforms": "^7.26.0",
|
||||||
"@babel/helpers": "^7.26.7",
|
"@babel/helpers": "^7.26.7",
|
||||||
"@babel/parser": "^7.26.7",
|
"@babel/parser": "^7.26.8",
|
||||||
"@babel/template": "^7.25.9",
|
"@babel/template": "^7.26.8",
|
||||||
"@babel/traverse": "^7.26.7",
|
"@babel/traverse": "^7.26.8",
|
||||||
"@babel/types": "^7.26.7",
|
"@babel/types": "^7.26.8",
|
||||||
|
"@types/gensync": "^1.0.0",
|
||||||
"convert-source-map": "^2.0.0",
|
"convert-source-map": "^2.0.0",
|
||||||
"debug": "^4.1.0",
|
"debug": "^4.1.0",
|
||||||
"gensync": "^1.0.0-beta.2",
|
"gensync": "^1.0.0-beta.2",
|
||||||
@@ -130,14 +131,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/generator": {
|
"node_modules/@babel/generator": {
|
||||||
"version": "7.26.5",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz",
|
||||||
"integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
|
"integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.26.5",
|
"@babel/parser": "^7.26.8",
|
||||||
"@babel/types": "^7.26.5",
|
"@babel/types": "^7.26.8",
|
||||||
"@jridgewell/gen-mapping": "^0.3.5",
|
"@jridgewell/gen-mapping": "^0.3.5",
|
||||||
"@jridgewell/trace-mapping": "^0.3.25",
|
"@jridgewell/trace-mapping": "^0.3.25",
|
||||||
"jsesc": "^3.0.2"
|
"jsesc": "^3.0.2"
|
||||||
@@ -442,13 +443,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/parser": {
|
"node_modules/@babel/parser": {
|
||||||
"version": "7.26.7",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
|
||||||
"integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
|
"integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/types": "^7.26.7"
|
"@babel/types": "^7.26.8"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"parser": "bin/babel-parser.js"
|
"parser": "bin/babel-parser.js"
|
||||||
@@ -667,15 +668,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-async-generator-functions": {
|
"node_modules/@babel/plugin-transform-async-generator-functions": {
|
||||||
"version": "7.25.9",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz",
|
||||||
"integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
|
"integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.25.9",
|
"@babel/helper-plugin-utils": "^7.26.5",
|
||||||
"@babel/helper-remap-async-to-generator": "^7.25.9",
|
"@babel/helper-remap-async-to-generator": "^7.25.9",
|
||||||
"@babel/traverse": "^7.25.9"
|
"@babel/traverse": "^7.26.8"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -1340,14 +1341,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-runtime": {
|
"node_modules/@babel/plugin-transform-runtime": {
|
||||||
"version": "7.25.9",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.8.tgz",
|
||||||
"integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==",
|
"integrity": "sha512-H0jlQxFMI0Q8SyGPsj9pO3ygVQRxPkIGytsL3m1Zqca8KrCPpMlvh+e2dxknqdfS8LFwBw+PpiYPD9qy/FPQpA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-module-imports": "^7.25.9",
|
"@babel/helper-module-imports": "^7.25.9",
|
||||||
"@babel/helper-plugin-utils": "^7.25.9",
|
"@babel/helper-plugin-utils": "^7.26.5",
|
||||||
"babel-plugin-polyfill-corejs2": "^0.4.10",
|
"babel-plugin-polyfill-corejs2": "^0.4.10",
|
||||||
"babel-plugin-polyfill-corejs3": "^0.10.6",
|
"babel-plugin-polyfill-corejs3": "^0.10.6",
|
||||||
"babel-plugin-polyfill-regenerator": "^0.6.1",
|
"babel-plugin-polyfill-regenerator": "^0.6.1",
|
||||||
@@ -1420,13 +1421,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-template-literals": {
|
"node_modules/@babel/plugin-transform-template-literals": {
|
||||||
"version": "7.25.9",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz",
|
||||||
"integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
|
"integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.25.9"
|
"@babel/helper-plugin-utils": "^7.26.5"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -1519,13 +1520,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/preset-env": {
|
"node_modules/@babel/preset-env": {
|
||||||
"version": "7.26.7",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.8.tgz",
|
||||||
"integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==",
|
"integrity": "sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/compat-data": "^7.26.5",
|
"@babel/compat-data": "^7.26.8",
|
||||||
"@babel/helper-compilation-targets": "^7.26.5",
|
"@babel/helper-compilation-targets": "^7.26.5",
|
||||||
"@babel/helper-plugin-utils": "^7.26.5",
|
"@babel/helper-plugin-utils": "^7.26.5",
|
||||||
"@babel/helper-validator-option": "^7.25.9",
|
"@babel/helper-validator-option": "^7.25.9",
|
||||||
@@ -1539,7 +1540,7 @@
|
|||||||
"@babel/plugin-syntax-import-attributes": "^7.26.0",
|
"@babel/plugin-syntax-import-attributes": "^7.26.0",
|
||||||
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
|
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
|
||||||
"@babel/plugin-transform-arrow-functions": "^7.25.9",
|
"@babel/plugin-transform-arrow-functions": "^7.25.9",
|
||||||
"@babel/plugin-transform-async-generator-functions": "^7.25.9",
|
"@babel/plugin-transform-async-generator-functions": "^7.26.8",
|
||||||
"@babel/plugin-transform-async-to-generator": "^7.25.9",
|
"@babel/plugin-transform-async-to-generator": "^7.25.9",
|
||||||
"@babel/plugin-transform-block-scoped-functions": "^7.26.5",
|
"@babel/plugin-transform-block-scoped-functions": "^7.26.5",
|
||||||
"@babel/plugin-transform-block-scoping": "^7.25.9",
|
"@babel/plugin-transform-block-scoping": "^7.25.9",
|
||||||
@@ -1582,7 +1583,7 @@
|
|||||||
"@babel/plugin-transform-shorthand-properties": "^7.25.9",
|
"@babel/plugin-transform-shorthand-properties": "^7.25.9",
|
||||||
"@babel/plugin-transform-spread": "^7.25.9",
|
"@babel/plugin-transform-spread": "^7.25.9",
|
||||||
"@babel/plugin-transform-sticky-regex": "^7.25.9",
|
"@babel/plugin-transform-sticky-regex": "^7.25.9",
|
||||||
"@babel/plugin-transform-template-literals": "^7.25.9",
|
"@babel/plugin-transform-template-literals": "^7.26.8",
|
||||||
"@babel/plugin-transform-typeof-symbol": "^7.26.7",
|
"@babel/plugin-transform-typeof-symbol": "^7.26.7",
|
||||||
"@babel/plugin-transform-unicode-escapes": "^7.25.9",
|
"@babel/plugin-transform-unicode-escapes": "^7.25.9",
|
||||||
"@babel/plugin-transform-unicode-property-regex": "^7.25.9",
|
"@babel/plugin-transform-unicode-property-regex": "^7.25.9",
|
||||||
@@ -1590,9 +1591,9 @@
|
|||||||
"@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
|
"@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
|
||||||
"@babel/preset-modules": "0.1.6-no-external-plugins",
|
"@babel/preset-modules": "0.1.6-no-external-plugins",
|
||||||
"babel-plugin-polyfill-corejs2": "^0.4.10",
|
"babel-plugin-polyfill-corejs2": "^0.4.10",
|
||||||
"babel-plugin-polyfill-corejs3": "^0.10.6",
|
"babel-plugin-polyfill-corejs3": "^0.11.0",
|
||||||
"babel-plugin-polyfill-regenerator": "^0.6.1",
|
"babel-plugin-polyfill-regenerator": "^0.6.1",
|
||||||
"core-js-compat": "^3.38.1",
|
"core-js-compat": "^3.40.0",
|
||||||
"semver": "^6.3.1"
|
"semver": "^6.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1602,6 +1603,20 @@
|
|||||||
"@babel/core": "^7.0.0-0"
|
"@babel/core": "^7.0.0-0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": {
|
||||||
|
"version": "0.11.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz",
|
||||||
|
"integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/helper-define-polyfill-provider": "^0.6.3",
|
||||||
|
"core-js-compat": "^3.40.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@babel/preset-env/node_modules/semver": {
|
"node_modules/@babel/preset-env/node_modules/semver": {
|
||||||
"version": "6.3.1",
|
"version": "6.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
||||||
@@ -1640,32 +1655,32 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/template": {
|
"node_modules/@babel/template": {
|
||||||
"version": "7.25.9",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz",
|
||||||
"integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
|
"integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.25.9",
|
"@babel/code-frame": "^7.26.2",
|
||||||
"@babel/parser": "^7.25.9",
|
"@babel/parser": "^7.26.8",
|
||||||
"@babel/types": "^7.25.9"
|
"@babel/types": "^7.26.8"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/traverse": {
|
"node_modules/@babel/traverse": {
|
||||||
"version": "7.26.7",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz",
|
||||||
"integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
|
"integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.26.2",
|
"@babel/code-frame": "^7.26.2",
|
||||||
"@babel/generator": "^7.26.5",
|
"@babel/generator": "^7.26.8",
|
||||||
"@babel/parser": "^7.26.7",
|
"@babel/parser": "^7.26.8",
|
||||||
"@babel/template": "^7.25.9",
|
"@babel/template": "^7.26.8",
|
||||||
"@babel/types": "^7.26.7",
|
"@babel/types": "^7.26.8",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"globals": "^11.1.0"
|
"globals": "^11.1.0"
|
||||||
},
|
},
|
||||||
@@ -1674,9 +1689,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/types": {
|
"node_modules/@babel/types": {
|
||||||
"version": "7.26.7",
|
"version": "7.26.8",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz",
|
||||||
"integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
|
"integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -2591,9 +2606,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz",
|
||||||
"integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==",
|
"integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2605,9 +2620,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz",
|
||||||
"integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==",
|
"integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2619,9 +2634,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz",
|
||||||
"integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==",
|
"integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2633,9 +2648,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz",
|
||||||
"integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==",
|
"integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2647,9 +2662,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-freebsd-arm64": {
|
"node_modules/@rollup/rollup-freebsd-arm64": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz",
|
||||||
"integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==",
|
"integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2661,9 +2676,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-freebsd-x64": {
|
"node_modules/@rollup/rollup-freebsd-x64": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz",
|
||||||
"integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==",
|
"integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2675,9 +2690,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz",
|
||||||
"integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==",
|
"integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2689,9 +2704,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz",
|
||||||
"integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==",
|
"integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2703,9 +2718,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==",
|
"integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2717,9 +2732,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz",
|
||||||
"integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==",
|
"integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2731,9 +2746,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==",
|
"integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"loong64"
|
"loong64"
|
||||||
],
|
],
|
||||||
@@ -2745,9 +2760,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==",
|
"integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ppc64"
|
"ppc64"
|
||||||
],
|
],
|
||||||
@@ -2759,9 +2774,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==",
|
"integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
@@ -2773,9 +2788,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==",
|
"integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"s390x"
|
"s390x"
|
||||||
],
|
],
|
||||||
@@ -2787,9 +2802,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==",
|
"integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2801,9 +2816,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz",
|
||||||
"integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==",
|
"integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2815,9 +2830,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz",
|
||||||
"integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==",
|
"integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2829,9 +2844,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz",
|
||||||
"integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==",
|
"integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
@@ -2843,9 +2858,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz",
|
||||||
"integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==",
|
"integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -3032,6 +3047,13 @@
|
|||||||
"@types/send": "*"
|
"@types/send": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/gensync": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@types/glob": {
|
"node_modules/@types/glob": {
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
|
||||||
@@ -3051,9 +3073,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/http-proxy": {
|
"node_modules/@types/http-proxy": {
|
||||||
"version": "1.17.15",
|
"version": "1.17.16",
|
||||||
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
|
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
|
||||||
"integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
|
"integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -3133,9 +3155,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "22.12.0",
|
"version": "22.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
|
||||||
"integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
|
"integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -4448,9 +4470,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001696",
|
"version": "1.0.30001699",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
|
||||||
"integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
|
"integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5663,9 +5685,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.90",
|
"version": "1.5.96",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.96.tgz",
|
||||||
"integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==",
|
"integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@@ -5720,9 +5742,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/enhanced-resolve": {
|
"node_modules/enhanced-resolve": {
|
||||||
"version": "5.18.0",
|
"version": "5.18.1",
|
||||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz",
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
|
||||||
"integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==",
|
"integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -7159,9 +7181,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/import-fresh": {
|
"node_modules/import-fresh": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
|
||||||
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
|
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -8387,9 +8409,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/object-inspect": {
|
"node_modules/object-inspect": {
|
||||||
"version": "1.13.3",
|
"version": "1.13.4",
|
||||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
|
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
|
||||||
"integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
|
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -9183,9 +9205,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
|
"node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
|
||||||
"version": "7.0.0",
|
"version": "7.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
|
||||||
"integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
|
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -9213,9 +9235,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
|
"node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
|
||||||
"version": "7.0.0",
|
"version": "7.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
|
||||||
"integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
|
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -9987,9 +10009,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.32.1",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz",
|
||||||
"integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==",
|
"integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -10003,25 +10025,25 @@
|
|||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.32.1",
|
"@rollup/rollup-android-arm-eabi": "4.34.6",
|
||||||
"@rollup/rollup-android-arm64": "4.32.1",
|
"@rollup/rollup-android-arm64": "4.34.6",
|
||||||
"@rollup/rollup-darwin-arm64": "4.32.1",
|
"@rollup/rollup-darwin-arm64": "4.34.6",
|
||||||
"@rollup/rollup-darwin-x64": "4.32.1",
|
"@rollup/rollup-darwin-x64": "4.34.6",
|
||||||
"@rollup/rollup-freebsd-arm64": "4.32.1",
|
"@rollup/rollup-freebsd-arm64": "4.34.6",
|
||||||
"@rollup/rollup-freebsd-x64": "4.32.1",
|
"@rollup/rollup-freebsd-x64": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.32.1",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm-musleabihf": "4.32.1",
|
"@rollup/rollup-linux-arm-musleabihf": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.32.1",
|
"@rollup/rollup-linux-arm64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.32.1",
|
"@rollup/rollup-linux-arm64-musl": "4.34.6",
|
||||||
"@rollup/rollup-linux-loongarch64-gnu": "4.32.1",
|
"@rollup/rollup-linux-loongarch64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.32.1",
|
"@rollup/rollup-linux-powerpc64le-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.32.1",
|
"@rollup/rollup-linux-riscv64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-s390x-gnu": "4.32.1",
|
"@rollup/rollup-linux-s390x-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.32.1",
|
"@rollup/rollup-linux-x64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.32.1",
|
"@rollup/rollup-linux-x64-musl": "4.34.6",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.32.1",
|
"@rollup/rollup-win32-arm64-msvc": "4.34.6",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.32.1",
|
"@rollup/rollup-win32-ia32-msvc": "4.34.6",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.32.1",
|
"@rollup/rollup-win32-x64-msvc": "4.34.6",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -10077,9 +10099,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/sass": {
|
"node_modules/sass": {
|
||||||
"version": "1.83.4",
|
"version": "1.84.0",
|
||||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz",
|
"resolved": "https://registry.npmjs.org/sass/-/sass-1.84.0.tgz",
|
||||||
"integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==",
|
"integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -10168,9 +10190,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/semver": {
|
"node_modules/semver": {
|
||||||
"version": "7.7.0",
|
"version": "7.7.1",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||||
"integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==",
|
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -10871,9 +10893,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
"version": "5.37.0",
|
"version": "5.38.1",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.38.1.tgz",
|
||||||
"integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==",
|
"integrity": "sha512-GWANVlPM/ZfYzuPHjq0nxT+EbOEDDN3Jwhwdg1D8TU8oSkktp8w64Uq4auuGLxFSoNTRDncTq2hQHX1Ld9KHkA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -11297,15 +11319,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "6.0.11",
|
"version": "6.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz",
|
||||||
"integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
|
"integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.24.2",
|
"esbuild": "^0.24.2",
|
||||||
"postcss": "^8.4.49",
|
"postcss": "^8.5.1",
|
||||||
"rollup": "^4.23.0"
|
"rollup": "^4.30.1"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"vite": "bin/vite.js"
|
"vite": "bin/vite.js"
|
||||||
|
|||||||
@@ -45,6 +45,9 @@
|
|||||||
<testsuite name="integration">
|
<testsuite name="integration">
|
||||||
<directory suffix="Test.php">./tests/integration</directory>
|
<directory suffix="Test.php">./tests/integration</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
<testsuite name="feature">
|
||||||
|
<directory suffix="Test.php">./tests/feature</directory>
|
||||||
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
<source>
|
<source>
|
||||||
<include>
|
<include>
|
||||||
|
|||||||
@@ -33,15 +33,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12 col-xs-12">
|
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12 col-xs-12" v-if="currencies.length < 2">
|
||||||
|
<div class="box box-default" v-for="currency in currencies" :key="currency.id">
|
||||||
|
<div class="box-header with-border">
|
||||||
|
<h3 class="box-title">{{ $t('firefly.not_enough_currencies') }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<p>
|
||||||
|
{{ $t('firefly.not_enough_currencies_enabled') }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12 col-xs-12" v-if="currencies.length > 1">
|
||||||
<div class="box box-default" v-for="currency in currencies" :key="currency.id">
|
<div class="box box-default" v-for="currency in currencies" :key="currency.id">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">{{ currency.name }}</h3>
|
<h3 class="box-title">{{ currency.name }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<ul v-if="currencies.length > 0">
|
<ul v-if="currencies.length > 1">
|
||||||
<li v-for="sub in currencies" :key="sub.id" v-show="sub.id !== currency.id">
|
<li v-for="sub in currencies" :key="sub.id" v-show="sub.id !== currency.id">
|
||||||
<a :href="'exchange-rates/' + currency.code + '/' + sub.code" :title="$t('firefly.exchange_rates_from_to', {from: currency.name, to: sub.name})">{{ $t('firefly.exchange_rates_from_to', {from: currency.name, to: sub.name}) }}</a>
|
<a :href="'exchange-rates/' + currency.code + '/' + sub.code"
|
||||||
|
:title="$t('firefly.exchange_rates_from_to', {from: currency.name, to: sub.name})">{{
|
||||||
|
$t('firefly.exchange_rates_from_to', {
|
||||||
|
from: currency.name,
|
||||||
|
to: sub.name
|
||||||
|
})
|
||||||
|
}}</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -57,6 +75,7 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
currencies: [],
|
currencies: [],
|
||||||
|
page: 1,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -65,6 +84,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
getCurrencies: function () {
|
getCurrencies: function () {
|
||||||
this.currencies = [];
|
this.currencies = [];
|
||||||
|
// start with page one, loop for the rest.
|
||||||
this.downloadCurrencies(1);
|
this.downloadCurrencies(1);
|
||||||
},
|
},
|
||||||
downloadCurrencies: function (page) {
|
downloadCurrencies: function (page) {
|
||||||
@@ -72,12 +92,14 @@ export default {
|
|||||||
for (let i in response.data.data) {
|
for (let i in response.data.data) {
|
||||||
if (response.data.data.hasOwnProperty(i)) {
|
if (response.data.data.hasOwnProperty(i)) {
|
||||||
let current = response.data.data[i];
|
let current = response.data.data[i];
|
||||||
let currency = {
|
if (current.attributes.enabled) {
|
||||||
id: current.id,
|
let currency = {
|
||||||
name: current.attributes.name,
|
id: current.id,
|
||||||
code: current.attributes.code,
|
name: current.attributes.name,
|
||||||
};
|
code: current.attributes.code,
|
||||||
this.currencies.push(currency);
|
};
|
||||||
|
this.currencies.push(currency);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,27 @@
|
|||||||
<h3 class="box-title">{{ $t('firefly.header_exchange_rates_table') }}</h3>
|
<h3 class="box-title">{{ $t('firefly.header_exchange_rates_table') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body no-padding">
|
<div class="box-body no-padding">
|
||||||
|
<nav v-if="totalPages > 1">
|
||||||
|
<ul class="pagination">
|
||||||
|
<li v-if="1 === this.page" class="page-item disabled" aria-disabled="true" :aria-label="$t('pagination.previous')">
|
||||||
|
<span class="page-link" aria-hidden="true">‹</span>
|
||||||
|
</li>
|
||||||
|
<li class="page-item" v-if="1 !== this.page">
|
||||||
|
<a class="page-link" :href="'/exchange-rates/'+from_code+'/'+to_code+'?page=' + (this.page-1)" rel="prev" :aria-label="$t('pagination.next')">‹</a>
|
||||||
|
</li>
|
||||||
|
<li v-for="item in this.totalPages" :class="item === page ? 'page-item active' : 'page-item'" aria-current="page">
|
||||||
|
<span v-if="item === page" class="page-link" v-text="item"></span>
|
||||||
|
<a v-if="item !== page" class="page-link" :href="'/exchange-rates/'+from_code+'/'+to_code+'?page=' + item" v-text="item"></a>
|
||||||
|
</li>
|
||||||
|
<li v-if="totalPages !== page" class="page-item">
|
||||||
|
<a class="page-link" :href="'/exchange-rates/'+from_code+'/'+to_code+'?page=' + (this.page+1)" rel="next" :aria-label="$t('pagination.next')">›</a>
|
||||||
|
</li>
|
||||||
|
<li v-if="totalPages === page" class="page-item disabled" aria-disabled="true" :aria-label="$t('pagination.next')">
|
||||||
|
<span class="page-link" aria-hidden="true">›</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
<table class="table table-responsive table-hover">
|
<table class="table table-responsive table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -76,10 +97,10 @@
|
|||||||
>
|
>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="number" class="form-control" min="0" v-model="rate.rate">
|
<input type="number" class="form-control" min="0" step="any" v-model="rate.rate">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="number" class="form-control" min="0" v-model="rate.inverse">
|
<input type="number" class="form-control" min="0" step="any" v-model="rate.inverse">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
@@ -98,6 +119,28 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<nav v-if="totalPages > 1">
|
||||||
|
<ul class="pagination">
|
||||||
|
<li v-if="1 === this.page" class="page-item disabled" aria-disabled="true" :aria-label="$t('pagination.previous')">
|
||||||
|
<span class="page-link" aria-hidden="true">‹</span>
|
||||||
|
</li>
|
||||||
|
<li class="page-item" v-if="1 !== this.page">
|
||||||
|
<a class="page-link" :href="'/exchange-rates/'+from_code+'/'+to_code+'?page=' + (this.page-1)" rel="prev" :aria-label="$t('pagination.next')">‹</a>
|
||||||
|
</li>
|
||||||
|
<li v-for="item in this.totalPages" :class="item === page ? 'page-item active' : 'page-item'" aria-current="page">
|
||||||
|
<span v-if="item === page" class="page-link" v-text="item"></span>
|
||||||
|
<a v-if="item !== page" class="page-link" :href="'/exchange-rates/'+from_code+'/'+to_code+'?page=' + item" v-text="item"></a>
|
||||||
|
</li>
|
||||||
|
<li v-if="totalPages !== page" class="page-item">
|
||||||
|
<a class="page-link" :href="'/exchange-rates/'+from_code+'/'+to_code+'?page=' + (this.page+1)" rel="next" :aria-label="$t('pagination.next')">›</a>
|
||||||
|
</li>
|
||||||
|
<li v-if="totalPages === page" class="page-item disabled" aria-disabled="true" :aria-label="$t('pagination.next')">
|
||||||
|
<span class="page-link" aria-hidden="true">›</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -167,16 +210,26 @@ export default {
|
|||||||
loading: true,
|
loading: true,
|
||||||
posting: false,
|
posting: false,
|
||||||
updating: false,
|
updating: false,
|
||||||
|
page: 1,
|
||||||
|
totalPages: 1,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
// get from and to code from URL
|
// get from and to code from URL
|
||||||
this.newDate = format(new Date, 'yyyy-MM-dd');
|
this.newDate = format(new Date, 'yyyy-MM-dd');
|
||||||
let parts = window.location.href.split('/');
|
let parts = window.location.href.split('/');
|
||||||
this.from_code = parts[parts.length - 2].substring(0, 3);
|
this.from_code = parts[parts.length - 2];
|
||||||
this.to_code = parts[parts.length - 1].substring(0, 3);
|
this.to_code = parts[parts.length - 1];
|
||||||
|
|
||||||
|
const params = new Proxy(new URLSearchParams(window.location.search), {
|
||||||
|
get: (searchParams, prop) => searchParams.get(prop),
|
||||||
|
});
|
||||||
|
this.page = parseInt(params.page ?? 1);
|
||||||
|
|
||||||
|
|
||||||
this.downloadCurrencies();
|
this.downloadCurrencies();
|
||||||
this.downloadRates(1);
|
this.rates = [];
|
||||||
|
this.downloadRates(this.page);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
submitRate: function(e) {
|
submitRate: function(e) {
|
||||||
@@ -203,16 +256,11 @@ export default {
|
|||||||
return ('' === this.rates[index].rate && '' === this.rates[index].inverse) || this.updating;
|
return ('' === this.rates[index].rate && '' === this.rates[index].inverse) || this.updating;
|
||||||
},
|
},
|
||||||
updateRate: function (index) {
|
updateRate: function (index) {
|
||||||
// console.log('Update!');
|
|
||||||
// console.log(this.rates[index].key);
|
|
||||||
let parts = this.spliceKey(this.rates[index].key);
|
let parts = this.spliceKey(this.rates[index].key);
|
||||||
if (0 === parts.length) {
|
if (0 === parts.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ('' !== this.rates[index].rate) {
|
if ('' !== this.rates[index].rate) {
|
||||||
// update rate
|
|
||||||
// console.log('Rate is ' + this.rates[index].rate);
|
|
||||||
// console.log('ID is ' + this.rates[index].rate_id);
|
|
||||||
this.updating = true;
|
this.updating = true;
|
||||||
axios.put("./api/v1/exchange-rates/" + this.rates[index].rate_id, {rate: this.rates[index].rate})
|
axios.put("./api/v1/exchange-rates/" + this.rates[index].rate_id, {rate: this.rates[index].rate})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -220,9 +268,6 @@ export default {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if ('' !== this.rates[index].inverse) {
|
if ('' !== this.rates[index].inverse) {
|
||||||
// update inverse
|
|
||||||
// console.log('Inverse is ' + this.rates[index].inverse);
|
|
||||||
// console.log('Inverse ID is ' + this.rates[index].inverse_id);
|
|
||||||
this.updating = true;
|
this.updating = true;
|
||||||
axios.put("./api/v1/exchange-rates/" + this.rates[index].inverse_id, {rate: this.rates[index].inverse})
|
axios.put("./api/v1/exchange-rates/" + this.rates[index].inverse_id, {rate: this.rates[index].inverse})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -281,7 +326,6 @@ export default {
|
|||||||
},
|
},
|
||||||
downloadRates: function (page) {
|
downloadRates: function (page) {
|
||||||
this.tempRates = {};
|
this.tempRates = {};
|
||||||
this.rates = [];
|
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
axios.get("./api/v1/exchange-rates/rates/" + this.from_code + '/' + this.to_code + '?page=' + page).then((response) => {
|
axios.get("./api/v1/exchange-rates/rates/" + this.from_code + '/' + this.to_code + '?page=' + page).then((response) => {
|
||||||
for (let i in response.data.data) {
|
for (let i in response.data.data) {
|
||||||
@@ -334,13 +378,10 @@ export default {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (parseInt(response.data.meta.pagination.current_page) < parseInt(response.data.meta.pagination.total_pages)) {
|
this.totalPages = parseInt(response.data.meta.pagination.total_pages);
|
||||||
this.downloadRates(page + 1);
|
this.loading = false;
|
||||||
}
|
this.rates = Object.values(this.tempRates);
|
||||||
if (parseInt(response.data.meta.pagination.current_page) === parseInt(response.data.meta.pagination.total_pages)) {
|
// console.log('Do not download more pages. Now on page ' + this.page + ' of ' + this.totalPages);
|
||||||
this.loading = false;
|
|
||||||
this.rates = Object.values(this.tempRates);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
class="form-control"
|
class="form-control"
|
||||||
data-role="input"
|
data-role="input"
|
||||||
type="text"
|
type="text"
|
||||||
v-on:keypress="handleEnter"
|
|
||||||
v-on:submit.prevent>
|
v-on:submit.prevent>
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button
|
<button
|
||||||
@@ -217,7 +216,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
selectedItem: function (e) {
|
selectedItem: function (e) {
|
||||||
// console.log('In SelectedItem()');
|
console.log('In SelectedItem()');
|
||||||
if (typeof this.name === 'undefined') {
|
if (typeof this.name === 'undefined') {
|
||||||
// console.log('Is undefined');
|
// console.log('Is undefined');
|
||||||
return;
|
return;
|
||||||
@@ -239,12 +238,6 @@ export default {
|
|||||||
this.name = '';
|
this.name = '';
|
||||||
// some event?
|
// some event?
|
||||||
this.$emit('clear:value')
|
this.$emit('clear:value')
|
||||||
},
|
|
||||||
handleEnter: function (e) {
|
|
||||||
// TODO feels sloppy. Can be removed.
|
|
||||||
if (e.keyCode === 13) {
|
|
||||||
//e.preventDefault();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -922,6 +922,12 @@ export default {
|
|||||||
allowed_types: this.transactions[index].source_account.allowed_types,
|
allowed_types: this.transactions[index].source_account.allowed_types,
|
||||||
default_allowed_types: ['Asset account', 'Revenue account', 'Loan', 'Debt', 'Mortgage']
|
default_allowed_types: ['Asset account', 'Revenue account', 'Loan', 'Debt', 'Mortgage']
|
||||||
};
|
};
|
||||||
|
if(model.hasOwnProperty('account_currency_id') && null !== model.account_currency_id) {
|
||||||
|
this.transactions[index].source_account.currency_id = model.account_currency_id;
|
||||||
|
this.transactions[index].source_account.currency_name = model.account_currency_name;
|
||||||
|
this.transactions[index].source_account.currency_code = model.account_currency_code;
|
||||||
|
this.transactions[index].source_account.currency_decimal_places = model.account_currency_decimal_places;
|
||||||
|
}
|
||||||
|
|
||||||
// force types on destination selector.
|
// force types on destination selector.
|
||||||
this.transactions[index].destination_account.allowed_types = window.allowedOpposingTypes.source[model.type];
|
this.transactions[index].destination_account.allowed_types = window.allowedOpposingTypes.source[model.type];
|
||||||
@@ -946,6 +952,12 @@ export default {
|
|||||||
allowed_types: this.transactions[index].destination_account.allowed_types,
|
allowed_types: this.transactions[index].destination_account.allowed_types,
|
||||||
default_allowed_types: ['Asset account', 'Expense account', 'Loan', 'Debt', 'Mortgage']
|
default_allowed_types: ['Asset account', 'Expense account', 'Loan', 'Debt', 'Mortgage']
|
||||||
};
|
};
|
||||||
|
if(model.hasOwnProperty('account_currency_id') && null !== model.account_currency_id) {
|
||||||
|
this.transactions[index].destination_account.currency_id = model.account_currency_id;
|
||||||
|
this.transactions[index].destination_account.currency_name = model.account_currency_name;
|
||||||
|
this.transactions[index].destination_account.currency_code = model.account_currency_code;
|
||||||
|
this.transactions[index].destination_account.currency_decimal_places = model.account_currency_decimal_places;
|
||||||
|
}
|
||||||
|
|
||||||
// force types on destination selector.
|
// force types on destination selector.
|
||||||
this.transactions[index].source_account.allowed_types = window.allowedOpposingTypes.destination[model.type];
|
this.transactions[index].source_account.allowed_types = window.allowedOpposingTypes.destination[model.type];
|
||||||
|
|||||||
@@ -155,8 +155,8 @@
|
|||||||
v-bind:title="$t('form.foreign_amount')"
|
v-bind:title="$t('form.foreign_amount')"
|
||||||
></foreign-amount>
|
></foreign-amount>
|
||||||
<reconciled v-show="isReconciled"
|
<reconciled v-show="isReconciled"
|
||||||
v-model="transaction.reconciled"
|
v-model="transaction.reconciled"
|
||||||
:error="transaction.errors.reconciled"
|
:error="transaction.errors.reconciled"
|
||||||
></reconciled>
|
></reconciled>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
@@ -322,6 +322,12 @@ export default {
|
|||||||
currency_decimal_places: model.currency_decimal_places,
|
currency_decimal_places: model.currency_decimal_places,
|
||||||
allowed_types: this.transactions[index].source_account.allowed_types
|
allowed_types: this.transactions[index].source_account.allowed_types
|
||||||
};
|
};
|
||||||
|
if(model.hasOwnProperty('account_currency_id') && null !== model.account_currency_id) {
|
||||||
|
this.transactions[index].source_account.currency_id = model.account_currency_id;
|
||||||
|
this.transactions[index].source_account.currency_name = model.account_currency_name;
|
||||||
|
this.transactions[index].source_account.currency_code = model.account_currency_code;
|
||||||
|
this.transactions[index].source_account.currency_decimal_places = model.account_currency_decimal_places;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
selectedDestinationAccount(index, model) {
|
selectedDestinationAccount(index, model) {
|
||||||
if (typeof model === 'string') {
|
if (typeof model === 'string') {
|
||||||
@@ -341,6 +347,12 @@ export default {
|
|||||||
currency_decimal_places: model.currency_decimal_places,
|
currency_decimal_places: model.currency_decimal_places,
|
||||||
allowed_types: this.transactions[index].destination_account.allowed_types
|
allowed_types: this.transactions[index].destination_account.allowed_types
|
||||||
};
|
};
|
||||||
|
if(model.hasOwnProperty('account_currency_id') && null !== model.account_currency_id) {
|
||||||
|
this.transactions[index].destination_account.currency_id = model.account_currency_id;
|
||||||
|
this.transactions[index].destination_account.currency_name = model.account_currency_name;
|
||||||
|
this.transactions[index].destination_account.currency_code = model.account_currency_code;
|
||||||
|
this.transactions[index].destination_account.currency_decimal_places = model.account_currency_decimal_places;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
clearSource(index) {
|
clearSource(index) {
|
||||||
// reset source account:
|
// reset source account:
|
||||||
@@ -437,7 +449,7 @@ export default {
|
|||||||
//console.log('EditTransaction: processIncomingGroupRow()');
|
//console.log('EditTransaction: processIncomingGroupRow()');
|
||||||
this.setTransactionType(transaction.type);
|
this.setTransactionType(transaction.type);
|
||||||
|
|
||||||
if(true === transaction.reconciled) {
|
if (true === transaction.reconciled) {
|
||||||
this.isReconciled = true;
|
this.isReconciled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -528,7 +540,16 @@ export default {
|
|||||||
allowed_types: window.expectedSourceTypes.destination[this.ucFirst(transaction.type)]
|
allowed_types: window.expectedSourceTypes.destination[this.ucFirst(transaction.type)]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if(null === transaction.foreign_amount) {
|
// if transaction type is transfer, the destination currency_id etc. MUST match the actual account currency info.
|
||||||
|
if ('transfer' === transaction.type && null !== transaction.foreign_currency_code) {
|
||||||
|
result.destination_account.currency_id = transaction.foreign_currency_id;
|
||||||
|
result.destination_account.currency_name = transaction.foreign_currency_name;
|
||||||
|
result.destination_account.currency_code = transaction.foreign_currency_code;
|
||||||
|
result.destination_account.currency_decimal_places = transaction.foreign_currency_decimal_places;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (null === transaction.foreign_amount) {
|
||||||
result.foreign_amount.amount = '';
|
result.foreign_amount.amount = '';
|
||||||
}
|
}
|
||||||
this.transactions.push(result);
|
this.transactions.push(result);
|
||||||
@@ -736,7 +757,7 @@ export default {
|
|||||||
if (parseInt(row.piggy_bank) > 0) {
|
if (parseInt(row.piggy_bank) > 0) {
|
||||||
currentArray.piggy_bank_id = parseInt(row.piggy_bank);
|
currentArray.piggy_bank_id = parseInt(row.piggy_bank);
|
||||||
}
|
}
|
||||||
if(this.isReconciled && !this.storeAsNew && true === row.reconciled) {
|
if (this.isReconciled && !this.storeAsNew && true === row.reconciled) {
|
||||||
// drop content from array:
|
// drop content from array:
|
||||||
delete currentArray.source_id;
|
delete currentArray.source_id;
|
||||||
delete currentArray.source_name;
|
delete currentArray.source_name;
|
||||||
@@ -748,7 +769,7 @@ export default {
|
|||||||
delete currentArray.currency_id;
|
delete currentArray.currency_id;
|
||||||
currentArray.reconciled = true;
|
currentArray.reconciled = true;
|
||||||
}
|
}
|
||||||
if(true === row.isReconciled) {
|
if (true === row.isReconciled) {
|
||||||
this.isReconciled = false;
|
this.isReconciled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -801,10 +822,16 @@ export default {
|
|||||||
this.setDefaultErrors();
|
this.setDefaultErrors();
|
||||||
// do message if update or new:
|
// do message if update or new:
|
||||||
if (this.storeAsNew) {
|
if (this.storeAsNew) {
|
||||||
this.success_message = this.$t('firefly.transaction_new_stored_link', {ID: groupId, title: this.escapeHtml(title)});
|
this.success_message = this.$t('firefly.transaction_new_stored_link', {
|
||||||
|
ID: groupId,
|
||||||
|
title: this.escapeHtml(title)
|
||||||
|
});
|
||||||
this.error_message = '';
|
this.error_message = '';
|
||||||
} else {
|
} else {
|
||||||
this.success_message = this.$t('firefly.transaction_updated_link', {ID: groupId, title: this.escapeHtml(title)});
|
this.success_message = this.$t('firefly.transaction_updated_link', {
|
||||||
|
ID: groupId,
|
||||||
|
title: this.escapeHtml(title)
|
||||||
|
});
|
||||||
this.error_message = '';
|
this.error_message = '';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -19,205 +19,213 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<!--
|
<!--
|
||||||
Show if:
|
Show if:
|
||||||
- one or more currencies.
|
- one or more currencies.
|
||||||
-->
|
-->
|
||||||
<div v-if="this.enabledCurrencies.length >= 1" class="form-group" v-bind:class="{ 'has-error': hasError()}">
|
<div v-if="this.enabledCurrencies.length >= 1" class="form-group" v-bind:class="{ 'has-error': hasError()}">
|
||||||
<div class="col-sm-8 col-sm-offset-4 text-sm">
|
<div class="col-sm-8 col-sm-offset-4 text-sm">
|
||||||
{{ $t('form.foreign_amount') }}
|
{{ $t('form.foreign_amount') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<select ref="currency_select" class="form-control" name="foreign_currency[]" @input="handleInput">
|
<select ref="currency_select" class="form-control" name="foreign_currency[]" @input="handleInput">
|
||||||
<option
|
<option
|
||||||
v-for="currency in this.enabledCurrencies"
|
v-for="currency in this.enabledCurrencies"
|
||||||
:label="currency.attributes.name"
|
:label="currency.attributes.name"
|
||||||
:selected="parseInt(value.currency_id) === parseInt(currency.id)"
|
:selected="parseInt(value.currency_id) === parseInt(currency.id)"
|
||||||
:value="currency.id"
|
:value="currency.id"
|
||||||
|
|
||||||
>
|
>
|
||||||
{{ currency.attributes.name }}
|
{{ currency.attributes.name }}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input v-if="this.enabledCurrencies.length > 0" ref="amount" :placeholder="this.title" :title="this.title" :value="value.amount" autocomplete="off"
|
<input v-if="this.enabledCurrencies.length > 0" ref="amount" :placeholder="this.title"
|
||||||
class="form-control" name="foreign_amount[]"
|
:title="this.title" :value="value.amount" autocomplete="off"
|
||||||
step="any" type="number" @input="handleInput">
|
class="form-control" name="foreign_amount[]"
|
||||||
<span class="input-group-btn">
|
step="any" type="number" @input="handleInput">
|
||||||
|
<span class="input-group-btn">
|
||||||
<button
|
<button
|
||||||
class="btn btn-default"
|
class="btn btn-default"
|
||||||
tabIndex="-1"
|
tabIndex="-1"
|
||||||
type="button"
|
type="button"
|
||||||
v-on:click="clearAmount"><i class="fa fa-trash-o"></i></button>
|
v-on:click="clearAmount"><i class="fa fa-trash-o"></i></button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<ul v-for="error in this.error" class="list-unstyled">
|
<ul v-for="error in this.error" class="list-unstyled">
|
||||||
<li class="text-danger">{{ error }}</li>
|
<li class="text-danger">{{ error }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: "ForeignAmountSelect",
|
name: "ForeignAmountSelect",
|
||||||
|
|
||||||
props: ['source', 'destination', 'transactionType', 'value', 'error', 'no_currency', 'title',],
|
props: ['source', 'destination', 'transactionType', 'value', 'error', 'no_currency', 'title',],
|
||||||
mounted() {
|
mounted() {
|
||||||
this.liability = false;
|
this.liability = false;
|
||||||
this.loadCurrencies();
|
// console.log('I am mounted with a ' + this.transactionType + ' transaction type and currency id!');
|
||||||
|
// console.log(this.value);
|
||||||
|
this.loadCurrencies();
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
currencies: [],
|
||||||
|
enabledCurrencies: [],
|
||||||
|
exclude: null,
|
||||||
|
// liability overrules the drop-down list if the source or dest is a liability
|
||||||
|
liability: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
source: function () {
|
||||||
|
// console.log('ForeignAmountSelect watch source');
|
||||||
|
this.changeData();
|
||||||
|
},
|
||||||
|
destination: function () {
|
||||||
|
// console.log('ForeignAmountSelect watch destination');
|
||||||
|
this.changeData();
|
||||||
|
},
|
||||||
|
transactionType: function () {
|
||||||
|
// console.log('ForeignAmountSelect watch transaction type (is now ' + this.transactionType + ')');
|
||||||
|
this.changeData();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
clearAmount: function () {
|
||||||
|
this.$refs.amount.value = '';
|
||||||
|
this.$emit('input', this.$refs.amount.value);
|
||||||
|
// some event?
|
||||||
|
this.$emit('clear:amount')
|
||||||
|
},
|
||||||
|
hasError: function () {
|
||||||
|
//console.log('ForeignAmountSelect hasError');
|
||||||
|
return this.error.length > 0;
|
||||||
|
},
|
||||||
|
handleInput(e) {
|
||||||
|
// console.log('ForeignAmountSelect handleInput');
|
||||||
|
let obj = {
|
||||||
|
amount: this.$refs.amount.value,
|
||||||
|
currency_id: this.$refs.currency_select.value,
|
||||||
|
};
|
||||||
|
// console.log(obj);
|
||||||
|
this.$emit('input', obj
|
||||||
|
);
|
||||||
|
},
|
||||||
|
changeData: function () {
|
||||||
|
// console.log('ForeignAmountSelect changeData');
|
||||||
|
this.enabledCurrencies = [];
|
||||||
|
let destType = this.destination.type ? this.destination.type.toLowerCase() : 'invalid';
|
||||||
|
let srcType = this.source.type ? this.source.type.toLowerCase() : 'invalid';
|
||||||
|
let tType = this.transactionType ? this.transactionType.toLowerCase() : 'invalid';
|
||||||
|
let liabilities = ['loan', 'debt', 'mortgage'];
|
||||||
|
let sourceIsLiability = liabilities.indexOf(srcType) !== -1;
|
||||||
|
let destIsLiability = liabilities.indexOf(destType) !== -1;
|
||||||
|
|
||||||
},
|
// console.log(srcType + ' (source) is a liability: ' + sourceIsLiability);
|
||||||
data() {
|
// console.log(destType + ' (dest) is a liability: ' + destIsLiability);
|
||||||
return {
|
// console.log('tType: ' + tType);
|
||||||
currencies: [],
|
if (tType === 'transfer' || destIsLiability || sourceIsLiability) {
|
||||||
enabledCurrencies: [],
|
// console.log('Source is liability OR dest is liability, OR transfer. Lock list on currency of destination.');
|
||||||
exclude: null,
|
// console.log('Length of currencies is ' + this.currencies.length);
|
||||||
// liability overrules the drop down list if the source or dest is a liability
|
// console.log(this.currencies);
|
||||||
liability: false
|
this.liability = true;
|
||||||
|
// lock dropdown list on currencyID of destination.
|
||||||
|
for (const key in this.currencies) {
|
||||||
|
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||||
|
|
||||||
|
if (
|
||||||
|
parseInt(this.currencies[key].id) === parseInt(this.destination.currency_id)
|
||||||
|
) {
|
||||||
|
// console.log('Enable currency!!');
|
||||||
|
// console.log(this.destination);
|
||||||
|
// console.log(this.currencies[key]);
|
||||||
|
this.enabledCurrencies.push(this.currencies[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// console.log('Enabled currencies length is now ' + this.enabledCurrencies.length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if type is withdrawal, list all but skip the source account ID.
|
||||||
|
if (tType === 'withdrawal' && this.source && false === sourceIsLiability) {
|
||||||
|
for (const key in this.currencies) {
|
||||||
|
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||||
|
if (this.source.currency_id !== this.currencies[key].id) {
|
||||||
|
this.enabledCurrencies.push(this.currencies[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if type is deposit, list all but skip the source account ID.
|
||||||
|
if (tType === 'deposit' && this.destination) {
|
||||||
|
for (const key in this.currencies) {
|
||||||
|
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||||
|
if (this.destination.currency_id !== this.currencies[key].id) {
|
||||||
|
this.enabledCurrencies.push(this.currencies[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (const key in this.currencies) {
|
||||||
|
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||||
|
this.enabledCurrencies.push(this.currencies[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
loadCurrencies: function () {
|
||||||
|
// console.log('loadCurrencies');
|
||||||
|
// reset list of currencies:
|
||||||
|
this.currencies = [
|
||||||
|
{
|
||||||
|
id: 0,
|
||||||
|
attributes: {
|
||||||
|
name: this.no_currency,
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
this.enabledCurrencies = [
|
||||||
|
{
|
||||||
|
attributes: {
|
||||||
|
name: this.no_currency,
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
id: 0,
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
this.getCurrencies(1);
|
||||||
|
},
|
||||||
|
getCurrencies: function (page) {
|
||||||
|
let url = document.getElementsByTagName('base')[0].href + "api/v1/currencies?page=" + page;
|
||||||
|
axios.get(url, {}).then((res) => {
|
||||||
|
|
||||||
|
for (const key in res.data.data) {
|
||||||
|
if (res.data.data.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||||
|
if (res.data.data[key].attributes.enabled) {
|
||||||
|
// console.log(res.data.data[key].attributes);
|
||||||
|
this.currencies.push(res.data.data[key]);
|
||||||
|
this.enabledCurrencies.push(res.data.data[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (res.data.meta.pagination.current_page < res.data.meta.pagination.total_pages) {
|
||||||
|
this.getCurrencies(res.data.meta.pagination.current_page + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.changeData();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
source: function () {
|
|
||||||
//console.log('ForeignAmountSelect watch source');
|
|
||||||
this.changeData();
|
|
||||||
},
|
|
||||||
destination: function () {
|
|
||||||
//console.log('ForeignAmountSelect watch destination');
|
|
||||||
this.changeData();
|
|
||||||
},
|
|
||||||
transactionType: function () {
|
|
||||||
//console.log('ForeignAmountSelect watch transaction type (is now ' + this.transactionType + ')');
|
|
||||||
this.changeData();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
clearAmount: function () {
|
|
||||||
this.$refs.amount.value = '';
|
|
||||||
this.$emit('input', this.$refs.amount.value);
|
|
||||||
// some event?
|
|
||||||
this.$emit('clear:amount')
|
|
||||||
},
|
|
||||||
hasError: function () {
|
|
||||||
//console.log('ForeignAmountSelect hasError');
|
|
||||||
return this.error.length > 0;
|
|
||||||
},
|
|
||||||
handleInput(e) {
|
|
||||||
//console.log('ForeignAmountSelect handleInput');
|
|
||||||
let obj = {
|
|
||||||
amount: this.$refs.amount.value,
|
|
||||||
currency_id: this.$refs.currency_select.value,
|
|
||||||
};
|
|
||||||
// console.log(obj);
|
|
||||||
this.$emit('input', obj
|
|
||||||
);
|
|
||||||
},
|
|
||||||
changeData: function () {
|
|
||||||
// console.log('ForeignAmountSelect changeData');
|
|
||||||
this.enabledCurrencies = [];
|
|
||||||
let destType = this.destination.type ? this.destination.type.toLowerCase() : 'invalid';
|
|
||||||
let srcType = this.source.type ? this.source.type.toLowerCase() : 'invalid';
|
|
||||||
let tType = this.transactionType ? this.transactionType.toLowerCase() : 'invalid';
|
|
||||||
let liabilities = ['loan', 'debt', 'mortgage'];
|
|
||||||
let sourceIsLiability = liabilities.indexOf(srcType) !== -1;
|
|
||||||
let destIsLiability = liabilities.indexOf(destType) !== -1;
|
|
||||||
|
|
||||||
// console.log(srcType + ' (source) is a liability: ' + sourceIsLiability);
|
|
||||||
// console.log(destType + ' (dest) is a liability: ' + destIsLiability);
|
|
||||||
|
|
||||||
if (tType === 'transfer' || destIsLiability || sourceIsLiability) {
|
|
||||||
// console.log('Source is liability OR dest is liability, OR transfer. Lock list on currency of destination.');
|
|
||||||
// console.log('Length of currencies is ' + this.currencies.length);
|
|
||||||
// console.log(this.currencies);
|
|
||||||
this.liability = true;
|
|
||||||
// lock dropdown list on currencyID of destination.
|
|
||||||
for (const key in this.currencies) {
|
|
||||||
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
|
||||||
// console.log('this.currencies[key].id = ' + this.currencies[key].id);
|
|
||||||
// console.log('this.destination.currency_id = ' + this.destination.currency_id);
|
|
||||||
if (parseInt(this.currencies[key].id) === parseInt(this.destination.currency_id)) {
|
|
||||||
this.enabledCurrencies.push(this.currencies[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// console.log('Enabled currencies length is now ' + this.enabledCurrencies.length);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if type is withdrawal, list all but skip the source account ID.
|
|
||||||
if (tType === 'withdrawal' && this.source && false === sourceIsLiability) {
|
|
||||||
for (const key in this.currencies) {
|
|
||||||
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
|
||||||
if (this.source.currency_id !== this.currencies[key].id) {
|
|
||||||
this.enabledCurrencies.push(this.currencies[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if type is deposit, list all but skip the source account ID.
|
|
||||||
if (tType === 'deposit' && this.destination) {
|
|
||||||
for (const key in this.currencies) {
|
|
||||||
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
|
||||||
if (this.destination.currency_id !== this.currencies[key].id) {
|
|
||||||
this.enabledCurrencies.push(this.currencies[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (const key in this.currencies) {
|
|
||||||
if (this.currencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
|
||||||
this.enabledCurrencies.push(this.currencies[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
loadCurrencies: function () {
|
|
||||||
// reset list of currencies:
|
|
||||||
this.currencies = [
|
|
||||||
{
|
|
||||||
id: 0,
|
|
||||||
attributes: {
|
|
||||||
name: this.no_currency,
|
|
||||||
enabled: true
|
|
||||||
},
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
this.enabledCurrencies = [
|
|
||||||
{
|
|
||||||
attributes: {
|
|
||||||
name: this.no_currency,
|
|
||||||
enabled: true
|
|
||||||
},
|
|
||||||
id: 0,
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
this.getCurrencies(1);
|
|
||||||
},
|
|
||||||
getCurrencies: function(page) {
|
|
||||||
// console.log('loadCurrencies on page ' + page);
|
|
||||||
let url = document.getElementsByTagName('base')[0].href + "api/v1/currencies?page=" + page;
|
|
||||||
axios.get(url, {}).then((res) => {
|
|
||||||
|
|
||||||
for (const key in res.data.data) {
|
|
||||||
if (res.data.data.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
|
||||||
if (res.data.data[key].attributes.enabled) {
|
|
||||||
// console.log(res.data.data[key].attributes);
|
|
||||||
this.currencies.push(res.data.data[key]);
|
|
||||||
this.enabledCurrencies.push(res.data.data[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(res.data.meta.pagination.current_page < res.data.meta.pagination.total_pages) {
|
|
||||||
this.getCurrencies(res.data.meta.pagination.current_page + 1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "\u0420\u0430\u0437\u0434\u0435\u043b\u0438",
|
"split": "\u0420\u0430\u0437\u0434\u0435\u043b\u0438",
|
||||||
"single_split": "\u0420\u0430\u0437\u0434\u0435\u043b",
|
"single_split": "\u0420\u0430\u0437\u0434\u0435\u043b",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f #{ID}(\"{title}\")<\/a> \u0431\u0435\u0448\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f #{ID}(\"{title}\")<\/a> \u0431\u0435\u0448\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Dividir",
|
"split": "Dividir",
|
||||||
"single_split": "Divisi\u00f3",
|
"single_split": "Divisi\u00f3",
|
||||||
|
"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": "La <a href=\"transactions\/show\/{ID}\">Transacci\u00f3 #{ID} (\"{title}\")<\/a> s'ha desat.",
|
"transaction_stored_link": "La <a href=\"transactions\/show\/{ID}\">Transacci\u00f3 #{ID} (\"{title}\")<\/a> s'ha desat.",
|
||||||
"webhook_stored_link": "S'ha desat <a href=\"webhooks\/show\/{ID}\">el Webook #{ID} (\"{title}\")<\/a> correctament.",
|
"webhook_stored_link": "S'ha desat <a href=\"webhooks\/show\/{ID}\">el Webook #{ID} (\"{title}\")<\/a> correctament.",
|
||||||
"webhook_updated_link": "S'ha actualitzat el <a href=\"webhooks\/show\/{ID}\">Webook #{ID}<\/a> (\"{title}\").",
|
"webhook_updated_link": "S'ha actualitzat el <a href=\"webhooks\/show\/{ID}\">Webook #{ID}<\/a> (\"{title}\").",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visitar l'URL del webhook",
|
"visit_webhook_url": "Visitar l'URL del webhook",
|
||||||
"reset_webhook_secret": "Reiniciar el secret del webhook",
|
"reset_webhook_secret": "Reiniciar el secret del webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Rozd\u011blit",
|
"split": "Rozd\u011blit",
|
||||||
"single_split": "Rozd\u011blit",
|
"single_split": "Rozd\u011blit",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> byl ulo\u017een.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> byl ulo\u017een.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") byl aktualizov\u00e1n.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") byl aktualizov\u00e1n.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Nav\u0161t\u00edvit URL webhooku",
|
"visit_webhook_url": "Nav\u0161t\u00edvit URL webhooku",
|
||||||
"reset_webhook_secret": "Restartovat tajn\u00fd kl\u00ed\u010d webhooku",
|
"reset_webhook_secret": "Restartovat tajn\u00fd kl\u00ed\u010d webhooku",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Opdel",
|
"split": "Opdel",
|
||||||
"single_split": "Opdel",
|
"single_split": "Opdel",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Bes\u00f8g webhook-URL",
|
"visit_webhook_url": "Bes\u00f8g webhook-URL",
|
||||||
"reset_webhook_secret": "Nulstil webhook-hemmelighed",
|
"reset_webhook_secret": "Nulstil webhook-hemmelighed",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Ist abgestimmt",
|
"is_reconciled": "Ist abgestimmt",
|
||||||
"split": "Teilen",
|
"split": "Teilen",
|
||||||
"single_split": "Teilen",
|
"single_split": "Teilen",
|
||||||
|
"not_enough_currencies": "Nicht gen\u00fcgend W\u00e4hrungen",
|
||||||
|
"not_enough_currencies_enabled": "Wenn Sie nur eine W\u00e4hrung aktiviert haben, ist es nicht erforderlich, Wechselkurse hinzuzuf\u00fcgen.",
|
||||||
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Buchung #{ID} (\"{title}\")<\/a> wurde gespeichert.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Buchung #{ID} (\"{title}\")<\/a> wurde gespeichert.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> wurde gespeichert.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> wurde gespeichert.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") wurde aktualisiert.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") wurde aktualisiert.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Webhook-URL besuchen",
|
"visit_webhook_url": "Webhook-URL besuchen",
|
||||||
"reset_webhook_secret": "Webhook Secret zur\u00fccksetzen",
|
"reset_webhook_secret": "Webhook Secret zur\u00fccksetzen",
|
||||||
"header_exchange_rates": "Wechselkurse",
|
"header_exchange_rates": "Wechselkurse",
|
||||||
"exchange_rates_intro": "Firefly III unterst\u00fctzt das Herunterladen und Verwenden von Wechselkursen. Lesen Sie mehr dar\u00fcber in <a href=\u201ehttps:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\u201c>der Dokumentation<\/a>.",
|
"exchange_rates_intro": "Firefly III unterst\u00fctzt das Herunterladen und Verwenden von Wechselkursen. Lesen Sie mehr dar\u00fcber in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\"> der Dokumentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Zwischen {from} und {to} (und umgekehrt)",
|
"exchange_rates_from_to": "Zwischen {from} und {to} (und umgekehrt)",
|
||||||
"exchange_rates_intro_rates": "Firefly III verwendet die folgenden Wechselkurse. Der Kehrwert wird automatisch berechnet, wenn er nicht angegeben wurde. Wenn f\u00fcr das Datum der Transaktion kein Wechselkurs vorhanden ist, sucht Firefly III in der Vergangenheit nach einem Kurs. Wenn keine vorhanden sind, wird der Kurs \u201e1\u201c verwendet.",
|
"exchange_rates_intro_rates": "Firefly III verwendet die folgenden Wechselkurse. Der Kehrwert wird automatisch berechnet, wenn er nicht angegeben wurde. Wenn f\u00fcr das Datum der Transaktion kein Wechselkurs vorhanden ist, sucht Firefly III in der Vergangenheit nach einem Kurs. Wenn keine vorhanden sind, wird der Kurs \u201e1\u201c verwendet.",
|
||||||
"header_exchange_rates_rates": "Wechselkurse",
|
"header_exchange_rates_rates": "Wechselkurse",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2",
|
"split": "\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2",
|
||||||
"single_split": "\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2",
|
"single_split": "\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">\u0397 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae #{ID} (\"{title}\")<\/a> \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03c4\u03b5\u03af.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0397 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae #{ID} (\"{title}\")<\/a> \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03c4\u03b5\u03af.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03c4\u03b5\u03af.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03c4\u03b5\u03af.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u03a4\u03bf Webhook #{ID}<\/a> (\"{title}\") \u03ad\u03c7\u03b5\u03b9 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03c9\u03b8\u03b5\u03af.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u03a4\u03bf Webhook #{ID}<\/a> (\"{title}\") \u03ad\u03c7\u03b5\u03b9 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03c9\u03b8\u03b5\u03af.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "\u0395\u03c0\u03b9\u03c3\u03ba\u03b5\u03c6\u03b8\u03b5\u03af\u03c4\u03b5 \u03c4\u03bf URL \u03c4\u03bf\u03c5 webhook",
|
"visit_webhook_url": "\u0395\u03c0\u03b9\u03c3\u03ba\u03b5\u03c6\u03b8\u03b5\u03af\u03c4\u03b5 \u03c4\u03bf URL \u03c4\u03bf\u03c5 webhook",
|
||||||
"reset_webhook_secret": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03bc\u03c5\u03c3\u03c4\u03b9\u03ba\u03bf\u03cd webhook",
|
"reset_webhook_secret": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03bc\u03c5\u03c3\u03c4\u03b9\u03ba\u03bf\u03cd webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Split",
|
"split": "Split",
|
||||||
"single_split": "Split",
|
"single_split": "Split",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Split",
|
"split": "Split",
|
||||||
"single_split": "Split",
|
"single_split": "Split",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Separar",
|
"split": "Separar",
|
||||||
"single_split": "Divisi\u00f3n",
|
"single_split": "Divisi\u00f3n",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">La transacci\u00f3n #{ID} (\"{title}\")<\/a> ha sido almacenada.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">La transacci\u00f3n #{ID} (\"{title}\")<\/a> ha sido almacenada.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido almacenado.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido almacenado.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido actualizado.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido actualizado.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visita la URL del webhook",
|
"visit_webhook_url": "Visita la URL del webhook",
|
||||||
"reset_webhook_secret": "Restablecer secreto del webhook",
|
"reset_webhook_secret": "Restablecer secreto del webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Jaa",
|
"split": "Jaa",
|
||||||
"single_split": "Jako",
|
"single_split": "Jako",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Tapahtuma #{ID} (\"{title}\")<\/a> on tallennettu.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Tapahtuma #{ID} (\"{title}\")<\/a> on tallennettu.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Est rapproch\u00e9",
|
"is_reconciled": "Est rapproch\u00e9",
|
||||||
"split": "S\u00e9paration",
|
"split": "S\u00e9paration",
|
||||||
"single_split": "S\u00e9paration unique",
|
"single_split": "S\u00e9paration unique",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">L'op\u00e9ration n\u00b0{ID} (\"{title}\")<\/a> a \u00e9t\u00e9 enregistr\u00e9e.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">L'op\u00e9ration n\u00b0{ID} (\"{title}\")<\/a> a \u00e9t\u00e9 enregistr\u00e9e.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Le Webhook #{ID} (\"{title}\")<\/a> a \u00e9t\u00e9 enregistr\u00e9.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Le Webhook #{ID} (\"{title}\")<\/a> a \u00e9t\u00e9 enregistr\u00e9.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Le webhook #{ID}<\/a> (\"{title}\") a \u00e9t\u00e9 mis \u00e0 jour.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Le webhook #{ID}<\/a> (\"{title}\") a \u00e9t\u00e9 mis \u00e0 jour.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visiter l'URL du webhook",
|
"visit_webhook_url": "Visiter l'URL du webhook",
|
||||||
"reset_webhook_secret": "R\u00e9initialiser le secret du webhook",
|
"reset_webhook_secret": "R\u00e9initialiser le secret du webhook",
|
||||||
"header_exchange_rates": "Taux de change",
|
"header_exchange_rates": "Taux de change",
|
||||||
"exchange_rates_intro": "Firefly III prend en charge le chargement et l'utilisation des taux de change. En savoir plus \u00e0 ce sujet dans <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">la documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III prend en charge le chargement et l'utilisation des taux de change. En savoir plus \u00e0 ce sujet dans <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">la documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Entre {from} et {to} (et l'inverse)",
|
"exchange_rates_from_to": "Entre {from} et {to} (et l'inverse)",
|
||||||
"exchange_rates_intro_rates": "Firefly III utilise les taux de change suivants. L'inverse est calcul\u00e9 automatiquement lorsqu'il n'est pas fourni. Si aucun taux de change n'existe pour la date de la transaction, Firefly III reviendra dans le temps pour en trouver un. Si aucun n'est pr\u00e9sent, le taux \"1\" sera utilis\u00e9.",
|
"exchange_rates_intro_rates": "Firefly III utilise les taux de change suivants. L'inverse est calcul\u00e9 automatiquement lorsqu'il n'est pas fourni. Si aucun taux de change n'existe pour la date de la transaction, Firefly III reviendra dans le temps pour en trouver un. Si aucun n'est pr\u00e9sent, le taux \"1\" sera utilis\u00e9.",
|
||||||
"header_exchange_rates_rates": "Taux de change",
|
"header_exchange_rates_rates": "Taux de change",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Feloszt\u00e1s",
|
"split": "Feloszt\u00e1s",
|
||||||
"single_split": "Feloszt\u00e1s",
|
"single_split": "Feloszt\u00e1s",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> mentve.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> mentve.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> elt\u00e1rolva.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> elt\u00e1rolva.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") friss\u00edtve.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") friss\u00edtve.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Webhook URL megl\u00e1togat\u00e1sa",
|
"visit_webhook_url": "Webhook URL megl\u00e1togat\u00e1sa",
|
||||||
"reset_webhook_secret": "Webhook titok vissza\u00e1ll\u00edt\u00e1sa",
|
"reset_webhook_secret": "Webhook titok vissza\u00e1ll\u00edt\u00e1sa",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Pisah",
|
"split": "Pisah",
|
||||||
"single_split": "Pisah",
|
"single_split": "Pisah",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Dividi",
|
"split": "Dividi",
|
||||||
"single_split": "Divisione",
|
"single_split": "Divisione",
|
||||||
|
"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": "La <a href=\"transactions\/show\/{ID}\">transazione #{ID} (\"{title}\")<\/a> \u00e8 stata salvata.",
|
"transaction_stored_link": "La <a href=\"transactions\/show\/{ID}\">transazione #{ID} (\"{title}\")<\/a> \u00e8 stata salvata.",
|
||||||
"webhook_stored_link": "Il <a href=\"webhooks\/show\/{ID}\">webhook #{ID} (\"{title}\")<\/a> \u00e8 stato archiviato.",
|
"webhook_stored_link": "Il <a href=\"webhooks\/show\/{ID}\">webhook #{ID} (\"{title}\")<\/a> \u00e8 stato archiviato.",
|
||||||
"webhook_updated_link": "Il <a href=\"webhooks\/show\/{ID}\">webhook #{ID} (\"{title}\")<\/a> \u00e8 stato aggiornato.",
|
"webhook_updated_link": "Il <a href=\"webhooks\/show\/{ID}\">webhook #{ID} (\"{title}\")<\/a> \u00e8 stato aggiornato.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visita URL webhook",
|
"visit_webhook_url": "Visita URL webhook",
|
||||||
"reset_webhook_secret": "Reimposta il segreto del webhook",
|
"reset_webhook_secret": "Reimposta il segreto del webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "\u5206\u5272",
|
"split": "\u5206\u5272",
|
||||||
"single_split": "\u5206\u5272",
|
"single_split": "\u5206\u5272",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">\u53d6\u5f15 #{ID}\u300c{title}\u300d<\/a> \u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u53d6\u5f15 #{ID}\u300c{title}\u300d<\/a> \u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Webhook\u306eURL\u3092\u958b\u304f",
|
"visit_webhook_url": "Webhook\u306eURL\u3092\u958b\u304f",
|
||||||
"reset_webhook_secret": "Webhook\u306e\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u3092\u30ea\u30bb\u30c3\u30c8",
|
"reset_webhook_secret": "Webhook\u306e\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u3092\u30ea\u30bb\u30c3\u30c8",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "\ub098\ub204\uae30",
|
"split": "\ub098\ub204\uae30",
|
||||||
"single_split": "\ub098\ub204\uae30",
|
"single_split": "\ub098\ub204\uae30",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">\uac70\ub798 #{ID} (\"{title}\")<\/a>\uac00 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\uac70\ub798 #{ID} (\"{title}\")<\/a>\uac00 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\uc6f9\ud6c5 #{ID} (\"{title}\")<\/a>\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\uc6f9\ud6c5 #{ID} (\"{title}\")<\/a>\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\uc6f9\ud6c5 #{ID}<\/a> (\"{title}\")\uc774 \uc5c5\ub370\uc774\ud2b8 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\uc6f9\ud6c5 #{ID}<\/a> (\"{title}\")\uc774 \uc5c5\ub370\uc774\ud2b8 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "\uc6f9\ud6c5 URL \ubc29\ubb38",
|
"visit_webhook_url": "\uc6f9\ud6c5 URL \ubc29\ubb38",
|
||||||
"reset_webhook_secret": "\uc6f9\ud6c5 \uc2dc\ud06c\ub9bf \uc7ac\uc124\uc815",
|
"reset_webhook_secret": "\uc6f9\ud6c5 \uc2dc\ud06c\ub9bf \uc7ac\uc124\uc815",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Del opp",
|
"split": "Del opp",
|
||||||
"single_split": "Del opp",
|
"single_split": "Del opp",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaksjon #{ID} (\"{title}\")<\/a> har blitt lagret.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaksjon #{ID} (\"{title}\")<\/a> har blitt lagret.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> er lagret.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> er lagret.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") er oppdatert.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") er oppdatert.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Bes\u00f8k URL til webhook",
|
"visit_webhook_url": "Bes\u00f8k URL til webhook",
|
||||||
"reset_webhook_secret": "Tilbakestill Webhook n\u00f8kkel",
|
"reset_webhook_secret": "Tilbakestill Webhook n\u00f8kkel",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is afgestemd",
|
"is_reconciled": "Is afgestemd",
|
||||||
"split": "Splitsen",
|
"split": "Splitsen",
|
||||||
"single_split": "Split",
|
"single_split": "Split",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transactie #{ID} (\"{title}\")<\/a> is opgeslagen.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transactie #{ID} (\"{title}\")<\/a> is opgeslagen.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} ({title})<\/a> is opgeslagen.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} ({title})<\/a> is opgeslagen.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} ({title})<\/a> is ge\u00fcpdatet.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} ({title})<\/a> is ge\u00fcpdatet.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Bezoek URL van webhook",
|
"visit_webhook_url": "Bezoek URL van webhook",
|
||||||
"reset_webhook_secret": "Reset webhook-geheim",
|
"reset_webhook_secret": "Reset webhook-geheim",
|
||||||
"header_exchange_rates": "Wisselkoersen",
|
"header_exchange_rates": "Wisselkoersen",
|
||||||
"exchange_rates_intro": "Firefly III kan wisselkoersen downloaden en gebruiken. Lees hier meer over in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">de documentatie<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Tussen {from} en {to} (en andersom)",
|
"exchange_rates_from_to": "Tussen {from} en {to} (en andersom)",
|
||||||
"exchange_rates_intro_rates": "Firefly III gebruikt de volgende wisselkoersen. De inverse berekent zichzelf als deze niet is opgegeven. Als er geen wisselkoers bestaat voor de datum van de transactie, gaat Firefly III terug in de tijd om er een te vinden. Als er geen aanwezig is, zal de koers \"1\" gebruikt worden.",
|
"exchange_rates_intro_rates": "Firefly III gebruikt de volgende wisselkoersen. De inverse berekent zichzelf als deze niet is opgegeven. Als er geen wisselkoers bestaat voor de datum van de transactie, gaat Firefly III terug in de tijd om er een te vinden. Als er geen aanwezig is, zal de koers \"1\" gebruikt worden.",
|
||||||
"header_exchange_rates_rates": "Wisselkoersen",
|
"header_exchange_rates_rates": "Wisselkoersen",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Del opp",
|
"split": "Del opp",
|
||||||
"single_split": "Del opp",
|
"single_split": "Del opp",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaksjon #{ID} (\"{title}\")<\/a> har vorte lagra.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaksjon #{ID} (\"{title}\")<\/a> har vorte lagra.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> er lagra.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> er lagra.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") er oppdatert.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") er oppdatert.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Bes\u00f8k URL til webhook",
|
"visit_webhook_url": "Bes\u00f8k URL til webhook",
|
||||||
"reset_webhook_secret": "Tilbakestill Webhook hemmelegheit",
|
"reset_webhook_secret": "Tilbakestill Webhook hemmelegheit",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Podziel",
|
"split": "Podziel",
|
||||||
"single_split": "Podzia\u0142",
|
"single_split": "Podzia\u0142",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transakcja #{ID} (\"{title}\")<\/a> zosta\u0142a zapisana.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transakcja #{ID} (\"{title}\")<\/a> zosta\u0142a zapisana.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> zosta\u0142 zapisany.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> zosta\u0142 zapisany.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") zosta\u0142 zaktualizowany.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") zosta\u0142 zaktualizowany.",
|
||||||
@@ -28,7 +30,7 @@
|
|||||||
"apply_rules_checkbox": "Zastosuj regu\u0142y",
|
"apply_rules_checkbox": "Zastosuj regu\u0142y",
|
||||||
"fire_webhooks_checkbox": "Uruchom webhooki",
|
"fire_webhooks_checkbox": "Uruchom webhooki",
|
||||||
"no_budget_pointer": "Wygl\u0105da na to, \u017ce nie masz jeszcze bud\u017cet\u00f3w. Powiniene\u015b utworzy\u0107 kilka na stronie <a href=\"budgets\">bud\u017cet\u00f3w<\/a>. Bud\u017cety mog\u0105 Ci pom\u00f3c \u015bledzi\u0107 wydatki.",
|
"no_budget_pointer": "Wygl\u0105da na to, \u017ce nie masz jeszcze bud\u017cet\u00f3w. Powiniene\u015b utworzy\u0107 kilka na stronie <a href=\"budgets\">bud\u017cet\u00f3w<\/a>. Bud\u017cety mog\u0105 Ci pom\u00f3c \u015bledzi\u0107 wydatki.",
|
||||||
"no_bill_pointer": "You seem to have no subscription yet. You should create some on the <a href=\"subscriptions\">subscription<\/a>-page. Subscriptions can help you keep track of expenses.",
|
"no_bill_pointer": "Wygl\u0105da na to, \u017ce nie masz jeszcze subskrypcji. Powiniene\u015b utworzy\u0107 j\u0105 na stronie <a href=\"subscriptions\">subskrypcji<\/a>. Subskrypcje mog\u0105 pom\u00f3c Ci \u015bledzi\u0107 wydatki.",
|
||||||
"source_account": "Konto \u017ar\u00f3d\u0142owe",
|
"source_account": "Konto \u017ar\u00f3d\u0142owe",
|
||||||
"hidden_fields_preferences": "Mo\u017cesz w\u0142\u0105czy\u0107 wi\u0119cej opcji transakcji w swoich <a href=\"preferences\">ustawieniach<\/a>.",
|
"hidden_fields_preferences": "Mo\u017cesz w\u0142\u0105czy\u0107 wi\u0119cej opcji transakcji w swoich <a href=\"preferences\">ustawieniach<\/a>.",
|
||||||
"destination_account": "Konto docelowe",
|
"destination_account": "Konto docelowe",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Odwied\u017a adres URL webhooka",
|
"visit_webhook_url": "Odwied\u017a adres URL webhooka",
|
||||||
"reset_webhook_secret": "Resetuj sekret webhooka",
|
"reset_webhook_secret": "Resetuj sekret webhooka",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
@@ -151,7 +153,7 @@
|
|||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Aktywny",
|
"active": "Aktywny",
|
||||||
"interest_date": "Data odsetek",
|
"interest_date": "Data odsetek",
|
||||||
"administration_currency": "Native currency",
|
"administration_currency": "Waluta natywna",
|
||||||
"title": "Tytu\u0142",
|
"title": "Tytu\u0142",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"book_date": "Data ksi\u0119gowania",
|
"book_date": "Data ksi\u0119gowania",
|
||||||
@@ -166,12 +168,12 @@
|
|||||||
"webhook_delivery": "Dor\u0119czenie",
|
"webhook_delivery": "Dor\u0119czenie",
|
||||||
"from_currency_to_currency": "{from} → {to}",
|
"from_currency_to_currency": "{from} → {to}",
|
||||||
"to_currency_from_currency": "{to} → {from}",
|
"to_currency_from_currency": "{to} → {from}",
|
||||||
"rate": "Rate"
|
"rate": "Kurs"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Tytu\u0142",
|
"title": "Tytu\u0142",
|
||||||
"active": "Jest aktywny?",
|
"active": "Jest aktywny?",
|
||||||
"native_currency": "Native currency",
|
"native_currency": "Waluta natywna",
|
||||||
"trigger": "Wyzwalacz",
|
"trigger": "Wyzwalacz",
|
||||||
"response": "Odpowied\u017a",
|
"response": "Odpowied\u017a",
|
||||||
"delivery": "Dor\u0119czenie",
|
"delivery": "Dor\u0119czenie",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Dividir",
|
"split": "Dividir",
|
||||||
"single_split": "Divis\u00e3o",
|
"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.",
|
||||||
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi salva.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi salva.",
|
||||||
"webhook_stored_link": "<a href=\"transactions\/show\/{ID}\">Webhooh #{ID} (\"{title}\")<\/a> foi salva.",
|
"webhook_stored_link": "<a href=\"transactions\/show\/{ID}\">Webhooh #{ID} (\"{title}\")<\/a> foi salva.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") foi atualizado.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") foi atualizado.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Acesse a URL do webhook",
|
"visit_webhook_url": "Acesse a URL do webhook",
|
||||||
"reset_webhook_secret": "Redefinir chave do webhook",
|
"reset_webhook_secret": "Redefinir chave do webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Dividir",
|
"split": "Dividir",
|
||||||
"single_split": "Divis\u00e3o",
|
"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.",
|
||||||
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">A transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi guardada.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">A transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi guardada.",
|
||||||
"webhook_stored_link": "<a href=\"transactions\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> foi guardado.",
|
"webhook_stored_link": "<a href=\"transactions\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> foi guardado.",
|
||||||
"webhook_updated_link": "<a href=\"transactions\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> foi guardado.",
|
"webhook_updated_link": "<a href=\"transactions\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> foi guardado.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Ir para URL do webhook",
|
"visit_webhook_url": "Ir para URL do webhook",
|
||||||
"reset_webhook_secret": "Redefinir segredo webhook",
|
"reset_webhook_secret": "Redefinir segredo webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "\u00cemparte",
|
"split": "\u00cemparte",
|
||||||
"single_split": "\u00cemparte",
|
"single_split": "\u00cemparte",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Tranzac\u021bia #{ID} (\"{title}\")<\/a> a fost stocat\u0103.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Tranzac\u021bia #{ID} (\"{title}\")<\/a> a fost stocat\u0103.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> a fost stocat.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> a fost stocat.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") a fost actualizat.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") a fost actualizat.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Vizita\u0163i URL-ul webhook",
|
"visit_webhook_url": "Vizita\u0163i URL-ul webhook",
|
||||||
"reset_webhook_secret": "Resetare secret webhook",
|
"reset_webhook_secret": "Resetare secret webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"firefly": {
|
"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_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": "Financial administrations",
|
"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",
|
||||||
"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.",
|
"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": "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.",
|
"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": "Edit financial administration \"{title}\"",
|
"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}\"",
|
||||||
"table": "\u0422\u0430\u0431\u043b\u0438\u0446\u0430",
|
"table": "\u0422\u0430\u0431\u043b\u0438\u0446\u0430",
|
||||||
"welcome_back": "\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043c\u043e\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438?",
|
"welcome_back": "\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043c\u043e\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438?",
|
||||||
"flash_error": "\u041e\u0448\u0438\u0431\u043a\u0430!",
|
"flash_error": "\u041e\u0448\u0438\u0431\u043a\u0430!",
|
||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "\u0421\u0432\u0435\u0440\u0435\u043d\u043e",
|
"is_reconciled": "\u0421\u0432\u0435\u0440\u0435\u043d\u043e",
|
||||||
"split": "\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c",
|
"split": "\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c",
|
||||||
"single_split": "\u0420\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f",
|
"single_split": "\u0420\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f",
|
||||||
|
"not_enough_currencies": "\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0446 \u0432\u0430\u043b\u044e\u0442",
|
||||||
|
"not_enough_currencies_enabled": "\u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0432\u0430\u043b\u044e\u0442\u0430, \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442.",
|
||||||
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f #{ID} (\"{title}\")<\/a> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f #{ID} (\"{title}\")<\/a> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431-\u0445\u0443\u043a #{ID} (\"{title}\")<\/a> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431-\u0445\u0443\u043a #{ID} (\"{title}\")<\/a> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431-\u0445\u0443\u043a #{ID} (\"{title}\")<\/a> \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431-\u0445\u0443\u043a #{ID} (\"{title}\")<\/a> \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d.",
|
||||||
@@ -151,7 +153,7 @@
|
|||||||
"url": "\u0421\u0441\u044b\u043b\u043a\u0430",
|
"url": "\u0421\u0441\u044b\u043b\u043a\u0430",
|
||||||
"active": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439",
|
"active": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439",
|
||||||
"interest_date": "\u0414\u0430\u0442\u0430 \u043d\u0430\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432",
|
"interest_date": "\u0414\u0430\u0442\u0430 \u043d\u0430\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432",
|
||||||
"administration_currency": "Native currency",
|
"administration_currency": "\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0430\u043b\u044e\u0442\u0430",
|
||||||
"title": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
|
"title": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
|
||||||
"date": "\u0414\u0430\u0442\u0430",
|
"date": "\u0414\u0430\u0442\u0430",
|
||||||
"book_date": "\u0414\u0430\u0442\u0430 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f",
|
"book_date": "\u0414\u0430\u0442\u0430 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f",
|
||||||
@@ -171,7 +173,7 @@
|
|||||||
"list": {
|
"list": {
|
||||||
"title": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
|
"title": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
|
||||||
"active": "\u0410\u043a\u0442\u0438\u0432\u0435\u043d?",
|
"active": "\u0410\u043a\u0442\u0438\u0432\u0435\u043d?",
|
||||||
"native_currency": "Native currency",
|
"native_currency": "\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0430\u043b\u044e\u0442\u0430",
|
||||||
"trigger": "\u0421\u043e\u0431\u044b\u0442\u0438\u0435",
|
"trigger": "\u0421\u043e\u0431\u044b\u0442\u0438\u0435",
|
||||||
"response": "\u041e\u0442\u0432\u0435\u0442",
|
"response": "\u041e\u0442\u0432\u0435\u0442",
|
||||||
"delivery": "\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430",
|
"delivery": "\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Roz\u00fa\u010dtova\u0165",
|
"split": "Roz\u00fa\u010dtova\u0165",
|
||||||
"single_split": "Roz\u00fa\u010dtova\u0165",
|
"single_split": "Roz\u00fa\u010dtova\u0165",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transakcia #{ID} (\"{title}\")<\/a> bola ulo\u017een\u00e1.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transakcia #{ID} (\"{title}\")<\/a> bola ulo\u017een\u00e1.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Je usklajena",
|
"is_reconciled": "Je usklajena",
|
||||||
"split": "Razdeli",
|
"split": "Razdeli",
|
||||||
"single_split": "Razdeli",
|
"single_split": "Razdeli",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transakcija \u0161t. #{ID} (\"{title}\")<\/a> je bila shranjena.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transakcija \u0161t. #{ID} (\"{title}\")<\/a> je bila shranjena.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> je bil shranjen.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> je bil shranjen.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") je bil posodobljen.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") je bil posodobljen.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Obi\u0161\u010dite URL webhooka",
|
"visit_webhook_url": "Obi\u0161\u010dite URL webhooka",
|
||||||
"reset_webhook_secret": "Ponastavi skrivno kodo webhooka",
|
"reset_webhook_secret": "Ponastavi skrivno kodo webhooka",
|
||||||
"header_exchange_rates": "Menjalni te\u010daji",
|
"header_exchange_rates": "Menjalni te\u010daji",
|
||||||
"exchange_rates_intro": "Firefly III podpira prenos in uporabo menjalnih te\u010dajev. Preberite ve\u010d o tem v <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">dokumentaciji<\/a>.",
|
"exchange_rates_intro": "Firefly III podpira prenos in uporabo menjalnih te\u010dajev. Preberite ve\u010d o tem v <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">dokumentaciji<\/a>.",
|
||||||
"exchange_rates_from_to": "Med {from} in {to} (in obratno)",
|
"exchange_rates_from_to": "Med {from} in {to} (in obratno)",
|
||||||
"exchange_rates_intro_rates": "Firefly III uporablja naslednje menjalne te\u010daje. Obratna vrednost se samodejno izra\u010duna, \u010de ni na voljo. \u010ce na dan transakcije ni menjalnega te\u010daja, se bo Firefly III vrnil v preteklost, da bi ga na\u0161el. \u010ce jih ni, se uporabi te\u010daj \"1\".",
|
"exchange_rates_intro_rates": "Firefly III uporablja naslednje menjalne te\u010daje. Obratna vrednost se samodejno izra\u010duna, \u010de ni na voljo. \u010ce na dan transakcije ni menjalnega te\u010daja, se bo Firefly III vrnil v preteklost, da bi ga na\u0161el. \u010ce jih ni, se uporabi te\u010daj \"1\".",
|
||||||
"header_exchange_rates_rates": "Menjalni te\u010daji",
|
"header_exchange_rates_rates": "Menjalni te\u010daji",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Dela",
|
"split": "Dela",
|
||||||
"single_split": "Dela",
|
"single_split": "Dela",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Transaktion #{ID} (\"{title}\")<\/a> sparades.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaktion #{ID} (\"{title}\")<\/a> sparades.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "B\u00f6l",
|
"split": "B\u00f6l",
|
||||||
"single_split": "B\u00f6l",
|
"single_split": "B\u00f6l",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">\u0130\u015flem #{ID} (\"{title}\")<\/a> sakl\u0131 olmu\u015ftur.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0130\u015flem #{ID} (\"{title}\")<\/a> sakl\u0131 olmu\u015ftur.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> has been stored.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") has been updated.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "Visit webhook URL",
|
"visit_webhook_url": "Visit webhook URL",
|
||||||
"reset_webhook_secret": "Reset webhook secret",
|
"reset_webhook_secret": "Reset webhook secret",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "\u0420\u043e\u0437\u0434\u0456\u043b\u0438\u0442\u0438",
|
"split": "\u0420\u043e\u0437\u0434\u0456\u043b\u0438\u0442\u0438",
|
||||||
"single_split": "\u0420\u043e\u0437\u0434\u0456\u043b\u0438\u0442\u0438",
|
"single_split": "\u0420\u043e\u0437\u0434\u0456\u043b\u0438\u0442\u0438",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0456\u044f #{ID} (\"{title}\")<\/a> \u0431\u0443\u043b\u0430 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0430.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0456\u044f #{ID} (\"{title}\")<\/a> \u0431\u0443\u043b\u0430 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0430.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431\u0445\u0443\u043a #{ID} (\"{title}\")<\/a> \u0431\u0443\u0432 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0439.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431\u0445\u0443\u043a #{ID} (\"{title}\")<\/a> \u0431\u0443\u0432 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0439.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431\u0445\u0443\u043a #{ID}<\/a> (\"{title}\") \u0431\u0443\u0432 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u0412\u0435\u0431\u0445\u0443\u043a #{ID}<\/a> (\"{title}\") \u0431\u0443\u0432 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "\u0412\u0456\u0434\u0432\u0456\u0434\u0430\u0439\u0442\u0435 URL-\u0430\u0434\u0440\u0435\u0441\u0443 \u0432\u0435\u0431-\u0445\u0443\u043a\u0443",
|
"visit_webhook_url": "\u0412\u0456\u0434\u0432\u0456\u0434\u0430\u0439\u0442\u0435 URL-\u0430\u0434\u0440\u0435\u0441\u0443 \u0432\u0435\u0431-\u0445\u0443\u043a\u0443",
|
||||||
"reset_webhook_secret": "\u0412\u0456\u0434\u043d\u043e\u0432\u0438\u0442\u0438 \u0441\u0456\u043a\u0440\u0435\u0442 \u0432\u0435\u0431-\u0445\u0443\u043a\u0430",
|
"reset_webhook_secret": "\u0412\u0456\u0434\u043d\u043e\u0432\u0438\u0442\u0438 \u0441\u0456\u043a\u0440\u0435\u0442 \u0432\u0435\u0431-\u0445\u0443\u043a\u0430",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Is reconciled",
|
||||||
"split": "Chia ra",
|
"split": "Chia ra",
|
||||||
"single_split": "Chia ra",
|
"single_split": "Chia ra",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">Giao d\u1ecbch #{ID} (\"{title}\")<\/a> \u0111\u00e3 \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Giao d\u1ecbch #{ID} (\"{title}\")<\/a> \u0111\u00e3 \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u0111\u00e3 \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID} (\"{title}\")<\/a> \u0111\u00e3 \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "\u0110i \u0111\u1ebfn webhook URL",
|
"visit_webhook_url": "\u0110i \u0111\u1ebfn webhook URL",
|
||||||
"reset_webhook_secret": "C\u00e0i l\u1ea1i kh\u00f3a webhook",
|
"reset_webhook_secret": "C\u00e0i l\u1ea1i kh\u00f3a webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Exchange rates",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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_rates": "Exchange rates",
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"is_reconciled": "\u5df2\u6838\u9500",
|
"is_reconciled": "\u5df2\u6838\u9500",
|
||||||
"split": "\u62c6\u5206",
|
"split": "\u62c6\u5206",
|
||||||
"single_split": "\u62c6\u5206",
|
"single_split": "\u62c6\u5206",
|
||||||
|
"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": "<a href=\"transactions\/show\/{ID}\">\u4ea4\u6613 #{ID} (\u201c{title}\u201d)<\/a> \u5df2\u4fdd\u5b58\u3002",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u4ea4\u6613 #{ID} (\u201c{title}\u201d)<\/a> \u5df2\u4fdd\u5b58\u3002",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\u63a8\u9001 #{ID} (\"{title}\")<\/a> \u5df2\u4fdd\u5b58.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">\u63a8\u9001 #{ID} (\"{title}\")<\/a> \u5df2\u4fdd\u5b58.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u63a8\u9001 #{ID}<\/a> (\"{title}\") \u5df2\u66f4\u65b0.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">\u63a8\u9001 #{ID}<\/a> (\"{title}\") \u5df2\u66f4\u65b0.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "\u8bbf\u95ee webhook URL",
|
"visit_webhook_url": "\u8bbf\u95ee webhook URL",
|
||||||
"reset_webhook_secret": "\u91cd\u7f6e webhook \u5bc6\u94a5",
|
"reset_webhook_secret": "\u91cd\u7f6e webhook \u5bc6\u94a5",
|
||||||
"header_exchange_rates": "\u6c47\u7387",
|
"header_exchange_rates": "\u6c47\u7387",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"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_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": "\u6c47\u7387",
|
"header_exchange_rates_rates": "\u6c47\u7387",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user