mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2026-01-06 02:21:25 +00:00
Compare commits
53 Commits
develop-20
...
develop-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
57ec9b8e36 | ||
|
|
41ad35880d | ||
|
|
3aa946e028 | ||
|
|
53e46895aa | ||
|
|
c61389037d | ||
|
|
6172d60e00 | ||
|
|
f909f1d9ff | ||
|
|
55018ca046 | ||
|
|
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 | ||
|
|
cabedf39b2 | ||
|
|
5d3806fcd4 | ||
|
|
71fb5fe077 |
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`
|
||||||
|
|||||||
@@ -104,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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
|
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
|
||||||
@@ -41,6 +42,8 @@ class TransactionController extends Controller
|
|||||||
private TransactionGroupRepositoryInterface $groupRepository;
|
private TransactionGroupRepositoryInterface $groupRepository;
|
||||||
private JournalRepositoryInterface $repository;
|
private JournalRepositoryInterface $repository;
|
||||||
|
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TransactionController constructor.
|
* TransactionController constructor.
|
||||||
*/
|
*/
|
||||||
@@ -51,10 +54,12 @@ class TransactionController extends Controller
|
|||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
|
$userGroup = $this->validateUserGroup($request);
|
||||||
$this->repository = app(JournalRepositoryInterface::class);
|
$this->repository = app(JournalRepositoryInterface::class);
|
||||||
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($user);
|
||||||
$this->groupRepository->setUser($user);
|
$this->groupRepository->setUser($user);
|
||||||
|
$this->groupRepository->setUserGroup($userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ use FireflyIII\Models\Preference;
|
|||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use FireflyIII\Transformers\V2\AbstractTransformer;
|
use FireflyIII\Transformers\V2\AbstractTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
@@ -59,6 +60,7 @@ abstract class Controller extends BaseController
|
|||||||
use AuthorizesRequests;
|
use AuthorizesRequests;
|
||||||
use DispatchesJobs;
|
use DispatchesJobs;
|
||||||
use ValidatesRequests;
|
use ValidatesRequests;
|
||||||
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
protected const string CONTENT_TYPE = 'application/vnd.api+json';
|
protected const string CONTENT_TYPE = 'application/vnd.api+json';
|
||||||
protected const string JSON_CONTENT_TYPE = 'application/json';
|
protected const string JSON_CONTENT_TYPE = 'application/json';
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Transaction;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Models\Transaction\StoreRequest;
|
use FireflyIII\Api\V1\Requests\Models\Transaction\StoreRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Events\StoredTransactionGroup;
|
use FireflyIII\Events\StoredTransactionGroup;
|
||||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
@@ -37,6 +38,7 @@ use FireflyIII\Transformers\TransactionGroupTransformer;
|
|||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
use Illuminate\Validation\ValidationException;
|
use Illuminate\Validation\ValidationException;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -49,6 +51,8 @@ class StoreController extends Controller
|
|||||||
|
|
||||||
private TransactionGroupRepositoryInterface $groupRepository;
|
private TransactionGroupRepositoryInterface $groupRepository;
|
||||||
|
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::MANAGE_TRANSACTIONS];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TransactionController constructor.
|
* TransactionController constructor.
|
||||||
*/
|
*/
|
||||||
@@ -59,9 +63,11 @@ class StoreController extends Controller
|
|||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $admin */
|
/** @var User $admin */
|
||||||
$admin = auth()->user();
|
$admin = auth()->user();
|
||||||
|
$userGroup = $this->validateUserGroup($request);
|
||||||
|
|
||||||
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
||||||
$this->groupRepository->setUser($admin);
|
$this->groupRepository->setUser($admin);
|
||||||
|
$this->groupRepository->setUserGroup($userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -79,61 +85,58 @@ class StoreController extends Controller
|
|||||||
public function store(StoreRequest $request): JsonResponse
|
public function store(StoreRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in API StoreController::store()');
|
app('log')->debug('Now in API StoreController::store()');
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$data['user'] = auth()->user()->id;
|
$data['user'] = auth()->user();
|
||||||
|
$data['user_group'] = $this->userGroup;
|
||||||
|
|
||||||
Log::channel('audit')
|
Log::channel('audit')->info('Store new transaction over API.', $data);
|
||||||
->info('Store new transaction over API.', $data)
|
|
||||||
;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$transactionGroup = $this->groupRepository->store($data);
|
$transactionGroup = $this->groupRepository->store($data);
|
||||||
} catch (DuplicateTransactionException $e) {
|
} catch (DuplicateTransactionException $e) {
|
||||||
app('log')->warning('Caught a duplicate transaction. Return error message.');
|
app('log')->warning('Caught a duplicate transaction. Return error message.');
|
||||||
$validator = \Validator::make(
|
$validator = Validator::make(['transactions' => [['description' => $e->getMessage()]]], ['transactions.0.description' => new IsDuplicateTransaction()]);
|
||||||
['transactions' => [['description' => $e->getMessage()]]],
|
|
||||||
['transactions.0.description' => new IsDuplicateTransaction()]
|
|
||||||
);
|
|
||||||
|
|
||||||
throw new ValidationException($validator);
|
throw new ValidationException($validator);
|
||||||
} catch (FireflyException $e) {
|
} catch (FireflyException $e) {
|
||||||
app('log')->warning('Caught an exception. Return error message.');
|
app('log')->warning('Caught an exception. Return error message.');
|
||||||
app('log')->error($e->getMessage());
|
app('log')->error($e->getMessage());
|
||||||
$message = sprintf('Internal exception: %s', $e->getMessage());
|
$message = sprintf('Internal exception: %s', $e->getMessage());
|
||||||
$validator = \Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]);
|
$validator = Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]);
|
||||||
|
|
||||||
throw new ValidationException($validator);
|
throw new ValidationException($validator);
|
||||||
}
|
}
|
||||||
app('preferences')->mark();
|
app('preferences')->mark();
|
||||||
$applyRules = $data['apply_rules'] ?? true;
|
$applyRules = $data['apply_rules'] ?? true;
|
||||||
$fireWebhooks = $data['fire_webhooks'] ?? true;
|
$fireWebhooks = $data['fire_webhooks'] ?? true;
|
||||||
event(new StoredTransactionGroup($transactionGroup, $applyRules, $fireWebhooks));
|
event(new StoredTransactionGroup($transactionGroup, $applyRules, $fireWebhooks));
|
||||||
|
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
/** @var User $admin */
|
/** @var User $admin */
|
||||||
$admin = auth()->user();
|
$admin = auth()->user();
|
||||||
|
|
||||||
// use new group collector:
|
// use new group collector:
|
||||||
/** @var GroupCollectorInterface $collector */
|
/** @var GroupCollectorInterface $collector */
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector
|
$collector
|
||||||
->setUser($admin)
|
->setUser($admin)
|
||||||
|
->setUserGroup($this->userGroup)
|
||||||
// filter on transaction group.
|
// filter on transaction group.
|
||||||
->setTransactionGroup($transactionGroup)
|
->setTransactionGroup($transactionGroup)
|
||||||
// all info needed for the API:
|
// all info needed for the API:
|
||||||
->withAPIInformation()
|
->withAPIInformation()
|
||||||
;
|
;
|
||||||
|
|
||||||
$selectedGroup = $collector->getGroups()->first();
|
$selectedGroup = $collector->getGroups()->first();
|
||||||
if (null === $selectedGroup) {
|
if (null === $selectedGroup) {
|
||||||
throw new FireflyException('200032: Cannot find transaction. Possibly, a rule deleted this transaction after its creation.');
|
throw new FireflyException('200032: Cannot find transaction. Possibly, a rule deleted this transaction after its creation.');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
$resource = new Item($selectedGroup, $transformer, 'transactions');
|
$resource = new Item($selectedGroup, $transformer, 'transactions');
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,25 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
/*
|
|
||||||
* ConvertDatesToUTC.php
|
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
|
||||||
*
|
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands\Correction;
|
namespace FireflyIII\Console\Commands\Correction;
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,25 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
/*
|
|
||||||
* AddTimezonesToDates.php
|
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
|
||||||
*
|
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands\Correction;
|
namespace FireflyIII\Console\Commands\Correction;
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Factory;
|
|||||||
|
|
||||||
use FireflyIII\Models\Location;
|
use FireflyIII\Models\Location;
|
||||||
use FireflyIII\Models\Tag;
|
use FireflyIII\Models\Tag;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,6 +35,7 @@ use FireflyIII\User;
|
|||||||
class TagFactory
|
class TagFactory
|
||||||
{
|
{
|
||||||
private User $user;
|
private User $user;
|
||||||
|
private UserGroup $userGroup;
|
||||||
|
|
||||||
public function findOrCreate(string $tag): ?Tag
|
public function findOrCreate(string $tag): ?Tag
|
||||||
{
|
{
|
||||||
@@ -101,6 +103,12 @@ class TagFactory
|
|||||||
|
|
||||||
public function setUser(User $user): void
|
public function setUser(User $user): void
|
||||||
{
|
{
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
|
$this->userGroup = $user->userGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void
|
||||||
|
{
|
||||||
|
$this->userGroup = $userGroup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ use FireflyIII\Models\TransactionCurrency;
|
|||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\Rules\UniqueIban;
|
use FireflyIII\Rules\UniqueIban;
|
||||||
use FireflyIII\Services\Internal\Update\AccountUpdateService;
|
use FireflyIII\Services\Internal\Update\AccountUpdateService;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Database\QueryException;
|
use Illuminate\Database\QueryException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -216,12 +215,4 @@ class TransactionFactory
|
|||||||
{
|
{
|
||||||
$this->reconciled = $reconciled;
|
$this->reconciled = $reconciled;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
|
||||||
*/
|
|
||||||
public function setUser(User $user): void
|
|
||||||
{
|
|
||||||
// empty function.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ namespace FireflyIII\Factory;
|
|||||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\TransactionGroup;
|
use FireflyIII\Models\TransactionGroup;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,6 +37,7 @@ class TransactionGroupFactory
|
|||||||
{
|
{
|
||||||
private TransactionJournalFactory $journalFactory;
|
private TransactionJournalFactory $journalFactory;
|
||||||
private User $user;
|
private User $user;
|
||||||
|
private UserGroup $userGroup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TransactionGroupFactory constructor.
|
* TransactionGroupFactory constructor.
|
||||||
@@ -54,7 +56,8 @@ class TransactionGroupFactory
|
|||||||
public function create(array $data): TransactionGroup
|
public function create(array $data): TransactionGroup
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in TransactionGroupFactory::create()');
|
app('log')->debug('Now in TransactionGroupFactory::create()');
|
||||||
$this->journalFactory->setUser($this->user);
|
$this->journalFactory->setUser($data['user']);
|
||||||
|
$this->journalFactory->setUserGroup($data['user_group']);
|
||||||
$this->journalFactory->setErrorOnHash($data['error_if_duplicate_hash'] ?? false);
|
$this->journalFactory->setErrorOnHash($data['error_if_duplicate_hash'] ?? false);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -76,7 +79,7 @@ class TransactionGroupFactory
|
|||||||
|
|
||||||
$group = new TransactionGroup();
|
$group = new TransactionGroup();
|
||||||
$group->user()->associate($this->user);
|
$group->user()->associate($this->user);
|
||||||
$group->userGroup()->associate($data['user_group'] ?? $this->user->userGroup);
|
$group->userGroup()->associate($data['user_group']);
|
||||||
$group->title = $title;
|
$group->title = $title;
|
||||||
$group->save();
|
$group->save();
|
||||||
|
|
||||||
@@ -92,4 +95,9 @@ class TransactionGroupFactory
|
|||||||
{
|
{
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void
|
||||||
|
{
|
||||||
|
$this->userGroup = $userGroup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ use FireflyIII\Models\Transaction;
|
|||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\Models\TransactionJournalMeta;
|
use FireflyIII\Models\TransactionJournalMeta;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
@@ -69,6 +70,7 @@ class TransactionJournalFactory
|
|||||||
private PiggyBankRepositoryInterface $piggyRepository;
|
private PiggyBankRepositoryInterface $piggyRepository;
|
||||||
private TransactionTypeRepositoryInterface $typeRepository;
|
private TransactionTypeRepositoryInterface $typeRepository;
|
||||||
private User $user;
|
private User $user;
|
||||||
|
private UserGroup $userGroup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
@@ -176,7 +178,6 @@ class TransactionJournalFactory
|
|||||||
if (true === FireflyConfig::get('utc', false)->data) {
|
if (true === FireflyConfig::get('utc', false)->data) {
|
||||||
$carbon->setTimezone('UTC');
|
$carbon->setTimezone('UTC');
|
||||||
}
|
}
|
||||||
// $carbon->setTimezone('UTC');
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// validate source and destination using a new Validator.
|
// validate source and destination using a new Validator.
|
||||||
@@ -228,7 +229,7 @@ class TransactionJournalFactory
|
|||||||
$journal = TransactionJournal::create(
|
$journal = TransactionJournal::create(
|
||||||
[
|
[
|
||||||
'user_id' => $this->user->id,
|
'user_id' => $this->user->id,
|
||||||
'user_group_id' => $this->user->user_group_id,
|
'user_group_id' => $this->userGroup->id,
|
||||||
'transaction_type_id' => $type->id,
|
'transaction_type_id' => $type->id,
|
||||||
'bill_id' => $billId,
|
'bill_id' => $billId,
|
||||||
'transaction_currency_id' => $currency->id,
|
'transaction_currency_id' => $currency->id,
|
||||||
@@ -244,7 +245,6 @@ class TransactionJournalFactory
|
|||||||
|
|
||||||
/** Create two transactions. */
|
/** Create two transactions. */
|
||||||
$transactionFactory = app(TransactionFactory::class);
|
$transactionFactory = app(TransactionFactory::class);
|
||||||
$transactionFactory->setUser($this->user);
|
|
||||||
$transactionFactory->setJournal($journal);
|
$transactionFactory->setJournal($journal);
|
||||||
$transactionFactory->setAccount($sourceAccount);
|
$transactionFactory->setAccount($sourceAccount);
|
||||||
$transactionFactory->setCurrency($currency);
|
$transactionFactory->setCurrency($currency);
|
||||||
@@ -263,7 +263,6 @@ class TransactionJournalFactory
|
|||||||
|
|
||||||
/** @var TransactionFactory $transactionFactory */
|
/** @var TransactionFactory $transactionFactory */
|
||||||
$transactionFactory = app(TransactionFactory::class);
|
$transactionFactory = app(TransactionFactory::class);
|
||||||
$transactionFactory->setUser($this->user);
|
|
||||||
$transactionFactory->setJournal($journal);
|
$transactionFactory->setJournal($journal);
|
||||||
$transactionFactory->setAccount($destinationAccount);
|
$transactionFactory->setAccount($destinationAccount);
|
||||||
$transactionFactory->setAccountInformation($destInfo);
|
$transactionFactory->setAccountInformation($destInfo);
|
||||||
@@ -404,7 +403,8 @@ class TransactionJournalFactory
|
|||||||
*/
|
*/
|
||||||
public function setUser(User $user): void
|
public function setUser(User $user): void
|
||||||
{
|
{
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
|
$this->userGroup = $user->userGroup;
|
||||||
$this->currencyRepository->setUser($this->user);
|
$this->currencyRepository->setUser($this->user);
|
||||||
$this->tagFactory->setUser($user);
|
$this->tagFactory->setUser($user);
|
||||||
$this->billRepository->setUser($this->user);
|
$this->billRepository->setUser($this->user);
|
||||||
@@ -414,6 +414,18 @@ class TransactionJournalFactory
|
|||||||
$this->accountRepository->setUser($this->user);
|
$this->accountRepository->setUser($this->user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void
|
||||||
|
{
|
||||||
|
$this->userGroup = $userGroup;
|
||||||
|
$this->currencyRepository->setUserGroup($userGroup);
|
||||||
|
$this->tagFactory->setUserGroup($userGroup);
|
||||||
|
$this->billRepository->setUserGroup($userGroup);
|
||||||
|
$this->budgetRepository->setUserGroup($userGroup);
|
||||||
|
$this->categoryRepository->setUserGroup($userGroup);
|
||||||
|
$this->piggyRepository->setUserGroup($userGroup);
|
||||||
|
$this->accountRepository->setUserGroup($userGroup);
|
||||||
|
}
|
||||||
|
|
||||||
private function reconciliationSanityCheck(?Account $sourceAccount, ?Account $destinationAccount): array
|
private function reconciliationSanityCheck(?Account $sourceAccount, ?Account $destinationAccount): array
|
||||||
{
|
{
|
||||||
app('log')->debug(sprintf('Now in %s', __METHOD__));
|
app('log')->debug(sprintf('Now in %s', __METHOD__));
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -25,7 +25,9 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
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;
|
||||||
@@ -73,12 +75,17 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @var Attachment $attachment */
|
||||||
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();
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
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 +43,13 @@ 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.');
|
||||||
|
/** @var Attachment $attachment */
|
||||||
foreach ($bill->attachments()->get() as $attachment) {
|
foreach ($bill->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
$bill->notes()->delete();
|
$bill->notes()->delete();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,8 +23,10 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
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 +36,13 @@ 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);
|
||||||
|
|
||||||
|
/** @var Attachment $attachment */
|
||||||
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();
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class CategoryObserver
|
* Class CategoryObserver
|
||||||
@@ -33,8 +35,13 @@ 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);
|
||||||
|
|
||||||
|
/** @var Attachment $attachment */
|
||||||
foreach ($category->attachments()->get() as $attachment) {
|
foreach ($category->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
$category->notes()->delete();
|
$category->notes()->delete();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
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 +48,12 @@ 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);
|
||||||
|
|
||||||
|
/** @var Attachment $attachment */
|
||||||
foreach ($piggyBank->attachments()->get() as $attachment) {
|
foreach ($piggyBank->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
$piggyBank->piggyBankEvents()->delete();
|
$piggyBank->piggyBankEvents()->delete();
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class RecurrenceObserver
|
* Class RecurrenceObserver
|
||||||
@@ -33,8 +35,13 @@ 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);
|
||||||
|
|
||||||
|
/** @var Attachment $attachment */
|
||||||
foreach ($recurrence->attachments()->get() as $attachment) {
|
foreach ($recurrence->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
$recurrence->recurrenceRepetitions()->delete();
|
$recurrence->recurrenceRepetitions()->delete();
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
use FireflyIII\Models\Tag;
|
use FireflyIII\Models\Tag;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class TagObserver
|
* Class TagObserver
|
||||||
@@ -34,8 +36,12 @@ 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);
|
||||||
|
|
||||||
|
/** @var Attachment $attachment */
|
||||||
foreach ($tag->attachments()->get() as $attachment) {
|
foreach ($tag->attachments()->get() as $attachment) {
|
||||||
$attachment->delete();
|
$repository->destroy($attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
$tag->locations()->delete();
|
$tag->locations()->delete();
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Observer;
|
namespace FireflyIII\Handlers\Observer;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class TransactionJournalObserver
|
* Class TransactionJournalObserver
|
||||||
@@ -34,14 +36,20 @@ 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) {
|
||||||
$transaction->delete();
|
$transaction->delete();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/** @var Attachment $attachment */
|
||||||
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');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ class ReconcileController extends Controller
|
|||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
$startDate = clone $start;
|
$startDate = clone $start;
|
||||||
|
$startDate->subDay()->endOfDay();
|
||||||
$startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
$startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places);
|
||||||
$endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places);
|
$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));
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -427,7 +431,7 @@ class AccountController extends Controller
|
|||||||
$cache->addProperty($this->convertToNative);
|
$cache->addProperty($this->convertToNative);
|
||||||
$cache->addProperty($account->id);
|
$cache->addProperty($account->id);
|
||||||
if ($cache->has()) {
|
if ($cache->has()) {
|
||||||
// return response()->json($cache->get());
|
return response()->json($cache->get());
|
||||||
}
|
}
|
||||||
|
|
||||||
// collect and filter balances for the entire period.
|
// collect and filter balances for the entire period.
|
||||||
@@ -602,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.
|
||||||
|
|||||||
@@ -168,15 +168,14 @@ class BudgetController extends Controller
|
|||||||
}
|
}
|
||||||
$locale = app('steam')->getLocale();
|
$locale = app('steam')->getLocale();
|
||||||
$entries = [];
|
$entries = [];
|
||||||
$amount = $budgetLimit->amount;
|
$amount = $budgetLimit->amount ?? '0';
|
||||||
$budgetCollection = new Collection([$budget]);
|
$budgetCollection = new Collection([$budget]);
|
||||||
$currency = $budgetLimit->transactionCurrency;
|
$currency = $budgetLimit->transactionCurrency;
|
||||||
if ($this->convertToNative) {
|
if ($this->convertToNative) {
|
||||||
$amount = $budgetLimit->native_amount;
|
$amount = $budgetLimit->native_amount ?? '0';
|
||||||
$currency = $this->defaultCurrency;
|
$currency = $this->defaultCurrency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
while ($start <= $end) {
|
while ($start <= $end) {
|
||||||
$current = clone $start;
|
$current = clone $start;
|
||||||
$expenses = $this->opsRepository->sumExpenses($current, $current, null, $budgetCollection, $budgetLimit->transactionCurrency);
|
$expenses = $this->opsRepository->sumExpenses($current, $current, null, $budgetCollection, $budgetLimit->transactionCurrency);
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ class DebugController extends Controller
|
|||||||
$system = $this->getSystemInformation();
|
$system = $this->getSystemInformation();
|
||||||
$docker = $this->getBuildInfo();
|
$docker = $this->getBuildInfo();
|
||||||
$app = $this->getAppInfo();
|
$app = $this->getAppInfo();
|
||||||
$user = $this->getuserInfo();
|
$user = $this->getUserInfo();
|
||||||
|
|
||||||
return (string) view('partials.debug-table', compact('system', 'docker', 'app', 'user'));
|
return (string) view('partials.debug-table', compact('system', 'docker', 'app', 'user'));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ class ReconcileController extends Controller
|
|||||||
if ($end->lt($start)) {
|
if ($end->lt($start)) {
|
||||||
[$end, $start] = [$start, $end];
|
[$end, $start] = [$start, $end];
|
||||||
}
|
}
|
||||||
$start->startOfDay();
|
$start->endOfDay();
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
$startDate = clone $start;
|
$startDate = clone $start;
|
||||||
$startDate->subDay();
|
$startDate->subDay();
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ 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->startOfDay();
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
@@ -116,7 +116,7 @@ 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->startOfDay();
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
@@ -150,7 +150,7 @@ 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->startOfDay();
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
@@ -185,7 +185,7 @@ class ReportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
$start->startOfDay();
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
@@ -219,7 +219,7 @@ class ReportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->repository->cleanupBudgets();
|
$this->repository->cleanupBudgets();
|
||||||
$start->startOfDay();
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
@@ -377,7 +377,7 @@ 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->startOfDay();
|
$start->endOfDay(); // end of day so the final balance is at the end of that day.
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
|
|
||||||
app('view')->share(
|
app('view')->share(
|
||||||
|
|||||||
@@ -419,9 +419,7 @@ class CreateRecurringTransactions implements ShouldQueue
|
|||||||
/** @var RecurrenceTransaction $transaction */
|
/** @var RecurrenceTransaction $transaction */
|
||||||
foreach ($transactions as $index => $transaction) {
|
foreach ($transactions as $index => $transaction) {
|
||||||
$single = [
|
$single = [
|
||||||
'type' => null === $transaction?->transactionType?->type ?
|
'type' => null === $transaction?->transactionType?->type ? strtolower($recurrence->transactionType->type) : strtolower($transaction->transactionType->type), // @phpstan-ignore-line
|
||||||
strtolower($recurrence->transactionType->type) :
|
|
||||||
strtolower($transaction->transactionType->type),
|
|
||||||
'date' => $date,
|
'date' => $date,
|
||||||
'user' => $recurrence->user_id,
|
'user' => $recurrence->user_id,
|
||||||
'currency_id' => $transaction->transaction_currency_id,
|
'currency_id' => $transaction->transaction_currency_id,
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ use FireflyIII\Models\TransactionJournal;
|
|||||||
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
|
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
|
||||||
use FireflyIII\Services\Internal\Update\AccountUpdateService;
|
use FireflyIII\Services\Internal\Update\AccountUpdateService;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
|
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||||
@@ -51,7 +52,7 @@ use Illuminate\Support\Collection;
|
|||||||
*/
|
*/
|
||||||
class AccountRepository implements AccountRepositoryInterface
|
class AccountRepository implements AccountRepositoryInterface
|
||||||
{
|
{
|
||||||
private User $user;
|
use UserGroupTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moved here from account CRUD.
|
* Moved here from account CRUD.
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ use FireflyIII\Models\Location;
|
|||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Models\TransactionGroup;
|
use FireflyIII\Models\TransactionGroup;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -149,6 +150,8 @@ interface AccountRepositoryInterface
|
|||||||
|
|
||||||
public function setUser(null|Authenticatable|User $user): void;
|
public function setUser(null|Authenticatable|User $user): void;
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void;
|
||||||
|
|
||||||
public function store(array $data): Account;
|
public function store(array $data): Account;
|
||||||
|
|
||||||
public function update(Account $account, array $data): Account;
|
public function update(Account $account, array $data): Account;
|
||||||
|
|||||||
@@ -38,8 +38,7 @@ use FireflyIII\Services\Internal\Destroy\BillDestroyService;
|
|||||||
use FireflyIII\Services\Internal\Update\BillUpdateService;
|
use FireflyIII\Services\Internal\Update\BillUpdateService;
|
||||||
use FireflyIII\Support\CacheProperties;
|
use FireflyIII\Support\CacheProperties;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\User;
|
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
|
||||||
use Illuminate\Database\Query\JoinClause;
|
use Illuminate\Database\Query\JoinClause;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -51,8 +50,7 @@ use Illuminate\Support\Facades\Log;
|
|||||||
class BillRepository implements BillRepositoryInterface
|
class BillRepository implements BillRepositoryInterface
|
||||||
{
|
{
|
||||||
use CreatesObjectGroups;
|
use CreatesObjectGroups;
|
||||||
|
use UserGroupTrait;
|
||||||
private User $user;
|
|
||||||
|
|
||||||
public function billEndsWith(string $query, int $limit): Collection
|
public function billEndsWith(string $query, int $limit): Collection
|
||||||
{
|
{
|
||||||
@@ -294,13 +292,6 @@ class BillRepository implements BillRepositoryInterface
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setUser(null|Authenticatable|User $user): void
|
|
||||||
{
|
|
||||||
if ($user instanceof User) {
|
|
||||||
$this->user = $user;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPaginator(int $size): LengthAwarePaginator
|
public function getPaginator(int $size): LengthAwarePaginator
|
||||||
{
|
{
|
||||||
return $this->user->bills()
|
return $this->user->bills()
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Repositories\Bill;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
@@ -40,6 +41,8 @@ interface BillRepositoryInterface
|
|||||||
|
|
||||||
public function billStartsWith(string $query, int $limit): Collection;
|
public function billStartsWith(string $query, int $limit): Collection;
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add correct order to bills.
|
* Add correct order to bills.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -41,8 +41,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
|||||||
use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface;
|
||||||
use FireflyIII\Services\Internal\Destroy\BudgetDestroyService;
|
use FireflyIII\Services\Internal\Destroy\BudgetDestroyService;
|
||||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
use FireflyIII\User;
|
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
|
||||||
use Illuminate\Database\QueryException;
|
use Illuminate\Database\QueryException;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
@@ -52,7 +51,7 @@ use Illuminate\Support\Facades\Log;
|
|||||||
*/
|
*/
|
||||||
class BudgetRepository implements BudgetRepositoryInterface
|
class BudgetRepository implements BudgetRepositoryInterface
|
||||||
{
|
{
|
||||||
private User $user;
|
use UserGroupTrait;
|
||||||
|
|
||||||
public function budgetEndsWith(string $query, int $limit): Collection
|
public function budgetEndsWith(string $query, int $limit): Collection
|
||||||
{
|
{
|
||||||
@@ -154,13 +153,6 @@ class BudgetRepository implements BudgetRepositoryInterface
|
|||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setUser(null|Authenticatable|User $user): void
|
|
||||||
{
|
|
||||||
if ($user instanceof User) {
|
|
||||||
$this->user = $user;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getActiveBudgets(): Collection
|
public function getActiveBudgets(): Collection
|
||||||
{
|
{
|
||||||
return $this->user->budgets()->where('active', true)
|
return $this->user->budgets()->where('active', true)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ use Carbon\Carbon;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\AutoBudget;
|
use FireflyIII\Models\AutoBudget;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -40,6 +41,8 @@ interface BudgetRepositoryInterface
|
|||||||
|
|
||||||
public function budgetStartsWith(string $query, int $limit): Collection;
|
public function budgetStartsWith(string $query, int $limit): Collection;
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the amount that is budgeted in a period.
|
* Returns the amount that is budgeted in a period.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ use FireflyIII\Models\RecurrenceTransactionMeta;
|
|||||||
use FireflyIII\Models\RuleAction;
|
use FireflyIII\Models\RuleAction;
|
||||||
use FireflyIII\Services\Internal\Destroy\CategoryDestroyService;
|
use FireflyIII\Services\Internal\Destroy\CategoryDestroyService;
|
||||||
use FireflyIII\Services\Internal\Update\CategoryUpdateService;
|
use FireflyIII\Services\Internal\Update\CategoryUpdateService;
|
||||||
|
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -43,7 +44,7 @@ use Illuminate\Support\Facades\Log;
|
|||||||
*/
|
*/
|
||||||
class CategoryRepository implements CategoryRepositoryInterface
|
class CategoryRepository implements CategoryRepositoryInterface
|
||||||
{
|
{
|
||||||
private User $user;
|
use UserGroupTrait;
|
||||||
|
|
||||||
public function categoryEndsWith(string $query, int $limit): Collection
|
public function categoryEndsWith(string $query, int $limit): Collection
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Repositories\Category;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -88,6 +89,8 @@ interface CategoryRepositoryInterface
|
|||||||
|
|
||||||
public function setUser(null|Authenticatable|User $user): void;
|
public function setUser(null|Authenticatable|User $user): void;
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ use FireflyIII\Models\TransactionJournal;
|
|||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
|
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -48,7 +49,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
|
|||||||
{
|
{
|
||||||
use ModifiesPiggyBanks;
|
use ModifiesPiggyBanks;
|
||||||
|
|
||||||
private User $user;
|
use UserGroupTrait;
|
||||||
|
|
||||||
public function destroyAll(): void
|
public function destroyAll(): void
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ use FireflyIII\Models\Account;
|
|||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Models\PiggyBankRepetition;
|
use FireflyIII\Models\PiggyBankRepetition;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -137,6 +138,8 @@ interface PiggyBankRepositoryInterface
|
|||||||
|
|
||||||
public function setUser(null|Authenticatable|User $user): void;
|
public function setUser(null|Authenticatable|User $user): void;
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store new piggy bank.
|
* Store new piggy bank.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -43,8 +43,7 @@ use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
|||||||
use FireflyIII\Services\Internal\Destroy\TransactionGroupDestroyService;
|
use FireflyIII\Services\Internal\Destroy\TransactionGroupDestroyService;
|
||||||
use FireflyIII\Services\Internal\Update\GroupUpdateService;
|
use FireflyIII\Services\Internal\Update\GroupUpdateService;
|
||||||
use FireflyIII\Support\NullArrayObject;
|
use FireflyIII\Support\NullArrayObject;
|
||||||
use FireflyIII\User;
|
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
@@ -53,7 +52,7 @@ use Illuminate\Support\Collection;
|
|||||||
*/
|
*/
|
||||||
class TransactionGroupRepository implements TransactionGroupRepositoryInterface
|
class TransactionGroupRepository implements TransactionGroupRepositoryInterface
|
||||||
{
|
{
|
||||||
private User $user;
|
use UserGroupTrait;
|
||||||
|
|
||||||
public function countAttachments(int $journalId): int
|
public function countAttachments(int $journalId): int
|
||||||
{
|
{
|
||||||
@@ -163,13 +162,6 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setUser(null|Authenticatable|User $user): void
|
|
||||||
{
|
|
||||||
if ($user instanceof User) {
|
|
||||||
$this->user = $user;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the note text for a journal (by ID).
|
* Get the note text for a journal (by ID).
|
||||||
*/
|
*/
|
||||||
@@ -408,7 +400,8 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface
|
|||||||
{
|
{
|
||||||
/** @var TransactionGroupFactory $factory */
|
/** @var TransactionGroupFactory $factory */
|
||||||
$factory = app(TransactionGroupFactory::class);
|
$factory = app(TransactionGroupFactory::class);
|
||||||
$factory->setUser($this->user);
|
$factory->setUser($data['user']);
|
||||||
|
$factory->setUserGroup($data['user_group']);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return $factory->create($data);
|
return $factory->create($data);
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\DuplicateTransactionException;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Location;
|
use FireflyIII\Models\Location;
|
||||||
use FireflyIII\Models\TransactionGroup;
|
use FireflyIII\Models\TransactionGroup;
|
||||||
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\Support\NullArrayObject;
|
use FireflyIII\Support\NullArrayObject;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
@@ -99,6 +100,8 @@ interface TransactionGroupRepositoryInterface
|
|||||||
|
|
||||||
public function setUser(null|Authenticatable|User $user): void;
|
public function setUser(null|Authenticatable|User $user): void;
|
||||||
|
|
||||||
|
public function setUserGroup(UserGroup $userGroup): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new transaction group.
|
* Create a new transaction group.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ use Illuminate\Support\Facades\Log;
|
|||||||
*/
|
*/
|
||||||
trait ValidatesUserGroupTrait
|
trait ValidatesUserGroupTrait
|
||||||
{
|
{
|
||||||
|
protected ?UserGroup $userGroup = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An "undocumented" filter
|
* An "undocumented" filter
|
||||||
*
|
*
|
||||||
@@ -98,6 +100,7 @@ trait ValidatesUserGroupTrait
|
|||||||
foreach ($roles as $role) {
|
foreach ($roles as $role) {
|
||||||
if ($user->hasRoleInGroupOrOwner($group, $role)) {
|
if ($user->hasRoleInGroupOrOwner($group, $role)) {
|
||||||
Log::debug(sprintf('validateUserGroup: User has role "%s" in group #%d, return the group.', $role->value, $groupId));
|
Log::debug(sprintf('validateUserGroup: User has role "%s" in group #%d, return the group.', $role->value, $groupId));
|
||||||
|
$this->userGroup = $group;
|
||||||
|
|
||||||
return $group;
|
return $group;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,12 +70,16 @@ 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 = $convertToNative ? 'native_balance' : 'balance';
|
||||||
$currency = $useNative ? $default : $currency;
|
$currency = $useNative ? $default : $currency;
|
||||||
|
Log::debug(sprintf('Will use field %s', $field));
|
||||||
$currentSet = [
|
$currentSet = [
|
||||||
'label' => $account->name,
|
'label' => $account->name,
|
||||||
'currency_symbol' => $currency->symbol,
|
'currency_symbol' => $currency->symbol,
|
||||||
@@ -82,8 +87,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)));
|
||||||
|
|||||||
@@ -24,30 +24,48 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Support\Repositories\UserGroup;
|
namespace FireflyIII\Support\Repositories\UserGroup;
|
||||||
|
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\GroupMembership;
|
use FireflyIII\Models\GroupMembership;
|
||||||
use FireflyIII\Models\UserGroup;
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trait UserGroupTrait
|
* Trait UserGroupTrait
|
||||||
*/
|
*/
|
||||||
trait UserGroupTrait
|
trait UserGroupTrait
|
||||||
{
|
{
|
||||||
protected User $user;
|
protected ?User $user = null;
|
||||||
protected UserGroup $userGroup;
|
protected ?UserGroup $userGroup = null;
|
||||||
|
|
||||||
public function getUserGroup(): UserGroup
|
public function getUserGroup(): UserGroup
|
||||||
{
|
{
|
||||||
return $this->userGroup;
|
return $this->userGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function checkUserGroupAccess(UserRoleEnum $role): bool
|
||||||
|
{
|
||||||
|
$result = $this->user->hasRoleInGroupOrOwner($this->userGroup, $role);
|
||||||
|
if ($result) {
|
||||||
|
Log::debug(sprintf('User #%d has role %s in group #%d or is owner/full.', $this->user->id, $role->value, $this->userGroup->id));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Log::warning(sprintf('User #%d DOES NOT have role %s in group #%d.', $this->user->id, $role->value, $this->userGroup->id));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO This method does not check if the user has access to this particular user group.
|
* TODO This method does not check if the user has access to this particular user group.
|
||||||
*/
|
*/
|
||||||
public function setUserGroup(UserGroup $userGroup): void
|
public function setUserGroup(UserGroup $userGroup): void
|
||||||
{
|
{
|
||||||
|
if (null === $this->user) {
|
||||||
|
Log::warning(sprintf('User is not set in repository %s', static::class));
|
||||||
|
}
|
||||||
$this->userGroup = $userGroup;
|
$this->userGroup = $userGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +80,11 @@ trait UserGroupTrait
|
|||||||
throw new FireflyException(sprintf('User #%d has no user group.', $user->id));
|
throw new FireflyException(sprintf('User #%d has no user group.', $user->id));
|
||||||
}
|
}
|
||||||
$this->userGroup = $user->userGroup;
|
$this->userGroup = $user->userGroup;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
throw new FireflyException(sprintf('Object is of class %s, not User.', get_class($user)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,7 +92,7 @@ trait UserGroupTrait
|
|||||||
*/
|
*/
|
||||||
public function setUserGroupById(int $userGroupId): void
|
public function setUserGroupById(int $userGroupId): void
|
||||||
{
|
{
|
||||||
$memberships = GroupMembership::where('user_id', $this->user->id)
|
$memberships = GroupMembership::where('user_id', $this->user->id)
|
||||||
->where('user_group_id', $userGroupId)
|
->where('user_group_id', $userGroupId)
|
||||||
->count()
|
->count()
|
||||||
;
|
;
|
||||||
@@ -79,10 +101,10 @@ trait UserGroupTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @var null|UserGroup $userGroup */
|
/** @var null|UserGroup $userGroup */
|
||||||
$userGroup = UserGroup::find($userGroupId);
|
$userGroup = UserGroup::find($userGroupId);
|
||||||
if (null === $userGroup) {
|
if (null === $userGroup) {
|
||||||
throw new FireflyException(sprintf('Cannot find administration for user #%d', $this->user->id));
|
throw new FireflyException(sprintf('Cannot find administration for user #%d', $this->user->id));
|
||||||
}
|
}
|
||||||
$this->userGroup = $userGroup;
|
$this->setUserGroup($userGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,4 +55,36 @@ 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 && $this 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())));
|
||||||
|
|
||||||
|
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!');
|
||||||
|
|
||||||
|
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) {
|
||||||
|
// In any other location, it's just a normal character
|
||||||
|
$tokenUnderConstruction .= $char;
|
||||||
|
$skipNext = true;
|
||||||
|
}
|
||||||
|
if ('' !== $tokenUnderConstruction && !$skipNext) { // @phpstan-ignore-line
|
||||||
|
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;
|
||||||
|
|
||||||
|
|||||||
@@ -59,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
|
||||||
@@ -68,35 +68,41 @@ class Steam
|
|||||||
$cache->addProperty($account->id);
|
$cache->addProperty($account->id);
|
||||||
$cache->addProperty('final-balance-in-range');
|
$cache->addProperty('final-balance-in-range');
|
||||||
$cache->addProperty($start);
|
$cache->addProperty($start);
|
||||||
|
$cache->addProperty($convertToNative);
|
||||||
$cache->addProperty($end);
|
$cache->addProperty($end);
|
||||||
if ($cache->has()) {
|
if ($cache->has()) {
|
||||||
// return $cache->get();
|
return $cache->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
$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'))
|
||||||
@@ -120,74 +126,35 @@ class Steam
|
|||||||
|
|
||||||
/** @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);
|
||||||
|
$carbonKey = $carbon->format('Y-m-d');
|
||||||
|
// make sure sum is a string:
|
||||||
$sumOfDay = (string) (null === $entry->sum_of_day ? '0' : $entry->sum_of_day);
|
$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] ??= '0';
|
||||||
$currentBalance[$entryCurrency->code] = bcadd($sumOfDay, $currentBalance[$entryCurrency->code]);
|
$currentBalance[$entryCurrency->code] = bcadd($sumOfDay, $currentBalance[$entryCurrency->code]);
|
||||||
|
|
||||||
// if not convert to native, add the amount to "balance" and "native_balance" alike:
|
// if not convert to native, add the amount to "balance", do nothing else.
|
||||||
if (!$convertToNative) {
|
if (!$convertToNative) {
|
||||||
$currentBalance['balance'] = bcadd($currentBalance['balance'], $sumOfDay);
|
$currentBalance['balance'] = bcadd($currentBalance['balance'], $sumOfDay);
|
||||||
$currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $sumOfDay);
|
|
||||||
}
|
}
|
||||||
// if convert to native add the converted amount to native balance.
|
// if convert to native add the converted amount to "native_balance".
|
||||||
if ($convertToNative) {
|
if ($convertToNative) {
|
||||||
$nativeSumOfDay = $converter->convert($entryCurrency, $defaultCurrency, $carbon, $sumOfDay);
|
$nativeSumOfDay = $converter->convert($entryCurrency, $nativeCurrency, $carbon, $sumOfDay);
|
||||||
$currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $nativeSumOfDay);
|
$currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $nativeSumOfDay);
|
||||||
// only add to "balance" if it has the correct currency code (the same as "native")
|
|
||||||
if ($defaultCurrency->code === $entryCurrency->code) {
|
|
||||||
$currentBalance['balance'] = bcadd($currentBalance['balance'], $sumOfDay);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// just set it.
|
||||||
// // if convert to native, if NOT convert to native.
|
$balances[$carbonKey] = $currentBalance;
|
||||||
// if ($convertToNative) {
|
Log::debug(sprintf('Updated entry [%s]', $carbonKey), $currentBalance);
|
||||||
// // convert for this day to native
|
|
||||||
// $currentNative = '0'; // TODO
|
|
||||||
// //$currentBalance['native_balance']
|
|
||||||
//
|
|
||||||
// // 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) {
|
|
||||||
// Log::debug(sprintf('Amount is %s %s, foreign amount is %s, native amount is %s', $entryCurrency->code, $modified, $foreignModified, $nativeModified));
|
|
||||||
// // 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;
|
|
||||||
Log::debug('Updated entry', $currentBalance);
|
|
||||||
}
|
}
|
||||||
$cache->store($balances);
|
$cache->store($balances);
|
||||||
Log::debug('End of method');
|
Log::debug('End of method');
|
||||||
@@ -294,106 +261,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;
|
|
||||||
$return = [
|
|
||||||
// 'balance' => '0',
|
|
||||||
'native_balance' => '0',
|
'native_balance' => '0',
|
||||||
|
'balance' => '0', // this key is overwritten right away, but I must remember it is always created.
|
||||||
];
|
];
|
||||||
// balance(s) in other (all) currencies.
|
// balance(s) in all currencies.
|
||||||
$array = $account->transactions()
|
$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 there is no request to convert, take this as "balance" and "native_balance".
|
// if there is no request to convert, take this as "balance" and "native_balance".
|
||||||
|
$return['balance'] = $others[$currency->code] ?? '0';
|
||||||
if (!$convertToNative) {
|
if (!$convertToNative) {
|
||||||
// $return['balance'] = $others[$currency->code] ?? '0';
|
unset($return['native_balance']);
|
||||||
$return['native_balance'] = $others[$currency->code] ?? '0';
|
// Log::debug(sprintf('Set balance to %s, unset native_balance', $return['balance']));
|
||||||
Log::debug(sprintf('Set balance + native_balance to %s', $return['native_balance']));
|
|
||||||
}
|
}
|
||||||
// if there is a request to convert, convert to "native_balance" and use "balance" for whichever amount is in the native currency.
|
// if there is a request to convert, convert to "native_balance" and use "balance" for whichever amount is in the native currency.
|
||||||
if ($convertToNative) {
|
if ($convertToNative) {
|
||||||
$return['balance'] = $others[$native->code] ?? '0';
|
|
||||||
$return['native_balance'] = $this->convertAllBalances($others, $native, $date); // todo sum all and convert.
|
$return['native_balance'] = $this->convertAllBalances($others, $native, $date); // todo sum all and convert.
|
||||||
Log::debug(sprintf('Set balance to %s and native_balance to %s', $return['balance'], $return['native_balance']));
|
// Log::debug(sprintf('Set native_balance to %s', $return['native_balance']));
|
||||||
}
|
}
|
||||||
|
|
||||||
// either way, the balance is always combined with the virtual balance:
|
// either way, the balance is always combined with the virtual balance:
|
||||||
$virtualBalance = (string) ('' === (string) $account->virtual_balance ? '0' : $account->virtual_balance);
|
$virtualBalance = (string) ('' === (string) $account->virtual_balance ? '0' : $account->virtual_balance);
|
||||||
// $return['balance'] = bcadd($return['balance'], $virtualBalance);
|
|
||||||
// Log::debug(sprintf('Virtual balance makes the total %s', $return['balance']));
|
|
||||||
|
|
||||||
if ($convertToNative) {
|
if ($convertToNative) {
|
||||||
// the native balance is combined with a converted virtual_balance:
|
// the native balance is combined with a converted virtual_balance:
|
||||||
$converter = new ExchangeRateConverter();
|
$converter = new ExchangeRateConverter();
|
||||||
$nativeVirtualBalance = $converter->convert($currency, $native, $date, $virtualBalance);
|
$nativeVirtualBalance = $converter->convert($currency, $native, $date, $virtualBalance);
|
||||||
$return['native_balance'] = bcadd($nativeVirtualBalance, $return['native_balance']);
|
$return['native_balance'] = bcadd($nativeVirtualBalance, $return['native_balance']);
|
||||||
Log::debug(sprintf('Native virtual balance makes the native total %s', $return['native_balance']));
|
// Log::debug(sprintf('Native virtual balance makes the native total %s', $return['native_balance']));
|
||||||
}
|
}
|
||||||
if (!$convertToNative) {
|
if (!$convertToNative) {
|
||||||
// if not, also increase the native balance for consistency.
|
// if not, also increase the balance + native balance for consistency.
|
||||||
$return['native_balance'] = bcadd($return['native_balance'], $virtualBalance);
|
$return['balance'] = bcadd($return['balance'], $virtualBalance);
|
||||||
Log::debug(sprintf('Virtual balance makes the (native) total %s', $return['native_balance']));
|
// Log::debug(sprintf('Virtual balance makes the (native) total %s', $return['balance']));
|
||||||
}
|
}
|
||||||
|
$final = array_merge($return, $others);
|
||||||
// if the currency is the same as the native currency, set the native_balance to the balance for consistency.
|
Log::debug('Final balance is', $final);
|
||||||
// if($currency->id === $native->id) {
|
|
||||||
// $return['native_balance'] = $return['balance'];
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (!$hasCurrency && array_key_exists('balance', $return)) {
|
|
||||||
// // Log::debug('Account has no currency preference, dropping balance in favor of native balance.');
|
|
||||||
// $sum = bcadd($return['balance'], $return['native_balance']);
|
|
||||||
// // Log::debug(sprintf('%s + %s = %s', $return['balance'], $return['native_balance'], $sum));
|
|
||||||
// $return['native_balance'] = $sum;
|
|
||||||
// unset($return['balance']);
|
|
||||||
// }
|
|
||||||
$final = array_merge($return, $others);
|
|
||||||
// // Log::debug('Return is', $final);
|
|
||||||
|
|
||||||
$cache->store($final);
|
$cache->store($final);
|
||||||
|
|
||||||
return $final;
|
return $final;
|
||||||
|
|
||||||
// return array_merge($return, $others);
|
|
||||||
// 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
|
||||||
@@ -419,34 +357,34 @@ 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']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$convertToNative) {
|
if (!$convertToNative) {
|
||||||
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;
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -112,8 +114,13 @@ class AmountFormat extends AbstractExtension
|
|||||||
static function (string $amount, string $code, ?bool $coloured = null): string {
|
static function (string $amount, string $code, ?bool $coloured = null): string {
|
||||||
$coloured ??= true;
|
$coloured ??= true;
|
||||||
|
|
||||||
/** @var TransactionCurrency $currency */
|
/** @var null|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) {
|
||||||
|
|||||||
42
changelog.md
42
changelog.md
@@ -3,16 +3,56 @@
|
|||||||
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.3
|
## 6.2.5 - 2025-02-08
|
||||||
|
|
||||||
### Fixed
|
### 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 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
|
- [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 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 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 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
|
- [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
|
## 6.2.2 - 2025-02-02
|
||||||
|
|
||||||
|
|||||||
80
composer.lock
generated
80
composer.lock
generated
@@ -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' => 'develop/2025-02-04',
|
'version' => 'develop/2025-02-10',
|
||||||
'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',
|
||||||
|
|||||||
@@ -50,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');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,7 +159,7 @@ return new class () extends Migration {
|
|||||||
Schema::dropIfExists('account_piggy_bank');
|
Schema::dropIfExists('account_piggy_bank');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function hasForeign(string $table, string $column)
|
protected static function hasForeign(string $table, string $column): bool
|
||||||
{
|
{
|
||||||
|
|
||||||
$foreignKeysDefinitions = Schema::getForeignKeys($table);
|
$foreignKeysDefinitions = Schema::getForeignKeys($table);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
352
package-lock.json
generated
352
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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz",
|
||||||
"integrity": "sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz",
|
||||||
"integrity": "sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz",
|
||||||
"integrity": "sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz",
|
||||||
"integrity": "sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz",
|
||||||
"integrity": "sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz",
|
||||||
"integrity": "sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz",
|
||||||
"integrity": "sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz",
|
||||||
"integrity": "sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz",
|
||||||
"integrity": "sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz",
|
||||||
"integrity": "sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz",
|
||||||
"integrity": "sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz",
|
||||||
"integrity": "sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz",
|
||||||
"integrity": "sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==",
|
"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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz",
|
||||||
"integrity": "sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==",
|
"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": {
|
||||||
@@ -4448,9 +4470,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001697",
|
"version": "1.0.30001699",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
|
||||||
"integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==",
|
"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.91",
|
"version": "1.5.96",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.91.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.96.tgz",
|
||||||
"integrity": "sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ==",
|
"integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@@ -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.34.2",
|
"version": "4.34.6",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.2.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz",
|
||||||
"integrity": "sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==",
|
"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.34.2",
|
"@rollup/rollup-android-arm-eabi": "4.34.6",
|
||||||
"@rollup/rollup-android-arm64": "4.34.2",
|
"@rollup/rollup-android-arm64": "4.34.6",
|
||||||
"@rollup/rollup-darwin-arm64": "4.34.2",
|
"@rollup/rollup-darwin-arm64": "4.34.6",
|
||||||
"@rollup/rollup-darwin-x64": "4.34.2",
|
"@rollup/rollup-darwin-x64": "4.34.6",
|
||||||
"@rollup/rollup-freebsd-arm64": "4.34.2",
|
"@rollup/rollup-freebsd-arm64": "4.34.6",
|
||||||
"@rollup/rollup-freebsd-x64": "4.34.2",
|
"@rollup/rollup-freebsd-x64": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.34.2",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm-musleabihf": "4.34.2",
|
"@rollup/rollup-linux-arm-musleabihf": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.34.2",
|
"@rollup/rollup-linux-arm64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.34.2",
|
"@rollup/rollup-linux-arm64-musl": "4.34.6",
|
||||||
"@rollup/rollup-linux-loongarch64-gnu": "4.34.2",
|
"@rollup/rollup-linux-loongarch64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.34.2",
|
"@rollup/rollup-linux-powerpc64le-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.34.2",
|
"@rollup/rollup-linux-riscv64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-s390x-gnu": "4.34.2",
|
"@rollup/rollup-linux-s390x-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.34.2",
|
"@rollup/rollup-linux-x64-gnu": "4.34.6",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.34.2",
|
"@rollup/rollup-linux-x64-musl": "4.34.6",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.34.2",
|
"@rollup/rollup-win32-arm64-msvc": "4.34.6",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.34.2",
|
"@rollup/rollup-win32-ia32-msvc": "4.34.6",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.34.2",
|
"@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": {
|
||||||
@@ -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>
|
||||||
@@ -74,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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -218,8 +218,8 @@ export default {
|
|||||||
// 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), {
|
const params = new Proxy(new URLSearchParams(window.location.search), {
|
||||||
get: (searchParams, prop) => searchParams.get(prop),
|
get: (searchParams, prop) => searchParams.get(prop),
|
||||||
@@ -381,7 +381,7 @@ export default {
|
|||||||
this.totalPages = parseInt(response.data.meta.pagination.total_pages);
|
this.totalPages = parseInt(response.data.meta.pagination.total_pages);
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
this.rates = Object.values(this.tempRates);
|
this.rates = Object.values(this.tempRates);
|
||||||
console.log('Do not download more pages. Now on page ' + this.page + ' of ' + this.totalPages);
|
// console.log('Do not download more pages. Now on page ' + this.page + ' of ' + this.totalPages);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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}\").",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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": "Pas assez de devises",
|
||||||
|
"not_enough_currencies_enabled": "Si vous n'avez qu'une seule devise activ\u00e9e, il n'y a pas besoin d'ajouter des taux de change.",
|
||||||
"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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
"visit_webhook_url": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u044c URL \u0432\u0435\u0431\u0445\u0443\u043a\u0430",
|
"visit_webhook_url": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u044c URL \u0432\u0435\u0431\u0445\u0443\u043a\u0430",
|
||||||
"reset_webhook_secret": "",
|
"reset_webhook_secret": "",
|
||||||
"header_exchange_rates": "\u041a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442",
|
"header_exchange_rates": "\u041a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u043e\u0432 \u043e\u0431\u043c\u0435\u043d\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 <a href=\"https:\/\/docs.firefly-iii.org\/LOL_NOT_FINISHED_YET_TODO\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.",
|
||||||
"exchange_rates_from_to": "\u041c\u0435\u0436\u0434\u0443 {from} \u0438 {to} (\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442)",
|
"exchange_rates_from_to": "\u041c\u0435\u0436\u0434\u0443 {from} \u0438 {to} (\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442)",
|
||||||
"exchange_rates_intro_rates": "Firefly III \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u044b. \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0434\u0430\u0442\u0443 \u0441\u0434\u0435\u043b\u043a\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u0442\u043e Firefly III \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0415\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043a\u0443\u0440\u0441 \"1\".",
|
"exchange_rates_intro_rates": "Firefly III \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u044b. \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0434\u0430\u0442\u0443 \u0441\u0434\u0435\u043b\u043a\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u0442\u043e Firefly III \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0415\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043a\u0443\u0440\u0441 \"1\".",
|
||||||
"header_exchange_rates_rates": "\u041a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442",
|
"header_exchange_rates_rates": "\u041a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442",
|
||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user