mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-08-29 17:25:20 +00:00
Compare commits
87 Commits
develop-20
...
v6.1.18
Author | SHA1 | Date | |
---|---|---|---|
|
f52978e71f | ||
|
3a3358124d | ||
|
929808c633 | ||
|
a78df574f3 | ||
|
875cad16b6 | ||
|
7bc30192ca | ||
|
a1a8968e98 | ||
|
6abb74a038 | ||
|
2d7d05e985 | ||
|
d426e09474 | ||
|
72d55cb953 | ||
|
73ad865581 | ||
|
fefb52beb7 | ||
|
abd503543b | ||
|
e3eb550581 | ||
|
46b780758e | ||
|
b2c3ee9779 | ||
|
dca899bcee | ||
|
9667b8a948 | ||
|
661f225fe7 | ||
|
4c6fe0c8de | ||
|
78f457950e | ||
|
d831cc8df2 | ||
|
7056406afc | ||
|
c85cfcf3e6 | ||
|
db06d06789 | ||
|
a28b990cd1 | ||
|
dab4bfa7a6 | ||
|
6575236f2b | ||
|
ad582c8806 | ||
|
452e9cb953 | ||
|
a64f137b39 | ||
|
c067d6aab0 | ||
|
119b9920a6 | ||
|
99ed54fce8 | ||
|
2ea57cdd38 | ||
|
bb94bdfdaf | ||
|
4de8398cc2 | ||
|
e6e8cd5d8a | ||
|
0b200309ba | ||
|
a184548912 | ||
|
c987191212 | ||
|
7009b444d9 | ||
|
06551d5367 | ||
|
a20622ac0c | ||
|
ca38117fca | ||
|
9478f78d4f | ||
|
5c2397bbae | ||
|
92fefef816 | ||
|
d3ced65524 | ||
|
29eb748831 | ||
|
76df3d5f33 | ||
|
252076ec1f | ||
|
bbec28591f | ||
|
075a360ba6 | ||
|
477524a8ae | ||
|
dfe055732d | ||
|
78b611a18d | ||
|
367bdf65e6 | ||
|
3fc9caa31a | ||
|
95a41fcab7 | ||
|
58b409fc00 | ||
|
3eaaac09ad | ||
|
bcb672920c | ||
|
79b91e25c2 | ||
|
7170931464 | ||
|
c1b5a1a13e | ||
|
a6265ce8ab | ||
|
90109917df | ||
|
0acd54c2b7 | ||
|
c96226b9b4 | ||
|
6d143f1624 | ||
|
93324d1154 | ||
|
a39f0e1891 | ||
|
822f609a22 | ||
|
cd7ddd1c61 | ||
|
0b63ba26bb | ||
|
94d70cdb62 | ||
|
acb3831c8b | ||
|
c9d9ecede4 | ||
|
4eb5873353 | ||
|
7ca39fdb21 | ||
|
b8d1d7a8c0 | ||
|
1af79eab30 | ||
|
34baea66a7 | ||
|
561e228a2d | ||
|
5bd72f6428 |
@@ -19,6 +19,8 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use PhpCsFixer\Runner\Parallel\ParallelConfigFactory;
|
||||
|
||||
$current = __DIR__;
|
||||
|
||||
$paths = [
|
||||
@@ -35,6 +37,7 @@ $finder = PhpCsFixer\Finder::create()
|
||||
|
||||
|
||||
$config = new PhpCsFixer\Config();
|
||||
$config->setParallelConfig(ParallelConfigFactory::detect());
|
||||
return $config->setRules(
|
||||
[
|
||||
// rule sets
|
||||
|
184
.ci/php-cs-fixer/composer.lock
generated
184
.ci/php-cs-fixer/composer.lock
generated
@@ -72,16 +72,16 @@
|
||||
},
|
||||
{
|
||||
"name": "composer/pcre",
|
||||
"version": "3.1.3",
|
||||
"version": "3.1.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/pcre.git",
|
||||
"reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8"
|
||||
"reference": "04229f163664973f68f38f6f73d917799168ef24"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
|
||||
"reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
|
||||
"url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24",
|
||||
"reference": "04229f163664973f68f38f6f73d917799168ef24",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -123,7 +123,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/composer/pcre/issues",
|
||||
"source": "https://github.com/composer/pcre/tree/3.1.3"
|
||||
"source": "https://github.com/composer/pcre/tree/3.1.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -139,7 +139,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-03-19T10:26:25+00:00"
|
||||
"time": "2024-05-27T13:40:54+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/semver",
|
||||
@@ -398,16 +398,16 @@
|
||||
},
|
||||
{
|
||||
"name": "friendsofphp/php-cs-fixer",
|
||||
"version": "v3.57.1",
|
||||
"version": "v3.59.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||
"reference": "3f7efe667a8c9818aacceee478add7c0fc24cb21"
|
||||
"reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/3f7efe667a8c9818aacceee478add7c0fc24cb21",
|
||||
"reference": "3f7efe667a8c9818aacceee478add7c0fc24cb21",
|
||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/30ba9ecc2b0e5205e578fe29973c15653d9bfd29",
|
||||
"reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -437,16 +437,16 @@
|
||||
"symfony/stopwatch": "^5.4 || ^6.0 || ^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"facile-it/paraunit": "^1.3 || ^2.0",
|
||||
"infection/infection": "^0.27.11",
|
||||
"facile-it/paraunit": "^1.3 || ^2.3",
|
||||
"infection/infection": "^0.29.5",
|
||||
"justinrainbow/json-schema": "^5.2",
|
||||
"keradus/cli-executor": "^2.1",
|
||||
"mikey179/vfsstream": "^1.6.11",
|
||||
"php-coveralls/php-coveralls": "^2.7",
|
||||
"php-cs-fixer/accessible-object": "^1.1",
|
||||
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4",
|
||||
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4",
|
||||
"phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2",
|
||||
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5",
|
||||
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5",
|
||||
"phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2",
|
||||
"symfony/var-dumper": "^5.4 || ^6.0 || ^7.0",
|
||||
"symfony/yaml": "^5.4 || ^6.0 || ^7.0"
|
||||
},
|
||||
@@ -461,7 +461,10 @@
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PhpCsFixer\\": "src/"
|
||||
}
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
"src/Fixer/Internal/*"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
@@ -486,7 +489,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.57.1"
|
||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.59.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -494,7 +497,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2024-05-15T22:01:07+00:00"
|
||||
"time": "2024-06-16T14:17:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/container",
|
||||
@@ -802,28 +805,28 @@
|
||||
},
|
||||
{
|
||||
"name": "react/dns",
|
||||
"version": "v1.12.0",
|
||||
"version": "v1.13.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/reactphp/dns.git",
|
||||
"reference": "c134600642fa615b46b41237ef243daa65bb64ec"
|
||||
"reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/reactphp/dns/zipball/c134600642fa615b46b41237ef243daa65bb64ec",
|
||||
"reference": "c134600642fa615b46b41237ef243daa65bb64ec",
|
||||
"url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
|
||||
"reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0",
|
||||
"react/cache": "^1.0 || ^0.6 || ^0.5",
|
||||
"react/event-loop": "^1.2",
|
||||
"react/promise": "^3.0 || ^2.7 || ^1.2.1"
|
||||
"react/promise": "^3.2 || ^2.7 || ^1.2.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
|
||||
"react/async": "^4 || ^3 || ^2",
|
||||
"react/promise-timer": "^1.9"
|
||||
"react/async": "^4.3 || ^3 || ^2",
|
||||
"react/promise-timer": "^1.11"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@@ -866,7 +869,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/reactphp/dns/issues",
|
||||
"source": "https://github.com/reactphp/dns/tree/v1.12.0"
|
||||
"source": "https://github.com/reactphp/dns/tree/v1.13.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -874,7 +877,7 @@
|
||||
"type": "open_collective"
|
||||
}
|
||||
],
|
||||
"time": "2023-11-29T12:41:06+00:00"
|
||||
"time": "2024-06-13T14:18:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "react/event-loop",
|
||||
@@ -950,16 +953,16 @@
|
||||
},
|
||||
{
|
||||
"name": "react/promise",
|
||||
"version": "v3.1.0",
|
||||
"version": "v3.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/reactphp/promise.git",
|
||||
"reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c"
|
||||
"reference": "8a164643313c71354582dc850b42b33fa12a4b63"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
|
||||
"reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
|
||||
"url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
|
||||
"reference": "8a164643313c71354582dc850b42b33fa12a4b63",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1011,7 +1014,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/reactphp/promise/issues",
|
||||
"source": "https://github.com/reactphp/promise/tree/v3.1.0"
|
||||
"source": "https://github.com/reactphp/promise/tree/v3.2.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1019,7 +1022,7 @@
|
||||
"type": "open_collective"
|
||||
}
|
||||
],
|
||||
"time": "2023-11-16T16:21:57+00:00"
|
||||
"time": "2024-05-24T10:39:05+00:00"
|
||||
},
|
||||
{
|
||||
"name": "react/socket",
|
||||
@@ -1103,16 +1106,16 @@
|
||||
},
|
||||
{
|
||||
"name": "react/stream",
|
||||
"version": "v1.3.0",
|
||||
"version": "v1.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/reactphp/stream.git",
|
||||
"reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66"
|
||||
"reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66",
|
||||
"reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66",
|
||||
"url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d",
|
||||
"reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1122,7 +1125,7 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"clue/stream-filter": "~1.2",
|
||||
"phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
|
||||
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@@ -1169,7 +1172,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/reactphp/stream/issues",
|
||||
"source": "https://github.com/reactphp/stream/tree/v1.3.0"
|
||||
"source": "https://github.com/reactphp/stream/tree/v1.4.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1177,7 +1180,7 @@
|
||||
"type": "open_collective"
|
||||
}
|
||||
],
|
||||
"time": "2023-06-16T10:52:11+00:00"
|
||||
"time": "2024-06-11T12:45:25+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/diff",
|
||||
@@ -1248,16 +1251,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "c981e0e9380ce9f146416bde3150c79197ce9986"
|
||||
"reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/c981e0e9380ce9f146416bde3150c79197ce9986",
|
||||
"reference": "c981e0e9380ce9f146416bde3150c79197ce9986",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/9b008f2d7b21c74ef4d0c3de6077a642bc55ece3",
|
||||
"reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1321,7 +1324,7 @@
|
||||
"terminal"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/console/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/console/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1337,7 +1340,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-18T09:29:19+00:00"
|
||||
"time": "2024-05-31T14:57:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/deprecation-contracts",
|
||||
@@ -1408,16 +1411,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
"reference": "db2a7fab994d67d92356bb39c367db115d9d30f9"
|
||||
"reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9",
|
||||
"reference": "db2a7fab994d67d92356bb39c367db115d9d30f9",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7",
|
||||
"reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1468,7 +1471,7 @@
|
||||
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1484,7 +1487,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-18T09:29:19+00:00"
|
||||
"time": "2024-05-31T14:57:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher-contracts",
|
||||
@@ -1564,22 +1567,24 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/filesystem",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/filesystem.git",
|
||||
"reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5"
|
||||
"reference": "802e87002f919296c9f606457d9fa327a0b3d6b2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/cc168be6fbdcdf3401f50ae863ee3818ed4338f5",
|
||||
"reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5",
|
||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/802e87002f919296c9f606457d9fa327a0b3d6b2",
|
||||
"reference": "802e87002f919296c9f606457d9fa327a0b3d6b2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.2",
|
||||
"symfony/polyfill-ctype": "~1.8",
|
||||
"symfony/polyfill-mbstring": "~1.8",
|
||||
"symfony/polyfill-mbstring": "~1.8"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/process": "^6.4|^7.0"
|
||||
},
|
||||
"type": "library",
|
||||
@@ -1608,7 +1613,7 @@
|
||||
"description": "Provides basic utilities for the filesystem",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/filesystem/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/filesystem/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1624,20 +1629,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-18T09:29:19+00:00"
|
||||
"time": "2024-05-31T14:57:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/finder.git",
|
||||
"reference": "4d58f0f4fe95a30d7b538d71197135483560b97c"
|
||||
"reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/4d58f0f4fe95a30d7b538d71197135483560b97c",
|
||||
"reference": "4d58f0f4fe95a30d7b538d71197135483560b97c",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6",
|
||||
"reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1672,7 +1677,7 @@
|
||||
"description": "Finds files and directories via an intuitive fluent interface",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/finder/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/finder/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1688,20 +1693,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-28T11:44:19+00:00"
|
||||
"time": "2024-05-31T14:57:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/options-resolver",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/options-resolver.git",
|
||||
"reference": "23cc173858776ad451e31f053b1c9f47840b2cfa"
|
||||
"reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/23cc173858776ad451e31f053b1c9f47840b2cfa",
|
||||
"reference": "23cc173858776ad451e31f053b1c9f47840b2cfa",
|
||||
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55",
|
||||
"reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1739,7 +1744,7 @@
|
||||
"options"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/options-resolver/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/options-resolver/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1755,7 +1760,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-18T09:29:19+00:00"
|
||||
"time": "2024-05-31T14:57:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
@@ -2233,16 +2238,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/process.git",
|
||||
"reference": "3839e56b94dd1dbd13235d27504e66baf23faba0"
|
||||
"reference": "febf90124323a093c7ee06fdb30e765ca3c20028"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/3839e56b94dd1dbd13235d27504e66baf23faba0",
|
||||
"reference": "3839e56b94dd1dbd13235d27504e66baf23faba0",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028",
|
||||
"reference": "febf90124323a093c7ee06fdb30e765ca3c20028",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2274,7 +2279,7 @@
|
||||
"description": "Executes commands in sub-processes",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/process/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/process/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2290,7 +2295,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-18T09:29:19+00:00"
|
||||
"time": "2024-05-31T14:57:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/service-contracts",
|
||||
@@ -2377,16 +2382,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/stopwatch",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/stopwatch.git",
|
||||
"reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84"
|
||||
"reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/41a7a24aa1dc82adf46a06bc292d1923acfe6b84",
|
||||
"reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84",
|
||||
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d",
|
||||
"reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2419,7 +2424,7 @@
|
||||
"description": "Provides a way to profile code",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/stopwatch/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/stopwatch/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2435,20 +2440,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-18T09:29:19+00:00"
|
||||
"time": "2024-05-31T14:57:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/string",
|
||||
"version": "v7.0.7",
|
||||
"version": "v7.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/string.git",
|
||||
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63"
|
||||
"reference": "60bc311c74e0af215101235aa6f471bcbc032df2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63",
|
||||
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2",
|
||||
"reference": "60bc311c74e0af215101235aa6f471bcbc032df2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2462,6 +2467,7 @@
|
||||
"symfony/translation-contracts": "<2.5"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/emoji": "^7.1",
|
||||
"symfony/error-handler": "^6.4|^7.0",
|
||||
"symfony/http-client": "^6.4|^7.0",
|
||||
"symfony/intl": "^6.4|^7.0",
|
||||
@@ -2505,7 +2511,7 @@
|
||||
"utf8"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/string/tree/v7.0.7"
|
||||
"source": "https://github.com/symfony/string/tree/v7.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2521,7 +2527,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-04-18T09:29:19+00:00"
|
||||
"time": "2024-06-04T06:40:14+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
|
21
.env.example
21
.env.example
@@ -299,27 +299,6 @@ DKR_BUILD_LOCALE=false
|
||||
# Won't significantly speed up things.
|
||||
DKR_CHECK_SQLITE=true
|
||||
|
||||
# Run database creation and migration commands. Disable this only if you're 100% sure the DB exists
|
||||
# and is up to date.
|
||||
DKR_RUN_MIGRATION=true
|
||||
|
||||
# Run database upgrade commands. Disable this only when you're 100% sure your DB is up-to-date
|
||||
# with the latest fixes (outside of migrations!)
|
||||
DKR_RUN_UPGRADE=true
|
||||
|
||||
# Verify database integrity. Includes all data checks and verifications.
|
||||
# Disabling this makes Firefly III assume your DB is intact.
|
||||
DKR_RUN_VERIFY=true
|
||||
|
||||
# Run database reporting commands. When disabled, Firefly III won't go over your data to report current state.
|
||||
# Disabling this should have no impact on data integrity or safety but it won't warn you of possible issues.
|
||||
DKR_RUN_REPORT=true
|
||||
|
||||
# Generate OAuth2 keys.
|
||||
# When disabled, Firefly III won't attempt to generate OAuth2 Passport keys. This won't be an issue, IFF (if and only if)
|
||||
# you had previously generated keys already and they're stored in your database for restoration.
|
||||
DKR_RUN_PASSPORT_INSTALL=true
|
||||
|
||||
# Leave the following configuration vars as is.
|
||||
# Unless you like to tinker and know what you're doing.
|
||||
APP_NAME=FireflyIII
|
||||
|
2
.github/workflows/close-duplicates.yml
vendored
2
.github/workflows/close-duplicates.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
close_duplicates:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: github/command@v1.1.1
|
||||
- uses: github/command@v1.2.0
|
||||
id: command
|
||||
with:
|
||||
allowed_contexts: "issue"
|
||||
|
17
.github/workflows/release.yml
vendored
17
.github/workflows/release.yml
vendored
@@ -8,7 +8,7 @@ on:
|
||||
required: true
|
||||
default: 'develop'
|
||||
schedule:
|
||||
- cron: '0 3 * * MON,THU'
|
||||
- cron: '0 3 * * MON'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
php-version: '8.3'
|
||||
extensions: mbstring, intl, zip, bcmath
|
||||
- name: crowdin action
|
||||
uses: crowdin/github-action@v1
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
upload_sources: true
|
||||
download_translations: true
|
||||
@@ -67,6 +67,15 @@ jobs:
|
||||
env:
|
||||
FIREFLY_III_ROOT: /github/workspace
|
||||
GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }}
|
||||
- name: "Create THANKS.md"
|
||||
id: thank-you
|
||||
uses: JC5/firefly-iii-dev@main
|
||||
with:
|
||||
action: 'ff3:thank-you'
|
||||
output: ''
|
||||
env:
|
||||
FIREFLY_III_ROOT: /github/workspace
|
||||
GH_TOKEN: ''
|
||||
- name: Extract changelog
|
||||
id: extract-changelog
|
||||
uses: JC5/firefly-iii-dev@main
|
||||
@@ -116,9 +125,9 @@ jobs:
|
||||
- name: Build JS
|
||||
run: |
|
||||
npm install
|
||||
npm update
|
||||
npm run prod --workspace=v1
|
||||
npm run build --workspace=v2
|
||||
npm update
|
||||
- name: Run CI
|
||||
run: |
|
||||
rm -rf vendor composer.lock
|
||||
@@ -245,7 +254,7 @@ jobs:
|
||||
echo '' >> output.txt
|
||||
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
||||
echo "* 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/)."
|
||||
echo "* 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/)." >> output.txt
|
||||
|
||||
echo "Create default release."
|
||||
git tag -a $releaseName -m "Here be changelog"
|
||||
|
@@ -4,6 +4,7 @@ Over time, many people have contributed to Firefly III. Their efforts are not al
|
||||
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
|
||||
|
||||
## 2024
|
||||
- Steve Wasiura
|
||||
- imlonghao
|
||||
- Rahman Yusuf
|
||||
- Michael Thomas
|
||||
|
@@ -63,7 +63,7 @@ class StoreRequest extends FormRequest
|
||||
'order' => $this->convertInteger('order'),
|
||||
'currency_code' => $this->convertString('currency_code'),
|
||||
'virtual_balance' => $this->convertString('virtual_balance'),
|
||||
'iban' => $this->convertString('iban'),
|
||||
'iban' => $this->convertIban('iban'),
|
||||
'BIC' => $this->convertString('bic'),
|
||||
'account_number' => $this->convertString('account_number'),
|
||||
'account_role' => $this->convertString('account_role'),
|
||||
|
@@ -51,7 +51,7 @@ class UpdateRequest extends FormRequest
|
||||
'include_net_worth' => ['include_net_worth', 'boolean'],
|
||||
'account_type_name' => ['type', 'convertString'],
|
||||
'virtual_balance' => ['virtual_balance', 'convertString'],
|
||||
'iban' => ['iban', 'convertString'],
|
||||
'iban' => ['iban', 'convertIban'],
|
||||
'BIC' => ['bic', 'convertString'],
|
||||
'account_number' => ['account_number', 'convertString'],
|
||||
'account_role' => ['account_role', 'convertString'],
|
||||
|
@@ -58,7 +58,7 @@ class StoreRequest extends FormRequest
|
||||
$models = config('firefly.valid_attachment_models');
|
||||
$models = array_map(
|
||||
static function (string $className) {
|
||||
return str_replace('FireflyIII\\Models\\', '', $className);
|
||||
return str_replace('FireflyIII\Models\\', '', $className);
|
||||
},
|
||||
$models
|
||||
);
|
||||
|
@@ -60,7 +60,7 @@ class UpdateRequest extends FormRequest
|
||||
$models = config('firefly.valid_attachment_models');
|
||||
$models = array_map(
|
||||
static function (string $className) {
|
||||
return str_replace('FireflyIII\\Models\\', '', $className);
|
||||
return str_replace('FireflyIII\Models\\', '', $className);
|
||||
},
|
||||
$models
|
||||
);
|
||||
|
@@ -103,14 +103,14 @@ class StoreRequest extends FormRequest
|
||||
// source of transaction. If everything is null, assume cash account.
|
||||
'source_id' => $this->integerFromValue((string)$object['source_id']),
|
||||
'source_name' => $this->clearString((string)$object['source_name']),
|
||||
'source_iban' => $this->clearString((string)$object['source_iban']),
|
||||
'source_iban' => $this->clearIban((string)$object['source_iban']),
|
||||
'source_number' => $this->clearString((string)$object['source_number']),
|
||||
'source_bic' => $this->clearString((string)$object['source_bic']),
|
||||
|
||||
// destination of transaction. If everything is null, assume cash account.
|
||||
'destination_id' => $this->integerFromValue((string)$object['destination_id']),
|
||||
'destination_name' => $this->clearString((string)$object['destination_name']),
|
||||
'destination_iban' => $this->clearString((string)$object['destination_iban']),
|
||||
'destination_iban' => $this->clearIban((string)$object['destination_iban']),
|
||||
'destination_number' => $this->clearString((string)$object['destination_number']),
|
||||
'destination_bic' => $this->clearString((string)$object['destination_bic']),
|
||||
|
||||
|
@@ -29,24 +29,20 @@ use FireflyIII\Api\V2\Request\Autocomplete\AutocompleteRequest;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\AccountBalance;
|
||||
use FireflyIII\Models\AccountType;
|
||||
use FireflyIII\Models\TransactionCurrency;
|
||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface as AdminAccountRepositoryInterface;
|
||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* Class AccountController
|
||||
*/
|
||||
class AccountController extends Controller
|
||||
{
|
||||
// use AccountFilter;
|
||||
private AdminAccountRepositoryInterface $adminRepository;
|
||||
private TransactionCurrency $default;
|
||||
private ExchangeRateConverter $converter;
|
||||
|
||||
// private array $balanceTypes;
|
||||
// private AccountRepositoryInterface $repository;
|
||||
private AccountRepositoryInterface $repository;
|
||||
private TransactionCurrency $default;
|
||||
private ExchangeRateConverter $converter;
|
||||
|
||||
/**
|
||||
* AccountController constructor.
|
||||
@@ -56,37 +52,24 @@ class AccountController extends Controller
|
||||
parent::__construct();
|
||||
$this->middleware(
|
||||
function ($request, $next) {
|
||||
// new way of user group validation
|
||||
$userGroup = $this->validateUserGroup($request);
|
||||
$this->adminRepository = app(AdminAccountRepositoryInterface::class);
|
||||
$this->adminRepository->setUserGroup($userGroup);
|
||||
$this->default = app('amount')->getDefaultCurrency();
|
||||
$this->converter = app(ExchangeRateConverter::class);
|
||||
|
||||
// $this->repository = app(AccountRepositoryInterface::class);
|
||||
// $this->adminRepository->setUserGroup($this->validateUserGroup($request));
|
||||
$userGroup = $this->validateUserGroup($request);
|
||||
$this->repository = app(AccountRepositoryInterface::class);
|
||||
$this->repository->setUserGroup($userGroup);
|
||||
$this->default = app('amount')->getDefaultCurrency();
|
||||
$this->converter = app(ExchangeRateConverter::class);
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
);
|
||||
// $this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE];
|
||||
}
|
||||
|
||||
/**
|
||||
* Documentation for this endpoint:
|
||||
* TODO list of checks
|
||||
* 1. use dates from ParameterBag
|
||||
* 2. Request validates dates
|
||||
* 3. Request includes user_group_id
|
||||
* 4. Endpoint is documented.
|
||||
* 5. Collector uses user_group_id
|
||||
*
|
||||
* @throws FireflyException
|
||||
* Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getAccountsAC
|
||||
*/
|
||||
public function accounts(AutocompleteRequest $request): JsonResponse
|
||||
{
|
||||
$queryParameters = $request->getParameters();
|
||||
$result = $this->adminRepository->searchAccount((string) $queryParameters['query'], $queryParameters['account_types'], $queryParameters['size']);
|
||||
$result = $this->repository->searchAccount($queryParameters['query'], $queryParameters['account_types'], $queryParameters['size']);
|
||||
$return = [];
|
||||
|
||||
/** @var Account $account */
|
||||
@@ -99,18 +82,18 @@ class AccountController extends Controller
|
||||
|
||||
private function parseAccount(Account $account): array
|
||||
{
|
||||
$currency = $this->adminRepository->getAccountCurrency($account);
|
||||
$currency = $this->repository->getAccountCurrency($account);
|
||||
|
||||
return [
|
||||
'id' => (string) $account->id,
|
||||
'title' => $account->name,
|
||||
'meta' => [
|
||||
'type' => $account->accountType->type,
|
||||
'currency_id' => null === $currency ? null : (string) $currency->id,
|
||||
'currency_code' => $currency?->code,
|
||||
'currency_symbol' => $currency?->symbol,
|
||||
'currency_decimal' => $currency?->decimal_places,
|
||||
'account_balances' => $this->getAccountBalances($account),
|
||||
'type' => $account->accountType->type,
|
||||
'currency_id' => null === $currency ? null : (string) $currency->id,
|
||||
'currency_code' => $currency?->code,
|
||||
'currency_symbol' => $currency?->symbol,
|
||||
'currency_decimal_places' => $currency?->decimal_places,
|
||||
'account_balances' => $this->getAccountBalances($account),
|
||||
],
|
||||
];
|
||||
}
|
||||
@@ -118,32 +101,39 @@ class AccountController extends Controller
|
||||
private function getAccountBalances(Account $account): array
|
||||
{
|
||||
$return = [];
|
||||
$balances = $this->adminRepository->getAccountBalances($account);
|
||||
$balances = $this->repository->getAccountBalances($account);
|
||||
|
||||
/** @var AccountBalance $balance */
|
||||
foreach ($balances as $balance) {
|
||||
$return[] = $this->parseAccountBalance($balance);
|
||||
try {
|
||||
$return[] = $this->parseAccountBalance($balance);
|
||||
} catch (FireflyException $e) {
|
||||
Log::error(sprintf('Could not parse convert account balance: %s', $e->getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws FireflyException
|
||||
*/
|
||||
private function parseAccountBalance(AccountBalance $balance): array
|
||||
{
|
||||
$currency = $balance->transactionCurrency;
|
||||
|
||||
return [
|
||||
'title' => $balance->title,
|
||||
'native_amount' => $this->converter->convert($currency, $this->default, today(), $balance->balance),
|
||||
'amount' => app('steam')->bcround($balance->balance, $currency->decimal_places),
|
||||
'currency_id' => (string) $currency->id,
|
||||
'currency_code' => $currency->code,
|
||||
'currency_symbol' => $currency->symbol,
|
||||
'currency_decimal_places' => $currency->decimal_places,
|
||||
'native_currency_id' => (string) $this->default->id,
|
||||
'native_currency_code' => $this->default->code,
|
||||
'native_currency_symbol' => $this->default->symbol,
|
||||
'native_currency_decimal' => $this->default->decimal_places,
|
||||
'title' => $balance->title,
|
||||
'native_amount' => $this->converter->convert($currency, $this->default, today(), $balance->balance),
|
||||
'amount' => app('steam')->bcround($balance->balance, $currency->decimal_places),
|
||||
'currency_id' => (string) $currency->id,
|
||||
'currency_code' => $currency->code,
|
||||
'currency_symbol' => $currency->symbol,
|
||||
'currency_decimal_places' => $currency->decimal_places,
|
||||
'native_currency_id' => (string) $this->default->id,
|
||||
'native_currency_code' => $this->default->code,
|
||||
'native_currency_symbol' => $this->default->symbol,
|
||||
'native_currency_decimal_places' => $this->default->decimal_places,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@@ -53,23 +53,18 @@ class CategoryController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* Documentation for this endpoint:
|
||||
* TODO list of checks
|
||||
* 1. use dates from ParameterBag
|
||||
* 2. Request validates dates
|
||||
* 3. Request includes user_group_id
|
||||
* 4. Endpoint is documented.
|
||||
* 5. Collector uses user_group_id
|
||||
* Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getCategoriesAC
|
||||
*/
|
||||
public function categories(AutocompleteRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->getData();
|
||||
$result = $this->repository->searchCategory($data['query'], $this->parameters->get('limit'));
|
||||
$filtered = $result->map(
|
||||
$queryParameters = $request->getParameters();
|
||||
$result = $this->repository->searchCategory($queryParameters['query'], $queryParameters['size']);
|
||||
$filtered = $result->map(
|
||||
static function (Category $item) {
|
||||
return [
|
||||
'id' => (string)$item->id,
|
||||
'name' => $item->name,
|
||||
'id' => (string)$item->id,
|
||||
'title' => $item->name,
|
||||
'meta' => [],
|
||||
];
|
||||
}
|
||||
);
|
||||
|
@@ -53,25 +53,20 @@ class TagController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* Documentation for this endpoint:
|
||||
* TODO list of checks
|
||||
* 1. use dates from ParameterBag
|
||||
* 2. Request validates dates
|
||||
* 3. Request includes user_group_id
|
||||
* 4. Endpoint is documented.
|
||||
* 5. Collector uses user_group_id
|
||||
* Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTagsAC
|
||||
*/
|
||||
public function tags(AutocompleteRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->getData();
|
||||
$result = $this->repository->searchTag($data['query'], $data['limit']);
|
||||
$filtered = $result->map(
|
||||
$queryParameters = $request->getParameters();
|
||||
$result = $this->repository->searchTag($queryParameters['query'], $queryParameters['size']);
|
||||
$filtered = $result->map(
|
||||
static function (Tag $item) {
|
||||
return [
|
||||
'id' => (string)$item->id,
|
||||
'name' => $item->tag,
|
||||
'value' => (string)$item->id,
|
||||
'id' => (string) $item->id,
|
||||
'title' => $item->tag,
|
||||
'value' => (string) $item->id,
|
||||
'label' => $item->tag,
|
||||
'meta' => [],
|
||||
];
|
||||
}
|
||||
);
|
||||
|
@@ -53,30 +53,25 @@ class TransactionController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* Documentation for this endpoint:
|
||||
* TODO list of checks
|
||||
* 1. use dates from ParameterBag
|
||||
* 2. Request validates dates
|
||||
* 3. Request includes user_group_id
|
||||
* 4. Endpoint is documented.
|
||||
* 5. Collector uses user_group_id
|
||||
* Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTransactionsAC
|
||||
*/
|
||||
public function transactionDescriptions(AutocompleteRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->getData();
|
||||
$result = $this->repository->searchJournalDescriptions($data['query'], $data['limit']);
|
||||
$queryParameters = $request->getParameters();
|
||||
$result = $this->repository->searchJournalDescriptions($queryParameters['query'], $queryParameters['size']);
|
||||
|
||||
// limit and unique
|
||||
$filtered = $result->unique('description');
|
||||
$array = [];
|
||||
$filtered = $result->unique('description');
|
||||
$array = [];
|
||||
|
||||
/** @var TransactionJournal $journal */
|
||||
foreach ($filtered as $journal) {
|
||||
$array[] = [
|
||||
'id' => (string)$journal->id,
|
||||
'transaction_group_id' => (string)$journal->transaction_group_id,
|
||||
'name' => $journal->description,
|
||||
'description' => $journal->description,
|
||||
'id' => (string) $journal->id,
|
||||
'title' => $journal->description,
|
||||
'meta' => [
|
||||
'transaction_group_id' => (string) $journal->transaction_group_id,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
@@ -24,19 +24,17 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Api\V2\Controllers\Chart;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Api\V2\Controllers\Controller;
|
||||
use FireflyIII\Api\V2\Request\Chart\DashboardChartRequest;
|
||||
use FireflyIII\Enums\UserRoleEnum;
|
||||
use FireflyIII\Api\V2\Request\Chart\ChartRequest;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\AccountType;
|
||||
use FireflyIII\Models\TransactionCurrency;
|
||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\Support\Chart\ChartData;
|
||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
* Class AccountController
|
||||
@@ -44,10 +42,12 @@ use Illuminate\Support\Collection;
|
||||
class AccountController extends Controller
|
||||
{
|
||||
use CleansChartData;
|
||||
use CollectsAccountsFromFilter;
|
||||
use ValidatesUserGroupTrait;
|
||||
|
||||
private AccountRepositoryInterface $repository;
|
||||
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||
private ChartData $chartData;
|
||||
private TransactionCurrency $default;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
@@ -56,6 +56,8 @@ class AccountController extends Controller
|
||||
function ($request, $next) {
|
||||
$this->repository = app(AccountRepositoryInterface::class);
|
||||
$this->repository->setUserGroup($this->validateUserGroup($request));
|
||||
$this->chartData = new ChartData();
|
||||
$this->default = app('amount')->getDefaultCurrency();
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
@@ -63,107 +65,76 @@ class AccountController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* This endpoint is documented at
|
||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/charts/getChartAccountOverview
|
||||
*
|
||||
* The native currency is the preferred currency on the page /currencies.
|
||||
*
|
||||
* If a transaction has foreign currency = native currency, the foreign amount will be used, no conversion
|
||||
* will take place.
|
||||
*
|
||||
* TODO validate and set user_group_id from request
|
||||
* TODO fix documentation
|
||||
*
|
||||
* @throws FireflyException
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
||||
*/
|
||||
public function dashboard(DashboardChartRequest $request): JsonResponse
|
||||
public function dashboard(ChartRequest $request): JsonResponse
|
||||
{
|
||||
/** @var Carbon $start */
|
||||
$start = $this->parameters->get('start');
|
||||
$queryParameters = $request->getParameters();
|
||||
$accounts = $this->getAccountList($queryParameters);
|
||||
|
||||
/** @var Carbon $end */
|
||||
$end = $this->parameters->get('end');
|
||||
$end->endOfDay();
|
||||
|
||||
/** @var TransactionCurrency $default */
|
||||
$default = app('amount')->getDefaultCurrency();
|
||||
$params = $request->getAll();
|
||||
|
||||
/** @var Collection $accounts */
|
||||
$accounts = $params['accounts'];
|
||||
$chartData = [];
|
||||
|
||||
// user's preferences
|
||||
if (0 === $accounts->count()) {
|
||||
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT])->pluck('id')->toArray();
|
||||
$frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
|
||||
|
||||
if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
|
||||
$frontpage->data = $defaultSet;
|
||||
$frontpage->save();
|
||||
}
|
||||
|
||||
$accounts = $this->repository->getAccountsById($frontpage->data);
|
||||
}
|
||||
|
||||
// both options are overruled by "preselected"
|
||||
if ('all' === $params['preselected']) {
|
||||
$accounts = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]);
|
||||
}
|
||||
if ('assets' === $params['preselected']) {
|
||||
$accounts = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT]);
|
||||
}
|
||||
if ('liabilities' === $params['preselected']) {
|
||||
$accounts = $this->repository->getAccountsByType([AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]);
|
||||
}
|
||||
// move date to end of day
|
||||
$queryParameters['start']->startOfDay();
|
||||
$queryParameters['end']->endOfDay();
|
||||
|
||||
// loop each account, and collect info:
|
||||
/** @var Account $account */
|
||||
foreach ($accounts as $account) {
|
||||
$currency = $this->repository->getAccountCurrency($account);
|
||||
if (null === $currency) {
|
||||
$currency = $default;
|
||||
}
|
||||
$currentSet = [
|
||||
'label' => $account->name,
|
||||
// the currency that belongs to the account.
|
||||
'currency_id' => (string)$currency->id,
|
||||
'currency_code' => $currency->code,
|
||||
'currency_symbol' => $currency->symbol,
|
||||
'currency_decimal_places' => $currency->decimal_places,
|
||||
|
||||
// the default currency of the user (could be the same!)
|
||||
'native_currency_id' => (string)$default->id,
|
||||
'native_currency_code' => $default->code,
|
||||
'native_currency_symbol' => $default->symbol,
|
||||
'native_currency_decimal_places' => $default->decimal_places,
|
||||
'start' => $start->toAtomString(),
|
||||
'end' => $end->toAtomString(),
|
||||
'period' => '1D',
|
||||
'entries' => [],
|
||||
'native_entries' => [],
|
||||
];
|
||||
$currentStart = clone $start;
|
||||
$range = app('steam')->balanceInRange($account, $start, clone $end, $currency);
|
||||
$rangeConverted = app('steam')->balanceInRangeConverted($account, $start, clone $end, $default);
|
||||
|
||||
$previous = array_values($range)[0];
|
||||
$previousConverted = array_values($rangeConverted)[0];
|
||||
while ($currentStart <= $end) {
|
||||
$format = $currentStart->format('Y-m-d');
|
||||
$label = $currentStart->toAtomString();
|
||||
$balance = array_key_exists($format, $range) ? $range[$format] : $previous;
|
||||
$balanceConverted = array_key_exists($format, $rangeConverted) ? $rangeConverted[$format] : $previousConverted;
|
||||
$previous = $balance;
|
||||
$previousConverted = $balanceConverted;
|
||||
|
||||
$currentStart->addDay();
|
||||
$currentSet['entries'][$label] = $balance;
|
||||
$currentSet['native_entries'][$label] = $balanceConverted;
|
||||
}
|
||||
$chartData[] = $currentSet;
|
||||
$this->renderAccountData($queryParameters, $account);
|
||||
}
|
||||
|
||||
return response()->json($this->clean($chartData));
|
||||
return response()->json($this->chartData->render());
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws FireflyException
|
||||
*/
|
||||
private function renderAccountData(array $params, Account $account): void
|
||||
{
|
||||
$currency = $this->repository->getAccountCurrency($account);
|
||||
if (null === $currency) {
|
||||
$currency = $this->default;
|
||||
}
|
||||
$currentSet = [
|
||||
'label' => $account->name,
|
||||
|
||||
// the currency that belongs to the account.
|
||||
'currency_id' => (string) $currency->id,
|
||||
'currency_code' => $currency->code,
|
||||
'currency_symbol' => $currency->symbol,
|
||||
'currency_decimal_places' => $currency->decimal_places,
|
||||
|
||||
// the default currency of the user (could be the same!)
|
||||
'native_currency_id' => (string) $this->default->id,
|
||||
'native_currency_code' => $this->default->code,
|
||||
'native_currency_symbol' => $this->default->symbol,
|
||||
'native_currency_decimal_places' => $this->default->decimal_places,
|
||||
'date' => $params['start']->toAtomString(),
|
||||
'start' => $params['start']->toAtomString(),
|
||||
'end' => $params['end']->toAtomString(),
|
||||
'period' => '1D',
|
||||
'entries' => [],
|
||||
'native_entries' => [],
|
||||
];
|
||||
$currentStart = clone $params['start'];
|
||||
$range = app('steam')->balanceInRange($account, $params['start'], clone $params['end'], $currency);
|
||||
$rangeConverted = app('steam')->balanceInRangeConverted($account, $params['start'], clone $params['end'], $this->default);
|
||||
|
||||
$previous = array_values($range)[0];
|
||||
$previousConverted = array_values($rangeConverted)[0];
|
||||
while ($currentStart <= $params['end']) {
|
||||
$format = $currentStart->format('Y-m-d');
|
||||
$label = $currentStart->toAtomString();
|
||||
$balance = array_key_exists($format, $range) ? $range[$format] : $previous;
|
||||
$balanceConverted = array_key_exists($format, $rangeConverted) ? $rangeConverted[$format] : $previousConverted;
|
||||
$previous = $balance;
|
||||
$previousConverted = $balanceConverted;
|
||||
|
||||
$currentStart->addDay();
|
||||
$currentSet['entries'][$label] = $balance;
|
||||
$currentSet['native_entries'][$label] = $balanceConverted;
|
||||
}
|
||||
$this->chartData->add($currentSet);
|
||||
}
|
||||
}
|
||||
|
@@ -24,18 +24,18 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Api\V2\Controllers\Chart;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Api\V2\Controllers\Controller;
|
||||
use FireflyIII\Api\V2\Request\Chart\BalanceChartRequest;
|
||||
use FireflyIII\Enums\UserRoleEnum;
|
||||
use FireflyIII\Api\V2\Request\Chart\ChartRequest;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||
use FireflyIII\Models\TransactionCurrency;
|
||||
use FireflyIII\Models\TransactionType;
|
||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\Support\Chart\ChartData;
|
||||
use FireflyIII\Support\Http\Api\AccountBalanceGrouped;
|
||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
* Class BalanceController
|
||||
@@ -43,7 +43,30 @@ use Illuminate\Support\Collection;
|
||||
class BalanceController extends Controller
|
||||
{
|
||||
use CleansChartData;
|
||||
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||
use CollectsAccountsFromFilter;
|
||||
|
||||
private AccountRepositoryInterface $repository;
|
||||
private GroupCollectorInterface $collector;
|
||||
private ChartData $chartData;
|
||||
private TransactionCurrency $default;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->middleware(
|
||||
function ($request, $next) {
|
||||
$this->repository = app(AccountRepositoryInterface::class);
|
||||
$this->collector = app(GroupCollectorInterface::class);
|
||||
$userGroup = $this->validateUserGroup($request);
|
||||
$this->repository->setUserGroup($userGroup);
|
||||
$this->collector->setUserGroup($userGroup);
|
||||
$this->chartData = new ChartData();
|
||||
$this->default = app('amount')->getDefaultCurrency();
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The code is practically a duplicate of ReportController::operations.
|
||||
@@ -54,50 +77,43 @@ class BalanceController extends Controller
|
||||
* If the transaction being processed is already in native currency OR if the
|
||||
* foreign amount is in the native currency, the amount will not be converted.
|
||||
*
|
||||
* TODO validate and set user_group_id
|
||||
* TODO collector set group, not user
|
||||
*
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function balance(BalanceChartRequest $request): JsonResponse
|
||||
public function balance(ChartRequest $request): JsonResponse
|
||||
{
|
||||
$params = $request->getAll();
|
||||
$queryParameters = $request->getParameters();
|
||||
$accounts = $this->getAccountList($queryParameters);
|
||||
|
||||
/** @var Carbon $start */
|
||||
$start = $this->parameters->get('start');
|
||||
|
||||
/** @var Carbon $end */
|
||||
$end = $this->parameters->get('end');
|
||||
$end->endOfDay();
|
||||
|
||||
/** @var Collection $accounts */
|
||||
$accounts = $params['accounts'];
|
||||
|
||||
/** @var string $preferredRange */
|
||||
$preferredRange = $params['period'];
|
||||
// move date to end of day
|
||||
$queryParameters['start']->startOfDay();
|
||||
$queryParameters['end']->endOfDay();
|
||||
|
||||
// prepare for currency conversion and data collection:
|
||||
/** @var TransactionCurrency $default */
|
||||
$default = app('amount')->getDefaultCurrency();
|
||||
$default = app('amount')->getDefaultCurrency();
|
||||
|
||||
// get journals for entire period:
|
||||
/** @var GroupCollectorInterface $collector */
|
||||
$collector = app(GroupCollectorInterface::class);
|
||||
$collector->setRange($start, $end)->withAccountInformation();
|
||||
$collector->setXorAccounts($accounts);
|
||||
$collector->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::RECONCILIATION, TransactionType::TRANSFER]);
|
||||
$journals = $collector->getExtractedJournals();
|
||||
|
||||
$object = new AccountBalanceGrouped();
|
||||
$object->setPreferredRange($preferredRange);
|
||||
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
|
||||
->withAccountInformation()
|
||||
->setXorAccounts($accounts)
|
||||
->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::RECONCILIATION, TransactionType::TRANSFER])
|
||||
;
|
||||
$journals = $this->collector->getExtractedJournals();
|
||||
|
||||
$object = new AccountBalanceGrouped();
|
||||
$object->setPreferredRange($queryParameters['period']);
|
||||
$object->setDefault($default);
|
||||
$object->setAccounts($accounts);
|
||||
$object->setJournals($journals);
|
||||
$object->setStart($start);
|
||||
$object->setEnd($end);
|
||||
$object->setStart($queryParameters['start']);
|
||||
$object->setEnd($queryParameters['end']);
|
||||
$object->groupByCurrencyAndPeriod();
|
||||
$chartData = $object->convertToChartData();
|
||||
$data = $object->convertToChartData();
|
||||
foreach ($data as $entry) {
|
||||
$this->chartData->add($entry);
|
||||
}
|
||||
|
||||
return response()->json($this->clean($chartData));
|
||||
return response()->json($this->chartData->render());
|
||||
}
|
||||
}
|
||||
|
@@ -23,18 +23,15 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Api\V2\Request\Autocomplete;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Carbon\Exceptions\InvalidFormatException;
|
||||
use FireflyIII\JsonApi\Rules\IsValidFilter;
|
||||
use FireflyIII\JsonApi\Rules\IsValidPage;
|
||||
use FireflyIII\Models\AccountType;
|
||||
use FireflyIII\Support\Http\Api\AccountFilter;
|
||||
use FireflyIII\Support\Http\Api\ParsesQueryFilters;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use LaravelJsonApi\Core\Query\QueryParameters;
|
||||
use LaravelJsonApi\Validation\Rule as JsonApiRule;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* Class AutocompleteRequest
|
||||
@@ -44,6 +41,7 @@ class AutocompleteRequest extends FormRequest
|
||||
use AccountFilter;
|
||||
use ChecksLogin;
|
||||
use ConvertsDataTypes;
|
||||
use ParsesQueryFilters;
|
||||
|
||||
/**
|
||||
* Loops over all possible query parameters (these are shared over ALL auto complete requests)
|
||||
@@ -55,43 +53,11 @@ class AutocompleteRequest extends FormRequest
|
||||
{
|
||||
$queryParameters = QueryParameters::cast($this->all());
|
||||
|
||||
try {
|
||||
$date = Carbon::createFromFormat('Y-m-d', $queryParameters->filter()?->value('date', date('Y-m-d')), config('app.timezone'));
|
||||
} catch (InvalidFormatException $e) {
|
||||
Log::debug(sprintf('Invalid date format in autocomplete request. Using today: %s', $e->getMessage()));
|
||||
$date = today();
|
||||
}
|
||||
$query = $queryParameters->filter()?->value('query', '') ?? '';
|
||||
$size = (int) ($queryParameters->page()['size'] ?? 50);
|
||||
$accountTypes = $this->getAccountTypeParameter($queryParameters->filter()?->value('account_types', '') ?? '');
|
||||
|
||||
return [
|
||||
'date' => $date,
|
||||
'query' => $query,
|
||||
'size' => $size,
|
||||
'account_types' => $accountTypes,
|
||||
];
|
||||
}
|
||||
|
||||
public function getData(): array
|
||||
{
|
||||
return [];
|
||||
$types = $this->convertString('types');
|
||||
$array = [];
|
||||
if ('' !== $types) {
|
||||
$array = explode(',', $types);
|
||||
}
|
||||
$limit = $this->convertInteger('limit');
|
||||
$limit = 0 === $limit ? 10 : $limit;
|
||||
|
||||
// remove 'initial balance' and another from allowed types. its internal
|
||||
$array = array_diff($array, [AccountType::INITIAL_BALANCE, AccountType::RECONCILIATION]);
|
||||
|
||||
return [
|
||||
'types' => $array,
|
||||
'query' => $this->convertString('query'),
|
||||
'date' => $this->getCarbonDate('date'),
|
||||
'limit' => $limit,
|
||||
'date' => $this->dateOrToday($queryParameters, 'date'),
|
||||
'query' => $this->arrayOfStrings($queryParameters, 'query'),
|
||||
'size' => $this->integerFromQueryParams($queryParameters, 'size', 50),
|
||||
'account_types' => $this->getAccountTypeParameter($this->arrayOfStrings($queryParameters, 'account_types')),
|
||||
];
|
||||
}
|
||||
|
||||
|
118
app/Api/V2/Request/Chart/ChartRequest.php
Normal file
118
app/Api/V2/Request/Chart/ChartRequest.php
Normal file
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
/*
|
||||
* DashboardChartRequest.php
|
||||
* Copyright (c) 2023 james@firefly-iii.org
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Api\V2\Request\Chart;
|
||||
|
||||
use FireflyIII\Enums\UserRoleEnum;
|
||||
use FireflyIII\JsonApi\Rules\IsValidFilter;
|
||||
use FireflyIII\Rules\IsFilterValueIn;
|
||||
use FireflyIII\Support\Http\Api\ParsesQueryFilters;
|
||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Validation\Validator;
|
||||
use LaravelJsonApi\Core\Query\QueryParameters;
|
||||
use LaravelJsonApi\Validation\Rule as JsonApiRule;
|
||||
|
||||
/**
|
||||
* Class ChartRequest
|
||||
*/
|
||||
class ChartRequest extends FormRequest
|
||||
{
|
||||
use ChecksLogin;
|
||||
use ConvertsDataTypes;
|
||||
use ParsesQueryFilters;
|
||||
use ValidatesUserGroupTrait;
|
||||
|
||||
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||
|
||||
public function getParameters(): array
|
||||
{
|
||||
$queryParameters = QueryParameters::cast($this->all());
|
||||
|
||||
return [
|
||||
'start' => $this->dateOrToday($queryParameters, 'start'),
|
||||
'end' => $this->dateOrToday($queryParameters, 'end'),
|
||||
'preselected' => $this->stringFromQueryParams($queryParameters, 'preselected', 'empty'),
|
||||
'period' => $this->stringFromQueryParams($queryParameters, 'period', '1M'),
|
||||
'accounts' => $this->arrayOfStrings($queryParameters, 'accounts'),
|
||||
// preselected heeft maar een paar toegestane waardes, dat moet ook goed gaan.
|
||||
// 'query' => $this->arrayOfStrings($queryParameters, 'query'),
|
||||
// 'size' => $this->integerFromQueryParams($queryParameters,'size', 50),
|
||||
// 'account_types' => $this->getAccountTypeParameter($this->arrayOfStrings($queryParameters, 'account_types')),
|
||||
];
|
||||
// collect accounts based on this list?
|
||||
}
|
||||
|
||||
// return [
|
||||
// 'accounts' => $this->getAccountList(),
|
||||
// 'preselected' => $this->convertString('preselected'),
|
||||
// ];
|
||||
// }
|
||||
|
||||
/**
|
||||
* The rules that the incoming request must be matched against.
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'fields' => JsonApiRule::notSupported(),
|
||||
'filter' => ['nullable', 'array',
|
||||
new IsValidFilter(['start', 'end', 'preselected', 'accounts']),
|
||||
new IsFilterValueIn('preselected', config('firefly.preselected_accounts')),
|
||||
],
|
||||
'include' => JsonApiRule::notSupported(),
|
||||
'page' => JsonApiRule::notSupported(),
|
||||
'sort' => JsonApiRule::notSupported(),
|
||||
];
|
||||
|
||||
// return [
|
||||
// 'start' => 'required|date|after:1900-01-01|before:2099-12-31',
|
||||
// 'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01',
|
||||
// 'preselected' => sprintf('in:%s', implode(',', config('firefly.preselected_accounts'))),
|
||||
// 'accounts.*' => 'exists:accounts,id',
|
||||
// ];
|
||||
}
|
||||
|
||||
public function withValidator(Validator $validator): void
|
||||
{
|
||||
$validator->after(
|
||||
static function (Validator $validator): void {
|
||||
// validate transaction query data.
|
||||
$data = $validator->getData();
|
||||
if (!array_key_exists('accounts', $data)) {
|
||||
// $validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts']));
|
||||
return;
|
||||
}
|
||||
if (!is_array($data['accounts'])) {
|
||||
$validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts']));
|
||||
}
|
||||
}
|
||||
);
|
||||
if ($validator->fails()) {
|
||||
Log::channel('audit')->error(sprintf('Validation errors in %s', __CLASS__), $validator->errors()->toArray());
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,32 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Console\Commands\Correction;
|
||||
|
||||
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
|
||||
use FireflyIII\Support\Models\AccountBalanceCalculator;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
/**
|
||||
* Class CorrectionSkeleton
|
||||
*/
|
||||
class CorrectAccountBalance extends Command
|
||||
{
|
||||
use ShowsFriendlyMessages;
|
||||
protected $description = 'Recalculate all account balance amounts';
|
||||
|
||||
protected $signature = 'firefly-iii:correct-account-balance';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$this->correctBalanceAmounts();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private function correctBalanceAmounts(): void
|
||||
{
|
||||
AccountBalanceCalculator::recalculate(null, null);
|
||||
}
|
||||
}
|
@@ -74,7 +74,6 @@ class CorrectDatabase extends Command
|
||||
'firefly-iii:unify-group-accounts',
|
||||
'firefly-iii:trigger-credit-recalculation',
|
||||
'firefly-iii:migrate-preferences',
|
||||
'firefly-iii:correct-account-balance',
|
||||
];
|
||||
foreach ($commands as $command) {
|
||||
$this->friendlyLine(sprintf('Now executing command "%s"', $command));
|
||||
|
@@ -60,15 +60,13 @@ class FixIbans extends Command
|
||||
{
|
||||
/** @var Account $account */
|
||||
foreach ($accounts as $account) {
|
||||
$iban = $account->iban;
|
||||
if (str_contains($iban, ' ')) {
|
||||
$iban = app('steam')->filterSpaces((string)$account->iban);
|
||||
if ('' !== $iban) {
|
||||
$account->iban = $iban;
|
||||
$account->save();
|
||||
$this->friendlyInfo(sprintf('Removed spaces from IBAN of account #%d', $account->id));
|
||||
++$this->count;
|
||||
}
|
||||
$iban = (string) $account->iban;
|
||||
$newIban = app('steam')->filterSpaces($iban);
|
||||
if ('' !== $iban && $iban !== $newIban) {
|
||||
$account->iban = $newIban;
|
||||
$account->save();
|
||||
$this->friendlyInfo(sprintf('Removed spaces from IBAN of account #%d', $account->id));
|
||||
++$this->count;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -81,7 +79,7 @@ class FixIbans extends Command
|
||||
foreach ($accounts as $account) {
|
||||
$userId = $account->user_id;
|
||||
$set[$userId] ??= [];
|
||||
$iban = (string)$account->iban;
|
||||
$iban = (string) $account->iban;
|
||||
if ('' === $iban) {
|
||||
continue;
|
||||
}
|
||||
|
@@ -115,7 +115,7 @@ class UpdateGroupInformation extends Command
|
||||
return;
|
||||
}
|
||||
if (0 !== $result) {
|
||||
$this->friendlyPositive(sprintf('User #%d: Moved %d %s objects to the correct group.', $user->id, $result, str_replace('FireflyIII\\Models\\', '', $className)));
|
||||
$this->friendlyPositive(sprintf('User #%d: Moved %d %s objects to the correct group.', $user->id, $result, str_replace('FireflyIII\Models\\', '', $className)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -111,7 +111,7 @@ class ForceDecimalSize extends Command
|
||||
{
|
||||
// switch stuff based on database connection:
|
||||
$this->operator = 'REGEXP';
|
||||
$this->regularExpression = '\'\\\\.[\\\\d]{%d}[1-9]+\'';
|
||||
$this->regularExpression = '\'\\\.[\\\d]{%d}[1-9]+\'';
|
||||
$this->cast = 'CHAR';
|
||||
if ('pgsql' === config('database.default')) {
|
||||
$this->operator = 'SIMILAR TO';
|
||||
@@ -119,7 +119,7 @@ class ForceDecimalSize extends Command
|
||||
$this->cast = 'TEXT';
|
||||
}
|
||||
if ('sqlite' === config('database.default')) {
|
||||
$this->regularExpression = '"\\.[\d]{%d}[1-9]+"';
|
||||
$this->regularExpression = '"\.[\d]{%d}[1-9]+"';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -307,7 +307,7 @@ class ForceDecimalSize extends Command
|
||||
/** @var string $field */
|
||||
foreach ($fields as $field) {
|
||||
$value = $item->{$field};
|
||||
if (null === $value) {
|
||||
if (null === $value || '' === $value) {
|
||||
continue;
|
||||
}
|
||||
// fix $field by rounding it down correctly.
|
||||
|
69
app/Console/Commands/Upgrade/CorrectAccountBalance.php
Normal file
69
app/Console/Commands/Upgrade/CorrectAccountBalance.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/*
|
||||
* CorrectAccountBalance.php
|
||||
* Copyright (c) 2024 james@firefly-iii.org.
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Console\Commands\Upgrade;
|
||||
|
||||
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
|
||||
use FireflyIII\Support\Models\AccountBalanceCalculator;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
/**
|
||||
* Class CorrectionSkeleton
|
||||
*/
|
||||
class CorrectAccountBalance extends Command
|
||||
{
|
||||
use ShowsFriendlyMessages;
|
||||
public const string CONFIG_NAME = '610_correct_balances';
|
||||
protected $description = 'Recalculate all account balance amounts';
|
||||
protected $signature = 'firefly-iii:correct-account-balance {--F|force : Force the execution of this command.}';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
if ($this->isExecuted() && true !== $this->option('force')) {
|
||||
$this->friendlyInfo('This command has already been executed.');
|
||||
|
||||
return 0;
|
||||
}
|
||||
$this->correctBalanceAmounts();
|
||||
$this->markAsExecuted();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private function correctBalanceAmounts(): void
|
||||
{
|
||||
AccountBalanceCalculator::recalculateAll();
|
||||
}
|
||||
|
||||
private function isExecuted(): bool
|
||||
{
|
||||
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false);
|
||||
|
||||
return (bool)$configVar?->data;
|
||||
}
|
||||
|
||||
private function markAsExecuted(): void
|
||||
{
|
||||
app('fireflyconfig')->set(self::CONFIG_NAME, true);
|
||||
}
|
||||
}
|
@@ -65,6 +65,7 @@ class UpgradeDatabase extends Command
|
||||
'firefly-iii:budget-limit-periods',
|
||||
'firefly-iii:migrate-rule-actions',
|
||||
'firefly-iii:restore-oauth-keys',
|
||||
'firefly-iii:correct-account-balance',
|
||||
// also just in case, some integrity commands:
|
||||
'firefly-iii:create-group-memberships',
|
||||
'firefly-iii:upgrade-group-information',
|
||||
|
@@ -43,7 +43,7 @@ class AttachmentFactory
|
||||
public function create(array $data): ?Attachment
|
||||
{
|
||||
// append if necessary.
|
||||
$model = !str_contains($data['attachable_type'], 'FireflyIII') ? sprintf('FireflyIII\\Models\\%s', $data['attachable_type'])
|
||||
$model = !str_contains($data['attachable_type'], 'FireflyIII') ? sprintf('FireflyIII\Models\%s', $data['attachable_type'])
|
||||
: $data['attachable_type'];
|
||||
|
||||
// get journal instead of transaction.
|
||||
|
@@ -40,12 +40,12 @@ class TransactionObserver
|
||||
public function updated(Transaction $transaction): void
|
||||
{
|
||||
app('log')->debug('Observe "updated" of a transaction.');
|
||||
AccountBalanceCalculator::recalculateForAccount($transaction->account);
|
||||
AccountBalanceCalculator::recalculateForJournal($transaction->transactionJournal);
|
||||
}
|
||||
|
||||
public function created(Transaction $transaction): void
|
||||
{
|
||||
app('log')->debug('Observe "created" of a transaction.');
|
||||
AccountBalanceCalculator::recalculateForAccount($transaction->account);
|
||||
AccountBalanceCalculator::recalculateForJournal($transaction->transactionJournal);
|
||||
}
|
||||
}
|
||||
|
@@ -121,7 +121,7 @@ class LoginController extends Controller
|
||||
|
||||
// Copied directly from AuthenticatesUsers, but with logging added:
|
||||
// If the login attempt was unsuccessful we will increment the number of attempts
|
||||
// to login and redirect the user back to the login form. Of course, when this
|
||||
// to log in and redirect the user back to the login form. Of course, when this
|
||||
// user surpasses their maximum number of attempts they will get locked out.
|
||||
$this->incrementLoginAttempts($request);
|
||||
Log::channel('audit')->warning(sprintf('Login failed. Attempt for user "%s" failed.', $request->get($this->username())));
|
||||
@@ -233,7 +233,7 @@ class LoginController extends Controller
|
||||
$storeInCookie = config('google2fa.store_in_cookie', false);
|
||||
if (false !== $storeInCookie) {
|
||||
$cookieName = config('google2fa.cookie_name', 'google2fa_token');
|
||||
request()->cookies->set($cookieName, 'invalid');
|
||||
\Cookie::queue(\Cookie::make($cookieName, 'invalid-'.time()));
|
||||
}
|
||||
$usernameField = $this->username();
|
||||
|
||||
|
@@ -185,7 +185,7 @@ class BudgetLimitController extends Controller
|
||||
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']);
|
||||
$array['days_left'] = (string)$this->activeDaysLeft($start, $end);
|
||||
// left per day:
|
||||
$array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
|
||||
$array['left_per_day'] = 0 === bccomp('0', $array['days_left']) ? bcadd($array['spent'], $array['amount']) : bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
|
||||
|
||||
// left per day formatted.
|
||||
$array['left_per_day_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $array['left_per_day']);
|
||||
|
@@ -93,7 +93,6 @@ class DebugController extends Controller
|
||||
Artisan::call('view:clear');
|
||||
|
||||
// also do some recalculations.
|
||||
Artisan::call('firefly-iii:correct-account-balance');
|
||||
Artisan::call('firefly-iii:trigger-credit-recalculation');
|
||||
|
||||
try {
|
||||
|
@@ -65,7 +65,7 @@ class HomeController extends Controller
|
||||
$stringEnd = '';
|
||||
|
||||
try {
|
||||
$stringStart = e((string)$request->get('start'));
|
||||
$stringStart = e((string) $request->get('start'));
|
||||
$start = Carbon::createFromFormat('Y-m-d', $stringStart);
|
||||
} catch (InvalidFormatException $e) {
|
||||
app('log')->error(sprintf('Start: could not parse date string "%s" so ignore it.', $stringStart));
|
||||
@@ -73,7 +73,7 @@ class HomeController extends Controller
|
||||
}
|
||||
|
||||
try {
|
||||
$stringEnd = e((string)$request->get('end'));
|
||||
$stringEnd = e((string) $request->get('end'));
|
||||
$end = Carbon::createFromFormat('Y-m-d', $stringEnd);
|
||||
} catch (InvalidFormatException $e) {
|
||||
app('log')->error(sprintf('End could not parse date string "%s" so ignore it.', $stringEnd));
|
||||
@@ -92,7 +92,7 @@ class HomeController extends Controller
|
||||
app('log')->debug('dateRange: Received dateRange', ['start' => $stringStart, 'end' => $stringEnd, 'label' => $request->get('label')]);
|
||||
// check if the label is "everything" or "Custom range" which will betray
|
||||
// a possible problem with the budgets.
|
||||
if ($label === (string)trans('firefly.everything') || $label === (string)trans('firefly.customRange')) {
|
||||
if ($label === (string) trans('firefly.everything') || $label === (string) trans('firefly.customRange')) {
|
||||
$isCustomRange = true;
|
||||
app('log')->debug('Range is now marked as "custom".');
|
||||
}
|
||||
@@ -100,7 +100,7 @@ class HomeController extends Controller
|
||||
$diff = $start->diffInDays($end, true) + 1;
|
||||
|
||||
if ($diff > 366) {
|
||||
$request->session()->flash('warning', (string)trans('firefly.warning_much_data', ['days' => (int)$diff]));
|
||||
$request->session()->flash('warning', (string) trans('firefly.warning_much_data', ['days' => (int) $diff]));
|
||||
}
|
||||
|
||||
$request->session()->put('is_custom_range', $isCustomRange);
|
||||
@@ -128,10 +128,10 @@ class HomeController extends Controller
|
||||
return redirect(route('new-user.index'));
|
||||
}
|
||||
|
||||
if ('v1' === (string)config('view.layout')) {
|
||||
if ('v1' === (string) config('view.layout')) {
|
||||
return $this->indexV1($repository);
|
||||
}
|
||||
if ('v2' === (string)config('view.layout')) {
|
||||
if ('v2' === (string) config('view.layout')) {
|
||||
return $this->indexV2();
|
||||
}
|
||||
|
||||
@@ -141,8 +141,9 @@ class HomeController extends Controller
|
||||
private function indexV1(AccountRepositoryInterface $repository): mixed
|
||||
{
|
||||
$types = config('firefly.accountTypesByIdentifier.asset');
|
||||
$pageTitle = (string) trans('firefly.main_dashboard_page_title');
|
||||
$count = $repository->count($types);
|
||||
$subTitle = (string)trans('firefly.welcome_back');
|
||||
$subTitle = (string) trans('firefly.welcome_back');
|
||||
$transactions = [];
|
||||
$frontpage = app('preferences')->getFresh('frontpageAccounts', $repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray());
|
||||
$frontpageArray = $frontpage->data;
|
||||
@@ -177,20 +178,21 @@ class HomeController extends Controller
|
||||
$user = auth()->user();
|
||||
event(new RequestedVersionCheckStatus($user));
|
||||
|
||||
return view('index', compact('count', 'subTitle', 'transactions', 'billCount', 'start', 'end', 'today'));
|
||||
return view('index', compact('count', 'subTitle', 'transactions', 'billCount', 'start', 'end', 'today', 'pageTitle'));
|
||||
}
|
||||
|
||||
private function indexV2(): mixed
|
||||
{
|
||||
$subTitle = (string)trans('firefly.welcome_back');
|
||||
$subTitle = (string) trans('firefly.welcome_back');
|
||||
$pageTitle = (string) trans('firefly.main_dashboard_page_title');
|
||||
|
||||
$start = session('start', today(config('app.timezone'))->startOfMonth());
|
||||
$end = session('end', today(config('app.timezone'))->endOfMonth());
|
||||
$start = session('start', today(config('app.timezone'))->startOfMonth());
|
||||
$end = session('end', today(config('app.timezone'))->endOfMonth());
|
||||
|
||||
/** @var User $user */
|
||||
$user = auth()->user();
|
||||
$user = auth()->user();
|
||||
event(new RequestedVersionCheckStatus($user));
|
||||
|
||||
return view('index', compact('subTitle', 'start', 'end'));
|
||||
return view('index', compact('subTitle', 'start', 'end', 'pageTitle'));
|
||||
}
|
||||
}
|
||||
|
@@ -120,7 +120,7 @@ class PreferencesController extends Controller
|
||||
// list of locales also has "equal" which makes it equal to whatever the language is.
|
||||
|
||||
try {
|
||||
$locales = json_decode((string)file_get_contents(resource_path(sprintf('lang/%s/locales.json', $language))), true, 512, JSON_THROW_ON_ERROR);
|
||||
$locales = json_decode((string)file_get_contents(resource_path(sprintf('locales/%s/locales.json', $language))), true, 512, JSON_THROW_ON_ERROR);
|
||||
} catch (\JsonException $e) {
|
||||
app('log')->error($e->getMessage());
|
||||
$locales = [];
|
||||
|
@@ -23,7 +23,6 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Http\Controllers\Transaction;
|
||||
|
||||
use Exception;
|
||||
use FireflyIII\Events\UpdatedTransactionGroup;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Http\Controllers\Controller;
|
||||
@@ -65,7 +64,7 @@ class ConvertController extends Controller
|
||||
$this->middleware(
|
||||
function ($request, $next) {
|
||||
$this->accountRepository = app(AccountRepositoryInterface::class);
|
||||
app('view')->share('title', (string)trans('firefly.transactions'));
|
||||
app('view')->share('title', (string) trans('firefly.transactions'));
|
||||
app('view')->share('mainTitleIcon', 'fa-exchange');
|
||||
|
||||
return $next($request);
|
||||
@@ -95,7 +94,7 @@ class ConvertController extends Controller
|
||||
|
||||
$groupTitle = $group->title ?? $first->description;
|
||||
$groupArray = $transformer->transformObject($group);
|
||||
$subTitle = (string)trans('firefly.convert_to_'.$destinationType->type, ['description' => $groupTitle]);
|
||||
$subTitle = (string) trans('firefly.convert_to_'.$destinationType->type, ['description' => $groupTitle]);
|
||||
$subTitleIcon = 'fa-exchange';
|
||||
|
||||
// get a list of asset accounts and liabilities and stuff, in various combinations:
|
||||
@@ -111,7 +110,7 @@ class ConvertController extends Controller
|
||||
|
||||
if ($sourceType->type === $destinationType->type) { // cannot convert to its own type.
|
||||
app('log')->debug('This is already a transaction of the expected type..');
|
||||
session()->flash('info', (string)trans('firefly.convert_is_already_type_'.$destinationType->type));
|
||||
session()->flash('info', (string) trans('firefly.convert_is_already_type_'.$destinationType->type));
|
||||
|
||||
return redirect(route('transactions.show', [$group->id]));
|
||||
}
|
||||
@@ -147,7 +146,7 @@ class ConvertController extends Controller
|
||||
// group accounts:
|
||||
/** @var Account $account */
|
||||
foreach ($accountList as $account) {
|
||||
$role = (string)$this->accountRepository->getMetaValue($account, 'account_role');
|
||||
$role = (string) $this->accountRepository->getMetaValue($account, 'account_role');
|
||||
$name = $account->name;
|
||||
if ('' === $role) {
|
||||
$role = 'no_account_type';
|
||||
@@ -165,7 +164,7 @@ class ConvertController extends Controller
|
||||
$role = 'revenue_account';
|
||||
}
|
||||
|
||||
$key = (string)trans('firefly.opt_group_'.$role);
|
||||
$key = (string) trans('firefly.opt_group_'.$role);
|
||||
$grouped[$key][$account->id] = $name;
|
||||
}
|
||||
|
||||
@@ -184,7 +183,7 @@ class ConvertController extends Controller
|
||||
// group accounts:
|
||||
/** @var Account $account */
|
||||
foreach ($accountList as $account) {
|
||||
$role = (string)$this->accountRepository->getMetaValue($account, 'account_role');
|
||||
$role = (string) $this->accountRepository->getMetaValue($account, 'account_role');
|
||||
$name = $account->name;
|
||||
if ('' === $role) {
|
||||
$role = 'no_account_type';
|
||||
@@ -202,7 +201,7 @@ class ConvertController extends Controller
|
||||
$role = 'expense_account';
|
||||
}
|
||||
|
||||
$key = (string)trans('firefly.opt_group_'.$role);
|
||||
$key = (string) trans('firefly.opt_group_'.$role);
|
||||
$grouped[$key][$account->id] = $name;
|
||||
}
|
||||
|
||||
@@ -225,7 +224,7 @@ class ConvertController extends Controller
|
||||
$balance = app('steam')->balance($account, today());
|
||||
$currency = $this->accountRepository->getAccountCurrency($account) ?? $defaultCurrency;
|
||||
$role = 'l_'.$account->accountType->type;
|
||||
$key = (string)trans('firefly.opt_group_'.$role);
|
||||
$key = (string) trans('firefly.opt_group_'.$role);
|
||||
$grouped[$key][$account->id] = $account->name.' ('.app('amount')->formatAnything($currency, $balance, false).')';
|
||||
}
|
||||
|
||||
@@ -247,12 +246,12 @@ class ConvertController extends Controller
|
||||
foreach ($accountList as $account) {
|
||||
$balance = app('steam')->balance($account, today());
|
||||
$currency = $this->accountRepository->getAccountCurrency($account) ?? $defaultCurrency;
|
||||
$role = (string)$this->accountRepository->getMetaValue($account, 'account_role');
|
||||
$role = (string) $this->accountRepository->getMetaValue($account, 'account_role');
|
||||
if ('' === $role) {
|
||||
$role = 'no_account_type';
|
||||
}
|
||||
|
||||
$key = (string)trans('firefly.opt_group_'.$role);
|
||||
$key = (string) trans('firefly.opt_group_'.$role);
|
||||
$grouped[$key][$account->id] = $account->name.' ('.app('amount')->formatAnything($currency, $balance, false).')';
|
||||
}
|
||||
|
||||
@@ -285,7 +284,7 @@ class ConvertController extends Controller
|
||||
// correct transfers:
|
||||
$group->refresh();
|
||||
|
||||
session()->flash('success', (string)trans('firefly.converted_to_'.$destinationType->type));
|
||||
session()->flash('success', (string) trans('firefly.converted_to_'.$destinationType->type));
|
||||
event(new UpdatedTransactionGroup($group, true, true));
|
||||
|
||||
return redirect(route('transactions.show', [$group->id]));
|
||||
@@ -306,11 +305,11 @@ class ConvertController extends Controller
|
||||
$destinationId = $data['destination_id'][$journal->id] ?? null;
|
||||
$destinationName = $data['destination_name'][$journal->id] ?? null;
|
||||
|
||||
// double check its not an empty string.
|
||||
$sourceId = '' === $sourceId || null === $sourceId ? null : (int)$sourceId;
|
||||
$sourceName = '' === $sourceName ? null : (string)$sourceName;
|
||||
$destinationId = '' === $destinationId || null === $destinationId ? null : (int)$destinationId;
|
||||
$destinationName = '' === $destinationName ? null : (string)$destinationName;
|
||||
// double check it's not an empty string.
|
||||
$sourceId = '' === $sourceId || null === $sourceId ? null : (int) $sourceId;
|
||||
$sourceName = '' === $sourceName ? null : (string) $sourceName;
|
||||
$destinationId = '' === $destinationId || null === $destinationId ? null : (int) $destinationId;
|
||||
$destinationName = '' === $destinationName ? null : (string) $destinationName;
|
||||
$validSource = $validator->validateSource(['id' => $sourceId, 'name' => $sourceName]);
|
||||
$validDestination = $validator->validateDestination(['id' => $destinationId, 'name' => $destinationName]);
|
||||
|
||||
@@ -331,6 +330,19 @@ class ConvertController extends Controller
|
||||
'type' => $transactionType->type,
|
||||
];
|
||||
|
||||
// also set the currency to the currency of the source account, in case you're converting a deposit into a transfer.
|
||||
if (TransactionType::TRANSFER === $transactionType->type && TransactionType::DEPOSIT === $journal->transactionType->type) {
|
||||
$source = $this->accountRepository->find((int) $sourceId);
|
||||
$sourceCurrency = $this->accountRepository->getAccountCurrency($source);
|
||||
$dest = $this->accountRepository->find((int) $destinationId);
|
||||
$destCurrency = $this->accountRepository->getAccountCurrency($dest);
|
||||
if (null !== $sourceCurrency && null !== $destCurrency && $sourceCurrency->code !== $destCurrency->code) {
|
||||
$update['currency_id'] = $sourceCurrency->id;
|
||||
$update['foreign_currency_id'] = $destCurrency->id;
|
||||
$update['foreign_amount'] = '1'; // not the best solution but at this point the amount is hard to get.
|
||||
}
|
||||
}
|
||||
|
||||
/** @var JournalUpdateService $service */
|
||||
$service = app(JournalUpdateService::class);
|
||||
$service->setTransactionJournal($journal);
|
||||
|
@@ -28,4 +28,9 @@ use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
|
||||
/**
|
||||
* Class VerifyCsrfToken.
|
||||
*/
|
||||
class VerifyCsrfToken extends Middleware {}
|
||||
class VerifyCsrfToken extends Middleware
|
||||
{
|
||||
protected $except = [
|
||||
'oauth/token',
|
||||
];
|
||||
}
|
||||
|
@@ -57,7 +57,7 @@ class AccountFormRequest extends FormRequest
|
||||
'account_type_name' => $this->convertString('objectType'),
|
||||
'currency_id' => $this->convertInteger('currency_id'),
|
||||
'virtual_balance' => $this->convertString('virtual_balance'),
|
||||
'iban' => $this->convertString('iban'),
|
||||
'iban' => $this->convertIban('iban'),
|
||||
'BIC' => $this->convertString('BIC'),
|
||||
'account_number' => $this->convertString('account_number'),
|
||||
'account_role' => $this->convertString('account_role'),
|
||||
|
@@ -31,7 +31,8 @@ class IsValidFilter implements ValidationRule
|
||||
|
||||
public function __construct(array $keys)
|
||||
{
|
||||
$this->allowed = $keys;
|
||||
$this->allowed = $keys;
|
||||
$this->allowed[] = 'user_group_id';
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
@@ -45,7 +46,7 @@ class IsValidFilter implements ValidationRule
|
||||
}
|
||||
foreach ($value as $key => $val) {
|
||||
if (!in_array($key, $this->allowed, true)) {
|
||||
$fail('validation.bad_api_filter')->translate();
|
||||
$fail('validation.bad_api_filter')->translate(['filter' => $key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -28,6 +28,7 @@ use Illuminate\Support\Facades\Response;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Laravel\Passport\Passport;
|
||||
|
||||
/**
|
||||
* Class AppServiceProvider
|
||||
@@ -87,6 +88,7 @@ class AppServiceProvider extends ServiceProvider
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
Passport::ignoreRoutes();
|
||||
// Passport::ignoreMigrations();
|
||||
// Sanctum::ignoreMigrations();
|
||||
}
|
||||
|
@@ -37,6 +37,7 @@ use FireflyIII\Models\TransactionJournal;
|
||||
use FireflyIII\Models\TransactionType;
|
||||
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
|
||||
use FireflyIII\Services\Internal\Update\AccountUpdateService;
|
||||
use FireflyIII\Support\Facades\Steam;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Contracts\Auth\Authenticatable;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
@@ -123,6 +124,7 @@ class AccountRepository implements AccountRepositoryInterface
|
||||
|
||||
public function findByIbanNull(string $iban, array $types): ?Account
|
||||
{
|
||||
$iban = Steam::filterSpaces($iban);
|
||||
$query = $this->user->accounts()->where('iban', '!=', '')->whereNotNull('iban');
|
||||
|
||||
if (0 !== count($types)) {
|
||||
|
@@ -146,7 +146,7 @@ class AttachmentRepository implements AttachmentRepositoryInterface
|
||||
// should be validated already:
|
||||
if (array_key_exists('attachable_type', $data) && array_key_exists('attachable_id', $data)) {
|
||||
$attachment->attachable_id = (int)$data['attachable_id'];
|
||||
$attachment->attachable_type = sprintf('FireflyIII\\Models\\%s', $data['attachable_type']);
|
||||
$attachment->attachable_type = sprintf('FireflyIII\Models\%s', $data['attachable_type']);
|
||||
}
|
||||
|
||||
$attachment->save();
|
||||
|
@@ -150,7 +150,6 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
$params[] = sprintf('%s:true', OperatorQuerySearch::getRootOperator($trigger->trigger_type));
|
||||
}
|
||||
if (true === $needsContext) {
|
||||
var_dump('x');
|
||||
$params[] = sprintf('%s:"%s"', OperatorQuerySearch::getRootOperator($trigger->trigger_type), $trigger->trigger_value);
|
||||
}
|
||||
}
|
||||
|
@@ -31,6 +31,7 @@ use FireflyIII\Models\ObjectGroup;
|
||||
use FireflyIII\Models\Transaction;
|
||||
use FireflyIII\Models\TransactionCurrency;
|
||||
use FireflyIII\Services\Internal\Update\AccountUpdateService;
|
||||
use FireflyIII\Support\Facades\Steam;
|
||||
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Support\Collection;
|
||||
@@ -80,6 +81,7 @@ class AccountRepository implements AccountRepositoryInterface
|
||||
|
||||
public function findByIbanNull(string $iban, array $types): ?Account
|
||||
{
|
||||
$iban = Steam::filterSpaces($iban);
|
||||
$query = $this->userGroup->accounts()->where('iban', '!=', '')->whereNotNull('iban');
|
||||
|
||||
if (0 !== count($types)) {
|
||||
@@ -290,7 +292,7 @@ class AccountRepository implements AccountRepositoryInterface
|
||||
return $query->get(['accounts.*']);
|
||||
}
|
||||
|
||||
public function searchAccount(string $query, array $types, int $limit): Collection
|
||||
public function searchAccount(array $query, array $types, int $limit): Collection
|
||||
{
|
||||
// search by group, not by user
|
||||
$dbQuery = $this->userGroup->accounts()
|
||||
@@ -300,14 +302,17 @@ class AccountRepository implements AccountRepositoryInterface
|
||||
->orderBy('accounts.name', 'ASC')
|
||||
->with(['accountType'])
|
||||
;
|
||||
if ('' !== $query) {
|
||||
if (count($query) > 0) {
|
||||
// split query on spaces just in case:
|
||||
// TODO this will always fail because it searches for AND.
|
||||
$parts = explode(' ', $query);
|
||||
foreach ($parts as $part) {
|
||||
$search = sprintf('%%%s%%', $part);
|
||||
$dbQuery->where('name', 'LIKE', $search);
|
||||
}
|
||||
$dbQuery->where(function (EloquentBuilder $q) use ($query): void {
|
||||
foreach ($query as $line) {
|
||||
$parts = explode(' ', $line);
|
||||
foreach ($parts as $part) {
|
||||
$search = sprintf('%%%s%%', $part);
|
||||
$q->orWhere('name', 'LIKE', $search);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (0 !== count($types)) {
|
||||
$dbQuery->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id');
|
||||
|
@@ -80,7 +80,7 @@ interface AccountRepositoryInterface
|
||||
*/
|
||||
public function resetAccountOrder(): void;
|
||||
|
||||
public function searchAccount(string $query, array $types, int $limit): Collection;
|
||||
public function searchAccount(array $query, array $types, int $limit): Collection;
|
||||
|
||||
public function setUser(User $user): void;
|
||||
|
||||
|
@@ -24,17 +24,27 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\UserGroups\Category;
|
||||
|
||||
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class CategoryRepository implements CategoryRepositoryInterface
|
||||
{
|
||||
use UserGroupTrait;
|
||||
|
||||
public function searchCategory(string $query, int $limit): Collection
|
||||
public function searchCategory(array $query, int $limit): Collection
|
||||
{
|
||||
$search = $this->userGroup->categories();
|
||||
if ('' !== $query) {
|
||||
$search->where('name', 'LIKE', sprintf('%%%s%%', $query));
|
||||
if (count($query) > 0) {
|
||||
// split query on spaces just in case:
|
||||
$search->where(function (EloquentBuilder $q) use ($query): void {
|
||||
foreach ($query as $line) {
|
||||
$parts = explode(' ', $line);
|
||||
foreach ($parts as $part) {
|
||||
$search = sprintf('%%%s%%', $part);
|
||||
$q->orWhere('name', 'LIKE', $search);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return $search->take($limit)->get();
|
||||
|
@@ -30,5 +30,5 @@ interface CategoryRepositoryInterface
|
||||
/**
|
||||
* Search for a category using wild cards. Uses the database, so case sensitive.
|
||||
*/
|
||||
public function searchCategory(string $query, int $limit): Collection;
|
||||
public function searchCategory(array $query, int $limit): Collection;
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\UserGroups\Journal;
|
||||
|
||||
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
@@ -33,15 +34,24 @@ class JournalRepository implements JournalRepositoryInterface
|
||||
{
|
||||
use UserGroupTrait;
|
||||
|
||||
public function searchJournalDescriptions(string $search, int $limit): Collection
|
||||
public function searchJournalDescriptions(array $query, int $limit): Collection
|
||||
{
|
||||
$query = $this->userGroup->transactionJournals()
|
||||
$search = $this->userGroup->transactionJournals()
|
||||
->orderBy('date', 'DESC')
|
||||
;
|
||||
if ('' !== $search) {
|
||||
$query->where('description', 'LIKE', sprintf('%%%s%%', $search));
|
||||
if (count($query) > 0) {
|
||||
// split query on spaces just in case:
|
||||
$search->where(function (EloquentBuilder $q) use ($query): void {
|
||||
foreach ($query as $line) {
|
||||
$parts = explode(' ', $line);
|
||||
foreach ($parts as $part) {
|
||||
$search = sprintf('%%%s%%', $part);
|
||||
$q->orWhere('description', 'LIKE', $search);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return $query->take($limit)->get();
|
||||
return $search->take($limit)->get();
|
||||
}
|
||||
}
|
||||
|
@@ -34,7 +34,7 @@ interface JournalRepositoryInterface
|
||||
/**
|
||||
* Search in journal descriptions.
|
||||
*/
|
||||
public function searchJournalDescriptions(string $search, int $limit): Collection;
|
||||
public function searchJournalDescriptions(array $query, int $limit): Collection;
|
||||
|
||||
public function setUser(User $user): void;
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\UserGroups\Tag;
|
||||
|
||||
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
@@ -33,11 +34,20 @@ class TagRepository implements TagRepositoryInterface
|
||||
{
|
||||
use UserGroupTrait;
|
||||
|
||||
public function searchTag(string $query, int $limit): Collection
|
||||
public function searchTag(array $query, int $limit): Collection
|
||||
{
|
||||
$search = $this->user->tags();
|
||||
if ('' !== $query) {
|
||||
$search->where('tag', 'LIKE', sprintf('%%%s%%', $query));
|
||||
$search = $this->userGroup->tags();
|
||||
if (count($query) > 0) {
|
||||
// split query on spaces just in case:
|
||||
$search->where(function (EloquentBuilder $q) use ($query): void {
|
||||
foreach ($query as $line) {
|
||||
$parts = explode(' ', $line);
|
||||
foreach ($parts as $part) {
|
||||
$search = sprintf('%%%s%%', $part);
|
||||
$q->orWhere('tag', 'LIKE', $search);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return $search->take($limit)->get(['tags.*']);
|
||||
|
@@ -30,5 +30,5 @@ interface TagRepositoryInterface
|
||||
/**
|
||||
* Find one or more tags based on the query.
|
||||
*/
|
||||
public function searchTag(string $query, int $limit): Collection;
|
||||
public function searchTag(array $query, int $limit): Collection;
|
||||
}
|
||||
|
60
app/Rules/IsFilterValueIn.php
Normal file
60
app/Rules/IsFilterValueIn.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
/*
|
||||
* IsFilterValueIn.php
|
||||
* Copyright (c) 2024 james@firefly-iii.org.
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Rules;
|
||||
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
|
||||
class IsFilterValueIn implements ValidationRule
|
||||
{
|
||||
private string $key;
|
||||
private array $values;
|
||||
|
||||
public function __construct(string $key, array $values)
|
||||
{
|
||||
$this->key = $key;
|
||||
$this->values = $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
||||
*/
|
||||
public function validate(string $attribute, mixed $value, \Closure $fail): void
|
||||
{
|
||||
if (!is_array($value)) {
|
||||
return;
|
||||
}
|
||||
if (!array_key_exists($this->key, $value)) {
|
||||
return;
|
||||
}
|
||||
$value = $value[$this->key] ?? null;
|
||||
|
||||
if (!is_string($value) && null !== $value) {
|
||||
$fail('validation.filter_not_string')->translate(['filter' => $this->key]);
|
||||
}
|
||||
if (!in_array($value, $this->values, true)) {
|
||||
$fail('validation.filter_must_be_in')->translate(['filter' => $this->key, 'values' => implode(', ', $this->values)]);
|
||||
}
|
||||
// $fail('validation.filter_not_string')->translate(['filter' => $this->key]);
|
||||
}
|
||||
}
|
@@ -25,6 +25,7 @@ namespace FireflyIII\Rules;
|
||||
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\AccountType;
|
||||
use FireflyIII\Support\Facades\Steam;
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
|
||||
/**
|
||||
@@ -95,6 +96,9 @@ class UniqueIban implements ValidationRule
|
||||
$maxCounts = $this->getMaxOccurrences();
|
||||
|
||||
foreach ($maxCounts as $type => $max) {
|
||||
// make sure to trim the value of $value so all spaces are removed.
|
||||
$value = Steam::filterSpaces($value);
|
||||
|
||||
$count = $this->countHits($type, $value);
|
||||
app('log')->debug(sprintf('Count for "%s" and IBAN "%s" is %d', $type, $value, $count));
|
||||
if ($count > $max) {
|
||||
|
@@ -216,7 +216,6 @@ class CreditRecalculateService
|
||||
app('log')->debug(sprintf('Destination amount "%s" is now "%s"', $dest->amount, app('steam')->negative($dest->amount)));
|
||||
$source->amount = app('steam')->positive($source->amount);
|
||||
$dest->amount = app('steam')->negative($source->amount);
|
||||
var_dump($source->foreign_amount);
|
||||
if (null !== $source->foreign_amount && '' !== $source->foreign_amount) {
|
||||
$source->foreign_amount = app('steam')->positive($source->foreign_amount);
|
||||
app('log')->debug(sprintf('Source foreign amount "%s" is now "%s"', $source->foreign_amount, app('steam')->positive($source->foreign_amount)));
|
||||
|
66
app/Support/Chart/ChartData.php
Normal file
66
app/Support/Chart/ChartData.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/*
|
||||
* ChartData.php
|
||||
* Copyright (c) 2024 james@firefly-iii.org.
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Support\Chart;
|
||||
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
|
||||
class ChartData
|
||||
{
|
||||
private array $series;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->series = [];
|
||||
}
|
||||
|
||||
public function render(): array
|
||||
{
|
||||
if (0 === count($this->series)) {
|
||||
throw new FireflyException('No series added to chart');
|
||||
}
|
||||
|
||||
return $this->series;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function add(array $data): void
|
||||
{
|
||||
if (array_key_exists('currency_id', $data)) {
|
||||
$data['currency_id'] = (string) $data['currency_id'];
|
||||
}
|
||||
if (array_key_exists('native_currency_id', $data)) {
|
||||
$data['native_currency_id'] = (string) $data['native_currency_id'];
|
||||
}
|
||||
$required = ['start', 'date', 'end', 'entries', 'native_entries'];
|
||||
foreach ($required as $field) {
|
||||
if (!array_key_exists($field, $data)) {
|
||||
throw new FireflyException(sprintf('Data-set is missing the "%s"-variable.', $field));
|
||||
}
|
||||
}
|
||||
|
||||
$this->series[] = $data;
|
||||
}
|
||||
}
|
@@ -35,15 +35,22 @@ use Illuminate\Support\Facades\Log;
|
||||
*/
|
||||
class AccountBalanceGrouped
|
||||
{
|
||||
private array $accountIds;
|
||||
private string $carbonFormat;
|
||||
private array $currencies = [];
|
||||
private array $data = [];
|
||||
private TransactionCurrency $default;
|
||||
private Carbon $end;
|
||||
private array $journals = [];
|
||||
private string $preferredRange;
|
||||
private Carbon $start;
|
||||
private array $accountIds;
|
||||
private string $carbonFormat;
|
||||
private array $currencies = [];
|
||||
private array $data = [];
|
||||
private TransactionCurrency $default;
|
||||
private Carbon $end;
|
||||
private array $journals = [];
|
||||
private string $preferredRange;
|
||||
private Carbon $start;
|
||||
private ExchangeRateConverter $converter;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->accountIds = [];
|
||||
$this->converter = app(ExchangeRateConverter::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the given input to a chart compatible array.
|
||||
@@ -58,14 +65,15 @@ class AccountBalanceGrouped
|
||||
// income and expense array prepped:
|
||||
$income = [
|
||||
'label' => 'earned',
|
||||
'currency_id' => (string)$currency['currency_id'],
|
||||
'currency_id' => (string) $currency['currency_id'],
|
||||
'currency_symbol' => $currency['currency_symbol'],
|
||||
'currency_code' => $currency['currency_code'],
|
||||
'currency_decimal_places' => $currency['currency_decimal_places'],
|
||||
'native_currency_id' => (string)$currency['native_currency_id'],
|
||||
'native_currency_id' => (string) $currency['native_currency_id'],
|
||||
'native_currency_symbol' => $currency['native_currency_symbol'],
|
||||
'native_currency_code' => $currency['native_currency_code'],
|
||||
'native_currency_decimal_places' => $currency['native_currency_decimal_places'],
|
||||
'date' => $this->start->toAtomString(),
|
||||
'start' => $this->start->toAtomString(),
|
||||
'end' => $this->end->toAtomString(),
|
||||
'period' => $this->preferredRange,
|
||||
@@ -74,14 +82,15 @@ class AccountBalanceGrouped
|
||||
];
|
||||
$expense = [
|
||||
'label' => 'spent',
|
||||
'currency_id' => (string)$currency['currency_id'],
|
||||
'currency_id' => (string) $currency['currency_id'],
|
||||
'currency_symbol' => $currency['currency_symbol'],
|
||||
'currency_code' => $currency['currency_code'],
|
||||
'currency_decimal_places' => $currency['currency_decimal_places'],
|
||||
'native_currency_id' => (string)$currency['native_currency_id'],
|
||||
'native_currency_id' => (string) $currency['native_currency_id'],
|
||||
'native_currency_symbol' => $currency['native_currency_symbol'],
|
||||
'native_currency_code' => $currency['native_currency_code'],
|
||||
'native_currency_decimal_places' => $currency['native_currency_decimal_places'],
|
||||
'date' => $this->start->toAtomString(),
|
||||
'start' => $this->start->toAtomString(),
|
||||
'end' => $this->end->toAtomString(),
|
||||
'period' => $this->preferredRange,
|
||||
@@ -124,76 +133,7 @@ class AccountBalanceGrouped
|
||||
// loop. group by currency and by period.
|
||||
/** @var array $journal */
|
||||
foreach ($this->journals as $journal) {
|
||||
// format the date according to the period
|
||||
$period = $journal['date']->format($this->carbonFormat);
|
||||
$currencyId = (int)$journal['currency_id'];
|
||||
$currency = $this->currencies[$currencyId] ?? TransactionCurrency::find($currencyId);
|
||||
$this->currencies[$currencyId] = $currency; // may just re-assign itself, don't mind.
|
||||
|
||||
// set the array with monetary info, if it does not exist.
|
||||
$this->data[$currencyId] ??= [
|
||||
'currency_id' => (string)$currencyId,
|
||||
'currency_symbol' => $journal['currency_symbol'],
|
||||
'currency_code' => $journal['currency_code'],
|
||||
'currency_name' => $journal['currency_name'],
|
||||
'currency_decimal_places' => $journal['currency_decimal_places'],
|
||||
// native currency info (could be the same)
|
||||
'native_currency_id' => (string)$this->default->id,
|
||||
'native_currency_code' => $this->default->code,
|
||||
'native_currency_symbol' => $this->default->symbol,
|
||||
'native_currency_decimal_places' => $this->default->decimal_places,
|
||||
];
|
||||
|
||||
// set the array (in monetary info) with spent/earned in this $period, if it does not exist.
|
||||
$this->data[$currencyId][$period] ??= [
|
||||
'period' => $period,
|
||||
'spent' => '0',
|
||||
'earned' => '0',
|
||||
'native_spent' => '0',
|
||||
'native_earned' => '0',
|
||||
];
|
||||
// is this journal's amount in- our outgoing?
|
||||
$key = 'spent';
|
||||
$amount = app('steam')->negative($journal['amount']);
|
||||
// deposit = incoming
|
||||
// transfer or reconcile or opening balance, and these accounts are the destination.
|
||||
if (
|
||||
TransactionType::DEPOSIT === $journal['transaction_type_type']
|
||||
|
||||
|| (
|
||||
(
|
||||
TransactionType::TRANSFER === $journal['transaction_type_type']
|
||||
|| TransactionType::RECONCILIATION === $journal['transaction_type_type']
|
||||
|| TransactionType::OPENING_BALANCE === $journal['transaction_type_type']
|
||||
)
|
||||
&& in_array($journal['destination_account_id'], $this->accountIds, true)
|
||||
)
|
||||
) {
|
||||
$key = 'earned';
|
||||
$amount = app('steam')->positive($journal['amount']);
|
||||
}
|
||||
|
||||
// get conversion rate
|
||||
try {
|
||||
$rate = $converter->getCurrencyRate($currency, $this->default, $journal['date']);
|
||||
} catch (FireflyException $e) {
|
||||
app('log')->error($e->getMessage());
|
||||
$rate = '1';
|
||||
}
|
||||
$amountConverted = bcmul($amount, $rate);
|
||||
|
||||
// perhaps transaction already has the foreign amount in the native currency.
|
||||
if ((int)$journal['foreign_currency_id'] === $this->default->id) {
|
||||
$amountConverted = $journal['foreign_amount'] ?? '0';
|
||||
$amountConverted = 'earned' === $key ? app('steam')->positive($amountConverted) : app('steam')->negative($amountConverted);
|
||||
}
|
||||
|
||||
// add normal entry
|
||||
$this->data[$currencyId][$period][$key] = bcadd($this->data[$currencyId][$period][$key], $amount);
|
||||
|
||||
// add converted entry
|
||||
$convertedKey = sprintf('native_%s', $key);
|
||||
$this->data[$currencyId][$period][$convertedKey] = bcadd($this->data[$currencyId][$period][$convertedKey], $amountConverted);
|
||||
$this->processJournal($journal);
|
||||
}
|
||||
$converter->summarize();
|
||||
}
|
||||
@@ -209,12 +149,12 @@ class AccountBalanceGrouped
|
||||
$defaultCurrencyId = $default->id;
|
||||
$this->currencies = [$default->id => $default]; // currency cache
|
||||
$this->data[$defaultCurrencyId] = [
|
||||
'currency_id' => (string)$defaultCurrencyId,
|
||||
'currency_id' => (string) $defaultCurrencyId,
|
||||
'currency_symbol' => $default->symbol,
|
||||
'currency_code' => $default->code,
|
||||
'currency_name' => $default->name,
|
||||
'currency_decimal_places' => $default->decimal_places,
|
||||
'native_currency_id' => (string)$defaultCurrencyId,
|
||||
'native_currency_id' => (string) $defaultCurrencyId,
|
||||
'native_currency_symbol' => $default->symbol,
|
||||
'native_currency_code' => $default->code,
|
||||
'native_currency_name' => $default->name,
|
||||
@@ -242,4 +182,113 @@ class AccountBalanceGrouped
|
||||
{
|
||||
$this->start = $start;
|
||||
}
|
||||
|
||||
private function processJournal(array $journal): void
|
||||
{
|
||||
// format the date according to the period
|
||||
$period = $journal['date']->format($this->carbonFormat);
|
||||
$currencyId = (int) $journal['currency_id'];
|
||||
$currency = $this->findCurrency($currencyId);
|
||||
|
||||
// set the array with monetary info, if it does not exist.
|
||||
$this->createDefaultDataEntry($journal);
|
||||
// set the array (in monetary info) with spent/earned in this $period, if it does not exist.
|
||||
$this->createDefaultPeriodEntry($journal);
|
||||
|
||||
// is this journal's amount in- our outgoing?
|
||||
$key = $this->getDataKey($journal);
|
||||
$amount = 'spent' === $key ? app('steam')->negative($journal['amount']) : app('steam')->positive($journal['amount']);
|
||||
|
||||
// get conversion rate
|
||||
$rate = $this->getRate($currency, $journal['date']);
|
||||
$amountConverted = bcmul($amount, $rate);
|
||||
|
||||
// perhaps transaction already has the foreign amount in the native currency.
|
||||
if ((int) $journal['foreign_currency_id'] === $this->default->id) {
|
||||
$amountConverted = $journal['foreign_amount'] ?? '0';
|
||||
$amountConverted = 'earned' === $key ? app('steam')->positive($amountConverted) : app('steam')->negative($amountConverted);
|
||||
}
|
||||
|
||||
// add normal entry
|
||||
$this->data[$currencyId][$period][$key] = bcadd($this->data[$currencyId][$period][$key], $amount);
|
||||
|
||||
// add converted entry
|
||||
$convertedKey = sprintf('native_%s', $key);
|
||||
$this->data[$currencyId][$period][$convertedKey] = bcadd($this->data[$currencyId][$period][$convertedKey], $amountConverted);
|
||||
}
|
||||
|
||||
private function findCurrency(int $currencyId): TransactionCurrency
|
||||
{
|
||||
if (array_key_exists($currencyId, $this->currencies)) {
|
||||
return $this->currencies[$currencyId];
|
||||
}
|
||||
$this->currencies[$currencyId] = TransactionCurrency::find($currencyId);
|
||||
|
||||
return $this->currencies[$currencyId];
|
||||
}
|
||||
|
||||
private function createDefaultDataEntry(array $journal): void
|
||||
{
|
||||
$currencyId = (int) $journal['currency_id'];
|
||||
$this->data[$currencyId] ??= [
|
||||
'currency_id' => (string) $currencyId,
|
||||
'currency_symbol' => $journal['currency_symbol'],
|
||||
'currency_code' => $journal['currency_code'],
|
||||
'currency_name' => $journal['currency_name'],
|
||||
'currency_decimal_places' => $journal['currency_decimal_places'],
|
||||
// native currency info (could be the same)
|
||||
'native_currency_id' => (string) $this->default->id,
|
||||
'native_currency_code' => $this->default->code,
|
||||
'native_currency_symbol' => $this->default->symbol,
|
||||
'native_currency_decimal_places' => $this->default->decimal_places,
|
||||
];
|
||||
}
|
||||
|
||||
private function createDefaultPeriodEntry(array $journal): void
|
||||
{
|
||||
$currencyId = (int) $journal['currency_id'];
|
||||
$period = $journal['date']->format($this->carbonFormat);
|
||||
$this->data[$currencyId][$period] ??= [
|
||||
'period' => $period,
|
||||
'spent' => '0',
|
||||
'earned' => '0',
|
||||
'native_spent' => '0',
|
||||
'native_earned' => '0',
|
||||
];
|
||||
}
|
||||
|
||||
private function getDataKey(array $journal): string
|
||||
{
|
||||
$key = 'spent';
|
||||
// deposit = incoming
|
||||
// transfer or reconcile or opening balance, and these accounts are the destination.
|
||||
if (
|
||||
TransactionType::DEPOSIT === $journal['transaction_type_type']
|
||||
|
||||
|| (
|
||||
(
|
||||
TransactionType::TRANSFER === $journal['transaction_type_type']
|
||||
|| TransactionType::RECONCILIATION === $journal['transaction_type_type']
|
||||
|| TransactionType::OPENING_BALANCE === $journal['transaction_type_type']
|
||||
)
|
||||
&& in_array($journal['destination_account_id'], $this->accountIds, true)
|
||||
)
|
||||
) {
|
||||
$key = 'earned';
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
private function getRate(TransactionCurrency $currency, Carbon $date): string
|
||||
{
|
||||
try {
|
||||
$rate = $this->converter->getCurrencyRate($currency, $this->default, $date);
|
||||
} catch (FireflyException $e) {
|
||||
app('log')->error($e->getMessage());
|
||||
$rate = '1';
|
||||
}
|
||||
|
||||
return $rate;
|
||||
}
|
||||
}
|
||||
|
76
app/Support/Http/Api/CollectsAccountsFromFilter.php
Normal file
76
app/Support/Http/Api/CollectsAccountsFromFilter.php
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
/*
|
||||
* CollectsAccountsFromFilter.php
|
||||
* Copyright (c) 2024 james@firefly-iii.org.
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Support\Http\Api;
|
||||
|
||||
use FireflyIII\Models\AccountType;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
trait CollectsAccountsFromFilter
|
||||
{
|
||||
/**
|
||||
* TODO Duplicate function but I think it belongs here or in a separate trait
|
||||
*/
|
||||
private function getAccountList(array $queryParameters): Collection
|
||||
{
|
||||
$collection = new Collection();
|
||||
|
||||
// always collect from the query parameter, even when it's empty.
|
||||
foreach ($queryParameters['accounts'] as $accountId) {
|
||||
$account = $this->repository->find((int) $accountId);
|
||||
if (null !== $account) {
|
||||
$collection->push($account);
|
||||
}
|
||||
}
|
||||
|
||||
// if no "preselected", and found accounts
|
||||
if ('empty' === $queryParameters['preselected'] && $collection->count() > 0) {
|
||||
return $collection;
|
||||
}
|
||||
// if no preselected, but no accounts:
|
||||
if ('empty' === $queryParameters['preselected'] && 0 === $collection->count()) {
|
||||
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT])->pluck('id')->toArray();
|
||||
$frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
|
||||
|
||||
if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
|
||||
$frontpage->data = $defaultSet;
|
||||
$frontpage->save();
|
||||
}
|
||||
|
||||
return $this->repository->getAccountsById($frontpage->data);
|
||||
}
|
||||
|
||||
// both options are overruled by "preselected"
|
||||
if ('all' === $queryParameters['preselected']) {
|
||||
return $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]);
|
||||
}
|
||||
if ('assets' === $queryParameters['preselected']) {
|
||||
return $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT]);
|
||||
}
|
||||
if ('liabilities' === $queryParameters['preselected']) {
|
||||
return $this->repository->getAccountsByType([AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]);
|
||||
}
|
||||
|
||||
return $collection;
|
||||
}
|
||||
}
|
68
app/Support/Http/Api/ParsesQueryFilters.php
Normal file
68
app/Support/Http/Api/ParsesQueryFilters.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
/*
|
||||
* ParsesQueryFilters.php
|
||||
* Copyright (c) 2024 james@firefly-iii.org.
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Support\Http\Api;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Carbon\Exceptions\InvalidFormatException;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use LaravelJsonApi\Core\Query\QueryParameters;
|
||||
|
||||
trait ParsesQueryFilters
|
||||
{
|
||||
private function dateOrToday(QueryParameters $parameters, string $field): Carbon
|
||||
{
|
||||
$date = today();
|
||||
|
||||
$value = $parameters->filter()?->value($field, date('Y-m-d'));
|
||||
if (is_array($value)) {
|
||||
Log::error(sprintf('Multiple values for date field "%s". Using first value.', $field));
|
||||
$value = $value[0];
|
||||
}
|
||||
|
||||
try {
|
||||
$date = Carbon::createFromFormat('Y-m-d', $value, config('app.timezone'));
|
||||
} catch (InvalidFormatException $e) {
|
||||
Log::debug(sprintf('Invalid date format in request. Using today: %s', $e->getMessage()));
|
||||
}
|
||||
|
||||
return $date;
|
||||
}
|
||||
|
||||
private function arrayOfStrings(QueryParameters $parameters, string $field): array
|
||||
{
|
||||
$array = $parameters->filter()?->value($field, []) ?? [];
|
||||
|
||||
return is_string($array) ? [$array] : $array;
|
||||
}
|
||||
|
||||
private function integerFromQueryParams(QueryParameters $parameters, string $field, int $default): int
|
||||
{
|
||||
return (int) ($parameters->page()[$field] ?? $default);
|
||||
}
|
||||
|
||||
private function stringFromQueryParams(QueryParameters $parameters, string $field, string $default): string
|
||||
{
|
||||
return (string) ($parameters->page()[$field] ?? $default);
|
||||
}
|
||||
}
|
@@ -38,6 +38,10 @@ use Illuminate\Support\Facades\Log;
|
||||
trait ValidatesUserGroupTrait
|
||||
{
|
||||
/**
|
||||
* An "undocumented" filter
|
||||
*
|
||||
* TODO add this filter to the API docs.
|
||||
*
|
||||
* @throws AuthorizationException
|
||||
* @throws AuthenticationException
|
||||
*/
|
||||
|
@@ -171,6 +171,8 @@ trait AugumentData
|
||||
|
||||
/** @var BudgetLimitRepositoryInterface $blRepository */
|
||||
$blRepository = app(BudgetLimitRepositoryInterface::class);
|
||||
|
||||
$end->endOfMonth();
|
||||
// properties for cache
|
||||
$cache = new CacheProperties();
|
||||
$cache->addProperty($start);
|
||||
|
@@ -370,6 +370,7 @@ trait PeriodOverview
|
||||
$first = $this->journalRepos->firstNull();
|
||||
$start = null === $first ? new Carbon() : $first->date;
|
||||
$end = clone $theDate;
|
||||
$end = app('navigation')->endOfPeriod($end, $range);
|
||||
|
||||
app('log')->debug(sprintf('Start for getNoCategoryPeriodOverview() is %s', $start->format('Y-m-d')));
|
||||
app('log')->debug(sprintf('End for getNoCategoryPeriodOverview() is %s', $end->format('Y-m-d')));
|
||||
|
@@ -31,38 +31,34 @@ use Illuminate\Support\Facades\Log;
|
||||
|
||||
class AccountBalanceCalculator
|
||||
{
|
||||
private function __construct()
|
||||
{
|
||||
// no-op
|
||||
}
|
||||
|
||||
/**
|
||||
* Recalculate all balances for a given account.
|
||||
*
|
||||
* Je moet toch altijd wel alles doen want je weet niet waar een transaction journal invloed op heeft.
|
||||
* Dus dit aantikken per transaction journal is zinloos, beide accounts moeten gedaan worden.
|
||||
*/
|
||||
public static function recalculateForAccount(Account $account): void
|
||||
public static function recalculateAll(): void
|
||||
{
|
||||
self::recalculate($account);
|
||||
$object = new self();
|
||||
$object->recalculateLatest(null);
|
||||
// $object->recalculateJournals(null, null);
|
||||
}
|
||||
|
||||
public static function recalculateForTransactionJournal(TransactionJournal $transactionJournal): void
|
||||
public static function recalculateForJournal(TransactionJournal $transactionJournal): void
|
||||
{
|
||||
$object = new self();
|
||||
foreach ($transactionJournal->transactions as $transaction) {
|
||||
self::recalculateForAccount($transaction->account);
|
||||
$object->recalculateLatest($transaction->account);
|
||||
// $object->recalculateJournals($transaction->account, $transactionJournal);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* select account_id, transaction_currency_id, foreign_currency_id, sum(amount), sum(foreign_amount) from
|
||||
* transactions group by account_id, transaction_currency_id, foreign_currency_id
|
||||
*/
|
||||
public static function recalculate(?Account $account): void
|
||||
{
|
||||
self::recalculateLatest($account);
|
||||
// loop all transaction journals and set those amounts too.
|
||||
self::recalculateJournals($account);
|
||||
|
||||
// loop all dates and set those amounts too.
|
||||
}
|
||||
|
||||
private static function getAccountBalanceByAccount(int $account, int $currency): AccountBalance
|
||||
private function getAccountBalanceByAccount(int $account, int $currency): AccountBalance
|
||||
{
|
||||
$query = AccountBalance::where('title', 'balance')->where('account_id', $account)->where('transaction_currency_id', $currency);
|
||||
|
||||
@@ -83,7 +79,7 @@ class AccountBalanceCalculator
|
||||
return $entry;
|
||||
}
|
||||
|
||||
private static function getAccountBalanceByJournal(string $title, int $account, int $journal, int $currency): AccountBalance
|
||||
private function getAccountBalanceByJournal(string $title, int $account, int $journal, int $currency): AccountBalance
|
||||
{
|
||||
$query = AccountBalance::where('title', $title)->where('account_id', $account)->where('transaction_journal_id', $journal)->where('transaction_currency_id', $currency);
|
||||
|
||||
@@ -102,7 +98,7 @@ class AccountBalanceCalculator
|
||||
return $entry;
|
||||
}
|
||||
|
||||
private static function recalculateLatest(?Account $account): void
|
||||
private function recalculateLatest(?Account $account): void
|
||||
{
|
||||
$query = Transaction::groupBy(['transactions.account_id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id']);
|
||||
|
||||
@@ -112,76 +108,87 @@ class AccountBalanceCalculator
|
||||
$result = $query->get(['transactions.account_id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id', \DB::raw('SUM(transactions.amount) as sum_amount'), \DB::raw('SUM(transactions.foreign_amount) as sum_foreign_amount')]);
|
||||
|
||||
// reset account balances:
|
||||
self::resetAccountBalancesByAccount('balance', $account);
|
||||
$this->resetAccountBalancesByAccount('balance', $account);
|
||||
|
||||
/** @var \stdClass $row */
|
||||
foreach ($result as $row) {
|
||||
$account = (int) $row->account_id;
|
||||
$transactionCurrency = (int) $row->transaction_currency_id;
|
||||
$foreignCurrency = (int) $row->foreign_currency_id;
|
||||
$sumAmount = $row->sum_amount;
|
||||
$sumForeignAmount = $row->sum_foreign_amount;
|
||||
$sumAmount = (string) $row->sum_amount;
|
||||
$sumForeignAmount = (string) $row->sum_foreign_amount;
|
||||
$sumAmount = '' === $sumAmount ? '0' : $sumAmount;
|
||||
$sumForeignAmount = '' === $sumForeignAmount ? '0' : $sumForeignAmount;
|
||||
|
||||
// first create for normal currency:
|
||||
$entry = self::getAccountBalanceByAccount($account, $transactionCurrency);
|
||||
$entry->balance = bcadd($entry->balance, $sumAmount);
|
||||
$entry = $this->getAccountBalanceByAccount($account, $transactionCurrency);
|
||||
$entry->balance = bcadd((string) $entry->balance, $sumAmount);
|
||||
$entry->save();
|
||||
// Log::debug(sprintf('Set balance entry #%d ("balance") to amount %s', $entry->id, $entry->balance));
|
||||
|
||||
// then do foreign amount, if present:
|
||||
if ($foreignCurrency > 0) {
|
||||
$entry = self::getAccountBalanceByAccount($account, $foreignCurrency);
|
||||
$entry->balance = bcadd($entry->balance, $sumForeignAmount);
|
||||
$entry = $this->getAccountBalanceByAccount($account, $foreignCurrency);
|
||||
$entry->balance = bcadd((string) $entry->balance, $sumForeignAmount);
|
||||
$entry->save();
|
||||
// Log::debug(sprintf('Set balance entry #%d ("balance") to amount %s', $entry->id, $entry->balance));
|
||||
}
|
||||
}
|
||||
Log::debug(sprintf('Recalculated %d account balance(s)', $result->count()));
|
||||
}
|
||||
|
||||
private static function resetAccountBalancesByAccount(string $title, ?Account $account): void
|
||||
private function resetAccountBalancesByAccount(string $title, ?Account $account): void
|
||||
{
|
||||
if (null === $account) {
|
||||
AccountBalance::whereNotNull('updated_at')->where('title', $title)->update(['balance' => '0']);
|
||||
Log::debug('Set ALL balances to zero.');
|
||||
$count = AccountBalance::whereNotNull('updated_at')->where('title', $title)->update(['balance' => '0']);
|
||||
Log::debug(sprintf('Set %d account balance(s) to zero.', $count));
|
||||
|
||||
return;
|
||||
}
|
||||
AccountBalance::where('account_id', $account->id)->where('title', $title)->update(['balance' => '0']);
|
||||
Log::debug(sprintf('Set balances of account #%d to zero.', $account->id));
|
||||
$count = AccountBalance::where('account_id', $account->id)->where('title', $title)->update(['balance' => '0']);
|
||||
Log::debug(sprintf('Set %d account balance(s) of account #%d to zero.', $count, $account->id));
|
||||
}
|
||||
|
||||
public static function recalculateByJournal(TransactionJournal $transactionJournal): void
|
||||
{
|
||||
Log::debug(sprintf('Recalculate balance after journal #%d', $transactionJournal->id));
|
||||
// update both account balances, but limit to this transaction or earlier.
|
||||
foreach ($transactionJournal->transactions as $transaction) {
|
||||
self::recalculate($transaction->account, $transactionJournal);
|
||||
}
|
||||
}
|
||||
|
||||
private static function recalculateJournals(?Account $account): void
|
||||
/**
|
||||
* Als je alles opnieuw doet, verzamel je alle transactions en het bedrag en zet je dat neer als "balance after
|
||||
* journal". Dat betekent, netjes op volgorde van datum en doorrekenen.
|
||||
*
|
||||
* Zodra je een transaction journal verplaatst (datum) moet je dat journal en alle latere journals opnieuw doen.
|
||||
* Maar dan moet je van de account wel een beginnetje hebben, namelijk de balance tot en met dat moment.
|
||||
*
|
||||
* 1. Dus dan search je eerst naar die SUM, som alle transactions eerder dan (niet inclusief) de journal.
|
||||
* 2. En vanaf daar pak je alle journals op of na de journal (dus ook de journal zelf) en begin je door te tellen.
|
||||
* 3. Elke voorbij gaande journal entry "balance_after_journal" geef je een update of voeg je toe.
|
||||
*/
|
||||
private function recalculateJournals(?Account $account, ?TransactionJournal $transactionJournal): void
|
||||
{
|
||||
$query = Transaction::groupBy(['transactions.account_id', 'transaction_journals.id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id']);
|
||||
$query->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id');
|
||||
$query->orderBy('transaction_journals.date', 'asc');
|
||||
$amounts = [];
|
||||
if (null !== $account) {
|
||||
$query->where('transactions.account_id', $account->id);
|
||||
}
|
||||
if (null !== $account && null !== $transactionJournal) {
|
||||
$query->where('transaction_journals.date', '>=', $transactionJournal->date);
|
||||
$amounts = $this->getStartAmounts($account, $transactionJournal);
|
||||
}
|
||||
$result = $query->get(['transactions.account_id', 'transaction_journals.id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id', \DB::raw('SUM(transactions.amount) as sum_amount'), \DB::raw('SUM(transactions.foreign_amount) as sum_foreign_amount')]);
|
||||
$amounts = [];
|
||||
|
||||
/** @var \stdClass $row */
|
||||
foreach ($result as $row) {
|
||||
$account = (int) $row->account_id;
|
||||
$transactionCurrency = (int) $row->transaction_currency_id;
|
||||
$foreignCurrency = (int) $row->foreign_currency_id;
|
||||
$sumAmount = $row->sum_amount;
|
||||
$sumForeignAmount = $row->sum_foreign_amount;
|
||||
$sumAmount = (string) $row->sum_amount;
|
||||
$sumForeignAmount = (string) $row->sum_foreign_amount;
|
||||
$journalId = (int) $row->id;
|
||||
|
||||
// check for empty strings
|
||||
$sumAmount = '' === $sumAmount ? '0' : $sumAmount;
|
||||
$sumForeignAmount = '' === $sumForeignAmount ? '0' : $sumForeignAmount;
|
||||
|
||||
// new amounts:
|
||||
$amounts[$account][$transactionCurrency] = bcadd($amounts[$account][$transactionCurrency] ?? '0', $sumAmount ?? '0');
|
||||
$amounts[$account][$foreignCurrency] = bcadd($amounts[$account][$foreignCurrency] ?? '0', $sumForeignAmount ?? '0');
|
||||
$amounts[$account][$transactionCurrency] = bcadd($amounts[$account][$transactionCurrency] ?? '0', $sumAmount);
|
||||
$amounts[$account][$foreignCurrency] = bcadd($amounts[$account][$foreignCurrency] ?? '0', $sumForeignAmount);
|
||||
|
||||
// first create for normal currency:
|
||||
$entry = self::getAccountBalanceByJournal('balance_after_journal', $account, $journalId, $transactionCurrency);
|
||||
@@ -205,4 +212,11 @@ class AccountBalanceCalculator
|
||||
// group by account_id, transaction_journals.id, transaction_currency_id, foreign_currency_id
|
||||
// order by transaction_journals.date desc
|
||||
}
|
||||
|
||||
private function getStartAmounts(Account $account, TransactionJournal $journal): array
|
||||
{
|
||||
exit('here we are');
|
||||
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
@@ -27,6 +27,7 @@ use Carbon\Carbon;
|
||||
use Carbon\Exceptions\InvalidDateException;
|
||||
use Carbon\Exceptions\InvalidFormatException;
|
||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\Steam;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
@@ -114,6 +115,11 @@ trait ConvertsDataTypes
|
||||
return (string)$this->clearString((string)$entry);
|
||||
}
|
||||
|
||||
public function convertIban(string $field): string
|
||||
{
|
||||
return Steam::filterSpaces($this->convertString($field));
|
||||
}
|
||||
|
||||
public function clearString(?string $string): ?string
|
||||
{
|
||||
$string = $this->clearStringKeepNewlines($string);
|
||||
@@ -131,6 +137,13 @@ trait ConvertsDataTypes
|
||||
return trim($string);
|
||||
}
|
||||
|
||||
public function clearIban(?string $string): ?string
|
||||
{
|
||||
$string = $this->clearString($string);
|
||||
|
||||
return Steam::filterSpaces($string);
|
||||
}
|
||||
|
||||
public function clearStringKeepNewlines(?string $string): ?string
|
||||
{
|
||||
if (null === $string) {
|
||||
|
@@ -681,11 +681,13 @@ class Steam
|
||||
"\u{202F}", // narrow no-break space
|
||||
"\u{3000}", // ideographic space
|
||||
"\u{FEFF}", // zero width no -break space
|
||||
"\x20", // plain old normal space
|
||||
"\x20", // plain old normal space,
|
||||
' ',
|
||||
];
|
||||
|
||||
// clear zalgo text
|
||||
$string = preg_replace('/(\pM{2})\pM+/u', '\1', $string);
|
||||
$string = preg_replace('/\s+/', '', $string);
|
||||
|
||||
return str_replace($search, '', $string);
|
||||
}
|
||||
|
@@ -186,7 +186,7 @@ class General extends AbstractExtension
|
||||
$converter = new GithubFlavoredMarkdownConverter(
|
||||
[
|
||||
'allow_unsafe_links' => false,
|
||||
'max_nesting_level' => 3,
|
||||
'max_nesting_level' => 5,
|
||||
'html_input' => 'escape',
|
||||
]
|
||||
);
|
||||
|
@@ -53,7 +53,7 @@ class AttachmentTransformer extends AbstractTransformer
|
||||
'created_at' => $attachment->created_at->toAtomString(),
|
||||
'updated_at' => $attachment->updated_at->toAtomString(),
|
||||
'attachable_id' => (string)$attachment->attachable_id,
|
||||
'attachable_type' => str_replace('FireflyIII\\Models\\', '', $attachment->attachable_type),
|
||||
'attachable_type' => str_replace('FireflyIII\Models\\', '', $attachment->attachable_type),
|
||||
'md5' => $attachment->md5,
|
||||
'filename' => $attachment->filename,
|
||||
'download_url' => route('api.v1.attachments.download', [$attachment->id]),
|
||||
|
@@ -170,6 +170,7 @@ class FireflyValidator extends Validator
|
||||
"\u{202F}", // narrow no-break space
|
||||
"\u{3000}", // ideographic space
|
||||
"\u{FEFF}", // zero width no -break space
|
||||
' ',
|
||||
'-',
|
||||
'?',
|
||||
];
|
||||
|
@@ -106,7 +106,13 @@ trait GroupValidation
|
||||
'source_id', 'source_name', 'source_number', 'source_iban',
|
||||
'destination_id', 'destination_name', 'destination_number', 'destination_iban',
|
||||
];
|
||||
|
||||
// stop protesting when reconciliation is set to FALSE.
|
||||
|
||||
foreach ($data['transactions'] as $index => $row) {
|
||||
if (false === ($row['reconciled'] ?? false)) {
|
||||
continue;
|
||||
}
|
||||
foreach ($forbidden as $key) {
|
||||
if (array_key_exists($key, $row)) {
|
||||
$validator->errors()->add(
|
||||
|
66
changelog.md
66
changelog.md
@@ -3,6 +3,72 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## 6.1.18 - 2024-06-19
|
||||
|
||||
### Fixed
|
||||
|
||||
- [Issue 8978](https://github.com/firefly-iii/firefly-iii/issues/8978) (Error! Internal Firefly III Exception: bcadd(): Argument #2 ($num2) is not well-formed) reported by @el-rhazi
|
||||
- [Issue 8977](https://github.com/firefly-iii/firefly-iii/issues/8977) (Data Importer: "500 Server Error" with Firefly III v6.1.17) reported by @qtdzz
|
||||
|
||||
### Security
|
||||
|
||||
- [CVE-2024-37893](https://www.cve.org/CVERecord?id=CVE-2024-37893)
|
||||
|
||||
## 6.1.17 - 2024-06-16
|
||||
|
||||
### Added
|
||||
|
||||
- New routine that calculates account balances, first start could take a while.
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed auto-generated language files.
|
||||
|
||||
### Fixed
|
||||
|
||||
- [Issue 8907](https://github.com/firefly-iii/firefly-iii/issues/8907) (Error when adding initial balance: bcadd(): Argument #2 ($num2) must be of type string, int given) reported by @wnklmnn
|
||||
- [Issue 8911](https://github.com/firefly-iii/firefly-iii/issues/8911) (Docker container startup very slow) reported by @daften
|
||||
- [PR 8929](https://github.com/firefly-iii/firefly-iii/pull/8929) (icon title chgd from Deposit to Transfer) reported by @stevewasiura
|
||||
- [PR 8930](https://github.com/firefly-iii/firefly-iii/pull/8930) (icon title chgd from Deposit to Transfer) reported by @stevewasiura
|
||||
- [PR 8951](https://github.com/firefly-iii/firefly-iii/pull/8951) (add icon for delete action) reported by @stevewasiura
|
||||
- [PR 8957](https://github.com/firefly-iii/firefly-iii/pull/8957) (Remove nesting level for markdown) reported by @JeroenED
|
||||
- [Issue 8958](https://github.com/firefly-iii/firefly-iii/issues/8958) (Weird line appears above the UI when clicking on matching transactions for a rule) reported by @avee87
|
||||
- [Issue 8893](https://github.com/firefly-iii/firefly-iii/issues/8893) (API: `reconciled: false` does not have precedence) reported by @dreautall
|
||||
- [Issue 8954](https://github.com/firefly-iii/firefly-iii/issues/8954) (Wrong calculation of transaction without category) reported by @anarion80
|
||||
- [Issue 8927](https://github.com/firefly-iii/firefly-iii/issues/8927) (Converting deposit to transfer can set incorrect transaction currency) reported by @avee87
|
||||
- Various issues in release train.
|
||||
- There is a confirmation again before you delete data using the page in your profile
|
||||
|
||||
### Security
|
||||
|
||||
- Two (undisclosed) MFA bypass errors, reported by @Skelmis. Disclosure will follow in a few weeks.
|
||||
|
||||
### API
|
||||
|
||||
- Expand v2 chart API
|
||||
|
||||
## 6.1.16 - 2024-05-20
|
||||
|
||||
### Added
|
||||
|
||||
- Added [THANKS.md] to give credit to all developers who help with the development of Firefly III.
|
||||
|
||||
### Changed
|
||||
|
||||
- New data model for "account balance" makes it easier to calculate and use multi-currency accounts. Not yet in use.
|
||||
|
||||
### Fixed
|
||||
|
||||
- [Issue 8840](https://github.com/firefly-iii/firefly-iii/issues/8840) (Budget page crash) reported by @JcMinarro
|
||||
- [Issue 8863](https://github.com/firefly-iii/firefly-iii/issues/8863) (Empty webhooks page) reported by @mrahmadt
|
||||
- [Issue 8867](https://github.com/firefly-iii/firefly-iii/issues/8867) (SQL Integrity constraint violation when inserting into budget_limits) reported by @HedgehogRidingAnOwl
|
||||
- [Issue 8858](https://github.com/firefly-iii/firefly-iii/issues/8858) (A single Account constantly loses its Account NUmber / IBAN ) reported by @ypsilonkah
|
||||
|
||||
### API
|
||||
|
||||
- New filters for the v2 autocomplete endpoints.
|
||||
- Various attempts to make a better v2 accounts endpoint.
|
||||
|
||||
## 6.1.15 - 2024-04-24
|
||||
|
||||
### Fixed
|
||||
|
@@ -108,8 +108,7 @@
|
||||
"spatie/period": "^2.4",
|
||||
"symfony/expression-language": "^7.0",
|
||||
"symfony/http-client": "^7.0",
|
||||
"symfony/mailgun-mailer": "^7.0",
|
||||
"twig/twig": "3.8.0"
|
||||
"symfony/mailgun-mailer": "^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-debugbar": "^3.9",
|
||||
|
709
composer.lock
generated
709
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -117,8 +117,8 @@ return [
|
||||
'expression_engine' => false,
|
||||
// see cer.php for exchange rates feature flag.
|
||||
],
|
||||
'version' => 'develop/2024-05-16',
|
||||
'api_version' => '2.0.14',
|
||||
'version' => '6.1.18',
|
||||
'api_version' => '2.1.0',
|
||||
'db_version' => 24,
|
||||
|
||||
// generic settings
|
||||
|
@@ -49,10 +49,12 @@ class AccountTypeSeeder extends Seeder
|
||||
AccountType::LIABILITY_CREDIT,
|
||||
];
|
||||
foreach ($types as $type) {
|
||||
try {
|
||||
AccountType::create(['type' => $type]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
if (null === AccountType::where('type', $type)->first()) {
|
||||
try {
|
||||
AccountType::create(['type' => $type]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -36,7 +36,7 @@ class ConfigSeeder extends Seeder
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$entry = Configuration::where('name', 'db_version')->first();
|
||||
$entry = Configuration::where('name', 'db_version')->first();
|
||||
if (null === $entry) {
|
||||
Configuration::create(
|
||||
[
|
||||
@@ -44,11 +44,11 @@ class ConfigSeeder extends Seeder
|
||||
'data' => 1,
|
||||
]
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
if (null !== $entry) {
|
||||
$version = (int)config('firefly.db_version');
|
||||
$entry->data = $version;
|
||||
$entry->save();
|
||||
}
|
||||
$version = (int) config('firefly.db_version');
|
||||
$entry->data = $version;
|
||||
$entry->save();
|
||||
}
|
||||
}
|
||||
|
@@ -60,10 +60,12 @@ class LinkTypeSeeder extends Seeder
|
||||
],
|
||||
];
|
||||
foreach ($types as $type) {
|
||||
try {
|
||||
LinkType::create($type);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
if (null === LinkType::where('name', $type['name'])->first()) {
|
||||
try {
|
||||
LinkType::create($type);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -46,10 +46,12 @@ class PermissionSeeder extends Seeder
|
||||
],
|
||||
];
|
||||
foreach ($roles as $role) {
|
||||
try {
|
||||
Role::create($role);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
if (null === Role::where('name', $role['name'])->first()) {
|
||||
try {
|
||||
Role::create($role);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -42,6 +42,7 @@ class TransactionCurrencySeeder extends Seeder
|
||||
$currencies[] = ['code' => 'PLN', 'name' => 'Polish złoty', 'symbol' => 'zł', 'decimal_places' => 2];
|
||||
$currencies[] = ['code' => 'TRY', 'name' => 'Turkish lira', 'symbol' => '₺', 'decimal_places' => 2];
|
||||
$currencies[] = ['code' => 'DKK', 'name' => 'Dansk krone', 'symbol' => 'kr.', 'decimal_places' => 2];
|
||||
$currencies[] = ['code' => 'RON', 'name' => 'Romanian leu', 'symbol' => 'lei', 'decimal_places' => 2];
|
||||
|
||||
// american currencies
|
||||
$currencies[] = ['code' => 'USD', 'name' => 'US Dollar', 'symbol' => '$', 'decimal_places' => 2];
|
||||
@@ -71,10 +72,12 @@ class TransactionCurrencySeeder extends Seeder
|
||||
$currencies[] = ['code' => 'HRK', 'name' => 'Croatian kuna', 'symbol' => 'kn', 'decimal_places' => 2];
|
||||
|
||||
foreach ($currencies as $currency) {
|
||||
try {
|
||||
TransactionCurrency::create($currency);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
if (null === TransactionCurrency::where('code', $currency['code'])->first()) {
|
||||
try {
|
||||
TransactionCurrency::create($currency);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -44,10 +44,12 @@ class TransactionTypeSeeder extends Seeder
|
||||
];
|
||||
|
||||
foreach ($types as $type) {
|
||||
try {
|
||||
TransactionType::create(['type' => $type]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
if (null === TransactionType::where('type', $type)->first()) {
|
||||
try {
|
||||
TransactionType::create(['type' => $type]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -45,10 +45,12 @@ class UserRoleSeeder extends Seeder
|
||||
|
||||
/** @var string $role */
|
||||
foreach ($roles as $role) {
|
||||
try {
|
||||
UserRole::create(['title' => $role]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
if (null === UserRole::where('title', $role)->first()) {
|
||||
try {
|
||||
UserRole::create(['title' => $role]);
|
||||
} catch (\PDOException $e) {
|
||||
// @ignoreException
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1602
package-lock.json
generated
1602
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
1
public/v2/i18n/.gitignore
vendored
Normal file
1
public/v2/i18n/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.json
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "bg",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "\u0410\u043a\u0442\u0438\u0432\u0435\u043d \u043b\u0438 \u0435?",
|
||||
"name": "\u0418\u043c\u0435",
|
||||
"type": "\u0412\u0438\u0434",
|
||||
"number": "Account number",
|
||||
"liability_type": "\u0412\u0438\u0434 \u043d\u0430 \u0437\u0430\u0434\u044a\u043b\u0436\u0435\u043d\u0438\u0435\u0442\u043e",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "\u0414\u044a\u043b\u0436\u0430 \u0434\u044a\u043b\u0433",
|
||||
"liability_direction_credit_short": "\u0414\u044a\u043b\u0436\u044a\u0442 \u043c\u0438 \u0434\u044a\u043b\u0433",
|
||||
"interest_calc_yearly": "\u0413\u043e\u0434\u0438\u0448\u043d\u043e",
|
||||
"interest_calc_": "\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430",
|
||||
"interest_calc_daily": "\u041d\u0430 \u0434\u0435\u043d",
|
||||
"interest_calc_monthly": "\u041d\u0430 \u043c\u0435\u0441\u0435\u0446",
|
||||
"interest_calc_weekly": "\u0421\u0435\u0434\u043c\u0438\u0447\u043d\u043e",
|
||||
"interest_calc_half-year": "\u0417\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d \u0433\u043e\u0434\u0438\u043d\u0430",
|
||||
"interest_calc_quarterly": "\u0417\u0430 \u0442\u0440\u0438\u043c\u0435\u0441\u0435\u0447\u0438\u0435",
|
||||
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438",
|
||||
"paid": "\u041f\u043b\u0430\u0442\u0435\u043d\u0438",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "\u041d\u0435\u043f\u043b\u0430\u0442\u0435\u043d\u0438",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Suscripciones en el grupo \"%{title}\"",
|
||||
"subscr_expected_x_times": "Se debe pagar %{amount} %{times} veces este periodo",
|
||||
"overspent": "\u041f\u0440\u0435\u0440\u0430\u0437\u0445\u043e\u0434",
|
||||
"money_flowing_in": "\u0412\u0445\u043e\u0434\u044f\u0449\u0438",
|
||||
"money_flowing_out": "\u0418\u0437\u0445\u043e\u0434\u044f\u0449\u0438",
|
||||
"category": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "\u041f\u0440\u0435\u0445\u0432\u044a\u0440\u043b\u044f\u043d\u0435",
|
||||
"Withdrawal": "\u0422\u0435\u0433\u043b\u0435\u043d\u0435",
|
||||
"Deposit": "\u0414\u0435\u043f\u043e\u0437\u0438\u0442",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "\u0411\u044e\u0434\u0436\u0435\u0442",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "\u0414\u044a\u043b\u0433",
|
||||
"account_type_Loan": "\u0417\u0430\u0435\u043c",
|
||||
"account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430",
|
||||
"account_role_defaultAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0430\u043a\u0442\u0438\u0432\u0438 \u043f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",
|
||||
"account_role_sharedAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0438 \u0430\u043a\u0442\u0438\u0432\u0438",
|
||||
"account_role_savingAsset": "\u0421\u043f\u0435\u0441\u0442\u043e\u0432\u043d\u0430 \u0441\u043c\u0435\u0442\u043a\u0430",
|
||||
"account_role_ccAsset": "\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u0430 \u043a\u0430\u0440\u0442\u0430",
|
||||
"account_role_cashWalletAsset": "\u041f\u0430\u0440\u0438\u0447\u0435\u043d \u043f\u043e\u0440\u0442\u0444\u0435\u0439\u043b"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "bg",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "\u0410\u043a\u0442\u0438\u0432\u0435\u043d \u043b\u0438 \u0435?",
|
||||
"name": "\u0418\u043c\u0435",
|
||||
"type": "\u0412\u0438\u0434",
|
||||
"number": "Account number",
|
||||
"liability_type": "\u0412\u0438\u0434 \u043d\u0430 \u0437\u0430\u0434\u044a\u043b\u0436\u0435\u043d\u0438\u0435\u0442\u043e",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "\u0414\u044a\u043b\u0436\u0430 \u0434\u044a\u043b\u0433",
|
||||
"liability_direction_credit_short": "\u0414\u044a\u043b\u0436\u044a\u0442 \u043c\u0438 \u0434\u044a\u043b\u0433",
|
||||
"interest_calc_yearly": "\u0413\u043e\u0434\u0438\u0448\u043d\u043e",
|
||||
"interest_calc_": "\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430",
|
||||
"interest_calc_daily": "\u041d\u0430 \u0434\u0435\u043d",
|
||||
"interest_calc_monthly": "\u041d\u0430 \u043c\u0435\u0441\u0435\u0446",
|
||||
"interest_calc_weekly": "\u0421\u0435\u0434\u043c\u0438\u0447\u043d\u043e",
|
||||
"interest_calc_half-year": "\u0417\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d \u0433\u043e\u0434\u0438\u043d\u0430",
|
||||
"interest_calc_quarterly": "\u0417\u0430 \u0442\u0440\u0438\u043c\u0435\u0441\u0435\u0447\u0438\u0435",
|
||||
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438",
|
||||
"paid": "\u041f\u043b\u0430\u0442\u0435\u043d\u0438",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "\u041d\u0435\u043f\u043b\u0430\u0442\u0435\u043d\u0438",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Suscripciones en el grupo \"%{title}\"",
|
||||
"subscr_expected_x_times": "Se debe pagar %{amount} %{times} veces este periodo",
|
||||
"overspent": "\u041f\u0440\u0435\u0440\u0430\u0437\u0445\u043e\u0434",
|
||||
"money_flowing_in": "\u0412\u0445\u043e\u0434\u044f\u0449\u0438",
|
||||
"money_flowing_out": "\u0418\u0437\u0445\u043e\u0434\u044f\u0449\u0438",
|
||||
"category": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "\u041f\u0440\u0435\u0445\u0432\u044a\u0440\u043b\u044f\u043d\u0435",
|
||||
"Withdrawal": "\u0422\u0435\u0433\u043b\u0435\u043d\u0435",
|
||||
"Deposit": "\u0414\u0435\u043f\u043e\u0437\u0438\u0442",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "\u0411\u044e\u0434\u0436\u0435\u0442",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "\u0414\u044a\u043b\u0433",
|
||||
"account_type_Loan": "\u0417\u0430\u0435\u043c",
|
||||
"account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430",
|
||||
"account_role_defaultAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0430\u043a\u0442\u0438\u0432\u0438 \u043f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",
|
||||
"account_role_sharedAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0438 \u0430\u043a\u0442\u0438\u0432\u0438",
|
||||
"account_role_savingAsset": "\u0421\u043f\u0435\u0441\u0442\u043e\u0432\u043d\u0430 \u0441\u043c\u0435\u0442\u043a\u0430",
|
||||
"account_role_ccAsset": "\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u0430 \u043a\u0430\u0440\u0442\u0430",
|
||||
"account_role_cashWalletAsset": "\u041f\u0430\u0440\u0438\u0447\u0435\u043d \u043f\u043e\u0440\u0442\u0444\u0435\u0439\u043b"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "ca",
|
||||
"date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "T\u00edtol"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Arrossega i deixa anar",
|
||||
"active": "Est\u00e0 actiu?",
|
||||
"name": "Nom",
|
||||
"type": "Tipus",
|
||||
"number": "N\u00famero de compte",
|
||||
"liability_type": "Tipus de passiu",
|
||||
"current_balance": "Balan\u00e7 actual",
|
||||
"last_activity": "Darrera activitat",
|
||||
"amount_due": "Import pendent",
|
||||
"balance_difference": "Difer\u00e8ncia de saldo",
|
||||
"menu": "Men\u00fa"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte font.",
|
||||
"bad_type_destination": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte de dest\u00ed."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Ho dec",
|
||||
"liability_direction_credit_short": "Se'm deu",
|
||||
"interest_calc_yearly": "Per any",
|
||||
"interest_calc_": "desconegut",
|
||||
"interest_calc_daily": "Per dia",
|
||||
"interest_calc_monthly": "Per mes",
|
||||
"interest_calc_weekly": "Per setmana",
|
||||
"interest_calc_half-year": "Cada mig any",
|
||||
"interest_calc_quarterly": "Per quadrimestre",
|
||||
"spent": "Gastat",
|
||||
"administration_owner": "Propietari de l'administraci\u00f3: {{email}}",
|
||||
"administration_you": "El teu rol: {{role}}",
|
||||
"administration_role_owner": "Propietari",
|
||||
"administration_role_ro": "Nom\u00e9s de lectura",
|
||||
"administration_role_mng_trx": "Gestionar transaccions",
|
||||
"administration_role_mng_meta": "Gestionar classificaci\u00f3 i meta-dades",
|
||||
"administration_role_mng_budgets": "Gestionar pressupostos",
|
||||
"administration_role_mng_piggies": "Administra guardioles",
|
||||
"administration_role_mng_subscriptions": "Gestionar subscripcions",
|
||||
"administration_role_mng_rules": "Gestionar normes",
|
||||
"administration_role_mng_recurring": "Gestionar transaccions recurrents ",
|
||||
"administration_role_mng_webhooks": "Gestionar Webhooks",
|
||||
"administration_role_mng_currencies": "Gestionar divises",
|
||||
"administration_role_view_reports": "Veure informes",
|
||||
"administration_role_full": "Acc\u00e9s total",
|
||||
"new_administration_created": "S'ha creat una nova administraci\u00f3 financera \"{{title}}\"",
|
||||
"left": "Queda",
|
||||
"paid": "Pagat",
|
||||
"errors_submission_v2": "Hi ha hagut un error amb el teu enviament. Per favor, comprova els seg\u00fcents errors: {{errorMessage}}",
|
||||
"unpaid": "Pendent de pagament",
|
||||
"default_group_title_name_plain": "no agrupades",
|
||||
"subscriptions_in_group": "Subscripcions al grup \"%{title}\"",
|
||||
"subscr_expected_x_times": "S'espera que pagues %{amount} %{times} vegades aquest per\u00edode",
|
||||
"overspent": "Gastat de m\u00e9s",
|
||||
"money_flowing_in": "Entrant",
|
||||
"money_flowing_out": "Eixint",
|
||||
"category": "Categoria",
|
||||
"unknown_category_plain": "Sense categoria",
|
||||
"all_money": "Tots els teus diners",
|
||||
"unknown_source_plain": "Compte font desconegut",
|
||||
"unknown_dest_plain": "Compte de dest\u00ed desconegut",
|
||||
"unknown_any_plain": "Compte desconegut",
|
||||
"unknown_budget_plain": "Cap pressupost",
|
||||
"stored_journal_js": "S'ha creat la transacci\u00f3 \"{{description}}\" correctament",
|
||||
"wait_loading_transaction": "Per favor, espera que carregui el formulari",
|
||||
"nothing_found": "(no s'ha trobat res)",
|
||||
"wait_loading_data": "Per favor, espera que carregui la teva informaci\u00f3...",
|
||||
"Transfer": "Transfer\u00e8ncia",
|
||||
"Withdrawal": "Retirada",
|
||||
"Deposit": "Ingr\u00e9s",
|
||||
"expense_account": "Compte de despeses",
|
||||
"revenue_account": "Compte d'ingressos",
|
||||
"budget": "Pressupost",
|
||||
"account_type_Asset account": "Compte d'actius",
|
||||
"account_type_Expense account": "Compte de despeses",
|
||||
"account_type_Revenue account": "Compte d'ingressos",
|
||||
"account_type_Debt": "Deute",
|
||||
"account_type_Loan": "Cr\u00e8dit",
|
||||
"account_type_Mortgage": "Hipoteca",
|
||||
"account_role_defaultAsset": "Compte d'actius per defecte",
|
||||
"account_role_sharedAsset": "Compte d'actius compartit",
|
||||
"account_role_savingAsset": "Compte d'estalvis",
|
||||
"account_role_ccAsset": "Targeta de cr\u00e8dit",
|
||||
"account_role_cashWalletAsset": "Cartera d'efectiu"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "ca",
|
||||
"date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "T\u00edtol"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Arrossega i deixa anar",
|
||||
"active": "Est\u00e0 actiu?",
|
||||
"name": "Nom",
|
||||
"type": "Tipus",
|
||||
"number": "N\u00famero de compte",
|
||||
"liability_type": "Tipus de passiu",
|
||||
"current_balance": "Balan\u00e7 actual",
|
||||
"last_activity": "Darrera activitat",
|
||||
"amount_due": "Import pendent",
|
||||
"balance_difference": "Difer\u00e8ncia de saldo",
|
||||
"menu": "Men\u00fa"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte font.",
|
||||
"bad_type_destination": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte de dest\u00ed."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Ho dec",
|
||||
"liability_direction_credit_short": "Se'm deu",
|
||||
"interest_calc_yearly": "Per any",
|
||||
"interest_calc_": "desconegut",
|
||||
"interest_calc_daily": "Per dia",
|
||||
"interest_calc_monthly": "Per mes",
|
||||
"interest_calc_weekly": "Per setmana",
|
||||
"interest_calc_half-year": "Cada mig any",
|
||||
"interest_calc_quarterly": "Per quadrimestre",
|
||||
"spent": "Gastat",
|
||||
"administration_owner": "Propietari de l'administraci\u00f3: {{email}}",
|
||||
"administration_you": "El teu rol: {{role}}",
|
||||
"administration_role_owner": "Propietari",
|
||||
"administration_role_ro": "Nom\u00e9s de lectura",
|
||||
"administration_role_mng_trx": "Gestionar transaccions",
|
||||
"administration_role_mng_meta": "Gestionar classificaci\u00f3 i meta-dades",
|
||||
"administration_role_mng_budgets": "Gestionar pressupostos",
|
||||
"administration_role_mng_piggies": "Administra guardioles",
|
||||
"administration_role_mng_subscriptions": "Gestionar subscripcions",
|
||||
"administration_role_mng_rules": "Gestionar normes",
|
||||
"administration_role_mng_recurring": "Gestionar transaccions recurrents ",
|
||||
"administration_role_mng_webhooks": "Gestionar Webhooks",
|
||||
"administration_role_mng_currencies": "Gestionar divises",
|
||||
"administration_role_view_reports": "Veure informes",
|
||||
"administration_role_full": "Acc\u00e9s total",
|
||||
"new_administration_created": "S'ha creat una nova administraci\u00f3 financera \"{{title}}\"",
|
||||
"left": "Queda",
|
||||
"paid": "Pagat",
|
||||
"errors_submission_v2": "Hi ha hagut un error amb el teu enviament. Per favor, comprova els seg\u00fcents errors: {{errorMessage}}",
|
||||
"unpaid": "Pendent de pagament",
|
||||
"default_group_title_name_plain": "no agrupades",
|
||||
"subscriptions_in_group": "Subscripcions al grup \"%{title}\"",
|
||||
"subscr_expected_x_times": "S'espera que pagues %{amount} %{times} vegades aquest per\u00edode",
|
||||
"overspent": "Gastat de m\u00e9s",
|
||||
"money_flowing_in": "Entrant",
|
||||
"money_flowing_out": "Eixint",
|
||||
"category": "Categoria",
|
||||
"unknown_category_plain": "Sense categoria",
|
||||
"all_money": "Tots els teus diners",
|
||||
"unknown_source_plain": "Compte font desconegut",
|
||||
"unknown_dest_plain": "Compte de dest\u00ed desconegut",
|
||||
"unknown_any_plain": "Compte desconegut",
|
||||
"unknown_budget_plain": "Cap pressupost",
|
||||
"stored_journal_js": "S'ha creat la transacci\u00f3 \"{{description}}\" correctament",
|
||||
"wait_loading_transaction": "Per favor, espera que carregui el formulari",
|
||||
"nothing_found": "(no s'ha trobat res)",
|
||||
"wait_loading_data": "Per favor, espera que carregui la teva informaci\u00f3...",
|
||||
"Transfer": "Transfer\u00e8ncia",
|
||||
"Withdrawal": "Retirada",
|
||||
"Deposit": "Ingr\u00e9s",
|
||||
"expense_account": "Compte de despeses",
|
||||
"revenue_account": "Compte d'ingressos",
|
||||
"budget": "Pressupost",
|
||||
"account_type_Asset account": "Compte d'actius",
|
||||
"account_type_Expense account": "Compte de despeses",
|
||||
"account_type_Revenue account": "Compte d'ingressos",
|
||||
"account_type_Debt": "Deute",
|
||||
"account_type_Loan": "Cr\u00e8dit",
|
||||
"account_type_Mortgage": "Hipoteca",
|
||||
"account_role_defaultAsset": "Compte d'actius per defecte",
|
||||
"account_role_sharedAsset": "Compte d'actius compartit",
|
||||
"account_role_savingAsset": "Compte d'estalvis",
|
||||
"account_role_ccAsset": "Targeta de cr\u00e8dit",
|
||||
"account_role_cashWalletAsset": "Cartera d'efectiu"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "cs",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "N\u00e1zev"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Aktivn\u00ed?",
|
||||
"name": "Jm\u00e9no",
|
||||
"type": "Typ",
|
||||
"number": "Account number",
|
||||
"liability_type": "Typ z\u00e1vazku",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Owe this debt",
|
||||
"liability_direction_credit_short": "Owed this debt",
|
||||
"interest_calc_yearly": "Za rok",
|
||||
"interest_calc_": "nezn\u00e1m\u00e9",
|
||||
"interest_calc_daily": "Za den",
|
||||
"interest_calc_monthly": "Za m\u011bs\u00edc",
|
||||
"interest_calc_weekly": "Per week",
|
||||
"interest_calc_half-year": "Per half year",
|
||||
"interest_calc_quarterly": "Per quarter",
|
||||
"spent": "Utraceno",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Zb\u00fdv\u00e1",
|
||||
"paid": "Zaplaceno",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Nezaplaceno",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "P\u0159ekro\u010deny v\u00fddaje",
|
||||
"money_flowing_in": "Vstup",
|
||||
"money_flowing_out": "V\u00fdstup",
|
||||
"category": "Kategorie",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "P\u0159evod",
|
||||
"Withdrawal": "V\u00fdb\u011br",
|
||||
"Deposit": "Vklad",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Rozpo\u010det",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Dluh",
|
||||
"account_type_Loan": "P\u016fj\u010dka",
|
||||
"account_type_Mortgage": "Hypot\u00e9ka",
|
||||
"account_role_defaultAsset": "V\u00fdchoz\u00ed \u00fa\u010det aktiv",
|
||||
"account_role_sharedAsset": "Sd\u00edlen\u00fd \u00fa\u010det aktiv",
|
||||
"account_role_savingAsset": "Spo\u0159ic\u00ed \u00fa\u010det",
|
||||
"account_role_ccAsset": "Kreditn\u00ed karta",
|
||||
"account_role_cashWalletAsset": "Pen\u011b\u017eenka"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "cs",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "N\u00e1zev"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Aktivn\u00ed?",
|
||||
"name": "Jm\u00e9no",
|
||||
"type": "Typ",
|
||||
"number": "Account number",
|
||||
"liability_type": "Typ z\u00e1vazku",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Owe this debt",
|
||||
"liability_direction_credit_short": "Owed this debt",
|
||||
"interest_calc_yearly": "Za rok",
|
||||
"interest_calc_": "nezn\u00e1m\u00e9",
|
||||
"interest_calc_daily": "Za den",
|
||||
"interest_calc_monthly": "Za m\u011bs\u00edc",
|
||||
"interest_calc_weekly": "Per week",
|
||||
"interest_calc_half-year": "Per half year",
|
||||
"interest_calc_quarterly": "Per quarter",
|
||||
"spent": "Utraceno",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Zb\u00fdv\u00e1",
|
||||
"paid": "Zaplaceno",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Nezaplaceno",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "P\u0159ekro\u010deny v\u00fddaje",
|
||||
"money_flowing_in": "Vstup",
|
||||
"money_flowing_out": "V\u00fdstup",
|
||||
"category": "Kategorie",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "P\u0159evod",
|
||||
"Withdrawal": "V\u00fdb\u011br",
|
||||
"Deposit": "Vklad",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Rozpo\u010det",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Dluh",
|
||||
"account_type_Loan": "P\u016fj\u010dka",
|
||||
"account_type_Mortgage": "Hypot\u00e9ka",
|
||||
"account_role_defaultAsset": "V\u00fdchoz\u00ed \u00fa\u010det aktiv",
|
||||
"account_role_sharedAsset": "Sd\u00edlen\u00fd \u00fa\u010det aktiv",
|
||||
"account_role_savingAsset": "Spo\u0159ic\u00ed \u00fa\u010det",
|
||||
"account_role_ccAsset": "Kreditn\u00ed karta",
|
||||
"account_role_cashWalletAsset": "Pen\u011b\u017eenka"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "da",
|
||||
"date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Titel"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Aktiv?",
|
||||
"name": "Navn",
|
||||
"type": "Type",
|
||||
"number": "Account number",
|
||||
"liability_type": "G\u00e6ldstype",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne kildekonto.",
|
||||
"bad_type_destination": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne destinationskonto."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Ejer denne g\u00e6ld",
|
||||
"liability_direction_credit_short": "Ejer denne g\u00e6ld",
|
||||
"interest_calc_yearly": "Pr. \u00e5r",
|
||||
"interest_calc_": "ukendt",
|
||||
"interest_calc_daily": "Pr. dag",
|
||||
"interest_calc_monthly": "Pr. m\u00e5ned",
|
||||
"interest_calc_weekly": "Pr. uge",
|
||||
"interest_calc_half-year": "Hvert halve \u00e5r",
|
||||
"interest_calc_quarterly": "Pr. kvartal",
|
||||
"spent": "Spent",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Left",
|
||||
"paid": "Paid",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Ubetalt",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Overspent",
|
||||
"money_flowing_in": "In",
|
||||
"money_flowing_out": "Ud",
|
||||
"category": "Kategori",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Overf\u00f8rsel",
|
||||
"Withdrawal": "H\u00e6vet",
|
||||
"Deposit": "Indbetaling",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "G\u00e6ld",
|
||||
"account_type_Loan": "L\u00e5n",
|
||||
"account_type_Mortgage": "Pant",
|
||||
"account_role_defaultAsset": "Default asset account",
|
||||
"account_role_sharedAsset": "Shared asset account",
|
||||
"account_role_savingAsset": "Savings account",
|
||||
"account_role_ccAsset": "Credit card",
|
||||
"account_role_cashWalletAsset": "Cash wallet"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "da",
|
||||
"date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Titel"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Aktiv?",
|
||||
"name": "Navn",
|
||||
"type": "Type",
|
||||
"number": "Account number",
|
||||
"liability_type": "G\u00e6ldstype",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne kildekonto.",
|
||||
"bad_type_destination": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne destinationskonto."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Ejer denne g\u00e6ld",
|
||||
"liability_direction_credit_short": "Ejer denne g\u00e6ld",
|
||||
"interest_calc_yearly": "Pr. \u00e5r",
|
||||
"interest_calc_": "ukendt",
|
||||
"interest_calc_daily": "Pr. dag",
|
||||
"interest_calc_monthly": "Pr. m\u00e5ned",
|
||||
"interest_calc_weekly": "Pr. uge",
|
||||
"interest_calc_half-year": "Hvert halve \u00e5r",
|
||||
"interest_calc_quarterly": "Pr. kvartal",
|
||||
"spent": "Spent",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Left",
|
||||
"paid": "Paid",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Ubetalt",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Overspent",
|
||||
"money_flowing_in": "In",
|
||||
"money_flowing_out": "Ud",
|
||||
"category": "Kategori",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Overf\u00f8rsel",
|
||||
"Withdrawal": "H\u00e6vet",
|
||||
"Deposit": "Indbetaling",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "G\u00e6ld",
|
||||
"account_type_Loan": "L\u00e5n",
|
||||
"account_type_Mortgage": "Pant",
|
||||
"account_role_defaultAsset": "Default asset account",
|
||||
"account_role_sharedAsset": "Shared asset account",
|
||||
"account_role_savingAsset": "Savings account",
|
||||
"account_role_ccAsset": "Credit card",
|
||||
"account_role_cashWalletAsset": "Cash wallet"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "de",
|
||||
"date_time_fns": "dd. MMM. yyyy um HH:mm:ss",
|
||||
"month_and_day_fns": "D. MMMM Y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "dd. MMM. yyyy um HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Titel"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Ziehen und Ablegen",
|
||||
"active": "Aktiv?",
|
||||
"name": "Name",
|
||||
"type": "Typ",
|
||||
"number": "Kontonummer",
|
||||
"liability_type": "Verbindlichkeitsart",
|
||||
"current_balance": "Aktueller Kontostand",
|
||||
"last_activity": "Letzte Aktivit\u00e4t",
|
||||
"amount_due": "F\u00e4lliger Betrag",
|
||||
"balance_difference": "Saldendifferenz",
|
||||
"menu": "Men\u00fc"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III kann die Buchungsart anhand dieses Quellkontos nicht ermitteln.",
|
||||
"bad_type_destination": "Firefly III kann die Buchungsart anhand dieses Zielkontos nicht ermitteln."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Schuldiger Betrag",
|
||||
"liability_direction_credit_short": "Geschuldeter Betrag",
|
||||
"interest_calc_yearly": "J\u00e4hrlich",
|
||||
"interest_calc_": "Unbekannt",
|
||||
"interest_calc_daily": "T\u00e4glich",
|
||||
"interest_calc_monthly": "Monatlich",
|
||||
"interest_calc_weekly": "Pro Woche",
|
||||
"interest_calc_half-year": "Halbj\u00e4hrlich",
|
||||
"interest_calc_quarterly": "Viertelj\u00e4hrlich",
|
||||
"spent": "Ausgegeben",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Ihre Funktion: {{role}}",
|
||||
"administration_role_owner": "Inhaber",
|
||||
"administration_role_ro": "Schreibgesch\u00fctzt",
|
||||
"administration_role_mng_trx": "Buchungen verwalten",
|
||||
"administration_role_mng_meta": "Klassifizierungs- und Metadaten verwalten",
|
||||
"administration_role_mng_budgets": "Budgets verwalten",
|
||||
"administration_role_mng_piggies": "Sparschweine verwalten",
|
||||
"administration_role_mng_subscriptions": "Abonnements verwalten",
|
||||
"administration_role_mng_rules": "Regeln verwalten",
|
||||
"administration_role_mng_recurring": "Dauerauftr\u00e4ge verwalten ",
|
||||
"administration_role_mng_webhooks": "Webhooks verwalten",
|
||||
"administration_role_mng_currencies": "W\u00e4hrungen verwalten",
|
||||
"administration_role_view_reports": "Berichte anzeigen",
|
||||
"administration_role_full": "Vollst\u00e4ndiger Zugriff",
|
||||
"new_administration_created": "Neue Finanzverwaltung \u201e{{title}}\u201d wurde erstellt",
|
||||
"left": "\u00dcbrig",
|
||||
"paid": "Bezahlt",
|
||||
"errors_submission_v2": "Bei Ihrer \u00dcbermittlung ist ein Fehler aufgetreten. Bitte \u00fcberpr\u00fcfen Sie die unten stehenden Fehler: {{errorMessage}}",
|
||||
"unpaid": "Unbezahlt",
|
||||
"default_group_title_name_plain": "ungruppiert",
|
||||
"subscriptions_in_group": "Abonnements in Gruppe \"%{title}\"",
|
||||
"subscr_expected_x_times": "Die Zahlung von %{amount} wird in diesem Zeitraum %{times}-mal erwartet",
|
||||
"overspent": "Zuviel ausgegeben",
|
||||
"money_flowing_in": "Eingehend",
|
||||
"money_flowing_out": "Ausgehend",
|
||||
"category": "Kategorie",
|
||||
"unknown_category_plain": "Keine Kategorie",
|
||||
"all_money": "All Ihr Geld",
|
||||
"unknown_source_plain": "Unbekanntes Quellkonto",
|
||||
"unknown_dest_plain": "Unbekanntes Zielkonto",
|
||||
"unknown_any_plain": "Unbekanntes Konto",
|
||||
"unknown_budget_plain": "Kein Budget",
|
||||
"stored_journal_js": "Neue Buchung \u201e{{description}}\u201d erfolgreich erstellt",
|
||||
"wait_loading_transaction": "Bitte warten Sie, bis das Formular geladen wurde",
|
||||
"nothing_found": "(nichts gefunden)",
|
||||
"wait_loading_data": "Bitte warten Sie, bis Ihre Informationen geladen wurden \u2026",
|
||||
"Transfer": "Umbuchung",
|
||||
"Withdrawal": "Ausgabe",
|
||||
"Deposit": "Einnahme",
|
||||
"expense_account": "Ausgabenkonto",
|
||||
"revenue_account": "Einnahmekonto",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Bestandskonto",
|
||||
"account_type_Expense account": "Ausgabenkonto",
|
||||
"account_type_Revenue account": "Einnahmenkonto",
|
||||
"account_type_Debt": "Schuld",
|
||||
"account_type_Loan": "Darlehen",
|
||||
"account_type_Mortgage": "Hypothek",
|
||||
"account_role_defaultAsset": "Standard-Bestandskonto",
|
||||
"account_role_sharedAsset": "Gemeinsames Bestandskonto",
|
||||
"account_role_savingAsset": "Sparkonto",
|
||||
"account_role_ccAsset": "Kreditkarte",
|
||||
"account_role_cashWalletAsset": "Geldb\u00f6rse"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "de",
|
||||
"date_time_fns": "dd. MMM. yyyy um HH:mm:ss",
|
||||
"month_and_day_fns": "D. MMMM Y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "dd. MMM. yyyy um HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Titel"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Ziehen und Ablegen",
|
||||
"active": "Aktiv?",
|
||||
"name": "Name",
|
||||
"type": "Typ",
|
||||
"number": "Kontonummer",
|
||||
"liability_type": "Verbindlichkeitsart",
|
||||
"current_balance": "Aktueller Kontostand",
|
||||
"last_activity": "Letzte Aktivit\u00e4t",
|
||||
"amount_due": "F\u00e4lliger Betrag",
|
||||
"balance_difference": "Saldendifferenz",
|
||||
"menu": "Men\u00fc"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III kann die Buchungsart anhand dieses Quellkontos nicht ermitteln.",
|
||||
"bad_type_destination": "Firefly III kann die Buchungsart anhand dieses Zielkontos nicht ermitteln."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Schuldiger Betrag",
|
||||
"liability_direction_credit_short": "Geschuldeter Betrag",
|
||||
"interest_calc_yearly": "J\u00e4hrlich",
|
||||
"interest_calc_": "Unbekannt",
|
||||
"interest_calc_daily": "T\u00e4glich",
|
||||
"interest_calc_monthly": "Monatlich",
|
||||
"interest_calc_weekly": "Pro Woche",
|
||||
"interest_calc_half-year": "Halbj\u00e4hrlich",
|
||||
"interest_calc_quarterly": "Viertelj\u00e4hrlich",
|
||||
"spent": "Ausgegeben",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Ihre Funktion: {{role}}",
|
||||
"administration_role_owner": "Inhaber",
|
||||
"administration_role_ro": "Schreibgesch\u00fctzt",
|
||||
"administration_role_mng_trx": "Buchungen verwalten",
|
||||
"administration_role_mng_meta": "Klassifizierungs- und Metadaten verwalten",
|
||||
"administration_role_mng_budgets": "Budgets verwalten",
|
||||
"administration_role_mng_piggies": "Sparschweine verwalten",
|
||||
"administration_role_mng_subscriptions": "Abonnements verwalten",
|
||||
"administration_role_mng_rules": "Regeln verwalten",
|
||||
"administration_role_mng_recurring": "Dauerauftr\u00e4ge verwalten ",
|
||||
"administration_role_mng_webhooks": "Webhooks verwalten",
|
||||
"administration_role_mng_currencies": "W\u00e4hrungen verwalten",
|
||||
"administration_role_view_reports": "Berichte anzeigen",
|
||||
"administration_role_full": "Vollst\u00e4ndiger Zugriff",
|
||||
"new_administration_created": "Neue Finanzverwaltung \u201e{{title}}\u201d wurde erstellt",
|
||||
"left": "\u00dcbrig",
|
||||
"paid": "Bezahlt",
|
||||
"errors_submission_v2": "Bei Ihrer \u00dcbermittlung ist ein Fehler aufgetreten. Bitte \u00fcberpr\u00fcfen Sie die unten stehenden Fehler: {{errorMessage}}",
|
||||
"unpaid": "Unbezahlt",
|
||||
"default_group_title_name_plain": "ungruppiert",
|
||||
"subscriptions_in_group": "Abonnements in Gruppe \"%{title}\"",
|
||||
"subscr_expected_x_times": "Die Zahlung von %{amount} wird in diesem Zeitraum %{times}-mal erwartet",
|
||||
"overspent": "Zuviel ausgegeben",
|
||||
"money_flowing_in": "Eingehend",
|
||||
"money_flowing_out": "Ausgehend",
|
||||
"category": "Kategorie",
|
||||
"unknown_category_plain": "Keine Kategorie",
|
||||
"all_money": "All Ihr Geld",
|
||||
"unknown_source_plain": "Unbekanntes Quellkonto",
|
||||
"unknown_dest_plain": "Unbekanntes Zielkonto",
|
||||
"unknown_any_plain": "Unbekanntes Konto",
|
||||
"unknown_budget_plain": "Kein Budget",
|
||||
"stored_journal_js": "Neue Buchung \u201e{{description}}\u201d erfolgreich erstellt",
|
||||
"wait_loading_transaction": "Bitte warten Sie, bis das Formular geladen wurde",
|
||||
"nothing_found": "(nichts gefunden)",
|
||||
"wait_loading_data": "Bitte warten Sie, bis Ihre Informationen geladen wurden \u2026",
|
||||
"Transfer": "Umbuchung",
|
||||
"Withdrawal": "Ausgabe",
|
||||
"Deposit": "Einnahme",
|
||||
"expense_account": "Ausgabenkonto",
|
||||
"revenue_account": "Einnahmekonto",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Bestandskonto",
|
||||
"account_type_Expense account": "Ausgabenkonto",
|
||||
"account_type_Revenue account": "Einnahmenkonto",
|
||||
"account_type_Debt": "Schuld",
|
||||
"account_type_Loan": "Darlehen",
|
||||
"account_type_Mortgage": "Hypothek",
|
||||
"account_role_defaultAsset": "Standard-Bestandskonto",
|
||||
"account_role_sharedAsset": "Gemeinsames Bestandskonto",
|
||||
"account_role_savingAsset": "Sparkonto",
|
||||
"account_role_ccAsset": "Kreditkarte",
|
||||
"account_role_cashWalletAsset": "Geldb\u00f6rse"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "el",
|
||||
"date_time_fns": "do MMMM yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "\u03a4\u03af\u03c4\u03bb\u03bf\u03c2"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "\u0395\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03cc;",
|
||||
"name": "\u038c\u03bd\u03bf\u03bc\u03b1",
|
||||
"type": "\u03a4\u03cd\u03c0\u03bf\u03c2",
|
||||
"number": "Account number",
|
||||
"liability_type": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03c5\u03c0\u03bf\u03c7\u03c1\u03ad\u03c9\u03c3\u03b7\u03c2",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2.",
|
||||
"bad_type_destination": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "\u039f\u03c6\u03b5\u03af\u03bb\u03c9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
|
||||
"liability_direction_credit_short": "\u039c\u03bf\u03c5 \u03bf\u03c6\u03b5\u03af\u03bb\u03bf\u03c5\u03bd \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
|
||||
"interest_calc_yearly": "\u0391\u03bd\u03ac \u03ad\u03c4\u03bf\u03c2",
|
||||
"interest_calc_": "\u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf",
|
||||
"interest_calc_daily": "\u0391\u03bd\u03ac \u03b7\u03bc\u03ad\u03c1\u03b1",
|
||||
"interest_calc_monthly": "\u0391\u03bd\u03ac \u03bc\u03ae\u03bd\u03b1",
|
||||
"interest_calc_weekly": "\u0391\u03bd\u03ac \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1",
|
||||
"interest_calc_half-year": "\u0391\u03bd\u03ac \u03b5\u03be\u03ac\u03bc\u03b7\u03bd\u03bf",
|
||||
"interest_calc_quarterly": "\u0391\u03bd\u03ac \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf",
|
||||
"spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "\u0391\u03c0\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd",
|
||||
"paid": "\u03a0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ad\u03bd\u03bf",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "\u0391\u03c0\u03bb\u03ae\u03c1\u03c9\u03c4\u03bf",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "\u03a5\u03c0\u03ad\u03c1\u03b2\u03b1\u03c3\u03b7 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03ce\u03bd",
|
||||
"money_flowing_in": "\u0395\u03b9\u03c3\u03c1\u03bf\u03ad\u03c2",
|
||||
"money_flowing_out": "\u0395\u03ba\u03c1\u03bf\u03ad\u03c2",
|
||||
"category": "\u039a\u03b1\u03c4\u03b7\u03b3\u03bf\u03c1\u03af\u03b1",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "\u039c\u03b5\u03c4\u03b1\u03c6\u03bf\u03c1\u03ac",
|
||||
"Withdrawal": "\u0391\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7",
|
||||
"Deposit": "\u039a\u03b1\u03c4\u03ac\u03b8\u03b5\u03c3\u03b7",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "\u03a0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc\u03c2",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "\u03a7\u03c1\u03ad\u03bf\u03c2",
|
||||
"account_type_Loan": "\u0394\u03ac\u03bd\u03b5\u03b9\u03bf",
|
||||
"account_type_Mortgage": "\u03a5\u03c0\u03bf\u03b8\u03ae\u03ba\u03b7",
|
||||
"account_role_defaultAsset": "\u0392\u03b1\u03c3\u03b9\u03ba\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
|
||||
"account_role_sharedAsset": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
|
||||
"account_role_savingAsset": "\u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03b1\u03c0\u03bf\u03c4\u03b1\u03bc\u03af\u03b5\u03c5\u03c3\u03b7\u03c2",
|
||||
"account_role_ccAsset": "\u03a0\u03b9\u03c3\u03c4\u03c9\u03c4\u03b9\u03ba\u03ae \u03ba\u03ac\u03c1\u03c4\u03b1",
|
||||
"account_role_cashWalletAsset": "\u03a0\u03bf\u03c1\u03c4\u03bf\u03c6\u03cc\u03bb\u03b9 \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ce\u03bd"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "el",
|
||||
"date_time_fns": "do MMMM yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "\u03a4\u03af\u03c4\u03bb\u03bf\u03c2"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "\u0395\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03cc;",
|
||||
"name": "\u038c\u03bd\u03bf\u03bc\u03b1",
|
||||
"type": "\u03a4\u03cd\u03c0\u03bf\u03c2",
|
||||
"number": "Account number",
|
||||
"liability_type": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03c5\u03c0\u03bf\u03c7\u03c1\u03ad\u03c9\u03c3\u03b7\u03c2",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2.",
|
||||
"bad_type_destination": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "\u039f\u03c6\u03b5\u03af\u03bb\u03c9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
|
||||
"liability_direction_credit_short": "\u039c\u03bf\u03c5 \u03bf\u03c6\u03b5\u03af\u03bb\u03bf\u03c5\u03bd \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
|
||||
"interest_calc_yearly": "\u0391\u03bd\u03ac \u03ad\u03c4\u03bf\u03c2",
|
||||
"interest_calc_": "\u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf",
|
||||
"interest_calc_daily": "\u0391\u03bd\u03ac \u03b7\u03bc\u03ad\u03c1\u03b1",
|
||||
"interest_calc_monthly": "\u0391\u03bd\u03ac \u03bc\u03ae\u03bd\u03b1",
|
||||
"interest_calc_weekly": "\u0391\u03bd\u03ac \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1",
|
||||
"interest_calc_half-year": "\u0391\u03bd\u03ac \u03b5\u03be\u03ac\u03bc\u03b7\u03bd\u03bf",
|
||||
"interest_calc_quarterly": "\u0391\u03bd\u03ac \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf",
|
||||
"spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "\u0391\u03c0\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd",
|
||||
"paid": "\u03a0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ad\u03bd\u03bf",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "\u0391\u03c0\u03bb\u03ae\u03c1\u03c9\u03c4\u03bf",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "\u03a5\u03c0\u03ad\u03c1\u03b2\u03b1\u03c3\u03b7 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03ce\u03bd",
|
||||
"money_flowing_in": "\u0395\u03b9\u03c3\u03c1\u03bf\u03ad\u03c2",
|
||||
"money_flowing_out": "\u0395\u03ba\u03c1\u03bf\u03ad\u03c2",
|
||||
"category": "\u039a\u03b1\u03c4\u03b7\u03b3\u03bf\u03c1\u03af\u03b1",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "\u039c\u03b5\u03c4\u03b1\u03c6\u03bf\u03c1\u03ac",
|
||||
"Withdrawal": "\u0391\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7",
|
||||
"Deposit": "\u039a\u03b1\u03c4\u03ac\u03b8\u03b5\u03c3\u03b7",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "\u03a0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc\u03c2",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "\u03a7\u03c1\u03ad\u03bf\u03c2",
|
||||
"account_type_Loan": "\u0394\u03ac\u03bd\u03b5\u03b9\u03bf",
|
||||
"account_type_Mortgage": "\u03a5\u03c0\u03bf\u03b8\u03ae\u03ba\u03b7",
|
||||
"account_role_defaultAsset": "\u0392\u03b1\u03c3\u03b9\u03ba\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
|
||||
"account_role_sharedAsset": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
|
||||
"account_role_savingAsset": "\u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03b1\u03c0\u03bf\u03c4\u03b1\u03bc\u03af\u03b5\u03c5\u03c3\u03b7\u03c2",
|
||||
"account_role_ccAsset": "\u03a0\u03b9\u03c3\u03c4\u03c9\u03c4\u03b9\u03ba\u03ae \u03ba\u03ac\u03c1\u03c4\u03b1",
|
||||
"account_role_cashWalletAsset": "\u03a0\u03bf\u03c1\u03c4\u03bf\u03c6\u03cc\u03bb\u03b9 \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ce\u03bd"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "en-gb",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "MMMM d, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Title"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Is active?",
|
||||
"name": "Name",
|
||||
"type": "Type",
|
||||
"number": "Account number",
|
||||
"liability_type": "Type of liability",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Owe this debt",
|
||||
"liability_direction_credit_short": "Owed this debt",
|
||||
"interest_calc_yearly": "Per year",
|
||||
"interest_calc_": "unknown",
|
||||
"interest_calc_daily": "Per day",
|
||||
"interest_calc_monthly": "Per month",
|
||||
"interest_calc_weekly": "Per week",
|
||||
"interest_calc_half-year": "Per half year",
|
||||
"interest_calc_quarterly": "Per quarter",
|
||||
"spent": "Spent",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Left",
|
||||
"paid": "Paid",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Unpaid",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Overspent",
|
||||
"money_flowing_in": "In",
|
||||
"money_flowing_out": "Out",
|
||||
"category": "Category",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Transfer",
|
||||
"Withdrawal": "Withdrawal",
|
||||
"Deposit": "Deposit",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Debt",
|
||||
"account_type_Loan": "Loan",
|
||||
"account_type_Mortgage": "Mortgage",
|
||||
"account_role_defaultAsset": "Default asset account",
|
||||
"account_role_sharedAsset": "Shared asset account",
|
||||
"account_role_savingAsset": "Savings account",
|
||||
"account_role_ccAsset": "Credit card",
|
||||
"account_role_cashWalletAsset": "Cash wallet"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "en",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "MMMM d, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Title"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Is active?",
|
||||
"name": "Name",
|
||||
"type": "Type",
|
||||
"number": "Account number",
|
||||
"liability_type": "Type of liability",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Owe this debt",
|
||||
"liability_direction_credit_short": "Owed this debt",
|
||||
"interest_calc_yearly": "Per year",
|
||||
"interest_calc_": "unknown",
|
||||
"interest_calc_daily": "Per day",
|
||||
"interest_calc_monthly": "Per month",
|
||||
"interest_calc_weekly": "Per week",
|
||||
"interest_calc_half-year": "Per half year",
|
||||
"interest_calc_quarterly": "Per quarter",
|
||||
"spent": "Spent",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Left",
|
||||
"paid": "Paid",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Unpaid",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Overspent",
|
||||
"money_flowing_in": "In",
|
||||
"money_flowing_out": "Out",
|
||||
"category": "Category",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Transfer",
|
||||
"Withdrawal": "Withdrawal",
|
||||
"Deposit": "Deposit",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Debt",
|
||||
"account_type_Loan": "Loan",
|
||||
"account_type_Mortgage": "Mortgage",
|
||||
"account_role_defaultAsset": "Default asset account",
|
||||
"account_role_sharedAsset": "Shared asset account",
|
||||
"account_role_savingAsset": "Savings account",
|
||||
"account_role_ccAsset": "Credit card",
|
||||
"account_role_cashWalletAsset": "Cash wallet"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "en-gb",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "MMMM d, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Title"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Is active?",
|
||||
"name": "Name",
|
||||
"type": "Type",
|
||||
"number": "Account number",
|
||||
"liability_type": "Type of liability",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Owe this debt",
|
||||
"liability_direction_credit_short": "Owed this debt",
|
||||
"interest_calc_yearly": "Per year",
|
||||
"interest_calc_": "unknown",
|
||||
"interest_calc_daily": "Per day",
|
||||
"interest_calc_monthly": "Per month",
|
||||
"interest_calc_weekly": "Per week",
|
||||
"interest_calc_half-year": "Per half year",
|
||||
"interest_calc_quarterly": "Per quarter",
|
||||
"spent": "Spent",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Left",
|
||||
"paid": "Paid",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Unpaid",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Overspent",
|
||||
"money_flowing_in": "In",
|
||||
"money_flowing_out": "Out",
|
||||
"category": "Category",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Transfer",
|
||||
"Withdrawal": "Withdrawal",
|
||||
"Deposit": "Deposit",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Debt",
|
||||
"account_type_Loan": "Loan",
|
||||
"account_type_Mortgage": "Mortgage",
|
||||
"account_role_defaultAsset": "Default asset account",
|
||||
"account_role_sharedAsset": "Shared asset account",
|
||||
"account_role_savingAsset": "Savings account",
|
||||
"account_role_ccAsset": "Credit card",
|
||||
"account_role_cashWalletAsset": "Cash wallet"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "en",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "MMMM d, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Title"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Is active?",
|
||||
"name": "Name",
|
||||
"type": "Type",
|
||||
"number": "Account number",
|
||||
"liability_type": "Type of liability",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Owe this debt",
|
||||
"liability_direction_credit_short": "Owed this debt",
|
||||
"interest_calc_yearly": "Per year",
|
||||
"interest_calc_": "unknown",
|
||||
"interest_calc_daily": "Per day",
|
||||
"interest_calc_monthly": "Per month",
|
||||
"interest_calc_weekly": "Per week",
|
||||
"interest_calc_half-year": "Per half year",
|
||||
"interest_calc_quarterly": "Per quarter",
|
||||
"spent": "Spent",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Left",
|
||||
"paid": "Paid",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Unpaid",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Overspent",
|
||||
"money_flowing_in": "In",
|
||||
"money_flowing_out": "Out",
|
||||
"category": "Category",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Transfer",
|
||||
"Withdrawal": "Withdrawal",
|
||||
"Deposit": "Deposit",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budget",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Debt",
|
||||
"account_type_Loan": "Loan",
|
||||
"account_type_Mortgage": "Mortgage",
|
||||
"account_role_defaultAsset": "Default asset account",
|
||||
"account_role_sharedAsset": "Shared asset account",
|
||||
"account_role_savingAsset": "Savings account",
|
||||
"account_role_ccAsset": "Credit card",
|
||||
"account_role_cashWalletAsset": "Cash wallet"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "es",
|
||||
"date_time_fns": "El MMMM hacer, yyyy a las HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "T\u00edtulo"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "\u00bfEst\u00e1 Activo?",
|
||||
"name": "Nombre",
|
||||
"type": "Tipo",
|
||||
"number": "Account number",
|
||||
"liability_type": "Tipo de pasivo",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de origen.",
|
||||
"bad_type_destination": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de destino."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Tiene esta deuda",
|
||||
"liability_direction_credit_short": "Ten\u00eda esta deuda",
|
||||
"interest_calc_yearly": "Por a\u00f1o",
|
||||
"interest_calc_": "desconocido",
|
||||
"interest_calc_daily": "Por dia",
|
||||
"interest_calc_monthly": "Por mes",
|
||||
"interest_calc_weekly": "Por semana",
|
||||
"interest_calc_half-year": "Por semestre",
|
||||
"interest_calc_quarterly": "Por trimestre",
|
||||
"spent": "Gastado",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Disponible",
|
||||
"paid": "Pagado",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "No pagado",
|
||||
"default_group_title_name_plain": "sin agrupar",
|
||||
"subscriptions_in_group": "Suscripciones en el grupo \"%{title}\"",
|
||||
"subscr_expected_x_times": "Se espera pagar %{amount} %{times} veces este periodo",
|
||||
"overspent": "Sobrepasadas",
|
||||
"money_flowing_in": "Entrada",
|
||||
"money_flowing_out": "Salida",
|
||||
"category": "Categoria",
|
||||
"unknown_category_plain": "Sin categor\u00eda",
|
||||
"all_money": "Todo tu dinero",
|
||||
"unknown_source_plain": "Cuenta origen desconocida",
|
||||
"unknown_dest_plain": "Direcci\u00f3n de destino desconocida",
|
||||
"unknown_any_plain": "Cuenta desconocida",
|
||||
"unknown_budget_plain": "Sin presupuesto",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Por favor, espere a que se cargue el formulario",
|
||||
"nothing_found": "(no se encontr\u00f3 nada)",
|
||||
"wait_loading_data": "Por favor, espere a que su informaci\u00f3n se cargue...",
|
||||
"Transfer": "Transferencia",
|
||||
"Withdrawal": "Gasto",
|
||||
"Deposit": "Ingreso",
|
||||
"expense_account": "Cuenta de gastos",
|
||||
"revenue_account": "Cuenta de ingresos",
|
||||
"budget": "Presupuesto",
|
||||
"account_type_Asset account": "Cuenta de activos",
|
||||
"account_type_Expense account": "Cuenta de gastos",
|
||||
"account_type_Revenue account": "Cuenta de ingresos",
|
||||
"account_type_Debt": "Deuda",
|
||||
"account_type_Loan": "Pr\u00e9stamo",
|
||||
"account_type_Mortgage": "Hipoteca",
|
||||
"account_role_defaultAsset": "Cuentas de ingresos por defecto",
|
||||
"account_role_sharedAsset": "Cuenta de ingresos compartida",
|
||||
"account_role_savingAsset": "Cuentas de ahorros",
|
||||
"account_role_ccAsset": "Tarjeta de Cr\u00e9dito",
|
||||
"account_role_cashWalletAsset": "Billetera de efectivo"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "es",
|
||||
"date_time_fns": "El MMMM hacer, yyyy a las HH:mm:ss",
|
||||
"month_and_day_fns": "d MMMM y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "T\u00edtulo"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "\u00bfEst\u00e1 Activo?",
|
||||
"name": "Nombre",
|
||||
"type": "Tipo",
|
||||
"number": "Account number",
|
||||
"liability_type": "Tipo de pasivo",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"bad_type_source": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de origen.",
|
||||
"bad_type_destination": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de destino."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Tiene esta deuda",
|
||||
"liability_direction_credit_short": "Ten\u00eda esta deuda",
|
||||
"interest_calc_yearly": "Por a\u00f1o",
|
||||
"interest_calc_": "desconocido",
|
||||
"interest_calc_daily": "Por dia",
|
||||
"interest_calc_monthly": "Por mes",
|
||||
"interest_calc_weekly": "Por semana",
|
||||
"interest_calc_half-year": "Por semestre",
|
||||
"interest_calc_quarterly": "Por trimestre",
|
||||
"spent": "Gastado",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "Disponible",
|
||||
"paid": "Pagado",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "No pagado",
|
||||
"default_group_title_name_plain": "sin agrupar",
|
||||
"subscriptions_in_group": "Suscripciones en el grupo \"%{title}\"",
|
||||
"subscr_expected_x_times": "Se espera pagar %{amount} %{times} veces este periodo",
|
||||
"overspent": "Sobrepasadas",
|
||||
"money_flowing_in": "Entrada",
|
||||
"money_flowing_out": "Salida",
|
||||
"category": "Categoria",
|
||||
"unknown_category_plain": "Sin categor\u00eda",
|
||||
"all_money": "Todo tu dinero",
|
||||
"unknown_source_plain": "Cuenta origen desconocida",
|
||||
"unknown_dest_plain": "Direcci\u00f3n de destino desconocida",
|
||||
"unknown_any_plain": "Cuenta desconocida",
|
||||
"unknown_budget_plain": "Sin presupuesto",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Por favor, espere a que se cargue el formulario",
|
||||
"nothing_found": "(no se encontr\u00f3 nada)",
|
||||
"wait_loading_data": "Por favor, espere a que su informaci\u00f3n se cargue...",
|
||||
"Transfer": "Transferencia",
|
||||
"Withdrawal": "Gasto",
|
||||
"Deposit": "Ingreso",
|
||||
"expense_account": "Cuenta de gastos",
|
||||
"revenue_account": "Cuenta de ingresos",
|
||||
"budget": "Presupuesto",
|
||||
"account_type_Asset account": "Cuenta de activos",
|
||||
"account_type_Expense account": "Cuenta de gastos",
|
||||
"account_type_Revenue account": "Cuenta de ingresos",
|
||||
"account_type_Debt": "Deuda",
|
||||
"account_type_Loan": "Pr\u00e9stamo",
|
||||
"account_type_Mortgage": "Hipoteca",
|
||||
"account_role_defaultAsset": "Cuentas de ingresos por defecto",
|
||||
"account_role_sharedAsset": "Cuenta de ingresos compartida",
|
||||
"account_role_savingAsset": "Cuentas de ahorros",
|
||||
"account_role_ccAsset": "Tarjeta de Cr\u00e9dito",
|
||||
"account_role_cashWalletAsset": "Billetera de efectivo"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "fi",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "MMMM d, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Otsikko"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Aktiivinen?",
|
||||
"name": "Nimi",
|
||||
"type": "Tyyppi",
|
||||
"number": "Account number",
|
||||
"liability_type": "Lainatyyppi",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Olen velkaa",
|
||||
"liability_direction_credit_short": "Minulle ollaan velkaa",
|
||||
"interest_calc_yearly": "Vuodessa",
|
||||
"interest_calc_": "tuntematon",
|
||||
"interest_calc_daily": "P\u00e4iv\u00e4ss\u00e4",
|
||||
"interest_calc_monthly": "Kuukaudessa",
|
||||
"interest_calc_weekly": "Viikossa",
|
||||
"interest_calc_half-year": "Puolessa vuodessa",
|
||||
"interest_calc_quarterly": "Nelj\u00e4nnest\u00e4 kohden",
|
||||
"spent": "K\u00e4ytetty",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "J\u00e4ljell\u00e4",
|
||||
"paid": "Maksettu",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Maksamatta",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Varojen ylitys",
|
||||
"money_flowing_in": "Sis\u00e4\u00e4n",
|
||||
"money_flowing_out": "Ulos",
|
||||
"category": "Kategoria",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Siirto",
|
||||
"Withdrawal": "Nosto",
|
||||
"Deposit": "Talletus",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budjetti",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Velka",
|
||||
"account_type_Loan": "Laina",
|
||||
"account_type_Mortgage": "Kiinnelaina",
|
||||
"account_role_defaultAsset": "Oletusk\u00e4ytt\u00f6tili",
|
||||
"account_role_sharedAsset": "Jaettu k\u00e4ytt\u00f6tili",
|
||||
"account_role_savingAsset": "S\u00e4\u00e4st\u00f6tili",
|
||||
"account_role_ccAsset": "Luottokortti",
|
||||
"account_role_cashWalletAsset": "K\u00e4teinen"
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"html_language": "fi",
|
||||
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
|
||||
"month_and_day_fns": "MMMM d, y",
|
||||
"does_not_exist": "(config.does_not_exist)",
|
||||
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
|
||||
},
|
||||
"form": {
|
||||
"title": "Otsikko"
|
||||
},
|
||||
"list": {
|
||||
"drag_and_drop": "Drag and drop",
|
||||
"active": "Aktiivinen?",
|
||||
"name": "Nimi",
|
||||
"type": "Tyyppi",
|
||||
"number": "Account number",
|
||||
"liability_type": "Lainatyyppi",
|
||||
"current_balance": "Current balance",
|
||||
"last_activity": "Last activity",
|
||||
"amount_due": "Amount due",
|
||||
"balance_difference": "Balance difference",
|
||||
"menu": "Menu"
|
||||
},
|
||||
"validation": {
|
||||
"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."
|
||||
},
|
||||
"firefly": {
|
||||
"liability_direction_debit_short": "Olen velkaa",
|
||||
"liability_direction_credit_short": "Minulle ollaan velkaa",
|
||||
"interest_calc_yearly": "Vuodessa",
|
||||
"interest_calc_": "tuntematon",
|
||||
"interest_calc_daily": "P\u00e4iv\u00e4ss\u00e4",
|
||||
"interest_calc_monthly": "Kuukaudessa",
|
||||
"interest_calc_weekly": "Viikossa",
|
||||
"interest_calc_half-year": "Puolessa vuodessa",
|
||||
"interest_calc_quarterly": "Nelj\u00e4nnest\u00e4 kohden",
|
||||
"spent": "K\u00e4ytetty",
|
||||
"administration_owner": "Administration owner: {{email}}",
|
||||
"administration_you": "Your role: {{role}}",
|
||||
"administration_role_owner": "Owner",
|
||||
"administration_role_ro": "Read-only",
|
||||
"administration_role_mng_trx": "Manage transactions",
|
||||
"administration_role_mng_meta": "Manage classification and meta-data",
|
||||
"administration_role_mng_budgets": "Manage budgets",
|
||||
"administration_role_mng_piggies": "Manage piggy banks",
|
||||
"administration_role_mng_subscriptions": "Manage subscriptions",
|
||||
"administration_role_mng_rules": "Manage rules",
|
||||
"administration_role_mng_recurring": "Manage recurring transactions ",
|
||||
"administration_role_mng_webhooks": "Manage webhooks",
|
||||
"administration_role_mng_currencies": "Manage currencies",
|
||||
"administration_role_view_reports": "View reports",
|
||||
"administration_role_full": "Full access",
|
||||
"new_administration_created": "New financial administration \"{{title}}\" has been created",
|
||||
"left": "J\u00e4ljell\u00e4",
|
||||
"paid": "Maksettu",
|
||||
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",
|
||||
"unpaid": "Maksamatta",
|
||||
"default_group_title_name_plain": "ungrouped",
|
||||
"subscriptions_in_group": "Subscriptions in group \"%{title}\"",
|
||||
"subscr_expected_x_times": "Expect to pay %{amount} %{times} times this period",
|
||||
"overspent": "Varojen ylitys",
|
||||
"money_flowing_in": "Sis\u00e4\u00e4n",
|
||||
"money_flowing_out": "Ulos",
|
||||
"category": "Kategoria",
|
||||
"unknown_category_plain": "No category",
|
||||
"all_money": "All your money",
|
||||
"unknown_source_plain": "Unknown source account",
|
||||
"unknown_dest_plain": "Unknown destination account",
|
||||
"unknown_any_plain": "Unknown account",
|
||||
"unknown_budget_plain": "No budget",
|
||||
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
|
||||
"wait_loading_transaction": "Please wait for the form to load",
|
||||
"nothing_found": "(nothing found)",
|
||||
"wait_loading_data": "Please wait for your information to load...",
|
||||
"Transfer": "Siirto",
|
||||
"Withdrawal": "Nosto",
|
||||
"Deposit": "Talletus",
|
||||
"expense_account": "Expense account",
|
||||
"revenue_account": "Revenue account",
|
||||
"budget": "Budjetti",
|
||||
"account_type_Asset account": "Asset account",
|
||||
"account_type_Expense account": "Expense account",
|
||||
"account_type_Revenue account": "Revenue account",
|
||||
"account_type_Debt": "Velka",
|
||||
"account_type_Loan": "Laina",
|
||||
"account_type_Mortgage": "Kiinnelaina",
|
||||
"account_role_defaultAsset": "Oletusk\u00e4ytt\u00f6tili",
|
||||
"account_role_sharedAsset": "Jaettu k\u00e4ytt\u00f6tili",
|
||||
"account_role_savingAsset": "S\u00e4\u00e4st\u00f6tili",
|
||||
"account_role_ccAsset": "Luottokortti",
|
||||
"account_role_cashWalletAsset": "K\u00e4teinen"
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user