mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-19 19:01:39 +00:00
Compare commits
34 Commits
v6.2.0-alp
...
v6.2.0
Author | SHA1 | Date | |
---|---|---|---|
|
cd0201074c | ||
|
1d8feec7bc | ||
|
d941472c84 | ||
|
674a118fac | ||
|
1334d793f6 | ||
|
60354c0202 | ||
|
22081d3f0a | ||
|
4b3f8fc78d | ||
|
4bd1aab86d | ||
|
60362cb60c | ||
|
27f740bf98 | ||
|
5e15747a5b | ||
|
8a6eaad2bb | ||
|
5ab52d9f66 | ||
|
21a327bf08 | ||
|
15dd175394 | ||
|
3f35305beb | ||
|
768d8b1515 | ||
|
1c19428a12 | ||
|
c204533195 | ||
|
6d89485792 | ||
|
949d818bad | ||
|
a12e200a0a | ||
|
b4039b1f13 | ||
|
32921e15b1 | ||
|
4f7cc7d53b | ||
|
0986bfbc34 | ||
|
663202bfc6 | ||
|
6f63ddf5b0 | ||
|
a9805b144a | ||
|
e1b8b9b3ae | ||
|
d57327fd11 | ||
|
15ac69bfad | ||
|
a5bd28f8d4 |
12
.ci/php-cs-fixer/composer.lock
generated
12
.ci/php-cs-fixer/composer.lock
generated
@@ -406,16 +406,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "friendsofphp/php-cs-fixer",
|
"name": "friendsofphp/php-cs-fixer",
|
||||||
"version": "v3.68.1",
|
"version": "v3.68.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||||
"reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff"
|
"reference": "7bedb718b633355272428c60736dc97fb96daf27"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b9db2b2ea3cdba7201067acee46f984ef2397cff",
|
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7bedb718b633355272428c60736dc97fb96daf27",
|
||||||
"reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff",
|
"reference": "7bedb718b633355272428c60736dc97fb96daf27",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -497,7 +497,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.1"
|
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.5"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -505,7 +505,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-01-17T09:20:36+00:00"
|
"time": "2025-01-30T17:00:50+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/container",
|
"name": "psr/container",
|
||||||
|
@@ -41,6 +41,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class AccountController extends Controller
|
class AccountController extends Controller
|
||||||
{
|
{
|
||||||
use AccountFilter;
|
use AccountFilter;
|
||||||
|
protected array $accepts = ['application/json'];
|
||||||
|
|
||||||
/** @var array<int, string> */
|
/** @var array<int, string> */
|
||||||
private array $balanceTypes;
|
private array $balanceTypes;
|
||||||
@@ -84,12 +85,12 @@ class AccountController extends Controller
|
|||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($result as $account) {
|
foreach ($result as $account) {
|
||||||
$nameWithBalance = $account->name;
|
$nameWithBalance = $account->name;
|
||||||
$currency = $this->repository->getAccountCurrency($account) ?? $this->defaultCurrency;
|
$currency = $this->repository->getAccountCurrency($account) ?? $this->nativeCurrency;
|
||||||
$useCurrency = $currency;
|
$useCurrency = $currency;
|
||||||
if (in_array($account->accountType->type, $this->balanceTypes, true)) {
|
if (in_array($account->accountType->type, $this->balanceTypes, true)) {
|
||||||
$balance = Steam::finalAccountBalance($account, $date);
|
$balance = Steam::finalAccountBalance($account, $date);
|
||||||
$key = $this->convertToNative && $currency->id !== $this->defaultCurrency->id ? 'native_balance' : 'balance';
|
$key = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? 'native_balance' : 'balance';
|
||||||
$useCurrency = $this->convertToNative && $currency->id !== $this->defaultCurrency->id ? $this->defaultCurrency : $currency;
|
$useCurrency = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? $this->nativeCurrency : $currency;
|
||||||
$amount = $balance[$key] ?? '0';
|
$amount = $balance[$key] ?? '0';
|
||||||
$nameWithBalance = sprintf(
|
$nameWithBalance = sprintf(
|
||||||
'%s (%s)',
|
'%s (%s)',
|
||||||
@@ -123,6 +124,6 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json($return);
|
return response()->api($return);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,6 +74,6 @@ class BillController extends Controller
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json($filtered->toArray());
|
return response()->api($filtered->toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -73,6 +73,6 @@ class BudgetController extends Controller
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json($filtered);
|
return response()->api($filtered->toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -73,6 +73,6 @@ class CategoryController extends Controller
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json($filtered);
|
return response()->api($filtered->toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -77,7 +77,7 @@ class CurrencyController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($result);
|
return response()->api($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -103,6 +103,6 @@ class CurrencyController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($result);
|
return response()->api($result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -75,6 +75,6 @@ class ObjectGroupController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($return);
|
return response()->api($return);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -87,7 +87,7 @@ class PiggyBankController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -124,6 +124,6 @@ class PiggyBankController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -73,6 +73,6 @@ class RecurrenceController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -72,6 +72,6 @@ class RuleController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -72,6 +72,6 @@ class RuleGroupController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -75,6 +75,6 @@ class TagController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -84,7 +84,7 @@ class TransactionController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,6 +122,6 @@ class TransactionController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -72,6 +72,6 @@ class TransactionTypeController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -97,8 +97,8 @@ class AccountController extends Controller
|
|||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
$currency = $this->repository->getAccountCurrency($account) ?? $this->defaultCurrency;
|
$currency = $this->repository->getAccountCurrency($account) ?? $this->nativeCurrency;
|
||||||
$field = $this->convertToNative && $currency->id !== $this->defaultCurrency->id ? 'native_balance' : 'balance';
|
$field = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? 'native_balance' : 'balance';
|
||||||
$currentSet = [
|
$currentSet = [
|
||||||
'label' => $account->name,
|
'label' => $account->name,
|
||||||
'currency_id' => (string) $currency->id,
|
'currency_id' => (string) $currency->id,
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers;
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Carbon\Exceptions\InvalidFormatException;
|
use Carbon\Exceptions\InvalidFormatException;
|
||||||
|
use FireflyIII\Exceptions\BadHttpHeaderException;
|
||||||
use FireflyIII\Models\Preference;
|
use FireflyIII\Models\Preference;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
@@ -59,13 +60,15 @@ abstract class Controller extends BaseController
|
|||||||
use DispatchesJobs;
|
use DispatchesJobs;
|
||||||
use ValidatesRequests;
|
use ValidatesRequests;
|
||||||
|
|
||||||
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';
|
||||||
|
|
||||||
/** @var array<int, string> */
|
/** @var array<int, string> */
|
||||||
protected array $allowedSort;
|
protected array $allowedSort;
|
||||||
protected ParameterBag $parameters;
|
protected ParameterBag $parameters;
|
||||||
protected bool $convertToNative = false;
|
protected bool $convertToNative = false;
|
||||||
protected TransactionCurrency $defaultCurrency;
|
protected array $accepts = ['application/json'];
|
||||||
|
protected TransactionCurrency $nativeCurrency;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller constructor.
|
* Controller constructor.
|
||||||
@@ -80,11 +83,17 @@ abstract class Controller extends BaseController
|
|||||||
if (auth()->check()) {
|
if (auth()->check()) {
|
||||||
$language = Steam::getLanguage();
|
$language = Steam::getLanguage();
|
||||||
$this->convertToNative = Amount::convertToNative();
|
$this->convertToNative = Amount::convertToNative();
|
||||||
$this->defaultCurrency = Amount::getNativeCurrency();
|
$this->nativeCurrency = Amount::getNativeCurrency();
|
||||||
app()->setLocale($language);
|
app()->setLocale($language);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// filter down what this endpoint accepts.
|
||||||
|
if (!$request->accepts($this->accepts)) {
|
||||||
|
throw new BadHttpHeaderException(sprintf('Sorry, Accept header "%s" is not something this endpoint can provide.', $request->header('Accept')));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -148,7 +157,15 @@ abstract class Controller extends BaseController
|
|||||||
$value = null;
|
$value = null;
|
||||||
}
|
}
|
||||||
if (null !== $value) {
|
if (null !== $value) {
|
||||||
$bag->set($integer, (int) $value);
|
$value = (int) $value;
|
||||||
|
if ($value < 1) {
|
||||||
|
$value = 1;
|
||||||
|
}
|
||||||
|
if ($value > 2 ** 16) {
|
||||||
|
$value = 2 ** 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
$bag->set($integer, $value);
|
||||||
}
|
}
|
||||||
if (null === $value
|
if (null === $value
|
||||||
&& 'limit' === $integer // @phpstan-ignore-line
|
&& 'limit' === $integer // @phpstan-ignore-line
|
||||||
|
@@ -25,6 +25,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V1\Controllers\Models\Budget;
|
namespace FireflyIII\Api\V1\Controllers\Models\Budget;
|
||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
@@ -208,6 +209,8 @@ class ListController extends Controller
|
|||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector
|
$collector
|
||||||
->setUser($admin)
|
->setUser($admin)
|
||||||
|
// withdrawals only
|
||||||
|
->setTypes([TransactionTypeEnum::WITHDRAWAL->value])
|
||||||
// filter on budget.
|
// filter on budget.
|
||||||
->withoutBudget()
|
->withoutBudget()
|
||||||
// all info needed for the API:
|
// all info needed for the API:
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -22,10 +22,13 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Model\ExchangeRate\DestroyRequest;
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
|
use FireflyIII\Exceptions\ValidationException;
|
||||||
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
@@ -36,6 +39,8 @@ class DestroyController extends Controller
|
|||||||
{
|
{
|
||||||
use ValidatesUserGroupTrait;
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
|
|
||||||
public const string RESOURCE_KEY = 'exchange-rates';
|
public const string RESOURCE_KEY = 'exchange-rates';
|
||||||
|
|
||||||
private ExchangeRateRepositoryInterface $repository;
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
@@ -56,6 +61,9 @@ class DestroyController extends Controller
|
|||||||
public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
||||||
{
|
{
|
||||||
$date = $request->getDate();
|
$date = $request->getDate();
|
||||||
|
if (null === $date) {
|
||||||
|
throw new ValidationException('Date is required');
|
||||||
|
}
|
||||||
$rate = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
$rate = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
if (null === $rate) {
|
if (null === $rate) {
|
||||||
throw new NotFoundHttpException();
|
throw new NotFoundHttpException();
|
||||||
@@ -64,4 +72,11 @@ class DestroyController extends Controller
|
|||||||
|
|
||||||
return response()->json([], 204);
|
return response()->json([], 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function destroySingle(CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
|
{
|
||||||
|
$this->repository->deleteRate($exchangeRate);
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
}
|
}
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* IndexController.php
|
||||||
* Copyright (c) 2023 james@firefly-iii.org
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -17,12 +17,12 @@
|
|||||||
* GNU Affero General Public License for more details.
|
* GNU Affero General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
@@ -38,7 +38,7 @@ class IndexController extends Controller
|
|||||||
{
|
{
|
||||||
use ValidatesUserGroupTrait;
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
public const string RESOURCE_KEY = 'exchange-rates';
|
public const string RESOURCE_KEY = 'currency_exchange_rates';
|
||||||
|
|
||||||
private ExchangeRateRepositoryInterface $repository;
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
@@ -62,9 +62,6 @@ class IndexController extends Controller
|
|||||||
$count = $piggies->count();
|
$count = $piggies->count();
|
||||||
$piggies = $piggies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$piggies = $piggies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
$paginator = new LengthAwarePaginator($piggies, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($piggies, $count, $pageSize, $this->parameters->get('page'));
|
||||||
|
|
||||||
var_dump('here we are');
|
|
||||||
|
|
||||||
$transformer = new ExchangeRateTransformer();
|
$transformer = new ExchangeRateTransformer();
|
||||||
$transformer->setParameters($this->parameters); // give params to transformer
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2023 james@firefly-iii.org
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -17,14 +17,15 @@
|
|||||||
* GNU Affero General Public License for more details.
|
* GNU Affero General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
@@ -73,4 +74,15 @@ class ShowController extends Controller
|
|||||||
->header('Content-Type', self::CONTENT_TYPE)
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function showSingle(CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
|
{
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* StoreController.php
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -22,10 +22,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest;
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Model\ExchangeRate\StoreRequest;
|
|
||||||
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use FireflyIII\Transformers\V2\ExchangeRateTransformer;
|
use FireflyIII\Transformers\V2\ExchangeRateTransformer;
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -22,10 +22,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest;
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Model\ExchangeRate\UpdateRequest;
|
|
||||||
use FireflyIII\Models\CurrencyExchangeRate;
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
@@ -72,13 +72,6 @@ class UpdateController extends Controller
|
|||||||
{
|
{
|
||||||
app('log')->debug('Now in update routine for transaction group');
|
app('log')->debug('Now in update routine for transaction group');
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
|
|
||||||
// Fixes 8750.
|
|
||||||
$transactions = $data['transactions'] ?? [];
|
|
||||||
foreach ($transactions as $index => $info) {
|
|
||||||
unset($data['transactions'][$index]['type']);
|
|
||||||
}
|
|
||||||
|
|
||||||
$transactionGroup = $this->groupRepository->update($transactionGroup, $data);
|
$transactionGroup = $this->groupRepository->update($transactionGroup, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
@@ -107,7 +107,7 @@ class ShowController extends Controller
|
|||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
$this->parameters->set('defaultCurrency', $this->defaultCurrency);
|
$this->parameters->set('nativeCurrency', $this->nativeCurrency);
|
||||||
|
|
||||||
// update fields with user info.
|
// update fields with user info.
|
||||||
$currency->refreshForUser($user);
|
$currency->refreshForUser($user);
|
||||||
@@ -123,7 +123,7 @@ class ShowController extends Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/getDefaultCurrency
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/getNativeCurrency
|
||||||
*
|
*
|
||||||
* Show a currency.
|
* Show a currency.
|
||||||
*
|
*
|
||||||
@@ -134,7 +134,7 @@ class ShowController extends Controller
|
|||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
$currency = $this->defaultCurrency;
|
$currency = $this->nativeCurrency;
|
||||||
|
|
||||||
// update fields with user info.
|
// update fields with user info.
|
||||||
$currency->refreshForUser($user);
|
$currency->refreshForUser($user);
|
||||||
|
@@ -100,7 +100,7 @@ class UpdateController extends Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/defaultCurrency
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/nativeCurrency
|
||||||
*
|
*
|
||||||
* Make the currency a default currency.
|
* Make the currency a default currency.
|
||||||
*
|
*
|
||||||
|
@@ -58,7 +58,7 @@ class AboutController extends Controller
|
|||||||
'driver' => $currentDriver,
|
'driver' => $currentDriver,
|
||||||
];
|
];
|
||||||
|
|
||||||
return response()->api(['data' => $data])->header('Content-Type', self::CONTENT_TYPE);
|
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -86,7 +86,7 @@ class ConfigurationController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($return);
|
return response()->api($return);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -142,7 +142,7 @@ class ConfigurationController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(['data' => $data])->header('Content-Type', self::CONTENT_TYPE);
|
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -173,6 +173,6 @@ class ConfigurationController extends Controller
|
|||||||
'editable' => true,
|
'editable' => true,
|
||||||
];
|
];
|
||||||
|
|
||||||
return response()->json(['data' => $data])->header('Content-Type', self::CONTENT_TYPE);
|
return response()->api(['data' => $data])->header('Content-Type', self::CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -52,8 +52,8 @@ class CronController extends Controller
|
|||||||
if (true === config('cer.download_enabled')) {
|
if (true === config('cer.download_enabled')) {
|
||||||
$return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']);
|
$return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']);
|
||||||
}
|
}
|
||||||
$return['bill_warnings'] = $this->billWarningCronJob($config['force'], $config['date']);
|
$return['bill_notifications'] = $this->billWarningCronJob($config['force'], $config['date']);
|
||||||
|
|
||||||
return response()->json($return);
|
return response()->api($return);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -32,7 +32,6 @@ use FireflyIII\Models\Preference;
|
|||||||
use FireflyIII\Transformers\PreferenceTransformer;
|
use FireflyIII\Transformers\PreferenceTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Support\Collection;
|
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
use League\Fractal\Resource\Collection as FractalCollection;
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
@@ -86,7 +85,7 @@ class PreferencesController extends Controller
|
|||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
if ('currencyPreference' === $preference->name) {
|
if ('currencyPreference' === $preference->name) {
|
||||||
throw new FireflyException('Please use api/v1/currencies/default instead.');
|
throw new FireflyException('Please use api/v1/currencies/native instead.');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var PreferenceTransformer $transformer */
|
/** @var PreferenceTransformer $transformer */
|
||||||
@@ -98,34 +97,6 @@ class PreferencesController extends Controller
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO This endpoint is not documented.
|
|
||||||
*
|
|
||||||
* Return a single preference by name.
|
|
||||||
*
|
|
||||||
* @param Collection<int, Preference> $collection
|
|
||||||
*/
|
|
||||||
public function showList(Collection $collection): JsonResponse
|
|
||||||
{
|
|
||||||
$manager = $this->getManager();
|
|
||||||
$count = $collection->count();
|
|
||||||
$pageSize = $this->parameters->get('limit');
|
|
||||||
$preferences = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
|
||||||
|
|
||||||
// make paginator:
|
|
||||||
$paginator = new LengthAwarePaginator($preferences, $count, $pageSize, $this->parameters->get('page'));
|
|
||||||
$paginator->setPath(route('api.v1.preferences.show-list').$this->buildParams());
|
|
||||||
|
|
||||||
/** @var PreferenceTransformer $transformer */
|
|
||||||
$transformer = app(PreferenceTransformer::class);
|
|
||||||
$transformer->setParameters($this->parameters);
|
|
||||||
|
|
||||||
$resource = new FractalCollection($preferences, $transformer, self::RESOURCE_KEY);
|
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/preferences/storePreference
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/preferences/storePreference
|
||||||
@@ -161,7 +132,7 @@ class PreferencesController extends Controller
|
|||||||
public function update(PreferenceUpdateRequest $request, Preference $preference): JsonResponse
|
public function update(PreferenceUpdateRequest $request, Preference $preference): JsonResponse
|
||||||
{
|
{
|
||||||
if ('currencyPreference' === $preference->name) {
|
if ('currencyPreference' === $preference->name) {
|
||||||
throw new FireflyException('Please use api/v1/currencies/default instead.');
|
throw new FireflyException('Please use api/v1/currencies/native instead.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
@@ -58,6 +58,7 @@ class AutocompleteRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
'date' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Data;
|
namespace FireflyIII\Api\V1\Requests\Data;
|
||||||
|
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\ValidationException;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
@@ -49,7 +49,7 @@ class DateRequest extends FormRequest
|
|||||||
$start->startOfDay();
|
$start->startOfDay();
|
||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
if ($start->diffInYears($end, true) > 5) {
|
if ($start->diffInYears($end, true) > 5) {
|
||||||
throw new FireflyException('Date range out of range.');
|
throw new ValidationException('Date range out of range.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests\Models\Account;
|
|||||||
|
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Location;
|
use FireflyIII\Models\Location;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\UniqueAccountNumber;
|
use FireflyIII\Rules\UniqueAccountNumber;
|
||||||
use FireflyIII\Rules\UniqueIban;
|
use FireflyIII\Rules\UniqueIban;
|
||||||
@@ -33,6 +34,8 @@ use FireflyIII\Support\Request\AppendsLocationData;
|
|||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class UpdateRequest
|
* Class UpdateRequest
|
||||||
@@ -112,4 +115,36 @@ class UpdateRequest extends FormRequest
|
|||||||
|
|
||||||
return Location::requestRules($rules);
|
return Location::requestRules($rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the validator instance with special rules for after the basic validation rules.
|
||||||
|
*/
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$validator->after(
|
||||||
|
function (Validator $validator): void {
|
||||||
|
// validate start before end only if both are there.
|
||||||
|
$data = $validator->getData();
|
||||||
|
|
||||||
|
/** @var Account $account */
|
||||||
|
$account = $this->route()->parameter('account');
|
||||||
|
|
||||||
|
/** @var AccountRepositoryInterface $repository */
|
||||||
|
$repository = app(AccountRepositoryInterface::class);
|
||||||
|
$currency = $repository->getAccountCurrency($account);
|
||||||
|
|
||||||
|
// how many piggies are attached?
|
||||||
|
$piggyBanks = $account->piggyBanks()->count();
|
||||||
|
if ($piggyBanks > 0 && array_key_exists('currency_code', $data) && $data['currency_code'] !== $currency->code) {
|
||||||
|
$validator->errors()->add('currency_code', (string) trans('validation.piggy_no_change_currency'));
|
||||||
|
}
|
||||||
|
if ($piggyBanks > 0 && array_key_exists('currency_id', $data) && (int) $data['currency_id'] !== $currency->id) {
|
||||||
|
$validator->errors()->add('currency_id', (string) trans('validation.piggy_no_change_currency'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
if ($validator->fails()) {
|
||||||
|
Log::channel('audit')->error(sprintf('Validation errors in %s', __CLASS__), $validator->errors()->toArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -66,8 +66,8 @@ class Request extends FormRequest
|
|||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'amount' => ['nullable', new IsValidPositiveAmount()],
|
'amount' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date',
|
'end' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -78,9 +78,9 @@ class StoreRequest extends FormRequest
|
|||||||
'amount_max' => ['required', new IsValidPositiveAmount()],
|
'amount_max' => ['required', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'date' => 'date|required',
|
'date' => 'date|required|after:1900-01-01|before:2099-12-31',
|
||||||
'end_date' => 'nullable|date|after:date',
|
'end_date' => 'nullable|date|after:date|after:1900-01-01|before:2099-12-31',
|
||||||
'extension_date' => 'nullable|date|after:date',
|
'extension_date' => 'nullable|date|after:date|after:1900-01-01|before:2099-12-31',
|
||||||
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly|required',
|
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly|required',
|
||||||
'skip' => 'min:0|max:31|numeric',
|
'skip' => 'min:0|max:31|numeric',
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
@@ -95,16 +95,40 @@ class StoreRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
$validator->after(
|
$validator->after(
|
||||||
static function (Validator $validator): void {
|
static function (Validator $validator): void {
|
||||||
$data = $validator->getData();
|
$data = $validator->getData();
|
||||||
$min = (string) ($data['amount_min'] ?? '0');
|
$min = $data['amount_min'] ?? '0';
|
||||||
$max = (string) ($data['amount_max'] ?? '0');
|
$max = $data['amount_max'] ?? '0';
|
||||||
|
|
||||||
if (1 === bccomp($min, $max)) {
|
if (is_array($min) || is_array($max)) {
|
||||||
|
$validator->errors()->add('amount_min', (string) trans('validation.generic_invalid'));
|
||||||
|
$validator->errors()->add('amount_max', (string) trans('validation.generic_invalid'));
|
||||||
|
$min = '0';
|
||||||
|
$max = '0';
|
||||||
|
}
|
||||||
|
$result = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$result = bccomp($min, $max);
|
||||||
|
} catch (\ValueError $e) {
|
||||||
|
Log::error($e->getMessage());
|
||||||
|
$validator->errors()->add('amount_min', (string) trans('validation.generic_invalid'));
|
||||||
|
$validator->errors()->add('amount_max', (string) trans('validation.generic_invalid'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1 === $result) {
|
||||||
$validator->errors()->add('amount_min', (string) trans('validation.amount_min_over_max'));
|
$validator->errors()->add('amount_min', (string) trans('validation.amount_min_over_max'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
if ($validator->fails()) {
|
$failed = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$failed = $validator->fails();
|
||||||
|
} catch (\TypeError $e) {
|
||||||
|
Log::error($e->getMessage());
|
||||||
|
$failed = false;
|
||||||
|
}
|
||||||
|
if ($failed) {
|
||||||
Log::channel('audit')->error(sprintf('Validation errors in %s', __CLASS__), $validator->errors()->toArray());
|
Log::channel('audit')->error(sprintf('Validation errors in %s', __CLASS__), $validator->errors()->toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -81,9 +81,9 @@ class UpdateRequest extends FormRequest
|
|||||||
'amount_max' => ['nullable', new IsValidPositiveAmount()],
|
'amount_max' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'date' => 'date',
|
'date' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end_date' => 'date|after:date',
|
'end_date' => 'date|after:date|after:1900-01-01|before:2099-12-31',
|
||||||
'extension_date' => 'date|after:date',
|
'extension_date' => 'date|after:date|after:1900-01-01|before:2099-12-31',
|
||||||
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly',
|
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly',
|
||||||
'skip' => 'min:0|max:31|numeric',
|
'skip' => 'min:0|max:31|numeric',
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
|
@@ -67,8 +67,8 @@ class UpdateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date',
|
'end' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'amount' => ['nullable', new IsValidPositiveAmount()],
|
'amount' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyRequest.php
|
* DestroyRequest.php
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Request\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
@@ -34,7 +34,7 @@ class DestroyRequest extends FormRequest
|
|||||||
use ChecksLogin;
|
use ChecksLogin;
|
||||||
use ConvertsDataTypes;
|
use ConvertsDataTypes;
|
||||||
|
|
||||||
public function getDate(): Carbon
|
public function getDate(): ?Carbon
|
||||||
{
|
{
|
||||||
return $this->getCarbonDate('date');
|
return $this->getCarbonDate('date');
|
||||||
}
|
}
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyRequest.php
|
* StoreRequest.php
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Request\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyRequest.php
|
* UpdateRequest.php
|
||||||
* Copyright (c) 2024 james@firefly-iii.org.
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Request\Model\ExchangeRate;
|
namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
@@ -154,7 +154,7 @@ class UpdateRequest extends FormRequest
|
|||||||
return [
|
return [
|
||||||
'title' => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id),
|
'title' => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id),
|
||||||
'description' => 'min:1|max:32768',
|
'description' => 'min:1|max:32768',
|
||||||
'first_date' => 'date',
|
'first_date' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'apply_rules' => [new IsBoolean()],
|
'apply_rules' => [new IsBoolean()],
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
'repeat_until' => 'nullable|date',
|
'repeat_until' => 'nullable|date',
|
||||||
|
@@ -71,8 +71,8 @@ class TestRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date|after_or_equal:start',
|
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
||||||
'accounts' => '',
|
'accounts' => '',
|
||||||
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
|
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
|
||||||
];
|
];
|
||||||
|
@@ -65,8 +65,8 @@ class TriggerRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date|after_or_equal:start',
|
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
||||||
'accounts' => '',
|
'accounts' => '',
|
||||||
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
||||||
];
|
];
|
||||||
|
@@ -65,8 +65,8 @@ class TestRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date|after_or_equal:start',
|
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
||||||
'accounts' => '',
|
'accounts' => '',
|
||||||
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
||||||
];
|
];
|
||||||
|
@@ -69,8 +69,8 @@ class TriggerRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date|after_or_equal:start',
|
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -62,7 +62,7 @@ class StoreRequest extends FormRequest
|
|||||||
$rules = [
|
$rules = [
|
||||||
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024',
|
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024',
|
||||||
'description' => 'min:1|nullable|max:32768',
|
'description' => 'min:1|nullable|max:32768',
|
||||||
'date' => 'date|nullable',
|
'date' => 'date|nullable|after:1900-01-01|before:2099-12-31',
|
||||||
];
|
];
|
||||||
|
|
||||||
return Location::requestRules($rules);
|
return Location::requestRules($rules);
|
||||||
|
@@ -63,11 +63,10 @@ class UpdateRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
/** @var Tag $tag */
|
/** @var Tag $tag */
|
||||||
$tag = $this->route()->parameter('tagOrId');
|
$tag = $this->route()->parameter('tagOrId');
|
||||||
// TODO check if uniqueObjectForUser is obsolete
|
|
||||||
$rules = [
|
$rules = [
|
||||||
'tag' => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id,
|
'tag' => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id,
|
||||||
'description' => 'min:1|nullable|max:32768',
|
'description' => 'min:1|nullable|max:32768',
|
||||||
'date' => 'date|nullable',
|
'date' => 'date|nullable|after:1900-01-01|before:2099-12-31',
|
||||||
];
|
];
|
||||||
|
|
||||||
return Location::requestRules($rules);
|
return Location::requestRules($rules);
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Location;
|
||||||
use FireflyIII\Rules\BelongsUser;
|
use FireflyIII\Rules\BelongsUser;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsDateOrTime;
|
use FireflyIII\Rules\IsDateOrTime;
|
||||||
@@ -82,82 +83,87 @@ class StoreRequest extends FormRequest
|
|||||||
foreach ($this->get('transactions') as $transaction) {
|
foreach ($this->get('transactions') as $transaction) {
|
||||||
$object = new NullArrayObject($transaction);
|
$object = new NullArrayObject($transaction);
|
||||||
$return[] = [
|
$return[] = [
|
||||||
'type' => $this->clearString($object['type']),
|
'type' => $this->clearString($object['type']),
|
||||||
'date' => $this->dateFromValue($object['date']),
|
'date' => $this->dateFromValue($object['date']),
|
||||||
'order' => $this->integerFromValue((string) $object['order']),
|
'order' => $this->integerFromValue((string) $object['order']),
|
||||||
|
|
||||||
'currency_id' => $this->integerFromValue((string) $object['currency_id']),
|
'currency_id' => $this->integerFromValue((string) $object['currency_id']),
|
||||||
'currency_code' => $this->clearString((string) $object['currency_code']),
|
'currency_code' => $this->clearString((string) $object['currency_code']),
|
||||||
|
|
||||||
|
// location
|
||||||
|
'latitude' => $this->floatFromValue((string) $object['latitude']),
|
||||||
|
'longitude' => $this->floatFromValue((string) $object['longitude']),
|
||||||
|
'zoom_level' => $this->integerFromValue((string) $object['zoom_level']),
|
||||||
|
|
||||||
// foreign currency info:
|
// foreign currency info:
|
||||||
'foreign_currency_id' => $this->integerFromValue((string) $object['foreign_currency_id']),
|
'foreign_currency_id' => $this->integerFromValue((string) $object['foreign_currency_id']),
|
||||||
'foreign_currency_code' => $this->clearString((string) $object['foreign_currency_code']),
|
'foreign_currency_code' => $this->clearString((string) $object['foreign_currency_code']),
|
||||||
|
|
||||||
// amount and foreign amount. Cannot be 0.
|
// amount and foreign amount. Cannot be 0.
|
||||||
'amount' => $this->clearString((string) $object['amount']),
|
'amount' => $this->clearString((string) $object['amount']),
|
||||||
'foreign_amount' => $this->clearString((string) $object['foreign_amount']),
|
'foreign_amount' => $this->clearString((string) $object['foreign_amount']),
|
||||||
|
|
||||||
// description.
|
// description.
|
||||||
'description' => $this->clearString($object['description']),
|
'description' => $this->clearString($object['description']),
|
||||||
|
|
||||||
// source of transaction. If everything is null, assume cash account.
|
// source of transaction. If everything is null, assume cash account.
|
||||||
'source_id' => $this->integerFromValue((string) $object['source_id']),
|
'source_id' => $this->integerFromValue((string) $object['source_id']),
|
||||||
'source_name' => $this->clearString((string) $object['source_name']),
|
'source_name' => $this->clearString((string) $object['source_name']),
|
||||||
'source_iban' => $this->clearIban((string) $object['source_iban']),
|
'source_iban' => $this->clearIban((string) $object['source_iban']),
|
||||||
'source_number' => $this->clearString((string) $object['source_number']),
|
'source_number' => $this->clearString((string) $object['source_number']),
|
||||||
'source_bic' => $this->clearString((string) $object['source_bic']),
|
'source_bic' => $this->clearString((string) $object['source_bic']),
|
||||||
|
|
||||||
// destination of transaction. If everything is null, assume cash account.
|
// destination of transaction. If everything is null, assume cash account.
|
||||||
'destination_id' => $this->integerFromValue((string) $object['destination_id']),
|
'destination_id' => $this->integerFromValue((string) $object['destination_id']),
|
||||||
'destination_name' => $this->clearString((string) $object['destination_name']),
|
'destination_name' => $this->clearString((string) $object['destination_name']),
|
||||||
'destination_iban' => $this->clearIban((string) $object['destination_iban']),
|
'destination_iban' => $this->clearIban((string) $object['destination_iban']),
|
||||||
'destination_number' => $this->clearString((string) $object['destination_number']),
|
'destination_number' => $this->clearString((string) $object['destination_number']),
|
||||||
'destination_bic' => $this->clearString((string) $object['destination_bic']),
|
'destination_bic' => $this->clearString((string) $object['destination_bic']),
|
||||||
|
|
||||||
// budget info
|
// budget info
|
||||||
'budget_id' => $this->integerFromValue((string) $object['budget_id']),
|
'budget_id' => $this->integerFromValue((string) $object['budget_id']),
|
||||||
'budget_name' => $this->clearString((string) $object['budget_name']),
|
'budget_name' => $this->clearString((string) $object['budget_name']),
|
||||||
|
|
||||||
// category info
|
// category info
|
||||||
'category_id' => $this->integerFromValue((string) $object['category_id']),
|
'category_id' => $this->integerFromValue((string) $object['category_id']),
|
||||||
'category_name' => $this->clearString((string) $object['category_name']),
|
'category_name' => $this->clearString((string) $object['category_name']),
|
||||||
|
|
||||||
// journal bill reference. Optional. Will only work for withdrawals
|
// journal bill reference. Optional. Will only work for withdrawals
|
||||||
'bill_id' => $this->integerFromValue((string) $object['bill_id']),
|
'bill_id' => $this->integerFromValue((string) $object['bill_id']),
|
||||||
'bill_name' => $this->clearString((string) $object['bill_name']),
|
'bill_name' => $this->clearString((string) $object['bill_name']),
|
||||||
|
|
||||||
// piggy bank reference. Optional. Will only work for transfers
|
// piggy bank reference. Optional. Will only work for transfers
|
||||||
'piggy_bank_id' => $this->integerFromValue((string) $object['piggy_bank_id']),
|
'piggy_bank_id' => $this->integerFromValue((string) $object['piggy_bank_id']),
|
||||||
'piggy_bank_name' => $this->clearString((string) $object['piggy_bank_name']),
|
'piggy_bank_name' => $this->clearString((string) $object['piggy_bank_name']),
|
||||||
|
|
||||||
// some other interesting properties
|
// some other interesting properties
|
||||||
'reconciled' => $this->convertBoolean((string) $object['reconciled']),
|
'reconciled' => $this->convertBoolean((string) $object['reconciled']),
|
||||||
'notes' => $this->clearStringKeepNewlines((string) $object['notes']),
|
'notes' => $this->clearStringKeepNewlines((string) $object['notes']),
|
||||||
'tags' => $this->arrayFromValue($object['tags']),
|
'tags' => $this->arrayFromValue($object['tags']),
|
||||||
|
|
||||||
// all custom fields:
|
// all custom fields:
|
||||||
'internal_reference' => $this->clearString((string) $object['internal_reference']),
|
'internal_reference' => $this->clearString((string) $object['internal_reference']),
|
||||||
'external_id' => $this->clearString((string) $object['external_id']),
|
'external_id' => $this->clearString((string) $object['external_id']),
|
||||||
'original_source' => sprintf('ff3-v%s', config('firefly.version')),
|
'original_source' => sprintf('ff3-v%s', config('firefly.version')),
|
||||||
'recurrence_id' => $this->integerFromValue($object['recurrence_id']),
|
'recurrence_id' => $this->integerFromValue($object['recurrence_id']),
|
||||||
'bunq_payment_id' => $this->clearString((string) $object['bunq_payment_id']),
|
'bunq_payment_id' => $this->clearString((string) $object['bunq_payment_id']),
|
||||||
'external_url' => $this->clearString((string) $object['external_url']),
|
'external_url' => $this->clearString((string) $object['external_url']),
|
||||||
|
|
||||||
'sepa_cc' => $this->clearString((string) $object['sepa_cc']),
|
'sepa_cc' => $this->clearString((string) $object['sepa_cc']),
|
||||||
'sepa_ct_op' => $this->clearString((string) $object['sepa_ct_op']),
|
'sepa_ct_op' => $this->clearString((string) $object['sepa_ct_op']),
|
||||||
'sepa_ct_id' => $this->clearString((string) $object['sepa_ct_id']),
|
'sepa_ct_id' => $this->clearString((string) $object['sepa_ct_id']),
|
||||||
'sepa_db' => $this->clearString((string) $object['sepa_db']),
|
'sepa_db' => $this->clearString((string) $object['sepa_db']),
|
||||||
'sepa_country' => $this->clearString((string) $object['sepa_country']),
|
'sepa_country' => $this->clearString((string) $object['sepa_country']),
|
||||||
'sepa_ep' => $this->clearString((string) $object['sepa_ep']),
|
'sepa_ep' => $this->clearString((string) $object['sepa_ep']),
|
||||||
'sepa_ci' => $this->clearString((string) $object['sepa_ci']),
|
'sepa_ci' => $this->clearString((string) $object['sepa_ci']),
|
||||||
'sepa_batch_id' => $this->clearString((string) $object['sepa_batch_id']),
|
'sepa_batch_id' => $this->clearString((string) $object['sepa_batch_id']),
|
||||||
// custom date fields. Must be Carbon objects. Presence is optional.
|
// custom date fields. Must be Carbon objects. Presence is optional.
|
||||||
'interest_date' => $this->dateFromValue($object['interest_date']),
|
'interest_date' => $this->dateFromValue($object['interest_date']),
|
||||||
'book_date' => $this->dateFromValue($object['book_date']),
|
'book_date' => $this->dateFromValue($object['book_date']),
|
||||||
'process_date' => $this->dateFromValue($object['process_date']),
|
'process_date' => $this->dateFromValue($object['process_date']),
|
||||||
'due_date' => $this->dateFromValue($object['due_date']),
|
'due_date' => $this->dateFromValue($object['due_date']),
|
||||||
'payment_date' => $this->dateFromValue($object['payment_date']),
|
'payment_date' => $this->dateFromValue($object['payment_date']),
|
||||||
'invoice_date' => $this->dateFromValue($object['invoice_date']),
|
'invoice_date' => $this->dateFromValue($object['invoice_date']),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,6 +177,7 @@ class StoreRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
app('log')->debug('Collect rules of TransactionStoreRequest');
|
app('log')->debug('Collect rules of TransactionStoreRequest');
|
||||||
$validProtocols = config('firefly.valid_url_protocols');
|
$validProtocols = config('firefly.valid_url_protocols');
|
||||||
|
$locationRules = Location::requestRules([]);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// basic fields for group:
|
// basic fields for group:
|
||||||
@@ -178,6 +185,11 @@ class StoreRequest extends FormRequest
|
|||||||
'error_if_duplicate_hash' => [new IsBoolean()],
|
'error_if_duplicate_hash' => [new IsBoolean()],
|
||||||
'apply_rules' => [new IsBoolean()],
|
'apply_rules' => [new IsBoolean()],
|
||||||
|
|
||||||
|
// location rules
|
||||||
|
'transactions.*.latitude' => $locationRules['latitude'],
|
||||||
|
'transactions.*.longitude' => $locationRules['longitude'],
|
||||||
|
'transactions.*.zoom_level' => $locationRules['zoom_level'],
|
||||||
|
|
||||||
// transaction rules (in array for splits):
|
// transaction rules (in array for splits):
|
||||||
'transactions.*.type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation',
|
'transactions.*.type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation',
|
||||||
'transactions.*.date' => ['required', new IsDateOrTime()],
|
'transactions.*.date' => ['required', new IsDateOrTime()],
|
||||||
|
@@ -57,6 +57,10 @@ class CronRequest extends FormRequest
|
|||||||
if ($this->has('date')) {
|
if ($this->has('date')) {
|
||||||
$data['date'] = $this->getCarbonDate('date');
|
$data['date'] = $this->getCarbonDate('date');
|
||||||
}
|
}
|
||||||
|
// catch NULL.
|
||||||
|
if (null === $data['date']) {
|
||||||
|
$data['date'] = today(config('app.timezone'));
|
||||||
|
}
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
@@ -68,7 +72,7 @@ class CronRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'force' => 'in:true,false',
|
'force' => 'in:true,false',
|
||||||
'date' => 'date',
|
'date' => 'nullable|date|after:1900-01-01|before:2099-12-31',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -109,8 +109,8 @@ class InfiniteListRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date|after:start',
|
'end' => 'date|after:start|after:1900-01-01|before:2099-12-31',
|
||||||
'start_row' => 'integer|min:0|max:4294967296',
|
'start_row' => 'integer|min:0|max:4294967296',
|
||||||
'end_row' => 'integer|min:0|max:4294967296|gt:start_row',
|
'end_row' => 'integer|min:0|max:4294967296|gt:start_row',
|
||||||
];
|
];
|
||||||
|
@@ -84,8 +84,8 @@ class ListRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date',
|
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
||||||
'end' => 'date|after:start',
|
'end' => 'date|after:start|after:1900-01-01|before:2099-12-31',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Exceptions;
|
namespace FireflyIII\Exceptions;
|
||||||
|
|
||||||
|
use Brick\Math\Exception\NumberFormatException;
|
||||||
use FireflyIII\Jobs\MailError;
|
use FireflyIII\Jobs\MailError;
|
||||||
use Illuminate\Auth\Access\AuthorizationException;
|
use Illuminate\Auth\Access\AuthorizationException;
|
||||||
use Illuminate\Auth\AuthenticationException;
|
use Illuminate\Auth\AuthenticationException;
|
||||||
@@ -124,7 +125,7 @@ class Handler extends ExceptionHandler
|
|||||||
if ($e instanceof BadRequestHttpException) {
|
if ($e instanceof BadRequestHttpException) {
|
||||||
app('log')->debug('Return JSON BadRequestHttpException.');
|
app('log')->debug('Return JSON BadRequestHttpException.');
|
||||||
|
|
||||||
return response()->json(['message' => $e->getMessage(), 'exception' => 'BadRequestHttpException'], 400);
|
return response()->json(['message' => $e->getMessage(), 'exception' => 'HttpException'], 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($e instanceof BadHttpHeaderException) {
|
if ($e instanceof BadHttpHeaderException) {
|
||||||
@@ -133,6 +134,14 @@ class Handler extends ExceptionHandler
|
|||||||
|
|
||||||
return response()->json(['message' => $e->getMessage(), 'exception' => 'BadHttpHeaderException'], $e->statusCode);
|
return response()->json(['message' => $e->getMessage(), 'exception' => 'BadHttpHeaderException'], $e->statusCode);
|
||||||
}
|
}
|
||||||
|
if (($e instanceof ValidationException || $e instanceof NumberFormatException) && $expectsJson) {
|
||||||
|
$errorCode = 422;
|
||||||
|
|
||||||
|
return response()->json(
|
||||||
|
['message' => sprintf('Validation exception: %s', $e->getMessage()), 'errors' => ['field' => 'Field is invalid']],
|
||||||
|
$errorCode
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if ($expectsJson) {
|
if ($expectsJson) {
|
||||||
$errorCode = 500;
|
$errorCode = 500;
|
||||||
@@ -156,7 +165,7 @@ class Handler extends ExceptionHandler
|
|||||||
app('log')->debug(sprintf('Return JSON %s.', get_class($e)));
|
app('log')->debug(sprintf('Return JSON %s.', get_class($e)));
|
||||||
|
|
||||||
return response()->json(
|
return response()->json(
|
||||||
['message' => sprintf('Internal Firefly III Exception: %s', $e->getMessage()), 'exception' => get_class($e)],
|
['message' => sprintf('Internal Firefly III Exception: %s', $e->getMessage()), 'exception' => 'UndisclosedException'],
|
||||||
$errorCode
|
$errorCode
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -576,7 +576,7 @@ class TransactionJournalFactory
|
|||||||
|
|
||||||
private function storeLocation(TransactionJournal $journal, NullArrayObject $data): void
|
private function storeLocation(TransactionJournal $journal, NullArrayObject $data): void
|
||||||
{
|
{
|
||||||
if (true === $data['store_location']) {
|
if (null !== $data['longitude'] && null !== $data['latitude'] && null !== $data['zoom_level']) {
|
||||||
$location = new Location();
|
$location = new Location();
|
||||||
$location->longitude = $data['longitude'];
|
$location->longitude = $data['longitude'];
|
||||||
$location->latitude = $data['latitude'];
|
$location->latitude = $data['latitude'];
|
||||||
|
@@ -106,6 +106,7 @@ class IndexController extends Controller
|
|||||||
$account->interestPeriod = (string) trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period')));
|
$account->interestPeriod = (string) trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period')));
|
||||||
$account->accountTypeString = (string) trans(sprintf('firefly.account_type_%s', $account->accountType->type));
|
$account->accountTypeString = (string) trans(sprintf('firefly.account_type_%s', $account->accountType->type));
|
||||||
$account->current_debt = '0';
|
$account->current_debt = '0';
|
||||||
|
$account->currency = $currency ?? $this->defaultCurrency;
|
||||||
$account->iban = implode(' ', str_split((string) $account->iban, 4));
|
$account->iban = implode(' ', str_split((string) $account->iban, 4));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@@ -95,17 +95,22 @@ abstract class Controller extends BaseController
|
|||||||
|
|
||||||
// share is alpha, is beta
|
// share is alpha, is beta
|
||||||
$isAlpha = false;
|
$isAlpha = false;
|
||||||
|
$isBeta = false;
|
||||||
|
$isDevelop = false;
|
||||||
if (str_contains(config('firefly.version'), 'alpha')) {
|
if (str_contains(config('firefly.version'), 'alpha')) {
|
||||||
$isAlpha = true;
|
$isAlpha = true;
|
||||||
}
|
}
|
||||||
|
if (str_contains(config('firefly.version'), 'develop') || str_contains(config('firefly.version'), 'branch')) {
|
||||||
|
$isDevelop = true;
|
||||||
|
}
|
||||||
|
|
||||||
$isBeta = false;
|
|
||||||
if (str_contains(config('firefly.version'), 'beta')) {
|
if (str_contains(config('firefly.version'), 'beta')) {
|
||||||
$isBeta = true;
|
$isBeta = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
View::share('FF_IS_ALPHA', $isAlpha);
|
View::share('FF_IS_ALPHA', $isAlpha);
|
||||||
View::share('FF_IS_BETA', $isBeta);
|
View::share('FF_IS_BETA', $isBeta);
|
||||||
|
View::share('FF_IS_DEVELOP', $isDevelop);
|
||||||
|
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next): mixed {
|
function ($request, $next): mixed {
|
||||||
|
@@ -31,6 +31,9 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Http\Middleware\IsDemoUser;
|
use FireflyIII\Http\Middleware\IsDemoUser;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Models\TransactionType;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Facades\Preferences;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Controllers\GetConfigurationData;
|
use FireflyIII\Support\Http\Controllers\GetConfigurationData;
|
||||||
use FireflyIII\Support\Models\AccountBalanceCalculator;
|
use FireflyIII\Support\Models\AccountBalanceCalculator;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
@@ -61,7 +64,7 @@ class DebugController extends Controller
|
|||||||
$this->middleware(IsDemoUser::class)->except(['displayError']);
|
$this->middleware(IsDemoUser::class)->except(['displayError']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function routes(): never
|
public function routes(Request $request): never
|
||||||
{
|
{
|
||||||
if (!auth()->user()->hasRole('owner')) {
|
if (!auth()->user()->hasRole('owner')) {
|
||||||
throw new NotFoundHttpException();
|
throw new NotFoundHttpException();
|
||||||
@@ -69,6 +72,46 @@ class DebugController extends Controller
|
|||||||
|
|
||||||
/** @var iterable $routes */
|
/** @var iterable $routes */
|
||||||
$routes = Route::getRoutes();
|
$routes = Route::getRoutes();
|
||||||
|
|
||||||
|
if ('true' === $request->get('api')) {
|
||||||
|
$collection = [];
|
||||||
|
$i = 0;
|
||||||
|
|
||||||
|
echo 'PATHS="';
|
||||||
|
|
||||||
|
/** @var \Illuminate\Routing\Route $route */
|
||||||
|
foreach ($routes as $route) {
|
||||||
|
++$i;
|
||||||
|
// skip API and other routes.
|
||||||
|
if (!str_starts_with($route->uri(), 'api/v1')
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// skip non GET routes
|
||||||
|
if (!in_array('GET', $route->methods(), true)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// no name route:
|
||||||
|
if (null === $route->getName()) {
|
||||||
|
var_dump($route);
|
||||||
|
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo substr($route->uri(), 3);
|
||||||
|
if (0 === $i % 5) {
|
||||||
|
echo '"<br>PATHS="${PATHS},';
|
||||||
|
}
|
||||||
|
if (0 !== $i % 5) {
|
||||||
|
echo ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$return = [];
|
$return = [];
|
||||||
|
|
||||||
/** @var \Illuminate\Routing\Route $route */
|
/** @var \Illuminate\Routing\Route $route */
|
||||||
@@ -153,7 +196,7 @@ class DebugController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function flush(Request $request)
|
public function flush(Request $request)
|
||||||
{
|
{
|
||||||
app('preferences')->mark();
|
Preferences::mark();
|
||||||
$request->session()->forget(['start', 'end', '_previous', 'viewRange', 'range', 'is_custom_range', 'temp-mfa-secret', 'temp-mfa-codes']);
|
$request->session()->forget(['start', 'end', '_previous', 'viewRange', 'range', 'is_custom_range', 'temp-mfa-secret', 'temp-mfa-codes']);
|
||||||
|
|
||||||
Artisan::call('cache:clear');
|
Artisan::call('cache:clear');
|
||||||
@@ -223,8 +266,8 @@ class DebugController extends Controller
|
|||||||
|
|
||||||
private function getSystemInformation(): array
|
private function getSystemInformation(): array
|
||||||
{
|
{
|
||||||
$maxFileSize = app('steam')->phpBytes((string) ini_get('upload_max_filesize'));
|
$maxFileSize = Steam::phpBytes((string) ini_get('upload_max_filesize'));
|
||||||
$maxPostSize = app('steam')->phpBytes((string) ini_get('post_max_size'));
|
$maxPostSize = Steam::phpBytes((string) ini_get('post_max_size'));
|
||||||
$drivers = \DB::availableDrivers();
|
$drivers = \DB::availableDrivers();
|
||||||
$currentDriver = \DB::getDriverName();
|
$currentDriver = \DB::getDriverName();
|
||||||
|
|
||||||
@@ -314,7 +357,7 @@ class DebugController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getuserInfo(): array
|
private function getUserInfo(): array
|
||||||
{
|
{
|
||||||
$userFlags = $this->getUserFlags();
|
$userFlags = $this->getUserFlags();
|
||||||
|
|
||||||
@@ -324,7 +367,7 @@ class DebugController extends Controller
|
|||||||
// set languages, see what happens:
|
// set languages, see what happens:
|
||||||
$original = setlocale(LC_ALL, '0');
|
$original = setlocale(LC_ALL, '0');
|
||||||
$localeAttempts = [];
|
$localeAttempts = [];
|
||||||
$parts = app('steam')->getLocaleArray(app('steam')->getLocale());
|
$parts = Steam::getLocaleArray(Steam::getLocale());
|
||||||
foreach ($parts as $code) {
|
foreach ($parts as $code) {
|
||||||
$code = trim($code);
|
$code = trim($code);
|
||||||
app('log')->debug(sprintf('Trying to set %s', $code));
|
app('log')->debug(sprintf('Trying to set %s', $code));
|
||||||
@@ -334,14 +377,15 @@ class DebugController extends Controller
|
|||||||
setlocale(LC_ALL, (string) $original);
|
setlocale(LC_ALL, (string) $original);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'user_id' => auth()->user()->id,
|
'user_id' => auth()->user()->id,
|
||||||
'user_count' => User::count(),
|
'user_count' => User::count(),
|
||||||
'user_flags' => $userFlags,
|
'user_flags' => $userFlags,
|
||||||
'user_agent' => $userAgent,
|
'user_agent' => $userAgent,
|
||||||
'locale_attempts' => $localeAttempts,
|
'convert_to_native' => Amount::convertToNative(),
|
||||||
'locale' => app('steam')->getLocale(),
|
'locale_attempts' => $localeAttempts,
|
||||||
'language' => app('steam')->getLanguage(),
|
'locale' => Steam::getLocale(),
|
||||||
'view_range' => app('preferences')->get('viewRange', '1M')->data,
|
'language' => Steam::getLanguage(),
|
||||||
|
'view_range' => Preferences::get('viewRange', '1M')->data,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Http\Controllers\Controller;
|
use FireflyIII\Http\Controllers\Controller;
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,12 +42,16 @@ class FrontpageController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function piggyBanks(PiggyBankRepositoryInterface $repository): JsonResponse
|
public function piggyBanks(PiggyBankRepositoryInterface $repository): JsonResponse
|
||||||
{
|
{
|
||||||
$set = $repository->getPiggyBanks();
|
$set = $repository->getPiggyBanks();
|
||||||
$info = [];
|
$info = [];
|
||||||
|
$native = Amount::getNativeCurrency();
|
||||||
|
$convertToNative = Amount::convertToNative();
|
||||||
|
|
||||||
|
|
||||||
/** @var PiggyBank $piggyBank */
|
/** @var PiggyBank $piggyBank */
|
||||||
foreach ($set as $piggyBank) {
|
foreach ($set as $piggyBank) {
|
||||||
$amount = $repository->getCurrentAmount($piggyBank);
|
$amount = $repository->getCurrentAmount($piggyBank);
|
||||||
|
$nativeAmount = $repository->getCurrentNativeAmount($piggyBank);
|
||||||
if (1 === bccomp($amount, '0')) {
|
if (1 === bccomp($amount, '0')) {
|
||||||
// percentage!
|
// percentage!
|
||||||
$pct = 0;
|
$pct = 0;
|
||||||
@@ -55,11 +60,19 @@ class FrontpageController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$entry = [
|
$entry = [
|
||||||
'id' => $piggyBank->id,
|
'id' => $piggyBank->id,
|
||||||
'name' => $piggyBank->name,
|
'name' => $piggyBank->name,
|
||||||
'amount' => $amount,
|
'amount' => $amount,
|
||||||
'target' => $piggyBank->target_amount,
|
'native_amount' => $nativeAmount,
|
||||||
'percentage' => $pct,
|
'target' => $piggyBank->target_amount,
|
||||||
|
'native_target' => $piggyBank->native_target_amount,
|
||||||
|
'percentage' => $pct,
|
||||||
|
// currency:
|
||||||
|
'currency_symbol' => $piggyBank->transactionCurrency->symbol,
|
||||||
|
'currency_decimal_places' => $piggyBank->transactionCurrency->decimal_places,
|
||||||
|
'native_currency_symbol' => $native->symbol,
|
||||||
|
'native_currency_decimal_places' => $native->decimal_places,
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$info[] = $entry;
|
$info[] = $entry;
|
||||||
@@ -74,11 +87,10 @@ class FrontpageController extends Controller
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$html = '';
|
||||||
$html = '';
|
|
||||||
if (0 !== count($info)) {
|
if (0 !== count($info)) {
|
||||||
try {
|
try {
|
||||||
$html = view('json.piggy-banks', compact('info'))->render();
|
$html = view('json.piggy-banks', compact('info', 'convertToNative', 'native'))->render();
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
app('log')->error(sprintf('Cannot render json.piggy-banks: %s', $e->getMessage()));
|
app('log')->error(sprintf('Cannot render json.piggy-banks: %s', $e->getMessage()));
|
||||||
app('log')->error($e->getTraceAsString());
|
app('log')->error($e->getTraceAsString());
|
||||||
|
@@ -31,6 +31,7 @@ use FireflyIII\Http\Requests\PreferencesRequest;
|
|||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Preference;
|
use FireflyIII\Models\Preference;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Preferences;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\View\Factory;
|
use Illuminate\Contracts\View\Factory;
|
||||||
use Illuminate\Http\RedirectResponse;
|
use Illuminate\Http\RedirectResponse;
|
||||||
@@ -93,35 +94,35 @@ class PreferencesController extends Controller
|
|||||||
/** @var array<int, int> $accountIds */
|
/** @var array<int, int> $accountIds */
|
||||||
$accountIds = $accounts->pluck('id')->toArray();
|
$accountIds = $accounts->pluck('id')->toArray();
|
||||||
$viewRange = app('navigation')->getViewRange(false);
|
$viewRange = app('navigation')->getViewRange(false);
|
||||||
$frontpageAccountsPref = app('preferences')->get('frontpageAccounts', $accountIds);
|
$frontpageAccountsPref = Preferences::get('frontpageAccounts', $accountIds);
|
||||||
$frontpageAccounts = $frontpageAccountsPref->data;
|
$frontpageAccounts = $frontpageAccountsPref->data;
|
||||||
if (!is_array($frontpageAccounts)) {
|
if (!is_array($frontpageAccounts)) {
|
||||||
$frontpageAccounts = $accountIds;
|
$frontpageAccounts = $accountIds;
|
||||||
}
|
}
|
||||||
$language = app('steam')->getLanguage();
|
$language = app('steam')->getLanguage();
|
||||||
$languages = config('firefly.languages');
|
$languages = config('firefly.languages');
|
||||||
$locale = app('preferences')->get('locale', config('firefly.default_locale', 'equal'))->data;
|
$locale = Preferences::get('locale', config('firefly.default_locale', 'equal'))->data;
|
||||||
$listPageSize = app('preferences')->get('listPageSize', 50)->data;
|
$listPageSize = Preferences::get('listPageSize', 50)->data;
|
||||||
$darkMode = app('preferences')->get('darkMode', 'browser')->data;
|
$darkMode = Preferences::get('darkMode', 'browser')->data;
|
||||||
$customFiscalYear = app('preferences')->get('customFiscalYear', 0)->data;
|
$customFiscalYear = Preferences::get('customFiscalYear', 0)->data;
|
||||||
$fiscalYearStartStr = app('preferences')->get('fiscalYearStart', '01-01')->data;
|
$fiscalYearStartStr = Preferences::get('fiscalYearStart', '01-01')->data;
|
||||||
$convertToNative = $this->convertToNative;
|
$convertToNative = $this->convertToNative;
|
||||||
if (is_array($fiscalYearStartStr)) {
|
if (is_array($fiscalYearStartStr)) {
|
||||||
$fiscalYearStartStr = '01-01';
|
$fiscalYearStartStr = '01-01';
|
||||||
}
|
}
|
||||||
$fiscalYearStart = sprintf('%s-%s', date('Y'), (string) $fiscalYearStartStr);
|
$fiscalYearStart = sprintf('%s-%s', date('Y'), (string) $fiscalYearStartStr);
|
||||||
$tjOptionalFields = app('preferences')->get('transaction_journal_optional_fields', [])->data;
|
$tjOptionalFields = Preferences::get('transaction_journal_optional_fields', [])->data;
|
||||||
$availableDarkModes = config('firefly.available_dark_modes');
|
$availableDarkModes = config('firefly.available_dark_modes');
|
||||||
|
|
||||||
// notifications settings
|
// notifications settings
|
||||||
$slackUrl = app('preferences')->getEncrypted('slack_webhook_url', '')->data;
|
$slackUrl = Preferences::getEncrypted('slack_webhook_url', '')->data;
|
||||||
$pushoverAppToken = (string) app('preferences')->getEncrypted('pushover_app_token', '')->data;
|
$pushoverAppToken = (string) Preferences::getEncrypted('pushover_app_token', '')->data;
|
||||||
$pushoverUserToken = (string) app('preferences')->getEncrypted('pushover_user_token', '')->data;
|
$pushoverUserToken = (string) Preferences::getEncrypted('pushover_user_token', '')->data;
|
||||||
$ntfyServer = app('preferences')->getEncrypted('ntfy_server', 'https://ntfy.sh')->data;
|
$ntfyServer = Preferences::getEncrypted('ntfy_server', 'https://ntfy.sh')->data;
|
||||||
$ntfyTopic = (string) app('preferences')->getEncrypted('ntfy_topic', '')->data;
|
$ntfyTopic = (string) Preferences::getEncrypted('ntfy_topic', '')->data;
|
||||||
$ntfyAuth = app('preferences')->get('ntfy_auth', false)->data;
|
$ntfyAuth = Preferences::get('ntfy_auth', false)->data;
|
||||||
$ntfyUser = app('preferences')->getEncrypted('ntfy_user', '')->data;
|
$ntfyUser = Preferences::getEncrypted('ntfy_user', '')->data;
|
||||||
$ntfyPass = (string) app('preferences')->getEncrypted('ntfy_pass', '')->data;
|
$ntfyPass = (string) Preferences::getEncrypted('ntfy_pass', '')->data;
|
||||||
$channels = config('notifications.channels');
|
$channels = config('notifications.channels');
|
||||||
$forcedAvailability = [];
|
$forcedAvailability = [];
|
||||||
|
|
||||||
@@ -131,7 +132,7 @@ class PreferencesController extends Controller
|
|||||||
if (true === $info['enabled']) {
|
if (true === $info['enabled']) {
|
||||||
$notifications[$key]
|
$notifications[$key]
|
||||||
= [
|
= [
|
||||||
'enabled' => true === app('preferences')->get(sprintf('notification_%s', $key), true)->data,
|
'enabled' => true === Preferences::get(sprintf('notification_%s', $key), true)->data,
|
||||||
'configurable' => $info['configurable'],
|
'configurable' => $info['configurable'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -221,7 +222,7 @@ class PreferencesController extends Controller
|
|||||||
foreach ($request->get('frontpageAccounts') as $id) {
|
foreach ($request->get('frontpageAccounts') as $id) {
|
||||||
$frontpageAccounts[] = (int) $id;
|
$frontpageAccounts[] = (int) $id;
|
||||||
}
|
}
|
||||||
app('preferences')->set('frontpageAccounts', $frontpageAccounts);
|
Preferences::set('frontpageAccounts', $frontpageAccounts);
|
||||||
}
|
}
|
||||||
|
|
||||||
// extract notifications:
|
// extract notifications:
|
||||||
@@ -229,15 +230,15 @@ class PreferencesController extends Controller
|
|||||||
foreach (config('notifications.notifications.user') as $key => $info) {
|
foreach (config('notifications.notifications.user') as $key => $info) {
|
||||||
$key = sprintf('notification_%s', $key);
|
$key = sprintf('notification_%s', $key);
|
||||||
if (array_key_exists($key, $all)) {
|
if (array_key_exists($key, $all)) {
|
||||||
app('preferences')->set($key, true);
|
Preferences::set($key, true);
|
||||||
}
|
}
|
||||||
if (!array_key_exists($key, $all)) {
|
if (!array_key_exists($key, $all)) {
|
||||||
app('preferences')->set($key, false);
|
Preferences::set($key, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// view range:
|
// view range:
|
||||||
app('preferences')->set('viewRange', $request->get('viewRange'));
|
Preferences::set('viewRange', $request->get('viewRange'));
|
||||||
// forget session values:
|
// forget session values:
|
||||||
session()->forget('start');
|
session()->forget('start');
|
||||||
session()->forget('end');
|
session()->forget('end');
|
||||||
@@ -249,13 +250,13 @@ class PreferencesController extends Controller
|
|||||||
$variables = ['slack_webhook_url', 'pushover_app_token', 'pushover_user_token', 'ntfy_server', 'ntfy_topic', 'ntfy_user', 'ntfy_pass'];
|
$variables = ['slack_webhook_url', 'pushover_app_token', 'pushover_user_token', 'ntfy_server', 'ntfy_topic', 'ntfy_user', 'ntfy_pass'];
|
||||||
foreach ($variables as $variable) {
|
foreach ($variables as $variable) {
|
||||||
if ('' === $all[$variable]) {
|
if ('' === $all[$variable]) {
|
||||||
app('preferences')->delete($variable);
|
Preferences::delete($variable);
|
||||||
}
|
}
|
||||||
if ('' !== $all[$variable]) {
|
if ('' !== $all[$variable]) {
|
||||||
app('preferences')->setEncrypted($variable, $all[$variable]);
|
Preferences::setEncrypted($variable, $all[$variable]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
app('preferences')->set('ntfy_auth', $all['ntfy_auth'] ?? false);
|
Preferences::set('ntfy_auth', $all['ntfy_auth'] ?? false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert native
|
// convert native
|
||||||
@@ -265,30 +266,30 @@ class PreferencesController extends Controller
|
|||||||
Log::debug('User sets convertToNative to true.');
|
Log::debug('User sets convertToNative to true.');
|
||||||
event(new UserGroupChangedDefaultCurrency(auth()->user()->userGroup));
|
event(new UserGroupChangedDefaultCurrency(auth()->user()->userGroup));
|
||||||
}
|
}
|
||||||
app('preferences')->set('convert_to_native', $convertToNative);
|
Preferences::set('convert_to_native', $convertToNative);
|
||||||
|
|
||||||
// custom fiscal year
|
// custom fiscal year
|
||||||
$customFiscalYear = 1 === (int) $request->get('customFiscalYear');
|
$customFiscalYear = 1 === (int) $request->get('customFiscalYear');
|
||||||
$string = strtotime((string) $request->get('fiscalYearStart'));
|
$string = strtotime((string) $request->get('fiscalYearStart'));
|
||||||
if (false !== $string) {
|
if (false !== $string) {
|
||||||
$fiscalYearStart = date('m-d', $string);
|
$fiscalYearStart = date('m-d', $string);
|
||||||
app('preferences')->set('customFiscalYear', $customFiscalYear);
|
Preferences::set('customFiscalYear', $customFiscalYear);
|
||||||
app('preferences')->set('fiscalYearStart', $fiscalYearStart);
|
Preferences::set('fiscalYearStart', $fiscalYearStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
// save page size:
|
// save page size:
|
||||||
app('preferences')->set('listPageSize', 50);
|
Preferences::set('listPageSize', 50);
|
||||||
$listPageSize = (int) $request->get('listPageSize');
|
$listPageSize = (int) $request->get('listPageSize');
|
||||||
if ($listPageSize > 0 && $listPageSize < 1337) {
|
if ($listPageSize > 0 && $listPageSize < 1337) {
|
||||||
app('preferences')->set('listPageSize', $listPageSize);
|
Preferences::set('listPageSize', $listPageSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// language:
|
// language:
|
||||||
/** @var Preference $currentLang */
|
/** @var Preference $currentLang */
|
||||||
$currentLang = app('preferences')->get('language', 'en_US');
|
$currentLang = Preferences::get('language', 'en_US');
|
||||||
$lang = $request->get('language');
|
$lang = $request->get('language');
|
||||||
if (array_key_exists($lang, config('firefly.languages'))) {
|
if (array_key_exists($lang, config('firefly.languages'))) {
|
||||||
app('preferences')->set('language', $lang);
|
Preferences::set('language', $lang);
|
||||||
}
|
}
|
||||||
if ($currentLang->data !== $lang) {
|
if ($currentLang->data !== $lang) {
|
||||||
// this string is untranslated on purpose.
|
// this string is untranslated on purpose.
|
||||||
@@ -299,7 +300,7 @@ class PreferencesController extends Controller
|
|||||||
if (!auth()->user()->hasRole('demo')) {
|
if (!auth()->user()->hasRole('demo')) {
|
||||||
$locale = (string) $request->get('locale');
|
$locale = (string) $request->get('locale');
|
||||||
$locale = '' === $locale ? null : $locale;
|
$locale = '' === $locale ? null : $locale;
|
||||||
app('preferences')->set('locale', $locale);
|
Preferences::set('locale', $locale);
|
||||||
}
|
}
|
||||||
|
|
||||||
// optional fields for transactions:
|
// optional fields for transactions:
|
||||||
@@ -318,16 +319,16 @@ class PreferencesController extends Controller
|
|||||||
'location' => array_key_exists('location', $setOptions),
|
'location' => array_key_exists('location', $setOptions),
|
||||||
'links' => array_key_exists('links', $setOptions),
|
'links' => array_key_exists('links', $setOptions),
|
||||||
];
|
];
|
||||||
app('preferences')->set('transaction_journal_optional_fields', $optionalTj);
|
Preferences::set('transaction_journal_optional_fields', $optionalTj);
|
||||||
|
|
||||||
// dark mode
|
// dark mode
|
||||||
$darkMode = $request->get('darkMode') ?? 'browser';
|
$darkMode = $request->get('darkMode') ?? 'browser';
|
||||||
if (in_array($darkMode, config('firefly.available_dark_modes'), true)) {
|
if (in_array($darkMode, config('firefly.available_dark_modes'), true)) {
|
||||||
app('preferences')->set('darkMode', $darkMode);
|
Preferences::set('darkMode', $darkMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
session()->flash('success', (string) trans('firefly.saved_preferences'));
|
session()->flash('success', (string) trans('firefly.saved_preferences'));
|
||||||
app('preferences')->mark();
|
Preferences::mark();
|
||||||
|
|
||||||
return redirect(route('preferences.index'));
|
return redirect(route('preferences.index'));
|
||||||
}
|
}
|
||||||
|
@@ -419,7 +419,9 @@ 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 ? strtolower($recurrence->transactionType->type) : strtolower($transaction->transactionType->type),
|
'type' => null === $transaction?->transactionType?->type ?
|
||||||
|
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,
|
||||||
|
@@ -308,6 +308,24 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
|
|||||||
return $sum;
|
return $sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get current amount saved in piggy bank.
|
||||||
|
*/
|
||||||
|
public function getCurrentNativeAmount(PiggyBank $piggyBank, ?Account $account = null): string
|
||||||
|
{
|
||||||
|
$sum = '0';
|
||||||
|
foreach ($piggyBank->accounts as $current) {
|
||||||
|
if (null !== $account && $account->id !== $current->id) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$amount = (string) $current->pivot->native_current_amount;
|
||||||
|
$amount = '' === $amount ? '0' : $amount;
|
||||||
|
$sum = bcadd($sum, $amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sum;
|
||||||
|
}
|
||||||
|
|
||||||
public function getRepetition(PiggyBank $piggyBank, bool $overrule = false): ?PiggyBankRepetition
|
public function getRepetition(PiggyBank $piggyBank, bool $overrule = false): ?PiggyBankRepetition
|
||||||
{
|
{
|
||||||
if (false === $overrule) {
|
if (false === $overrule) {
|
||||||
|
@@ -40,6 +40,8 @@ interface PiggyBankRepositoryInterface
|
|||||||
{
|
{
|
||||||
public function addAmount(PiggyBank $piggyBank, Account $account, string $amount, ?TransactionJournal $journal = null): bool;
|
public function addAmount(PiggyBank $piggyBank, Account $account, string $amount, ?TransactionJournal $journal = null): bool;
|
||||||
|
|
||||||
|
public function getCurrentNativeAmount(PiggyBank $piggyBank, ?Account $account = null): string;
|
||||||
|
|
||||||
public function addAmountToPiggyBank(PiggyBank $piggyBank, string $amount, TransactionJournal $journal): void;
|
public function addAmountToPiggyBank(PiggyBank $piggyBank, string $amount, TransactionJournal $journal): void;
|
||||||
|
|
||||||
public function canAddAmount(PiggyBank $piggyBank, Account $account, string $amount): bool;
|
public function canAddAmount(PiggyBank $piggyBank, Account $account, string $amount): bool;
|
||||||
|
@@ -38,6 +38,15 @@ class IsValidPositiveAmount implements ValidationRule
|
|||||||
*/
|
*/
|
||||||
public function validate(string $attribute, mixed $value, \Closure $fail): void
|
public function validate(string $attribute, mixed $value, \Closure $fail): void
|
||||||
{
|
{
|
||||||
|
if (is_array($value)) {
|
||||||
|
$fail('validation.numeric')->translate();
|
||||||
|
$message = sprintf('IsValidPositiveAmount: "%s" is not a number.', json_encode($value));
|
||||||
|
Log::debug($message);
|
||||||
|
Log::channel('audit')->info($message);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$value = (string) $value;
|
$value = (string) $value;
|
||||||
// must not be empty:
|
// must not be empty:
|
||||||
if ($this->emptyString($value)) {
|
if ($this->emptyString($value)) {
|
||||||
|
@@ -79,6 +79,12 @@ class UniqueAccountNumber implements ValidationRule
|
|||||||
if (null === $this->expectedType) {
|
if (null === $this->expectedType) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (is_array($value)) {
|
||||||
|
$fail('validation.generic_invalid')->translate();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$value = (string) $value;
|
||||||
$maxCounts = $this->getMaxOccurrences();
|
$maxCounts = $this->getMaxOccurrences();
|
||||||
|
|
||||||
foreach ($maxCounts as $type => $max) {
|
foreach ($maxCounts as $type => $max) {
|
||||||
|
@@ -94,6 +94,10 @@ class UniqueIban implements ValidationRule
|
|||||||
if (0 === count($this->expectedTypes)) {
|
if (0 === count($this->expectedTypes)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (is_array($value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$value = (string) $value;
|
||||||
$maxCounts = $this->getMaxOccurrences();
|
$maxCounts = $this->getMaxOccurrences();
|
||||||
|
|
||||||
foreach ($maxCounts as $type => $max) {
|
foreach ($maxCounts as $type => $max) {
|
||||||
|
@@ -48,14 +48,14 @@ class BillWarningCronjob extends AbstractCronjob
|
|||||||
$diffForHumans = today(config('app.timezone'))->diffForHumans(Carbon::createFromTimestamp($lastTime), null, true);
|
$diffForHumans = today(config('app.timezone'))->diffForHumans(Carbon::createFromTimestamp($lastTime), null, true);
|
||||||
|
|
||||||
if (0 === $lastTime) {
|
if (0 === $lastTime) {
|
||||||
app('log')->info('The bill warning cron-job has never fired before.');
|
app('log')->info('The bill notification cron-job has never fired before.');
|
||||||
}
|
}
|
||||||
// less than half a day ago:
|
// less than half a day ago:
|
||||||
if ($lastTime > 0 && $diff <= 43200) {
|
if ($lastTime > 0 && $diff <= 43200) {
|
||||||
app('log')->info(sprintf('It has been %s since the bill warning cron-job has fired.', $diffForHumans));
|
app('log')->info(sprintf('It has been %s since the bill notification cron-job has fired.', $diffForHumans));
|
||||||
if (false === $this->force) {
|
if (false === $this->force) {
|
||||||
app('log')->info('The cron-job will not fire now.');
|
app('log')->info('The cron-job will not fire now.');
|
||||||
$this->message = sprintf('It has been %s since the bill warning cron-job has fired. It will not fire now.', $diffForHumans);
|
$this->message = sprintf('It has been %s since the bill notification cron-job has fired. It will not fire now.', $diffForHumans);
|
||||||
$this->jobFired = false;
|
$this->jobFired = false;
|
||||||
$this->jobErrored = false;
|
$this->jobErrored = false;
|
||||||
$this->jobSucceeded = false;
|
$this->jobSucceeded = false;
|
||||||
@@ -63,11 +63,11 @@ class BillWarningCronjob extends AbstractCronjob
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
app('log')->info('Execution of the bill warning cron-job has been FORCED.');
|
app('log')->info('Execution of the bill notification cron-job has been FORCED.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($lastTime > 0 && $diff > 43200) {
|
if ($lastTime > 0 && $diff > 43200) {
|
||||||
app('log')->info(sprintf('It has been %s since the bill warning cron-job has fired. It will fire now!', $diffForHumans));
|
app('log')->info(sprintf('It has been %s since the bill notification cron-job has fired. It will fire now!', $diffForHumans));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->fireWarnings();
|
$this->fireWarnings();
|
||||||
@@ -77,7 +77,7 @@ class BillWarningCronjob extends AbstractCronjob
|
|||||||
|
|
||||||
private function fireWarnings(): void
|
private function fireWarnings(): void
|
||||||
{
|
{
|
||||||
app('log')->info(sprintf('Will now fire bill warning job task for date "%s".', $this->date->format('Y-m-d H:i:s')));
|
app('log')->info(sprintf('Will now fire bill notification job task for date "%s".', $this->date->format('Y-m-d H:i:s')));
|
||||||
|
|
||||||
/** @var WarnAboutBills $job */
|
/** @var WarnAboutBills $job */
|
||||||
$job = app(WarnAboutBills::class);
|
$job = app(WarnAboutBills::class);
|
||||||
@@ -89,10 +89,10 @@ class BillWarningCronjob extends AbstractCronjob
|
|||||||
$this->jobFired = true;
|
$this->jobFired = true;
|
||||||
$this->jobErrored = false;
|
$this->jobErrored = false;
|
||||||
$this->jobSucceeded = true;
|
$this->jobSucceeded = true;
|
||||||
$this->message = 'Bill warning cron job fired successfully.';
|
$this->message = 'Bill notification cron job fired successfully.';
|
||||||
|
|
||||||
app('fireflyconfig')->set('last_bw_job', (int) $this->date->format('U'));
|
app('fireflyconfig')->set('last_bw_job', (int) $this->date->format('U'));
|
||||||
app('log')->info(sprintf('Marked the last time this job has run as "%s" (%d)', $this->date->format('Y-m-d H:i:s'), (int) $this->date->format('U')));
|
app('log')->info(sprintf('Marked the last time this job has run as "%s" (%d)', $this->date->format('Y-m-d H:i:s'), (int) $this->date->format('U')));
|
||||||
app('log')->info('Done with bill warning cron job task.');
|
app('log')->info('Done with bill notification cron job task.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -90,7 +90,7 @@ trait ChartGeneration
|
|||||||
$balance = $range[$format] ?? $previous;
|
$balance = $range[$format] ?? $previous;
|
||||||
$previous = $balance;
|
$previous = $balance;
|
||||||
$currentStart->addDay();
|
$currentStart->addDay();
|
||||||
$currentSet['entries'][$label] = $balance[$field];
|
$currentSet['entries'][$label] = $balance[$field] ?? '0';
|
||||||
}
|
}
|
||||||
$chartData[] = $currentSet;
|
$chartData[] = $currentSet;
|
||||||
}
|
}
|
||||||
|
@@ -202,7 +202,7 @@ class Preferences
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if ('' === $result->data) {
|
if ('' === $result->data) {
|
||||||
Log::warning(sprintf('Empty encrypted preference found: "%s"', $name));
|
// Log::warning(sprintf('Empty encrypted preference found: "%s"', $name));
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
@@ -214,7 +214,7 @@ class Preferences
|
|||||||
Log::debug('Set data to NULL');
|
Log::debug('Set data to NULL');
|
||||||
$result->data = null;
|
$result->data = null;
|
||||||
}
|
}
|
||||||
Log::error(sprintf('Could not decrypt preference "%s": %s', $name, $e->getMessage()));
|
// Log::error(sprintf('Could not decrypt preference "%s": %s', $name, $e->getMessage()));
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
@@ -226,7 +226,7 @@ class Preferences
|
|||||||
{
|
{
|
||||||
$result = $this->getForUser($user, $name, $default);
|
$result = $this->getForUser($user, $name, $default);
|
||||||
if ('' === $result->data) {
|
if ('' === $result->data) {
|
||||||
Log::warning(sprintf('Empty encrypted preference found: "%s"', $name));
|
// Log::warning(sprintf('Empty encrypted preference found: "%s"', $name));
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
@@ -238,7 +238,7 @@ class Preferences
|
|||||||
Log::debug('Set data to NULL');
|
Log::debug('Set data to NULL');
|
||||||
$result->data = null;
|
$result->data = null;
|
||||||
}
|
}
|
||||||
Log::error(sprintf('Could not decrypt preference "%s": %s', $name, $e->getMessage()));
|
// Log::error(sprintf('Could not decrypt preference "%s": %s', $name, $e->getMessage()));
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
@@ -30,6 +30,7 @@ use Carbon\Exceptions\InvalidFormatException;
|
|||||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trait ConvertsDataTypes
|
* Trait ConvertsDataTypes
|
||||||
@@ -359,10 +360,13 @@ trait ConvertsDataTypes
|
|||||||
{
|
{
|
||||||
$result = null;
|
$result = null;
|
||||||
|
|
||||||
|
Log::debug(sprintf('Date string is "%s"', (string) $this->get($field)));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$result = '' !== (string) $this->get($field) ? new Carbon((string) $this->get($field), config('app.timezone')) : null;
|
$result = '' !== (string) $this->get($field) ? new Carbon((string) $this->get($field), config('app.timezone')) : null;
|
||||||
} catch (InvalidFormatException $e) {
|
} catch (InvalidFormatException $e) {
|
||||||
// @ignoreException
|
// @ignoreException
|
||||||
|
Log::debug(sprintf('Exception when parsing date "%s".', $this->get($field)));
|
||||||
}
|
}
|
||||||
if (null === $result) {
|
if (null === $result) {
|
||||||
app('log')->debug(sprintf('Exception when parsing date "%s".', $this->get($field)));
|
app('log')->debug(sprintf('Exception when parsing date "%s".', $this->get($field)));
|
||||||
@@ -386,6 +390,18 @@ trait ConvertsDataTypes
|
|||||||
return (int) $string;
|
return (int) $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function floatFromValue(?string $string): ?float
|
||||||
|
{
|
||||||
|
if (null === $string) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ('' === $string) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (float) $string;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return integer value, or NULL when it's not set.
|
* Return integer value, or NULL when it's not set.
|
||||||
*/
|
*/
|
||||||
|
@@ -40,7 +40,7 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
{
|
{
|
||||||
protected AccountRepositoryInterface $repository;
|
protected AccountRepositoryInterface $repository;
|
||||||
protected bool $convertToNative;
|
protected bool $convertToNative;
|
||||||
protected TransactionCurrency $default;
|
protected TransactionCurrency $native;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AccountTransformer constructor.
|
* AccountTransformer constructor.
|
||||||
@@ -50,7 +50,7 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
$this->parameters = new ParameterBag();
|
$this->parameters = new ParameterBag();
|
||||||
$this->repository = app(AccountRepositoryInterface::class);
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
$this->convertToNative = Amount::convertToNative();
|
$this->convertToNative = Amount::convertToNative();
|
||||||
$this->default = Amount::getNativeCurrency();
|
$this->native = Amount::getNativeCurrency();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -72,7 +72,7 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
$convertToNative = Amount::convertToNative();
|
$convertToNative = Amount::convertToNative();
|
||||||
|
|
||||||
// get account role (will only work if the type is asset).
|
// get account role (will only work if the type is asset).
|
||||||
$default = Amount::getNativeCurrency();
|
$native = Amount::getNativeCurrency();
|
||||||
$accountRole = $this->getAccountRole($account, $accountType);
|
$accountRole = $this->getAccountRole($account, $accountType);
|
||||||
$date = $this->getDate();
|
$date = $this->getDate();
|
||||||
$date->endOfDay();
|
$date->endOfDay();
|
||||||
@@ -82,10 +82,10 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
[$openingBalance, $nativeOpeningBalance, $openingBalanceDate] = $this->getOpeningBalance($account, $accountType, $convertToNative);
|
[$openingBalance, $nativeOpeningBalance, $openingBalanceDate] = $this->getOpeningBalance($account, $accountType, $convertToNative);
|
||||||
[$interest, $interestPeriod] = $this->getInterest($account, $accountType);
|
[$interest, $interestPeriod] = $this->getInterest($account, $accountType);
|
||||||
|
|
||||||
$default = $this->default;
|
$native = $this->native;
|
||||||
if (!$this->convertToNative) {
|
if (!$this->convertToNative) {
|
||||||
// reset default currency to NULL, not interesting.
|
// reset native currency to NULL, not interesting.
|
||||||
$default = null;
|
$native = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$openingBalance = app('steam')->bcround($openingBalance, $decimalPlaces);
|
$openingBalance = app('steam')->bcround($openingBalance, $decimalPlaces);
|
||||||
@@ -112,7 +112,7 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
}
|
}
|
||||||
|
|
||||||
$currentBalance = app('steam')->bcround($finalBalance['balance'] ?? '0', $decimalPlaces);
|
$currentBalance = app('steam')->bcround($finalBalance['balance'] ?? '0', $decimalPlaces);
|
||||||
$nativeCurrentBalance = $convertToNative ? app('steam')->bcround($finalBalance['native_balance'] ?? '0', $default->decimal_places) : null;
|
$nativeCurrentBalance = $convertToNative ? app('steam')->bcround($finalBalance['native_balance'] ?? '0', $native->decimal_places) : null;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'id' => (string) $account->id,
|
'id' => (string) $account->id,
|
||||||
@@ -127,10 +127,10 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
'currency_code' => $currencyCode,
|
'currency_code' => $currencyCode,
|
||||||
'currency_symbol' => $currencySymbol,
|
'currency_symbol' => $currencySymbol,
|
||||||
'currency_decimal_places' => $decimalPlaces,
|
'currency_decimal_places' => $decimalPlaces,
|
||||||
'native_currency_id' => null === $default ? null : (string) $default->id,
|
'native_currency_id' => null === $native ? null : (string) $native->id,
|
||||||
'native_currency_code' => $default?->code,
|
'native_currency_code' => $native?->code,
|
||||||
'native_currency_symbol' => $default?->symbol,
|
'native_currency_symbol' => $native?->symbol,
|
||||||
'native_currency_decimal_places' => $default?->decimal_places,
|
'native_currency_decimal_places' => $native?->decimal_places,
|
||||||
'current_balance' => $currentBalance,
|
'current_balance' => $currentBalance,
|
||||||
'native_current_balance' => $nativeCurrentBalance,
|
'native_current_balance' => $nativeCurrentBalance,
|
||||||
'current_balance_date' => $date->toAtomString(),
|
'current_balance_date' => $date->toAtomString(),
|
||||||
@@ -141,7 +141,7 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
'iban' => '' === $account->iban ? null : $account->iban,
|
'iban' => '' === $account->iban ? null : $account->iban,
|
||||||
'bic' => $this->repository->getMetaValue($account, 'BIC'),
|
'bic' => $this->repository->getMetaValue($account, 'BIC'),
|
||||||
'virtual_balance' => app('steam')->bcround($account->virtual_balance, $decimalPlaces),
|
'virtual_balance' => app('steam')->bcround($account->virtual_balance, $decimalPlaces),
|
||||||
'native_virtual_balance' => $this->convertToNative ? app('steam')->bcround($account->native_virtual_balance, $default->decimal_places) : null,
|
'native_virtual_balance' => $this->convertToNative ? app('steam')->bcround($account->native_virtual_balance, $native->decimal_places) : null,
|
||||||
'opening_balance' => $openingBalance,
|
'opening_balance' => $openingBalance,
|
||||||
'native_opening_balance' => $nativeOpeningBalance,
|
'native_opening_balance' => $nativeOpeningBalance,
|
||||||
'opening_balance_date' => $openingBalanceDate,
|
'opening_balance_date' => $openingBalanceDate,
|
||||||
@@ -190,9 +190,9 @@ class AccountTransformer extends AbstractTransformer
|
|||||||
{
|
{
|
||||||
$currency = $this->repository->getAccountCurrency($account);
|
$currency = $this->repository->getAccountCurrency($account);
|
||||||
|
|
||||||
// only grab default when result is null:
|
// only grab native when result is null:
|
||||||
if (null === $currency) {
|
if (null === $currency) {
|
||||||
$currency = $this->default;
|
$currency = $this->native;
|
||||||
}
|
}
|
||||||
$currencyId = (string) $currency->id;
|
$currencyId = (string) $currency->id;
|
||||||
$currencyCode = $currency->code;
|
$currencyCode = $currency->code;
|
||||||
|
@@ -50,20 +50,21 @@ class AttachmentTransformer extends AbstractTransformer
|
|||||||
$this->repository->setUser($attachment->user);
|
$this->repository->setUser($attachment->user);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'id' => (string) $attachment->id,
|
'id' => (string) $attachment->id,
|
||||||
'created_at' => $attachment->created_at->toAtomString(),
|
'created_at' => $attachment->created_at->toAtomString(),
|
||||||
'updated_at' => $attachment->updated_at->toAtomString(),
|
'updated_at' => $attachment->updated_at->toAtomString(),
|
||||||
'attachable_id' => (string) $attachment->attachable_id,
|
'attachable_id' => (string) $attachment->attachable_id,
|
||||||
'attachable_type' => str_replace('FireflyIII\Models\\', '', $attachment->attachable_type),
|
'attachable_type' => str_replace('FireflyIII\Models\\', '', $attachment->attachable_type),
|
||||||
'md5' => $attachment->md5,
|
'md5' => $attachment->md5,
|
||||||
'filename' => $attachment->filename,
|
'hash' => $attachment->md5,
|
||||||
'download_url' => route('api.v1.attachments.download', [$attachment->id]),
|
'filename' => $attachment->filename,
|
||||||
'upload_url' => route('api.v1.attachments.upload', [$attachment->id]),
|
'download_url' => route('api.v1.attachments.download', [$attachment->id]),
|
||||||
'title' => $attachment->title,
|
'upload_url' => route('api.v1.attachments.upload', [$attachment->id]),
|
||||||
'notes' => $this->repository->getNoteText($attachment),
|
'title' => $attachment->title,
|
||||||
'mime' => $attachment->mime,
|
'notes' => $this->repository->getNoteText($attachment),
|
||||||
'size' => (int) $attachment->size,
|
'mime' => $attachment->mime,
|
||||||
'links' => [
|
'size' => (int) $attachment->size,
|
||||||
|
'links' => [
|
||||||
[
|
[
|
||||||
'rel' => 'self',
|
'rel' => 'self',
|
||||||
'uri' => '/attachment/'.$attachment->id,
|
'uri' => '/attachment/'.$attachment->id,
|
||||||
|
@@ -119,6 +119,7 @@ class BudgetTransformer extends AbstractTransformer
|
|||||||
'native_currency_decimal_places' => $default?->decimal_places,
|
'native_currency_decimal_places' => $default?->decimal_places,
|
||||||
|
|
||||||
// amount and native amount if present.
|
// amount and native amount if present.
|
||||||
|
|
||||||
'auto_budget_amount' => $abAmount,
|
'auto_budget_amount' => $abAmount,
|
||||||
'native_auto_budget_amount' => $abNative,
|
'native_auto_budget_amount' => $abNative,
|
||||||
'spent' => $spent, // always in native.
|
'spent' => $spent, // always in native.
|
||||||
|
@@ -113,14 +113,14 @@ class UserGroupTransformer extends AbstractTransformer
|
|||||||
'created_at' => $userGroup->created_at->toAtomString(),
|
'created_at' => $userGroup->created_at->toAtomString(),
|
||||||
'updated_at' => $userGroup->updated_at->toAtomString(),
|
'updated_at' => $userGroup->updated_at->toAtomString(),
|
||||||
'in_use' => $this->inUse[$userGroup->id] ?? false,
|
'in_use' => $this->inUse[$userGroup->id] ?? false,
|
||||||
'title' => $userGroup->title,
|
|
||||||
'can_see_members' => $this->membershipsVisible[$userGroup->id] ?? false,
|
'can_see_members' => $this->membershipsVisible[$userGroup->id] ?? false,
|
||||||
'members' => array_values($this->memberships[$userGroup->id] ?? []),
|
'title' => $userGroup->title,
|
||||||
'native_currency_id' => (string) $currency->id,
|
'native_currency_id' => (string) $currency->id,
|
||||||
'native_currency_name' => $currency->name,
|
'native_currency_name' => $currency->name,
|
||||||
'native_currency_code' => $currency->code,
|
'native_currency_code' => $currency->code,
|
||||||
'native_currency_symbol' => $currency->symbol,
|
'native_currency_symbol' => $currency->symbol,
|
||||||
'native_currency_decimal_places' => $currency->decimal_places,
|
'native_currency_decimal_places' => $currency->decimal_places,
|
||||||
|
'members' => array_values($this->memberships[$userGroup->id] ?? []),
|
||||||
];
|
];
|
||||||
// if the user has a specific role in this group, then collect the memberships.
|
// if the user has a specific role in this group, then collect the memberships.
|
||||||
}
|
}
|
||||||
|
@@ -38,6 +38,7 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
|||||||
use FireflyIII\Services\Password\Verifier;
|
use FireflyIII\Services\Password\Verifier;
|
||||||
use FireflyIII\Support\ParseDateString;
|
use FireflyIII\Support\ParseDateString;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use PragmaRX\Google2FA\Exceptions\IncompatibleWithGoogleAuthenticatorException;
|
use PragmaRX\Google2FA\Exceptions\IncompatibleWithGoogleAuthenticatorException;
|
||||||
use PragmaRX\Google2FA\Exceptions\InvalidCharactersException;
|
use PragmaRX\Google2FA\Exceptions\InvalidCharactersException;
|
||||||
@@ -66,7 +67,7 @@ class FireflyValidator extends Validator
|
|||||||
}
|
}
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
if (null === $user) {
|
if (null === $user) {
|
||||||
app('log')->error('No user during validate2faCode');
|
Log::error('No user during validate2faCode');
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -104,6 +105,9 @@ class FireflyValidator extends Validator
|
|||||||
*/
|
*/
|
||||||
public function validateBic(mixed $attribute, mixed $value): bool
|
public function validateBic(mixed $attribute, mixed $value): bool
|
||||||
{
|
{
|
||||||
|
if (!is_string($value) || strlen($value) < 8) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
$regex = '/^[a-z]{6}[0-9a-z]{2}([0-9a-z]{3})?\z/i';
|
$regex = '/^[a-z]{6}[0-9a-z]{2}([0-9a-z]{3})?\z/i';
|
||||||
$result = preg_match($regex, $value);
|
$result = preg_match($regex, $value);
|
||||||
if (false === $result || 0 === $result) {
|
if (false === $result || 0 === $result) {
|
||||||
@@ -120,7 +124,7 @@ class FireflyValidator extends Validator
|
|||||||
}
|
}
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
if (null === $user) {
|
if (null === $user) {
|
||||||
app('log')->error('No user during validate2faCode');
|
Log::error('No user during validate2faCode');
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -212,8 +216,8 @@ class FireflyValidator extends Validator
|
|||||||
$checksum = bcmod($iban, '97');
|
$checksum = bcmod($iban, '97');
|
||||||
} catch (\ValueError $e) { // @phpstan-ignore-line
|
} catch (\ValueError $e) { // @phpstan-ignore-line
|
||||||
$message = sprintf('Could not validate IBAN check value "%s" (IBAN "%s")', $iban, $value);
|
$message = sprintf('Could not validate IBAN check value "%s" (IBAN "%s")', $iban, $value);
|
||||||
app('log')->error($message);
|
Log::error($message);
|
||||||
app('log')->error($e->getTraceAsString());
|
Log::error($e->getTraceAsString());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -427,7 +431,7 @@ class FireflyValidator extends Validator
|
|||||||
try {
|
try {
|
||||||
$parser->parseDate($value);
|
$parser->parseDate($value);
|
||||||
} catch (FireflyException $e) {
|
} catch (FireflyException $e) {
|
||||||
app('log')->error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -467,41 +471,46 @@ class FireflyValidator extends Validator
|
|||||||
*/
|
*/
|
||||||
public function validateUniqueAccountForUser($attribute, $value, $parameters): bool
|
public function validateUniqueAccountForUser($attribute, $value, $parameters): bool
|
||||||
{
|
{
|
||||||
|
if (is_array($value)) {
|
||||||
|
Log::debug('$value is an array, always return false', $value);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// because a user does not have to be logged in (tests and what-not).
|
// because a user does not have to be logged in (tests and what-not).
|
||||||
if (!auth()->check()) {
|
if (!auth()->check()) {
|
||||||
app('log')->debug('validateUniqueAccountForUser::anon');
|
Log::debug('validateUniqueAccountForUser::anon');
|
||||||
|
|
||||||
return $this->validateAccountAnonymously();
|
return $this->validateAccountAnonymously();
|
||||||
}
|
}
|
||||||
if (array_key_exists('objectType', $this->data)) {
|
if (array_key_exists('objectType', $this->data)) {
|
||||||
app('log')->debug('validateUniqueAccountForUser::typeString');
|
Log::debug('validateUniqueAccountForUser::typeString');
|
||||||
|
|
||||||
return $this->validateByAccountTypeString($value, $parameters, $this->data['objectType']);
|
return $this->validateByAccountTypeString($value, $parameters, $this->data['objectType']);
|
||||||
}
|
}
|
||||||
if (array_key_exists('type', $this->data)) {
|
if (array_key_exists('type', $this->data) && !is_array($this->data['type'])) {
|
||||||
app('log')->debug('validateUniqueAccountForUser::typeString');
|
Log::debug('validateUniqueAccountForUser::typeString');
|
||||||
|
|
||||||
return $this->validateByAccountTypeString($value, $parameters, (string) $this->data['type']);
|
return $this->validateByAccountTypeString($value, $parameters, (string) $this->data['type']);
|
||||||
}
|
}
|
||||||
if (array_key_exists('account_type_id', $this->data)) {
|
if (array_key_exists('account_type_id', $this->data)) {
|
||||||
app('log')->debug('validateUniqueAccountForUser::typeId');
|
Log::debug('validateUniqueAccountForUser::typeId');
|
||||||
|
|
||||||
return $this->validateByAccountTypeId($value, $parameters);
|
return $this->validateByAccountTypeId($value, $parameters);
|
||||||
}
|
}
|
||||||
$parameterId = $parameters[0] ?? null;
|
$parameterId = $parameters[0] ?? null;
|
||||||
if (null !== $parameterId) {
|
if (null !== $parameterId) {
|
||||||
app('log')->debug('validateUniqueAccountForUser::paramId');
|
Log::debug('validateUniqueAccountForUser::paramId');
|
||||||
|
|
||||||
return $this->validateByParameterId((int) $parameterId, $value);
|
return $this->validateByParameterId((int) $parameterId, $value);
|
||||||
}
|
}
|
||||||
if (array_key_exists('id', $this->data)) {
|
if (array_key_exists('id', $this->data)) {
|
||||||
app('log')->debug('validateUniqueAccountForUser::accountId');
|
Log::debug('validateUniqueAccountForUser::accountId');
|
||||||
|
|
||||||
return $this->validateByAccountId($value);
|
return $this->validateByAccountId($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// without type, just try to validate the name.
|
// without type, just try to validate the name.
|
||||||
app('log')->debug('validateUniqueAccountForUser::accountName');
|
Log::debug('validateUniqueAccountForUser::accountName');
|
||||||
|
|
||||||
return $this->validateByAccountName($value);
|
return $this->validateByAccountName($value);
|
||||||
}
|
}
|
||||||
@@ -642,11 +651,11 @@ class FireflyValidator extends Validator
|
|||||||
}
|
}
|
||||||
$type = $this->data['objectType'] ?? 'unknown';
|
$type = $this->data['objectType'] ?? 'unknown';
|
||||||
if ('expense' !== $type && 'revenue' !== $type) {
|
if ('expense' !== $type && 'revenue' !== $type) {
|
||||||
app('log')->warning(sprintf('Account number "%s" is not unique and account type "%s" cannot share its account number.', $value, $type));
|
Log::warning(sprintf('Account number "%s" is not unique and account type "%s" cannot share its account number.', $value, $type));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Account number "%s" is not unique but account type "%s" may share its account number.', $value, $type));
|
Log::debug(sprintf('Account number "%s" is not unique but account type "%s" may share its account number.', $value, $type));
|
||||||
|
|
||||||
// one other account with this account number.
|
// one other account with this account number.
|
||||||
/** @var AccountMeta $entry */
|
/** @var AccountMeta $entry */
|
||||||
@@ -654,11 +663,11 @@ class FireflyValidator extends Validator
|
|||||||
$otherAccount = $entry->account;
|
$otherAccount = $entry->account;
|
||||||
$otherType = (string) config(sprintf('firefly.shortNamesByFullName.%s', $otherAccount->accountType->type));
|
$otherType = (string) config(sprintf('firefly.shortNamesByFullName.%s', $otherAccount->accountType->type));
|
||||||
if (('expense' === $otherType || 'revenue' === $otherType) && $otherType !== $type) {
|
if (('expense' === $otherType || 'revenue' === $otherType) && $otherType !== $type) {
|
||||||
app('log')->debug(sprintf('The other account with this account number is a "%s" so return true.', $otherType));
|
Log::debug(sprintf('The other account with this account number is a "%s" so return true.', $otherType));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('The other account with this account number is a "%s" so return false.', $otherType));
|
Log::debug(sprintf('The other account with this account number is a "%s" so return false.', $otherType));
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@@ -35,6 +35,7 @@ use FireflyIII\Models\UserGroup;
|
|||||||
use FireflyIII\Repositories\Account\AccountRepository;
|
use FireflyIII\Repositories\Account\AccountRepository;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,12 +53,12 @@ trait TransactionValidation
|
|||||||
if ($validator->errors()->count() > 0) {
|
if ($validator->errors()->count() > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('Now in validateAccountInformation (TransactionValidation) ()');
|
Log::debug('Now in validateAccountInformation (TransactionValidation) ()');
|
||||||
$transactions = $this->getTransactionsArray($validator);
|
$transactions = $this->getTransactionsArray($validator);
|
||||||
$data = $validator->getData();
|
$data = $validator->getData();
|
||||||
$transactionType = $data['type'] ?? 'invalid';
|
$transactionType = $data['type'] ?? 'invalid';
|
||||||
|
|
||||||
app('log')->debug(sprintf('Going to loop %d transaction(s)', count($transactions)));
|
Log::debug(sprintf('Going to loop %d transaction(s)', count($transactions)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int|string $index
|
* @var int|string $index
|
||||||
@@ -75,15 +76,15 @@ trait TransactionValidation
|
|||||||
|
|
||||||
protected function getTransactionsArray(Validator $validator): array
|
protected function getTransactionsArray(Validator $validator): array
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in getTransactionsArray');
|
Log::debug('Now in getTransactionsArray');
|
||||||
$data = $validator->getData();
|
$data = $validator->getData();
|
||||||
$transactions = [];
|
$transactions = [];
|
||||||
if (array_key_exists('transactions', $data) && is_array($data['transactions'])) {
|
if (array_key_exists('transactions', $data) && is_array($data['transactions'])) {
|
||||||
app('log')->debug('Transactions key exists and is array.');
|
Log::debug('Transactions key exists and is array.');
|
||||||
$transactions = $data['transactions'];
|
$transactions = $data['transactions'];
|
||||||
}
|
}
|
||||||
if (array_key_exists('transactions', $data) && !is_array($data['transactions'])) {
|
if (array_key_exists('transactions', $data) && !is_array($data['transactions'])) {
|
||||||
app('log')->debug(sprintf('Transactions key exists but is NOT array, its a %s', gettype($data['transactions'])));
|
Log::debug(sprintf('Transactions key exists but is NOT array, its a %s', gettype($data['transactions'])));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $transactions;
|
return $transactions;
|
||||||
@@ -94,7 +95,7 @@ trait TransactionValidation
|
|||||||
*/
|
*/
|
||||||
protected function validateSingleAccount(Validator $validator, int $index, string $transactionType, array $transaction): void
|
protected function validateSingleAccount(Validator $validator, int $index, string $transactionType, array $transaction): void
|
||||||
{
|
{
|
||||||
app('log')->debug(sprintf('Now in validateSingleAccount(%d)', $index));
|
Log::debug(sprintf('Now in validateSingleAccount(%d)', $index));
|
||||||
|
|
||||||
/** @var AccountValidator $accountValidator */
|
/** @var AccountValidator $accountValidator */
|
||||||
$accountValidator = app(AccountValidator::class);
|
$accountValidator = app(AccountValidator::class);
|
||||||
@@ -158,11 +159,11 @@ trait TransactionValidation
|
|||||||
*/
|
*/
|
||||||
protected function sanityCheckReconciliation(Validator $validator, string $transactionType, int $index, array $source, array $destination): void
|
protected function sanityCheckReconciliation(Validator $validator, string $transactionType, int $index, array $source, array $destination): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in sanityCheckReconciliation');
|
Log::debug('Now in sanityCheckReconciliation');
|
||||||
if (TransactionTypeEnum::RECONCILIATION->value === ucfirst($transactionType)
|
if (TransactionTypeEnum::RECONCILIATION->value === ucfirst($transactionType)
|
||||||
&& null === $source['id'] && null === $source['name'] && null === $destination['id'] && null === $destination['name']
|
&& null === $source['id'] && null === $source['name'] && null === $destination['id'] && null === $destination['name']
|
||||||
) {
|
) {
|
||||||
app('log')->debug('Both are NULL, error!');
|
Log::debug('Both are NULL, error!');
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_id', $index), trans('validation.reconciliation_either_account'));
|
$validator->errors()->add(sprintf('transactions.%d.source_id', $index), trans('validation.reconciliation_either_account'));
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_name', $index), trans('validation.reconciliation_either_account'));
|
$validator->errors()->add(sprintf('transactions.%d.source_name', $index), trans('validation.reconciliation_either_account'));
|
||||||
$validator->errors()->add(sprintf('transactions.%d.destination_id', $index), trans('validation.reconciliation_either_account'));
|
$validator->errors()->add(sprintf('transactions.%d.destination_id', $index), trans('validation.reconciliation_either_account'));
|
||||||
@@ -172,7 +173,7 @@ trait TransactionValidation
|
|||||||
if (TransactionTypeEnum::RECONCILIATION->value === $transactionType
|
if (TransactionTypeEnum::RECONCILIATION->value === $transactionType
|
||||||
&& (null !== $source['id'] || null !== $source['name'])
|
&& (null !== $source['id'] || null !== $source['name'])
|
||||||
&& (null !== $destination['id'] || null !== $destination['name'])) {
|
&& (null !== $destination['id'] || null !== $destination['name'])) {
|
||||||
app('log')->debug('Both are not NULL, error!');
|
Log::debug('Both are not NULL, error!');
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_id', $index), trans('validation.reconciliation_either_account'));
|
$validator->errors()->add(sprintf('transactions.%d.source_id', $index), trans('validation.reconciliation_either_account'));
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_name', $index), trans('validation.reconciliation_either_account'));
|
$validator->errors()->add(sprintf('transactions.%d.source_name', $index), trans('validation.reconciliation_either_account'));
|
||||||
$validator->errors()->add(sprintf('transactions.%d.destination_id', $index), trans('validation.reconciliation_either_account'));
|
$validator->errors()->add(sprintf('transactions.%d.destination_id', $index), trans('validation.reconciliation_either_account'));
|
||||||
@@ -193,30 +194,30 @@ trait TransactionValidation
|
|||||||
string $transactionType,
|
string $transactionType,
|
||||||
int $index
|
int $index
|
||||||
): void {
|
): void {
|
||||||
app('log')->debug('Now in sanityCheckForeignCurrency()');
|
Log::debug('Now in sanityCheckForeignCurrency()');
|
||||||
if (0 !== $validator->errors()->count()) {
|
if (0 !== $validator->errors()->count()) {
|
||||||
app('log')->debug('Already have errors, return');
|
Log::debug('Already have errors, return');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (null === $accountValidator->source) {
|
if (null === $accountValidator->source) {
|
||||||
app('log')->debug('No source, return');
|
Log::debug('No source, return');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (null === $accountValidator->destination) {
|
if (null === $accountValidator->destination) {
|
||||||
app('log')->debug('No destination, return');
|
Log::debug('No destination, return');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$source = $accountValidator->source;
|
$source = $accountValidator->source;
|
||||||
$destination = $accountValidator->destination;
|
$destination = $accountValidator->destination;
|
||||||
|
|
||||||
app('log')->debug(sprintf('Source: #%d "%s (%s)"', $source->id, $source->name, $source->accountType->type));
|
Log::debug(sprintf('Source: #%d "%s (%s)"', $source->id, $source->name, $source->accountType->type));
|
||||||
app('log')->debug(sprintf('Destination: #%d "%s" (%s)', $destination->id, $destination->name, $source->accountType->type));
|
Log::debug(sprintf('Destination: #%d "%s" (%s)', $destination->id, $destination->name, $source->accountType->type));
|
||||||
|
|
||||||
if (!$this->isLiabilityOrAsset($source) || !$this->isLiabilityOrAsset($destination)) {
|
if (!$this->isLiabilityOrAsset($source) || !$this->isLiabilityOrAsset($destination)) {
|
||||||
app('log')->debug('Any account must be liability or asset account to continue.');
|
Log::debug('Any account must be liability or asset account to continue.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -228,17 +229,17 @@ trait TransactionValidation
|
|||||||
$destinationCurrency = $accountRepository->getAccountCurrency($destination) ?? $defaultCurrency;
|
$destinationCurrency = $accountRepository->getAccountCurrency($destination) ?? $defaultCurrency;
|
||||||
// if both accounts have the same currency, continue.
|
// if both accounts have the same currency, continue.
|
||||||
if ($sourceCurrency->code === $destinationCurrency->code) {
|
if ($sourceCurrency->code === $destinationCurrency->code) {
|
||||||
app('log')->debug('Both accounts have the same currency, continue.');
|
Log::debug('Both accounts have the same currency, continue.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Source account expects %s', $sourceCurrency->code));
|
Log::debug(sprintf('Source account expects %s', $sourceCurrency->code));
|
||||||
app('log')->debug(sprintf('Destination account expects %s', $destinationCurrency->code));
|
Log::debug(sprintf('Destination account expects %s', $destinationCurrency->code));
|
||||||
|
|
||||||
app('log')->debug(sprintf('Amount is %s', $transaction['amount']));
|
Log::debug(sprintf('Amount is %s', $transaction['amount']));
|
||||||
|
|
||||||
if (TransactionTypeEnum::DEPOSIT->value === ucfirst($transactionType)) {
|
if (TransactionTypeEnum::DEPOSIT->value === ucfirst($transactionType)) {
|
||||||
app('log')->debug(sprintf('Processing as a "%s"', $transactionType));
|
Log::debug(sprintf('Processing as a "%s"', $transactionType));
|
||||||
// use case: deposit from liability account to an asset account
|
// use case: deposit from liability account to an asset account
|
||||||
// the foreign amount must be in the currency of the source
|
// the foreign amount must be in the currency of the source
|
||||||
// the amount must be in the currency of the destination
|
// the amount must be in the currency of the destination
|
||||||
@@ -253,7 +254,7 @@ trait TransactionValidation
|
|||||||
// wrong currency information is present
|
// wrong currency information is present
|
||||||
$foreignCurrencyCode = $transaction['foreign_currency_code'] ?? false;
|
$foreignCurrencyCode = $transaction['foreign_currency_code'] ?? false;
|
||||||
$foreignCurrencyId = (int) ($transaction['foreign_currency_id'] ?? 0);
|
$foreignCurrencyId = (int) ($transaction['foreign_currency_id'] ?? 0);
|
||||||
app('log')->debug(sprintf('Foreign currency code seems to be #%d "%s"', $foreignCurrencyId, $foreignCurrencyCode), $transaction);
|
Log::debug(sprintf('Foreign currency code seems to be #%d "%s"', $foreignCurrencyId, $foreignCurrencyCode), $transaction);
|
||||||
if ($foreignCurrencyCode !== $sourceCurrency->code && $foreignCurrencyId !== $sourceCurrency->id) {
|
if ($foreignCurrencyCode !== $sourceCurrency->code && $foreignCurrencyId !== $sourceCurrency->id) {
|
||||||
$validator->errors()->add(sprintf('transactions.%d.foreign_currency_code', $index), (string) trans('validation.require_foreign_src'));
|
$validator->errors()->add(sprintf('transactions.%d.foreign_currency_code', $index), (string) trans('validation.require_foreign_src'));
|
||||||
|
|
||||||
@@ -261,7 +262,7 @@ trait TransactionValidation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TransactionTypeEnum::TRANSFER->value === ucfirst($transactionType) || TransactionTypeEnum::WITHDRAWAL->value === ucfirst($transactionType)) {
|
if (TransactionTypeEnum::TRANSFER->value === ucfirst($transactionType) || TransactionTypeEnum::WITHDRAWAL->value === ucfirst($transactionType)) {
|
||||||
app('log')->debug(sprintf('Processing as a "%s"', $transactionType));
|
Log::debug(sprintf('Processing as a "%s"', $transactionType));
|
||||||
// use case: withdrawal from asset account to a liability account.
|
// use case: withdrawal from asset account to a liability account.
|
||||||
// the foreign amount must be in the currency of the destination
|
// the foreign amount must be in the currency of the destination
|
||||||
// the amount must be in the currency of the source
|
// the amount must be in the currency of the source
|
||||||
@@ -280,10 +281,10 @@ trait TransactionValidation
|
|||||||
// wrong currency information is present
|
// wrong currency information is present
|
||||||
$foreignCurrencyCode = $transaction['foreign_currency_code'] ?? false;
|
$foreignCurrencyCode = $transaction['foreign_currency_code'] ?? false;
|
||||||
$foreignCurrencyId = (int) ($transaction['foreign_currency_id'] ?? 0);
|
$foreignCurrencyId = (int) ($transaction['foreign_currency_id'] ?? 0);
|
||||||
app('log')->debug(sprintf('Foreign currency code seems to be #%d "%s"', $foreignCurrencyId, $foreignCurrencyCode), $transaction);
|
Log::debug(sprintf('Foreign currency code seems to be #%d "%s"', $foreignCurrencyId, $foreignCurrencyCode), $transaction);
|
||||||
if ($foreignCurrencyCode !== $destinationCurrency->code && $foreignCurrencyId !== $destinationCurrency->id) {
|
if ($foreignCurrencyCode !== $destinationCurrency->code && $foreignCurrencyId !== $destinationCurrency->id) {
|
||||||
app('log')->debug(sprintf('No match on code, "%s" vs "%s"', $foreignCurrencyCode, $destinationCurrency->code));
|
Log::debug(sprintf('No match on code, "%s" vs "%s"', $foreignCurrencyCode, $destinationCurrency->code));
|
||||||
app('log')->debug(sprintf('No match on ID, #%d vs #%d', $foreignCurrencyId, $destinationCurrency->id));
|
Log::debug(sprintf('No match on ID, #%d vs #%d', $foreignCurrencyId, $destinationCurrency->id));
|
||||||
$validator->errors()->add(sprintf('transactions.%d.foreign_amount', $index), (string) trans('validation.require_foreign_dest'));
|
$validator->errors()->add(sprintf('transactions.%d.foreign_amount', $index), (string) trans('validation.require_foreign_dest'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -336,9 +337,9 @@ trait TransactionValidation
|
|||||||
*/
|
*/
|
||||||
public function validateAccountInformationUpdate(Validator $validator, TransactionGroup $transactionGroup): void
|
public function validateAccountInformationUpdate(Validator $validator, TransactionGroup $transactionGroup): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in validateAccountInformationUpdate()');
|
Log::debug('Now in validateAccountInformationUpdate()');
|
||||||
if ($validator->errors()->count() > 0) {
|
if ($validator->errors()->count() > 0) {
|
||||||
app('log')->debug('Validator already has errors, so return.');
|
Log::debug('Validator already has errors, so return.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -359,7 +360,7 @@ trait TransactionValidation
|
|||||||
|
|
||||||
protected function validateSingleUpdate(Validator $validator, int $index, array $transaction, TransactionGroup $transactionGroup): void
|
protected function validateSingleUpdate(Validator $validator, int $index, array $transaction, TransactionGroup $transactionGroup): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now validating single account update in validateSingleUpdate()');
|
Log::debug('Now validating single account update in validateSingleUpdate()');
|
||||||
|
|
||||||
// if no account types are given, just skip the check.
|
// if no account types are given, just skip the check.
|
||||||
if (
|
if (
|
||||||
@@ -367,7 +368,7 @@ trait TransactionValidation
|
|||||||
&& !array_key_exists('source_name', $transaction)
|
&& !array_key_exists('source_name', $transaction)
|
||||||
&& !array_key_exists('destination_id', $transaction)
|
&& !array_key_exists('destination_id', $transaction)
|
||||||
&& !array_key_exists('destination_name', $transaction)) {
|
&& !array_key_exists('destination_name', $transaction)) {
|
||||||
app('log')->debug('No account data has been submitted so will not validating account info.');
|
Log::debug('No account data has been submitted so will not validating account info.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -376,8 +377,13 @@ trait TransactionValidation
|
|||||||
/** @var AccountValidator $accountValidator */
|
/** @var AccountValidator $accountValidator */
|
||||||
$accountValidator = app(AccountValidator::class);
|
$accountValidator = app(AccountValidator::class);
|
||||||
|
|
||||||
|
// 2025-01-29 grab the transaction type from the update array.
|
||||||
|
$originalType = $this->getTransactionType($transactionGroup, []);
|
||||||
|
$transactionType = $transaction['type'] ?? $originalType;
|
||||||
|
Log::debug(sprintf('Determined transaction type to be "%s"', $transactionType));
|
||||||
|
|
||||||
// get the transaction type using the original transaction group:
|
// get the transaction type using the original transaction group:
|
||||||
$accountValidator->setTransactionType($this->getTransactionType($transactionGroup, []));
|
$accountValidator->setTransactionType($transactionType);
|
||||||
|
|
||||||
// validate if the submitted source ID/name/iban/number are valid
|
// validate if the submitted source ID/name/iban/number are valid
|
||||||
if (
|
if (
|
||||||
@@ -386,7 +392,7 @@ trait TransactionValidation
|
|||||||
|| array_key_exists('source_iban', $transaction)
|
|| array_key_exists('source_iban', $transaction)
|
||||||
|| array_key_exists('source_number', $transaction)
|
|| array_key_exists('source_number', $transaction)
|
||||||
) {
|
) {
|
||||||
app('log')->debug('Will try to validate source account information.');
|
Log::debug('Will try to validate source account information.');
|
||||||
$sourceId = (int) ($transaction['source_id'] ?? 0);
|
$sourceId = (int) ($transaction['source_id'] ?? 0);
|
||||||
$sourceName = $transaction['source_name'] ?? null;
|
$sourceName = $transaction['source_name'] ?? null;
|
||||||
$sourceIban = $transaction['source_iban'] ?? null;
|
$sourceIban = $transaction['source_iban'] ?? null;
|
||||||
@@ -397,15 +403,20 @@ trait TransactionValidation
|
|||||||
|
|
||||||
// do something with result:
|
// do something with result:
|
||||||
if (false === $validSource) {
|
if (false === $validSource) {
|
||||||
app('log')->warning('Looks like the source account is not valid so complain to the user about it.');
|
Log::warning('Looks like the source account is not valid so complain to the user about it.');
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_id', $index), $accountValidator->sourceError);
|
$validator->errors()->add(sprintf('transactions.%d.source_id', $index), $accountValidator->sourceError);
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_name', $index), $accountValidator->sourceError);
|
$validator->errors()->add(sprintf('transactions.%d.source_name', $index), $accountValidator->sourceError);
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_iban', $index), $accountValidator->sourceError);
|
$validator->errors()->add(sprintf('transactions.%d.source_iban', $index), $accountValidator->sourceError);
|
||||||
$validator->errors()->add(sprintf('transactions.%d.source_number', $index), $accountValidator->sourceError);
|
$validator->errors()->add(sprintf('transactions.%d.source_number', $index), $accountValidator->sourceError);
|
||||||
|
|
||||||
|
// also add an error for the transaction type, if it is different.
|
||||||
|
if ($originalType !== $transactionType) {
|
||||||
|
$validator->errors()->add(sprintf('transactions.%d.type', $index), (string) trans('validation.transaction_type_changed'));
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('Source account info is valid.');
|
Log::debug('Source account info is valid.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -414,15 +425,15 @@ trait TransactionValidation
|
|||||||
|| array_key_exists('destination_iban', $transaction)
|
|| array_key_exists('destination_iban', $transaction)
|
||||||
|| array_key_exists('destination_number', $transaction)
|
|| array_key_exists('destination_number', $transaction)
|
||||||
) {
|
) {
|
||||||
app('log')->debug('Will try to validate destination account information.');
|
Log::debug('Will try to validate destination account information.');
|
||||||
// at this point the validator may not have a source account, because it was never submitted for validation.
|
// at this point the validator may not have a source account, because it was never submitted for validation.
|
||||||
// must add it ourselves or the validator can never check if the destination is correct.
|
// must add it ourselves or the validator can never check if the destination is correct.
|
||||||
// the $transaction array must have a journal id or it's just one, this was validated before.
|
// the $transaction array must have a journal id or it's just one, this was validated before.
|
||||||
if (null === $accountValidator->source) {
|
if (null === $accountValidator->source) {
|
||||||
app('log')->debug('Account validator has no source account, must find it.');
|
Log::debug('Account validator has no source account, must find it.');
|
||||||
$source = $this->getOriginalSource($transaction, $transactionGroup);
|
$source = $this->getOriginalSource($transaction, $transactionGroup);
|
||||||
if (null !== $source) {
|
if (null !== $source) {
|
||||||
app('log')->debug('Found a source!');
|
Log::debug('Found a source!');
|
||||||
$accountValidator->source = $source;
|
$accountValidator->source = $source;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,13 +445,17 @@ trait TransactionValidation
|
|||||||
$validDestination = $accountValidator->validateDestination($array);
|
$validDestination = $accountValidator->validateDestination($array);
|
||||||
// do something with result:
|
// do something with result:
|
||||||
if (false === $validDestination) {
|
if (false === $validDestination) {
|
||||||
app('log')->warning('Looks like the destination account is not valid so complain to the user about it.');
|
Log::warning('Looks like the destination account is not valid so complain to the user about it.');
|
||||||
$validator->errors()->add(sprintf('transactions.%d.destination_id', $index), $accountValidator->destError);
|
$validator->errors()->add(sprintf('transactions.%d.destination_id', $index), $accountValidator->destError);
|
||||||
$validator->errors()->add(sprintf('transactions.%d.destination_name', $index), $accountValidator->destError);
|
$validator->errors()->add(sprintf('transactions.%d.destination_name', $index), $accountValidator->destError);
|
||||||
|
// also add an error for the transaction type, if it is different.
|
||||||
|
if ($originalType !== $transactionType) {
|
||||||
|
$validator->errors()->add(sprintf('transactions.%d.type', $index), (string) trans('validation.transaction_type_changed'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
app('log')->debug('Destination account info is valid.');
|
Log::debug('Destination account info is valid.');
|
||||||
}
|
}
|
||||||
app('log')->debug('Done with validateSingleUpdate().');
|
Log::debug('Done with validateSingleUpdate().');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getTransactionType(TransactionGroup $group, array $transactions): string
|
private function getTransactionType(TransactionGroup $group, array $transactions): string
|
||||||
@@ -472,7 +487,7 @@ trait TransactionValidation
|
|||||||
*/
|
*/
|
||||||
public function validateOneRecurrenceTransaction(Validator $validator): void
|
public function validateOneRecurrenceTransaction(Validator $validator): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in validateOneRecurrenceTransaction()');
|
Log::debug('Now in validateOneRecurrenceTransaction()');
|
||||||
$transactions = $this->getTransactionsArray($validator);
|
$transactions = $this->getTransactionsArray($validator);
|
||||||
|
|
||||||
// need at least one transaction
|
// need at least one transaction
|
||||||
@@ -486,9 +501,9 @@ trait TransactionValidation
|
|||||||
*/
|
*/
|
||||||
public function validateOneTransaction(Validator $validator): void
|
public function validateOneTransaction(Validator $validator): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in validateOneTransaction');
|
Log::debug('Now in validateOneTransaction');
|
||||||
if ($validator->errors()->count() > 0) {
|
if ($validator->errors()->count() > 0) {
|
||||||
app('log')->debug('Validator already has errors, so return.');
|
Log::debug('Validator already has errors, so return.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -496,11 +511,11 @@ trait TransactionValidation
|
|||||||
// need at least one transaction
|
// need at least one transaction
|
||||||
if (0 === count($transactions)) {
|
if (0 === count($transactions)) {
|
||||||
$validator->errors()->add('transactions.0.description', (string) trans('validation.at_least_one_transaction'));
|
$validator->errors()->add('transactions.0.description', (string) trans('validation.at_least_one_transaction'));
|
||||||
app('log')->debug('Added error: at_least_one_transaction.');
|
Log::debug('Added error: at_least_one_transaction.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('Added NO errors.');
|
Log::debug('Added NO errors.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function validateTransactionArray(Validator $validator): void
|
public function validateTransactionArray(Validator $validator): void
|
||||||
@@ -512,7 +527,7 @@ trait TransactionValidation
|
|||||||
foreach (array_keys($transactions) as $key) {
|
foreach (array_keys($transactions) as $key) {
|
||||||
if (!is_int($key)) {
|
if (!is_int($key)) {
|
||||||
$validator->errors()->add('transactions.0.description', (string) trans('validation.at_least_one_transaction'));
|
$validator->errors()->add('transactions.0.description', (string) trans('validation.at_least_one_transaction'));
|
||||||
app('log')->debug('Added error: at_least_one_transaction.');
|
Log::debug('Added error: at_least_one_transaction.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -527,7 +542,7 @@ trait TransactionValidation
|
|||||||
if ($validator->errors()->count() > 0) {
|
if ($validator->errors()->count() > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('Now in validateTransactionTypes()');
|
Log::debug('Now in validateTransactionTypes()');
|
||||||
$transactions = $this->getTransactionsArray($validator);
|
$transactions = $this->getTransactionsArray($validator);
|
||||||
|
|
||||||
$types = [];
|
$types = [];
|
||||||
@@ -551,7 +566,7 @@ trait TransactionValidation
|
|||||||
*/
|
*/
|
||||||
public function validateTransactionTypesForUpdate(Validator $validator): void
|
public function validateTransactionTypesForUpdate(Validator $validator): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in validateTransactionTypesForUpdate()');
|
Log::debug('Now in validateTransactionTypesForUpdate()');
|
||||||
$transactions = $this->getTransactionsArray($validator);
|
$transactions = $this->getTransactionsArray($validator);
|
||||||
$types = [];
|
$types = [];
|
||||||
foreach ($transactions as $transaction) {
|
foreach ($transactions as $transaction) {
|
||||||
@@ -561,12 +576,12 @@ trait TransactionValidation
|
|||||||
}
|
}
|
||||||
$unique = array_unique($types);
|
$unique = array_unique($types);
|
||||||
if (count($unique) > 1) {
|
if (count($unique) > 1) {
|
||||||
app('log')->warning('Add error for mismatch transaction types.');
|
Log::warning('Add error for mismatch transaction types.');
|
||||||
$validator->errors()->add('transactions.0.type', (string) trans('validation.transaction_types_equal'));
|
$validator->errors()->add('transactions.0.type', (string) trans('validation.transaction_types_equal'));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('No errors in validateTransactionTypesForUpdate()');
|
Log::debug('No errors in validateTransactionTypesForUpdate()');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getOriginalType(int $journalId): string
|
private function getOriginalType(int $journalId): string
|
||||||
@@ -589,7 +604,7 @@ trait TransactionValidation
|
|||||||
if ($validator->errors()->count() > 0) {
|
if ($validator->errors()->count() > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('Now in validateEqualAccounts()');
|
Log::debug('Now in validateEqualAccounts()');
|
||||||
$transactions = $this->getTransactionsArray($validator);
|
$transactions = $this->getTransactionsArray($validator);
|
||||||
|
|
||||||
// needs to be split
|
// needs to be split
|
||||||
@@ -635,16 +650,16 @@ trait TransactionValidation
|
|||||||
private function validateEqualAccountsForUpdate(Validator $validator, TransactionGroup $transactionGroup): void
|
private function validateEqualAccountsForUpdate(Validator $validator, TransactionGroup $transactionGroup): void
|
||||||
{
|
{
|
||||||
if ($validator->errors()->count() > 0) {
|
if ($validator->errors()->count() > 0) {
|
||||||
app('log')->debug('Validator already has errors, so return.');
|
Log::debug('Validator already has errors, so return.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
app('log')->debug('Now in validateEqualAccountsForUpdate()');
|
Log::debug('Now in validateEqualAccountsForUpdate()');
|
||||||
$transactions = $this->getTransactionsArray($validator);
|
$transactions = $this->getTransactionsArray($validator);
|
||||||
|
|
||||||
if (2 !== count($transactions)) {
|
if (2 !== count($transactions)) {
|
||||||
app('log')->debug('Less than 2 transactions, do nothing.');
|
Log::debug('Less than 2 transactions, do nothing.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -668,11 +683,11 @@ trait TransactionValidation
|
|||||||
$validator->errors()->add('transactions.0.source_id', (string) trans('validation.all_accounts_equal'));
|
$validator->errors()->add('transactions.0.source_id', (string) trans('validation.all_accounts_equal'));
|
||||||
$validator->errors()->add('transactions.0.destination_id', (string) trans('validation.all_accounts_equal'));
|
$validator->errors()->add('transactions.0.destination_id', (string) trans('validation.all_accounts_equal'));
|
||||||
}
|
}
|
||||||
app('log')->warning('Add error about equal accounts.');
|
Log::warning('Add error about equal accounts.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('No errors found in validateEqualAccountsForUpdate');
|
Log::debug('No errors found in validateEqualAccountsForUpdate');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function collectComparisonData(array $transactions): array
|
private function collectComparisonData(array $transactions): array
|
||||||
|
19
changelog.md
19
changelog.md
@@ -3,13 +3,15 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
## 6.2.0 - 2025-01-19 (or later)
|
## 6.2.0 - 2025-01-26 (or later)
|
||||||
|
|
||||||
|
> ⚠️ _This release comes with many changes, small and large. I expect you will run into issue, and I appreciate your feedback and your patience as I fix them. I've tested many things, but I'm 100% sure I've missed things. Please open [an issue here](https://github.com/firefly-iii/firefly-iii/issues/new?template=bug.yml) if you run into problems._
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Multi-currency support. If you set `ENABLE_EXCHANGE_RATES=true` and optionally `ENABLE_EXTERNAL_RATES=true` Firefly III will try to calculate all foreign currencies back to your native currency. This is a work in progress, not all fields and all places will support this yet. Please check out the [documentation](https://docs.firefly-iii.org/explanation/financial-concepts/exchange-rates/).
|
- Multi-currency support. If you set `ENABLE_EXCHANGE_RATES=true` and optionally `ENABLE_EXTERNAL_RATES=true` Firefly III will have the ability to calculate all foreign currencies back to your native currency. This is a work in progress, not all fields and all places will support this yet. Please check out the [documentation](https://docs.firefly-iii.org/explanation/financial-concepts/exchange-rates/).
|
||||||
- Notifications support Nfty, Pushover, Slack and Discord.
|
- There is notifications support for Nfty, Pushover, Slack and Discord.
|
||||||
- Many new security related notifications.
|
- There are many new security related notifications.
|
||||||
- [Issue 5523](https://github.com/firefly-iii/firefly-iii/issues/5523) (Add comment on a budget for a given month) reported by @n-serrette
|
- [Issue 5523](https://github.com/firefly-iii/firefly-iii/issues/5523) (Add comment on a budget for a given month) reported by @n-serrette
|
||||||
- [Issue 5532](https://github.com/firefly-iii/firefly-iii/issues/5532) (Asset prices and exchange rates) reported by @svozniuk
|
- [Issue 5532](https://github.com/firefly-iii/firefly-iii/issues/5532) (Asset prices and exchange rates) reported by @svozniuk
|
||||||
- [Issue 6314](https://github.com/firefly-iii/firefly-iii/issues/6314) (Currencies and exchange rates) reported by @JC5
|
- [Issue 6314](https://github.com/firefly-iii/firefly-iii/issues/6314) (Currencies and exchange rates) reported by @JC5
|
||||||
@@ -26,12 +28,13 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Firefly III requires PHP 8.4.
|
- Firefly III requires PHP 8.4.
|
||||||
- [Issue 9501](https://github.com/firefly-iii/firefly-iii/issues/9501) (PHP8.4 support) reported by @JC5
|
|
||||||
- Docker container no longer runs under root.
|
- Docker container no longer runs under root.
|
||||||
- "Bills" are now called "subscriptions" to better reflect their purpose.
|
- "Bills" are now called "subscriptions" to better reflect their purpose.
|
||||||
- Rename "administration" to "settings" to prevent confusion with "financial administrations"
|
- Rename "administration" to "settings" to prevent confusion with "financial administrations"
|
||||||
- Rename 'default currency' to 'native currency'
|
- Rename 'default currency' to 'native currency'
|
||||||
- Move native currency setting to financial administration edit screen to better reflect where it belongs
|
- Move native currency setting to financial administration edit screen to better reflect where it belongs
|
||||||
|
- [Issue 9501](https://github.com/firefly-iii/firefly-iii/issues/9501) (PHP8.4 support) reported by @JC5
|
||||||
|
- [Issue 9683](https://github.com/firefly-iii/firefly-iii/issues/9683) (500 viewing inactive liabilities) reported by @stuzer05
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
@@ -42,10 +45,14 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
|
|
||||||
- [Issue 9532](https://github.com/firefly-iii/firefly-iii/issues/9532) (ReportSum Integrity Check fails due to empty foreign_amount) reported by @SircasticFox
|
- [Issue 9532](https://github.com/firefly-iii/firefly-iii/issues/9532) (ReportSum Integrity Check fails due to empty foreign_amount) reported by @SircasticFox
|
||||||
- [Issue 7288](https://github.com/firefly-iii/firefly-iii/issues/7288) (currentMonthStart/currentMonthEnd not working for no-budget view) reported by @bradsk88
|
- [Issue 7288](https://github.com/firefly-iii/firefly-iii/issues/7288) (currentMonthStart/currentMonthEnd not working for no-budget view) reported by @bradsk88
|
||||||
|
- [Issue 9704](https://github.com/firefly-iii/firefly-iii/issues/9704) (Piggy banks widget displays only main currency for different currencies) reported by @vayakovlev
|
||||||
|
|
||||||
### API
|
### API
|
||||||
|
|
||||||
- API changes related to new features are [documented](#).
|
- API changes related to new features are [documented](https://api-docs.firefly-iii.org/).
|
||||||
|
- New endpoint for multiple financial administrations ("user groups").
|
||||||
|
- The change from "default currency" (user) to "native currency" (financial administration) is slowly being reflected in the API. Please report issues.
|
||||||
|
- You can change the "transaction type" of an existing transaction if you submit a new `type` and the correct source and destination account names or IDs.
|
||||||
|
|
||||||
## 6.1.25 - 2024-12-19
|
## 6.1.25 - 2024-12-19
|
||||||
|
|
||||||
|
376
composer.lock
generated
376
composer.lock
generated
@@ -940,16 +940,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filp/whoops",
|
"name": "filp/whoops",
|
||||||
"version": "2.16.0",
|
"version": "2.17.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filp/whoops.git",
|
"url": "https://github.com/filp/whoops.git",
|
||||||
"reference": "befcdc0e5dce67252aa6322d82424be928214fa2"
|
"reference": "075bc0c26631110584175de6523ab3f1652eb28e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2",
|
"url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e",
|
||||||
"reference": "befcdc0e5dce67252aa6322d82424be928214fa2",
|
"reference": "075bc0c26631110584175de6523ab3f1652eb28e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -999,7 +999,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/filp/whoops/issues",
|
"issues": "https://github.com/filp/whoops/issues",
|
||||||
"source": "https://github.com/filp/whoops/tree/2.16.0"
|
"source": "https://github.com/filp/whoops/tree/2.17.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1007,20 +1007,20 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-09-25T12:00:00+00:00"
|
"time": "2025-01-25T12:00:00+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "firebase/php-jwt",
|
"name": "firebase/php-jwt",
|
||||||
"version": "v6.10.2",
|
"version": "v6.11.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/firebase/php-jwt.git",
|
"url": "https://github.com/firebase/php-jwt.git",
|
||||||
"reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b"
|
"reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
|
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712",
|
||||||
"reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
|
"reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1068,9 +1068,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/firebase/php-jwt/issues",
|
"issues": "https://github.com/firebase/php-jwt/issues",
|
||||||
"source": "https://github.com/firebase/php-jwt/tree/v6.10.2"
|
"source": "https://github.com/firebase/php-jwt/tree/v6.11.0"
|
||||||
},
|
},
|
||||||
"time": "2024-11-24T11:22:49+00:00"
|
"time": "2025-01-23T05:11:06+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "fruitcake/php-cors",
|
"name": "fruitcake/php-cors",
|
||||||
@@ -1874,16 +1874,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/framework",
|
"name": "laravel/framework",
|
||||||
"version": "v11.38.2",
|
"version": "v11.41.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/framework.git",
|
"url": "https://github.com/laravel/framework.git",
|
||||||
"reference": "9d290aa90fcad44048bedca5219d2b872e98772a"
|
"reference": "3ef433d5865f30a19b6b1be247586068399b59cc"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/framework/zipball/9d290aa90fcad44048bedca5219d2b872e98772a",
|
"url": "https://api.github.com/repos/laravel/framework/zipball/3ef433d5865f30a19b6b1be247586068399b59cc",
|
||||||
"reference": "9d290aa90fcad44048bedca5219d2b872e98772a",
|
"reference": "3ef433d5865f30a19b6b1be247586068399b59cc",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1909,7 +1909,7 @@
|
|||||||
"league/flysystem-local": "^3.25.1",
|
"league/flysystem-local": "^3.25.1",
|
||||||
"league/uri": "^7.5.1",
|
"league/uri": "^7.5.1",
|
||||||
"monolog/monolog": "^3.0",
|
"monolog/monolog": "^3.0",
|
||||||
"nesbot/carbon": "^2.72.2|^3.4",
|
"nesbot/carbon": "^2.72.6|^3.8.4",
|
||||||
"nunomaduro/termwind": "^2.0",
|
"nunomaduro/termwind": "^2.0",
|
||||||
"php": "^8.2",
|
"php": "^8.2",
|
||||||
"psr/container": "^1.1.1|^2.0.1",
|
"psr/container": "^1.1.1|^2.0.1",
|
||||||
@@ -1984,6 +1984,7 @@
|
|||||||
"fakerphp/faker": "^1.24",
|
"fakerphp/faker": "^1.24",
|
||||||
"guzzlehttp/promises": "^2.0.3",
|
"guzzlehttp/promises": "^2.0.3",
|
||||||
"guzzlehttp/psr7": "^2.4",
|
"guzzlehttp/psr7": "^2.4",
|
||||||
|
"laravel/pint": "^1.18",
|
||||||
"league/flysystem-aws-s3-v3": "^3.25.1",
|
"league/flysystem-aws-s3-v3": "^3.25.1",
|
||||||
"league/flysystem-ftp": "^3.25.1",
|
"league/flysystem-ftp": "^3.25.1",
|
||||||
"league/flysystem-path-prefixing": "^3.25.1",
|
"league/flysystem-path-prefixing": "^3.25.1",
|
||||||
@@ -2084,34 +2085,34 @@
|
|||||||
"issues": "https://github.com/laravel/framework/issues",
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
"source": "https://github.com/laravel/framework"
|
"source": "https://github.com/laravel/framework"
|
||||||
},
|
},
|
||||||
"time": "2025-01-15T00:06:46+00:00"
|
"time": "2025-01-30T13:25:22+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/passport",
|
"name": "laravel/passport",
|
||||||
"version": "v12.4.0",
|
"version": "v12.4.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/passport.git",
|
"url": "https://github.com/laravel/passport.git",
|
||||||
"reference": "b06a413cb18d07123ced88ba8caa432d40e3bb8c"
|
"reference": "e9959e07f751ae4a8ad102d5cb51cbe211181ec3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/passport/zipball/b06a413cb18d07123ced88ba8caa432d40e3bb8c",
|
"url": "https://api.github.com/repos/laravel/passport/zipball/e9959e07f751ae4a8ad102d5cb51cbe211181ec3",
|
||||||
"reference": "b06a413cb18d07123ced88ba8caa432d40e3bb8c",
|
"reference": "e9959e07f751ae4a8ad102d5cb51cbe211181ec3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"firebase/php-jwt": "^6.4",
|
"firebase/php-jwt": "^6.4",
|
||||||
"illuminate/auth": "^9.21|^10.0|^11.0",
|
"illuminate/auth": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/console": "^9.21|^10.0|^11.0",
|
"illuminate/console": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/container": "^9.21|^10.0|^11.0",
|
"illuminate/container": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/contracts": "^9.21|^10.0|^11.0",
|
"illuminate/contracts": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/cookie": "^9.21|^10.0|^11.0",
|
"illuminate/cookie": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/database": "^9.21|^10.0|^11.0",
|
"illuminate/database": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/encryption": "^9.21|^10.0|^11.0",
|
"illuminate/encryption": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/http": "^9.21|^10.0|^11.0",
|
"illuminate/http": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/support": "^9.21|^10.0|^11.0",
|
"illuminate/support": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"lcobucci/jwt": "^4.3|^5.0",
|
"lcobucci/jwt": "^4.3|^5.0",
|
||||||
"league/oauth2-server": "^8.5.3",
|
"league/oauth2-server": "^8.5.3",
|
||||||
"nyholm/psr7": "^1.5",
|
"nyholm/psr7": "^1.5",
|
||||||
@@ -2122,9 +2123,9 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"mockery/mockery": "^1.0",
|
"mockery/mockery": "^1.0",
|
||||||
"orchestra/testbench": "^7.35|^8.14|^9.0",
|
"orchestra/testbench": "^7.35|^8.14|^9.0|^10.0",
|
||||||
"phpstan/phpstan": "^1.10",
|
"phpstan/phpstan": "^1.10",
|
||||||
"phpunit/phpunit": "^9.3|^10.5"
|
"phpunit/phpunit": "^9.3|^10.5|^11.5"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -2160,20 +2161,20 @@
|
|||||||
"issues": "https://github.com/laravel/passport/issues",
|
"issues": "https://github.com/laravel/passport/issues",
|
||||||
"source": "https://github.com/laravel/passport"
|
"source": "https://github.com/laravel/passport"
|
||||||
},
|
},
|
||||||
"time": "2025-01-13T17:40:20+00:00"
|
"time": "2025-01-28T15:14:23+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/prompts",
|
"name": "laravel/prompts",
|
||||||
"version": "v0.3.3",
|
"version": "v0.3.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/prompts.git",
|
"url": "https://github.com/laravel/prompts.git",
|
||||||
"reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea"
|
"reference": "abeaa2ba4294247d5409490d1ca1bc6248087011"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/prompts/zipball/749395fcd5f8f7530fe1f00dfa84eb22c83d94ea",
|
"url": "https://api.github.com/repos/laravel/prompts/zipball/abeaa2ba4294247d5409490d1ca1bc6248087011",
|
||||||
"reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea",
|
"reference": "abeaa2ba4294247d5409490d1ca1bc6248087011",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2187,7 +2188,7 @@
|
|||||||
"laravel/framework": ">=10.17.0 <10.25.0"
|
"laravel/framework": ">=10.17.0 <10.25.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"illuminate/collections": "^10.0|^11.0",
|
"illuminate/collections": "^10.0|^11.0|^12.0",
|
||||||
"mockery/mockery": "^1.5",
|
"mockery/mockery": "^1.5",
|
||||||
"pestphp/pest": "^2.3|^3.4",
|
"pestphp/pest": "^2.3|^3.4",
|
||||||
"phpstan/phpstan": "^1.11",
|
"phpstan/phpstan": "^1.11",
|
||||||
@@ -2217,38 +2218,38 @@
|
|||||||
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/laravel/prompts/issues",
|
"issues": "https://github.com/laravel/prompts/issues",
|
||||||
"source": "https://github.com/laravel/prompts/tree/v0.3.3"
|
"source": "https://github.com/laravel/prompts/tree/v0.3.4"
|
||||||
},
|
},
|
||||||
"time": "2024-12-30T15:53:31+00:00"
|
"time": "2025-01-24T15:41:01+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/sanctum",
|
"name": "laravel/sanctum",
|
||||||
"version": "v4.0.7",
|
"version": "v4.0.8",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/sanctum.git",
|
"url": "https://github.com/laravel/sanctum.git",
|
||||||
"reference": "698064236a46df016e64a7eb059b1414e0b281df"
|
"reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/sanctum/zipball/698064236a46df016e64a7eb059b1414e0b281df",
|
"url": "https://api.github.com/repos/laravel/sanctum/zipball/ec1dd9ddb2ab370f79dfe724a101856e0963f43c",
|
||||||
"reference": "698064236a46df016e64a7eb059b1414e0b281df",
|
"reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"illuminate/console": "^11.0",
|
"illuminate/console": "^11.0|^12.0",
|
||||||
"illuminate/contracts": "^11.0",
|
"illuminate/contracts": "^11.0|^12.0",
|
||||||
"illuminate/database": "^11.0",
|
"illuminate/database": "^11.0|^12.0",
|
||||||
"illuminate/support": "^11.0",
|
"illuminate/support": "^11.0|^12.0",
|
||||||
"php": "^8.2",
|
"php": "^8.2",
|
||||||
"symfony/console": "^7.0"
|
"symfony/console": "^7.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"mockery/mockery": "^1.6",
|
"mockery/mockery": "^1.6",
|
||||||
"orchestra/testbench": "^9.0",
|
"orchestra/testbench": "^9.0|^10.0",
|
||||||
"phpstan/phpstan": "^1.10",
|
"phpstan/phpstan": "^1.10",
|
||||||
"phpunit/phpunit": "^10.5"
|
"phpunit/phpunit": "^11.3"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -2283,29 +2284,29 @@
|
|||||||
"issues": "https://github.com/laravel/sanctum/issues",
|
"issues": "https://github.com/laravel/sanctum/issues",
|
||||||
"source": "https://github.com/laravel/sanctum"
|
"source": "https://github.com/laravel/sanctum"
|
||||||
},
|
},
|
||||||
"time": "2024-12-11T16:40:21+00:00"
|
"time": "2025-01-26T19:34:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/serializable-closure",
|
"name": "laravel/serializable-closure",
|
||||||
"version": "v2.0.1",
|
"version": "v2.0.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/serializable-closure.git",
|
"url": "https://github.com/laravel/serializable-closure.git",
|
||||||
"reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8"
|
"reference": "2e1a362527783bcab6c316aad51bf36c5513ae44"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8",
|
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2e1a362527783bcab6c316aad51bf36c5513ae44",
|
||||||
"reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8",
|
"reference": "2e1a362527783bcab6c316aad51bf36c5513ae44",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^8.1"
|
"php": "^8.1"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"illuminate/support": "^10.0|^11.0",
|
"illuminate/support": "^10.0|^11.0|^12.0",
|
||||||
"nesbot/carbon": "^2.67|^3.0",
|
"nesbot/carbon": "^2.67|^3.0",
|
||||||
"pestphp/pest": "^2.36",
|
"pestphp/pest": "^2.36|^3.0",
|
||||||
"phpstan/phpstan": "^2.0",
|
"phpstan/phpstan": "^2.0",
|
||||||
"symfony/var-dumper": "^6.2.0|^7.0.0"
|
"symfony/var-dumper": "^6.2.0|^7.0.0"
|
||||||
},
|
},
|
||||||
@@ -2344,34 +2345,34 @@
|
|||||||
"issues": "https://github.com/laravel/serializable-closure/issues",
|
"issues": "https://github.com/laravel/serializable-closure/issues",
|
||||||
"source": "https://github.com/laravel/serializable-closure"
|
"source": "https://github.com/laravel/serializable-closure"
|
||||||
},
|
},
|
||||||
"time": "2024-12-16T15:26:28+00:00"
|
"time": "2025-01-24T15:42:37+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/slack-notification-channel",
|
"name": "laravel/slack-notification-channel",
|
||||||
"version": "v3.4.2",
|
"version": "v3.4.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/slack-notification-channel.git",
|
"url": "https://github.com/laravel/slack-notification-channel.git",
|
||||||
"reference": "282d52d70195283eb1b92e59d7bdc2d525361f4b"
|
"reference": "58890389d6b4b8021c8d34d78246d7dff5a57cb6"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/282d52d70195283eb1b92e59d7bdc2d525361f4b",
|
"url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/58890389d6b4b8021c8d34d78246d7dff5a57cb6",
|
||||||
"reference": "282d52d70195283eb1b92e59d7bdc2d525361f4b",
|
"reference": "58890389d6b4b8021c8d34d78246d7dff5a57cb6",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"guzzlehttp/guzzle": "^7.0",
|
"guzzlehttp/guzzle": "^7.0",
|
||||||
"illuminate/http": "^9.0|^10.0|^11.0",
|
"illuminate/http": "^9.0|^10.0|^11.0|^12.0",
|
||||||
"illuminate/notifications": "^9.0|^10.0|^11.0",
|
"illuminate/notifications": "^9.0|^10.0|^11.0|^12.0",
|
||||||
"illuminate/support": "^9.0|^10.0|^11.0",
|
"illuminate/support": "^9.0|^10.0|^11.0|^12.0",
|
||||||
"php": "^8.0"
|
"php": "^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"mockery/mockery": "^1.0",
|
"mockery/mockery": "^1.0",
|
||||||
"orchestra/testbench": "^7.0|^8.0|^9.0",
|
"orchestra/testbench": "^7.0|^8.0|^9.0|^10.0",
|
||||||
"phpstan/phpstan": "^1.10",
|
"phpstan/phpstan": "^1.10",
|
||||||
"phpunit/phpunit": "^9.0|^10.4"
|
"phpunit/phpunit": "^9.0|^10.4|^11.5"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -2407,35 +2408,35 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/laravel/slack-notification-channel/issues",
|
"issues": "https://github.com/laravel/slack-notification-channel/issues",
|
||||||
"source": "https://github.com/laravel/slack-notification-channel/tree/v3.4.2"
|
"source": "https://github.com/laravel/slack-notification-channel/tree/v3.4.4"
|
||||||
},
|
},
|
||||||
"time": "2024-11-29T14:59:32+00:00"
|
"time": "2025-01-24T15:40:14+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/ui",
|
"name": "laravel/ui",
|
||||||
"version": "v4.6.0",
|
"version": "v4.6.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/ui.git",
|
"url": "https://github.com/laravel/ui.git",
|
||||||
"reference": "a34609b15ae0c0512a0cf47a21695a2729cb7f93"
|
"reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/ui/zipball/a34609b15ae0c0512a0cf47a21695a2729cb7f93",
|
"url": "https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88",
|
||||||
"reference": "a34609b15ae0c0512a0cf47a21695a2729cb7f93",
|
"reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"illuminate/console": "^9.21|^10.0|^11.0",
|
"illuminate/console": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/filesystem": "^9.21|^10.0|^11.0",
|
"illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/support": "^9.21|^10.0|^11.0",
|
"illuminate/support": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"illuminate/validation": "^9.21|^10.0|^11.0",
|
"illuminate/validation": "^9.21|^10.0|^11.0|^12.0",
|
||||||
"php": "^8.0",
|
"php": "^8.0",
|
||||||
"symfony/console": "^6.0|^7.0"
|
"symfony/console": "^6.0|^7.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"orchestra/testbench": "^7.35|^8.15|^9.0",
|
"orchestra/testbench": "^7.35|^8.15|^9.0|^10.0",
|
||||||
"phpunit/phpunit": "^9.3|^10.4|^11.0"
|
"phpunit/phpunit": "^9.3|^10.4|^11.5"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -2470,9 +2471,9 @@
|
|||||||
"ui"
|
"ui"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/laravel/ui/tree/v4.6.0"
|
"source": "https://github.com/laravel/ui/tree/v4.6.1"
|
||||||
},
|
},
|
||||||
"time": "2024-11-21T15:06:41+00:00"
|
"time": "2025-01-28T15:15:29+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "lcobucci/clock",
|
"name": "lcobucci/clock",
|
||||||
@@ -2540,16 +2541,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "lcobucci/jwt",
|
"name": "lcobucci/jwt",
|
||||||
"version": "5.4.2",
|
"version": "5.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/lcobucci/jwt.git",
|
"url": "https://github.com/lcobucci/jwt.git",
|
||||||
"reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712"
|
"reference": "a835af59b030d3f2967725697cf88300f579088e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/lcobucci/jwt/zipball/ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
|
"url": "https://api.github.com/repos/lcobucci/jwt/zipball/a835af59b030d3f2967725697cf88300f579088e",
|
||||||
"reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
|
"reference": "a835af59b030d3f2967725697cf88300f579088e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2597,7 +2598,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/lcobucci/jwt/issues",
|
"issues": "https://github.com/lcobucci/jwt/issues",
|
||||||
"source": "https://github.com/lcobucci/jwt/tree/5.4.2"
|
"source": "https://github.com/lcobucci/jwt/tree/5.5.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2609,7 +2610,7 @@
|
|||||||
"type": "patreon"
|
"type": "patreon"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-11-07T12:54:35+00:00"
|
"time": "2025-01-26T21:29:45+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/commonmark",
|
"name": "league/commonmark",
|
||||||
@@ -3956,37 +3957,37 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nunomaduro/collision",
|
"name": "nunomaduro/collision",
|
||||||
"version": "v8.5.0",
|
"version": "v8.6.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/nunomaduro/collision.git",
|
"url": "https://github.com/nunomaduro/collision.git",
|
||||||
"reference": "f5c101b929c958e849a633283adff296ed5f38f5"
|
"reference": "86f003c132143d5a2ab214e19933946409e0cae7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/nunomaduro/collision/zipball/f5c101b929c958e849a633283adff296ed5f38f5",
|
"url": "https://api.github.com/repos/nunomaduro/collision/zipball/86f003c132143d5a2ab214e19933946409e0cae7",
|
||||||
"reference": "f5c101b929c958e849a633283adff296ed5f38f5",
|
"reference": "86f003c132143d5a2ab214e19933946409e0cae7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"filp/whoops": "^2.16.0",
|
"filp/whoops": "^2.16.0",
|
||||||
"nunomaduro/termwind": "^2.1.0",
|
"nunomaduro/termwind": "^2.3.0",
|
||||||
"php": "^8.2.0",
|
"php": "^8.2.0",
|
||||||
"symfony/console": "^7.1.5"
|
"symfony/console": "^7.2.1"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"laravel/framework": "<11.0.0 || >=12.0.0",
|
"laravel/framework": "<11.39.1 || >=13.0.0",
|
||||||
"phpunit/phpunit": "<10.5.1 || >=12.0.0"
|
"phpunit/phpunit": "<11.5.3 || >=12.0.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"larastan/larastan": "^2.9.8",
|
"larastan/larastan": "^2.9.12",
|
||||||
"laravel/framework": "^11.28.0",
|
"laravel/framework": "^11.39.1",
|
||||||
"laravel/pint": "^1.18.1",
|
"laravel/pint": "^1.20.0",
|
||||||
"laravel/sail": "^1.36.0",
|
"laravel/sail": "^1.40.0",
|
||||||
"laravel/sanctum": "^4.0.3",
|
"laravel/sanctum": "^4.0.7",
|
||||||
"laravel/tinker": "^2.10.0",
|
"laravel/tinker": "^2.10.0",
|
||||||
"orchestra/testbench-core": "^9.5.3",
|
"orchestra/testbench-core": "^9.9.2",
|
||||||
"pestphp/pest": "^2.36.0 || ^3.4.0",
|
"pestphp/pest": "^3.7.3",
|
||||||
"sebastian/environment": "^6.1.0 || ^7.2.0"
|
"sebastian/environment": "^6.1.0 || ^7.2.0"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
@@ -4024,6 +4025,7 @@
|
|||||||
"cli",
|
"cli",
|
||||||
"command-line",
|
"command-line",
|
||||||
"console",
|
"console",
|
||||||
|
"dev",
|
||||||
"error",
|
"error",
|
||||||
"handling",
|
"handling",
|
||||||
"laravel",
|
"laravel",
|
||||||
@@ -4049,7 +4051,7 @@
|
|||||||
"type": "patreon"
|
"type": "patreon"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-10-15T16:06:32+00:00"
|
"time": "2025-01-23T13:41:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nunomaduro/termwind",
|
"name": "nunomaduro/termwind",
|
||||||
@@ -6363,16 +6365,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/laravel-package-tools",
|
"name": "spatie/laravel-package-tools",
|
||||||
"version": "1.18.0",
|
"version": "1.18.3",
|
||||||
"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": "8332205b90d17164913244f4a8e13ab7e6761d29"
|
"reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/8332205b90d17164913244f4a8e13ab7e6761d29",
|
"url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78",
|
||||||
"reference": "8332205b90d17164913244f4a8e13ab7e6761d29",
|
"reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6411,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.0"
|
"source": "https://github.com/spatie/laravel-package-tools/tree/1.18.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6419,7 +6421,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-30T13:13:39+00:00"
|
"time": "2025-01-22T08:51:18+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/period",
|
"name": "spatie/period",
|
||||||
@@ -6477,16 +6479,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/cache",
|
"name": "symfony/cache",
|
||||||
"version": "v7.2.1",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/cache.git",
|
"url": "https://github.com/symfony/cache.git",
|
||||||
"reference": "e7e983596b744c4539f31e79b0350a6cf5878a20"
|
"reference": "8d773a575e446de220dca03d600b2d8e1c1c10ec"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/cache/zipball/e7e983596b744c4539f31e79b0350a6cf5878a20",
|
"url": "https://api.github.com/repos/symfony/cache/zipball/8d773a575e446de220dca03d600b2d8e1c1c10ec",
|
||||||
"reference": "e7e983596b744c4539f31e79b0350a6cf5878a20",
|
"reference": "8d773a575e446de220dca03d600b2d8e1c1c10ec",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6555,7 +6557,7 @@
|
|||||||
"psr6"
|
"psr6"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/cache/tree/v7.2.1"
|
"source": "https://github.com/symfony/cache/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6571,7 +6573,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-07T08:08:50+00:00"
|
"time": "2025-01-27T11:08:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/cache-contracts",
|
"name": "symfony/cache-contracts",
|
||||||
@@ -6950,16 +6952,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/error-handler",
|
"name": "symfony/error-handler",
|
||||||
"version": "v7.2.1",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/error-handler.git",
|
"url": "https://github.com/symfony/error-handler.git",
|
||||||
"reference": "6150b89186573046167796fa5f3f76601d5145f8"
|
"reference": "959a74d044a6db21f4caa6d695648dcb5584cb49"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8",
|
"url": "https://api.github.com/repos/symfony/error-handler/zipball/959a74d044a6db21f4caa6d695648dcb5584cb49",
|
||||||
"reference": "6150b89186573046167796fa5f3f76601d5145f8",
|
"reference": "959a74d044a6db21f4caa6d695648dcb5584cb49",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7005,7 +7007,7 @@
|
|||||||
"description": "Provides tools to manage errors and ease debugging PHP code",
|
"description": "Provides tools to manage errors and ease debugging PHP code",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/error-handler/tree/v7.2.1"
|
"source": "https://github.com/symfony/error-handler/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7021,7 +7023,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-07T08:50:44+00:00"
|
"time": "2025-01-07T09:39:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/event-dispatcher",
|
"name": "symfony/event-dispatcher",
|
||||||
@@ -7309,16 +7311,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-client",
|
"name": "symfony/http-client",
|
||||||
"version": "v7.2.2",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-client.git",
|
"url": "https://github.com/symfony/http-client.git",
|
||||||
"reference": "339ba21476eb184290361542f732ad12c97591ec"
|
"reference": "7ce6078c79a4a7afff931c413d2959d3bffbfb8d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-client/zipball/339ba21476eb184290361542f732ad12c97591ec",
|
"url": "https://api.github.com/repos/symfony/http-client/zipball/7ce6078c79a4a7afff931c413d2959d3bffbfb8d",
|
||||||
"reference": "339ba21476eb184290361542f732ad12c97591ec",
|
"reference": "7ce6078c79a4a7afff931c413d2959d3bffbfb8d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7384,7 +7386,7 @@
|
|||||||
"http"
|
"http"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-client/tree/v7.2.2"
|
"source": "https://github.com/symfony/http-client/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7400,7 +7402,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-30T18:35:15+00:00"
|
"time": "2025-01-28T15:51:35+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-client-contracts",
|
"name": "symfony/http-client-contracts",
|
||||||
@@ -7482,16 +7484,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-foundation",
|
"name": "symfony/http-foundation",
|
||||||
"version": "v7.2.2",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-foundation.git",
|
"url": "https://github.com/symfony/http-foundation.git",
|
||||||
"reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588"
|
"reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/62d1a43796ca3fea3f83a8470dfe63a4af3bc588",
|
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0",
|
||||||
"reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588",
|
"reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7540,7 +7542,7 @@
|
|||||||
"description": "Defines an object-oriented layer for the HTTP specification",
|
"description": "Defines an object-oriented layer for the HTTP specification",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-foundation/tree/v7.2.2"
|
"source": "https://github.com/symfony/http-foundation/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7556,20 +7558,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-30T19:00:17+00:00"
|
"time": "2025-01-17T10:56:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-kernel",
|
"name": "symfony/http-kernel",
|
||||||
"version": "v7.2.2",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-kernel.git",
|
"url": "https://github.com/symfony/http-kernel.git",
|
||||||
"reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306"
|
"reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/3c432966bd8c7ec7429663105f5a02d7e75b4306",
|
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b",
|
||||||
"reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306",
|
"reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7654,7 +7656,7 @@
|
|||||||
"description": "Provides a structured process for converting a Request into a Response",
|
"description": "Provides a structured process for converting a Request into a Response",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-kernel/tree/v7.2.2"
|
"source": "https://github.com/symfony/http-kernel/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7670,20 +7672,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-31T14:59:40+00:00"
|
"time": "2025-01-29T07:40:13+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mailer",
|
"name": "symfony/mailer",
|
||||||
"version": "v7.2.0",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/mailer.git",
|
"url": "https://github.com/symfony/mailer.git",
|
||||||
"reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc"
|
"reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc",
|
"url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3",
|
||||||
"reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc",
|
"reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7734,7 +7736,7 @@
|
|||||||
"description": "Helps sending emails",
|
"description": "Helps sending emails",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/mailer/tree/v7.2.0"
|
"source": "https://github.com/symfony/mailer/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7750,7 +7752,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-11-25T15:21:05+00:00"
|
"time": "2025-01-27T11:08:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mailgun-mailer",
|
"name": "symfony/mailgun-mailer",
|
||||||
@@ -7823,16 +7825,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mime",
|
"name": "symfony/mime",
|
||||||
"version": "v7.2.1",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/mime.git",
|
"url": "https://github.com/symfony/mime.git",
|
||||||
"reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283"
|
"reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/mime/zipball/7f9617fcf15cb61be30f8b252695ed5e2bfac283",
|
"url": "https://api.github.com/repos/symfony/mime/zipball/2fc3b4bd67e4747e45195bc4c98bea4628476204",
|
||||||
"reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283",
|
"reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7887,7 +7889,7 @@
|
|||||||
"mime-type"
|
"mime-type"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/mime/tree/v7.2.1"
|
"source": "https://github.com/symfony/mime/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7903,7 +7905,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-07T08:50:44+00:00"
|
"time": "2025-01-27T11:08:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/options-resolver",
|
"name": "symfony/options-resolver",
|
||||||
@@ -8830,16 +8832,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/routing",
|
"name": "symfony/routing",
|
||||||
"version": "v7.2.0",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/routing.git",
|
"url": "https://github.com/symfony/routing.git",
|
||||||
"reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e"
|
"reference": "ee9a67edc6baa33e5fae662f94f91fd262930996"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e",
|
"url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996",
|
||||||
"reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e",
|
"reference": "ee9a67edc6baa33e5fae662f94f91fd262930996",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -8891,7 +8893,7 @@
|
|||||||
"url"
|
"url"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/routing/tree/v7.2.0"
|
"source": "https://github.com/symfony/routing/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -8907,7 +8909,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-11-25T11:08:51+00:00"
|
"time": "2025-01-17T10:56:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/service-contracts",
|
"name": "symfony/service-contracts",
|
||||||
@@ -9328,16 +9330,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/var-dumper",
|
"name": "symfony/var-dumper",
|
||||||
"version": "v7.2.0",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/var-dumper.git",
|
"url": "https://github.com/symfony/var-dumper.git",
|
||||||
"reference": "c6a22929407dec8765d6e2b6ff85b800b245879c"
|
"reference": "82b478c69745d8878eb60f9a049a4d584996f73a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c",
|
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a",
|
||||||
"reference": "c6a22929407dec8765d6e2b6ff85b800b245879c",
|
"reference": "82b478c69745d8878eb60f9a049a4d584996f73a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -9391,7 +9393,7 @@
|
|||||||
"dump"
|
"dump"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/var-dumper/tree/v7.2.0"
|
"source": "https://github.com/symfony/var-dumper/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9407,7 +9409,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-11-08T15:48:14+00:00"
|
"time": "2025-01-17T11:39:41+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/var-exporter",
|
"name": "symfony/var-exporter",
|
||||||
@@ -9681,16 +9683,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/twig",
|
"name": "twig/twig",
|
||||||
"version": "v3.18.0",
|
"version": "v3.19.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/Twig.git",
|
"url": "https://github.com/twigphp/Twig.git",
|
||||||
"reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50"
|
"reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
|
"url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e",
|
||||||
"reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
|
"reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -9745,7 +9747,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/twigphp/Twig/issues",
|
"issues": "https://github.com/twigphp/Twig/issues",
|
||||||
"source": "https://github.com/twigphp/Twig/tree/v3.18.0"
|
"source": "https://github.com/twigphp/Twig/tree/v3.19.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9757,7 +9759,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-12-29T10:51:50+00:00"
|
"time": "2025-01-29T07:06:14+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "verifiedjoseph/ntfy-php-library",
|
"name": "verifiedjoseph/ntfy-php-library",
|
||||||
@@ -11342,16 +11344,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan",
|
"name": "phpstan/phpstan",
|
||||||
"version": "2.1.1",
|
"version": "2.1.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan.git",
|
"url": "https://github.com/phpstan/phpstan.git",
|
||||||
"reference": "cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7"
|
"reference": "7d08f569e582ade182a375c366cbd896eccadd3a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7",
|
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/7d08f569e582ade182a375c366cbd896eccadd3a",
|
||||||
"reference": "cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7",
|
"reference": "7d08f569e582ade182a375c366cbd896eccadd3a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11396,7 +11398,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-01-05T16:43:48+00:00"
|
"time": "2025-01-21T14:54:06+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-deprecation-rules",
|
"name": "phpstan/phpstan-deprecation-rules",
|
||||||
@@ -11447,16 +11449,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-strict-rules",
|
"name": "phpstan/phpstan-strict-rules",
|
||||||
"version": "2.0.2",
|
"version": "2.0.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan-strict-rules.git",
|
"url": "https://github.com/phpstan/phpstan-strict-rules.git",
|
||||||
"reference": "02277ce4b0dd03d74f15282064f8f027d1dec9cc"
|
"reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/02277ce4b0dd03d74f15282064f8f027d1dec9cc",
|
"url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/8b88b5f818bfa301e0c99154ab622dace071c3ba",
|
||||||
"reference": "02277ce4b0dd03d74f15282064f8f027d1dec9cc",
|
"reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11489,9 +11491,9 @@
|
|||||||
"description": "Extra strict and opinionated rules for PHPStan",
|
"description": "Extra strict and opinionated rules for PHPStan",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
|
"issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
|
||||||
"source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.2"
|
"source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.3"
|
||||||
},
|
},
|
||||||
"time": "2025-01-19T13:03:11+00:00"
|
"time": "2025-01-21T10:52:14+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpunit/php-code-coverage",
|
||||||
@@ -11818,16 +11820,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "11.5.3",
|
"version": "11.5.6",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "30e319e578a7b5da3543073e30002bf82042f701"
|
"reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/30e319e578a7b5da3543073e30002bf82042f701",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c3ae14c90f244cdda95028c3e469028e8d1c02c",
|
||||||
"reference": "30e319e578a7b5da3543073e30002bf82042f701",
|
"reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11899,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.3"
|
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.6"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -11915,7 +11917,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-01-13T09:36:00+00:00"
|
"time": "2025-01-31T07:03:30+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/cli-parser",
|
"name": "sebastian/cli-parser",
|
||||||
|
@@ -81,7 +81,7 @@ return [
|
|||||||
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
||||||
// see cer.php for exchange rates feature flag.
|
// see cer.php for exchange rates feature flag.
|
||||||
],
|
],
|
||||||
'version' => '6.2.0-alpha.2',
|
'version' => '6.2.0',
|
||||||
'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,
|
||||||
|
|
||||||
|
428
package-lock.json
generated
428
package-lock.json
generated
@@ -89,22 +89,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/core": {
|
"node_modules/@babel/core": {
|
||||||
"version": "7.26.0",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
|
||||||
"integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
|
"integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
|
||||||
"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.0",
|
"@babel/code-frame": "^7.26.2",
|
||||||
"@babel/generator": "^7.26.0",
|
"@babel/generator": "^7.26.5",
|
||||||
"@babel/helper-compilation-targets": "^7.25.9",
|
"@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.0",
|
"@babel/helpers": "^7.26.7",
|
||||||
"@babel/parser": "^7.26.0",
|
"@babel/parser": "^7.26.7",
|
||||||
"@babel/template": "^7.25.9",
|
"@babel/template": "^7.25.9",
|
||||||
"@babel/traverse": "^7.25.9",
|
"@babel/traverse": "^7.26.7",
|
||||||
"@babel/types": "^7.26.0",
|
"@babel/types": "^7.26.7",
|
||||||
"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",
|
||||||
@@ -428,27 +428,27 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helpers": {
|
"node_modules/@babel/helpers": {
|
||||||
"version": "7.26.0",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
|
||||||
"integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
|
"integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/template": "^7.25.9",
|
"@babel/template": "^7.25.9",
|
||||||
"@babel/types": "^7.26.0"
|
"@babel/types": "^7.26.7"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/parser": {
|
"node_modules/@babel/parser": {
|
||||||
"version": "7.26.5",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
|
||||||
"integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==",
|
"integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/types": "^7.26.5"
|
"@babel/types": "^7.26.7"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"parser": "bin/babel-parser.js"
|
"parser": "bin/babel-parser.js"
|
||||||
@@ -1436,13 +1436,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-typeof-symbol": {
|
"node_modules/@babel/plugin-transform-typeof-symbol": {
|
||||||
"version": "7.25.9",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz",
|
||||||
"integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
|
"integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==",
|
||||||
"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,15 +1519,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/preset-env": {
|
"node_modules/@babel/preset-env": {
|
||||||
"version": "7.26.0",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz",
|
||||||
"integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==",
|
"integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/compat-data": "^7.26.0",
|
"@babel/compat-data": "^7.26.5",
|
||||||
"@babel/helper-compilation-targets": "^7.25.9",
|
"@babel/helper-compilation-targets": "^7.26.5",
|
||||||
"@babel/helper-plugin-utils": "^7.25.9",
|
"@babel/helper-plugin-utils": "^7.26.5",
|
||||||
"@babel/helper-validator-option": "^7.25.9",
|
"@babel/helper-validator-option": "^7.25.9",
|
||||||
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
|
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
|
||||||
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
|
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
|
||||||
@@ -1541,7 +1541,7 @@
|
|||||||
"@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.25.9",
|
||||||
"@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.25.9",
|
"@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",
|
||||||
"@babel/plugin-transform-class-properties": "^7.25.9",
|
"@babel/plugin-transform-class-properties": "^7.25.9",
|
||||||
"@babel/plugin-transform-class-static-block": "^7.26.0",
|
"@babel/plugin-transform-class-static-block": "^7.26.0",
|
||||||
@@ -1552,7 +1552,7 @@
|
|||||||
"@babel/plugin-transform-duplicate-keys": "^7.25.9",
|
"@babel/plugin-transform-duplicate-keys": "^7.25.9",
|
||||||
"@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
|
"@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
|
||||||
"@babel/plugin-transform-dynamic-import": "^7.25.9",
|
"@babel/plugin-transform-dynamic-import": "^7.25.9",
|
||||||
"@babel/plugin-transform-exponentiation-operator": "^7.25.9",
|
"@babel/plugin-transform-exponentiation-operator": "^7.26.3",
|
||||||
"@babel/plugin-transform-export-namespace-from": "^7.25.9",
|
"@babel/plugin-transform-export-namespace-from": "^7.25.9",
|
||||||
"@babel/plugin-transform-for-of": "^7.25.9",
|
"@babel/plugin-transform-for-of": "^7.25.9",
|
||||||
"@babel/plugin-transform-function-name": "^7.25.9",
|
"@babel/plugin-transform-function-name": "^7.25.9",
|
||||||
@@ -1561,12 +1561,12 @@
|
|||||||
"@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
|
"@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
|
||||||
"@babel/plugin-transform-member-expression-literals": "^7.25.9",
|
"@babel/plugin-transform-member-expression-literals": "^7.25.9",
|
||||||
"@babel/plugin-transform-modules-amd": "^7.25.9",
|
"@babel/plugin-transform-modules-amd": "^7.25.9",
|
||||||
"@babel/plugin-transform-modules-commonjs": "^7.25.9",
|
"@babel/plugin-transform-modules-commonjs": "^7.26.3",
|
||||||
"@babel/plugin-transform-modules-systemjs": "^7.25.9",
|
"@babel/plugin-transform-modules-systemjs": "^7.25.9",
|
||||||
"@babel/plugin-transform-modules-umd": "^7.25.9",
|
"@babel/plugin-transform-modules-umd": "^7.25.9",
|
||||||
"@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
|
"@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
|
||||||
"@babel/plugin-transform-new-target": "^7.25.9",
|
"@babel/plugin-transform-new-target": "^7.25.9",
|
||||||
"@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9",
|
"@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6",
|
||||||
"@babel/plugin-transform-numeric-separator": "^7.25.9",
|
"@babel/plugin-transform-numeric-separator": "^7.25.9",
|
||||||
"@babel/plugin-transform-object-rest-spread": "^7.25.9",
|
"@babel/plugin-transform-object-rest-spread": "^7.25.9",
|
||||||
"@babel/plugin-transform-object-super": "^7.25.9",
|
"@babel/plugin-transform-object-super": "^7.25.9",
|
||||||
@@ -1583,7 +1583,7 @@
|
|||||||
"@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.25.9",
|
||||||
"@babel/plugin-transform-typeof-symbol": "^7.25.9",
|
"@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",
|
||||||
"@babel/plugin-transform-unicode-regex": "^7.25.9",
|
"@babel/plugin-transform-unicode-regex": "^7.25.9",
|
||||||
@@ -1628,9 +1628,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime": {
|
"node_modules/@babel/runtime": {
|
||||||
"version": "7.26.0",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz",
|
||||||
"integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
|
"integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"regenerator-runtime": "^0.14.0"
|
"regenerator-runtime": "^0.14.0"
|
||||||
@@ -1655,17 +1655,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/traverse": {
|
"node_modules/@babel/traverse": {
|
||||||
"version": "7.26.5",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
|
||||||
"integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==",
|
"integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
|
||||||
"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.5",
|
||||||
"@babel/parser": "^7.26.5",
|
"@babel/parser": "^7.26.7",
|
||||||
"@babel/template": "^7.25.9",
|
"@babel/template": "^7.25.9",
|
||||||
"@babel/types": "^7.26.5",
|
"@babel/types": "^7.26.7",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"globals": "^11.1.0"
|
"globals": "^11.1.0"
|
||||||
},
|
},
|
||||||
@@ -1674,9 +1674,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/types": {
|
"node_modules/@babel/types": {
|
||||||
"version": "7.26.5",
|
"version": "7.26.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
|
||||||
"integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==",
|
"integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -2271,9 +2271,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher": {
|
"node_modules/@parcel/watcher": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
|
||||||
"integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
|
"integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -2292,25 +2292,25 @@
|
|||||||
"url": "https://opencollective.com/parcel"
|
"url": "https://opencollective.com/parcel"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@parcel/watcher-android-arm64": "2.5.0",
|
"@parcel/watcher-android-arm64": "2.5.1",
|
||||||
"@parcel/watcher-darwin-arm64": "2.5.0",
|
"@parcel/watcher-darwin-arm64": "2.5.1",
|
||||||
"@parcel/watcher-darwin-x64": "2.5.0",
|
"@parcel/watcher-darwin-x64": "2.5.1",
|
||||||
"@parcel/watcher-freebsd-x64": "2.5.0",
|
"@parcel/watcher-freebsd-x64": "2.5.1",
|
||||||
"@parcel/watcher-linux-arm-glibc": "2.5.0",
|
"@parcel/watcher-linux-arm-glibc": "2.5.1",
|
||||||
"@parcel/watcher-linux-arm-musl": "2.5.0",
|
"@parcel/watcher-linux-arm-musl": "2.5.1",
|
||||||
"@parcel/watcher-linux-arm64-glibc": "2.5.0",
|
"@parcel/watcher-linux-arm64-glibc": "2.5.1",
|
||||||
"@parcel/watcher-linux-arm64-musl": "2.5.0",
|
"@parcel/watcher-linux-arm64-musl": "2.5.1",
|
||||||
"@parcel/watcher-linux-x64-glibc": "2.5.0",
|
"@parcel/watcher-linux-x64-glibc": "2.5.1",
|
||||||
"@parcel/watcher-linux-x64-musl": "2.5.0",
|
"@parcel/watcher-linux-x64-musl": "2.5.1",
|
||||||
"@parcel/watcher-win32-arm64": "2.5.0",
|
"@parcel/watcher-win32-arm64": "2.5.1",
|
||||||
"@parcel/watcher-win32-ia32": "2.5.0",
|
"@parcel/watcher-win32-ia32": "2.5.1",
|
||||||
"@parcel/watcher-win32-x64": "2.5.0"
|
"@parcel/watcher-win32-x64": "2.5.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-android-arm64": {
|
"node_modules/@parcel/watcher-android-arm64": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
|
||||||
"integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
|
"integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2329,9 +2329,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-darwin-arm64": {
|
"node_modules/@parcel/watcher-darwin-arm64": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
|
||||||
"integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
|
"integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2350,9 +2350,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-darwin-x64": {
|
"node_modules/@parcel/watcher-darwin-x64": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
|
||||||
"integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
|
"integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2371,9 +2371,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-freebsd-x64": {
|
"node_modules/@parcel/watcher-freebsd-x64": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
|
||||||
"integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
|
"integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2392,9 +2392,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-linux-arm-glibc": {
|
"node_modules/@parcel/watcher-linux-arm-glibc": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
|
||||||
"integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
|
"integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2413,9 +2413,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-linux-arm-musl": {
|
"node_modules/@parcel/watcher-linux-arm-musl": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
|
||||||
"integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
|
"integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2434,9 +2434,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-linux-arm64-glibc": {
|
"node_modules/@parcel/watcher-linux-arm64-glibc": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
|
||||||
"integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
|
"integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2455,9 +2455,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-linux-arm64-musl": {
|
"node_modules/@parcel/watcher-linux-arm64-musl": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
|
||||||
"integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
|
"integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2476,9 +2476,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-linux-x64-glibc": {
|
"node_modules/@parcel/watcher-linux-x64-glibc": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
|
||||||
"integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
|
"integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2497,9 +2497,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-linux-x64-musl": {
|
"node_modules/@parcel/watcher-linux-x64-musl": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
|
||||||
"integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
|
"integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2518,9 +2518,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-win32-arm64": {
|
"node_modules/@parcel/watcher-win32-arm64": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
|
||||||
"integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
|
"integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2539,9 +2539,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-win32-ia32": {
|
"node_modules/@parcel/watcher-win32-ia32": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
|
||||||
"integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
|
"integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
@@ -2560,9 +2560,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@parcel/watcher-win32-x64": {
|
"node_modules/@parcel/watcher-win32-x64": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
|
||||||
"integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
|
"integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2591,9 +2591,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz",
|
||||||
"integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==",
|
"integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2605,9 +2605,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz",
|
||||||
"integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==",
|
"integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2619,9 +2619,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz",
|
||||||
"integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==",
|
"integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2633,9 +2633,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz",
|
||||||
"integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==",
|
"integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2647,9 +2647,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-freebsd-arm64": {
|
"node_modules/@rollup/rollup-freebsd-arm64": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz",
|
||||||
"integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==",
|
"integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2661,9 +2661,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-freebsd-x64": {
|
"node_modules/@rollup/rollup-freebsd-x64": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz",
|
||||||
"integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==",
|
"integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2675,9 +2675,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz",
|
||||||
"integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==",
|
"integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2689,9 +2689,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz",
|
||||||
"integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==",
|
"integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2703,9 +2703,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz",
|
||||||
"integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==",
|
"integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2717,9 +2717,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz",
|
||||||
"integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==",
|
"integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2731,9 +2731,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz",
|
||||||
"integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==",
|
"integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"loong64"
|
"loong64"
|
||||||
],
|
],
|
||||||
@@ -2745,9 +2745,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz",
|
||||||
"integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==",
|
"integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ppc64"
|
"ppc64"
|
||||||
],
|
],
|
||||||
@@ -2759,9 +2759,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz",
|
||||||
"integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==",
|
"integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
@@ -2773,9 +2773,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz",
|
||||||
"integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==",
|
"integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"s390x"
|
"s390x"
|
||||||
],
|
],
|
||||||
@@ -2787,9 +2787,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz",
|
||||||
"integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==",
|
"integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2801,9 +2801,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz",
|
||||||
"integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==",
|
"integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2815,9 +2815,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz",
|
||||||
"integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==",
|
"integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2829,9 +2829,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz",
|
||||||
"integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==",
|
"integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
@@ -2843,9 +2843,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz",
|
||||||
"integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==",
|
"integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -3007,9 +3007,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/express-serve-static-core": {
|
"node_modules/@types/express-serve-static-core": {
|
||||||
"version": "5.0.5",
|
"version": "5.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz",
|
||||||
"integrity": "sha512-GLZPrd9ckqEBFMcVM/qRFAP0Hg3qiVEojgEFsx/N/zKXsBzbGF6z5FBDpZ0+Xhp1xr+qRZYjfGr1cWHB9oFHSA==",
|
"integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -3133,9 +3133,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "22.10.7",
|
"version": "22.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
|
||||||
"integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==",
|
"integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -3231,9 +3231,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/ws": {
|
"node_modules/@types/ws": {
|
||||||
"version": "8.5.13",
|
"version": "8.5.14",
|
||||||
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
|
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz",
|
||||||
"integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
|
"integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -4448,9 +4448,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001695",
|
"version": "1.0.30001696",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
|
||||||
"integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==",
|
"integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5663,9 +5663,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.83",
|
"version": "1.5.90",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz",
|
||||||
"integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==",
|
"integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@@ -6105,9 +6105,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/fast-uri": {
|
"node_modules/fast-uri": {
|
||||||
"version": "3.0.5",
|
"version": "3.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
|
||||||
"integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==",
|
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6132,9 +6132,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fastq": {
|
"node_modules/fastq": {
|
||||||
"version": "1.18.0",
|
"version": "1.19.0",
|
||||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
|
||||||
"integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
|
"integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -6974,9 +6974,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/i18next": {
|
"node_modules/i18next": {
|
||||||
"version": "24.2.1",
|
"version": "24.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.2.tgz",
|
||||||
"integrity": "sha512-Q2wC1TjWcSikn1VAJg13UGIjc+okpFxQTxjVAymOnSA3RpttBQNMPf2ovcgoFVsV4QNxTfNZMAxorXZXsk4fBA==",
|
"integrity": "sha512-NE6i86lBCKRYZa5TaUDkU5S4HFgLIEJRLr3Whf2psgaxBleQ2LC1YW1Vc+SCgkAW7VEzndT6al6+CzegSUHcTQ==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "individual",
|
"type": "individual",
|
||||||
@@ -7014,9 +7014,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/i18next-http-backend": {
|
"node_modules/i18next-http-backend": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz",
|
||||||
"integrity": "sha512-XT2lYSkbAtDE55c6m7CtKxxrsfuRQO3rUfHzj8ZyRtY9CkIX3aRGwXGTkUhpGWce+J8n7sfu3J0f2wTzo7Lw0A==",
|
"integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cross-fetch": "4.0.0"
|
"cross-fetch": "4.0.0"
|
||||||
@@ -7711,9 +7711,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/laravel-vite-plugin": {
|
"node_modules/laravel-vite-plugin": {
|
||||||
"version": "1.1.1",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz",
|
||||||
"integrity": "sha512-HMZXpoSs1OR+7Lw1+g4Iy/s3HF3Ldl8KxxYT2Ot8pEB4XB/QRuZeWgDYJdu552UN03YRSRNK84CLC9NzYRtncA==",
|
"integrity": "sha512-R0pJ+IcTVeqEMoKz/B2Ij57QVq3sFTABiFmb06gAwFdivbOgsUtuhX6N2MGLEArajrS3U5JbberzwOe7uXHMHQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -9987,9 +9987,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.31.0",
|
"version": "4.32.1",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz",
|
||||||
"integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==",
|
"integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -10003,25 +10003,25 @@
|
|||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.31.0",
|
"@rollup/rollup-android-arm-eabi": "4.32.1",
|
||||||
"@rollup/rollup-android-arm64": "4.31.0",
|
"@rollup/rollup-android-arm64": "4.32.1",
|
||||||
"@rollup/rollup-darwin-arm64": "4.31.0",
|
"@rollup/rollup-darwin-arm64": "4.32.1",
|
||||||
"@rollup/rollup-darwin-x64": "4.31.0",
|
"@rollup/rollup-darwin-x64": "4.32.1",
|
||||||
"@rollup/rollup-freebsd-arm64": "4.31.0",
|
"@rollup/rollup-freebsd-arm64": "4.32.1",
|
||||||
"@rollup/rollup-freebsd-x64": "4.31.0",
|
"@rollup/rollup-freebsd-x64": "4.32.1",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.31.0",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.32.1",
|
||||||
"@rollup/rollup-linux-arm-musleabihf": "4.31.0",
|
"@rollup/rollup-linux-arm-musleabihf": "4.32.1",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.31.0",
|
"@rollup/rollup-linux-arm64-gnu": "4.32.1",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.31.0",
|
"@rollup/rollup-linux-arm64-musl": "4.32.1",
|
||||||
"@rollup/rollup-linux-loongarch64-gnu": "4.31.0",
|
"@rollup/rollup-linux-loongarch64-gnu": "4.32.1",
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.31.0",
|
"@rollup/rollup-linux-powerpc64le-gnu": "4.32.1",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.31.0",
|
"@rollup/rollup-linux-riscv64-gnu": "4.32.1",
|
||||||
"@rollup/rollup-linux-s390x-gnu": "4.31.0",
|
"@rollup/rollup-linux-s390x-gnu": "4.32.1",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.31.0",
|
"@rollup/rollup-linux-x64-gnu": "4.32.1",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.31.0",
|
"@rollup/rollup-linux-x64-musl": "4.32.1",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.31.0",
|
"@rollup/rollup-win32-arm64-msvc": "4.32.1",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.31.0",
|
"@rollup/rollup-win32-ia32-msvc": "4.32.1",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.31.0",
|
"@rollup/rollup-win32-x64-msvc": "4.32.1",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -10168,9 +10168,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/semver": {
|
"node_modules/semver": {
|
||||||
"version": "7.6.3",
|
"version": "7.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz",
|
||||||
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
|
"integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -11297,9 +11297,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "6.0.7",
|
"version": "6.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz",
|
||||||
"integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==",
|
"integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@@ -68,7 +68,7 @@ export default {
|
|||||||
this.downloadCurrencies(1);
|
this.downloadCurrencies(1);
|
||||||
},
|
},
|
||||||
downloadCurrencies: function (page) {
|
downloadCurrencies: function (page) {
|
||||||
axios.get("./api/v2/currencies?enabled=1&page=" + page).then((response) => {
|
axios.get("./api/v1/currencies?enabled=1&page=" + page).then((response) => {
|
||||||
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];
|
||||||
|
@@ -183,7 +183,7 @@ export default {
|
|||||||
if(e) e.preventDefault();
|
if(e) e.preventDefault();
|
||||||
this.posting = true;
|
this.posting = true;
|
||||||
|
|
||||||
axios.post("./api/v2/exchange-rates", {
|
axios.post("./api/v1/exchange-rates", {
|
||||||
from: this.from_code,
|
from: this.from_code,
|
||||||
to: this.to_code,
|
to: this.to_code,
|
||||||
rate: this.newRate,
|
rate: this.newRate,
|
||||||
@@ -214,7 +214,7 @@ export default {
|
|||||||
// console.log('Rate is ' + this.rates[index].rate);
|
// console.log('Rate is ' + this.rates[index].rate);
|
||||||
// console.log('ID is ' + this.rates[index].rate_id);
|
// console.log('ID is ' + this.rates[index].rate_id);
|
||||||
this.updating = true;
|
this.updating = true;
|
||||||
axios.put("./api/v2/exchange-rates/" + this.rates[index].rate_id, {rate: this.rates[index].rate})
|
axios.put("./api/v1/exchange-rates/" + this.rates[index].rate_id, {rate: this.rates[index].rate})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.updating = false;
|
this.updating = false;
|
||||||
});
|
});
|
||||||
@@ -224,7 +224,7 @@ export default {
|
|||||||
// console.log('Inverse is ' + this.rates[index].inverse);
|
// console.log('Inverse is ' + this.rates[index].inverse);
|
||||||
// console.log('Inverse ID is ' + this.rates[index].inverse_id);
|
// console.log('Inverse ID is ' + this.rates[index].inverse_id);
|
||||||
this.updating = true;
|
this.updating = true;
|
||||||
axios.put("./api/v2/exchange-rates/" + this.rates[index].inverse_id, {rate: this.rates[index].inverse})
|
axios.put("./api/v1/exchange-rates/" + this.rates[index].inverse_id, {rate: this.rates[index].inverse})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.updating = false;
|
this.updating = false;
|
||||||
});
|
});
|
||||||
@@ -239,9 +239,9 @@ export default {
|
|||||||
// console.log(parts);
|
// console.log(parts);
|
||||||
|
|
||||||
// delete A to B
|
// delete A to B
|
||||||
axios.delete("./api/v2/exchange-rates/rates/" + parts.from + '/' + parts.to + '?date=' + format(parts.date, 'yyyy-MM-dd'));
|
axios.delete("./api/v1/exchange-rates/rates/" + parts.from + '/' + parts.to + '?date=' + format(parts.date, 'yyyy-MM-dd'));
|
||||||
// delete B to A.
|
// delete B to A.
|
||||||
axios.delete("./api/v2/exchange-rates/rates/" + parts.to + '/' + parts.from + '?date=' + format(parts.date, 'yyyy-MM-dd'));
|
axios.delete("./api/v1/exchange-rates/rates/" + parts.to + '/' + parts.from + '?date=' + format(parts.date, 'yyyy-MM-dd'));
|
||||||
|
|
||||||
this.rates.splice(index, 1);
|
this.rates.splice(index, 1);
|
||||||
},
|
},
|
||||||
@@ -263,14 +263,14 @@ export default {
|
|||||||
},
|
},
|
||||||
downloadCurrencies: function () {
|
downloadCurrencies: function () {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
axios.get("./api/v2/currencies/" + this.from_code).then((response) => {
|
axios.get("./api/v1/currencies/" + this.from_code).then((response) => {
|
||||||
this.from = {
|
this.from = {
|
||||||
id: response.data.data.id,
|
id: response.data.data.id,
|
||||||
code: response.data.data.attributes.code,
|
code: response.data.data.attributes.code,
|
||||||
name: response.data.data.attributes.name,
|
name: response.data.data.attributes.name,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
axios.get("./api/v2/currencies/" + this.to_code).then((response) => {
|
axios.get("./api/v1/currencies/" + this.to_code).then((response) => {
|
||||||
// console.log(response.data.data);
|
// console.log(response.data.data);
|
||||||
this.to = {
|
this.to = {
|
||||||
id: response.data.data.id,
|
id: response.data.data.id,
|
||||||
@@ -283,7 +283,7 @@ export default {
|
|||||||
this.tempRates = {};
|
this.tempRates = {};
|
||||||
this.rates = [];
|
this.rates = [];
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
axios.get("./api/v2/exchange-rates/rates/" + this.from_code + '/' + this.to_code + '?page=' + page).then((response) => {
|
axios.get("./api/v1/exchange-rates/rates/" + this.from_code + '/' + this.to_code + '?page=' + page).then((response) => {
|
||||||
for (let i in response.data.data) {
|
for (let i in response.data.data) {
|
||||||
if (response.data.data.hasOwnProperty(i)) {
|
if (response.data.data.hasOwnProperty(i)) {
|
||||||
let current = response.data.data[i];
|
let current = response.data.data[i];
|
||||||
|
@@ -151,7 +151,7 @@
|
|||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Akt\u00edv",
|
"active": "Akt\u00edv",
|
||||||
"interest_date": "Kamatfizet\u00e9si id\u0151pont",
|
"interest_date": "Kamatfizet\u00e9si id\u0151pont",
|
||||||
"administration_currency": "Native currency",
|
"administration_currency": "Hazai p\u00e9nznem",
|
||||||
"title": "C\u00edm",
|
"title": "C\u00edm",
|
||||||
"date": "D\u00e1tum",
|
"date": "D\u00e1tum",
|
||||||
"book_date": "K\u00f6nyvel\u00e9s d\u00e1tuma",
|
"book_date": "K\u00f6nyvel\u00e9s d\u00e1tuma",
|
||||||
@@ -161,22 +161,22 @@
|
|||||||
"payment_date": "Fizet\u00e9s d\u00e1tuma",
|
"payment_date": "Fizet\u00e9s d\u00e1tuma",
|
||||||
"invoice_date": "Sz\u00e1mla d\u00e1tuma",
|
"invoice_date": "Sz\u00e1mla d\u00e1tuma",
|
||||||
"internal_reference": "Bels\u0151 hivatkoz\u00e1s",
|
"internal_reference": "Bels\u0151 hivatkoz\u00e1s",
|
||||||
"webhook_response": "Response",
|
"webhook_response": "V\u00e1lasz",
|
||||||
"webhook_trigger": "Trigger",
|
"webhook_trigger": "Esem\u00e9nyind\u00edt\u00f3",
|
||||||
"webhook_delivery": "Delivery",
|
"webhook_delivery": "Sz\u00e1ll\u00edt\u00e1s",
|
||||||
"from_currency_to_currency": "{from} → {to}",
|
"from_currency_to_currency": "{from} → {to}",
|
||||||
"to_currency_from_currency": "{to} → {from}",
|
"to_currency_from_currency": "{to} → {from}",
|
||||||
"rate": "Rate"
|
"rate": "Ar\u00e1ny"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "C\u00edm",
|
"title": "C\u00edm",
|
||||||
"active": "Akt\u00edv?",
|
"active": "Akt\u00edv?",
|
||||||
"native_currency": "Native currency",
|
"native_currency": "Hazai p\u00e9nznem",
|
||||||
"trigger": "Trigger",
|
"trigger": "Esem\u00e9nyind\u00edt\u00f3",
|
||||||
"response": "Response",
|
"response": "V\u00e1lasz",
|
||||||
"delivery": "Delivery",
|
"delivery": "Sz\u00e1ll\u00edt\u00e1s",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"secret": "Secret"
|
"secret": "Titkos k\u00f3d"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"html_language": "hu",
|
"html_language": "hu",
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"firefly": {
|
"firefly": {
|
||||||
"administrations_page_title": "Finan\u010dne administracije",
|
"administrations_page_title": "Finan\u010dne administracije",
|
||||||
"administrations_index_menu": "Financial administrations",
|
"administrations_index_menu": "Finan\u010dne administracije",
|
||||||
"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 bo kmalu dobil mo\u017enost upravljanja ve\u010d finan\u010dnih administracij. Trenutno imate samo eno. Nastavite lahko naziv te administracije in njeno doma\u010do valuto. To nadome\u0161\u010da prej\u0161njo nastavitev, kjer bi nastavili svojo \"privzeto valuto\". Ta nastavitev je zdaj vezana na finan\u010dno administracijo in se lahko razlikuje glede na administracijo.",
|
||||||
"administration_currency_form_help": "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": "\u010ce spremenite doma\u010do valuto, lahko traja dolgo \u010dasa, da se stran nalo\u017ei, ker bo transakcijo morda treba pretvoriti v va\u0161o (novo) doma\u010do valuto.",
|
||||||
"administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"",
|
"administrations_page_edit_sub_title_js": "Uredi finan\u010dno administracijo \"{title}\"",
|
||||||
"table": "Tabela",
|
"table": "Tabela",
|
||||||
"welcome_back": "Kaj vse se dogaja?",
|
"welcome_back": "Kaj vse se dogaja?",
|
||||||
"flash_error": "Napaka!",
|
"flash_error": "Napaka!",
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Aktivno",
|
"active": "Aktivno",
|
||||||
"interest_date": "Datum obresti",
|
"interest_date": "Datum obresti",
|
||||||
"administration_currency": "Native currency",
|
"administration_currency": "Doma\u010da valuta",
|
||||||
"title": "Naslov",
|
"title": "Naslov",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"book_date": "Datum knji\u017eenja",
|
"book_date": "Datum knji\u017eenja",
|
||||||
@@ -171,7 +171,7 @@
|
|||||||
"list": {
|
"list": {
|
||||||
"title": "Naslov",
|
"title": "Naslov",
|
||||||
"active": "Aktiviran?",
|
"active": "Aktiviran?",
|
||||||
"native_currency": "Native currency",
|
"native_currency": "Doma\u010da valuta",
|
||||||
"trigger": "Spro\u017eilec",
|
"trigger": "Spro\u017eilec",
|
||||||
"response": "Odziv",
|
"response": "Odziv",
|
||||||
"delivery": "Dostava",
|
"delivery": "Dostava",
|
||||||
|
@@ -82,6 +82,7 @@ export default defineConfig(({command, mode, isSsrBuild, isPreview}) => {
|
|||||||
|
|
||||||
|
|
||||||
server: {
|
server: {
|
||||||
|
origin: 'http://127.0.0.1:8000',
|
||||||
watch: {
|
watch: {
|
||||||
usePolling: true,
|
usePolling: true,
|
||||||
},
|
},
|
||||||
|
@@ -1860,6 +1860,7 @@ return [
|
|||||||
'remove_budgeted_amount' => 'Remove budgeted amount in :currency',
|
'remove_budgeted_amount' => 'Remove budgeted amount in :currency',
|
||||||
|
|
||||||
// bills:
|
// bills:
|
||||||
|
'skip_help_text' => 'Use the skip field to create bi-monthly (skip = 1) or other custom intervals.',
|
||||||
'subscription' => 'Subscription',
|
'subscription' => 'Subscription',
|
||||||
'not_expected_period' => 'Not expected this period',
|
'not_expected_period' => 'Not expected this period',
|
||||||
'subscriptions_in_group' => 'Subscriptions in group "%{title}"',
|
'subscriptions_in_group' => 'Subscriptions in group "%{title}"',
|
||||||
|
@@ -25,166 +25,169 @@
|
|||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'invalid_account_type' => 'A piggy bank can only be linked to asset accounts and liabilities',
|
'invalid_account_type' => 'A piggy bank can only be linked to asset accounts and liabilities',
|
||||||
'invalid_account_currency' => 'This account does not use the currency you have selected',
|
'invalid_account_currency' => 'This account does not use the currency you have selected',
|
||||||
'current_amount_too_much' => 'The combined amount in "current_amount" cannot exceed the "target_amount".',
|
'current_amount_too_much' => 'The combined amount in "current_amount" cannot exceed the "target_amount".',
|
||||||
'filter_must_be_in' => 'Filter ":filter" must be one of: :values',
|
'filter_must_be_in' => 'Filter ":filter" must be one of: :values',
|
||||||
'filter_not_string' => 'Filter ":filter" is expected to be a string of text',
|
'filter_not_string' => 'Filter ":filter" is expected to be a string of text',
|
||||||
'bad_api_filter' => 'This API endpoint does not support ":filter" as a filter.',
|
'bad_api_filter' => 'This API endpoint does not support ":filter" as a filter.',
|
||||||
'nog_logged_in' => 'You are not logged in.',
|
'nog_logged_in' => 'You are not logged in.',
|
||||||
'bad_type_source' => 'Firefly III can\'t determine the transaction type based on this source account.',
|
'bad_type_source' => 'Firefly III can\'t determine the transaction type based on this source account.',
|
||||||
'bad_type_destination' => 'Firefly III can\'t determine the transaction type based on this destination account.',
|
'bad_type_destination' => 'Firefly III can\'t determine the transaction type based on this destination account.',
|
||||||
'missing_where' => 'Array is missing "where"-clause',
|
'missing_where' => 'Array is missing "where"-clause',
|
||||||
'missing_update' => 'Array is missing "update"-clause',
|
'missing_update' => 'Array is missing "update"-clause',
|
||||||
'invalid_where_key' => 'JSON contains an invalid key for the "where"-clause',
|
'invalid_where_key' => 'JSON contains an invalid key for the "where"-clause',
|
||||||
'invalid_update_key' => 'JSON contains an invalid key for the "update"-clause',
|
'invalid_update_key' => 'JSON contains an invalid key for the "update"-clause',
|
||||||
'invalid_query_data' => 'There is invalid data in the %s:%s field of your query.',
|
'invalid_query_data' => 'There is invalid data in the %s:%s field of your query.',
|
||||||
'invalid_query_account_type' => 'Your query contains accounts of different types, which is not allowed.',
|
'invalid_query_account_type' => 'Your query contains accounts of different types, which is not allowed.',
|
||||||
'invalid_query_currency' => 'Your query contains accounts that have different currency settings, which is not allowed.',
|
'invalid_query_currency' => 'Your query contains accounts that have different currency settings, which is not allowed.',
|
||||||
'iban' => 'This is not a valid IBAN.',
|
'iban' => 'This is not a valid IBAN.',
|
||||||
'zero_or_more' => 'The value cannot be negative.',
|
'zero_or_more' => 'The value cannot be negative.',
|
||||||
'more_than_zero' => 'The value must be more than zero.',
|
'more_than_zero' => 'The value must be more than zero.',
|
||||||
'more_than_zero_correct' => 'The value must be zero or more.',
|
'more_than_zero_correct' => 'The value must be zero or more.',
|
||||||
'no_asset_account' => 'This is not an asset account.',
|
'no_asset_account' => 'This is not an asset account.',
|
||||||
'date_or_time' => 'The value must be a valid date or time value (ISO 8601).',
|
'date_or_time' => 'The value must be a valid date or time value (ISO 8601).',
|
||||||
'source_equals_destination' => 'The source account equals the destination account.',
|
'source_equals_destination' => 'The source account equals the destination account.',
|
||||||
'unique_account_number_for_user' => 'It looks like this account number is already in use.',
|
'unique_account_number_for_user' => 'It looks like this account number is already in use.',
|
||||||
'unique_user_group_for_user' => 'It looks like this administration title is already in use.',
|
'unique_user_group_for_user' => 'It looks like this administration title is already in use.',
|
||||||
'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
|
'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
|
||||||
'reconciled_forbidden_field' => 'This transaction is already reconciled, you cannot change the ":field"',
|
'reconciled_forbidden_field' => 'This transaction is already reconciled, you cannot change the ":field"',
|
||||||
'deleted_user' => 'Due to security constraints, you cannot register using this email address.',
|
'deleted_user' => 'Due to security constraints, you cannot register using this email address.',
|
||||||
'rule_trigger_value' => 'This value is invalid for the selected trigger.',
|
'rule_trigger_value' => 'This value is invalid for the selected trigger.',
|
||||||
'rule_action_expression' => 'Invalid expression. :error',
|
'rule_action_expression' => 'Invalid expression. :error',
|
||||||
'rule_action_value' => 'This value is invalid for the selected action.',
|
'rule_action_value' => 'This value is invalid for the selected action.',
|
||||||
'file_already_attached' => 'Uploaded file ":name" is already attached to this object.',
|
'file_already_attached' => 'Uploaded file ":name" is already attached to this object.',
|
||||||
'file_attached' => 'Successfully uploaded file ":name".',
|
'file_attached' => 'Successfully uploaded file ":name".',
|
||||||
'file_zero' => 'The file is zero bytes in size.',
|
'file_zero' => 'The file is zero bytes in size.',
|
||||||
'must_exist' => 'The ID in field :attribute does not exist in the database.',
|
'must_exist' => 'The ID in field :attribute does not exist in the database.',
|
||||||
'all_accounts_equal' => 'All accounts in this field must be equal.',
|
'all_accounts_equal' => 'All accounts in this field must be equal.',
|
||||||
'group_title_mandatory' => 'A group title is mandatory when there is more than one transaction.',
|
'group_title_mandatory' => 'A group title is mandatory when there is more than one transaction.',
|
||||||
'transaction_types_equal' => 'All splits must be of the same type.',
|
'transaction_types_equal' => 'All splits must be of the same type.',
|
||||||
'invalid_transaction_type' => 'Invalid transaction type.',
|
'invalid_transaction_type' => 'Invalid transaction type.',
|
||||||
'invalid_selection' => 'Your selection is invalid.',
|
'invalid_selection' => 'Your selection is invalid.',
|
||||||
'belongs_user' => 'This value is linked to an object that does not seem to exist.',
|
'belongs_user' => 'This value is linked to an object that does not seem to exist.',
|
||||||
'belongs_user_or_user_group' => 'This value is linked to an object that does not seem to exist in your current financial administration.',
|
'belongs_user_or_user_group' => 'This value is linked to an object that does not seem to exist in your current financial administration.',
|
||||||
'no_access_group' => 'The user has no access to this administration.',
|
'no_access_group' => 'The user has no access to this administration.',
|
||||||
'no_accepted_roles_defined' => 'No access roles have been defined for this endpoint, access denied.',
|
'no_accepted_roles_defined' => 'No access roles have been defined for this endpoint, access denied.',
|
||||||
'at_least_one_transaction' => 'Need at least one transaction.',
|
'at_least_one_transaction' => 'Need at least one transaction.',
|
||||||
'recurring_transaction_id' => 'Need at least one transaction.',
|
'recurring_transaction_id' => 'Need at least one transaction.',
|
||||||
'need_id_to_match' => 'You need to submit this entry with an ID for the API to be able to match it.',
|
'need_id_to_match' => 'You need to submit this entry with an ID for the API to be able to match it.',
|
||||||
'too_many_unmatched' => 'Too many submitted transactions cannot be matched to their respective database entries. Make sure existing entries have a valid ID.',
|
'too_many_unmatched' => 'Too many submitted transactions cannot be matched to their respective database entries. Make sure existing entries have a valid ID.',
|
||||||
'id_does_not_match' => 'Submitted ID #:id does not match expected ID. Make sure it matches or omit the field.',
|
'id_does_not_match' => 'Submitted ID #:id does not match expected ID. Make sure it matches or omit the field.',
|
||||||
'at_least_one_repetition' => 'Need at least one repetition.',
|
'at_least_one_repetition' => 'Need at least one repetition.',
|
||||||
'require_repeat_until' => 'Require either a number of repetitions, or an end date (repeat_until). Not both.',
|
'require_repeat_until' => 'Require either a number of repetitions, or an end date (repeat_until). Not both.',
|
||||||
'require_currency_info' => 'The content of this field is invalid without currency information.',
|
'require_currency_info' => 'The content of this field is invalid without currency information.',
|
||||||
'not_transfer_account' => 'This account is not an account that can be used for transfers.',
|
'not_transfer_account' => 'This account is not an account that can be used for transfers.',
|
||||||
'require_currency_amount' => 'The content of this field is invalid without foreign amount information.',
|
'require_currency_amount' => 'The content of this field is invalid without foreign amount information.',
|
||||||
'require_foreign_currency' => 'This field requires a number',
|
'require_foreign_currency' => 'This field requires a number',
|
||||||
'require_foreign_dest' => 'This field value must match the currency of the destination account.',
|
'require_foreign_dest' => 'This field value must match the currency of the destination account.',
|
||||||
'require_foreign_src' => 'This field value must match the currency of the source account.',
|
'require_foreign_src' => 'This field value must match the currency of the source account.',
|
||||||
'equal_description' => 'Transaction description should not equal global description.',
|
'equal_description' => 'Transaction description should not equal global description.',
|
||||||
'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.',
|
'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.',
|
||||||
'file_too_large' => 'File ":name" is too large.',
|
'file_too_large' => 'File ":name" is too large.',
|
||||||
'belongs_to_user' => 'The value of :attribute is unknown.',
|
'belongs_to_user' => 'The value of :attribute is unknown.',
|
||||||
'accepted' => 'The :attribute must be accepted.',
|
'accepted' => 'The :attribute must be accepted.',
|
||||||
'bic' => 'This is not a valid BIC.',
|
'bic' => 'This is not a valid BIC.',
|
||||||
'at_least_one_trigger' => 'Rule must have at least one trigger.',
|
'at_least_one_trigger' => 'Rule must have at least one trigger.',
|
||||||
'at_least_one_active_trigger' => 'Rule must have at least one active trigger.',
|
'at_least_one_active_trigger' => 'Rule must have at least one active trigger.',
|
||||||
'at_least_one_action' => 'Rule must have at least one action.',
|
'at_least_one_action' => 'Rule must have at least one action.',
|
||||||
'at_least_one_active_action' => 'Rule must have at least one active action.',
|
'at_least_one_active_action' => 'Rule must have at least one active action.',
|
||||||
'base64' => 'This is not valid base64 encoded data.',
|
'base64' => 'This is not valid base64 encoded data.',
|
||||||
'model_id_invalid' => 'The given ID seems invalid for this model.',
|
'model_id_invalid' => 'The given ID seems invalid for this model.',
|
||||||
'less' => ':attribute must be less than 10,000,000',
|
'less' => ':attribute must be less than 10,000,000',
|
||||||
'active_url' => 'The :attribute is not a valid URL.',
|
'active_url' => 'The :attribute is not a valid URL.',
|
||||||
'after' => 'The :attribute must be a date after :date.',
|
'after' => 'The :attribute must be a date after :date.',
|
||||||
'date_after' => 'The start date must be before the end date.',
|
'date_after' => 'The start date must be before the end date.',
|
||||||
'alpha' => 'The :attribute may only contain letters.',
|
'alpha' => 'The :attribute may only contain letters.',
|
||||||
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
|
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
|
||||||
'alpha_num' => 'The :attribute may only contain letters and numbers.',
|
'alpha_num' => 'The :attribute may only contain letters and numbers.',
|
||||||
'array' => 'The :attribute must be an array.',
|
'array' => 'The :attribute must be an array.',
|
||||||
'unique_for_user' => 'There already is an entry with this :attribute.',
|
'unique_for_user' => 'There already is an entry with this :attribute.',
|
||||||
'before' => 'The :attribute must be a date before :date.',
|
'before' => 'The :attribute must be a date before :date.',
|
||||||
'unique_object_for_user' => 'This name is already in use.',
|
'unique_object_for_user' => 'This name is already in use.',
|
||||||
'unique_account_for_user' => 'This account name is already in use.',
|
'unique_account_for_user' => 'This account name is already in use.',
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'between.numeric' => 'The :attribute must be between :min and :max.',
|
'between.numeric' => 'The :attribute must be between :min and :max.',
|
||||||
'between.file' => 'The :attribute must be between :min and :max kilobytes.',
|
'between.file' => 'The :attribute must be between :min and :max kilobytes.',
|
||||||
'between.string' => 'The :attribute must be between :min and :max characters.',
|
'between.string' => 'The :attribute must be between :min and :max characters.',
|
||||||
'between.array' => 'The :attribute must have between :min and :max items.',
|
'between.array' => 'The :attribute must have between :min and :max items.',
|
||||||
'boolean' => 'The :attribute field must be true or false.',
|
'boolean' => 'The :attribute field must be true or false.',
|
||||||
'confirmed' => 'The :attribute confirmation does not match.',
|
'confirmed' => 'The :attribute confirmation does not match.',
|
||||||
'date' => 'The :attribute is not a valid date.',
|
'date' => 'The :attribute is not a valid date.',
|
||||||
'date_format' => 'The :attribute does not match the format :format.',
|
'date_format' => 'The :attribute does not match the format :format.',
|
||||||
'different' => 'The :attribute and :other must be different.',
|
'different' => 'The :attribute and :other must be different.',
|
||||||
'digits' => 'The :attribute must be :digits digits.',
|
'digits' => 'The :attribute must be :digits digits.',
|
||||||
'digits_between' => 'The :attribute must be between :min and :max digits.',
|
'digits_between' => 'The :attribute must be between :min and :max digits.',
|
||||||
'email' => 'The :attribute must be a valid email address.',
|
'email' => 'The :attribute must be a valid email address.',
|
||||||
'filled' => 'The :attribute field is required.',
|
'filled' => 'The :attribute field is required.',
|
||||||
'exists' => 'The selected :attribute is invalid.',
|
'exists' => 'The selected :attribute is invalid.',
|
||||||
'image' => 'The :attribute must be an image.',
|
'image' => 'The :attribute must be an image.',
|
||||||
'in' => 'The selected :attribute is invalid.',
|
'in' => 'The selected :attribute is invalid.',
|
||||||
'integer' => 'The :attribute must be an integer.',
|
'integer' => 'The :attribute must be an integer.',
|
||||||
'ip' => 'The :attribute must be a valid IP address.',
|
'ip' => 'The :attribute must be a valid IP address.',
|
||||||
'json' => 'The :attribute must be a valid JSON string.',
|
'json' => 'The :attribute must be a valid JSON string.',
|
||||||
'max.numeric' => 'The :attribute may not be greater than :max.',
|
'max.numeric' => 'The :attribute may not be greater than :max.',
|
||||||
'max.file' => 'The :attribute may not be greater than :max kilobytes.',
|
'max.file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||||
'max.string' => 'The :attribute may not be greater than :max characters.',
|
'max.string' => 'The :attribute may not be greater than :max characters.',
|
||||||
'max.array' => 'The :attribute may not have more than :max items.',
|
'max.array' => 'The :attribute may not have more than :max items.',
|
||||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||||
'min.numeric' => 'The :attribute must be at least :min.',
|
'min.numeric' => 'The :attribute must be at least :min.',
|
||||||
'lte.numeric' => 'The :attribute must be less than or equal :value.',
|
'lte.numeric' => 'The :attribute must be less than or equal :value.',
|
||||||
'min.file' => 'The :attribute must be at least :min kilobytes.',
|
'min.file' => 'The :attribute must be at least :min kilobytes.',
|
||||||
'min.string' => 'The :attribute must be at least :min characters.',
|
'min.string' => 'The :attribute must be at least :min characters.',
|
||||||
'min.array' => 'The :attribute must have at least :min items.',
|
'min.array' => 'The :attribute must have at least :min items.',
|
||||||
'not_in' => 'The selected :attribute is invalid.',
|
'not_in' => 'The selected :attribute is invalid.',
|
||||||
'numeric' => 'The :attribute must be a number.',
|
'numeric' => 'The :attribute must be a number.',
|
||||||
'scientific_notation' => 'The :attribute cannot use the scientific notation.',
|
'scientific_notation' => 'The :attribute cannot use the scientific notation.',
|
||||||
'numeric_native' => 'The native amount must be a number.',
|
'numeric_native' => 'The native amount must be a number.',
|
||||||
'numeric_destination' => 'The destination amount must be a number.',
|
'numeric_destination' => 'The destination amount must be a number.',
|
||||||
'numeric_source' => 'The source amount must be a number.',
|
'numeric_source' => 'The source amount must be a number.',
|
||||||
'regex' => 'The :attribute format is invalid.',
|
'generic_invalid' => 'This value is invalid.',
|
||||||
'required' => 'The :attribute field is required.',
|
'transaction_type_changed' => 'If you change the type of the transaction, make sure the correct source/destination accounts are set.',
|
||||||
'required_if' => 'The :attribute field is required when :other is :value.',
|
'regex' => 'The :attribute format is invalid.',
|
||||||
'required_unless' => 'The :attribute field is required unless :other is in :values.',
|
'required' => 'The :attribute field is required.',
|
||||||
'required_with' => 'The :attribute field is required when :values is present.',
|
'required_if' => 'The :attribute field is required when :other is :value.',
|
||||||
'required_with_all' => 'The :attribute field is required when :values is present.',
|
'required_unless' => 'The :attribute field is required unless :other is in :values.',
|
||||||
'required_without' => 'The :attribute field is required when :values is not present.',
|
'required_with' => 'The :attribute field is required when :values is present.',
|
||||||
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
'required_with_all' => 'The :attribute field is required when :values is present.',
|
||||||
'same' => 'The :attribute and :other must match.',
|
'required_without' => 'The :attribute field is required when :values is not present.',
|
||||||
'size.numeric' => 'The :attribute must be :size.',
|
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
||||||
'amount_min_over_max' => 'The minimum amount cannot be larger than the maximum amount.',
|
'same' => 'The :attribute and :other must match.',
|
||||||
'size.file' => 'The :attribute must be :size kilobytes.',
|
'size.numeric' => 'The :attribute must be :size.',
|
||||||
'size.string' => 'The :attribute must be :size characters.',
|
'amount_min_over_max' => 'The minimum amount cannot be larger than the maximum amount.',
|
||||||
'size.array' => 'The :attribute must contain :size items.',
|
'size.file' => 'The :attribute must be :size kilobytes.',
|
||||||
'unique' => 'The :attribute has already been taken.',
|
'size.string' => 'The :attribute must be :size characters.',
|
||||||
'string' => 'The :attribute must be a string.',
|
'size.array' => 'The :attribute must contain :size items.',
|
||||||
'url' => 'The :attribute format is invalid.',
|
'unique' => 'The :attribute has already been taken.',
|
||||||
'timezone' => 'The :attribute must be a valid zone.',
|
'string' => 'The :attribute must be a string.',
|
||||||
'2fa_code' => 'The :attribute field is invalid.',
|
'url' => 'The :attribute format is invalid.',
|
||||||
'dimensions' => 'The :attribute has invalid image dimensions.',
|
'timezone' => 'The :attribute must be a valid zone.',
|
||||||
'distinct' => 'The :attribute field has a duplicate value.',
|
'2fa_code' => 'The :attribute field is invalid.',
|
||||||
'file' => 'The :attribute must be a file.',
|
'dimensions' => 'The :attribute has invalid image dimensions.',
|
||||||
'in_array' => 'The :attribute field does not exist in :other.',
|
'distinct' => 'The :attribute field has a duplicate value.',
|
||||||
'present' => 'The :attribute field must be present.',
|
'file' => 'The :attribute must be a file.',
|
||||||
'amount_zero' => 'The total amount cannot be zero.',
|
'in_array' => 'The :attribute field does not exist in :other.',
|
||||||
'current_target_amount' => 'The current amount must be less than the target amount.',
|
'present' => 'The :attribute field must be present.',
|
||||||
'unique_piggy_bank_for_user' => 'The name of the piggy bank must be unique.',
|
'amount_zero' => 'The total amount cannot be zero.',
|
||||||
'unique_object_group' => 'The group name must be unique',
|
'current_target_amount' => 'The current amount must be less than the target amount.',
|
||||||
'starts_with' => 'The value must start with :values.',
|
'unique_piggy_bank_for_user' => 'The name of the piggy bank must be unique.',
|
||||||
'unique_webhook' => 'You already have a webhook with this combination of URL, trigger, response and delivery.',
|
'unique_object_group' => 'The group name must be unique',
|
||||||
'unique_existing_webhook' => 'You already have another webhook with this combination of URL, trigger, response and delivery.',
|
'starts_with' => 'The value must start with :values.',
|
||||||
'same_account_type' => 'Both accounts must be of the same account type',
|
'unique_webhook' => 'You already have a webhook with this combination of URL, trigger, response and delivery.',
|
||||||
'same_account_currency' => 'Both accounts must have the same currency setting',
|
'unique_existing_webhook' => 'You already have another webhook with this combination of URL, trigger, response and delivery.',
|
||||||
|
'same_account_type' => 'Both accounts must be of the same account type',
|
||||||
|
'same_account_currency' => 'Both accounts must have the same currency setting',
|
||||||
|
'piggy_no_change_currency' => 'Because there are piggy banks linked to this account, you cannot change the currency of the account.',
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'secure_password' => 'This is not a secure password. Please try again. For more information, visit https://bit.ly/FF3-password',
|
'secure_password' => 'This is not a secure password. Please try again. For more information, visit https://bit.ly/FF3-password',
|
||||||
'valid_recurrence_rep_type' => 'Invalid repetition type for recurring transactions.',
|
'valid_recurrence_rep_type' => 'Invalid repetition type for recurring transactions.',
|
||||||
'valid_recurrence_rep_moment' => 'Invalid repetition moment for this type of repetition.',
|
'valid_recurrence_rep_moment' => 'Invalid repetition moment for this type of repetition.',
|
||||||
'invalid_account_info' => 'Invalid account information.',
|
'invalid_account_info' => 'Invalid account information.',
|
||||||
'attributes' => [
|
'attributes' => [
|
||||||
'email' => 'email address',
|
'email' => 'email address',
|
||||||
'description' => 'description',
|
'description' => 'description',
|
||||||
'amount' => 'amount',
|
'amount' => 'amount',
|
||||||
@@ -223,59 +226,59 @@ return [
|
|||||||
],
|
],
|
||||||
|
|
||||||
// validation of accounts:
|
// validation of accounts:
|
||||||
'withdrawal_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
'withdrawal_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
||||||
'withdrawal_source_bad_data' => '[a] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
'withdrawal_source_bad_data' => '[a] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
||||||
'withdrawal_dest_need_data' => '[a] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
'withdrawal_dest_need_data' => '[a] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
||||||
'withdrawal_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
'withdrawal_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
||||||
|
|
||||||
'withdrawal_dest_iban_exists' => 'This destination account IBAN is already in use by an asset account or a liability and cannot be used as a withdrawal destination.',
|
'withdrawal_dest_iban_exists' => 'This destination account IBAN is already in use by an asset account or a liability and cannot be used as a withdrawal destination.',
|
||||||
'deposit_src_iban_exists' => 'This source account IBAN is already in use by an asset account or a liability and cannot be used as a deposit source.',
|
'deposit_src_iban_exists' => 'This source account IBAN is already in use by an asset account or a liability and cannot be used as a deposit source.',
|
||||||
|
|
||||||
'reconciliation_source_bad_data' => 'Could not find a valid reconciliation account when searching for ID ":id" or name ":name".',
|
'reconciliation_source_bad_data' => 'Could not find a valid reconciliation account when searching for ID ":id" or name ":name".',
|
||||||
|
|
||||||
'generic_source_bad_data' => '[e] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
'generic_source_bad_data' => '[e] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
||||||
|
|
||||||
'deposit_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
'deposit_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
||||||
'deposit_source_bad_data' => '[b] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
'deposit_source_bad_data' => '[b] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
||||||
'deposit_dest_need_data' => '[b] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
'deposit_dest_need_data' => '[b] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
||||||
'deposit_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
'deposit_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
||||||
'deposit_dest_wrong_type' => 'The submitted destination account is not of the right type.',
|
'deposit_dest_wrong_type' => 'The submitted destination account is not of the right type.',
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'transfer_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
'transfer_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
||||||
'transfer_source_bad_data' => '[c] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
'transfer_source_bad_data' => '[c] Could not find a valid source account when searching for ID ":id" or name ":name".',
|
||||||
'transfer_dest_need_data' => '[c] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
'transfer_dest_need_data' => '[c] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
||||||
'transfer_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
'transfer_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
||||||
'need_id_in_edit' => 'Each split must have transaction_journal_id (either valid ID or 0).',
|
'need_id_in_edit' => 'Each split must have transaction_journal_id (either valid ID or 0).',
|
||||||
|
|
||||||
'ob_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
'ob_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
|
||||||
'lc_source_need_data' => 'Need to get a valid source account ID to continue.',
|
'lc_source_need_data' => 'Need to get a valid source account ID to continue.',
|
||||||
'ob_dest_need_data' => '[d] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
'ob_dest_need_data' => '[d] Need to get a valid destination account ID and/or valid destination account name to continue.',
|
||||||
'ob_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
'ob_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
|
||||||
'reconciliation_either_account' => 'To submit a reconciliation, you must submit either a source or a destination account. Not both, not neither.',
|
'reconciliation_either_account' => 'To submit a reconciliation, you must submit either a source or a destination account. Not both, not neither.',
|
||||||
|
|
||||||
'generic_invalid_source' => 'You can\'t use this account as the source account.',
|
'generic_invalid_source' => 'You can\'t use this account as the source account.',
|
||||||
'generic_invalid_destination' => 'You can\'t use this account as the destination account.',
|
'generic_invalid_destination' => 'You can\'t use this account as the destination account.',
|
||||||
|
|
||||||
'generic_no_source' => 'You must submit source account information or submit a transaction journal ID.',
|
'generic_no_source' => 'You must submit source account information or submit a transaction journal ID.',
|
||||||
'generic_no_destination' => 'You must submit destination account information or submit a transaction journal ID.',
|
'generic_no_destination' => 'You must submit destination account information or submit a transaction journal ID.',
|
||||||
|
|
||||||
'gte.numeric' => 'The :attribute must be greater than or equal to :value.',
|
'gte.numeric' => 'The :attribute must be greater than or equal to :value.',
|
||||||
'gt.numeric' => 'The :attribute must be greater than :value.',
|
'gt.numeric' => 'The :attribute must be greater than :value.',
|
||||||
'gte.file' => 'The :attribute must be greater than or equal to :value kilobytes.',
|
'gte.file' => 'The :attribute must be greater than or equal to :value kilobytes.',
|
||||||
'gte.string' => 'The :attribute must be greater than or equal to :value characters.',
|
'gte.string' => 'The :attribute must be greater than or equal to :value characters.',
|
||||||
'gte.array' => 'The :attribute must have :value items or more.',
|
'gte.array' => 'The :attribute must have :value items or more.',
|
||||||
'missing_with' => 'The :attribute cannot be combined with another field.',
|
'missing_with' => 'The :attribute cannot be combined with another field.',
|
||||||
|
|
||||||
'amount_required_for_auto_budget' => 'The amount is required.',
|
'amount_required_for_auto_budget' => 'The amount is required.',
|
||||||
'auto_budget_amount_positive' => 'The amount must be more than zero.',
|
'auto_budget_amount_positive' => 'The amount must be more than zero.',
|
||||||
|
|
||||||
'auto_budget_period_mandatory' => 'The auto budget period is a mandatory field.',
|
'auto_budget_period_mandatory' => 'The auto budget period is a mandatory field.',
|
||||||
|
|
||||||
// no access to administration:
|
// no access to administration:
|
||||||
'no_auth_user_group' => 'You have to be logged in to access this administration.',
|
'no_auth_user_group' => 'You have to be logged in to access this administration.',
|
||||||
'no_access_user_group' => 'You do not have the correct access rights for this administration.',
|
'no_access_user_group' => 'You do not have the correct access rights for this administration.',
|
||||||
'administration_owner_rename' => 'You can\'t rename your standard administration.',
|
'administration_owner_rename' => 'You can\'t rename your standard administration.',
|
||||||
'existing_mfa_code' => 'Please enter a valid code',
|
'existing_mfa_code' => 'Please enter a valid code',
|
||||||
];
|
];
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
{{ ExpandedForm.amountNoCurrency('amount_max') }}
|
{{ ExpandedForm.amountNoCurrency('amount_max') }}
|
||||||
{{ ExpandedForm.date('date',phpdate('Y-m-d')) }}
|
{{ ExpandedForm.date('date',phpdate('Y-m-d')) }}
|
||||||
{{ ExpandedForm.select('repeat_freq',periods,'monthly') }}
|
{{ ExpandedForm.select('repeat_freq',periods,'monthly') }}
|
||||||
{{ ExpandedForm.integer('skip',0) }}
|
{{ ExpandedForm.integer('skip',0, {'helpText': trans('firefly.skip_help_text')}) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
{{ ExpandedForm.amountNoCurrency('amount_max', bill.amount_max) }}
|
{{ ExpandedForm.amountNoCurrency('amount_max', bill.amount_max) }}
|
||||||
{{ ExpandedForm.date('date',bill.date.format('Y-m-d')) }}
|
{{ ExpandedForm.date('date',bill.date.format('Y-m-d')) }}
|
||||||
{{ ExpandedForm.select('repeat_freq', periods, bill.repeat_freq) }}
|
{{ ExpandedForm.select('repeat_freq', periods, bill.repeat_freq) }}
|
||||||
{{ ExpandedForm.integer('skip', bill.skip) }}
|
{{ ExpandedForm.integer('skip', bill.skip, {'helpText': trans('firefly.skip_help_text')}) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<textarea rows="30" cols="100" name="debug_info" id="debug_info"
|
<textarea rows="30" cols="100" name="debug_info" id="debug_info"
|
||||||
style="font-family:Menlo, Monaco, Consolas, monospace;font-size:8pt;">
|
style="font-family:Menlo, Monaco, Consolas, monospace;font-size:8pt;">
|
||||||
Debug information generated at {{ now }} for Firefly III version **v{{ FF_VERSION }}**.
|
Debug information generated at {{ now }} for Firefly III version **{% if not FF_IS_DEVELOP %}v{% endif %}{{ FF_VERSION }}**.
|
||||||
|
|
||||||
{{ table|escape('html') }}
|
{{ table|escape('html') }}
|
||||||
</textarea>
|
</textarea>
|
||||||
|
@@ -9,9 +9,24 @@
|
|||||||
<div class="progress">
|
<div class="progress">
|
||||||
<div class="progress-bar" role="progressbar" aria-valuenow="{{ entry.percentage }}" aria-valuemin="0" aria-valuemax="100"
|
<div class="progress-bar" role="progressbar" aria-valuenow="{{ entry.percentage }}" aria-valuemin="0" aria-valuemax="100"
|
||||||
style="width: {{ entry.percentage }}%;">
|
style="width: {{ entry.percentage }}%;">
|
||||||
{% if entry.percentage >=20 %}{{ entry.amount|formatAmountPlain }}{% endif %}
|
{% if entry.percentage >=20 %}
|
||||||
|
{% if convertToNative %}
|
||||||
|
{{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }}
|
||||||
|
({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }})
|
||||||
|
{% else %}
|
||||||
|
{{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% if entry.percentage < 20 %} {{ entry.amount|formatAmountPlain }}{% endif %}
|
{% if entry.percentage < 20 %}
|
||||||
|
|
||||||
|
{% if convertToNative %}
|
||||||
|
{{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }}
|
||||||
|
({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }})
|
||||||
|
{% else %}
|
||||||
|
{{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
{# Firefly III version #}
|
{# Firefly III version #}
|
||||||
<tr>
|
<tr>
|
||||||
<td>Firefly III</td>
|
<td>Firefly III</td>
|
||||||
<td>{% if FF_VERSION starts with 'develop' %}{{ FF_VERSION }}{% else %}{{ FF_VERSION }}{% endif %} / v{{ config('firefly.api_version') }} / {{ system.db_version }} (exp. {{ config('firefly.db_version') }})
|
<td>{% if FF_IS_DEVELOP %}<!-- .Z9JBCmw64Zkx1pQw -->{% endif %}{% if not FF_IS_DEVELOP %}v{% endif %}{{ FF_VERSION }} / <span>#</span>{{ system.db_version }} (expects <span>#</span>{{ config('firefly.db_version') }})
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{# PHP version + settings #}
|
{# PHP version + settings #}
|
||||||
@@ -83,8 +83,8 @@
|
|||||||
<td>{{ config('logging.level') }}, {{ config('logging.default') }} / {{ app.audit_log_channel }}</td>
|
<td>{{ config('logging.level') }}, {{ config('logging.default') }} / {{ app.audit_log_channel }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Cache driver</td>
|
<td>Cache driver, session driver</td>
|
||||||
<td>{{ config('cache.default') }}</td>
|
<td>{{ config('cache.default') }}, {{ config('session.driver') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Default language and locale</td>
|
<td>Default language and locale</td>
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Trusted proxies</td>
|
<td>Trusted proxies</td>
|
||||||
<td>{{ config('firefly.trusted_proxies')|escape }}</td>
|
<td><code>{{ config('firefly.trusted_proxies')|escape }}</code></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Login provider & user guard</td>
|
<td>Login provider & user guard</td>
|
||||||
@@ -114,6 +114,10 @@
|
|||||||
<td>Mailer</td>
|
<td>Mailer</td>
|
||||||
<td>{{ config('mail.default') }}</td>
|
<td>{{ config('mail.default') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Exchange rates</td>
|
||||||
|
<td>{% if config('cer.enabled') %}Enabled{% else %}Disabled{% endif %}, downloads {% if config('cer.download_enabled') %}enabled{% else %}disabled{% endif %}</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -136,6 +140,10 @@
|
|||||||
<td>User flags</td>
|
<td>User flags</td>
|
||||||
<td>{{ user.user_flags | raw }}</td>
|
<td>{{ user.user_flags | raw }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Convert to native currency?</td>
|
||||||
|
<td>{% if user.convert_to_native %}Enabled{% else %}Disabled{% endif %}</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Session start</td>
|
<td>Session start</td>
|
||||||
<td>{{ session('start') }}</td>
|
<td>{{ session('start') }}</td>
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
{{ preFilled.first_date.format('Y-m-d') }}
|
{{ preFilled.first_date.format('Y-m-d') }}
|
||||||
{{ ExpandedForm.date('first_date',null, {helpText: trans('firefly.help_first_date'), min: preFilled.first_date}) }}
|
{{ ExpandedForm.date('first_date',null, {helpText: trans('firefly.help_first_date'), min: preFilled.first_date}) }}
|
||||||
{{ ExpandedForm.select('repetition_type', [], null, {helpText: trans('firefly.change_date_other_options')}) }}
|
{{ ExpandedForm.select('repetition_type', [], null, {helpText: trans('firefly.change_date_other_options')}) }}
|
||||||
{{ ExpandedForm.integer('skip',0) }}
|
{{ ExpandedForm.integer('skip',0, {'helpText': trans('firefly.skip_help_text')}) }}
|
||||||
{{ ExpandedForm.select('weekend', weekendResponses, null, {helpText: trans('firefly.help_weekend')}) }}
|
{{ ExpandedForm.select('weekend', weekendResponses, null, {helpText: trans('firefly.help_weekend')}) }}
|
||||||
{{ ExpandedForm.select('repetition_end', repetitionEnds) }}
|
{{ ExpandedForm.select('repetition_end', repetitionEnds) }}
|
||||||
{{ ExpandedForm.date('repeat_until',null) }}
|
{{ ExpandedForm.date('repeat_until',null) }}
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
{{ ExpandedForm.text('title', array.title) }}
|
{{ ExpandedForm.text('title', array.title) }}
|
||||||
{{ ExpandedForm.date('first_date',array.first_date, {helpText: trans('firefly.help_first_date_no_past')}) }}
|
{{ ExpandedForm.date('first_date',array.first_date, {helpText: trans('firefly.help_first_date_no_past')}) }}
|
||||||
{{ ExpandedForm.select('repetition_type', [], null, {helpText: trans('firefly.change_date_other_options')}) }}
|
{{ ExpandedForm.select('repetition_type', [], null, {helpText: trans('firefly.change_date_other_options')}) }}
|
||||||
{{ ExpandedForm.integer('skip', array.repetitions[0].skip) }}
|
{{ ExpandedForm.integer('skip', array.repetitions[0].skip, {'helpText': trans('firefly.skip_help_text')}) }}
|
||||||
{{ ExpandedForm.select('weekend', weekendResponses, array.repetitions[0].weekend, {helpText: trans('firefly.help_weekend')}) }}
|
{{ ExpandedForm.select('weekend', weekendResponses, array.repetitions[0].weekend, {helpText: trans('firefly.help_weekend')}) }}
|
||||||
{{ ExpandedForm.select('repetition_end', repetitionEnds, repetitionEnd) }}
|
{{ ExpandedForm.select('repetition_end', repetitionEnds, repetitionEnd) }}
|
||||||
{{ ExpandedForm.date('repeat_until',array.repeat_until) }}
|
{{ ExpandedForm.date('repeat_until',array.repeat_until) }}
|
||||||
|
@@ -23,11 +23,14 @@
|
|||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
// Cron job API routes:
|
// Cron job API routes:
|
||||||
|
use FireflyIII\Http\Middleware\AcceptHeaders;
|
||||||
|
|
||||||
Route::group(
|
Route::group(
|
||||||
[
|
[
|
||||||
'namespace' => 'FireflyIII\Api\V1\Controllers\System',
|
'namespace' => 'FireflyIII\Api\V1\Controllers\System',
|
||||||
'prefix' => '',
|
'prefix' => '',
|
||||||
'as' => 'api.v1.cron.',
|
'as' => 'api.v1.cron.',
|
||||||
|
'middleware' => [AcceptHeaders::class],
|
||||||
],
|
],
|
||||||
static function (): void {
|
static function (): void {
|
||||||
Route::get('{cliToken}', ['uses' => 'CronController@cron', 'as' => 'index']);
|
Route::get('{cliToken}', ['uses' => 'CronController@cron', 'as' => 'index']);
|
||||||
|
@@ -22,12 +22,6 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\JsonApi\AccountController;
|
|
||||||
use LaravelJsonApi\Laravel\Facades\JsonApiRoute;
|
|
||||||
use LaravelJsonApi\Laravel\Http\Controllers\JsonApiController;
|
|
||||||
use LaravelJsonApi\Laravel\Routing\Relationships;
|
|
||||||
use LaravelJsonApi\Laravel\Routing\ResourceRegistrar;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* ____ ____ ___ .______ ______ __ __ .___________. _______ _______.
|
* ____ ____ ___ .______ ______ __ __ .___________. _______ _______.
|
||||||
@@ -105,27 +99,6 @@ Route::group(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// exchange rates
|
|
||||||
Route::group(
|
|
||||||
[
|
|
||||||
'namespace' => 'FireflyIII\Api\V2\Controllers\Model\ExchangeRate',
|
|
||||||
'prefix' => 'v2/exchange-rates',
|
|
||||||
'as' => 'api.v2.exchange-rates.',
|
|
||||||
],
|
|
||||||
static function (): void {
|
|
||||||
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
|
|
||||||
Route::get('rates/{fromCurrencyCode}/{toCurrencyCode}', ['uses' => 'ShowController@show', 'as' => 'show']);
|
|
||||||
Route::delete('rates/{fromCurrencyCode}/{toCurrencyCode}', ['uses' => 'DestroyController@destroy', 'as' => 'destroy']);
|
|
||||||
Route::put('{userGroupExchangeRate}', ['uses' => 'UpdateController@update', 'as' => 'update']);
|
|
||||||
Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']);
|
|
||||||
//
|
|
||||||
// Route::put('{userGroup}', ['uses' => 'UpdateController@update', 'as' => 'update']);
|
|
||||||
// Route::post('{userGroup}/use', ['uses' => 'UpdateController@useUserGroup', 'as' => 'use']);
|
|
||||||
// Route::put('{userGroup}/update-membership', ['uses' => 'UpdateController@updateMembership', 'as' => 'updateMembership']);
|
|
||||||
// Route::delete('{userGroup}', ['uses' => 'DestroyController@destroy', 'as' => 'destroy']);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// V2 API route for Summary boxes
|
// V2 API route for Summary boxes
|
||||||
// BASIC
|
// BASIC
|
||||||
@@ -336,6 +309,24 @@ Route::group(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// exchange rates
|
||||||
|
Route::group(
|
||||||
|
[
|
||||||
|
'namespace' => 'FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate',
|
||||||
|
'prefix' => 'v1/exchange-rates',
|
||||||
|
'as' => 'api.v1.exchange-rates.',
|
||||||
|
],
|
||||||
|
static function (): void {
|
||||||
|
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
|
||||||
|
Route::get('rates/{fromCurrencyCode}/{toCurrencyCode}', ['uses' => 'ShowController@show', 'as' => 'show']);
|
||||||
|
Route::get('{userGroupExchangeRate}', ['uses' => 'ShowController@showSingle', 'as' => 'show.single']);
|
||||||
|
Route::delete('rates/{fromCurrencyCode}/{toCurrencyCode}', ['uses' => 'DestroyController@destroy', 'as' => 'destroy']);
|
||||||
|
Route::delete('{userGroupExchangeRate}', ['uses' => 'DestroyController@destroySingle', 'as' => 'destroy.single']);
|
||||||
|
Route::put('{userGroupExchangeRate}', ['uses' => 'UpdateController@update', 'as' => 'update']);
|
||||||
|
Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// CHART ROUTES.
|
// CHART ROUTES.
|
||||||
// Chart accounts
|
// Chart accounts
|
||||||
Route::group(
|
Route::group(
|
||||||
@@ -804,6 +795,7 @@ Route::group(
|
|||||||
Route::get('', ['uses' => 'ShowController@index', 'as' => 'index']);
|
Route::get('', ['uses' => 'ShowController@index', 'as' => 'index']);
|
||||||
Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']);
|
Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']);
|
||||||
Route::get('default', ['uses' => 'ShowController@showDefault', 'as' => 'show.default']);
|
Route::get('default', ['uses' => 'ShowController@showDefault', 'as' => 'show.default']);
|
||||||
|
Route::get('native', ['uses' => 'ShowController@showDefault', 'as' => 'show.native']);
|
||||||
Route::get('{currency_code}', ['uses' => 'ShowController@show', 'as' => 'show']);
|
Route::get('{currency_code}', ['uses' => 'ShowController@show', 'as' => 'show']);
|
||||||
Route::put('{currency_code}', ['uses' => 'UpdateController@update', 'as' => 'update']);
|
Route::put('{currency_code}', ['uses' => 'UpdateController@update', 'as' => 'update']);
|
||||||
Route::delete('{currency_code}', ['uses' => 'DestroyController@destroy', 'as' => 'delete']);
|
Route::delete('{currency_code}', ['uses' => 'DestroyController@destroy', 'as' => 'delete']);
|
||||||
|
Reference in New Issue
Block a user