mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-08-29 17:25:20 +00:00
Compare commits
15 Commits
main
...
develop-20
Author | SHA1 | Date | |
---|---|---|---|
|
b905efd0aa | ||
|
93085599b7 | ||
|
8a8bbaf827 | ||
|
96a66b894a | ||
|
1ba641c279 | ||
|
6c5ddfcb8a | ||
|
65ddc246dc | ||
|
e4aff5ff4c | ||
|
6ddda13c3a | ||
|
46219c4678 | ||
|
a1595d0647 | ||
|
4ee9f9bb27 | ||
|
bcaa0bddea | ||
|
01cce49070 | ||
|
293be04d40 |
86
.ci/php-cs-fixer/composer.lock
generated
86
.ci/php-cs-fixer/composer.lock
generated
@@ -151,16 +151,16 @@
|
||||
},
|
||||
{
|
||||
"name": "composer/semver",
|
||||
"version": "3.4.3",
|
||||
"version": "3.4.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/semver.git",
|
||||
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
|
||||
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
|
||||
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
|
||||
"url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
|
||||
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -212,7 +212,7 @@
|
||||
"support": {
|
||||
"irc": "ircs://irc.libera.chat:6697/composer",
|
||||
"issues": "https://github.com/composer/semver/issues",
|
||||
"source": "https://github.com/composer/semver/tree/3.4.3"
|
||||
"source": "https://github.com/composer/semver/tree/3.4.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -222,13 +222,9 @@
|
||||
{
|
||||
"url": "https://github.com/composer",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-19T14:15:21+00:00"
|
||||
"time": "2025-08-20T19:15:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/xdebug-handler",
|
||||
@@ -959,23 +955,23 @@
|
||||
},
|
||||
{
|
||||
"name": "react/promise",
|
||||
"version": "v3.2.0",
|
||||
"version": "v3.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/reactphp/promise.git",
|
||||
"reference": "8a164643313c71354582dc850b42b33fa12a4b63"
|
||||
"reference": "23444f53a813a3296c1368bb104793ce8d88f04a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
|
||||
"reference": "8a164643313c71354582dc850b42b33fa12a4b63",
|
||||
"url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
|
||||
"reference": "23444f53a813a3296c1368bb104793ce8d88f04a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "1.10.39 || 1.4.10",
|
||||
"phpstan/phpstan": "1.12.28 || 1.4.10",
|
||||
"phpunit/phpunit": "^9.6 || ^7.5"
|
||||
},
|
||||
"type": "library",
|
||||
@@ -1020,7 +1016,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/reactphp/promise/issues",
|
||||
"source": "https://github.com/reactphp/promise/tree/v3.2.0"
|
||||
"source": "https://github.com/reactphp/promise/tree/v3.3.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1028,7 +1024,7 @@
|
||||
"type": "open_collective"
|
||||
}
|
||||
],
|
||||
"time": "2024-05-24T10:39:05+00:00"
|
||||
"time": "2025-08-19T18:57:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "react/socket",
|
||||
@@ -1787,7 +1783,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||
@@ -1846,7 +1842,7 @@
|
||||
"portable"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1857,6 +1853,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -1866,16 +1866,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-grapheme",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
|
||||
"reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
||||
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
|
||||
"reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1924,7 +1924,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1935,16 +1935,20 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2025-06-27T09:58:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-normalizer",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||
@@ -2005,7 +2009,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2016,6 +2020,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -2025,7 +2033,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||
@@ -2086,7 +2094,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2097,6 +2105,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -2106,7 +2118,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php80",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||
@@ -2166,7 +2178,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2177,6 +2189,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -2186,7 +2202,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php81",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php81.git",
|
||||
@@ -2242,7 +2258,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2253,6 +2269,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
|
4
.github/release-notes/alpha.md
vendored
4
.github/release-notes/alpha.md
vendored
@@ -16,6 +16,10 @@ Alpha releases are created to test new features and fixes before they are includ
|
||||
|
||||
The release files are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||
|
||||
## Develop with Firefly III
|
||||
|
||||
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||
|
||||
## Support Firefly III
|
||||
|
||||
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
||||
|
4
.github/release-notes/beta.md
vendored
4
.github/release-notes/beta.md
vendored
@@ -16,6 +16,10 @@ Alpha releases are created to test new features and fixes before they are includ
|
||||
|
||||
The release files are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||
|
||||
## Develop with Firefly III
|
||||
|
||||
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||
|
||||
## Support Firefly III
|
||||
|
||||
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
||||
|
4
.github/release-notes/branch.md
vendored
4
.github/release-notes/branch.md
vendored
@@ -16,6 +16,10 @@ There is no changelog for this release, as it is not final. However, [changelog.
|
||||
|
||||
The release files are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||
|
||||
## Develop with Firefly III
|
||||
|
||||
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||
|
||||
## Support Firefly III
|
||||
|
||||
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
||||
|
4
.github/release-notes/develop.md
vendored
4
.github/release-notes/develop.md
vendored
@@ -16,6 +16,10 @@ The changelog for this release may not be up-to-date, so it is not included. How
|
||||
|
||||
The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||
|
||||
## Develop with Firefly III
|
||||
|
||||
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||
|
||||
## Support Firefly III
|
||||
|
||||
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
||||
|
4
.github/release-notes/release.md
vendored
4
.github/release-notes/release.md
vendored
@@ -11,6 +11,10 @@ Welcome to release %version of Firefly III. It contains the latest fixes, transl
|
||||
|
||||
The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||
|
||||
## Develop with Firefly III
|
||||
|
||||
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||
|
||||
## Support Firefly III
|
||||
|
||||
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
||||
|
@@ -32,7 +32,9 @@ use FireflyIII\Generator\Webhook\MessageGeneratorInterface;
|
||||
use FireflyIII\Models\TransactionGroup;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||
use FireflyIII\Transformers\WebhookTransformer;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Support\Collection;
|
||||
@@ -90,6 +92,13 @@ class ShowController extends Controller
|
||||
$paginator = new LengthAwarePaginator($webhooks, $count, $pageSize, $this->parameters->get('page'));
|
||||
$paginator->setPath(route('api.v1.webhooks.index').$this->buildParams());
|
||||
|
||||
// enrich
|
||||
/** @var User $admin */
|
||||
$admin = auth()->user();
|
||||
$enrichment = new WebhookEnrichment();
|
||||
$enrichment->setUser($admin);
|
||||
$webhooks = $enrichment->enrich($webhooks);
|
||||
|
||||
/** @var WebhookTransformer $transformer */
|
||||
$transformer = app(WebhookTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
@@ -117,6 +126,13 @@ class ShowController extends Controller
|
||||
Log::channel('audit')->info(sprintf('User views webhook #%d.', $webhook->id));
|
||||
$manager = $this->getManager();
|
||||
|
||||
// enrich
|
||||
/** @var User $admin */
|
||||
$admin = auth()->user();
|
||||
$enrichment = new WebhookEnrichment();
|
||||
$enrichment->setUser($admin);
|
||||
$webhook = $enrichment->enrichSingle($webhook);
|
||||
|
||||
/** @var WebhookTransformer $transformer */
|
||||
$transformer = app(WebhookTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
@@ -156,7 +172,7 @@ class ShowController extends Controller
|
||||
$engine->generateMessages();
|
||||
|
||||
// trigger event to send them:
|
||||
Log::debug('send event RequestedSendWebhookMessages');
|
||||
Log::debug('send event RequestedSendWebhookMessages from ShowController::triggerTransaction()');
|
||||
event(new RequestedSendWebhookMessages());
|
||||
|
||||
return response()->json([], 204);
|
||||
|
@@ -27,7 +27,9 @@ namespace FireflyIII\Api\V1\Controllers\Webhook;
|
||||
use FireflyIII\Api\V1\Controllers\Controller;
|
||||
use FireflyIII\Api\V1\Requests\Models\Webhook\CreateRequest;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||
use FireflyIII\Transformers\WebhookTransformer;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use League\Fractal\Resource\Item;
|
||||
@@ -68,6 +70,15 @@ class StoreController extends Controller
|
||||
}
|
||||
|
||||
$webhook = $this->repository->store($data);
|
||||
|
||||
// enrich
|
||||
/** @var User $admin */
|
||||
$admin = auth()->user();
|
||||
$enrichment = new WebhookEnrichment();
|
||||
$enrichment->setUser($admin);
|
||||
$webhook = $enrichment->enrichSingle($webhook);
|
||||
|
||||
|
||||
$manager = $this->getManager();
|
||||
|
||||
Log::channel('audit')->info('User stores new webhook', $data);
|
||||
|
@@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
||||
use FireflyIII\Api\V1\Requests\Models\Webhook\UpdateRequest;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||
use FireflyIII\Transformers\WebhookTransformer;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use League\Fractal\Resource\Item;
|
||||
@@ -70,6 +72,13 @@ class UpdateController extends Controller
|
||||
$webhook = $this->repository->update($webhook, $data);
|
||||
$manager = $this->getManager();
|
||||
|
||||
// enrich
|
||||
/** @var User $admin */
|
||||
$admin = auth()->user();
|
||||
$enrichment = new WebhookEnrichment();
|
||||
$enrichment->setUser($admin);
|
||||
$webhook = $enrichment->enrichSingle($webhook);
|
||||
|
||||
Log::channel('audit')->info(sprintf('User updates webhook #%d', $webhook->id), $data);
|
||||
|
||||
/** @var WebhookTransformer $transformer */
|
||||
|
@@ -24,15 +24,13 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Api\V1\Requests\Models\Webhook;
|
||||
|
||||
use FireflyIII\Enums\WebhookResponse;
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Rules\IsBoolean;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||
use Illuminate\Contracts\Validation\Validator;
|
||||
use FireflyIII\Support\Request\ValidatesWebhooks;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* Class CreateRequest
|
||||
@@ -41,27 +39,28 @@ class CreateRequest extends FormRequest
|
||||
{
|
||||
use ChecksLogin;
|
||||
use ConvertsDataTypes;
|
||||
use ValidatesWebhooks;
|
||||
|
||||
public function getData(): array
|
||||
{
|
||||
$triggers = Webhook::getTriggersForValidation();
|
||||
$responses = Webhook::getResponsesForValidation();
|
||||
$deliveries = Webhook::getDeliveriesForValidation();
|
||||
|
||||
$fields = [
|
||||
'title' => ['title', 'convertString'],
|
||||
'active' => ['active', 'boolean'],
|
||||
'trigger' => ['trigger', 'convertString'],
|
||||
'response' => ['response', 'convertString'],
|
||||
'delivery' => ['delivery', 'convertString'],
|
||||
'url' => ['url', 'convertString'],
|
||||
$fields = [
|
||||
'title' => ['title', 'convertString'],
|
||||
'active' => ['active', 'boolean'],
|
||||
'url' => ['url', 'convertString'],
|
||||
];
|
||||
$triggers = $this->get('triggers', []);
|
||||
$responses = $this->get('responses', []);
|
||||
$deliveries = $this->get('deliveries', []);
|
||||
|
||||
// this is the way.
|
||||
$return = $this->getAllData($fields);
|
||||
$return['trigger'] = $triggers[$return['trigger']] ?? (int)$return['trigger'];
|
||||
$return['response'] = $responses[$return['response']] ?? (int)$return['response'];
|
||||
$return['delivery'] = $deliveries[$return['delivery']] ?? (int)$return['delivery'];
|
||||
if (0 === count($triggers) || 0 === count($responses) || 0 === count($deliveries)) {
|
||||
throw new FireflyException('Unexpectedly got no responses, triggers or deliveries.');
|
||||
}
|
||||
|
||||
|
||||
$return = $this->getAllData($fields);
|
||||
$return['triggers'] = $triggers;
|
||||
$return['responses'] = $responses;
|
||||
$return['deliveries'] = $deliveries;
|
||||
|
||||
return $return;
|
||||
}
|
||||
@@ -71,59 +70,24 @@ class CreateRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$triggers = implode(',', array_keys(Webhook::getTriggersForValidation()));
|
||||
$responses = implode(',', array_keys(Webhook::getResponsesForValidation()));
|
||||
$deliveries = implode(',', array_keys(Webhook::getDeliveriesForValidation()));
|
||||
$triggers = implode(',', array_values(Webhook::getTriggers()));
|
||||
$responses = implode(',', array_values(Webhook::getResponses()));
|
||||
$deliveries = implode(',', array_values(Webhook::getDeliveries()));
|
||||
$validProtocols = config('firefly.valid_url_protocols');
|
||||
|
||||
return [
|
||||
'title' => 'required|min:1|max:255|uniqueObjectForUser:webhooks,title',
|
||||
'active' => [new IsBoolean()],
|
||||
'trigger' => sprintf('required|in:%s', $triggers),
|
||||
'response' => sprintf('required|in:%s', $responses),
|
||||
'delivery' => sprintf('required|in:%s', $deliveries),
|
||||
'url' => ['required', sprintf('url:%s', $validProtocols), 'uniqueWebhook'],
|
||||
'title' => 'required|min:1|max:255|uniqueObjectForUser:webhooks,title',
|
||||
'active' => [new IsBoolean()],
|
||||
'trigger' => 'prohibited',
|
||||
'triggers' => 'required|array|min:1|max:10',
|
||||
'triggers.*' => sprintf('required|in:%s', $triggers),
|
||||
'response' => 'prohibited',
|
||||
'responses' => 'required|array|min:1|max:1',
|
||||
'responses.*' => sprintf('required|in:%s', $responses),
|
||||
'delivery' => 'prohibited',
|
||||
'deliveries' => 'required|array|min:1|max:1',
|
||||
'deliveries.*' => sprintf('required|in:%s', $deliveries),
|
||||
'url' => ['required', sprintf('url:%s', $validProtocols)],
|
||||
];
|
||||
}
|
||||
|
||||
public function withValidator(Validator $validator): void
|
||||
{
|
||||
$validator->after(
|
||||
function (Validator $validator): void {
|
||||
Log::debug('Validating webhook');
|
||||
$data = $validator->getData();
|
||||
$trigger = $data['trigger'] ?? null;
|
||||
$response = $data['response'] ?? null;
|
||||
if (null === $trigger || null === $response) {
|
||||
Log::debug('No trigger or response, return.');
|
||||
|
||||
return;
|
||||
}
|
||||
$triggers = array_keys(Webhook::getTriggersForValidation());
|
||||
$responses = array_keys(Webhook::getResponsesForValidation());
|
||||
if (!in_array($trigger, $triggers, true) || !in_array($response, $responses, true)) {
|
||||
return;
|
||||
}
|
||||
// cannot deliver budget info.
|
||||
if (is_int($trigger)) {
|
||||
Log::debug(sprintf('Trigger was integer (%d).', $trigger));
|
||||
$trigger = WebhookTrigger::from($trigger)->name;
|
||||
}
|
||||
if (is_int($response)) {
|
||||
Log::debug(sprintf('Response was integer (%d).', $response));
|
||||
$response = WebhookResponse::from($response)->name;
|
||||
}
|
||||
Log::debug(sprintf('Trigger is %s, response is %s', $trigger, $response));
|
||||
if (str_contains($trigger, 'TRANSACTION') && str_contains($response, 'BUDGET')) {
|
||||
$validator->errors()->add('response', trans('validation.webhook_budget_info'));
|
||||
}
|
||||
if (str_contains($trigger, 'BUDGET') && str_contains($response, 'ACCOUNT')) {
|
||||
$validator->errors()->add('response', trans('validation.webhook_account_info'));
|
||||
}
|
||||
if (str_contains($trigger, 'BUDGET') && str_contains($response, 'TRANSACTION')) {
|
||||
$validator->errors()->add('response', trans('validation.webhook_transaction_info'));
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -24,15 +24,13 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Api\V1\Requests\Models\Webhook;
|
||||
|
||||
use FireflyIII\Enums\WebhookResponse;
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Rules\IsBoolean;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||
use Illuminate\Contracts\Validation\Validator;
|
||||
use FireflyIII\Support\Request\ValidatesWebhooks;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* Class UpdateRequest
|
||||
@@ -41,38 +39,29 @@ class UpdateRequest extends FormRequest
|
||||
{
|
||||
use ChecksLogin;
|
||||
use ConvertsDataTypes;
|
||||
use ValidatesWebhooks;
|
||||
|
||||
public function getData(): array
|
||||
{
|
||||
$triggers = Webhook::getTriggersForValidation();
|
||||
$responses = Webhook::getResponsesForValidation();
|
||||
$deliveries = Webhook::getDeliveriesForValidation();
|
||||
|
||||
$fields = [
|
||||
$fields = [
|
||||
'title' => ['title', 'convertString'],
|
||||
'active' => ['active', 'boolean'],
|
||||
'trigger' => ['trigger', 'convertString'],
|
||||
'response' => ['response', 'convertString'],
|
||||
'delivery' => ['delivery', 'convertString'],
|
||||
'url' => ['url', 'convertString'],
|
||||
];
|
||||
|
||||
// this is the way.
|
||||
$return = $this->getAllData($fields);
|
||||
if (array_key_exists('trigger', $return)) {
|
||||
$return['trigger'] = $triggers[$return['trigger']] ?? 0;
|
||||
}
|
||||
if (array_key_exists('response', $return)) {
|
||||
$return['response'] = $responses[$return['response']] ?? 0;
|
||||
}
|
||||
if (array_key_exists('delivery', $return)) {
|
||||
$return['delivery'] = $deliveries[$return['delivery']] ?? 0;
|
||||
}
|
||||
$return['secret'] = null !== $this->get('secret');
|
||||
if (null !== $this->get('title')) {
|
||||
$return['title'] = $this->convertString('title');
|
||||
$triggers = $this->get('triggers', []);
|
||||
$responses = $this->get('responses', []);
|
||||
$deliveries = $this->get('deliveries', []);
|
||||
|
||||
if (0 === count($triggers) || 0 === count($responses) || 0 === count($deliveries)) {
|
||||
throw new FireflyException('Unexpectedly got no responses, triggers or deliveries.');
|
||||
}
|
||||
|
||||
$return = $this->getAllData($fields);
|
||||
$return['triggers'] = $triggers;
|
||||
$return['responses'] = $responses;
|
||||
$return['deliveries'] = $deliveries;
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -81,62 +70,29 @@ class UpdateRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$triggers = implode(',', array_keys(Webhook::getTriggersForValidation()));
|
||||
$responses = implode(',', array_keys(Webhook::getResponsesForValidation()));
|
||||
$deliveries = implode(',', array_keys(Webhook::getDeliveriesForValidation()));
|
||||
$triggers = implode(',', array_values(Webhook::getTriggers()));
|
||||
$responses = implode(',', array_values(Webhook::getResponses()));
|
||||
$deliveries = implode(',', array_values(Webhook::getDeliveries()));
|
||||
$validProtocols = config('firefly.valid_url_protocols');
|
||||
|
||||
/** @var Webhook $webhook */
|
||||
$webhook = $this->route()->parameter('webhook');
|
||||
|
||||
return [
|
||||
'title' => sprintf('min:1|max:255|uniqueObjectForUser:webhooks,title,%d', $webhook->id),
|
||||
'active' => [new IsBoolean()],
|
||||
'trigger' => sprintf('in:%s', $triggers),
|
||||
'response' => sprintf('in:%s', $responses),
|
||||
'delivery' => sprintf('in:%s', $deliveries),
|
||||
'url' => [sprintf('url:%s', $validProtocols), sprintf('uniqueExistingWebhook:%d', $webhook->id)],
|
||||
'title' => sprintf('min:1|max:255|uniqueObjectForUser:webhooks,title,%d', $webhook->id),
|
||||
'active' => [new IsBoolean()],
|
||||
|
||||
'trigger' => 'prohibited',
|
||||
'triggers' => 'required|array|min:1|max:10',
|
||||
'triggers.*' => sprintf('required|in:%s', $triggers),
|
||||
'response' => 'prohibited',
|
||||
'responses' => 'required|array|min:1|max:1',
|
||||
'responses.*' => sprintf('required|in:%s', $responses),
|
||||
'delivery' => 'prohibited',
|
||||
'deliveries' => 'required|array|min:1|max:1',
|
||||
'deliveries.*' => sprintf('required|in:%s', $deliveries),
|
||||
|
||||
'url' => [sprintf('url:%s', $validProtocols), sprintf('uniqueExistingWebhook:%d', $webhook->id)],
|
||||
];
|
||||
}
|
||||
|
||||
public function withValidator(Validator $validator): void
|
||||
{
|
||||
$validator->after(
|
||||
function (Validator $validator): void {
|
||||
Log::debug('Validating webhook');
|
||||
$data = $validator->getData();
|
||||
$trigger = $data['trigger'] ?? null;
|
||||
$response = $data['response'] ?? null;
|
||||
if (null === $trigger || null === $response) {
|
||||
Log::debug('No trigger or response, return.');
|
||||
|
||||
return;
|
||||
}
|
||||
$triggers = array_keys(Webhook::getTriggersForValidation());
|
||||
$responses = array_keys(Webhook::getResponsesForValidation());
|
||||
if (!in_array($trigger, $triggers, true) || !in_array($response, $responses, true)) {
|
||||
return;
|
||||
}
|
||||
// cannot deliver budget info.
|
||||
if (is_int($trigger)) {
|
||||
Log::debug(sprintf('Trigger was integer (%d).', $trigger));
|
||||
$trigger = WebhookTrigger::from($trigger)->name;
|
||||
}
|
||||
if (is_int($response)) {
|
||||
Log::debug(sprintf('Response was integer (%d).', $response));
|
||||
$response = WebhookResponse::from($response)->name;
|
||||
}
|
||||
Log::debug(sprintf('Trigger is %s, response is %s', $trigger, $response));
|
||||
if (str_contains($trigger, 'TRANSACTION') && str_contains($response, 'BUDGET')) {
|
||||
$validator->errors()->add('response', trans('validation.webhook_budget_info'));
|
||||
}
|
||||
if (str_contains($trigger, 'BUDGET') && str_contains($response, 'ACCOUNT')) {
|
||||
$validator->errors()->add('response', trans('validation.webhook_account_info'));
|
||||
}
|
||||
if (str_contains($trigger, 'BUDGET') && str_contains($response, 'TRANSACTION')) {
|
||||
$validator->errors()->add('response', trans('validation.webhook_transaction_info'));
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -28,6 +28,7 @@ namespace FireflyIII\Casts;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* Class SeparateTimezoneCaster
|
||||
@@ -51,6 +52,7 @@ class SeparateTimezoneCaster implements CastsAttributes
|
||||
$timeZone = $attributes[sprintf('%s_tz', $key)] ?? config('app.timezone');
|
||||
|
||||
return Carbon::parse($value, $timeZone)->setTimezone(config('app.timezone'));
|
||||
// Log::debug(sprintf('SeparateTimezoneCaster: %s.%s = %s', str_replace('FireflyIII\\Models\\','',get_class($model)), $key, $result->toAtomString()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -75,6 +75,7 @@ class UpgradesDatabase extends Command
|
||||
'upgrade:610-currency-preferences',
|
||||
'upgrade:620-piggy-banks',
|
||||
'upgrade:620-pc-amounts',
|
||||
'upgrade:640-upgrade-webhooks',
|
||||
'firefly-iii:correct-database',
|
||||
];
|
||||
$args = [];
|
||||
|
95
app/Console/Commands/Upgrade/UpgradesWebhooks.php
Normal file
95
app/Console/Commands/Upgrade/UpgradesWebhooks.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Console\Commands\Upgrade;
|
||||
|
||||
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
|
||||
use FireflyIII\Enums\WebhookDelivery;
|
||||
use FireflyIII\Enums\WebhookResponse;
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Models\WebhookDelivery as WebhookDeliveryModel;
|
||||
use FireflyIII\Models\WebhookResponse as WebhookResponseModel;
|
||||
use FireflyIII\Models\WebhookTrigger as WebhookTriggerModel;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class UpgradesWebhooks extends Command
|
||||
{
|
||||
use ShowsFriendlyMessages;
|
||||
|
||||
public const string CONFIG_NAME = '640_upgrade_webhooks';
|
||||
protected $description = 'Upgrade webhooks so they can handle multiple triggers.';
|
||||
protected $signature = 'upgrade:640-upgrade-webhooks {--F|force : Force the execution of this command.}';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
if ($this->isExecuted() && true !== $this->option('force')) {
|
||||
$this->friendlyInfo('This command has already been executed.');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
$this->upgradeWebhooks();
|
||||
$this->markAsExecuted();
|
||||
$this->friendlyPositive('Upgraded webhooks.');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private function isExecuted(): bool
|
||||
{
|
||||
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false);
|
||||
if (null !== $configVar) {
|
||||
return (bool)$configVar->data;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function upgradeWebhooks(): void
|
||||
{
|
||||
$set = Webhook::where('delivery', '>', 1)->orWhere('trigger', '>', 1)->orWhere('response', '>', 1)->get();
|
||||
|
||||
/** @var Webhook $webhook */
|
||||
foreach ($set as $webhook) {
|
||||
$this->upgradeWebhook($webhook);
|
||||
}
|
||||
}
|
||||
|
||||
private function upgradeWebhook(Webhook $webhook): void
|
||||
{
|
||||
$delivery = WebhookDelivery::tryFrom((int)$webhook->delivery);
|
||||
$response = WebhookResponse::tryFrom((int)$webhook->response);
|
||||
$trigger = WebhookTrigger::tryFrom((int)$webhook->trigger);
|
||||
if (null === $delivery || null === $response || null === $trigger) {
|
||||
$this->friendlyError(sprintf('[a] Webhook #%d has an invalid delivery, response or trigger value. Will not upgrade.', $webhook->id));
|
||||
|
||||
return;
|
||||
}
|
||||
$deliveryModel = WebhookDeliveryModel::where('key', $delivery->value)->first();
|
||||
$responseModel = WebhookResponseModel::where('key', $response->value)->first();
|
||||
$triggerModel = WebhookTriggerModel::where('key', $trigger->value)->first();
|
||||
if (null === $deliveryModel || null === $responseModel || null === $triggerModel) {
|
||||
$this->friendlyError(sprintf('[b] Webhook #%d has an invalid delivery, response or trigger model. Will not upgrade.', $webhook->id));
|
||||
|
||||
return;
|
||||
}
|
||||
$webhook->webhookDeliveries()->attach([$deliveryModel->id]);
|
||||
$webhook->webhookResponses()->attach([$responseModel->id]);
|
||||
$webhook->webhookTriggers()->attach([$triggerModel->id]);
|
||||
$webhook->delivery = 1;
|
||||
$webhook->response = 1;
|
||||
$webhook->trigger = 1;
|
||||
$webhook->save();
|
||||
$this->friendlyPositive(sprintf('Webhook #%d upgraded.', $webhook->id));
|
||||
}
|
||||
|
||||
private function markAsExecuted(): void
|
||||
{
|
||||
app('fireflyconfig')->set(self::CONFIG_NAME, true);
|
||||
}
|
||||
}
|
@@ -32,5 +32,6 @@ enum WebhookResponse: int
|
||||
case TRANSACTIONS = 200;
|
||||
case ACCOUNTS = 210;
|
||||
case BUDGET = 230;
|
||||
case RELEVANT = 240;
|
||||
case NONE = 220;
|
||||
}
|
||||
|
@@ -29,6 +29,7 @@ namespace FireflyIII\Enums;
|
||||
*/
|
||||
enum WebhookTrigger: int
|
||||
{
|
||||
case ANY = 50;
|
||||
case STORE_TRANSACTION = 100;
|
||||
case UPDATE_TRANSACTION = 110;
|
||||
case DESTROY_TRANSACTION = 120;
|
||||
|
@@ -30,6 +30,7 @@ use FireflyIII\Models\Recurrence;
|
||||
use FireflyIII\Services\Internal\Support\RecurringTransactionTrait;
|
||||
use FireflyIII\Services\Internal\Support\TransactionTypeTrait;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\MessageBag;
|
||||
|
||||
/**
|
||||
@@ -62,8 +63,8 @@ class RecurrenceFactory
|
||||
$type = $this->findTransactionType(ucfirst((string) $data['recurrence']['type']));
|
||||
} catch (FireflyException $e) {
|
||||
$message = sprintf('Cannot make a recurring transaction of type "%s"', $data['recurrence']['type']);
|
||||
app('log')->error($message);
|
||||
app('log')->error($e->getTraceAsString());
|
||||
Log::error($message);
|
||||
Log::error($e->getTraceAsString());
|
||||
|
||||
throw new FireflyException($message, 0, $e);
|
||||
}
|
||||
@@ -101,17 +102,18 @@ class RecurrenceFactory
|
||||
|
||||
$recurrence = new Recurrence(
|
||||
[
|
||||
'user_id' => $this->user->id,
|
||||
'user_group_id' => $this->user->user_group_id,
|
||||
'transaction_type_id' => $type->id,
|
||||
'title' => $title,
|
||||
'description' => $description,
|
||||
'first_date' => $firstDate?->format('Y-m-d'),
|
||||
'repeat_until' => $repetitions > 0 ? null : $repeatUntilString,
|
||||
'latest_date' => null,
|
||||
'repetitions' => $repetitions,
|
||||
'apply_rules' => $applyRules,
|
||||
'active' => $active,
|
||||
'user_id' => $this->user->id,
|
||||
'user_group_id' => $this->user->user_group_id,
|
||||
'transaction_type_id' => $type->id,
|
||||
'title' => $title,
|
||||
'description' => $description,
|
||||
'first_date' => $firstDate?->format('Y-m-d'),
|
||||
'first_date_tz' => $firstDate?->format('e'),
|
||||
'repeat_until' => $repetitions > 0 ? null : $repeatUntilString,
|
||||
'latest_date' => null,
|
||||
'repetitions' => $repetitions,
|
||||
'apply_rules' => $applyRules,
|
||||
'active' => $active,
|
||||
]
|
||||
);
|
||||
$recurrence->save();
|
||||
@@ -125,8 +127,8 @@ class RecurrenceFactory
|
||||
try {
|
||||
$this->createTransactions($recurrence, $data['transactions'] ?? []);
|
||||
} catch (FireflyException $e) {
|
||||
app('log')->error($e->getMessage());
|
||||
app('log')->error($e->getTraceAsString());
|
||||
Log::error($e->getMessage());
|
||||
Log::error($e->getTraceAsString());
|
||||
$recurrence->forceDelete();
|
||||
$message = sprintf('Could not create recurring transaction: %s', $e->getMessage());
|
||||
$this->errors->add('store', $message);
|
||||
|
@@ -34,6 +34,8 @@ use FireflyIII\Models\TransactionGroup;
|
||||
use FireflyIII\Models\TransactionJournal;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Models\WebhookMessage;
|
||||
use FireflyIII\Models\WebhookResponse as WebhookResponseModel;
|
||||
use FireflyIII\Models\WebhookTrigger as WebhookTriggerModel;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment;
|
||||
@@ -80,7 +82,13 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
|
||||
private function getWebhooks(): Collection
|
||||
{
|
||||
return $this->user->webhooks()->where('active', true)->where('trigger', $this->trigger)->get(['webhooks.*']);
|
||||
return $this->user->webhooks()
|
||||
->leftJoin('webhook_webhook_trigger', 'webhook_webhook_trigger.webhook_id', 'webhooks.id')
|
||||
->leftJoin('webhook_triggers', 'webhook_webhook_trigger.webhook_trigger_id', 'webhook_triggers.id')
|
||||
->where('active', true)
|
||||
->whereIn('webhook_triggers.title', [$this->trigger->name, WebhookTrigger::ANY->name])
|
||||
->get(['webhooks.*'])
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -115,22 +123,25 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
*/
|
||||
private function generateMessage(Webhook $webhook, Model $model): void
|
||||
{
|
||||
$class = $model::class;
|
||||
$class = $model::class;
|
||||
// Line is ignored because all of Firefly III's Models have an id property.
|
||||
Log::debug(sprintf('Now in generateMessage(#%d, %s#%d)', $webhook->id, $class, $model->id));
|
||||
$uuid = Uuid::uuid4();
|
||||
$basicMessage = [
|
||||
$uuid = Uuid::uuid4();
|
||||
|
||||
/** @var WebhookResponseModel $response */
|
||||
$response = $webhook->webhookResponses()->first();
|
||||
$triggers = $this->getTriggerTitles($webhook->webhookTriggers()->get());
|
||||
$basicMessage = [
|
||||
'uuid' => $uuid->toString(),
|
||||
'user_id' => 0,
|
||||
'user_group_id' => 0,
|
||||
'trigger' => WebhookTrigger::from((int)$webhook->trigger)->name,
|
||||
'response' => WebhookResponse::from((int)$webhook->response)->name,
|
||||
'trigger' => $this->trigger->name,
|
||||
'response' => $response->title, // guess that the database is correct.
|
||||
'url' => $webhook->url,
|
||||
'version' => sprintf('v%d', $this->getVersion()),
|
||||
'content' => [],
|
||||
];
|
||||
|
||||
// depends on the model how user_id is set:
|
||||
switch ($class) {
|
||||
default:
|
||||
// Line is ignored because all of Firefly III's Models have an id property.
|
||||
@@ -142,12 +153,14 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
/** @var Budget $model */
|
||||
$basicMessage['user_id'] = $model->user_id;
|
||||
$basicMessage['user_group_id'] = $model->user_group_id;
|
||||
$relevantResponse = WebhookResponse::BUDGET->name;
|
||||
|
||||
break;
|
||||
|
||||
case BudgetLimit::class:
|
||||
$basicMessage['user_id'] = $model->budget->user_id;
|
||||
$basicMessage['user_group_id'] = $model->budget->user_group_id;
|
||||
$relevantResponse = WebhookResponse::BUDGET->name;
|
||||
|
||||
break;
|
||||
|
||||
@@ -158,15 +171,15 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
|
||||
break;
|
||||
}
|
||||
$responseTitle = $this->getRelevantResponse($triggers, $response, $class);
|
||||
|
||||
// then depends on the response what to put in the message:
|
||||
switch ($webhook->response) {
|
||||
switch ($responseTitle) {
|
||||
default:
|
||||
Log::error(sprintf('The response code for webhook #%d is "%d" and the message generator cant handle it. Soft fail.', $webhook->id, $webhook->response));
|
||||
Log::error(sprintf('The response code for webhook #%d is "%s" and the message generator cant handle it. Soft fail.', $webhook->id, $webhook->response));
|
||||
|
||||
return;
|
||||
|
||||
case WebhookResponse::BUDGET->value:
|
||||
case WebhookResponse::BUDGET->name:
|
||||
$basicMessage['content'] = [];
|
||||
if ($model instanceof Budget) {
|
||||
$enrichment = new BudgetEnrichment();
|
||||
@@ -177,12 +190,6 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
}
|
||||
if ($model instanceof BudgetLimit) {
|
||||
$user = $model->budget->user;
|
||||
$enrichment = new BudgetEnrichment();
|
||||
$enrichment->setUser($user);
|
||||
$enrichment->setStart($model->start_date);
|
||||
$enrichment->setEnd($model->end_date);
|
||||
$budget = $enrichment->enrichSingle($model->budget);
|
||||
|
||||
$enrichment = new BudgetLimitEnrichment();
|
||||
$enrichment->setUser($user);
|
||||
|
||||
@@ -198,12 +205,12 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
|
||||
break;
|
||||
|
||||
case WebhookResponse::NONE->value:
|
||||
case WebhookResponse::NONE->name:
|
||||
$basicMessage['content'] = [];
|
||||
|
||||
break;
|
||||
|
||||
case WebhookResponse::TRANSACTIONS->value:
|
||||
case WebhookResponse::TRANSACTIONS->name:
|
||||
/** @var TransactionGroup $model */
|
||||
$transformer = new TransactionGroupTransformer();
|
||||
|
||||
@@ -220,7 +227,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
|
||||
break;
|
||||
|
||||
case WebhookResponse::ACCOUNTS->value:
|
||||
case WebhookResponse::ACCOUNTS->name:
|
||||
/** @var TransactionGroup $model */
|
||||
$accounts = $this->collectAccounts($model);
|
||||
$enrichment = new AccountEnrichment();
|
||||
@@ -287,4 +294,50 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
||||
{
|
||||
$this->webhooks = $webhooks;
|
||||
}
|
||||
|
||||
private function getRelevantResponse(array $triggers, WebhookResponseModel $response, $class): string
|
||||
{
|
||||
// return none if none.
|
||||
if (WebhookResponse::NONE->name === $response->title) {
|
||||
Log::debug(sprintf('Return "%s" because requested nothing.', WebhookResponse::NONE->name));
|
||||
|
||||
return WebhookResponse::NONE->name;
|
||||
}
|
||||
|
||||
if (WebhookResponse::RELEVANT->name === $response->title) {
|
||||
Log::debug('Expected response is any relevant data.');
|
||||
|
||||
// depends on the $class
|
||||
switch ($class) {
|
||||
case TransactionGroup::class:
|
||||
Log::debug(sprintf('Return "%s" because class is %s', WebhookResponse::TRANSACTIONS->name, $class));
|
||||
|
||||
return WebhookResponse::TRANSACTIONS->name;
|
||||
|
||||
case Budget::class:
|
||||
case BudgetLimit::class:
|
||||
Log::debug(sprintf('Return "%s" because class is %s', WebhookResponse::BUDGET->name, $class));
|
||||
|
||||
return WebhookResponse::BUDGET->name;
|
||||
|
||||
default:
|
||||
throw new FireflyException(sprintf('Cannot deal with "relevant" if the given object is a "%s"', $class));
|
||||
}
|
||||
}
|
||||
Log::debug(sprintf('Return response again: %s', $response->title));
|
||||
|
||||
return $response->title;
|
||||
}
|
||||
|
||||
private function getTriggerTitles(Collection $collection): array
|
||||
{
|
||||
$return = [];
|
||||
|
||||
/** @var WebhookTriggerModel $item */
|
||||
foreach ($collection as $item) {
|
||||
$return[] = $item->title;
|
||||
}
|
||||
|
||||
return array_unique($return);
|
||||
}
|
||||
}
|
||||
|
@@ -55,7 +55,7 @@ class DestroyedGroupEventHandler
|
||||
$engine->setObjects(new Collection([$group]));
|
||||
$engine->setTrigger(WebhookTrigger::DESTROY_TRANSACTION);
|
||||
$engine->generateMessages();
|
||||
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
}
|
||||
|
||||
|
@@ -121,6 +121,7 @@ class StoredGroupEventHandler
|
||||
$engine->generateMessages();
|
||||
|
||||
// trigger event to send them:
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
}
|
||||
}
|
||||
|
@@ -167,6 +167,7 @@ class UpdatedGroupEventHandler
|
||||
$engine->setTrigger(WebhookTrigger::UPDATE_TRANSACTION);
|
||||
$engine->generateMessages();
|
||||
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
}
|
||||
|
||||
|
@@ -53,6 +53,7 @@ class BudgetLimitObserver
|
||||
$engine->setTrigger(WebhookTrigger::STORE_UPDATE_BUDGET_LIMIT);
|
||||
$engine->generateMessages();
|
||||
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
}
|
||||
|
||||
@@ -90,6 +91,7 @@ class BudgetLimitObserver
|
||||
$engine->setTrigger(WebhookTrigger::STORE_UPDATE_BUDGET_LIMIT);
|
||||
$engine->generateMessages();
|
||||
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
}
|
||||
}
|
||||
|
@@ -54,7 +54,7 @@ class BudgetObserver
|
||||
$engine->setObjects(new Collection()->push($budget));
|
||||
$engine->setTrigger(WebhookTrigger::STORE_BUDGET);
|
||||
$engine->generateMessages();
|
||||
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ class BudgetObserver
|
||||
$engine->setObjects(new Collection()->push($budget));
|
||||
$engine->setTrigger(WebhookTrigger::UPDATE_BUDGET);
|
||||
$engine->generateMessages();
|
||||
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ class BudgetObserver
|
||||
$engine->setObjects(new Collection()->push($budget));
|
||||
$engine->setTrigger(WebhookTrigger::DESTROY_BUDGET);
|
||||
$engine->generateMessages();
|
||||
|
||||
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
|
||||
event(new RequestedSendWebhookMessages());
|
||||
|
||||
$repository = app(AttachmentRepositoryInterface::class);
|
||||
|
@@ -129,7 +129,6 @@ class IndexController extends Controller
|
||||
$spent = $spentArr[$this->primaryCurrency->id]['sum'] ?? '0';
|
||||
unset($spentArr);
|
||||
}
|
||||
|
||||
// number of days for consistent budgeting.
|
||||
$activeDaysPassed = $this->activeDaysPassed($start, $end); // see method description.
|
||||
$activeDaysLeft = $this->activeDaysLeft($start, $end); // see method description.
|
||||
|
@@ -105,7 +105,6 @@ class EditController extends Controller
|
||||
/** @var RecurrenceTransformer $transformer */
|
||||
$transformer = app(RecurrenceTransformer::class);
|
||||
$transformer->setParameters(new ParameterBag());
|
||||
|
||||
$array = $transformer->transform($recurrence);
|
||||
$budgets = ExpandedForm::makeSelectListWithEmpty($this->budgetRepos->getActiveBudgets());
|
||||
$bills = ExpandedForm::makeSelectListWithEmpty($this->billRepository->getActiveBills());
|
||||
|
@@ -24,14 +24,15 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Models;
|
||||
|
||||
use FireflyIII\Enums\WebhookDelivery;
|
||||
use FireflyIII\Enums\WebhookResponse;
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
use FireflyIII\Enums\WebhookDelivery as WebhookDeliveryEnum;
|
||||
use FireflyIII\Enums\WebhookResponse as WebhookResponseEnum;
|
||||
use FireflyIII\Enums\WebhookTrigger as WebhookTriggerEnum;
|
||||
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
|
||||
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
@@ -56,7 +57,7 @@ class Webhook extends Model
|
||||
public static function getDeliveries(): array
|
||||
{
|
||||
$array = [];
|
||||
$set = WebhookDelivery::cases();
|
||||
$set = WebhookDeliveryEnum::cases();
|
||||
foreach ($set as $item) {
|
||||
$array[$item->value] = $item->name;
|
||||
}
|
||||
@@ -67,7 +68,7 @@ class Webhook extends Model
|
||||
public static function getDeliveriesForValidation(): array
|
||||
{
|
||||
$array = [];
|
||||
$set = WebhookDelivery::cases();
|
||||
$set = WebhookDeliveryEnum::cases();
|
||||
foreach ($set as $item) {
|
||||
$array[$item->name] = $item->value;
|
||||
$array[$item->value] = $item->value;
|
||||
@@ -79,7 +80,7 @@ class Webhook extends Model
|
||||
public static function getResponses(): array
|
||||
{
|
||||
$array = [];
|
||||
$set = WebhookResponse::cases();
|
||||
$set = WebhookResponseEnum::cases();
|
||||
foreach ($set as $item) {
|
||||
$array[$item->value] = $item->name;
|
||||
}
|
||||
@@ -90,7 +91,7 @@ class Webhook extends Model
|
||||
public static function getResponsesForValidation(): array
|
||||
{
|
||||
$array = [];
|
||||
$set = WebhookResponse::cases();
|
||||
$set = WebhookResponseEnum::cases();
|
||||
foreach ($set as $item) {
|
||||
$array[$item->name] = $item->value;
|
||||
$array[$item->value] = $item->value;
|
||||
@@ -102,7 +103,7 @@ class Webhook extends Model
|
||||
public static function getTriggers(): array
|
||||
{
|
||||
$array = [];
|
||||
$set = WebhookTrigger::cases();
|
||||
$set = WebhookTriggerEnum::cases();
|
||||
foreach ($set as $item) {
|
||||
$array[$item->value] = $item->name;
|
||||
}
|
||||
@@ -113,7 +114,7 @@ class Webhook extends Model
|
||||
public static function getTriggersForValidation(): array
|
||||
{
|
||||
$array = [];
|
||||
$set = WebhookTrigger::cases();
|
||||
$set = WebhookTriggerEnum::cases();
|
||||
foreach ($set as $item) {
|
||||
$array[$item->name] = $item->value;
|
||||
$array[$item->value] = $item->value;
|
||||
@@ -130,7 +131,7 @@ class Webhook extends Model
|
||||
public static function routeBinder(string $value): self
|
||||
{
|
||||
if (auth()->check()) {
|
||||
$webhookId = (int) $value;
|
||||
$webhookId = (int)$value;
|
||||
|
||||
/** @var User $user */
|
||||
$user = auth()->user();
|
||||
@@ -155,6 +156,21 @@ class Webhook extends Model
|
||||
return $this->hasMany(WebhookMessage::class);
|
||||
}
|
||||
|
||||
public function webhookDeliveries(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(WebhookDelivery::class);
|
||||
}
|
||||
|
||||
public function webhookResponses(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(WebhookResponse::class);
|
||||
}
|
||||
|
||||
public function webhookTriggers(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(WebhookTrigger::class);
|
||||
}
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
|
26
app/Models/WebhookDelivery.php
Normal file
26
app/Models/WebhookDelivery.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Models;
|
||||
|
||||
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class WebhookDelivery extends Model
|
||||
{
|
||||
use ReturnsIntegerIdTrait;
|
||||
|
||||
/**
|
||||
* Get the ID
|
||||
*
|
||||
* @SuppressWarnings("PHPMD.ShortMethodName")
|
||||
*/
|
||||
protected function key(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
get: static fn ($value) => (int) $value,
|
||||
);
|
||||
}
|
||||
}
|
26
app/Models/WebhookResponse.php
Normal file
26
app/Models/WebhookResponse.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Models;
|
||||
|
||||
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class WebhookResponse extends Model
|
||||
{
|
||||
use ReturnsIntegerIdTrait;
|
||||
|
||||
/**
|
||||
* Get the ID
|
||||
*
|
||||
* @SuppressWarnings("PHPMD.ShortMethodName")
|
||||
*/
|
||||
protected function key(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
get: static fn ($value) => (int) $value,
|
||||
);
|
||||
}
|
||||
}
|
26
app/Models/WebhookTrigger.php
Normal file
26
app/Models/WebhookTrigger.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Models;
|
||||
|
||||
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class WebhookTrigger extends Model
|
||||
{
|
||||
use ReturnsIntegerIdTrait;
|
||||
|
||||
/**
|
||||
* Get the ID
|
||||
*
|
||||
* @SuppressWarnings("PHPMD.ShortMethodName")
|
||||
*/
|
||||
protected function key(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
get: static fn ($value) => (int) $value,
|
||||
);
|
||||
}
|
||||
}
|
@@ -268,7 +268,7 @@ class BudgetRepository implements BudgetRepositoryInterface, UserGroupInterface
|
||||
*/
|
||||
foreach ($budgets as $index => $budget) {
|
||||
$budget->order = $index + 1;
|
||||
$budget->save();
|
||||
$budget->saveQuietly();
|
||||
}
|
||||
// other budgets, set to 0.
|
||||
$this->user->budgets()->where('active', 0)->update(['order' => 0]);
|
||||
|
@@ -24,9 +24,13 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Repositories\Webhook;
|
||||
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Models\WebhookAttempt;
|
||||
use FireflyIII\Models\WebhookDelivery;
|
||||
use FireflyIII\Models\WebhookMessage;
|
||||
use FireflyIII\Models\WebhookResponse;
|
||||
use FireflyIII\Models\WebhookTrigger;
|
||||
use FireflyIII\Support\Repositories\UserGroup\UserGroupInterface;
|
||||
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||
use Illuminate\Support\Collection;
|
||||
@@ -41,11 +45,20 @@ class WebhookRepository implements WebhookRepositoryInterface, UserGroupInterfac
|
||||
|
||||
public function all(): Collection
|
||||
{
|
||||
return $this->user->webhooks()->get();
|
||||
return $this->user->webhooks()
|
||||
// only get upgraded webhooks
|
||||
->where('delivery', 1)
|
||||
->where('response', 1)
|
||||
->where('trigger', 1)
|
||||
->get()
|
||||
;
|
||||
}
|
||||
|
||||
public function destroy(Webhook $webhook): void
|
||||
{
|
||||
// force delete all messages and attempts:
|
||||
$webhook->webhookMessages()->delete();
|
||||
|
||||
$webhook->delete();
|
||||
}
|
||||
|
||||
@@ -87,38 +100,108 @@ class WebhookRepository implements WebhookRepositoryInterface, UserGroupInterfac
|
||||
|
||||
public function store(array $data): Webhook
|
||||
{
|
||||
$secret = Str::random(24);
|
||||
$fullData = [
|
||||
$secret = Str::random(24);
|
||||
$fullData = [
|
||||
'user_id' => $this->user->id,
|
||||
'user_group_id' => $this->user->user_group_id,
|
||||
'active' => $data['active'] ?? false,
|
||||
'title' => $data['title'] ?? null,
|
||||
'trigger' => $data['trigger'],
|
||||
'response' => $data['response'],
|
||||
'delivery' => $data['delivery'],
|
||||
// 'trigger' => $data['trigger'],
|
||||
// 'response' => $data['response'],
|
||||
// 'delivery' => $data['delivery'],
|
||||
'trigger' => 1,
|
||||
'response' => 1,
|
||||
'delivery' => 1,
|
||||
'secret' => $secret,
|
||||
'url' => $data['url'],
|
||||
];
|
||||
|
||||
return Webhook::create($fullData);
|
||||
/** @var Webhook $webhook */
|
||||
$webhook = Webhook::create($fullData);
|
||||
$triggers = new Collection();
|
||||
$responses = new Collection();
|
||||
$deliveries = new Collection();
|
||||
|
||||
foreach ($data['triggers'] as $trigger) {
|
||||
// get the relevant ID:
|
||||
$object = WebhookTrigger::where('title', $trigger)->first();
|
||||
if (null === $object) {
|
||||
throw new FireflyException(sprintf('Could not find webhook trigger with title "%s".', $trigger));
|
||||
}
|
||||
$triggers->push($object);
|
||||
}
|
||||
$webhook->webhookTriggers()->saveMany($triggers);
|
||||
|
||||
foreach ($data['responses'] as $response) {
|
||||
// get the relevant ID:
|
||||
$object = WebhookResponse::where('title', $response)->first();
|
||||
if (null === $object) {
|
||||
throw new FireflyException(sprintf('Could not find webhook response with title "%s".', $response));
|
||||
}
|
||||
$responses->push($object);
|
||||
}
|
||||
$webhook->webhookResponses()->saveMany($responses);
|
||||
|
||||
foreach ($data['deliveries'] as $delivery) {
|
||||
// get the relevant ID:
|
||||
$object = WebhookDelivery::where('title', $delivery)->first();
|
||||
if (null === $object) {
|
||||
throw new FireflyException(sprintf('Could not find webhook delivery with title "%s".', $delivery));
|
||||
}
|
||||
$deliveries->push($object);
|
||||
}
|
||||
$webhook->webhookDeliveries()->saveMany($deliveries);
|
||||
|
||||
return $webhook;
|
||||
}
|
||||
|
||||
public function update(Webhook $webhook, array $data): Webhook
|
||||
{
|
||||
$webhook->active = $data['active'] ?? $webhook->active;
|
||||
$webhook->trigger = $data['trigger'] ?? $webhook->trigger;
|
||||
$webhook->response = $data['response'] ?? $webhook->response;
|
||||
$webhook->delivery = $data['delivery'] ?? $webhook->delivery;
|
||||
$webhook->title = $data['title'] ?? $webhook->title;
|
||||
$webhook->url = $data['url'] ?? $webhook->url;
|
||||
$webhook->active = $data['active'] ?? $webhook->active;
|
||||
$webhook->title = $data['title'] ?? $webhook->title;
|
||||
$webhook->url = $data['url'] ?? $webhook->url;
|
||||
|
||||
if (true === $data['secret']) {
|
||||
if (array_key_exists('secret', $data) && true === $data['secret']) {
|
||||
$secret = Str::random(24);
|
||||
$webhook->secret = $secret;
|
||||
}
|
||||
|
||||
$webhook->save();
|
||||
|
||||
$triggers = new Collection();
|
||||
$responses = new Collection();
|
||||
$deliveries = new Collection();
|
||||
|
||||
foreach ($data['triggers'] as $trigger) {
|
||||
// get the relevant ID:
|
||||
$object = WebhookTrigger::where('title', $trigger)->first();
|
||||
if (null === $object) {
|
||||
throw new FireflyException(sprintf('Could not find webhook trigger with title "%s".', $trigger));
|
||||
}
|
||||
$triggers->push($object);
|
||||
}
|
||||
$webhook->webhookTriggers()->sync($triggers);
|
||||
|
||||
foreach ($data['responses'] as $response) {
|
||||
// get the relevant ID:
|
||||
$object = WebhookResponse::where('title', $response)->first();
|
||||
if (null === $object) {
|
||||
throw new FireflyException(sprintf('Could not find webhook response with title "%s".', $response));
|
||||
}
|
||||
$responses->push($object);
|
||||
}
|
||||
$webhook->webhookResponses()->sync($responses);
|
||||
|
||||
foreach ($data['deliveries'] as $delivery) {
|
||||
// get the relevant ID:
|
||||
$object = WebhookDelivery::where('title', $delivery)->first();
|
||||
if (null === $object) {
|
||||
throw new FireflyException(sprintf('Could not find webhook delivery with title "%s".', $delivery));
|
||||
}
|
||||
$deliveries->push($object);
|
||||
}
|
||||
$webhook->webhookDeliveries()->sync($deliveries);
|
||||
|
||||
return $webhook;
|
||||
}
|
||||
}
|
||||
|
@@ -129,7 +129,7 @@ class RecurringEnrichment implements EnrichmentInterface
|
||||
$recurrence = $this->collection->filter(function (Recurrence $item) use ($repetition) {
|
||||
return (int)$item->id === (int)$repetition->recurrence_id;
|
||||
})->first();
|
||||
$fromDate = $recurrence->latest_date ?? $recurrence->first_date;
|
||||
$fromDate = clone ($recurrence->latest_date ?? $recurrence->first_date);
|
||||
$id = (int)$repetition->recurrence_id;
|
||||
$repId = (int)$repetition->id;
|
||||
$this->repetitions[$id] ??= [];
|
||||
@@ -137,6 +137,7 @@ class RecurringEnrichment implements EnrichmentInterface
|
||||
// get the (future) occurrences for this specific type of repetition:
|
||||
$amount = 'daily' === $repetition->repetition_type ? 9 : 5;
|
||||
$set = $repository->getXOccurrencesSince($repetition, $fromDate, now(config('app.timezone')), $amount);
|
||||
$occurrences = [];
|
||||
|
||||
/** @var Carbon $carbon */
|
||||
foreach ($set as $carbon) {
|
||||
|
143
app/Support/JsonApi/Enrichments/WebhookEnrichment.php
Normal file
143
app/Support/JsonApi/Enrichments/WebhookEnrichment.php
Normal file
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Support\JsonApi\Enrichments;
|
||||
|
||||
use FireflyIII\Enums\WebhookDelivery as WebhookDeliveryEnum;
|
||||
use FireflyIII\Enums\WebhookResponse as WebhookResponseEnum;
|
||||
use FireflyIII\Enums\WebhookTrigger as WebhookTriggerEnum;
|
||||
use FireflyIII\Models\UserGroup;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Models\WebhookDelivery;
|
||||
use FireflyIII\Models\WebhookResponse;
|
||||
use FireflyIII\Models\WebhookTrigger;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use stdClass;
|
||||
|
||||
class WebhookEnrichment implements EnrichmentInterface
|
||||
{
|
||||
private Collection $collection;
|
||||
private User $user;
|
||||
private UserGroup $userGroup;
|
||||
private array $ids = [];
|
||||
private array $deliveries = [];
|
||||
private array $responses = [];
|
||||
private array $triggers = [];
|
||||
|
||||
private array $webhookDeliveries = [];
|
||||
private array $webhookResponses = [];
|
||||
private array $webhookTriggers = [];
|
||||
|
||||
public function enrich(Collection $collection): Collection
|
||||
{
|
||||
$this->collection = $collection;
|
||||
if ($this->collection->count() > 0) {
|
||||
$this->collectIds();
|
||||
$this->collectInfo();
|
||||
$this->collectWebhookInfo();
|
||||
$this->appendCollectedInfo();
|
||||
}
|
||||
|
||||
return $this->collection;
|
||||
}
|
||||
|
||||
public function enrichSingle(array|Model $model): array|Model
|
||||
{
|
||||
Log::debug(__METHOD__);
|
||||
$collection = new Collection([$model]);
|
||||
$collection = $this->enrich($collection);
|
||||
|
||||
return $collection->first();
|
||||
}
|
||||
|
||||
public function setUser(User $user): void
|
||||
{
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
public function setUserGroup(UserGroup $userGroup): void
|
||||
{
|
||||
$this->userGroup = $userGroup;
|
||||
}
|
||||
|
||||
private function collectIds(): void
|
||||
{
|
||||
/** @var Webhook $webhook */
|
||||
foreach ($this->collection as $webhook) {
|
||||
$this->ids[] = $webhook->id;
|
||||
}
|
||||
$this->ids = array_unique($this->ids);
|
||||
}
|
||||
|
||||
private function collectInfo(): void
|
||||
{
|
||||
$all = WebhookDelivery::get();
|
||||
|
||||
/** @var WebhookDelivery $item */
|
||||
foreach ($all as $item) {
|
||||
$this->deliveries[$item->id] = $item->key;
|
||||
}
|
||||
$all = WebhookResponse::get();
|
||||
|
||||
/** @var WebhookResponse $item */
|
||||
foreach ($all as $item) {
|
||||
$this->responses[$item->id] = $item->key;
|
||||
}
|
||||
$all = WebhookTrigger::get();
|
||||
|
||||
/** @var WebhookTrigger $item */
|
||||
foreach ($all as $item) {
|
||||
$this->triggers[$item->id] = $item->key;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private function collectWebhookInfo(): void
|
||||
{
|
||||
$set = DB::table('webhook_webhook_delivery')->whereIn('webhook_id', $this->ids)->get(['webhook_id', 'webhook_delivery_id']);
|
||||
|
||||
/** @var stdClass $item */
|
||||
foreach ($set as $item) {
|
||||
$id = $item->webhook_id;
|
||||
$deliveryId = $item->webhook_delivery_id;
|
||||
$this->webhookDeliveries[$id][] = WebhookDeliveryEnum::from($this->deliveries[$deliveryId])->name;
|
||||
}
|
||||
|
||||
$set = DB::table('webhook_webhook_response')->whereIn('webhook_id', $this->ids)->get(['webhook_id', 'webhook_response_id']);
|
||||
|
||||
/** @var stdClass $item */
|
||||
foreach ($set as $item) {
|
||||
$id = $item->webhook_id;
|
||||
$responseId = $item->webhook_response_id;
|
||||
$this->webhookResponses[$id][] = WebhookResponseEnum::from($this->responses[$responseId])->name;
|
||||
}
|
||||
|
||||
$set = DB::table('webhook_webhook_trigger')->whereIn('webhook_id', $this->ids)->get(['webhook_id', 'webhook_trigger_id']);
|
||||
|
||||
/** @var stdClass $item */
|
||||
foreach ($set as $item) {
|
||||
$id = $item->webhook_id;
|
||||
$triggerId = $item->webhook_trigger_id;
|
||||
$this->webhookTriggers[$id][] = WebhookTriggerEnum::from($this->triggers[$triggerId])->name;
|
||||
}
|
||||
}
|
||||
|
||||
private function appendCollectedInfo(): void
|
||||
{
|
||||
$this->collection = $this->collection->map(function (Webhook $item) {
|
||||
$meta = [
|
||||
'deliveries' => $this->webhookDeliveries[$item->id] ?? [],
|
||||
'responses' => $this->webhookResponses[$item->id] ?? [],
|
||||
'triggers' => $this->webhookTriggers[$item->id] ?? [],
|
||||
];
|
||||
$item->meta = $meta;
|
||||
|
||||
return $item;
|
||||
});
|
||||
}
|
||||
}
|
@@ -255,7 +255,7 @@ trait ConvertsDataTypes
|
||||
if (10 === strlen((string) $value)) {
|
||||
// probably a date format.
|
||||
try {
|
||||
$carbon = Carbon::createFromFormat('Y-m-d', $value);
|
||||
$carbon = Carbon::createFromFormat('Y-m-d', $value, config('app.timezone'));
|
||||
} catch (InvalidDateException $e) { // @phpstan-ignore-line
|
||||
Log::error(sprintf('[1] "%s" is not a valid date: %s', $value, $e->getMessage()));
|
||||
|
||||
@@ -276,7 +276,7 @@ trait ConvertsDataTypes
|
||||
|
||||
// is an atom string, I hope?
|
||||
try {
|
||||
$carbon = Carbon::parse($value);
|
||||
$carbon = Carbon::parse($value, $value, config('app.timezone'));
|
||||
} catch (InvalidDateException $e) { // @phpstan-ignore-line
|
||||
Log::error(sprintf('[3] "%s" is not a valid date or time: %s', $value, $e->getMessage()));
|
||||
|
||||
|
74
app/Support/Request/ValidatesWebhooks.php
Normal file
74
app/Support/Request/ValidatesWebhooks.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Support\Request;
|
||||
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use Illuminate\Contracts\Validation\Validator;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
trait ValidatesWebhooks
|
||||
{
|
||||
public function withValidator(Validator $validator): void
|
||||
{
|
||||
$validator->after(
|
||||
function (Validator $validator): void {
|
||||
Log::debug('Validating webhook');
|
||||
if ($validator->failed()) {
|
||||
return;
|
||||
}
|
||||
$data = $validator->getData();
|
||||
$triggers = $data['triggers'] ?? [];
|
||||
$responses = $data['responses'] ?? [];
|
||||
|
||||
if (0 === count($triggers) || 0 === count($responses)) {
|
||||
Log::debug('No trigger or response, return.');
|
||||
|
||||
return;
|
||||
}
|
||||
$validTriggers = array_values(Webhook::getTriggers());
|
||||
$validResponses = array_values(Webhook::getResponses());
|
||||
$containsAny = false;
|
||||
$count = 0;
|
||||
foreach ($triggers as $trigger) {
|
||||
if (!in_array($trigger, $validTriggers, true)) {
|
||||
return;
|
||||
}
|
||||
++$count;
|
||||
if ($trigger === WebhookTrigger::ANY->name) {
|
||||
$containsAny = true;
|
||||
}
|
||||
}
|
||||
if ($containsAny && $count > 1) {
|
||||
$validator->errors()->add('triggers.0', trans('validation.only_any_trigger'));
|
||||
|
||||
return;
|
||||
}
|
||||
foreach ($responses as $response) {
|
||||
if (!in_array($response, $validResponses, true)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// some combinations are illegal.
|
||||
foreach ($triggers as $i => $trigger) {
|
||||
$forbidden = config(sprintf('webhooks.forbidden_responses.%s', $trigger));
|
||||
if (null === $forbidden) {
|
||||
$validator->errors()->add(sprintf('triggers.%d', $i), trans('validation.unknown_webhook_trigger', ['trigger' => $trigger]));
|
||||
|
||||
continue;
|
||||
}
|
||||
foreach ($responses as $ii => $response) {
|
||||
if (in_array($response, $forbidden, true)) {
|
||||
Log::debug(sprintf('Trigger %s and response %s are forbidden.', $trigger, $response));
|
||||
$validator->errors()->add(sprintf('responses.%d', $ii), trans('validation.bad_webhook_combination', ['trigger' => $trigger, 'response' => $response]));
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
@@ -51,9 +51,12 @@ class WebhookTransformer extends AbstractTransformer
|
||||
'active' => $webhook->active,
|
||||
'title' => $webhook->title,
|
||||
'secret' => $webhook->secret,
|
||||
'trigger' => $this->getEnum('trigger', $webhook->trigger),
|
||||
'response' => $this->getEnum('response', $webhook->response),
|
||||
'delivery' => $this->getEnum('delivery', $webhook->delivery),
|
||||
'triggers' => $webhook->meta['triggers'],
|
||||
'deliveries' => $webhook->meta['deliveries'],
|
||||
'responses' => $webhook->meta['responses'],
|
||||
// 'trigger' => $this->getEnum('trigger', $webhook->trigger),
|
||||
// 'response' => $this->getEnum('response', $webhook->response),
|
||||
// 'delivery' => $this->getEnum('delivery', $webhook->delivery),
|
||||
'url' => $webhook->url,
|
||||
'links' => [
|
||||
[
|
||||
|
180
composer.lock
generated
180
composer.lock
generated
@@ -4734,16 +4734,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpoption/phpoption",
|
||||
"version": "1.9.3",
|
||||
"version": "1.9.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/schmittjoh/php-option.git",
|
||||
"reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54"
|
||||
"reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54",
|
||||
"reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54",
|
||||
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d",
|
||||
"reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4751,7 +4751,7 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||
"phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
|
||||
"phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
@@ -4793,7 +4793,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/schmittjoh/php-option/issues",
|
||||
"source": "https://github.com/schmittjoh/php-option/tree/1.9.3"
|
||||
"source": "https://github.com/schmittjoh/php-option/tree/1.9.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4805,7 +4805,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-07-20T21:41:07+00:00"
|
||||
"time": "2025-08-21T11:53:16+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpseclib/phpseclib",
|
||||
@@ -7956,7 +7956,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||
@@ -8015,7 +8015,7 @@
|
||||
"portable"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8026,6 +8026,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -8035,16 +8039,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-grapheme",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
|
||||
"reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
||||
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
|
||||
"reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -8093,7 +8097,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8104,16 +8108,20 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2025-06-27T09:58:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-idn",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
||||
@@ -8176,7 +8184,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8187,6 +8195,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -8196,7 +8208,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-normalizer",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||
@@ -8257,7 +8269,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8268,6 +8280,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -8277,7 +8293,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||
@@ -8338,7 +8354,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8349,6 +8365,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -8358,7 +8378,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php80",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||
@@ -8418,7 +8438,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8429,6 +8449,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -8438,16 +8462,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php83",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php83.git",
|
||||
"reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
|
||||
"reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
|
||||
"reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5",
|
||||
"reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -8494,7 +8518,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8505,25 +8529,29 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2025-07-08T02:45:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php84",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php84.git",
|
||||
"reference": "000df7860439609837bbe28670b0be15783b7fbf"
|
||||
"reference": "d8ced4d875142b6a7426000426b8abc631d6b191"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf",
|
||||
"reference": "000df7860439609837bbe28670b0be15783b7fbf",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191",
|
||||
"reference": "d8ced4d875142b6a7426000426b8abc631d6b191",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -8570,7 +8598,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8581,25 +8609,29 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2025-02-20T12:04:08+00:00"
|
||||
"time": "2025-06-24T13:30:11+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php85",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php85.git",
|
||||
"reference": "6fedf31ce4e3648f4ff5ca58bfd53127d38f05fd"
|
||||
"reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/6fedf31ce4e3648f4ff5ca58bfd53127d38f05fd",
|
||||
"reference": "6fedf31ce4e3648f4ff5ca58bfd53127d38f05fd",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
|
||||
"reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -8646,7 +8678,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php85/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8657,16 +8689,20 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2025-05-02T08:40:52+00:00"
|
||||
"time": "2025-06-23T16:12:55+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-uuid",
|
||||
"version": "v1.32.0",
|
||||
"version": "v1.33.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-uuid.git",
|
||||
@@ -8725,7 +8761,7 @@
|
||||
"uuid"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0"
|
||||
"source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -8736,6 +8772,10 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
@@ -10348,16 +10388,16 @@
|
||||
},
|
||||
{
|
||||
"name": "composer/class-map-generator",
|
||||
"version": "1.6.1",
|
||||
"version": "1.6.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/class-map-generator.git",
|
||||
"reference": "134b705ddb0025d397d8318a75825fe3c9d1da34"
|
||||
"reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/class-map-generator/zipball/134b705ddb0025d397d8318a75825fe3c9d1da34",
|
||||
"reference": "134b705ddb0025d397d8318a75825fe3c9d1da34",
|
||||
"url": "https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076",
|
||||
"reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -10401,7 +10441,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/composer/class-map-generator/issues",
|
||||
"source": "https://github.com/composer/class-map-generator/tree/1.6.1"
|
||||
"source": "https://github.com/composer/class-map-generator/tree/1.6.2"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -10411,13 +10451,9 @@
|
||||
{
|
||||
"url": "https://github.com/composer",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2025-03-24T13:50:44+00:00"
|
||||
"time": "2025-08-20T18:52:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/pcre",
|
||||
@@ -10500,16 +10536,16 @@
|
||||
},
|
||||
{
|
||||
"name": "driftingly/rector-laravel",
|
||||
"version": "2.0.6",
|
||||
"version": "2.0.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/driftingly/rector-laravel.git",
|
||||
"reference": "5be95811801fc06126dd844beaeb6a41721ba3d3"
|
||||
"reference": "625dc02cee08d47ecf0ac86de2f02a55026cf34e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/5be95811801fc06126dd844beaeb6a41721ba3d3",
|
||||
"reference": "5be95811801fc06126dd844beaeb6a41721ba3d3",
|
||||
"url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/625dc02cee08d47ecf0ac86de2f02a55026cf34e",
|
||||
"reference": "625dc02cee08d47ecf0ac86de2f02a55026cf34e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -10529,9 +10565,9 @@
|
||||
"description": "Rector upgrades rules for Laravel Framework",
|
||||
"support": {
|
||||
"issues": "https://github.com/driftingly/rector-laravel/issues",
|
||||
"source": "https://github.com/driftingly/rector-laravel/tree/2.0.6"
|
||||
"source": "https://github.com/driftingly/rector-laravel/tree/2.0.7"
|
||||
},
|
||||
"time": "2025-08-08T22:10:01+00:00"
|
||||
"time": "2025-08-19T20:49:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
@@ -11771,16 +11807,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "12.3.5",
|
||||
"version": "12.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "f10ba5f12a256026ad3c7ee4894ffe47f60d7dc7"
|
||||
"reference": "a2cab3224f687150ac2f3cc13d99b64ba1e1d088"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f10ba5f12a256026ad3c7ee4894ffe47f60d7dc7",
|
||||
"reference": "f10ba5f12a256026ad3c7ee4894ffe47f60d7dc7",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a2cab3224f687150ac2f3cc13d99b64ba1e1d088",
|
||||
"reference": "a2cab3224f687150ac2f3cc13d99b64ba1e1d088",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -11800,7 +11836,7 @@
|
||||
"phpunit/php-text-template": "^5.0.0",
|
||||
"phpunit/php-timer": "^8.0.0",
|
||||
"sebastian/cli-parser": "^4.0.0",
|
||||
"sebastian/comparator": "^7.1.2",
|
||||
"sebastian/comparator": "^7.1.3",
|
||||
"sebastian/diff": "^7.0.0",
|
||||
"sebastian/environment": "^8.0.3",
|
||||
"sebastian/exporter": "^7.0.0",
|
||||
@@ -11848,7 +11884,7 @@
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.3.5"
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.3.6"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -11872,7 +11908,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2025-08-16T05:20:09+00:00"
|
||||
"time": "2025-08-20T14:43:23+00:00"
|
||||
},
|
||||
{
|
||||
"name": "rector/rector",
|
||||
@@ -11993,16 +12029,16 @@
|
||||
},
|
||||
{
|
||||
"name": "sebastian/comparator",
|
||||
"version": "7.1.2",
|
||||
"version": "7.1.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/comparator.git",
|
||||
"reference": "1a7c2bce03a13a457ed3c975dfd331b3b4b133aa"
|
||||
"reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1a7c2bce03a13a457ed3c975dfd331b3b4b133aa",
|
||||
"reference": "1a7c2bce03a13a457ed3c975dfd331b3b4b133aa",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148",
|
||||
"reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -12061,7 +12097,7 @@
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/comparator/issues",
|
||||
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
|
||||
"source": "https://github.com/sebastianbergmann/comparator/tree/7.1.2"
|
||||
"source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -12081,7 +12117,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2025-08-10T08:50:08+00:00"
|
||||
"time": "2025-08-20T11:27:00+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/complexity",
|
||||
|
@@ -78,8 +78,8 @@ return [
|
||||
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
||||
// see cer.php for exchange rates feature flag.
|
||||
],
|
||||
'version' => '6.3.2',
|
||||
'build_time' => 1755576388,
|
||||
'version' => 'develop/2025-08-22',
|
||||
'build_time' => 1755838953,
|
||||
'api_version' => '2.1.0', // field is no longer used.
|
||||
'db_version' => 26,
|
||||
|
||||
|
@@ -248,6 +248,7 @@ return [
|
||||
'multi_account_warning_deposit',
|
||||
'multi_account_warning_transfer',
|
||||
|
||||
'webhook_trigger_ANY',
|
||||
'webhook_trigger_STORE_TRANSACTION',
|
||||
'webhook_trigger_UPDATE_TRANSACTION',
|
||||
'webhook_trigger_DESTROY_TRANSACTION',
|
||||
@@ -258,6 +259,7 @@ return [
|
||||
'webhook_trigger_STORE_UPDATE_BUDGET_LIMIT',
|
||||
|
||||
'webhook_response_TRANSACTIONS',
|
||||
'webhook_response_RELEVANT',
|
||||
'webhook_response_ACCOUNTS',
|
||||
'webhook_response_NONE',
|
||||
'webhook_delivery_JSON',
|
||||
|
86
config/webhooks.php
Normal file
86
config/webhooks.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
// this is hard coded, which is unfortunate.
|
||||
|
||||
use FireflyIII\Enums\WebhookResponse;
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
|
||||
return [
|
||||
'force_relevant_response' => [
|
||||
WebhookTrigger::STORE_TRANSACTION->name => [
|
||||
WebhookTrigger::STORE_BUDGET->name,
|
||||
WebhookTrigger::UPDATE_BUDGET->name,
|
||||
WebhookTrigger::DESTROY_BUDGET->name,
|
||||
WebhookTrigger::STORE_UPDATE_BUDGET_LIMIT->name,
|
||||
|
||||
],
|
||||
WebhookTrigger::UPDATE_TRANSACTION->name => [
|
||||
WebhookTrigger::STORE_BUDGET->name,
|
||||
WebhookTrigger::UPDATE_BUDGET->name,
|
||||
WebhookTrigger::DESTROY_BUDGET->name,
|
||||
WebhookTrigger::STORE_UPDATE_BUDGET_LIMIT->name,
|
||||
],
|
||||
WebhookTrigger::DESTROY_TRANSACTION->name => [
|
||||
WebhookTrigger::STORE_BUDGET->name,
|
||||
WebhookTrigger::UPDATE_BUDGET->name,
|
||||
WebhookTrigger::DESTROY_BUDGET->name,
|
||||
WebhookTrigger::STORE_UPDATE_BUDGET_LIMIT->name,
|
||||
],
|
||||
WebhookTrigger::STORE_BUDGET->name => [
|
||||
WebhookTrigger::STORE_TRANSACTION->name,
|
||||
WebhookTrigger::UPDATE_TRANSACTION->name,
|
||||
WebhookTrigger::DESTROY_TRANSACTION->name,
|
||||
|
||||
],
|
||||
WebhookTrigger::UPDATE_BUDGET->name => [
|
||||
WebhookTrigger::STORE_TRANSACTION->name,
|
||||
WebhookTrigger::UPDATE_TRANSACTION->name,
|
||||
WebhookTrigger::DESTROY_TRANSACTION->name,
|
||||
],
|
||||
WebhookTrigger::DESTROY_BUDGET->name => [
|
||||
WebhookTrigger::STORE_TRANSACTION->name,
|
||||
WebhookTrigger::UPDATE_TRANSACTION->name,
|
||||
WebhookTrigger::DESTROY_TRANSACTION->name,
|
||||
],
|
||||
WebhookTrigger::STORE_UPDATE_BUDGET_LIMIT->name => [
|
||||
WebhookTrigger::STORE_TRANSACTION->name,
|
||||
WebhookTrigger::UPDATE_TRANSACTION->name,
|
||||
WebhookTrigger::DESTROY_TRANSACTION->name,
|
||||
],
|
||||
],
|
||||
'forbidden_responses' => [
|
||||
WebhookTrigger::ANY->name => [
|
||||
WebhookResponse::BUDGET->name,
|
||||
WebhookResponse::TRANSACTIONS->name,
|
||||
WebhookResponse::ACCOUNTS->name,
|
||||
],
|
||||
WebhookTrigger::STORE_TRANSACTION->name => [
|
||||
WebhookResponse::BUDGET->name,
|
||||
],
|
||||
WebhookTrigger::UPDATE_TRANSACTION->name => [
|
||||
WebhookResponse::BUDGET->name,
|
||||
],
|
||||
WebhookTrigger::DESTROY_TRANSACTION->name => [
|
||||
WebhookResponse::BUDGET->name,
|
||||
],
|
||||
WebhookTrigger::STORE_BUDGET->name => [
|
||||
WebhookResponse::TRANSACTIONS->name,
|
||||
WebhookResponse::ACCOUNTS->name,
|
||||
|
||||
],
|
||||
WebhookTrigger::UPDATE_BUDGET->name => [
|
||||
WebhookResponse::TRANSACTIONS->name,
|
||||
WebhookResponse::ACCOUNTS->name,
|
||||
],
|
||||
WebhookTrigger::DESTROY_BUDGET->name => [
|
||||
WebhookResponse::TRANSACTIONS->name,
|
||||
WebhookResponse::ACCOUNTS->name,
|
||||
],
|
||||
WebhookTrigger::STORE_UPDATE_BUDGET_LIMIT->name => [
|
||||
WebhookResponse::TRANSACTIONS->name,
|
||||
WebhookResponse::ACCOUNTS->name,
|
||||
],
|
||||
],
|
||||
];
|
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration {
|
||||
private const TABLE_ALREADY_EXISTS = 'If this table exists already (see the error message), this is not a problem. Other errors? Please open a discussion on GitHub.';
|
||||
private const TABLE_ERROR = 'Could not create table "%s": %s';
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
if (!Schema::hasTable('webhook_triggers')) {
|
||||
Schema::create('webhook_triggers', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->timestamps();
|
||||
$table->smallInteger('key')->unsigned();
|
||||
$table->string('title', 100);
|
||||
$table->unique(['key', 'title']);
|
||||
});
|
||||
}
|
||||
if (!Schema::hasTable('webhook_responses')) {
|
||||
Schema::create('webhook_responses', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->timestamps();
|
||||
$table->smallInteger('key')->unsigned();
|
||||
$table->string('title', 100);
|
||||
$table->unique(['key', 'title']);
|
||||
});
|
||||
}
|
||||
if (!Schema::hasTable('webhook_deliveries')) {
|
||||
Schema::create('webhook_deliveries', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->timestamps();
|
||||
$table->smallInteger('key')->unsigned();
|
||||
$table->string('title', 100);
|
||||
$table->unique(['key', 'title']);
|
||||
});
|
||||
}
|
||||
|
||||
// webhook_webhook_trigger
|
||||
if (!Schema::hasTable('webhook_webhook_trigger')) {
|
||||
try {
|
||||
Schema::create(
|
||||
'webhook_webhook_trigger',
|
||||
static function (Blueprint $table): void {
|
||||
$table->increments('id');
|
||||
$table->integer('webhook_id', false, true);
|
||||
$table->bigInteger('webhook_trigger_id', false, true);
|
||||
$table->foreign('webhook_id')->references('id')->on('webhooks')->onDelete('cascade');
|
||||
$table->foreign('webhook_trigger_id','link_to_trigger')->references('id')->on('webhook_triggers')->onDelete('cascade');
|
||||
|
||||
// unique combi:
|
||||
$table->unique(['webhook_id', 'webhook_trigger_id']);
|
||||
}
|
||||
);
|
||||
} catch (QueryException $e) {
|
||||
app('log')->error(sprintf(self::TABLE_ERROR, 'webhook_webhook_trigger', $e->getMessage()));
|
||||
app('log')->error(self::TABLE_ALREADY_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// webhook_webhook_response
|
||||
if (!Schema::hasTable('webhook_webhook_response')) {
|
||||
try {
|
||||
Schema::create(
|
||||
'webhook_webhook_response',
|
||||
static function (Blueprint $table): void {
|
||||
$table->increments('id');
|
||||
$table->integer('webhook_id', false, true);
|
||||
$table->bigInteger('webhook_response_id', false, true);
|
||||
$table->foreign('webhook_id')->references('id')->on('webhooks')->onDelete('cascade');
|
||||
$table->foreign('webhook_response_id','link_to_response')->references('id')->on('webhook_responses')->onDelete('cascade');
|
||||
|
||||
// unique combi:
|
||||
$table->unique(['webhook_id', 'webhook_response_id']);
|
||||
}
|
||||
);
|
||||
} catch (QueryException $e) {
|
||||
app('log')->error(sprintf(self::TABLE_ERROR, 'webhook_webhook_response', $e->getMessage()));
|
||||
app('log')->error(self::TABLE_ALREADY_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
// webhook_webhook_delivery
|
||||
if (!Schema::hasTable('webhook_webhook_delivery')) {
|
||||
try {
|
||||
Schema::create(
|
||||
'webhook_webhook_delivery',
|
||||
static function (Blueprint $table): void {
|
||||
$table->increments('id');
|
||||
$table->integer('webhook_id', false, true);
|
||||
$table->bigInteger('webhook_delivery_id', false, true);
|
||||
$table->foreign('webhook_id')->references('id')->on('webhooks')->onDelete('cascade');
|
||||
$table->foreign('webhook_delivery_id','link_to_delivery')->references('id')->on('webhook_deliveries')->onDelete('cascade');
|
||||
|
||||
// unique combi:
|
||||
$table->unique(['webhook_id', 'webhook_delivery_id']);
|
||||
}
|
||||
);
|
||||
} catch (QueryException $e) {
|
||||
app('log')->error(sprintf(self::TABLE_ERROR, 'webhook_webhook_delivery', $e->getMessage()));
|
||||
app('log')->error(self::TABLE_ALREADY_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('webhook_webhook_delivery');
|
||||
Schema::dropIfExists('webhook_webhook_trigger');
|
||||
Schema::dropIfExists('webhook_webhook_response');
|
||||
|
||||
Schema::dropIfExists('webhook_triggers');
|
||||
Schema::dropIfExists('webhook_responses');
|
||||
Schema::dropIfExists('webhook_deliveries');
|
||||
}
|
||||
};
|
@@ -35,25 +35,10 @@ class AccountTypeSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$types = [
|
||||
AccountTypeEnum::DEFAULT->value,
|
||||
AccountTypeEnum::CASH->value,
|
||||
AccountTypeEnum::ASSET->value,
|
||||
AccountTypeEnum::EXPENSE->value,
|
||||
AccountTypeEnum::REVENUE->value,
|
||||
AccountTypeEnum::INITIAL_BALANCE->value,
|
||||
AccountTypeEnum::BENEFICIARY->value,
|
||||
AccountTypeEnum::IMPORT->value,
|
||||
AccountTypeEnum::LOAN->value,
|
||||
AccountTypeEnum::RECONCILIATION->value,
|
||||
AccountTypeEnum::DEBT->value,
|
||||
AccountTypeEnum::MORTGAGE->value,
|
||||
AccountTypeEnum::LIABILITY_CREDIT->value,
|
||||
];
|
||||
foreach ($types as $type) {
|
||||
if (null === AccountType::where('type', $type)->first()) {
|
||||
foreach(AccountTypeEnum::cases() as $type) {
|
||||
if (null === AccountType::where('type', $type->value)->first()) {
|
||||
try {
|
||||
AccountType::create(['type' => $type]);
|
||||
AccountType::create(['type' => $type->value]);
|
||||
} catch (PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
|
@@ -43,5 +43,6 @@ class DatabaseSeeder extends Seeder
|
||||
$this->call(ConfigSeeder::class);
|
||||
$this->call(UserRoleSeeder::class);
|
||||
$this->call(ExchangeRateSeeder::class);
|
||||
$this->call(WebhookDataSeeder::class);
|
||||
}
|
||||
}
|
||||
|
@@ -35,24 +35,17 @@ class TransactionTypeSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$types = [
|
||||
TransactionTypeEnum::WITHDRAWAL->value,
|
||||
TransactionTypeEnum::DEPOSIT->value,
|
||||
TransactionTypeEnum::TRANSFER->value,
|
||||
TransactionTypeEnum::OPENING_BALANCE->value,
|
||||
TransactionTypeEnum::RECONCILIATION->value,
|
||||
TransactionTypeEnum::INVALID->value,
|
||||
TransactionTypeEnum::LIABILITY_CREDIT->value,
|
||||
];
|
||||
|
||||
foreach ($types as $type) {
|
||||
if (null === TransactionType::where('type', $type)->first()) {
|
||||
/** @var TransactionTypeEnum $type */
|
||||
foreach (TransactionTypeEnum::cases() as $type) {
|
||||
if (null === TransactionType::where('type', $type->value)->first()) {
|
||||
try {
|
||||
TransactionType::create(['type' => $type]);
|
||||
TransactionType::create(['type' => $type->value]);
|
||||
} catch (PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -39,16 +39,11 @@ class UserRoleSeeder extends Seeder
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$roles = [];
|
||||
/** @var UserRoleEnum $role */
|
||||
foreach (UserRoleEnum::cases() as $role) {
|
||||
$roles[] = $role->value;
|
||||
}
|
||||
|
||||
/** @var string $role */
|
||||
foreach ($roles as $role) {
|
||||
if (null === UserRole::where('title', $role)->first()) {
|
||||
if (null === UserRole::where('title', $role->value)->first()) {
|
||||
try {
|
||||
UserRole::create(['title' => $role]);
|
||||
UserRole::create(['title' => $role->value]);
|
||||
} catch (PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
|
48
database/seeders/WebhookDataSeeder.php
Normal file
48
database/seeders/WebhookDataSeeder.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
use FireflyIII\Enums\WebhookResponse;
|
||||
use FireflyIII\Enums\WebhookDelivery;
|
||||
use FireflyIII\Models\WebhookTrigger as WebhookTriggerModel;
|
||||
use FireflyIII\Models\WebhookResponse as WebhookResponseModel;
|
||||
use FireflyIII\Models\WebhookDelivery as WebhookDeliveryModel;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class WebhookDataSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
foreach (WebhookTrigger::cases() as $trigger) {
|
||||
if (null === WebhookTriggerModel::where('key', $trigger->value)->where('title', $trigger->name)->first()) {
|
||||
try {
|
||||
WebhookTriggerModel::create(['key' => $trigger->value, 'title' => $trigger->name]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (WebhookResponse::cases() as $response) {
|
||||
if (null === WebhookResponseModel::where('key', $response->value)->where('title', $response->name)->first()) {
|
||||
try {
|
||||
WebhookResponseModel::create(['key' => $response->value, 'title' => $response->name]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (WebhookDelivery::cases() as $delivery) {
|
||||
if (null === WebhookDeliveryModel::where('key', $delivery->value)->where('title', $delivery->name)->first()) {
|
||||
try {
|
||||
WebhookDeliveryModel::create(['key' => $delivery->value, 'title' => $delivery->name]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
266
package-lock.json
generated
266
package-lock.json
generated
@@ -2592,9 +2592,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.3.tgz",
|
||||
"integrity": "sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.47.1.tgz",
|
||||
"integrity": "sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -2606,9 +2606,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm64": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.3.tgz",
|
||||
"integrity": "sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.47.1.tgz",
|
||||
"integrity": "sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -2620,9 +2620,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.3.tgz",
|
||||
"integrity": "sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.47.1.tgz",
|
||||
"integrity": "sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -2634,9 +2634,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-x64": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.3.tgz",
|
||||
"integrity": "sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.47.1.tgz",
|
||||
"integrity": "sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -2648,9 +2648,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-freebsd-arm64": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.3.tgz",
|
||||
"integrity": "sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.47.1.tgz",
|
||||
"integrity": "sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -2662,9 +2662,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-freebsd-x64": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.3.tgz",
|
||||
"integrity": "sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.47.1.tgz",
|
||||
"integrity": "sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -2676,9 +2676,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.3.tgz",
|
||||
"integrity": "sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.47.1.tgz",
|
||||
"integrity": "sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -2690,9 +2690,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.3.tgz",
|
||||
"integrity": "sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.47.1.tgz",
|
||||
"integrity": "sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -2704,9 +2704,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.3.tgz",
|
||||
"integrity": "sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.47.1.tgz",
|
||||
"integrity": "sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -2718,9 +2718,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.3.tgz",
|
||||
"integrity": "sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.47.1.tgz",
|
||||
"integrity": "sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -2732,9 +2732,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.3.tgz",
|
||||
"integrity": "sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.47.1.tgz",
|
||||
"integrity": "sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
@@ -2746,9 +2746,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.3.tgz",
|
||||
"integrity": "sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.47.1.tgz",
|
||||
"integrity": "sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@@ -2760,9 +2760,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.3.tgz",
|
||||
"integrity": "sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.47.1.tgz",
|
||||
"integrity": "sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@@ -2774,9 +2774,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-riscv64-musl": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.3.tgz",
|
||||
"integrity": "sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.47.1.tgz",
|
||||
"integrity": "sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@@ -2788,9 +2788,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.3.tgz",
|
||||
"integrity": "sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.47.1.tgz",
|
||||
"integrity": "sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@@ -2802,9 +2802,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.3.tgz",
|
||||
"integrity": "sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.47.1.tgz",
|
||||
"integrity": "sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -2816,9 +2816,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.3.tgz",
|
||||
"integrity": "sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.47.1.tgz",
|
||||
"integrity": "sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -2830,9 +2830,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.3.tgz",
|
||||
"integrity": "sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.47.1.tgz",
|
||||
"integrity": "sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -2844,9 +2844,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.3.tgz",
|
||||
"integrity": "sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.47.1.tgz",
|
||||
"integrity": "sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -2858,9 +2858,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.3.tgz",
|
||||
"integrity": "sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.47.1.tgz",
|
||||
"integrity": "sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -3158,9 +3158,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node-forge": {
|
||||
"version": "1.3.13",
|
||||
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.13.tgz",
|
||||
"integrity": "sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww==",
|
||||
"version": "1.3.14",
|
||||
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz",
|
||||
"integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -3256,42 +3256,42 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-core": {
|
||||
"version": "3.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
|
||||
"integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
|
||||
"version": "3.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.19.tgz",
|
||||
"integrity": "sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.28.0",
|
||||
"@vue/shared": "3.5.18",
|
||||
"@babel/parser": "^7.28.3",
|
||||
"@vue/shared": "3.5.19",
|
||||
"entities": "^4.5.0",
|
||||
"estree-walker": "^2.0.2",
|
||||
"source-map-js": "^1.2.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-dom": {
|
||||
"version": "3.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
|
||||
"integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
|
||||
"version": "3.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.19.tgz",
|
||||
"integrity": "sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/compiler-core": "3.5.18",
|
||||
"@vue/shared": "3.5.18"
|
||||
"@vue/compiler-core": "3.5.19",
|
||||
"@vue/shared": "3.5.19"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-sfc": {
|
||||
"version": "3.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
|
||||
"integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
|
||||
"version": "3.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.19.tgz",
|
||||
"integrity": "sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.28.0",
|
||||
"@vue/compiler-core": "3.5.18",
|
||||
"@vue/compiler-dom": "3.5.18",
|
||||
"@vue/compiler-ssr": "3.5.18",
|
||||
"@vue/shared": "3.5.18",
|
||||
"@babel/parser": "^7.28.3",
|
||||
"@vue/compiler-core": "3.5.19",
|
||||
"@vue/compiler-dom": "3.5.19",
|
||||
"@vue/compiler-ssr": "3.5.19",
|
||||
"@vue/shared": "3.5.19",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.30.17",
|
||||
"postcss": "^8.5.6",
|
||||
@@ -3299,14 +3299,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-ssr": {
|
||||
"version": "3.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
|
||||
"integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
|
||||
"version": "3.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.19.tgz",
|
||||
"integrity": "sha512-/wx0VZtkWOPdiQLWPeQeqpHWR/LuNC7bHfSX7OayBTtUy8wur6vT6EQIX6Et86aED6J+y8tTw43qo2uoqGg5sw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.5.18",
|
||||
"@vue/shared": "3.5.18"
|
||||
"@vue/compiler-dom": "3.5.19",
|
||||
"@vue/shared": "3.5.19"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/component-compiler-utils": {
|
||||
@@ -3388,9 +3388,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@vue/shared": {
|
||||
"version": "3.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz",
|
||||
"integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
|
||||
"version": "3.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.19.tgz",
|
||||
"integrity": "sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -4486,9 +4486,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001735",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz",
|
||||
"integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==",
|
||||
"version": "1.0.30001736",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001736.tgz",
|
||||
"integrity": "sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -4930,13 +4930,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/core-js-compat": {
|
||||
"version": "3.45.0",
|
||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.0.tgz",
|
||||
"integrity": "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==",
|
||||
"version": "3.45.1",
|
||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz",
|
||||
"integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.25.1"
|
||||
"browserslist": "^4.25.3"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
@@ -5700,9 +5700,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/electron-to-chromium": {
|
||||
"version": "1.5.205",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.205.tgz",
|
||||
"integrity": "sha512-gBtbT7IgOHu7CwdtIiXwbNRD1l6oG6GAyanmwMCLVqaoGy92Jfe1dSHLiSj8xUEZNxOTIVlXuaAalMMD+S4y0w==",
|
||||
"version": "1.5.208",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz",
|
||||
"integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
@@ -7052,9 +7052,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/i18next": {
|
||||
"version": "25.3.6",
|
||||
"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.3.6.tgz",
|
||||
"integrity": "sha512-dThZ0CTCM3sUG/qS0ZtQYZQcUI6DtBN8yBHK+SKEqihPcEYmjVWh/YJ4luic73Iq6Uxhp6q7LJJntRK5+1t7jQ==",
|
||||
"version": "25.4.0",
|
||||
"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.4.0.tgz",
|
||||
"integrity": "sha512-UH5aiamXsO3cfrZFurCHiB6YSs3C+s+XY9UaJllMMSbmaoXILxFgqDEZu4NbfzJFjmUo3BNMa++Rjkr3ofjfLw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
@@ -7958,13 +7958,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.30.17",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
|
||||
"integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
|
||||
"version": "0.30.18",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz",
|
||||
"integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0"
|
||||
"@jridgewell/sourcemap-codec": "^1.5.5"
|
||||
}
|
||||
},
|
||||
"node_modules/make-dir": {
|
||||
@@ -10123,9 +10123,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/rollup": {
|
||||
"version": "4.46.3",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.3.tgz",
|
||||
"integrity": "sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==",
|
||||
"version": "4.47.1",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.47.1.tgz",
|
||||
"integrity": "sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -10139,26 +10139,26 @@
|
||||
"npm": ">=8.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@rollup/rollup-android-arm-eabi": "4.46.3",
|
||||
"@rollup/rollup-android-arm64": "4.46.3",
|
||||
"@rollup/rollup-darwin-arm64": "4.46.3",
|
||||
"@rollup/rollup-darwin-x64": "4.46.3",
|
||||
"@rollup/rollup-freebsd-arm64": "4.46.3",
|
||||
"@rollup/rollup-freebsd-x64": "4.46.3",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.46.3",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.46.3",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.46.3",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.46.3",
|
||||
"@rollup/rollup-linux-loongarch64-gnu": "4.46.3",
|
||||
"@rollup/rollup-linux-ppc64-gnu": "4.46.3",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.46.3",
|
||||
"@rollup/rollup-linux-riscv64-musl": "4.46.3",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.46.3",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.46.3",
|
||||
"@rollup/rollup-linux-x64-musl": "4.46.3",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.46.3",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.46.3",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.46.3",
|
||||
"@rollup/rollup-android-arm-eabi": "4.47.1",
|
||||
"@rollup/rollup-android-arm64": "4.47.1",
|
||||
"@rollup/rollup-darwin-arm64": "4.47.1",
|
||||
"@rollup/rollup-darwin-x64": "4.47.1",
|
||||
"@rollup/rollup-freebsd-arm64": "4.47.1",
|
||||
"@rollup/rollup-freebsd-x64": "4.47.1",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.47.1",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.47.1",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.47.1",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.47.1",
|
||||
"@rollup/rollup-linux-loongarch64-gnu": "4.47.1",
|
||||
"@rollup/rollup-linux-ppc64-gnu": "4.47.1",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.47.1",
|
||||
"@rollup/rollup-linux-riscv64-musl": "4.47.1",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.47.1",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.47.1",
|
||||
"@rollup/rollup-linux-x64-musl": "4.47.1",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.47.1",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.47.1",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.47.1",
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
@@ -11527,14 +11527,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.2.tgz",
|
||||
"integrity": "sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==",
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz",
|
||||
"integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
"fdir": "^6.4.6",
|
||||
"fdir": "^6.5.0",
|
||||
"picomatch": "^4.0.3",
|
||||
"postcss": "^8.5.6",
|
||||
"rollup": "^4.43.0",
|
||||
|
@@ -68,7 +68,7 @@ export default {
|
||||
}
|
||||
},
|
||||
value: {
|
||||
type: Number,
|
||||
type: String,
|
||||
required: true,
|
||||
}
|
||||
},
|
||||
@@ -84,7 +84,7 @@ export default {
|
||||
}
|
||||
this.deliveries.push(
|
||||
{
|
||||
id: response.data.data.value[key],
|
||||
id: key,
|
||||
name: this.$t('firefly.webhook_delivery_' + key),
|
||||
}
|
||||
);
|
||||
|
@@ -66,7 +66,7 @@ export default {
|
||||
}
|
||||
},
|
||||
value: {
|
||||
type: Number,
|
||||
type: String,
|
||||
required: true,
|
||||
}
|
||||
},
|
||||
@@ -88,7 +88,7 @@ export default {
|
||||
}
|
||||
this.responses.push(
|
||||
{
|
||||
id: response.data.data.value[key],
|
||||
id: key,
|
||||
name: this.$t('firefly.webhook_response_' + key),
|
||||
}
|
||||
);
|
||||
|
@@ -29,6 +29,7 @@
|
||||
</div>
|
||||
<select v-if="!loading"
|
||||
ref="trigger"
|
||||
multiple
|
||||
v-model="trigger"
|
||||
:title="$t('form.webhook_trigger')"
|
||||
class="form-control"
|
||||
@@ -52,7 +53,7 @@ export default {
|
||||
name: "WebhookTrigger",
|
||||
data() {
|
||||
return {
|
||||
trigger: 0,
|
||||
trigger: [],
|
||||
loading: true,
|
||||
triggers: [],
|
||||
};
|
||||
@@ -66,7 +67,7 @@ export default {
|
||||
}
|
||||
},
|
||||
value: {
|
||||
type: Number,
|
||||
type: Array,
|
||||
required: true,
|
||||
}
|
||||
},
|
||||
@@ -80,11 +81,11 @@ export default {
|
||||
}
|
||||
this.triggers.push(
|
||||
{
|
||||
id: response.data.data.value[key],
|
||||
id: key,
|
||||
name: this.$t('firefly.webhook_trigger_' + key),
|
||||
}
|
||||
);
|
||||
console.log('webhook trigger: id=' + response.data.data.value[key] + ', name=' + key);
|
||||
// console.log('webhook trigger: id=' + response.data.data.value[key] + ', name=' + key);
|
||||
}
|
||||
this.loading = false;
|
||||
}).catch((error) => {
|
||||
|
@@ -112,12 +112,10 @@ export default {
|
||||
amount: this.$refs.amount.value,
|
||||
currency_id: this.$refs.currency_select.value,
|
||||
};
|
||||
// console.log(obj);
|
||||
this.$emit('input', obj
|
||||
);
|
||||
this.$emit('input', obj);
|
||||
},
|
||||
changeData: function () {
|
||||
// console.log('ForeignAmountSelect changeData');
|
||||
console.log('ForeignAmountSelect changeData');
|
||||
this.enabledCurrencies = [];
|
||||
let destType = this.destination.type ? this.destination.type.toLowerCase() : 'invalid';
|
||||
let srcType = this.source.type ? this.source.type.toLowerCase() : 'invalid';
|
||||
@@ -160,6 +158,7 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.checkSelection();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -172,6 +171,7 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.checkSelection();
|
||||
return;
|
||||
}
|
||||
for (const key in this.currencies) {
|
||||
@@ -180,6 +180,23 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
checkSelection: function () {
|
||||
let selectedCurrency = this.$refs.currency_select.value;
|
||||
let hasSelected = false;
|
||||
for(const key in this.enabledCurrencies) {
|
||||
if(parseInt(this.enabledCurrencies[key].id) === parseInt(selectedCurrency)) {
|
||||
hasSelected = true;
|
||||
}
|
||||
}
|
||||
if(false === hasSelected) {
|
||||
let obj = {
|
||||
amount: '',
|
||||
currency_id: null,
|
||||
};
|
||||
this.$emit('input', obj);
|
||||
console.warn('Reset foreign amount.');
|
||||
}
|
||||
},
|
||||
loadCurrencies: function () {
|
||||
// console.log('loadCurrencies');
|
||||
// reset list of currencies:
|
||||
|
@@ -54,12 +54,12 @@
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<Title :value=this.title :error="errors.title" v-on:input="title = $event"></Title>
|
||||
<WebhookTrigger :value=this.trigger :error="errors.trigger"
|
||||
v-on:input="trigger = $event"></WebhookTrigger>
|
||||
<WebhookResponse :value=this.response :error="errors.response"
|
||||
v-on:input="response = $event"></WebhookResponse>
|
||||
<WebhookDelivery :value=this.delivery :error="errors.delivery"
|
||||
v-on:input="delivery = $event"></WebhookDelivery>
|
||||
<WebhookTrigger :value=this.triggers :error="errors.trigger"
|
||||
v-on:input="triggers = $event"></WebhookTrigger>
|
||||
<WebhookResponse :value=this.responses :error="errors.response"
|
||||
v-on:input="responses = $event"></WebhookResponse>
|
||||
<WebhookDelivery :value=this.deliveries :error="errors.delivery"
|
||||
v-on:input="deliveries = $event"></WebhookDelivery>
|
||||
<URL :value=this.url :error="errors.url" v-on:input="url = $event"></URL>
|
||||
<Checkbox :value=this.active :error="errors.active" help="ACTIVE HELP TODO" :title="$t('form.active')" v-on:input="active = $event"></Checkbox>
|
||||
</div>
|
||||
@@ -96,16 +96,16 @@ export default {
|
||||
error_message: '',
|
||||
success_message: '',
|
||||
title: '',
|
||||
trigger: 100,
|
||||
response: 200,
|
||||
delivery: 300,
|
||||
triggers: ["STORE_TRANSACTION"],
|
||||
responses: "RELEVANT",
|
||||
deliveries: "JSON",
|
||||
active: true,
|
||||
url: '',
|
||||
errors: {
|
||||
title: [],
|
||||
trigger: [],
|
||||
response: [],
|
||||
delivery: [],
|
||||
triggers: [],
|
||||
responses: [],
|
||||
deliveries: [],
|
||||
url: [],
|
||||
active: []
|
||||
}
|
||||
@@ -118,9 +118,9 @@ export default {
|
||||
this.success_message = '';
|
||||
this.errors = {
|
||||
title: [],
|
||||
trigger: [],
|
||||
response: [],
|
||||
delivery: [],
|
||||
triggers: [],
|
||||
responses: [],
|
||||
deliveries: [],
|
||||
url: [],
|
||||
active: [],
|
||||
};
|
||||
@@ -131,9 +131,9 @@ export default {
|
||||
// collect data
|
||||
let data = {
|
||||
title: this.title,
|
||||
trigger: this.trigger,
|
||||
response: this.response,
|
||||
delivery: this.delivery,
|
||||
triggers: this.triggers,
|
||||
responses: [this.responses],
|
||||
deliveries: [this.deliveries],
|
||||
url: this.url,
|
||||
active: this.active,
|
||||
};
|
||||
@@ -148,9 +148,9 @@ export default {
|
||||
//console.log(error.response.data);
|
||||
this.error_message = error.response.data.message;
|
||||
this.errors.title = error.response.data.errors.title;
|
||||
this.errors.trigger = error.response.data.errors.trigger;
|
||||
this.errors.response = error.response.data.errors.response;
|
||||
this.errors.delivery = error.response.data.errors.delivery;
|
||||
this.errors.triggers = error.response.data.errors.triggers;
|
||||
this.errors.responses = error.response.data.errors.responses;
|
||||
this.errors.deliveries = error.response.data.errors.deliveries;
|
||||
this.errors.url = error.response.data.errors.url;
|
||||
|
||||
// enable button again
|
||||
|
@@ -54,12 +54,12 @@
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<Title :value=this.title :error="errors.title" v-on:input="title = $event"></Title>
|
||||
<WebhookTrigger :value=this.trigger :error="errors.trigger"
|
||||
v-on:input="trigger = $event"></WebhookTrigger>
|
||||
<WebhookResponse :value=this.response :error="errors.response"
|
||||
v-on:input="response = $event"></WebhookResponse>
|
||||
<WebhookDelivery :value=this.delivery :error="errors.delivery"
|
||||
v-on:input="delivery = $event"></WebhookDelivery>
|
||||
<WebhookTrigger :value=this.triggers :error="errors.triggers"
|
||||
v-on:input="triggers = $event"></WebhookTrigger>
|
||||
<WebhookResponse :value=this.responses :error="errors.responses"
|
||||
v-on:input="responses = $event"></WebhookResponse>
|
||||
<WebhookDelivery :value=this.deliveries :error="errors.deliveries"
|
||||
v-on:input="deliveries = $event"></WebhookDelivery>
|
||||
<URL :value=this.url :error="errors.url" v-on:input="url = $event"></URL>
|
||||
<Checkbox :value=this.active :error="errors.active" help="ACTIVE HELP TODO" :title="$t('form.active')"
|
||||
v-on:input="active = $event"></Checkbox>
|
||||
@@ -97,17 +97,17 @@ export default {
|
||||
error_message: '',
|
||||
success_message: '',
|
||||
title: '',
|
||||
trigger: 100,
|
||||
response: 200,
|
||||
delivery: 300,
|
||||
triggers: ["STORE_TRANSACTION"],
|
||||
responses: "RELEVANT",
|
||||
deliveries: "JSON",
|
||||
id: 0,
|
||||
active: false,
|
||||
url: '',
|
||||
errors: {
|
||||
title: [],
|
||||
trigger: [],
|
||||
response: [],
|
||||
delivery: [],
|
||||
triggers: [],
|
||||
responses: [],
|
||||
deliveries: [],
|
||||
url: [],
|
||||
active: []
|
||||
}
|
||||
@@ -127,49 +127,9 @@ export default {
|
||||
// console.log(response.data.data.attributes);
|
||||
this.title = response.data.data.attributes.title;
|
||||
this.id = parseInt(response.data.data.id);
|
||||
|
||||
// trigger value on content
|
||||
console.log('Trigger is ' + response.data.data.attributes.trigger);
|
||||
// TODO does not need to be hard coded.
|
||||
if ('STORE_TRANSACTION' === response.data.data.attributes.trigger) {
|
||||
this.trigger = 100;
|
||||
}
|
||||
if ('UPDATE_TRANSACTION' === response.data.data.attributes.trigger) {
|
||||
this.trigger = 110;
|
||||
}
|
||||
if ('DESTROY_TRANSACTION' === response.data.data.attributes.trigger) {
|
||||
this.trigger = 120;
|
||||
}
|
||||
if ('STORE_BUDGET' === response.data.data.attributes.trigger) {
|
||||
this.trigger = 200;
|
||||
}
|
||||
if ('UPDATE_BUDGET' === response.data.data.attributes.trigger) {
|
||||
this.trigger = 210;
|
||||
}
|
||||
if ('DESTROY_BUDGET' === response.data.data.attributes.trigger) {
|
||||
this.trigger = 220;
|
||||
}
|
||||
if ('STORE_UPDATE_BUDGET_LIMIT' === response.data.data.attributes.trigger) {
|
||||
this.trigger = 230;
|
||||
}
|
||||
|
||||
// response value
|
||||
if ('TRANSACTIONS' === response.data.data.attributes.response) {
|
||||
this.response = 200;
|
||||
}
|
||||
if ('ACCOUNTS' === response.data.data.attributes.response) {
|
||||
this.response = 210;
|
||||
}
|
||||
if ('BUDGET' === response.data.data.attributes.response) {
|
||||
this.response = 230;
|
||||
}
|
||||
if ('NONE' === response.data.data.attributes.response) {
|
||||
this.response = 220;
|
||||
}
|
||||
if ('JSON' === response.data.data.attributes.delivery) {
|
||||
this.delivery = 300;
|
||||
}
|
||||
|
||||
this.triggers = response.data.data.attributes.triggers;
|
||||
this.responses = response.data.data.attributes.responses[0];
|
||||
this.deliveries = response.data.data.attributes.deliveries[0];
|
||||
this.active = response.data.data.attributes.active;
|
||||
this.url = response.data.data.attributes.url;
|
||||
}).catch(error => {
|
||||
@@ -182,9 +142,9 @@ export default {
|
||||
this.success_message = '';
|
||||
this.errors = {
|
||||
title: [],
|
||||
trigger: [],
|
||||
response: [],
|
||||
delivery: [],
|
||||
triggers: [],
|
||||
responses: [],
|
||||
deliveries: [],
|
||||
url: [],
|
||||
active: [],
|
||||
};
|
||||
@@ -195,9 +155,9 @@ export default {
|
||||
// collect data
|
||||
let data = {
|
||||
title: this.title,
|
||||
trigger: this.trigger,
|
||||
response: this.response,
|
||||
delivery: this.delivery,
|
||||
triggers: this.triggers,
|
||||
responses: [this.responses],
|
||||
deliveries: [this.deliveries],
|
||||
url: this.url,
|
||||
active: this.active,
|
||||
};
|
||||
@@ -210,9 +170,9 @@ export default {
|
||||
|
||||
this.error_message = error.response.data.message;
|
||||
this.errors.title = error.response.data.errors.title;
|
||||
this.errors.trigger = error.response.data.errors.trigger;
|
||||
this.errors.response = error.response.data.errors.response;
|
||||
this.errors.delivery = error.response.data.errors.delivery;
|
||||
this.errors.triggers = error.response.data.errors.trigger;
|
||||
this.errors.responses = error.response.data.errors.response;
|
||||
this.errors.deliveries = error.response.data.errors.deliveries;
|
||||
this.errors.url = error.response.data.errors.url;
|
||||
|
||||
// enable button again
|
||||
|
@@ -50,12 +50,24 @@
|
||||
<a :href="'webhooks/show/' + webhook.id">{{ webhook.title }}</a>
|
||||
</td>
|
||||
<td>
|
||||
<span v-if="webhook.active">{{ triggers[webhook.trigger] }}</span>
|
||||
<span v-if="!webhook.active" class="text-muted"><s>{{ triggers[webhook.trigger] }}</s> ({{
|
||||
$t('firefly.inactive')
|
||||
}})</span>
|
||||
<span v-if="webhook.active">
|
||||
<ul class="list-unstyled">
|
||||
<li v-for="trigger in webhook.triggers" :key="trigger">
|
||||
{{ triggers[trigger] }}
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
<span v-if="!webhook.active" class="text-muted">
|
||||
<ul class="list-unstyled">
|
||||
<li v-for="trigger in webhook.triggers" :key="trigger">
|
||||
<s>{{ triggers[trigger] }}</s> ({{$t('firefly.inactive') }})
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{{ responses[webhook.responses[0]] }} ({{ deliveries[webhook.deliveries[0]] }})
|
||||
</td>
|
||||
<td>{{ responses[webhook.response] }} ({{ deliveries[webhook.delivery] }})</td>
|
||||
<td>
|
||||
<em style="cursor:pointer"
|
||||
v-if="webhook.show_secret" class="fa fa-eye" @click="toggleSecret(webhook)"></em>
|
||||
@@ -167,9 +179,9 @@ export default {
|
||||
active: current.attributes.active,
|
||||
full_url: current.attributes.url,
|
||||
secret: current.attributes.secret,
|
||||
trigger: current.attributes.trigger,
|
||||
response: current.attributes.response,
|
||||
delivery: current.attributes.delivery,
|
||||
triggers: current.attributes.triggers,
|
||||
responses: current.attributes.responses,
|
||||
deliveries: current.attributes.deliveries,
|
||||
show_secret: false,
|
||||
};
|
||||
if (current.attributes.url.length > 20) {
|
||||
|
@@ -40,27 +40,39 @@
|
||||
<table class="table table-hover" aria-label="A table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row" style="width:40%;">Title</th>
|
||||
<td style="width:40%;"><strong>{{ $t('list.title') }}</strong></td>
|
||||
<td>{{ title }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{{ $t('list.active') }}</th>
|
||||
<td style="width:40%;"><strong>{{ $t('list.active') }}</strong></td>
|
||||
<td>
|
||||
<em class="fa fa-check text-success" v-if="active"></em>
|
||||
<em class="fa fa-times text-danger" v-if="!active"></em>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{{ $t('list.trigger') }}</th>
|
||||
<td> {{ trigger }}</td>
|
||||
<td style="width:40%;"><strong>{{ $t('list.trigger') }}</strong></td>
|
||||
<td>
|
||||
<span v-for="trigger in triggers" :key="trigger">
|
||||
{{ $t('firefly.webhook_trigger_' + trigger) }}<br>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{{ $t('list.response') }}</th>
|
||||
<td> {{ response }}</td>
|
||||
<td style="width:40%;"><strong>{{ $t('list.response') }}</strong></td>
|
||||
<td>
|
||||
<span v-for="response in responses" :key="response">
|
||||
{{ $t('firefly.webhook_response_' + response) }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{{ $t('list.delivery') }}</th>
|
||||
<td> {{ delivery }}</td>
|
||||
<td style="width:40%;"><strong>{{ $t('list.delivery') }}</strong></td>
|
||||
<td>
|
||||
<span v-for="delivery in deliveries" :key="delivery">
|
||||
{{ $t('firefly.webhook_delivery_' + delivery) }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -86,12 +98,13 @@
|
||||
<table class="table table-hover" aria-label="A table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row" style="width:40%;">{{ $t('list.url') }}</th>
|
||||
<td style="width:40%;"><strong>{{ $t('list.url') }}</strong></td>
|
||||
<td><input type="text" readonly class="form-control" :value=url></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<td style="width:40%;"><strong>
|
||||
{{ $t('list.secret') }}
|
||||
</strong>
|
||||
</td>
|
||||
<td>
|
||||
<em style="cursor:pointer"
|
||||
@@ -260,11 +273,14 @@ export default {
|
||||
secret: '',
|
||||
show_secret: false,
|
||||
trigger: '',
|
||||
triggers: [],
|
||||
loading: true,
|
||||
response: '',
|
||||
responses: [],
|
||||
message_content: '',
|
||||
message_attempts: [],
|
||||
delivery: '',
|
||||
deliveries: [],
|
||||
messages: [],
|
||||
active: false,
|
||||
edit_url: '#',
|
||||
@@ -369,9 +385,9 @@ export default {
|
||||
this.title = response.data.data.attributes.title;
|
||||
this.url = response.data.data.attributes.url;
|
||||
this.secret = response.data.data.attributes.secret;
|
||||
this.trigger = this.$t('firefly.webhook_trigger_' + response.data.data.attributes.trigger);
|
||||
this.response = this.$t('firefly.webhook_response_' + response.data.data.attributes.response);
|
||||
this.delivery = this.$t('firefly.webhook_delivery_' + response.data.data.attributes.delivery);
|
||||
this.triggers = response.data.data.attributes.triggers;
|
||||
this.responses = response.data.data.attributes.responses;
|
||||
this.deliveries = response.data.data.attributes.deliveries;
|
||||
|
||||
this.active = response.data.data.attributes.active;
|
||||
this.url = response.data.data.attributes.url;
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.",
|
||||
"multi_account_warning_deposit": "Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.",
|
||||
"multi_account_warning_transfer": "Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaction details",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Account details",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u0636\u0639 \u0641\u064a \u0627\u0639\u062a\u0628\u0627\u0631\u0643 \u0623\u0646 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0635\u062f\u0631 \u0641\u064a \u0627\u0644\u062a\u0642\u0633\u064a\u0645\u0627\u062a \u0627\u0644\u0644\u0627\u062d\u0642\u0629 \u0633\u064a\u062a\u0645 \u062a\u062c\u0627\u0648\u0632\u0647 \u0628\u0645\u0627 \u0647\u0648 \u0645\u062d\u062f\u062f \u0641\u064a \u0623\u0648\u0644 \u062a\u0642\u0633\u064a\u0645 \u0644\u0644\u0633\u062d\u0628.",
|
||||
"multi_account_warning_deposit": "\u0636\u0639 \u0641\u064a \u0627\u0639\u062a\u0628\u0627\u0631\u0643 \u0623\u0646 \u062d\u0633\u0627\u0628 \u0627\u0644\u0648\u062c\u0647\u0629 \u0641\u064a \u0627\u0644\u062a\u0642\u0633\u064a\u0645\u0627\u062a \u0627\u0644\u0644\u0627\u062d\u0642\u0629 \u0633\u064a\u062a\u0645 \u062a\u062c\u0627\u0648\u0632\u0647 \u0628\u0645\u0627 \u0647\u0648 \u0645\u062d\u062f\u062f \u0641\u064a \u0623\u0648\u0644 \u062a\u0642\u0633\u064a\u0645 \u0644\u0644\u0625\u064a\u062f\u0627\u0639.",
|
||||
"multi_account_warning_transfer": "\u0636\u0639 \u0641\u064a \u0627\u0639\u062a\u0628\u0627\u0631\u0643 \u0623\u0646 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0635\u062f\u0631 + \u0627\u0644\u0648\u062c\u0647\u0629 \u0641\u064a \u0627\u0644\u062a\u0642\u0633\u064a\u0645\u0627\u062a \u0627\u0644\u0644\u0627\u062d\u0642\u0629 \u0633\u064a\u062a\u0645 \u062a\u062c\u0627\u0648\u0632\u0647\u0645\u0627 \u0628\u0645\u0627 \u0647\u0648 \u0645\u062d\u062f\u062f \u0641\u064a \u0623\u0648\u0644 \u062a\u0642\u0633\u064a\u0645 \u0644\u0644\u062a\u062d\u0648\u064a\u0644.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u0628\u0639\u062f \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u0628\u0639\u062f \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u0628\u0639\u062f \u062d\u0630\u0641 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u062d\u0633\u0627\u0628",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u0418\u043c\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434, \u0447\u0435 \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0432\u0430\u0449\u0438\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043d\u0438\u044f \u0449\u0435 \u0431\u044a\u0434\u0435 \u0442\u0430\u0437\u0438 \u043a\u043e\u044f\u0442\u043e \u0435 \u0434\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0430 \u0432 \u043f\u044a\u0440\u0432\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b \u043d\u0430 \u0442\u0435\u0433\u043b\u0435\u043d\u0435\u0442\u043e.",
|
||||
"multi_account_warning_deposit": "\u0418\u043c\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434, \u0447\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0432\u0430\u0449\u0438\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043d\u0438\u044f \u0449\u0435 \u0431\u044a\u0434\u0435 \u0442\u0430\u0437\u0438 \u043a\u043e\u044f\u0442\u043e \u0435 \u0434\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0430 \u0432 \u043f\u044a\u0440\u0432\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b \u043d\u0430 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430.",
|
||||
"multi_account_warning_transfer": "\u0418\u043c\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434, \u0447\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u043d\u0430\u0442\u0430 + \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0432\u0430\u0449\u0438\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043d\u0438\u044f \u0449\u0435 \u0431\u044a\u0434\u0435 \u0442\u0430\u0437\u0438 \u043a\u043e\u044f\u0442\u043e \u0435 \u0434\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0430 \u0432 \u043f\u044a\u0440\u0432\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b \u043d\u0430 \u043f\u0440\u0435\u0445\u0432\u044a\u0440\u043b\u044f\u043d\u0435\u0442\u043e.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaction details",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Account details",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Tingues en compte que el compte d'origen de divisions posteriors ser\u00e0 anul\u00b7lat pel que es troba definit a la primera divisi\u00f3 de la retirada.",
|
||||
"multi_account_warning_deposit": "Tingues en compte que el compte de dest\u00ed de divisions posteriors ser\u00e0 anul\u00b7lat pel que es troba definit a la primera divisi\u00f3 del dip\u00f2sit.",
|
||||
"multi_account_warning_transfer": "Tingues en compte que el compte d'origen + dest\u00ed de divisions posteriors ser\u00e0 anul\u00b7lat pel que es troba definit a la primera divisi\u00f3 de la transfer\u00e8ncia.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Despr\u00e9s de crear la transacci\u00f3",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Despr\u00e9s d'actualitzar la transacci\u00f3",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Despr\u00e9s d'eliminar la transacci\u00f3",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Detalls de la transacci\u00f3",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Detalls del compte",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Zdrojov\u00fd \u00fa\u010det cel\u00e9 transakce je ovl\u00e1dan\u00fd prvn\u00edm rozd\u011blen\u00edm.",
|
||||
"multi_account_warning_deposit": "C\u00edlov\u00fd \u00fa\u010del v\u0161ech n\u00e1sleduj\u00edc\u00edch rozd\u011blen\u00ed je ovl\u00e1dan\u00fd c\u00edlov\u00fdm \u00fa\u010dtem prvn\u00edho rozd\u011blen\u00ed transakce.",
|
||||
"multi_account_warning_transfer": "Zdrojov\u00fd i c\u00edlov\u00fd \u00fa\u010det v\u0161ech n\u00e1sleduj\u00edc\u00edch rozd\u011blen\u00ed jsou ovl\u00e1d\u00e1ny zdrojov\u00fdm a c\u00edlov\u00fdm \u00fa\u010dtem prvn\u00edho rozd\u011blen\u00ed transakce.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Po vytvo\u0159en\u00ed transakce",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Po aktualizaci transakce",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Po odstran\u011bn\u00ed transakce",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Podrobnosti transakce",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Podrobnosti \u00fa\u010dtu",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Husk, at kildekontoen for efterf\u00f8lgende opdelinger vil blive overstyret af hvad der er defineret i den f\u00f8rste opdeling af tilbagetr\u00e6kningen.",
|
||||
"multi_account_warning_deposit": "Husk, at destinationskontoen for efterf\u00f8lgende opdelinger vil blive tilsidesat af hvad der er defineret i den f\u00f8rste opsplitning af depositummet.",
|
||||
"multi_account_warning_transfer": "Husk p\u00e5, at kilden + destination konto for efterf\u00f8lgende opdelinger vil blive overstyret af hvad der er defineret i den f\u00f8rste opdeling af overf\u00f8rslen.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Efter oprettelse af transaktion",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Efter opdatering af transaktion",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Efter sletning af transaktion",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaktionsdetaljer",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Kontodetaljer",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Bedenken Sie, dass das Quellkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Abhebung definiert ist, au\u00dfer Kraft gesetzt wird.",
|
||||
"multi_account_warning_deposit": "Bedenken Sie, dass das Zielkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Einnahmen definiert ist, au\u00dfer Kraft gesetzt wird.",
|
||||
"multi_account_warning_transfer": "Bedenken Sie, dass das Quell- und Zielkonto nachfolgender Aufteilungen durch das, was in der ersten Aufteilung der \u00dcbertragung definiert ist, au\u00dfer Kraft gesetzt wird.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Nach Erstellen einer Buchung",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Nach Aktualisierung einer Buchung",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Nach dem L\u00f6schen einer Buchung",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "Nach dem L\u00f6schen des Budgets",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "Nach dem \u00c4ndern des budgetierten Betrags",
|
||||
"webhook_response_TRANSACTIONS": "Buchungsdetails",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Kontodetails",
|
||||
"webhook_response_NONE": "Keine Details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u039b\u03ac\u03b2\u03b5\u03c4\u03b5 \u03c5\u03c0\u03cc\u03c8\u03b7 \u03cc\u03c4\u03b9 \u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c4\u03c9\u03bd \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03c9\u03bd \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03ce\u03bd \u03b8\u03b1 \u03c5\u03c0\u03b5\u03c1\u03b9\u03c3\u03c7\u03cd\u03c3\u03b5\u03b9 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c0\u03c1\u03ce\u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd \u03c4\u03b7\u03c2 \u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7\u03c2.",
|
||||
"multi_account_warning_deposit": "\u039b\u03ac\u03b2\u03b5\u03c4\u03b5 \u03c5\u03c0\u03cc\u03c8\u03b7 \u03cc\u03c4\u03b9 \u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd \u03c4\u03c9\u03bd \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03c9\u03bd \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03ce\u03bd \u03b8\u03b1 \u03c5\u03c0\u03b5\u03c1\u03b9\u03c3\u03c7\u03cd\u03c3\u03b5\u03b9 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c0\u03c1\u03ce\u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd \u03c4\u03b7\u03c2 \u03ba\u03b1\u03c4\u03ac\u03b8\u03b5\u03c3\u03b7\u03c2.",
|
||||
"multi_account_warning_transfer": "\u039b\u03ac\u03b2\u03b5\u03c4\u03b5 \u03c5\u03c0\u03cc\u03c8\u03b7 \u03cc\u03c4\u03b9 \u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd \u03c4\u03c9\u03bd \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03c9\u03bd \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03ce\u03bd \u03b8\u03b1 \u03c5\u03c0\u03b5\u03c1\u03b9\u03c3\u03c7\u03cd\u03c3\u03b5\u03b9 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c0\u03c1\u03ce\u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd \u03c4\u03b7\u03c2 \u03bc\u03b5\u03c4\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u039c\u03b5\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u039c\u03b5\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u039c\u03b5\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u039b\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.",
|
||||
"multi_account_warning_deposit": "Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.",
|
||||
"multi_account_warning_transfer": "Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaction details",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Account details",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.",
|
||||
"multi_account_warning_deposit": "Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.",
|
||||
"multi_account_warning_transfer": "Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaction details",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Account details",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Tenga en cuenta que la cuenta de origen de las divisiones posteriores ser\u00e1 anulada por lo que se defina en la primera divisi\u00f3n del gasto.",
|
||||
"multi_account_warning_deposit": "Tenga en cuenta que la cuenta de destino de las divisiones posteriores ser\u00e1 anulada por lo que se defina en la primera divisi\u00f3n del retiro.",
|
||||
"multi_account_warning_transfer": "Tenga en cuenta que la cuenta de origen + destino de divisiones posteriores ser\u00e1 anulada por lo que se defina en la primera divisi\u00f3n de la transferencia.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Despu\u00e9s de crear la transacci\u00f3n",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Despu\u00e9s de actualizar la transacci\u00f3n",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Despu\u00e9s de eliminar la transacci\u00f3n",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Detalles de la transacci\u00f3n",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Detalles de la cuenta",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062d\u0633\u0627\u0628 \u0645\u0646\u0628\u0639 \u0627\u0646\u0634\u0639\u0627\u0628\u0627\u062a \u0628\u0639\u062f\u06cc \u0628\u0627 \u0647\u0631 \u0622\u0646\u0686\u0647 \u062f\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0627\u0648\u0644 \u0628\u0631\u062f\u0627\u0634\u062a \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u0644\u063a\u0648 \u0645\u06cc \u0634\u0648\u062f.\n",
|
||||
"multi_account_warning_deposit": "\u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062d\u0633\u0627\u0628 \u0645\u0642\u0635\u062f \u062a\u0642\u0633\u06cc\u0645 \u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u0628\u0627 \u0647\u0631 \u0622\u0646\u0686\u0647 \u062f\u0631 \u0627\u0648\u0644\u06cc\u0646 \u062a\u0642\u0633\u06cc\u0645 \u0633\u067e\u0631\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u0644\u063a\u0648 \u0645\u06cc \u0634\u0648\u062f.\n",
|
||||
"multi_account_warning_transfer": "\u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062d\u0633\u0627\u0628 \u0645\u0628\u062f\u0627 + \u0645\u0642\u0635\u062f \u062a\u0642\u0633\u06cc\u0645\u200c\u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u0628\u0627 \u0647\u0631 \u0622\u0646\u0686\u0647 \u062f\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0627\u0648\u0644 \u0627\u0646\u062a\u0642\u0627\u0644 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u0644\u063a\u0648 \u0645\u06cc\u200c\u0634\u0648\u062f.\n",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u067e\u0633 \u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u062a\u0631\u0627\u06a9\u0646\u0634\n",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u067e\u0633 \u0627\u0632 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u062a\u0631\u0627\u06a9\u0646\u0634\n",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u067e\u0633 \u0627\u0632 \u062a\u0631\u0627\u06a9\u0646\u0634 \u062d\u0630\u0641 \u0634\u0648\u062f\n",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u062c\u0632\u0626\u06cc\u0627\u062a \u062a\u0631\u0627\u06a9\u0646\u0634",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u062c\u0632\u0626\u06cc\u0627\u062a \u062d\u0633\u0627\u0628",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Muista, ett\u00e4 my\u00f6hempien jakojen l\u00e4hdetili m\u00e4\u00e4r\u00e4ytyy noston ensimm\u00e4isen jaon m\u00e4\u00e4ritysten mukaan.",
|
||||
"multi_account_warning_deposit": "Muista, ett\u00e4 my\u00f6hempien jakojen kohdetili m\u00e4\u00e4r\u00e4ytyy talletuksen ensimm\u00e4isen jaon m\u00e4\u00e4ritysten mukaan.",
|
||||
"multi_account_warning_transfer": "Muista, ett\u00e4 my\u00f6hempien jakojen l\u00e4hde- ja kohdetili m\u00e4\u00e4r\u00e4ytyv\u00e4t ensimm\u00e4isen jaon m\u00e4\u00e4ritysten mukaan.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaction details",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Tilin tiedot",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Gardez en t\u00eate que le compte source des s\u00e9parations suivantes peut \u00eatre remplac\u00e9 par celui de la premi\u00e8re s\u00e9paration de la d\u00e9pense.",
|
||||
"multi_account_warning_deposit": "Gardez en t\u00eate que le compte de destination des s\u00e9parations suivantes peut \u00eatre remplac\u00e9 par celui de la premi\u00e8re s\u00e9paration du d\u00e9p\u00f4t.",
|
||||
"multi_account_warning_transfer": "Gardez en t\u00eate que les comptes source et de destination des s\u00e9parations suivantes peuvent \u00eatre remplac\u00e9s par ceux de la premi\u00e8re s\u00e9paration du transfert.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Apr\u00e8s la cr\u00e9ation de l'op\u00e9ration",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Apr\u00e8s la mise \u00e0 jour de l'op\u00e9ration",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Apr\u00e8s la suppression de l'op\u00e9ration",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "Apr\u00e8s la suppression du budget",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "Apr\u00e8s le changement du montant budg\u00e9tis\u00e9",
|
||||
"webhook_response_TRANSACTIONS": "D\u00e9tails de l'op\u00e9ration",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "D\u00e9tails du compte",
|
||||
"webhook_response_NONE": "Aucun d\u00e9tail",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.",
|
||||
"multi_account_warning_deposit": "Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.",
|
||||
"multi_account_warning_transfer": "Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Tranzakci\u00f3 l\u00e9trehoz\u00e1sa ut\u00e1n",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Tranzakci\u00f3 friss\u00edt\u00e9se ut\u00e1n",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Tranzakci\u00f3 t\u00f6rl\u00e9se ut\u00e1n",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Tranzakci\u00f3 r\u00e9szletei",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Sz\u00e1mlaadatok",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.",
|
||||
"multi_account_warning_deposit": "Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.",
|
||||
"multi_account_warning_transfer": "Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaction details",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Account details",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Ricorda che il conto di origine delle successive suddivisioni verr\u00e0 sovrascritto da quello definito nella prima suddivisione del prelievo.",
|
||||
"multi_account_warning_deposit": "Ricorda che il conto di destinazione delle successive suddivisioni verr\u00e0 sovrascritto da quello definito nella prima suddivisione del deposito.",
|
||||
"multi_account_warning_transfer": "Ricorda che il conto di origine e il conto di destinazione delle successive suddivisioni verranno sovrascritti da quelli definiti nella prima suddivisione del trasferimento.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Dopo aver creato la transazione",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Dopo aver aggiornato la transazione",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Dopo aver eliminato la transazione",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Dettagli transazione",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Dettagli conto",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u7d9a\u304f\u5206\u5272\u306e\u5f15\u304d\u51fa\u3057\u53e3\u5ea7\u306f\u3001\u51fa\u91d1\u306e\u6700\u521d\u306e\u5206\u5272\u306e\u5b9a\u7fa9\u306b\u3088\u3063\u3066\u8986\u3055\u308c\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
|
||||
"multi_account_warning_deposit": "\u7d9a\u304f\u5206\u5272\u306e\u9810\u3051\u5165\u308c\u53e3\u5ea7\u306f\u3001\u9001\u91d1\u306e\u6700\u521d\u306e\u5206\u5272\u306e\u5b9a\u7fa9\u306b\u3088\u3063\u3066\u8986\u3055\u308c\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
|
||||
"multi_account_warning_transfer": "\u7d9a\u304f\u5206\u5272\u306e\u9810\u3051\u5165\u308c\u53e3\u5ea7\u3068\u5f15\u304d\u51fa\u3057\u53e3\u5ea7\u306f\u3001\u9001\u91d1\u306e\u6700\u521d\u306e\u5206\u5272\u306e\u5b9a\u7fa9\u306b\u3088\u3063\u3066\u8986\u3055\u308c\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u53d6\u5f15\u4f5c\u6210\u5f8c",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u53d6\u5f15\u66f4\u65b0\u5f8c",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u53d6\u5f15\u524a\u9664\u5f8c",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u53d6\u5f15\u8a73\u7d30",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u53e3\u5ea7\u8a73\u7d30",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\ub4a4\ub530\ub974\ub294 \ubd84\ud560\uc758 \uc18c\uc2a4 \uacc4\uc815\uc740 \uccab \ubc88\uc9f8 \ucd9c\uae08 \ubd84\ud560\uc5d0 \uc815\uc758\ub41c \ub0b4\uc6a9\uc5d0 \ub530\ub77c \uc7ac\uc815\uc758\ub41c\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.",
|
||||
"multi_account_warning_deposit": "\ub4a4\ub530\ub974\ub294 \ubd84\ud560\uc758 \ub300\uc0c1 \uacc4\uc815\uc740 \uccab \ubc88\uc9f8 \uc785\uae08 \ubd84\ud560\uc5d0 \uc815\uc758\ub41c \ub0b4\uc6a9\uc5d0 \ub530\ub77c \uc7ac\uc815\uc758\ub41c\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.",
|
||||
"multi_account_warning_transfer": "\ub4a4\ub530\ub974\ub294 \ubd84\ud560\uc758 \uc18c\uc2a4 + \ub300\uc0c1 \uacc4\uc815\uc740 \uccab \ubc88\uc9f8 \uc774\uccb4 \ubd84\ud560\uc5d0 \uc815\uc758\ub41c \ub0b4\uc6a9\uc5d0 \ub530\ub77c \uc7ac\uc815\uc758\ub41c\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\uac70\ub798 \uc0dd\uc131 \uc774\ud6c4",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\uac70\ub798 \uc5c5\ub370\uc774\ud2b8 \uc774\ud6c4",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\uac70\ub798 \uc0ad\uc81c \uc774\ud6c4",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\uac70\ub798 \uc138\ubd80 \uc815\ubcf4",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\uacc4\uc815 \uc815\ubcf4",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Husk at kildekontoen for etterf\u00f8lgende oppsplitting skal overlates av hva som defineres i den f\u00f8rste delen av uttrekket.",
|
||||
"multi_account_warning_deposit": "Husk at mottakerkontoen for etterf\u00f8lgende oppsplitting skal overstyres av det som er definert i den f\u00f8rste delen av depositumet.",
|
||||
"multi_account_warning_transfer": "Husk at kildens pluss destinasjonskonto med etterf\u00f8lgende oppdeling overstyres av det som er definert i en f\u00f8rste del av overf\u00f8ringen.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Etter transaksjons opprettelse",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Etter transaksjons oppdatering",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Etter transaksjons sletting",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaksjonsdetaljer",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Kontodetaljer",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "De bronrekening wordt overschreven door wat er in de eerste split staat.",
|
||||
"multi_account_warning_deposit": "De doelrekening wordt overschreven door wat er in de eerste split staat.",
|
||||
"multi_account_warning_transfer": "De bron + doelrekening wordt overschreven door wat er in de eerste split staat.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Na het maken van een transactie",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Na het updaten van een transactie",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Na het verwijderen van een transactie",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transactiedetails",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Rekeningdetails",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Husk at kildekontoen for etterf\u00f8lgende oppsplitting skal overlates av kva som defineres i den f\u00f8rste delen av uttrekket.",
|
||||
"multi_account_warning_deposit": "Husk at mottakerkontoen for etterf\u00f8lgende oppsplitting skal overstyres av det som er definert i den f\u00f8rste delen av depositumet.",
|
||||
"multi_account_warning_transfer": "Husk at kildens pluss destinasjonskonto med etterf\u00f8lgende oppdeling overstyres av det som er definert i ein f\u00f8rste del av overf\u00f8ringen.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Etter transaksjons opprettelse",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Etter transaksjons oppdatering",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Etter transaksjons sletting",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaksjonsdetaljer",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Kontodetaljer",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Pami\u0119taj, \u017ce konto \u017ar\u00f3d\u0142owe kolejnych podzia\u0142\u00f3w zostanie ustawione na konto zdefiniowane w pierwszym podziale wyp\u0142aty.",
|
||||
"multi_account_warning_deposit": "Pami\u0119taj, \u017ce konto docelowe kolejnych podzia\u0142\u00f3w zostanie ustawione na konto zdefiniowane w pierwszym podziale wp\u0142aty.",
|
||||
"multi_account_warning_transfer": "Pami\u0119taj, \u017ce konta \u017ar\u00f3d\u0142owe i docelowe kolejnych podzia\u0142\u00f3w zostan\u0105 ustawione na konto zdefiniowane w pierwszym podziale transferu.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Po utworzeniu transakcji",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Po zmodyfikowaniu transakcji",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Po usuni\u0119ciu transakcji",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Szczeg\u00f3\u0142y transakcji",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Szczeg\u00f3\u0142y konta",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Tenha em mente que a conta de origem das divis\u00f5es subsequentes ser\u00e1 sobrescrita pelo que estiver definido na primeira divis\u00e3o da sa\u00edda.",
|
||||
"multi_account_warning_deposit": "Tenha em mente que a conta de destino das divis\u00f5es subsequentes ser\u00e1 sobrescrita pelo que estiver definido na primeira divis\u00e3o da entrada.",
|
||||
"multi_account_warning_transfer": "Tenha em mente que a conta de origem + de destino das divis\u00f5es subsequentes ser\u00e3o sobrescritas pelo que for definido na primeira divis\u00e3o da transfer\u00eancia.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Ap\u00f3s cria\u00e7\u00e3o da transa\u00e7\u00e3o",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Ap\u00f3s atualiza\u00e7\u00e3o da transa\u00e7\u00e3o",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Ap\u00f3s exclus\u00e3o da transa\u00e7\u00e3o",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Detalhes da transa\u00e7\u00e3o",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Detalhes da conta",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Tenha presente que a conta de origem de divis\u00f5es subsequentes ser\u00e1 sobrescrita pelo que estiver definido na primeira divis\u00e3o do levantamento.",
|
||||
"multi_account_warning_deposit": "Tenha presente que a conta de destino de divis\u00f5es subsequentes ser\u00e1 sobrescrita pelo que estiver definida na primeira divis\u00e3o do dep\u00f3sito.",
|
||||
"multi_account_warning_transfer": "Tenha presenta que a conta de origem + destino de divis\u00f5es subsequentes ser\u00e3o sobrescritas pelo que estiver definido na primeira divis\u00e3o da transfer\u00eancia.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Ap\u00f3s criar transa\u00e7\u00e3o",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Ap\u00f3s atualizar transa\u00e7\u00e3o",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Ap\u00f3s eliminar transa\u00e7\u00e3o",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Detalhes da transa\u00e7\u00e3o",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Detalhes da conta",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Re\u0163ine\u0163i faptul c\u0103 sursa scind\u0103rilor ulterioare va fi anulat\u0103 de orice altceva definit \u00een prima \u00eemp\u0103r\u0163ire a retragerii.",
|
||||
"multi_account_warning_deposit": "\u021aine\u021bi cont de faptul c\u0103 destina\u021bia scind\u0103rilor ulterioare va fi dep\u0103\u0219it\u0103 cu orice se define\u0219te la prima \u00eemp\u0103r\u021bire a depozitului.",
|
||||
"multi_account_warning_transfer": "Re\u0163ine\u0163i faptul c\u0103 contul sursei + destina\u0163ia frac\u0163ion\u0103rilor ulterioare va fi anulat de orice se define\u015fte \u00een prima \u00eemp\u0103r\u0163ire a transferului.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Dup\u0103 crearea tranzac\u021biei",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Dup\u0103 actualizarea tranzac\u021biei",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Dup\u0103 \u0219tergerea tranzac\u021biei",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Detaliile tranzac\u021biei",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Detalii cont",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0441\u0447\u0451\u0442-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u0430.",
|
||||
"multi_account_warning_deposit": "\u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0441\u0447\u0451\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043e\u0445\u043e\u0434\u0430.",
|
||||
"multi_account_warning_transfer": "\u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0441\u0447\u0451\u0442-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438 \u0441\u0447\u0451\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435, \u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u0414\u0435\u0442\u0430\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Majte na pam\u00e4ti, \u017ee zdrojov\u00fd bankov\u00fd \u00fa\u010det n\u00e1sledn\u00fdch roz\u00fa\u010dtovan\u00ed bude prep\u00edsan\u00fd t\u00fdm, \u010do je definovan\u00e9 v prvom rozdelen\u00ed v\u00fdberu.",
|
||||
"multi_account_warning_deposit": "Majte na pam\u00e4ti, \u017ee zdrojov\u00fd bankov\u00fd \u00fa\u010det n\u00e1sledn\u00fdch roz\u00fa\u010dtovan\u00ed bude prep\u00edsan\u00fd t\u00fdm, \u010do je definovan\u00e9 v prvom roz\u00fa\u010dtovan\u00ed vkladu.",
|
||||
"multi_account_warning_transfer": "Majte na pam\u00e4ti, \u017ee zdrojov\u00fd a cie\u013eov\u00fd bankov\u00fd \u00fa\u010det n\u00e1sledn\u00fdch roz\u00fa\u010dtovan\u00ed bude prep\u00edsan\u00fd t\u00fdm, \u010do je definovan\u00e9 v prvom roz\u00fa\u010dtovan\u00ed prevodu.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaction details",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Account details",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Upo\u0161tevajte, da bo izvorni ra\u010dun poznej\u0161ih razdelitev preglasilo tisto, kar je definirano v prvi razdelitvi odliva.",
|
||||
"multi_account_warning_deposit": "Upo\u0161tevajte, da bo ciljni ra\u010dun poznej\u0161ih delitev preglasilo tisto, kar je opredeljeno v prvi delitvi priliva.",
|
||||
"multi_account_warning_transfer": "Upo\u0161tevajte, da bo izvorni + ciljni ra\u010dun poznej\u0161ih razdelitev preglasilo tisto, kar je definirano v prvi razdelitvi prenosa.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Po ustvarjanju transakcije",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Po posodabljanju transakcije",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Po brisanju transakcije",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Podrobnosti transakcije",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Podrobnosti ra\u010duna",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "T\u00e4nk p\u00e5 att k\u00e4llkontot f\u00f6r efterf\u00f6ljande uppdelningar kommer att upph\u00e4vas av vad som \u00e4n definieras i den f\u00f6rsta uppdelningen av uttaget.",
|
||||
"multi_account_warning_deposit": "T\u00e4nk p\u00e5 att destinationskontot f\u00f6r efterf\u00f6ljande uppdelningar kommer att styras av vad som \u00e4n definieras i den f\u00f6rsta uppdelningen av ins\u00e4ttningen.",
|
||||
"multi_account_warning_transfer": "T\u00e4nk p\u00e5 att k\u00e4ll + destinationskonto av efterf\u00f6ljande delningar kommer att styras av vad som definieras i den f\u00f6rsta uppdelningen av \u00f6verf\u00f6ringen.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Efter skapande av transaktion",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Transaktionsdetaljer",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Kontodetaljer",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Sonraki b\u00f6l\u00fcnmelerin kaynak hesab\u0131n\u0131n, geri \u00e7ekilmenin ilk b\u00f6l\u00fcnmesinde tan\u0131mlanan herhangi bir \u015fey taraf\u0131ndan reddedilece\u011fini unutmay\u0131n.",
|
||||
"multi_account_warning_deposit": "Sonraki b\u00f6l\u00fcnmelerin hedef hesab\u0131n\u0131n, mevduat\u0131n ilk b\u00f6l\u00fcnmesinde tan\u0131mlanan herhangi bir \u015fey taraf\u0131ndan iptal edilece\u011fini unutmay\u0131n.",
|
||||
"multi_account_warning_transfer": "Sonraki b\u00f6l\u00fcnmelerin kaynak + hedef hesab\u0131n\u0131n, aktar\u0131m\u0131n ilk b\u00f6l\u00fcnmesinde tan\u0131mlanan her \u015fey taraf\u0131ndan ge\u00e7ersiz k\u0131l\u0131naca\u011f\u0131n\u0131 unutmay\u0131n.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u0130\u015flem olu\u015fturma sonras\u0131",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u0130\u015flem g\u00fcncelleme sonras\u0131",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u0130\u015flem silme sonras\u0131",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u0130\u015flem detaylar\u0131",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Hesap detaylar\u0131",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u0417\u0430\u0443\u0432\u0430\u0436\u0442\u0435, \u0449\u043e \u0432\u0438\u0445\u0456\u0434\u043d\u0438\u043c \u0440\u0430\u0445\u0443\u043d\u043a\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0438\u0445 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0456\u0432 \u0431\u0443\u0434\u0435 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0440\u0430\u0445\u0443\u043d\u043e\u043a, \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443 \u043f\u0435\u0440\u0448\u043e\u043c\u0443 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0456 \u0432\u0438\u043f\u043b\u0430\u0442.",
|
||||
"multi_account_warning_deposit": "\u0417\u0430\u0443\u0432\u0430\u0436\u0442\u0435, \u0449\u043e \u0446\u0456\u043b\u044c\u043e\u0432\u0438\u043c \u0440\u0430\u0445\u0443\u043d\u043a\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0438\u0445 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0456\u0432 \u0431\u0443\u0434\u0435 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0440\u0430\u0445\u0443\u043d\u043e\u043a, \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443 \u043f\u0435\u0440\u0448\u043e\u043c\u0443 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0456 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0443.",
|
||||
"multi_account_warning_transfer": "\u0417\u0430\u0443\u0432\u0430\u0436\u0442\u0435, \u0449\u043e \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0456 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0436\u0435\u0440\u0435\u043b\u0430 \u0442\u0430 \u043f\u0440\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0438\u0445 \u043f\u043e\u0434\u0456\u043b\u0456\u0432 \u0431\u0443\u0434\u0435 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0430 \u0440\u0430\u0445\u0443\u043d\u043e\u043a, \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443 \u043f\u0435\u0440\u0448\u043e\u043c\u0443 \u043f\u043e\u0434\u0456\u043b\u0456 \u043f\u0435\u0440\u0435\u043a\u0430\u0437\u0443.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u041f\u0456\u0441\u043b\u044f \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0457",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u041f\u0456\u0441\u043b\u044f \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0457",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u041f\u0456\u0441\u043b\u044f \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u043d\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0457",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u0414\u0435\u0442\u0430\u043b\u0456 \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0457",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u0414\u0430\u043d\u0456 \u0440\u0430\u0445\u0443\u043d\u043a\u0443",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.",
|
||||
"multi_account_warning_deposit": "Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.",
|
||||
"multi_account_warning_transfer": "Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer.",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "Sau khi t\u1ea1o giao d\u1ecbch",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "Sau khi c\u1eadp nh\u1eadt giao d\u1ecbch",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "Sau khi x\u00f3a giao d\u1ecbch",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "Chi ti\u1ebft giao d\u1ecbch",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "Chi ti\u1ebft t\u00e0i kho\u1ea3n",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u8bf7\u6ce8\u610f\uff0c\u540e\u7eed\u62c6\u5206\u7684\u6765\u6e90\u8d26\u6237\u5c06\u4f1a\u88ab\u652f\u51fa\u7684\u9996\u7b14\u62c6\u5206\u7684\u914d\u7f6e\u6240\u8986\u76d6\u3002",
|
||||
"multi_account_warning_deposit": "\u8bf7\u6ce8\u610f\uff0c\u540e\u7eed\u62c6\u5206\u7684\u76ee\u6807\u8d26\u6237\u5c06\u4f1a\u88ab\u6536\u5165\u7684\u9996\u7b14\u62c6\u5206\u7684\u914d\u7f6e\u6240\u8986\u76d6\u3002",
|
||||
"multi_account_warning_transfer": "\u8bf7\u6ce8\u610f\uff0c\u540e\u7eed\u62c6\u5206\u7684\u6765\u6e90\u548c\u76ee\u6807\u8d26\u6237\u5c06\u4f1a\u88ab\u8f6c\u8d26\u7684\u9996\u7b14\u62c6\u5206\u7684\u914d\u7f6e\u6240\u8986\u76d6\u3002",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u4ea4\u6613\u521b\u5efa\u540e",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u4ea4\u6613\u66f4\u65b0\u540e",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u4ea4\u6613\u5220\u9664\u540e",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u4ea4\u6613\u8be6\u60c5",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u8d26\u6237\u8be6\u60c5",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -107,6 +107,7 @@
|
||||
"multi_account_warning_withdrawal": "\u8acb\u6ce8\u610f\uff0c\u82e5\u60a8\u5efa\u7acb\u7684\u662f\u63d0\u6b3e\u4ea4\u6613\uff0c\u5f8c\u7e8c\u62c6\u5206\u7684\u4f86\u6e90\u5e33\u6236\u5c07\u6703\u88ab\u7b2c\u4e00\u7b46\u62c6\u5206\u4e2d\u8a2d\u5b9a\u7684\u5e33\u6236\u8986\u5beb\u3002",
|
||||
"multi_account_warning_deposit": "\u8acb\u6ce8\u610f\uff0c\u82e5\u60a8\u5efa\u7acb\u7684\u662f\u5b58\u6b3e\u4ea4\u6613\uff0c\u5f8c\u7e8c\u62c6\u5206\u7684\u76ee\u6a19\u5e33\u6236\u5c07\u6703\u88ab\u7b2c\u4e00\u7b46\u62c6\u5206\u4e2d\u8a2d\u5b9a\u7684\u5e33\u6236\u8986\u5beb\u3002",
|
||||
"multi_account_warning_transfer": "\u8acb\u6ce8\u610f\uff0c\u82e5\u60a8\u5efa\u7acb\u7684\u662f\u8f49\u5e33\u4ea4\u6613\uff0c\u5f8c\u7e8c\u62c6\u5206\u7684\u4f86\u6e90\u8207\u76ee\u6a19\u5e33\u6236\u5c07\u6703\u88ab\u7b2c\u4e00\u7b46\u62c6\u5206\u4e2d\u8a2d\u5b9a\u7684\u5e33\u6236\u8986\u5beb\u3002",
|
||||
"webhook_trigger_ANY": "After any event",
|
||||
"webhook_trigger_STORE_TRANSACTION": "\u5728\u4ea4\u6613\u5efa\u7acb\u5f8c",
|
||||
"webhook_trigger_UPDATE_TRANSACTION": "\u5728\u4ea4\u6613\u66f4\u65b0\u5f8c",
|
||||
"webhook_trigger_DESTROY_TRANSACTION": "\u5728\u4ea4\u6613\u522a\u9664\u5f8c",
|
||||
@@ -115,6 +116,7 @@
|
||||
"webhook_trigger_DESTROY_BUDGET": "After budget delete",
|
||||
"webhook_trigger_STORE_UPDATE_BUDGET_LIMIT": "After budgeted amount change",
|
||||
"webhook_response_TRANSACTIONS": "\u4ea4\u6613\u8a73\u60c5",
|
||||
"webhook_response_RELEVANT": "Relevant details",
|
||||
"webhook_response_ACCOUNTS": "\u5e33\u865f\u8a73\u60c5",
|
||||
"webhook_response_NONE": "No details",
|
||||
"webhook_delivery_JSON": "JSON",
|
||||
|
@@ -241,6 +241,7 @@ return [
|
||||
'webhooks_breadcrumb' => 'Webhooks',
|
||||
'webhooks_menu_disabled' => 'disabled',
|
||||
'no_webhook_messages' => 'There are no webhook messages',
|
||||
'webhook_trigger_ANY' => 'After any event',
|
||||
'webhook_trigger_STORE_TRANSACTION' => 'After transaction creation',
|
||||
'webhook_trigger_UPDATE_TRANSACTION' => 'After transaction update',
|
||||
'webhook_trigger_DESTROY_TRANSACTION' => 'After transaction delete',
|
||||
@@ -250,8 +251,8 @@ return [
|
||||
'webhook_trigger_STORE_UPDATE_BUDGET_LIMIT' => 'After budgeted amount change',
|
||||
'webhook_response_TRANSACTIONS' => 'Transaction details',
|
||||
'webhook_response_ACCOUNTS' => 'Account details',
|
||||
'webhook_response_none_BUDGET' => 'Budget details',
|
||||
'webhook_response_none_NONE' => 'No details',
|
||||
'webhook_response_BUDGET' => 'Budget details',
|
||||
'webhook_response_RELEVANT' => 'Relevant details',
|
||||
'webhook_response_NONE' => 'No details',
|
||||
'webhook_delivery_JSON' => 'JSON',
|
||||
'inspect' => 'Inspect',
|
||||
|
@@ -34,6 +34,10 @@ return [
|
||||
'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.',
|
||||
'nog_logged_in' => 'You are not logged in.',
|
||||
'prohibited' => 'You must not submit anything in field.',
|
||||
'bad_webhook_combination' => 'Webhook trigger ":trigger" cannot be combined with webhook response ":response".',
|
||||
'unknown_webhook_trigger' => 'Unknown webhook trigger ":trigger".',
|
||||
'only_any_trigger' => 'If you select the "Any event"-trigger, you may not select any other triggers.',
|
||||
'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.',
|
||||
'missing_where' => 'Array is missing "where"-clause',
|
||||
|
@@ -356,16 +356,17 @@
|
||||
</span>
|
||||
<br/>
|
||||
{% endif %}
|
||||
{% if spentInfo.currency_id == budgetLimit.currency_id and not budgetLimit.in_range %}
|
||||
<span class="left_span" data-currency="{{ spentInfo.currency_id }}" data-limit="{{ budgetLimit.id }}"
|
||||
data-value="{{ spentInfo.spent + budgetLimit.amount }}" class="amount_left">
|
||||
{{ formatAmountBySymbol(spentInfo.spent + budgetLimit.amount, spentInfo.currency_symbol, spentInfo.currency_decimal_places) }}
|
||||
</span>
|
||||
<span class="text-muted">({{ 'unknown'|_ }})</span>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% if countLimit == 0 %}
|
||||
|
||||
{# this code is used for budget limits OUTSIDE the current view range. #}
|
||||
<span class="left_span" data-id="{{ budget.id }}" data-currency="{{ spentInfo.currency_id }}" data-limit="0"
|
||||
class="amount_left" data-value="{{ spentInfo.spent }}">
|
||||
{{ formatAmountBySymbol(spentInfo.spent, spentInfo.currency_symbol, spentInfo.currency_decimal_places) }}
|
||||
</span>
|
||||
<br/>
|
||||
{# display nothing #}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% for budgetLimit in budget.budgeted %}
|
||||
|
Reference in New Issue
Block a user