mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-18 18:44:16 +00:00
Compare commits
81 Commits
v6.2.17
...
develop-20
Author | SHA1 | Date | |
---|---|---|---|
|
31d06752fa | ||
|
8a27154798 | ||
|
6d87e38ec0 | ||
|
ccdc30a6fb | ||
|
90005538d3 | ||
|
f4e0428ebc | ||
|
bd1326eca9 | ||
|
bdfa834251 | ||
|
4a9aeb4e44 | ||
|
3886c0fbde | ||
|
d998eff56e | ||
|
d73df9bf0a | ||
|
754f2f3a34 | ||
|
43fd7c928a | ||
|
05768c2e73 | ||
|
3feb2c9955 | ||
|
7d9f3ac473 | ||
|
8a5755c8f1 | ||
|
a75a760019 | ||
|
78d1a130d2 | ||
|
79fd43f32b | ||
|
7a7bd65a27 | ||
|
01a9ecccac | ||
|
c1b3c71090 | ||
|
323d04fe6c | ||
|
80c2f1ea3f | ||
|
784494871d | ||
|
8e93af5cc7 | ||
|
ebfdeeedaa | ||
|
1d02ed6a56 | ||
|
cca53cb0e8 | ||
|
ab33aee4b1 | ||
|
41d4fab071 | ||
|
f0a1913dc6 | ||
|
b956b463c2 | ||
|
43603c4990 | ||
|
196e738f60 | ||
|
59e2ea357a | ||
|
5e9d942069 | ||
|
53d5bedd85 | ||
|
49c68af07b | ||
|
c84c8e1aef | ||
|
a8d43d7174 | ||
|
1087278890 | ||
|
ae5912ab52 | ||
|
035bd96ae5 | ||
|
7283c616a0 | ||
|
5706666bb6 | ||
|
4607466fb6 | ||
|
34bcfcfe9b | ||
|
05986cb6a6 | ||
|
0c4ee9f043 | ||
|
ff222795cf | ||
|
e0c76695ee | ||
|
ae126e8322 | ||
|
8f9c35fbe8 | ||
|
84efd6e2ee | ||
|
b1fbe4e909 | ||
|
8576877072 | ||
|
c298aced01 | ||
|
ac61a78d8d | ||
|
fce90a94c4 | ||
|
023a4f178d | ||
|
ef254995ad | ||
|
faeb74634b | ||
|
b5baae373f | ||
|
63de711cda | ||
|
bd28d116cb | ||
|
7efc2861bc | ||
|
5c689a2ca2 | ||
|
d5d65df76f | ||
|
df7d4f700c | ||
|
efebe3cb41 | ||
|
2ba5b6ae49 | ||
|
31d93efab2 | ||
|
657b95485c | ||
|
3bfc12f93b | ||
|
ccfd2f2ac3 | ||
|
fb3fe0d87b | ||
|
c80c6d52fe | ||
|
0fb3c0c7bf |
@@ -19,26 +19,24 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use PhpCsFixer\Runner\Parallel\ParallelConfigFactory;
|
|
||||||
|
|
||||||
$current = __DIR__;
|
$current = __DIR__;
|
||||||
|
|
||||||
$paths = [
|
$paths = [
|
||||||
$current . '/../../app',
|
$current . '/../../app',
|
||||||
$current . '/../../config',
|
$current . '/../../config',
|
||||||
$current . '/../../database',
|
|
||||||
$current . '/../../routes',
|
$current . '/../../routes',
|
||||||
$current . '/../../tests',
|
$current . '/../../tests',
|
||||||
$current . '/../../resources/lang/en_US',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$finder = PhpCsFixer\Finder::create()
|
$finder = PhpCsFixer\Finder::create()
|
||||||
->in($paths);
|
->in($paths);
|
||||||
|
|
||||||
|
|
||||||
$config = new PhpCsFixer\Config();
|
$config = (new PhpCsFixer\Config())
|
||||||
$config->setParallelConfig(ParallelConfigFactory::detect());
|
->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect())
|
||||||
|
;
|
||||||
return $config->setRules(
|
return $config->setRules(
|
||||||
|
|
||||||
[
|
[
|
||||||
// rule sets
|
// rule sets
|
||||||
'@PHP83Migration' => true,
|
'@PHP83Migration' => true,
|
||||||
@@ -53,9 +51,6 @@ return $config->setRules(
|
|||||||
'statement_indentation' => true,
|
'statement_indentation' => true,
|
||||||
'void_return' => true,
|
'void_return' => true,
|
||||||
|
|
||||||
// about importing statements
|
|
||||||
'global_namespace_import' => ['import_classes' => true, 'import_constants' => true, 'import_functions' => true],
|
|
||||||
|
|
||||||
// disabled rules
|
// disabled rules
|
||||||
'native_function_invocation' => false, // annoying
|
'native_function_invocation' => false, // annoying
|
||||||
'php_unit_data_provider_name' => false, // bloody annoying long test names
|
'php_unit_data_provider_name' => false, // bloody annoying long test names
|
||||||
@@ -64,9 +59,15 @@ return $config->setRules(
|
|||||||
'comment_to_phpdoc' => false, // breaks phpstan lines in combination with PHPStorm.
|
'comment_to_phpdoc' => false, // breaks phpstan lines in combination with PHPStorm.
|
||||||
'type_declaration_spaces' => false,
|
'type_declaration_spaces' => false,
|
||||||
'cast_spaces' => false,
|
'cast_spaces' => false,
|
||||||
'phpdoc_to_comment' => false, // do not overrule single line comment style, breaks phpstan.
|
|
||||||
|
// enabled rules
|
||||||
|
'global_namespace_import' => true, // matches with rector.
|
||||||
|
|
||||||
// complex rules
|
// complex rules
|
||||||
|
'phpdoc_to_comment' => ['ignored_tags' => ['var']],
|
||||||
|
'php_unit_test_case_static_method_calls' => [
|
||||||
|
'call_type' => 'this',
|
||||||
|
],
|
||||||
'array_syntax' => ['syntax' => 'short'],
|
'array_syntax' => ['syntax' => 'short'],
|
||||||
'binary_operator_spaces' => [
|
'binary_operator_spaces' => [
|
||||||
'default' => 'at_least_single_space',
|
'default' => 'at_least_single_space',
|
||||||
@@ -76,5 +77,7 @@ return $config->setRules(
|
|||||||
'??=' => 'align_single_space_minimal_by_scope',
|
'??=' => 'align_single_space_minimal_by_scope',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
])
|
]
|
||||||
|
|
||||||
|
)
|
||||||
->setFinder($finder);
|
->setFinder($finder);
|
||||||
|
65
.ci/php-cs-fixer/composer.lock
generated
65
.ci/php-cs-fixer/composer.lock
generated
@@ -406,58 +406,59 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "friendsofphp/php-cs-fixer",
|
"name": "friendsofphp/php-cs-fixer",
|
||||||
"version": "v3.75.0",
|
"version": "v3.82.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||||
"reference": "399a128ff2fdaf4281e4e79b755693286cdf325c"
|
"reference": "684ed3ab41008a2a4848de8bde17eb168c596247"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/399a128ff2fdaf4281e4e79b755693286cdf325c",
|
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/684ed3ab41008a2a4848de8bde17eb168c596247",
|
||||||
"reference": "399a128ff2fdaf4281e4e79b755693286cdf325c",
|
"reference": "684ed3ab41008a2a4848de8bde17eb168c596247",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"clue/ndjson-react": "^1.0",
|
"clue/ndjson-react": "^1.0",
|
||||||
"composer/semver": "^3.4",
|
"composer/semver": "^3.4",
|
||||||
"composer/xdebug-handler": "^3.0.3",
|
"composer/xdebug-handler": "^3.0.5",
|
||||||
"ext-filter": "*",
|
"ext-filter": "*",
|
||||||
"ext-hash": "*",
|
"ext-hash": "*",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"ext-tokenizer": "*",
|
"ext-tokenizer": "*",
|
||||||
"fidry/cpu-core-counter": "^1.2",
|
"fidry/cpu-core-counter": "^1.2",
|
||||||
"php": "^7.4 || ^8.0",
|
"php": "^7.4 || ^8.0",
|
||||||
"react/child-process": "^0.6.5",
|
"react/child-process": "^0.6.6",
|
||||||
"react/event-loop": "^1.0",
|
"react/event-loop": "^1.0",
|
||||||
"react/promise": "^2.0 || ^3.0",
|
"react/promise": "^2.11 || ^3.0",
|
||||||
"react/socket": "^1.0",
|
"react/socket": "^1.0",
|
||||||
"react/stream": "^1.0",
|
"react/stream": "^1.0",
|
||||||
"sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0",
|
"sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0",
|
||||||
"symfony/console": "^5.4 || ^6.4 || ^7.0",
|
"symfony/console": "^5.4.45 || ^6.4.13 || ^7.0",
|
||||||
"symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0",
|
"symfony/event-dispatcher": "^5.4.45 || ^6.4.13 || ^7.0",
|
||||||
"symfony/filesystem": "^5.4 || ^6.4 || ^7.0",
|
"symfony/filesystem": "^5.4.45 || ^6.4.13 || ^7.0",
|
||||||
"symfony/finder": "^5.4 || ^6.4 || ^7.0",
|
"symfony/finder": "^5.4.45 || ^6.4.17 || ^7.0",
|
||||||
"symfony/options-resolver": "^5.4 || ^6.4 || ^7.0",
|
"symfony/options-resolver": "^5.4.45 || ^6.4.16 || ^7.0",
|
||||||
"symfony/polyfill-mbstring": "^1.31",
|
"symfony/polyfill-mbstring": "^1.32",
|
||||||
"symfony/polyfill-php80": "^1.31",
|
"symfony/polyfill-php80": "^1.32",
|
||||||
"symfony/polyfill-php81": "^1.31",
|
"symfony/polyfill-php81": "^1.32",
|
||||||
"symfony/process": "^5.4 || ^6.4 || ^7.2",
|
"symfony/process": "^5.4.47 || ^6.4.20 || ^7.2",
|
||||||
"symfony/stopwatch": "^5.4 || ^6.4 || ^7.0"
|
"symfony/stopwatch": "^5.4.45 || ^6.4.19 || ^7.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"facile-it/paraunit": "^1.3.1 || ^2.6",
|
"facile-it/paraunit": "^1.3.1 || ^2.6",
|
||||||
"infection/infection": "^0.29.14",
|
"infection/infection": "^0.29.14",
|
||||||
"justinrainbow/json-schema": "^5.3 || ^6.2",
|
"justinrainbow/json-schema": "^5.3 || ^6.4",
|
||||||
"keradus/cli-executor": "^2.1",
|
"keradus/cli-executor": "^2.2",
|
||||||
"mikey179/vfsstream": "^1.6.12",
|
"mikey179/vfsstream": "^1.6.12",
|
||||||
"php-coveralls/php-coveralls": "^2.7",
|
"php-coveralls/php-coveralls": "^2.8",
|
||||||
"php-cs-fixer/accessible-object": "^1.1",
|
"php-cs-fixer/accessible-object": "^1.1",
|
||||||
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
|
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
|
||||||
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
|
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
|
||||||
"phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12",
|
"phpunit/phpunit": "^9.6.23 || ^10.5.47 || ^11.5.25",
|
||||||
"symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3",
|
"symfony/polyfill-php84": "^1.32",
|
||||||
"symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3"
|
"symfony/var-dumper": "^5.4.48 || ^6.4.23 || ^7.3.1",
|
||||||
|
"symfony/yaml": "^5.4.45 || ^6.4.23 || ^7.3.1"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-dom": "For handling output formats in XML",
|
"ext-dom": "For handling output formats in XML",
|
||||||
@@ -498,7 +499,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.75.0"
|
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.82.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -506,7 +507,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-03-31T18:40:42+00:00"
|
"time": "2025-07-08T21:13:15+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/container",
|
"name": "psr/container",
|
||||||
@@ -1256,16 +1257,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
"version": "v7.3.0",
|
"version": "v7.3.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/console.git",
|
"url": "https://github.com/symfony/console.git",
|
||||||
"reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44"
|
"reference": "9e27aecde8f506ba0fd1d9989620c04a87697101"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44",
|
"url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101",
|
||||||
"reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44",
|
"reference": "9e27aecde8f506ba0fd1d9989620c04a87697101",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1330,7 +1331,7 @@
|
|||||||
"terminal"
|
"terminal"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/console/tree/v7.3.0"
|
"source": "https://github.com/symfony/console/tree/v7.3.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1346,7 +1347,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-05-24T10:34:04+00:00"
|
"time": "2025-06-27T19:55:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/deprecation-contracts",
|
"name": "symfony/deprecation-contracts",
|
||||||
|
@@ -28,7 +28,8 @@ composer update --quiet
|
|||||||
rm -f .php-cs-fixer.cache
|
rm -f .php-cs-fixer.cache
|
||||||
PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix \
|
PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix \
|
||||||
--config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \
|
--config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \
|
||||||
--format=txt -v \
|
--format=txt \
|
||||||
|
-v \
|
||||||
--allow-risky=yes
|
--allow-risky=yes
|
||||||
|
|
||||||
EXIT_CODE=$?
|
EXIT_CODE=$?
|
||||||
|
@@ -25,6 +25,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
use Rector\Config\RectorConfig;
|
use Rector\Config\RectorConfig;
|
||||||
use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector;
|
use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector;
|
||||||
|
use Rector\Php80\Rector\ClassMethod\AddParamBasedOnParentClassMethodRector;
|
||||||
use Rector\Transform\Rector\String_\StringToClassConstantRector;
|
use Rector\Transform\Rector\String_\StringToClassConstantRector;
|
||||||
use RectorLaravel\Set\LaravelLevelSetList;
|
use RectorLaravel\Set\LaravelLevelSetList;
|
||||||
|
|
||||||
@@ -32,6 +33,7 @@ use RectorLaravel\Set\LaravelLevelSetList;
|
|||||||
return RectorConfig::configure()
|
return RectorConfig::configure()
|
||||||
->withSkip([
|
->withSkip([
|
||||||
ChangeOrIfContinueToMultiContinueRector::class,
|
ChangeOrIfContinueToMultiContinueRector::class,
|
||||||
|
AddParamBasedOnParentClassMethodRector::class,
|
||||||
StringToClassConstantRector::class => [
|
StringToClassConstantRector::class => [
|
||||||
__DIR__ . '/../app/Http/Controllers/Auth/LoginController.php',
|
__DIR__ . '/../app/Http/Controllers/Auth/LoginController.php',
|
||||||
],
|
],
|
||||||
|
@@ -329,7 +329,7 @@ FIREFLY_III_LAYOUT=v1
|
|||||||
# Which Query Parser implementation to use for the search engine and rules
|
# Which Query Parser implementation to use for the search engine and rules
|
||||||
# 'new' is experimental, 'legacy' is the classic one
|
# 'new' is experimental, 'legacy' is the classic one
|
||||||
#
|
#
|
||||||
QUERY_PARSER_IMPLEMENTATION=legacy
|
QUERY_PARSER_IMPLEMENTATION=new
|
||||||
|
|
||||||
#
|
#
|
||||||
# Please make sure this URL matches the external URL of your Firefly III installation.
|
# Please make sure this URL matches the external URL of your Firefly III installation.
|
||||||
|
13
.github/ISSUE_TEMPLATE/bug.yml
vendored
13
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Bug Report
|
name: Bug report
|
||||||
description: Report a bug in Firefly III (or associated tools)
|
description: Report a bug in Firefly III (or associated tools)
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
@@ -12,7 +12,7 @@ body:
|
|||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: I've found a bug and checked that ...
|
label: I've found a bug and checked that ...
|
||||||
description: Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, explain in detail why.
|
description: Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, please explain why.
|
||||||
options:
|
options:
|
||||||
- label: ... [the documentation](https://docs.firefly-iii.org/) does not mention anything about my problem
|
- label: ... [the documentation](https://docs.firefly-iii.org/) does not mention anything about my problem
|
||||||
- label: ... there are no open or closed issues that are related to my problem
|
- label: ... there are no open or closed issues that are related to my problem
|
||||||
@@ -33,13 +33,6 @@ body:
|
|||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Expected behaviour
|
|
||||||
description: Please describe precisely what you'd expect to happen. Be specific.
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Steps to reproduce
|
label: Steps to reproduce
|
||||||
@@ -54,4 +47,4 @@ body:
|
|||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Additional info
|
label: Additional info
|
||||||
description: Please provide any additional information that seem useful.
|
description: Please provide any additional information that seems useful.
|
||||||
|
3
.github/ISSUE_TEMPLATE/config.yml
vendored
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -3,3 +3,6 @@ contact_links:
|
|||||||
- name: Ask a question
|
- name: Ask a question
|
||||||
url: https://github.com/firefly-iii/firefly-iii/discussions
|
url: https://github.com/firefly-iii/firefly-iii/discussions
|
||||||
about: Please ask and answer questions here.
|
about: Please ask and answer questions here.
|
||||||
|
- name: I need support!
|
||||||
|
url: https://github.com/firefly-iii/firefly-iii/discussions
|
||||||
|
about: I think I broke something...
|
||||||
|
7
.github/ISSUE_TEMPLATE/fr.yml
vendored
7
.github/ISSUE_TEMPLATE/fr.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Feature Request
|
name: Feature request
|
||||||
description: Request a feature or enhancement in Firefly III (or associated tools)
|
description: Request a feature or enhancement in Firefly III (or associated tools)
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
@@ -31,11 +31,6 @@ body:
|
|||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: What are alternatives?
|
|
||||||
description: Please describe what alternatives currently exist.
|
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Additional context
|
label: Additional context
|
||||||
|
21
.github/workflows/release.yml
vendored
21
.github/workflows/release.yml
vendored
@@ -259,6 +259,12 @@ jobs:
|
|||||||
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 "* 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 "" >> output.txt
|
echo "" >> output.txt
|
||||||
echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt
|
echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt
|
||||||
|
|
||||||
|
# donations!
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo '### Support Firefly III' >> output.txt
|
||||||
|
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
fi
|
fi
|
||||||
# describe a branch release
|
# describe a branch release
|
||||||
if [[ "$version" == branch* ]]; then
|
if [[ "$version" == branch* ]]; then
|
||||||
@@ -279,16 +285,31 @@ jobs:
|
|||||||
if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]] && [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then
|
if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]] && [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then
|
||||||
echo 'Describe the latest release'
|
echo 'Describe the latest release'
|
||||||
sudo chown -R runner:docker output.txt
|
sudo chown -R runner:docker output.txt
|
||||||
|
|
||||||
|
# the changelog is in output.txt
|
||||||
|
mv output.txt output2.txt
|
||||||
|
|
||||||
touch output.txt
|
touch output.txt
|
||||||
echo '' >> output.txt
|
echo '' >> output.txt
|
||||||
echo "Welcome to release $version of Firefly III. It contains the the latest fixes, translations and features. Docker users can find this release under the \`latest\` tag." >> output.txt
|
echo "Welcome to release $version of Firefly III. It contains the the latest fixes, translations and features. Docker users can find this release under the \`latest\` tag." >> output.txt
|
||||||
echo '' >> output.txt
|
echo '' >> output.txt
|
||||||
|
|
||||||
|
# add changelog to file.
|
||||||
|
cat output2.txt >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
rm -f output2.txt
|
||||||
|
|
||||||
echo '### Instructions' >> output.txt
|
echo '### Instructions' >> output.txt
|
||||||
echo '' >> output.txt
|
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 "* 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 "* 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/)." >> 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/)." >> output.txt
|
||||||
|
|
||||||
|
# donations!
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo '### Support Firefly III' >> output.txt
|
||||||
|
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# describe alpha release
|
# describe alpha release
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
@@ -83,9 +84,8 @@ class CurrencyController extends Controller
|
|||||||
/**
|
/**
|
||||||
* Documentation for this endpoint is at:
|
* Documentation for this endpoint is at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function currenciesWithCode(AutocompleteRequest $request): JsonResponse
|
public function currenciesWithCode(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
|
@@ -162,7 +162,7 @@ class AccountController extends Controller
|
|||||||
$defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
$defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
||||||
|
|
||||||
/** @var Preference $frontpage */
|
/** @var Preference $frontpage */
|
||||||
Preferences::get('frontpageAccounts', $defaultSet);
|
$frontpage = Preferences::get('frontpageAccounts', $defaultSet);
|
||||||
|
|
||||||
if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
|
if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
|
||||||
$frontpage->data = $defaultSet;
|
$frontpage->data = $defaultSet;
|
||||||
|
@@ -237,9 +237,7 @@ class BudgetController extends Controller
|
|||||||
/** @var array $entry */
|
/** @var array $entry */
|
||||||
// only spent the entry where the entry's currency matches the budget limit's currency
|
// only spent the entry where the entry's currency matches the budget limit's currency
|
||||||
// so $filtered will only have 1 or 0 entries
|
// so $filtered will only have 1 or 0 entries
|
||||||
$filtered = array_filter($spent, function ($entry) use ($limitCurrencyId) {
|
$filtered = array_filter($spent, fn ($entry) => $entry['currency_id'] === $limitCurrencyId);
|
||||||
return $entry['currency_id'] === $limitCurrencyId;
|
|
||||||
});
|
|
||||||
$result = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end);
|
$result = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end);
|
||||||
if (1 === count($result)) {
|
if (1 === count($result)) {
|
||||||
$compare = bccomp($limit->amount, (string) app('steam')->positive($result[$limitCurrencyId]['spent']));
|
$compare = bccomp($limit->amount, (string) app('steam')->positive($result[$limitCurrencyId]['spent']));
|
||||||
|
@@ -58,7 +58,7 @@ class AutocompleteRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'date|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -60,8 +60,8 @@ class ChartRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|date|after:1900-01-01|before:2099-12-31|before_or_equal:end',
|
'start' => 'required|date|after:1970-01-02|before:2038-01-17|before_or_equal:end',
|
||||||
'end' => 'required|date|after:1900-01-01|before:2099-12-31|after_or_equal:start',
|
'end' => 'required|date|after:1970-01-02|before:2038-01-17|after_or_equal:start',
|
||||||
'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
|
'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
|
||||||
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
||||||
'accounts.*' => 'exists:accounts,id',
|
'accounts.*' => 'exists:accounts,id',
|
||||||
|
@@ -65,9 +65,9 @@ class DateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'date|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31|before:end|required_with:end',
|
'start' => 'date|after:1970-01-02|before:2038-01-17|before:end|required_with:end',
|
||||||
'end' => 'date|after:1900-01-01|before:2099-12-31|after:start|required_with:start',
|
'end' => 'date|after:1970-01-02|before:2038-01-17|after:start|required_with:start',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -55,8 +55,8 @@ class DateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'start' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01',
|
'end' => 'required|date|after_or_equal:start|before:2038-01-17|after:1970-01-02',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -53,7 +53,7 @@ class SingleDateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'date' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -66,8 +66,8 @@ class Request extends FormRequest
|
|||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'amount' => ['nullable', new IsValidPositiveAmount()],
|
'amount' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -80,9 +80,9 @@ class StoreRequest extends FormRequest
|
|||||||
'amount_max' => ['required', new IsValidPositiveAmount()],
|
'amount_max' => ['required', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'date' => 'date|required|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|required|after:1970-01-02|before:2038-01-17',
|
||||||
'end_date' => 'nullable|date|after:date|after:1900-01-01|before:2099-12-31',
|
'end_date' => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17',
|
||||||
'extension_date' => 'nullable|date|after:date|after:1900-01-01|before:2099-12-31',
|
'extension_date' => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17',
|
||||||
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly|required',
|
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly|required',
|
||||||
'skip' => 'min:0|max:31|numeric',
|
'skip' => 'min:0|max:31|numeric',
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
|
@@ -81,9 +81,9 @@ class UpdateRequest extends FormRequest
|
|||||||
'amount_max' => ['nullable', new IsValidPositiveAmount()],
|
'amount_max' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'date' => 'date|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end_date' => 'date|after:date|after:1900-01-01|before:2099-12-31',
|
'end_date' => 'date|after:date|after:1970-01-02|before:2038-01-17',
|
||||||
'extension_date' => 'date|after:date|after:1900-01-01|before:2099-12-31',
|
'extension_date' => 'date|after:date|after:1970-01-02|before:2038-01-17',
|
||||||
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly',
|
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly',
|
||||||
'skip' => 'min:0|max:31|numeric',
|
'skip' => 'min:0|max:31|numeric',
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
|
@@ -67,8 +67,8 @@ class UpdateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'amount' => ['nullable', new IsValidPositiveAmount()],
|
'amount' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
|
@@ -45,7 +45,7 @@ class DestroyRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'date' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -61,7 +61,7 @@ class StoreRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'date' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
'rate' => 'required|numeric|gt:0',
|
'rate' => 'required|numeric|gt:0',
|
||||||
'from' => 'required|exists:transaction_currencies,code',
|
'from' => 'required|exists:transaction_currencies,code',
|
||||||
'to' => 'required|exists:transaction_currencies,code',
|
'to' => 'required|exists:transaction_currencies,code',
|
||||||
|
@@ -50,7 +50,7 @@ class UpdateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'date|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'rate' => 'required|numeric|gt:0',
|
'rate' => 'required|numeric|gt:0',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@@ -154,7 +154,7 @@ class UpdateRequest extends FormRequest
|
|||||||
return [
|
return [
|
||||||
'title' => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id),
|
'title' => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id),
|
||||||
'description' => 'min:1|max:32768',
|
'description' => 'min:1|max:32768',
|
||||||
'first_date' => 'date|after:1900-01-01|before:2099-12-31',
|
'first_date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'apply_rules' => [new IsBoolean()],
|
'apply_rules' => [new IsBoolean()],
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
'repeat_until' => 'nullable|date',
|
'repeat_until' => 'nullable|date',
|
||||||
|
@@ -71,8 +71,8 @@ class TestRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
|
||||||
'accounts' => '',
|
'accounts' => '',
|
||||||
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
|
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
|
||||||
];
|
];
|
||||||
|
@@ -65,8 +65,8 @@ class TriggerRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
|
||||||
'accounts' => '',
|
'accounts' => '',
|
||||||
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
||||||
];
|
];
|
||||||
|
@@ -65,8 +65,8 @@ class TestRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
|
||||||
'accounts' => '',
|
'accounts' => '',
|
||||||
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
||||||
];
|
];
|
||||||
|
@@ -69,8 +69,8 @@ class TriggerRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -62,7 +62,7 @@ class StoreRequest extends FormRequest
|
|||||||
$rules = [
|
$rules = [
|
||||||
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024',
|
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024',
|
||||||
'description' => 'min:1|nullable|max:32768',
|
'description' => 'min:1|nullable|max:32768',
|
||||||
'date' => 'date|nullable|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
|
|
||||||
return Location::requestRules($rules);
|
return Location::requestRules($rules);
|
||||||
|
@@ -66,7 +66,7 @@ class UpdateRequest extends FormRequest
|
|||||||
$rules = [
|
$rules = [
|
||||||
'tag' => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id,
|
'tag' => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id,
|
||||||
'description' => 'min:1|nullable|max:32768',
|
'description' => 'min:1|nullable|max:32768',
|
||||||
'date' => 'date|nullable|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
|
|
||||||
return Location::requestRules($rules);
|
return Location::requestRules($rules);
|
||||||
|
@@ -73,7 +73,7 @@ class CronRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'force' => 'in:true,false',
|
'force' => 'in:true,false',
|
||||||
'date' => 'nullable|date|after:1900-01-01|before:2099-12-31',
|
'date' => 'nullable|date|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -116,7 +116,7 @@ class Controller extends BaseController
|
|||||||
app('log')->warning(sprintf('Ignored invalid date "%s" in API v2 controller parameter check: %s', substr((string) $date, 0, 20), $e->getMessage()));
|
app('log')->warning(sprintf('Ignored invalid date "%s" in API v2 controller parameter check: %s', substr((string) $date, 0, 20), $e->getMessage()));
|
||||||
}
|
}
|
||||||
// out of range? set to null.
|
// out of range? set to null.
|
||||||
if ($obj instanceof Carbon && ($obj->year <= 1900 || $obj->year > 2099)) {
|
if ($obj instanceof Carbon && ($obj->year <= 1970 || $obj->year > 2038)) {
|
||||||
app('log')->warning(sprintf('Refuse to use date "%s" in API v2 controller parameter check: %s', $field, $obj->toAtomString()));
|
app('log')->warning(sprintf('Refuse to use date "%s" in API v2 controller parameter check: %s', $field, $obj->toAtomString()));
|
||||||
$obj = null;
|
$obj = null;
|
||||||
}
|
}
|
||||||
|
@@ -86,7 +86,7 @@ class AutocompleteRequest extends FormRequest
|
|||||||
$valid = array_keys($this->types);
|
$valid = array_keys($this->types);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'date' => 'nullable|date|after:1900-01-01|before:2100-01-01',
|
'date' => 'nullable|date|after:1970-01-02|before:2038-01-17',
|
||||||
'query' => 'nullable|string',
|
'query' => 'nullable|string',
|
||||||
'size' => 'nullable|integer|min:1|max:100',
|
'size' => 'nullable|integer|min:1|max:100',
|
||||||
'page' => 'nullable|integer|min:1',
|
'page' => 'nullable|integer|min:1',
|
||||||
|
@@ -60,8 +60,8 @@ class BalanceChartRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'start' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01',
|
'end' => 'required|date|after_or_equal:start|before:2038-01-17|after:1970-01-02',
|
||||||
'accounts.*' => 'required|exists:accounts,id',
|
'accounts.*' => 'required|exists:accounts,id',
|
||||||
'period' => sprintf('required|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
'period' => sprintf('required|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
||||||
];
|
];
|
||||||
|
@@ -61,8 +61,8 @@ class ChartRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|date|after:1900-01-01|before:2099-12-31|before_or_equal:end',
|
'start' => 'required|date|after:1970-01-02|before:2038-01-17|before_or_equal:end',
|
||||||
'end' => 'required|date|after:1900-01-01|before:2099-12-31|after_or_equal:start',
|
'end' => 'required|date|after:1970-01-02|before:2038-01-17|after_or_equal:start',
|
||||||
'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
|
'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
|
||||||
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
||||||
'accounts.*' => 'exists:accounts,id',
|
'accounts.*' => 'exists:accounts,id',
|
||||||
|
@@ -60,8 +60,8 @@ class DashboardChartRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'start' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01',
|
'end' => 'required|date|after_or_equal:start|before:2038-01-17|after:1970-01-02',
|
||||||
'preselected' => sprintf('in:%s', implode(',', config('firefly.preselected_accounts'))),
|
'preselected' => sprintf('in:%s', implode(',', config('firefly.preselected_accounts'))),
|
||||||
'accounts.*' => 'exists:accounts,id',
|
'accounts.*' => 'exists:accounts,id',
|
||||||
];
|
];
|
||||||
|
@@ -55,8 +55,8 @@ class DateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'start' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01',
|
'end' => 'required|date|after_or_equal:start|before:2038-01-17|after:1970-01-02',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -53,7 +53,7 @@ class SingleDateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'required|date|after:1900-01-01|before:2099-12-31',
|
'date' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -63,9 +63,9 @@ class IndexRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'date|after:1900-01-01|before:2099-12-31',
|
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31|before:end|required_with:end',
|
'start' => 'date|after:1970-01-02|before:2038-01-17|before:end|required_with:end',
|
||||||
'end' => 'date|after:1900-01-01|before:2099-12-31|after:start|required_with:start',
|
'end' => 'date|after:1970-01-02|before:2038-01-17|after:start|required_with:start',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -109,8 +109,8 @@ class InfiniteListRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after:start|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after:start|after:1970-01-02|before:2038-01-17',
|
||||||
'start_row' => 'integer|min:0|max:4294967296',
|
'start_row' => 'integer|min:0|max:4294967296',
|
||||||
'end_row' => 'integer|min:0|max:4294967296|gt:start_row',
|
'end_row' => 'integer|min:0|max:4294967296|gt:start_row',
|
||||||
];
|
];
|
||||||
|
@@ -84,8 +84,8 @@ class ListRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'date|after:1900-01-01|before:2099-12-31',
|
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'end' => 'date|after:start|after:1900-01-01|before:2099-12-31',
|
'end' => 'date|after:start|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -58,6 +58,8 @@ use function Safe\parse_url;
|
|||||||
*/
|
*/
|
||||||
class Handler extends ExceptionHandler
|
class Handler extends ExceptionHandler
|
||||||
{
|
{
|
||||||
|
public static ?Throwable $lastError = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array<int, class-string<Throwable>>
|
* @var array<int, class-string<Throwable>>
|
||||||
*/
|
*/
|
||||||
@@ -123,7 +125,7 @@ class Handler extends ExceptionHandler
|
|||||||
// somehow Laravel handler does not catch this:
|
// somehow Laravel handler does not catch this:
|
||||||
app('log')->debug('Return JSON unauthenticated error.');
|
app('log')->debug('Return JSON unauthenticated error.');
|
||||||
|
|
||||||
return response()->json(['message' => 'Unauthenticated', 'exception' => 'AuthenticationException'], 401);
|
return response()->json(['message' => $e->getMessage(), 'exception' => 'AuthenticationException'], 401);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($e instanceof OAuthServerException && $expectsJson) {
|
if ($e instanceof OAuthServerException && $expectsJson) {
|
||||||
@@ -215,6 +217,7 @@ class Handler extends ExceptionHandler
|
|||||||
#[Override]
|
#[Override]
|
||||||
public function report(Throwable $e): void
|
public function report(Throwable $e): void
|
||||||
{
|
{
|
||||||
|
self::$lastError = $e;
|
||||||
$doMailError = (bool) config('firefly.send_error_message');
|
$doMailError = (bool) config('firefly.send_error_message');
|
||||||
if ($this->shouldntReportLocal($e) || !$doMailError) {
|
if ($this->shouldntReportLocal($e) || !$doMailError) {
|
||||||
parent::report($e);
|
parent::report($e);
|
||||||
|
@@ -78,7 +78,7 @@ class TagFactory
|
|||||||
'user_id' => $this->user->id,
|
'user_id' => $this->user->id,
|
||||||
'user_group_id' => $this->userGroup->id,
|
'user_group_id' => $this->userGroup->id,
|
||||||
'tag' => trim((string) $data['tag']),
|
'tag' => trim((string) $data['tag']),
|
||||||
'tagMode' => 'nothing',
|
'tag_mode' => 'nothing',
|
||||||
'date' => $data['date'],
|
'date' => $data['date'],
|
||||||
'description' => $data['description'],
|
'description' => $data['description'],
|
||||||
'latitude' => null,
|
'latitude' => null,
|
||||||
|
@@ -32,11 +32,14 @@ use FireflyIII\Models\TransactionGroup;
|
|||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\Models\Webhook;
|
use FireflyIII\Models\Webhook;
|
||||||
use FireflyIII\Models\WebhookMessage;
|
use FireflyIII\Models\WebhookMessage;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
|
||||||
use FireflyIII\Transformers\AccountTransformer;
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Ramsey\Uuid\Uuid;
|
use Ramsey\Uuid\Uuid;
|
||||||
use Symfony\Component\HttpFoundation\ParameterBag;
|
use Symfony\Component\HttpFoundation\ParameterBag;
|
||||||
|
|
||||||
@@ -59,14 +62,14 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
|
|
||||||
public function generateMessages(): void
|
public function generateMessages(): void
|
||||||
{
|
{
|
||||||
app('log')->debug(__METHOD__);
|
Log::debug(__METHOD__);
|
||||||
// get the webhooks:
|
// get the webhooks:
|
||||||
if (0 === $this->webhooks->count()) {
|
if (0 === $this->webhooks->count()) {
|
||||||
$this->webhooks = $this->getWebhooks();
|
$this->webhooks = $this->getWebhooks();
|
||||||
}
|
}
|
||||||
|
|
||||||
// do some debugging
|
// do some debugging
|
||||||
app('log')->debug(
|
Log::debug(
|
||||||
sprintf('StandardMessageGenerator will generate messages for %d object(s) and %d webhook(s).', $this->objects->count(), $this->webhooks->count())
|
sprintf('StandardMessageGenerator will generate messages for %d object(s) and %d webhook(s).', $this->objects->count(), $this->webhooks->count())
|
||||||
);
|
);
|
||||||
$this->run();
|
$this->run();
|
||||||
@@ -79,13 +82,13 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
|
|
||||||
private function run(): void
|
private function run(): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in StandardMessageGenerator::run');
|
Log::debug('Now in StandardMessageGenerator::run');
|
||||||
|
|
||||||
/** @var Webhook $webhook */
|
/** @var Webhook $webhook */
|
||||||
foreach ($this->webhooks as $webhook) {
|
foreach ($this->webhooks as $webhook) {
|
||||||
$this->runWebhook($webhook);
|
$this->runWebhook($webhook);
|
||||||
}
|
}
|
||||||
app('log')->debug('Done with StandardMessageGenerator::run');
|
Log::debug('Done with StandardMessageGenerator::run');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,7 +96,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
*/
|
*/
|
||||||
private function runWebhook(Webhook $webhook): void
|
private function runWebhook(Webhook $webhook): void
|
||||||
{
|
{
|
||||||
app('log')->debug(sprintf('Now in runWebhook(#%d)', $webhook->id));
|
Log::debug(sprintf('Now in runWebhook(#%d)', $webhook->id));
|
||||||
|
|
||||||
/** @var Model $object */
|
/** @var Model $object */
|
||||||
foreach ($this->objects as $object) {
|
foreach ($this->objects as $object) {
|
||||||
@@ -108,7 +111,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
{
|
{
|
||||||
$class = $model::class;
|
$class = $model::class;
|
||||||
// Line is ignored because all of Firefly III's Models have an id property.
|
// Line is ignored because all of Firefly III's Models have an id property.
|
||||||
app('log')->debug(sprintf('Now in generateMessage(#%d, %s#%d)', $webhook->id, $class, $model->id));
|
Log::debug(sprintf('Now in generateMessage(#%d, %s#%d)', $webhook->id, $class, $model->id));
|
||||||
|
|
||||||
$uuid = Uuid::uuid4();
|
$uuid = Uuid::uuid4();
|
||||||
$basicMessage = [
|
$basicMessage = [
|
||||||
@@ -125,7 +128,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
switch ($class) {
|
switch ($class) {
|
||||||
default:
|
default:
|
||||||
// Line is ignored because all of Firefly III's Models have an id property.
|
// Line is ignored because all of Firefly III's Models have an id property.
|
||||||
app('log')->error(
|
Log::error(
|
||||||
sprintf('Webhook #%d was given %s#%d to deal with but can\'t extract user ID from it.', $webhook->id, $class, $model->id)
|
sprintf('Webhook #%d was given %s#%d to deal with but can\'t extract user ID from it.', $webhook->id, $class, $model->id)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -141,7 +144,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
// then depends on the response what to put in the message:
|
// then depends on the response what to put in the message:
|
||||||
switch ($webhook->response) {
|
switch ($webhook->response) {
|
||||||
default:
|
default:
|
||||||
app('log')->error(
|
Log::error(
|
||||||
sprintf('The response code for webhook #%d is "%d" and the message generator cant handle it. Soft fail.', $webhook->id, $webhook->response)
|
sprintf('The response code for webhook #%d is "%d" and the message generator cant handle it. Soft fail.', $webhook->id, $webhook->response)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -159,10 +162,10 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
try {
|
try {
|
||||||
$basicMessage['content'] = $transformer->transformObject($model);
|
$basicMessage['content'] = $transformer->transformObject($model);
|
||||||
} catch (FireflyException $e) {
|
} catch (FireflyException $e) {
|
||||||
app('log')->error(
|
Log::error(
|
||||||
sprintf('The transformer could not include the requested transaction group for webhook #%d: %s', $webhook->id, $e->getMessage())
|
sprintf('The transformer could not include the requested transaction group for webhook #%d: %s', $webhook->id, $e->getMessage())
|
||||||
);
|
);
|
||||||
app('log')->error($e->getTraceAsString());
|
Log::error($e->getTraceAsString());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -172,6 +175,10 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
case WebhookResponse::ACCOUNTS->value:
|
case WebhookResponse::ACCOUNTS->value:
|
||||||
/** @var TransactionGroup $model */
|
/** @var TransactionGroup $model */
|
||||||
$accounts = $this->collectAccounts($model);
|
$accounts = $this->collectAccounts($model);
|
||||||
|
$enrichment = new AccountEnrichment();
|
||||||
|
$enrichment->setUser($model->user);
|
||||||
|
$enrichment->setNative(Amount::getNativeCurrencyByUserGroup($model->userGroup));
|
||||||
|
$accounts = $enrichment->enrich($accounts);
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
$transformer = new AccountTransformer();
|
$transformer = new AccountTransformer();
|
||||||
$transformer->setParameters(new ParameterBag());
|
$transformer->setParameters(new ParameterBag());
|
||||||
@@ -210,7 +217,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
|
|||||||
$webhookMessage->uuid = $message['uuid'];
|
$webhookMessage->uuid = $message['uuid'];
|
||||||
$webhookMessage->message = $message;
|
$webhookMessage->message = $message;
|
||||||
$webhookMessage->save();
|
$webhookMessage->save();
|
||||||
app('log')->debug(sprintf('Stored new webhook message #%d', $webhookMessage->id));
|
Log::debug(sprintf('Stored new webhook message #%d', $webhookMessage->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setObjects(Collection $objects): void
|
public function setObjects(Collection $objects): void
|
||||||
|
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Handlers\Events;
|
namespace FireflyIII\Handlers\Events;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Events\RequestedVersionCheckStatus;
|
use FireflyIII\Events\RequestedVersionCheckStatus;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
@@ -42,9 +43,8 @@ class VersionCheckEventHandler
|
|||||||
* Checks with GitHub to see if there is a new version.
|
* Checks with GitHub to see if there is a new version.
|
||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
|
||||||
* @deprecated ?
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated(message: '?')]
|
||||||
public function checkForUpdates(RequestedVersionCheckStatus $event): void
|
public function checkForUpdates(RequestedVersionCheckStatus $event): void
|
||||||
{
|
{
|
||||||
Log::debug('Now in checkForUpdates()');
|
Log::debug('Now in checkForUpdates()');
|
||||||
|
@@ -434,6 +434,7 @@ class GroupCollector implements GroupCollectorInterface
|
|||||||
|
|
||||||
public function findNothing(): GroupCollectorInterface
|
public function findNothing(): GroupCollectorInterface
|
||||||
{
|
{
|
||||||
|
Log::warning('The search engine was instructed to FIND NOTHING. This may be a bug.');
|
||||||
$this->query->where('transaction_groups.id', -1);
|
$this->query->where('transaction_groups.id', -1);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
@@ -1094,6 +1095,10 @@ class GroupCollector implements GroupCollectorInterface
|
|||||||
->whereNull('transaction_groups.deleted_at')
|
->whereNull('transaction_groups.deleted_at')
|
||||||
->whereNull('transaction_journals.deleted_at')
|
->whereNull('transaction_journals.deleted_at')
|
||||||
->whereNull('source.deleted_at')
|
->whereNull('source.deleted_at')
|
||||||
|
|
||||||
|
// #10507 ignore opening balance.
|
||||||
|
->where('transaction_types.type', '!=', TransactionTypeEnum::OPENING_BALANCE->value)
|
||||||
|
|
||||||
->whereNotNull('transaction_groups.id')
|
->whereNotNull('transaction_groups.id')
|
||||||
->whereNull('destination.deleted_at')
|
->whereNull('destination.deleted_at')
|
||||||
->orderBy('transaction_journals.date', 'DESC')
|
->orderBy('transaction_journals.date', 'DESC')
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Helpers\Report;
|
namespace FireflyIII\Helpers\Report;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
@@ -81,7 +82,7 @@ class NetWorth implements NetWorthInterface
|
|||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
Log::debug(sprintf('Now at account #%d ("%s")', $account->id, $account->name));
|
// Log::debug(sprintf('Now at account #%d ("%s")', $account->id, $account->name));
|
||||||
$currency = $this->accountRepository->getAccountCurrency($account) ?? $default;
|
$currency = $this->accountRepository->getAccountCurrency($account) ?? $default;
|
||||||
$useNative = $convertToNative && $default->id !== $currency->id;
|
$useNative = $convertToNative && $default->id !== $currency->id;
|
||||||
$currency = $useNative ? $default : $currency;
|
$currency = $useNative ? $default : $currency;
|
||||||
@@ -92,12 +93,12 @@ class NetWorth implements NetWorthInterface
|
|||||||
$balance = $balances[$account->id]['balance'] ?? '0';
|
$balance = $balances[$account->id]['balance'] ?? '0';
|
||||||
$nativeBalance = $balances[$account->id]['native_balance'] ?? '0';
|
$nativeBalance = $balances[$account->id]['native_balance'] ?? '0';
|
||||||
}
|
}
|
||||||
Log::debug(sprintf('Balance is %s, native balance is %s', $balance, $nativeBalance));
|
// Log::debug(sprintf('Balance is %s, native balance is %s', $balance, $nativeBalance));
|
||||||
// always subtract virtual balance again.
|
// always subtract virtual balance again.
|
||||||
$balance = '' !== (string) $account->virtual_balance ? bcsub($balance, (string) $account->virtual_balance) : $balance;
|
$balance = '' !== (string) $account->virtual_balance ? bcsub($balance, (string) $account->virtual_balance) : $balance;
|
||||||
$nativeBalance = '' !== (string) $account->native_virtual_balance ? bcsub($nativeBalance, (string) $account->native_virtual_balance) : $nativeBalance;
|
$nativeBalance = '' !== (string) $account->native_virtual_balance ? bcsub($nativeBalance, (string) $account->native_virtual_balance) : $nativeBalance;
|
||||||
$amountToUse = $useNative ? $nativeBalance : $balance;
|
$amountToUse = $useNative ? $nativeBalance : $balance;
|
||||||
Log::debug(sprintf('Will use %s %s', $currencyCode, $amountToUse));
|
// Log::debug(sprintf('Will use %s %s', $currencyCode, $amountToUse));
|
||||||
|
|
||||||
$netWorth[$currencyCode] ??= [
|
$netWorth[$currencyCode] ??= [
|
||||||
'balance' => '0',
|
'balance' => '0',
|
||||||
@@ -134,9 +135,7 @@ class NetWorth implements NetWorthInterface
|
|||||||
$this->currencyRepos->setUserGroup($this->userGroup);
|
$this->currencyRepos->setUserGroup($this->userGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function sumNetWorthByCurrency(Carbon $date): array
|
public function sumNetWorthByCurrency(Carbon $date): array
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Helpers\Report;
|
namespace FireflyIII\Helpers\Report;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Models\UserGroup;
|
use FireflyIII\Models\UserGroup;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
@@ -53,8 +54,7 @@ interface NetWorthInterface
|
|||||||
* TODO move to repository
|
* TODO move to repository
|
||||||
*
|
*
|
||||||
* Same as above but cleaner function with less dependencies.
|
* Same as above but cleaner function with less dependencies.
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function sumNetWorthByCurrency(Carbon $date): array;
|
public function sumNetWorthByCurrency(Carbon $date): array;
|
||||||
}
|
}
|
||||||
|
@@ -91,7 +91,7 @@ class IndexController extends Controller
|
|||||||
public function index(?Carbon $start = null, ?Carbon $end = null)
|
public function index(?Carbon $start = null, ?Carbon $end = null)
|
||||||
{
|
{
|
||||||
$this->abRepository->cleanup();
|
$this->abRepository->cleanup();
|
||||||
app('log')->debug(sprintf('Start of IndexController::index("%s", "%s")', $start?->format('Y-m-d'), $end?->format('Y-m-d')));
|
Log::debug(sprintf('Start of IndexController::index("%s", "%s")', $start?->format('Y-m-d'), $end?->format('Y-m-d')));
|
||||||
|
|
||||||
// collect some basic vars:
|
// collect some basic vars:
|
||||||
$range = app('navigation')->getViewRange(true);
|
$range = app('navigation')->getViewRange(true);
|
||||||
@@ -199,12 +199,12 @@ class IndexController extends Controller
|
|||||||
// get all budgets, and paginate them into $budgets.
|
// get all budgets, and paginate them into $budgets.
|
||||||
$collection = $this->repository->getActiveBudgets();
|
$collection = $this->repository->getActiveBudgets();
|
||||||
$budgets = [];
|
$budgets = [];
|
||||||
app('log')->debug(sprintf('7) Start is "%s", end is "%s"', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
|
Log::debug(sprintf('(getAllBudgets) Start is "%s", end is "%s"', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
|
||||||
|
|
||||||
// complement budget with budget limits in range, and expenses in currency X in range.
|
// complement budget with budget limits in range, and expenses in currency X in range.
|
||||||
/** @var Budget $current */
|
/** @var Budget $current */
|
||||||
foreach ($collection as $current) {
|
foreach ($collection as $current) {
|
||||||
app('log')->debug(sprintf('Working on budget #%d ("%s")', $current->id, $current->name));
|
Log::debug(sprintf('Working on budget #%d ("%s")', $current->id, $current->name));
|
||||||
$array = $current->toArray();
|
$array = $current->toArray();
|
||||||
$array['spent'] = [];
|
$array['spent'] = [];
|
||||||
$array['spent_total'] = [];
|
$array['spent_total'] = [];
|
||||||
@@ -215,7 +215,7 @@ class IndexController extends Controller
|
|||||||
|
|
||||||
/** @var BudgetLimit $limit */
|
/** @var BudgetLimit $limit */
|
||||||
foreach ($budgetLimits as $limit) {
|
foreach ($budgetLimits as $limit) {
|
||||||
app('log')->debug(sprintf('Working on budget limit #%d', $limit->id));
|
Log::debug(sprintf('Working on budget limit #%d', $limit->id));
|
||||||
$currency = $limit->transactionCurrency ?? $defaultCurrency;
|
$currency = $limit->transactionCurrency ?? $defaultCurrency;
|
||||||
$amount = app('steam')->bcround($limit->amount, $currency->decimal_places);
|
$amount = app('steam')->bcround($limit->amount, $currency->decimal_places);
|
||||||
$array['budgeted'][] = [
|
$array['budgeted'][] = [
|
||||||
@@ -231,9 +231,11 @@ class IndexController extends Controller
|
|||||||
'currency_name' => $currency->name,
|
'currency_name' => $currency->name,
|
||||||
'currency_decimal_places' => $currency->decimal_places,
|
'currency_decimal_places' => $currency->decimal_places,
|
||||||
];
|
];
|
||||||
app('log')->debug(sprintf('The amount budgeted for budget limit #%d is %s %s', $limit->id, $currency->code, $amount));
|
Log::debug(sprintf('The amount budgeted for budget limit #%d is %s %s', $limit->id, $currency->code, $amount));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #10463
|
||||||
|
|
||||||
/** @var TransactionCurrency $currency */
|
/** @var TransactionCurrency $currency */
|
||||||
foreach ($currencies as $currency) {
|
foreach ($currencies as $currency) {
|
||||||
$spentArr = $this->opsRepository->sumExpenses($start, $end, null, new Collection([$current]), $currency, false);
|
$spentArr = $this->opsRepository->sumExpenses($start, $end, null, new Collection([$current]), $currency, false);
|
||||||
@@ -260,6 +262,8 @@ class IndexController extends Controller
|
|||||||
|
|
||||||
/** @var array $budget */
|
/** @var array $budget */
|
||||||
foreach ($budgets as $budget) {
|
foreach ($budgets as $budget) {
|
||||||
|
Log::debug(sprintf('Now working on budget #%d ("%s")', $budget['id'], $budget['name']));
|
||||||
|
|
||||||
/** @var array $spent */
|
/** @var array $spent */
|
||||||
foreach ($budget['spent'] as $spent) {
|
foreach ($budget['spent'] as $spent) {
|
||||||
$currencyId = $spent['currency_id'];
|
$currencyId = $spent['currency_id'];
|
||||||
|
@@ -23,8 +23,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Http\Controllers;
|
namespace FireflyIII\Http\Controllers;
|
||||||
|
|
||||||
use function Safe\realpath;
|
|
||||||
use function Safe\ini_get;
|
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
@@ -38,6 +36,9 @@ use Illuminate\Support\Facades\Config;
|
|||||||
use Illuminate\Support\Facades\View;
|
use Illuminate\Support\Facades\View;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
|
use function Safe\realpath;
|
||||||
|
use function Safe\ini_get;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Controller.
|
* Class Controller.
|
||||||
*
|
*
|
||||||
|
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Http\Controllers\Json;
|
namespace FireflyIII\Http\Controllers\Json;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
use FireflyIII\Enums\TransactionTypeEnum;
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
@@ -46,9 +47,8 @@ class BoxController extends Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Deprecated method, no longer in use.
|
* Deprecated method, no longer in use.
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function available(): JsonResponse
|
public function available(): JsonResponse
|
||||||
{
|
{
|
||||||
return response()->json([]);
|
return response()->json([]);
|
||||||
|
@@ -107,7 +107,7 @@ class RecurrenceController extends Controller
|
|||||||
$repetitionMoment = str_ireplace('ndom,', '', $request->get('type'));
|
$repetitionMoment = str_ireplace('ndom,', '', $request->get('type'));
|
||||||
}
|
}
|
||||||
if ('yearly' === $repetitionType) {
|
if ('yearly' === $repetitionType) {
|
||||||
$repetitionMoment = explode(',', (string) $request->get('type'))[1] ?? '2018-01-01';
|
$repetitionMoment = explode(',', (string) $request->get('type'))[1] ?? '2025-01-01';
|
||||||
}
|
}
|
||||||
$actualStart->startOfDay();
|
$actualStart->startOfDay();
|
||||||
$repetition = new RecurrenceRepetition();
|
$repetition = new RecurrenceRepetition();
|
||||||
|
@@ -26,10 +26,12 @@ namespace FireflyIII\Http\Middleware;
|
|||||||
|
|
||||||
use Closure;
|
use Closure;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Exceptions\Handler;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Auth\AuthenticationException;
|
use Illuminate\Auth\AuthenticationException;
|
||||||
use Illuminate\Contracts\Auth\Factory as Auth;
|
use Illuminate\Contracts\Auth\Factory as Auth;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use League\OAuth2\Server\Exception\OAuthServerException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Authenticate
|
* Class Authenticate
|
||||||
@@ -84,6 +86,7 @@ class Authenticate
|
|||||||
if ($this->auth->check()) {
|
if ($this->auth->check()) {
|
||||||
// do an extra check on user object.
|
// do an extra check on user object.
|
||||||
/** @noinspection PhpUndefinedMethodInspection */
|
/** @noinspection PhpUndefinedMethodInspection */
|
||||||
|
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = $this->auth->authenticate();
|
$user = $this->auth->authenticate();
|
||||||
$this->validateBlockedUser($user, $guards);
|
$this->validateBlockedUser($user, $guards);
|
||||||
@@ -107,7 +110,14 @@ class Authenticate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new AuthenticationException('Unauthenticated.', $guards);
|
// this is a massive hack, but if the handler has the oauth exception
|
||||||
|
// at this point we can report its error instead of a generic one.
|
||||||
|
$message = 'Unauthenticated.';
|
||||||
|
if (Handler::$lastError instanceof OAuthServerException) {
|
||||||
|
$message = Handler::$lastError->getHint();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new AuthenticationException($message, $guards);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -41,8 +41,8 @@ class SelectTransactionsRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|date|after:1900-01-01|before:2099-12-31|before:end|required_with:end',
|
'start' => 'required|date|after:1970-01-02|before:2038-01-17|before:end|required_with:end',
|
||||||
'end' => 'required|date|after:1900-01-01|before:2099-12-31|after:start|required_with:start',
|
'end' => 'required|date|after:1970-01-02|before:2038-01-17|after:start|required_with:start',
|
||||||
'accounts' => 'required',
|
'accounts' => 'required',
|
||||||
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
|
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
|
||||||
];
|
];
|
||||||
|
@@ -74,7 +74,7 @@ class TagFormRequest extends FormRequest
|
|||||||
'tag' => $tagRule,
|
'tag' => $tagRule,
|
||||||
'id' => $idRule,
|
'id' => $idRule,
|
||||||
'description' => 'max:32768|min:1|nullable',
|
'description' => 'max:32768|min:1|nullable',
|
||||||
'date' => 'date|nullable|after:1984-09-17',
|
'date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
|
|
||||||
return Location::requestRules($rules);
|
return Location::requestRules($rules);
|
||||||
|
@@ -40,7 +40,7 @@ class Tag extends Model
|
|||||||
use ReturnsIntegerUserIdTrait;
|
use ReturnsIntegerUserIdTrait;
|
||||||
use SoftDeletes;
|
use SoftDeletes;
|
||||||
|
|
||||||
protected $fillable = ['user_id', 'user_group_id', 'tag', 'date', 'date_tz', 'description', 'tagMode'];
|
protected $fillable = ['user_id', 'user_group_id', 'tag', 'date', 'date_tz', 'description', 'tag_mode'];
|
||||||
|
|
||||||
protected $hidden = ['zoomLevel', 'latitude', 'longitude'];
|
protected $hidden = ['zoomLevel', 'latitude', 'longitude'];
|
||||||
|
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Repositories\Budget;
|
namespace FireflyIII\Repositories\Budget;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Models\AvailableBudget;
|
use FireflyIII\Models\AvailableBudget;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
@@ -205,9 +206,7 @@ class AvailableBudgetRepository implements AvailableBudgetRepositoryInterface, U
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget
|
public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget
|
||||||
{
|
{
|
||||||
/** @var null|AvailableBudget */
|
/** @var null|AvailableBudget */
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Repositories\Budget;
|
namespace FireflyIII\Repositories\Budget;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\AvailableBudget;
|
use FireflyIII\Models\AvailableBudget;
|
||||||
@@ -66,9 +67,7 @@ interface AvailableBudgetRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function get(?Carbon $start = null, ?Carbon $end = null): Collection;
|
public function get(?Carbon $start = null, ?Carbon $end = null): Collection;
|
||||||
|
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function getAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end): string;
|
public function getAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end): string;
|
||||||
|
|
||||||
public function getAvailableBudgetWithCurrency(Carbon $start, Carbon $end): array;
|
public function getAvailableBudgetWithCurrency(Carbon $start, Carbon $end): array;
|
||||||
@@ -90,9 +89,7 @@ interface AvailableBudgetRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function getByCurrencyDate(Carbon $start, Carbon $end, TransactionCurrency $currency): ?AvailableBudget;
|
public function getByCurrencyDate(Carbon $start, Carbon $end, TransactionCurrency $currency): ?AvailableBudget;
|
||||||
|
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget;
|
public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget;
|
||||||
|
|
||||||
public function store(array $data): ?AvailableBudget;
|
public function store(array $data): ?AvailableBudget;
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Repositories\Budget;
|
namespace FireflyIII\Repositories\Budget;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
@@ -44,9 +45,7 @@ use Illuminate\Support\Collection;
|
|||||||
*/
|
*/
|
||||||
interface NoBudgetRepositoryInterface
|
interface NoBudgetRepositoryInterface
|
||||||
{
|
{
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function getNoBudgetPeriodReport(Collection $accounts, Carbon $start, Carbon $end): array;
|
public function getNoBudgetPeriodReport(Collection $accounts, Carbon $start, Carbon $end): array;
|
||||||
|
|
||||||
public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null, ?TransactionCurrency $currency = null): array;
|
public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null, ?TransactionCurrency $currency = null): array;
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Repositories\Budget;
|
namespace FireflyIII\Repositories\Budget;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Enums\TransactionTypeEnum;
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
@@ -74,9 +75,8 @@ class OperationsRepository implements OperationsRepositoryInterface, UserGroupIn
|
|||||||
/**
|
/**
|
||||||
* This method is being used to generate the budget overview in the year/multi-year report. Its used
|
* This method is being used to generate the budget overview in the year/multi-year report. Its used
|
||||||
* in both the year/multi-year budget overview AND in the accompanying chart.
|
* in both the year/multi-year budget overview AND in the accompanying chart.
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function getBudgetPeriodReport(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array
|
public function getBudgetPeriodReport(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array
|
||||||
{
|
{
|
||||||
$carbonFormat = app('navigation')->preferredCarbonFormat($start, $end);
|
$carbonFormat = app('navigation')->preferredCarbonFormat($start, $end);
|
||||||
@@ -204,7 +204,7 @@ class OperationsRepository implements OperationsRepositoryInterface, UserGroupIn
|
|||||||
?TransactionCurrency $currency = null,
|
?TransactionCurrency $currency = null,
|
||||||
bool $convertToNative = false
|
bool $convertToNative = false
|
||||||
): array {
|
): array {
|
||||||
Log::debug(sprintf('Start of %s(date, date, array, array, "%s", "%s").', __METHOD__, $currency?->code, var_export($convertToNative, true)));
|
Log::debug(sprintf('Start of %s(date, date, array, array, "%s", %s).', __METHOD__, $currency?->code, var_export($convertToNative, true)));
|
||||||
// this collector excludes all transfers TO liabilities (which are also withdrawals)
|
// this collector excludes all transfers TO liabilities (which are also withdrawals)
|
||||||
// because those expenses only become expenses once they move from the liability to the friend.
|
// because those expenses only become expenses once they move from the liability to the friend.
|
||||||
// 2024-12-24 disable the exclusion for now.
|
// 2024-12-24 disable the exclusion for now.
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Repositories\Budget;
|
namespace FireflyIII\Repositories\Budget;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
@@ -51,9 +52,7 @@ interface OperationsRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function budgetedPerDay(Budget $budget): string;
|
public function budgetedPerDay(Budget $budget): string;
|
||||||
|
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function getBudgetPeriodReport(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array;
|
public function getBudgetPeriodReport(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -71,6 +70,7 @@ interface OperationsRepositoryInterface
|
|||||||
Carbon $end,
|
Carbon $end,
|
||||||
?Collection $accounts = null,
|
?Collection $accounts = null,
|
||||||
?Collection $budgets = null,
|
?Collection $budgets = null,
|
||||||
?TransactionCurrency $currency = null
|
?TransactionCurrency $currency = null,
|
||||||
|
bool $convertToNative = false
|
||||||
): array;
|
): array;
|
||||||
}
|
}
|
||||||
|
@@ -444,7 +444,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface, UserGroupInte
|
|||||||
{
|
{
|
||||||
$piggyBank->piggyBankEvents()->delete();
|
$piggyBank->piggyBankEvents()->delete();
|
||||||
foreach ($piggyBank->accounts as $account) {
|
foreach ($piggyBank->accounts as $account) {
|
||||||
if (0 !== bccomp('0', $account->pivot->current_amount)) {
|
if (0 !== bccomp('0', (string) $account->pivot->current_amount)) {
|
||||||
event(new ChangedAmount($piggyBank, $account->pivot->current_amount, null, null));
|
event(new ChangedAmount($piggyBank, $account->pivot->current_amount, null, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -440,10 +440,12 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface,
|
|||||||
|
|
||||||
/** @var TransactionJournal $journal */
|
/** @var TransactionJournal $journal */
|
||||||
foreach ($group->transactionJournals as $journal) {
|
foreach ($group->transactionJournals as $journal) {
|
||||||
|
$names = sprintf('%s%s', $names, $journal->date->format('Y-m-d-H:i:s'));
|
||||||
|
|
||||||
/** @var Transaction $transaction */
|
/** @var Transaction $transaction */
|
||||||
foreach ($journal->transactions as $transaction) {
|
foreach ($journal->transactions as $transaction) {
|
||||||
if (-1 === bccomp('0', (string)$transaction->amount)) {
|
if (-1 === bccomp('0', (string)$transaction->amount)) {
|
||||||
$sum = bcadd($sum, $transaction->amount);
|
$sum = bcadd($sum, (string) $transaction->amount);
|
||||||
$names = sprintf('%s%s', $names, $transaction->account->name);
|
$names = sprintf('%s%s', $names, $transaction->account->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Services\Internal\Support;
|
namespace FireflyIII\Services\Internal\Support;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||||
@@ -193,8 +194,8 @@ trait AccountServiceTrait
|
|||||||
/**
|
/**
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
* *
|
* *
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
protected function createOBGroup(Account $account, array $data): TransactionGroup
|
protected function createOBGroup(Account $account, array $data): TransactionGroup
|
||||||
{
|
{
|
||||||
app('log')->debug('Now going to create an OB group.');
|
app('log')->debug('Now going to create an OB group.');
|
||||||
|
@@ -825,7 +825,13 @@ class JournalUpdateService
|
|||||||
public function isCompareHashChanged(): bool
|
public function isCompareHashChanged(): bool
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('Now in %s', __METHOD__));
|
Log::debug(sprintf('Now in %s', __METHOD__));
|
||||||
$compareHash = $this->transactionGroupRepository->getCompareHash($this->transactionGroup);
|
$compareHash = hash('sha256', sprintf('%s', Carbon::now()->getTimestamp()));
|
||||||
|
if (!$this->transactionGroup instanceof TransactionGroup) {
|
||||||
|
$compareHash = $this->transactionGroupRepository->getCompareHash($this->transactionJournal->transactionGroup);
|
||||||
|
}
|
||||||
|
if ($this->transactionGroup instanceof TransactionGroup) {
|
||||||
|
$this->transactionGroupRepository->getCompareHash($this->transactionGroup);
|
||||||
|
}
|
||||||
Log::debug(sprintf('Compare hash is "%s".', $compareHash));
|
Log::debug(sprintf('Compare hash is "%s".', $compareHash));
|
||||||
Log::debug(sprintf('Start compare hash is "%s".', $this->startCompareHash));
|
Log::debug(sprintf('Start compare hash is "%s".', $this->startCompareHash));
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Support;
|
namespace FireflyIII\Support;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Transaction;
|
use FireflyIII\Models\Transaction;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
@@ -195,25 +196,19 @@ class Amount
|
|||||||
return $user->currencies()->orderBy('code', 'ASC')->get();
|
return $user->currencies()->orderBy('code', 'ASC')->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function getDefaultCurrency(): TransactionCurrency
|
public function getDefaultCurrency(): TransactionCurrency
|
||||||
{
|
{
|
||||||
return $this->getNativeCurrency();
|
return $this->getNativeCurrency();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
#[Deprecated(message: 'use getDefaultCurrencyByUserGroup instead')]
|
||||||
* @deprecated use getDefaultCurrencyByUserGroup instead
|
|
||||||
*/
|
|
||||||
public function getDefaultCurrencyByUser(User $user): TransactionCurrency
|
public function getDefaultCurrencyByUser(User $user): TransactionCurrency
|
||||||
{
|
{
|
||||||
return $this->getDefaultCurrencyByUserGroup($user->userGroup);
|
return $this->getDefaultCurrencyByUserGroup($user->userGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
#[Deprecated]
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function getDefaultCurrencyByUserGroup(UserGroup $userGroup): TransactionCurrency
|
public function getDefaultCurrencyByUserGroup(UserGroup $userGroup): TransactionCurrency
|
||||||
{
|
{
|
||||||
return $this->getNativeCurrencyByUserGroup($userGroup);
|
return $this->getNativeCurrencyByUserGroup($userGroup);
|
||||||
|
@@ -25,6 +25,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Support\Authentication;
|
namespace FireflyIII\Support\Authentication;
|
||||||
|
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Support\Facades\Preferences;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\Auth\Authenticatable;
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
use Illuminate\Contracts\Auth\Guard;
|
use Illuminate\Contracts\Auth\Guard;
|
||||||
@@ -86,14 +87,14 @@ class RemoteUserGuard implements Guard
|
|||||||
|
|
||||||
if (null !== $header) {
|
if (null !== $header) {
|
||||||
$emailAddress = (string) (request()->server($header) ?? apache_request_headers()[$header] ?? null);
|
$emailAddress = (string) (request()->server($header) ?? apache_request_headers()[$header] ?? null);
|
||||||
$preference = app('preferences')->getForUser($retrievedUser, 'remote_guard_alt_email');
|
$preference = Preferences::getForUser($retrievedUser, 'remote_guard_alt_email');
|
||||||
|
|
||||||
if ('' !== $emailAddress && null === $preference && $emailAddress !== $userID) {
|
if ('' !== $emailAddress && null === $preference && $emailAddress !== $userID) {
|
||||||
app('preferences')->setForUser($retrievedUser, 'remote_guard_alt_email', $emailAddress);
|
Preferences::setForUser($retrievedUser, 'remote_guard_alt_email', $emailAddress);
|
||||||
}
|
}
|
||||||
// if the pref isn't null and the object returned isn't null, update the email address.
|
// if the pref isn't null and the object returned isn't null, update the email address.
|
||||||
if ('' !== $emailAddress && null !== $preference && $emailAddress !== $preference->data) {
|
if ('' !== $emailAddress && null !== $preference && $emailAddress !== $preference->data) {
|
||||||
app('preferences')->setForUser($retrievedUser, 'remote_guard_alt_email', $emailAddress);
|
Preferences::setForUser($retrievedUser, 'remote_guard_alt_email', $emailAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@ namespace FireflyIII\Support\Cronjobs;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Jobs\CreateAutoBudgetLimits;
|
use FireflyIII\Jobs\CreateAutoBudgetLimits;
|
||||||
use FireflyIII\Models\Configuration;
|
use FireflyIII\Models\Configuration;
|
||||||
|
use FireflyIII\Support\Facades\FireflyConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class AutoBudgetCronjob
|
* Class AutoBudgetCronjob
|
||||||
@@ -36,7 +37,7 @@ class AutoBudgetCronjob extends AbstractCronjob
|
|||||||
public function fire(): void
|
public function fire(): void
|
||||||
{
|
{
|
||||||
/** @var Configuration $config */
|
/** @var Configuration $config */
|
||||||
$config = app('fireflyconfig')->get('last_ab_job', 0);
|
$config = FireflyConfig::get('last_ab_job', 0);
|
||||||
$lastTime = (int) $config->data;
|
$lastTime = (int) $config->data;
|
||||||
$diff = Carbon::now()->getTimestamp() - $lastTime;
|
$diff = Carbon::now()->getTimestamp() - $lastTime;
|
||||||
$diffForHumans = today(config('app.timezone'))->diffForHumans(Carbon::createFromTimestamp($lastTime), null, true);
|
$diffForHumans = today(config('app.timezone'))->diffForHumans(Carbon::createFromTimestamp($lastTime), null, true);
|
||||||
@@ -78,7 +79,7 @@ class AutoBudgetCronjob extends AbstractCronjob
|
|||||||
$this->jobSucceeded = true;
|
$this->jobSucceeded = true;
|
||||||
$this->message = 'Auto-budget cron job fired successfully.';
|
$this->message = 'Auto-budget cron job fired successfully.';
|
||||||
|
|
||||||
app('fireflyconfig')->set('last_ab_job', (int) $this->date->format('U'));
|
FireflyConfig::set('last_ab_job', (int) $this->date->format('U'));
|
||||||
app('log')->info('Done with auto budget cron job task.');
|
app('log')->info('Done with auto budget cron job task.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -50,9 +50,9 @@ class CurrencyForm
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws FireflyException
|
|
||||||
*
|
|
||||||
* @phpstan-param view-string $view
|
* @phpstan-param view-string $view
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
protected function currencyField(string $name, string $view, mixed $value = null, ?array $options = null): string
|
protected function currencyField(string $name, string $view, mixed $value = null, ?array $options = null): string
|
||||||
{
|
{
|
||||||
|
@@ -106,7 +106,7 @@ trait AugumentData
|
|||||||
{
|
{
|
||||||
/** @var AccountRepositoryInterface $repository */
|
/** @var AccountRepositoryInterface $repository */
|
||||||
$repository = app(AccountRepositoryInterface::class);
|
$repository = app(AccountRepositoryInterface::class);
|
||||||
$accounts = $repository->getAccountsByType([AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::CASH->value]);
|
$accounts = $repository->getAccountsByType([AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::CASH->value]);
|
||||||
$grouped = $accounts->groupBy('id')->toArray();
|
$grouped = $accounts->groupBy('id')->toArray();
|
||||||
$return = [];
|
$return = [];
|
||||||
foreach ($accountIds as $combinedId) {
|
foreach ($accountIds as $combinedId) {
|
||||||
|
@@ -70,7 +70,7 @@ trait PeriodOverview
|
|||||||
protected JournalRepositoryInterface $journalRepos;
|
protected JournalRepositoryInterface $journalRepos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns "period entries", so nov-2015, dec-2015, etc etc (this depends on the users session range)
|
* This method returns "period entries", so nov-2015, dec-2015, etc. (this depends on the users session range)
|
||||||
* and for each period, the amount of money spent and earned. This is a complex operation which is cached for
|
* and for each period, the amount of money spent and earned. This is a complex operation which is cached for
|
||||||
* performance reasons.
|
* performance reasons.
|
||||||
*
|
*
|
||||||
@@ -97,18 +97,26 @@ trait PeriodOverview
|
|||||||
/** @var array $dates */
|
/** @var array $dates */
|
||||||
$dates = app('navigation')->blockPeriods($start, $end, $range);
|
$dates = app('navigation')->blockPeriods($start, $end, $range);
|
||||||
$entries = [];
|
$entries = [];
|
||||||
|
$spent = [];
|
||||||
|
$earned = [];
|
||||||
|
$transferredAway = [];
|
||||||
|
$transferredIn = [];
|
||||||
|
|
||||||
// run a custom query because doing this with the collector is MEGA slow.
|
// run a custom query because doing this with the collector is MEGA slow.
|
||||||
$transactions = $this->accountRepository->periodCollection($account, $start, $end);
|
$transactions = $this->accountRepository->periodCollection($account, $start, $end);
|
||||||
|
|
||||||
// loop dates
|
// loop dates
|
||||||
Log::debug(sprintf('Count of loops: %d', count($dates)));
|
Log::debug(sprintf('Count of loops: %d', count($dates)));
|
||||||
|
$loops = 0;
|
||||||
|
// stop after 10 loops for memory reasons.
|
||||||
foreach ($dates as $currentDate) {
|
foreach ($dates as $currentDate) {
|
||||||
$title = app('navigation')->periodShow($currentDate['start'], $currentDate['period']);
|
$title = app('navigation')->periodShow($currentDate['start'], $currentDate['period']);
|
||||||
|
if ($loops < 10) {
|
||||||
[$transactions, $spent] = $this->filterTransactionsByType(TransactionTypeEnum::WITHDRAWAL, $transactions, $currentDate['start'], $currentDate['end']);
|
[$transactions, $spent] = $this->filterTransactionsByType(TransactionTypeEnum::WITHDRAWAL, $transactions, $currentDate['start'], $currentDate['end']);
|
||||||
[$transactions, $earned] = $this->filterTransactionsByType(TransactionTypeEnum::DEPOSIT, $transactions, $currentDate['start'], $currentDate['end']);
|
[$transactions, $earned] = $this->filterTransactionsByType(TransactionTypeEnum::DEPOSIT, $transactions, $currentDate['start'], $currentDate['end']);
|
||||||
[$transactions, $transferredAway] = $this->filterTransfers('away', $transactions, $currentDate['start'], $currentDate['end']);
|
[$transactions, $transferredAway] = $this->filterTransfers('away', $transactions, $currentDate['start'], $currentDate['end']);
|
||||||
[$transactions, $transferredIn] = $this->filterTransfers('in', $transactions, $currentDate['start'], $currentDate['end']);
|
[$transactions, $transferredIn] = $this->filterTransfers('in', $transactions, $currentDate['start'], $currentDate['end']);
|
||||||
|
}
|
||||||
$entries[]
|
$entries[]
|
||||||
= [
|
= [
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
@@ -119,6 +127,7 @@ trait PeriodOverview
|
|||||||
'transferred_away' => $this->groupByCurrency($transferredAway),
|
'transferred_away' => $this->groupByCurrency($transferredAway),
|
||||||
'transferred_in' => $this->groupByCurrency($transferredIn),
|
'transferred_in' => $this->groupByCurrency($transferredIn),
|
||||||
];
|
];
|
||||||
|
++$loops;
|
||||||
}
|
}
|
||||||
$cache->store($entries);
|
$cache->store($entries);
|
||||||
Timer::stop('account-period-total');
|
Timer::stop('account-period-total');
|
||||||
@@ -548,18 +557,19 @@ trait PeriodOverview
|
|||||||
/** @var array $dates */
|
/** @var array $dates */
|
||||||
$dates = app('navigation')->blockPeriods($start, $end, $range);
|
$dates = app('navigation')->blockPeriods($start, $end, $range);
|
||||||
$entries = [];
|
$entries = [];
|
||||||
|
$spent = [];
|
||||||
|
$earned = [];
|
||||||
|
$transferred = [];
|
||||||
// collect all journals in this period (regardless of type)
|
// collect all journals in this period (regardless of type)
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes($types)->setRange($start, $end);
|
$collector->setTypes($types)->setRange($start, $end);
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
$loops = 0;
|
||||||
|
|
||||||
foreach ($dates as $currentDate) {
|
foreach ($dates as $currentDate) {
|
||||||
$spent = [];
|
|
||||||
$earned = [];
|
|
||||||
$transferred = [];
|
|
||||||
$title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']);
|
$title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']);
|
||||||
|
|
||||||
|
if ($loops < 10) {
|
||||||
// set to correct array
|
// set to correct array
|
||||||
if ('expenses' === $transactionType || 'withdrawal' === $transactionType) {
|
if ('expenses' === $transactionType || 'withdrawal' === $transactionType) {
|
||||||
$spent = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']);
|
$spent = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']);
|
||||||
@@ -570,6 +580,7 @@ trait PeriodOverview
|
|||||||
if ('transfer' === $transactionType || 'transfers' === $transactionType) {
|
if ('transfer' === $transactionType || 'transfers' === $transactionType) {
|
||||||
$transferred = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']);
|
$transferred = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$entries[]
|
$entries[]
|
||||||
= [
|
= [
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
@@ -579,6 +590,7 @@ trait PeriodOverview
|
|||||||
'earned' => $this->groupByCurrency($earned),
|
'earned' => $this->groupByCurrency($earned),
|
||||||
'transferred' => $this->groupByCurrency($transferred),
|
'transferred' => $this->groupByCurrency($transferred),
|
||||||
];
|
];
|
||||||
|
++$loops;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $entries;
|
return $entries;
|
||||||
|
@@ -34,7 +34,7 @@ use Illuminate\Contracts\Validation\Validator as ValidatorContract;
|
|||||||
use Illuminate\Routing\Route;
|
use Illuminate\Routing\Route;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
use Illuminate\Support\Facades\Route as RouteFacade;
|
use Illuminate\Support\Facades\Route as RouteFacade;
|
||||||
use Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
|
||||||
use function Safe\parse_url;
|
use function Safe\parse_url;
|
||||||
|
|
||||||
|
@@ -54,7 +54,7 @@ class TransactionGroupEnrichment implements EnrichmentInterface
|
|||||||
private array $notes; // @phpstan-ignore-line
|
private array $notes; // @phpstan-ignore-line
|
||||||
private array $tags;
|
private array $tags;
|
||||||
private User $user;
|
private User $user;
|
||||||
private TransactionCurrency $nativeCurrency;
|
private readonly TransactionCurrency $nativeCurrency;
|
||||||
private UserGroup $userGroup;
|
private UserGroup $userGroup;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
|
@@ -582,7 +582,7 @@ class Navigation
|
|||||||
*/
|
*/
|
||||||
public function preferredEndOfPeriod(Carbon $start, Carbon $end): string
|
public function preferredEndOfPeriod(Carbon $start, Carbon $end): string
|
||||||
{
|
{
|
||||||
if ((int) $start->diffInMonths($end, true) > 1) {
|
if ((int) $start->diffInMonths($end, true) > 1 && (int) $start->diffInMonths($end, true) <= 12) {
|
||||||
return 'endOfMonth';
|
return 'endOfMonth';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -599,7 +599,7 @@ class Navigation
|
|||||||
*/
|
*/
|
||||||
public function preferredRangeFormat(Carbon $start, Carbon $end): string
|
public function preferredRangeFormat(Carbon $start, Carbon $end): string
|
||||||
{
|
{
|
||||||
if ((int) $start->diffInMonths($end, true) > 1) {
|
if ((int) $start->diffInMonths($end, true) > 1 && (int) $start->diffInMonths($end, true) <= 12) {
|
||||||
return '1M';
|
return '1M';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -616,7 +616,7 @@ class Navigation
|
|||||||
*/
|
*/
|
||||||
public function preferredSqlFormat(Carbon $start, Carbon $end): string
|
public function preferredSqlFormat(Carbon $start, Carbon $end): string
|
||||||
{
|
{
|
||||||
if ((int) $start->diffInMonths($end, true) > 1) {
|
if ((int) $start->diffInMonths($end, true) > 1 && (int) $start->diffInMonths($end, true) <= 12) {
|
||||||
return '%Y-%m';
|
return '%Y-%m';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -51,7 +51,7 @@ class TransactionSummarizer
|
|||||||
|
|
||||||
public function groupByCurrencyId(array $journals, string $method = 'negative', bool $includeForeign = true): array
|
public function groupByCurrencyId(array $journals, string $method = 'negative', bool $includeForeign = true): array
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('Now in groupByCurrencyId([%d journals], "%s")', count($journals), $method));
|
Log::debug(sprintf('Now in groupByCurrencyId([%d journals], "%s", %s)', count($journals), $method, var_export($includeForeign, true)));
|
||||||
$array = [];
|
$array = [];
|
||||||
foreach ($journals as $journal) {
|
foreach ($journals as $journal) {
|
||||||
$field = 'amount';
|
$field = 'amount';
|
||||||
@@ -71,12 +71,12 @@ class TransactionSummarizer
|
|||||||
$foreignCurrencyDecimalPlaces = null;
|
$foreignCurrencyDecimalPlaces = null;
|
||||||
|
|
||||||
if ($this->convertToNative) {
|
if ($this->convertToNative) {
|
||||||
Log::debug('convertToNative is true.');
|
// Log::debug('convertToNative is true.');
|
||||||
// if convert to native, use the native amount yes or no?
|
// if convert to native, use the native amount yes or no?
|
||||||
$useNative = $this->default->id !== (int) $journal['currency_id'];
|
$useNative = $this->default->id !== (int) $journal['currency_id'];
|
||||||
$useForeign = $this->default->id === (int) $journal['foreign_currency_id'];
|
$useForeign = $this->default->id === (int) $journal['foreign_currency_id'];
|
||||||
if ($useNative) {
|
if ($useNative) {
|
||||||
Log::debug(sprintf('Journal #%d switches to native amount (original is %s)', $journal['transaction_journal_id'], $journal['currency_code']));
|
// Log::debug(sprintf('Journal #%d switches to native amount (original is %s)', $journal['transaction_journal_id'], $journal['currency_code']));
|
||||||
$field = 'native_amount';
|
$field = 'native_amount';
|
||||||
$currencyId = $this->default->id;
|
$currencyId = $this->default->id;
|
||||||
$currencyName = $this->default->name;
|
$currencyName = $this->default->name;
|
||||||
@@ -85,7 +85,7 @@ class TransactionSummarizer
|
|||||||
$currencyDecimalPlaces = $this->default->decimal_places;
|
$currencyDecimalPlaces = $this->default->decimal_places;
|
||||||
}
|
}
|
||||||
if ($useForeign) {
|
if ($useForeign) {
|
||||||
Log::debug(sprintf('Journal #%d switches to foreign amount (foreign is %s)', $journal['transaction_journal_id'], $journal['foreign_currency_code']));
|
// Log::debug(sprintf('Journal #%d switches to foreign amount (foreign is %s)', $journal['transaction_journal_id'], $journal['foreign_currency_code']));
|
||||||
$field = 'foreign_amount';
|
$field = 'foreign_amount';
|
||||||
$currencyId = (int) $journal['foreign_currency_id'];
|
$currencyId = (int) $journal['foreign_currency_id'];
|
||||||
$currencyName = $journal['foreign_currency_name'];
|
$currencyName = $journal['foreign_currency_name'];
|
||||||
@@ -95,7 +95,7 @@ class TransactionSummarizer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!$this->convertToNative) {
|
if (!$this->convertToNative) {
|
||||||
Log::debug('convertToNative is false.');
|
// Log::debug('convertToNative is false.');
|
||||||
// use foreign amount?
|
// use foreign amount?
|
||||||
$foreignCurrencyId = (int) $journal['foreign_currency_id'];
|
$foreignCurrencyId = (int) $journal['foreign_currency_id'];
|
||||||
if (0 !== $foreignCurrencyId) {
|
if (0 !== $foreignCurrencyId) {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -342,7 +342,7 @@ class Steam
|
|||||||
|
|
||||||
return $cache->get();
|
return $cache->get();
|
||||||
}
|
}
|
||||||
Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s')));
|
// Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s')));
|
||||||
if (null === $convertToNative) {
|
if (null === $convertToNative) {
|
||||||
$convertToNative = Amount::convertToNative($account->user);
|
$convertToNative = Amount::convertToNative($account->user);
|
||||||
}
|
}
|
||||||
@@ -401,7 +401,7 @@ class Steam
|
|||||||
// Log::debug(sprintf('Virtual balance makes the (native) total %s', $return['balance']));
|
// Log::debug(sprintf('Virtual balance makes the (native) total %s', $return['balance']));
|
||||||
}
|
}
|
||||||
$final = array_merge($return, $others);
|
$final = array_merge($return, $others);
|
||||||
Log::debug('Final balance is', $final);
|
// Log::debug('Final balance is', $final);
|
||||||
$cache->store($final);
|
$cache->store($final);
|
||||||
|
|
||||||
return $final;
|
return $final;
|
||||||
|
@@ -28,6 +28,7 @@ use FireflyIII\Models\RuleAction;
|
|||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\TransactionRules\Traits\RefreshNotesTrait;
|
use FireflyIII\TransactionRules\Traits\RefreshNotesTrait;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class SetDescription.
|
* Class SetDescription.
|
||||||
@@ -51,7 +52,12 @@ class SetDescription implements ActionInterface
|
|||||||
$after = $this->action->getValue($journal);
|
$after = $this->action->getValue($journal);
|
||||||
|
|
||||||
// replace newlines.
|
// replace newlines.
|
||||||
$after = str_replace(["\r", "\n", "\t", "\036", "\025"], '', $after);
|
$after = trim(str_replace(["\r", "\n", "\t", "\036", "\025"], '', $after));
|
||||||
|
|
||||||
|
if ('' === $after) {
|
||||||
|
Log::warning('Action resulted in an empty description, reset to default value.');
|
||||||
|
$after = '(no description)';
|
||||||
|
}
|
||||||
|
|
||||||
DB::table('transaction_journals')
|
DB::table('transaction_journals')
|
||||||
->where('id', '=', $journal['transaction_journal_id'])
|
->where('id', '=', $journal['transaction_journal_id'])
|
||||||
|
19
app/User.php
19
app/User.php
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII;
|
namespace FireflyIII;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Events\RequestedNewPassword;
|
use FireflyIII\Events\RequestedNewPassword;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
@@ -188,9 +189,8 @@ class User extends Authenticatable
|
|||||||
* Get the models LDAP domain.
|
* Get the models LDAP domain.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function getLdapDomain()
|
public function getLdapDomain()
|
||||||
{
|
{
|
||||||
return $this->{$this->getLdapDomainColumn()};
|
return $this->{$this->getLdapDomainColumn()};
|
||||||
@@ -200,9 +200,8 @@ class User extends Authenticatable
|
|||||||
* Get the database column name of the domain.
|
* Get the database column name of the domain.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function getLdapDomainColumn()
|
public function getLdapDomainColumn()
|
||||||
{
|
{
|
||||||
return 'domain';
|
return 'domain';
|
||||||
@@ -212,9 +211,8 @@ class User extends Authenticatable
|
|||||||
* Get the models LDAP GUID.
|
* Get the models LDAP GUID.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function getLdapGuid()
|
public function getLdapGuid()
|
||||||
{
|
{
|
||||||
return $this->{$this->getLdapGuidColumn()};
|
return $this->{$this->getLdapGuidColumn()};
|
||||||
@@ -224,9 +222,8 @@ class User extends Authenticatable
|
|||||||
* Get the models LDAP GUID database column name.
|
* Get the models LDAP GUID database column name.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function getLdapGuidColumn()
|
public function getLdapGuidColumn()
|
||||||
{
|
{
|
||||||
return 'objectguid';
|
return 'objectguid';
|
||||||
@@ -468,9 +465,8 @@ class User extends Authenticatable
|
|||||||
* Set the models LDAP domain.
|
* Set the models LDAP domain.
|
||||||
*
|
*
|
||||||
* @param string $domain
|
* @param string $domain
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function setLdapDomain($domain): void
|
public function setLdapDomain($domain): void
|
||||||
{
|
{
|
||||||
$this->{$this->getLdapDomainColumn()} = $domain;
|
$this->{$this->getLdapDomainColumn()} = $domain;
|
||||||
@@ -480,9 +476,8 @@ class User extends Authenticatable
|
|||||||
* Set the models LDAP GUID.
|
* Set the models LDAP GUID.
|
||||||
*
|
*
|
||||||
* @param string $guid
|
* @param string $guid
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function setLdapGuid($guid): void
|
public function setLdapGuid($guid): void
|
||||||
{
|
{
|
||||||
$this->{$this->getLdapGuidColumn()} = $guid;
|
$this->{$this->getLdapGuidColumn()} = $guid;
|
||||||
|
45
changelog.md
45
changelog.md
@@ -3,6 +3,51 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## 6.2.20 - 2025-07-02
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- New query parser is now the default.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 10517](https://github.com/firefly-iii/firefly-iii/issues/10517) (401 when trying to create personal access token with Remote user authentication) reported by @MaxPelly
|
||||||
|
- [Discussion 10530](https://github.com/orgs/firefly-iii/discussions/10530) (Find and delete transactions with empty descriptions) started by @umfk
|
||||||
|
- [Issue 10535](https://github.com/firefly-iii/firefly-iii/issues/10535) (Internal Firefly III Exception: Undefined array key "currency") reported by @MaelFr
|
||||||
|
|
||||||
|
## 6.2.19 - 2025-06-29
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Currency seeder adds "CNY" again, because it turns out "RMB" is not the official, ISO 4217 code for the Chinese Yuan.
|
||||||
|
- The "period overview" next to the transaction lists (withdrawals, deposits and transfers) is limited to 10 entries because it uses a lot of memory. I still have to fix this.
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Support for ntfy, since the underlying library is no longer maintained. Will be replaced in the future.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Running balance calculation also triggers on edit.
|
||||||
|
- [Issue 10489](https://github.com/firefly-iii/firefly-iii/issues/10489) (Cannot create personal access token if using remote guard auth in latest version) reported by @Palomox
|
||||||
|
- [Issue 10493](https://github.com/firefly-iii/firefly-iii/issues/10493) (Reports First Graph Wrong) reported by @nicolopozzato
|
||||||
|
- [Issue 10499](https://github.com/firefly-iii/firefly-iii/issues/10499) (Password change results in error 500 (Class "Hash" not found)) reported by @willermo
|
||||||
|
- [Issue 10507](https://github.com/firefly-iii/firefly-iii/issues/10507) (Opening balance transactions includes in `has_no_category` filter) reported by @lompi
|
||||||
|
- [Issue 10510](https://github.com/firefly-iii/firefly-iii/issues/10510) (Liability accounts show as 'no name' on budget transaction report pie chart.) reported by @slackspace-io
|
||||||
|
|
||||||
|
## 6.2.18 - 2025-06-20
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Give more details about OAuth errors.
|
||||||
|
- Currency seeder adds "RMB" instead of "CNY" for Chinese Yuan.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 10454](https://github.com/firefly-iii/firefly-iii/issues/10454) (Bulk edit individually give an error) reported by @Rick45
|
||||||
|
- [Issue 10470](https://github.com/firefly-iii/firefly-iii/issues/10470) (API endpoint `/api/v1/chart/account/overview` throws error) reported by @dreautall
|
||||||
|
- Remove some leftover debug info
|
||||||
|
|
||||||
## 6.2.17 - 2025-06-12
|
## 6.2.17 - 2025-06-12
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
391
composer.lock
generated
391
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -78,7 +78,8 @@ return [
|
|||||||
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
||||||
// see cer.php for exchange rates feature flag.
|
// see cer.php for exchange rates feature flag.
|
||||||
],
|
],
|
||||||
'version' => '6.2.17',
|
'version' => 'develop/2025-07-14',
|
||||||
|
'build_time' => 1752464049,
|
||||||
'api_version' => '2.1.0', // field is no longer used.
|
'api_version' => '2.1.0', // field is no longer used.
|
||||||
'db_version' => 25,
|
'db_version' => 25,
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@ return [
|
|||||||
'channels' => [
|
'channels' => [
|
||||||
'email' => ['enabled' => true, 'ui_configurable' => 0],
|
'email' => ['enabled' => true, 'ui_configurable' => 0],
|
||||||
'slack' => ['enabled' => true, 'ui_configurable' => 1],
|
'slack' => ['enabled' => true, 'ui_configurable' => 1],
|
||||||
'ntfy' => ['enabled' => false, 'ui_configurable' => 1],
|
// 'ntfy' => ['enabled' => false, 'ui_configurable' => 1],
|
||||||
'pushover' => ['enabled' => true, 'ui_configurable' => 1],
|
'pushover' => ['enabled' => true, 'ui_configurable' => 1],
|
||||||
// 'gotify' => ['enabled' => false, 'ui_configurable' => 0],
|
// 'gotify' => ['enabled' => false, 'ui_configurable' => 0],
|
||||||
// 'pushbullet' => ['enabled' => false, 'ui_configurable' => 0],
|
// 'pushbullet' => ['enabled' => false, 'ui_configurable' => 0],
|
||||||
|
@@ -260,8 +260,6 @@ return [
|
|||||||
'destination_balance_lt' => ['alias' => false, 'needs_context' => true],
|
'destination_balance_lt' => ['alias' => false, 'needs_context' => true],
|
||||||
'destination_balance_is' => ['alias' => false, 'needs_context' => true],
|
'destination_balance_is' => ['alias' => false, 'needs_context' => true],
|
||||||
],
|
],
|
||||||
/**
|
// Which query parser to use - 'new' or 'legacy'
|
||||||
* Which query parser to use - 'new' or 'legacy'
|
|
||||||
*/
|
|
||||||
'query_parser' => env('QUERY_PARSER_IMPLEMENTATION', 'legacy'),
|
'query_parser' => env('QUERY_PARSER_IMPLEMENTATION', 'legacy'),
|
||||||
];
|
];
|
||||||
|
47
database/migrations/2025_07_10_065736_rename_tag_mode.php
Normal file
47
database/migrations/2025_07_10_065736_rename_tag_mode.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration {
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// normal case
|
||||||
|
Schema::table('tags', static function (Blueprint $table): void {
|
||||||
|
if (Schema::hasColumn('tags', 'tagMode') && !Schema::hasColumn('piggy_banks', 'tag_mode')) {
|
||||||
|
$table->renameColumn('tagMode', 'tag_mode');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// lower case just in case (haha)
|
||||||
|
Schema::table('tags', static function (Blueprint $table): void {
|
||||||
|
if (Schema::hasColumn('tags', 'tagmode') && !Schema::hasColumn('piggy_banks', 'tag_mode')) {
|
||||||
|
$table->renameColumn('tagmode', 'tag_mode');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (RuntimeException $e) {
|
||||||
|
Log::error(sprintf('Could not rename column: %s', $e->getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Schema::table('tags', static function (Blueprint $table): void {
|
||||||
|
if (Schema::hasColumn('tags', 'tag_mode') && !Schema::hasColumn('piggy_banks', 'tagMode')) {
|
||||||
|
$table->renameColumn('tag_mode', 'tagMode');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (RuntimeException $e) {
|
||||||
|
Log::error(sprintf('Could not rename column: %s', $e->getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
@@ -67,6 +67,7 @@ class TransactionCurrencySeeder extends Seeder
|
|||||||
// asian currencies
|
// asian currencies
|
||||||
$currencies[] = ['code' => 'JPY', 'name' => 'Japanese yen', 'symbol' => '¥', 'decimal_places' => 0];
|
$currencies[] = ['code' => 'JPY', 'name' => 'Japanese yen', 'symbol' => '¥', 'decimal_places' => 0];
|
||||||
$currencies[] = ['code' => 'CNY', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2];
|
$currencies[] = ['code' => 'CNY', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2];
|
||||||
|
// $currencies[] = ['code' => 'RMB', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2];
|
||||||
$currencies[] = ['code' => 'RUB', 'name' => 'Russian ruble', 'symbol' => '₽', 'decimal_places' => 2];
|
$currencies[] = ['code' => 'RUB', 'name' => 'Russian ruble', 'symbol' => '₽', 'decimal_places' => 2];
|
||||||
$currencies[] = ['code' => 'INR', 'name' => 'Indian rupee', 'symbol' => '₹', 'decimal_places' => 2];
|
$currencies[] = ['code' => 'INR', 'name' => 'Indian rupee', 'symbol' => '₹', 'decimal_places' => 2];
|
||||||
|
|
||||||
|
1088
package-lock.json
generated
1088
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"firefly": {
|
"firefly": {
|
||||||
"administrations_page_title": "Financial administrations",
|
"administrations_page_title": "Administracions financeres",
|
||||||
"administrations_index_menu": "Financial administrations",
|
"administrations_index_menu": "Administracions financeres",
|
||||||
"expires_at": "Expires at",
|
"expires_at": "Caduca a les",
|
||||||
"temp_administrations_introduction": "Firefly III will soon get the ability to manage multiple financial administrations. Right now, you only have the one. You can set the title of this administration and its native currency. This replaces the previous setting where you would set your \"default currency\". This setting is now tied to the financial administration and can be different per administration.",
|
"temp_administrations_introduction": "Firefly III aviat podr\u00e0 gestionar diverses administracions financeres. Ara mateix, nom\u00e9s en teniu una. Podeu definir el t\u00edtol d'aquesta administraci\u00f3 i la seva moneda nativa. Aix\u00f2 substitueix la configuraci\u00f3 anterior on definiu la vostra \"moneda predeterminada\". Aquesta configuraci\u00f3 ara est\u00e0 vinculada a l'administraci\u00f3 financera i pot ser diferent per a cada administraci\u00f3.",
|
||||||
"administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.",
|
"administration_currency_form_help": "La p\u00e0gina pot trigar molt a carregar-se si canvieu la moneda nativa, ja que pot ser que la transacci\u00f3 s'hagi de convertir a la vostra (nova) moneda nativa.",
|
||||||
"administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"",
|
"administrations_page_edit_sub_title_js": "Edita l'administraci\u00f3 financera \"{title}\"",
|
||||||
"table": "Taula",
|
"table": "Taula",
|
||||||
"welcome_back": "Qu\u00e8 est\u00e0 passant?",
|
"welcome_back": "Qu\u00e8 est\u00e0 passant?",
|
||||||
"flash_error": "Error!",
|
"flash_error": "Error!",
|
||||||
@@ -16,11 +16,11 @@
|
|||||||
"select_source_account": "Per favor, selecciona o escriu un nom de compte d'origen v\u00e0lid",
|
"select_source_account": "Per favor, selecciona o escriu un nom de compte d'origen v\u00e0lid",
|
||||||
"split_transaction_title": "Descripci\u00f3 de la transacci\u00f3 dividida",
|
"split_transaction_title": "Descripci\u00f3 de la transacci\u00f3 dividida",
|
||||||
"errors_submission": "Hi ha hagut un error amb el teu enviament. Per favor, revisa els errors de sota.",
|
"errors_submission": "Hi ha hagut un error amb el teu enviament. Per favor, revisa els errors de sota.",
|
||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Est\u00e0 reconciliat",
|
||||||
"split": "Dividir",
|
"split": "Dividir",
|
||||||
"single_split": "Divisi\u00f3",
|
"single_split": "Divisi\u00f3",
|
||||||
"not_enough_currencies": "Not enough currencies",
|
"not_enough_currencies": "No hi ha prou monedes",
|
||||||
"not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.",
|
"not_enough_currencies_enabled": "Si tens nom\u00e9s una divisa habilitada, no cal afegir tipus de canvi.",
|
||||||
"transaction_stored_link": "La <a href=\"transactions\/show\/{ID}\">Transacci\u00f3 #{ID} (\"{title}\")<\/a> s'ha desat.",
|
"transaction_stored_link": "La <a href=\"transactions\/show\/{ID}\">Transacci\u00f3 #{ID} (\"{title}\")<\/a> s'ha desat.",
|
||||||
"webhook_stored_link": "S'ha desat <a href=\"webhooks\/show\/{ID}\">el Webook #{ID} (\"{title}\")<\/a> correctament.",
|
"webhook_stored_link": "S'ha desat <a href=\"webhooks\/show\/{ID}\">el Webook #{ID} (\"{title}\")<\/a> correctament.",
|
||||||
"webhook_updated_link": "S'ha actualitzat el <a href=\"webhooks\/show\/{ID}\">Webook #{ID}<\/a> (\"{title}\").",
|
"webhook_updated_link": "S'ha actualitzat el <a href=\"webhooks\/show\/{ID}\">Webook #{ID}<\/a> (\"{title}\").",
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
"apply_rules_checkbox": "Aplicar regles",
|
"apply_rules_checkbox": "Aplicar regles",
|
||||||
"fire_webhooks_checkbox": "Disparar webhooks",
|
"fire_webhooks_checkbox": "Disparar webhooks",
|
||||||
"no_budget_pointer": "Sembla que encara no tens cap pressupost. N'hauries de crear alguns a la p\u00e0gina de <a href=\"budgets\">pressuposts<\/a>. Els pressupostos et poden ajudar a fer el seguiment de les teves despeses.",
|
"no_budget_pointer": "Sembla que encara no tens cap pressupost. N'hauries de crear alguns a la p\u00e0gina de <a href=\"budgets\">pressuposts<\/a>. Els pressupostos et poden ajudar a fer el seguiment de les teves despeses.",
|
||||||
"no_bill_pointer": "You seem to have no subscription yet. You should create some on the <a href=\"subscriptions\">subscription<\/a>-page. Subscriptions can help you keep track of expenses.",
|
"no_bill_pointer": "Sembla que encara no tens cap subscripci\u00f3. N'hauries de crear alguns a la p\u00e0gina de <a href=\"subscriptions\">subscripcions<\/a>. Les subscripcions et poden ajudar a fer el seguiment de les teves despeses.",
|
||||||
"source_account": "Compte d'origen",
|
"source_account": "Compte d'origen",
|
||||||
"hidden_fields_preferences": "Pots habilitar m\u00e9s opcions de transacci\u00f3 a la <a href=\"preferences\">configuraci\u00f3<\/a>.",
|
"hidden_fields_preferences": "Pots habilitar m\u00e9s opcions de transacci\u00f3 a la <a href=\"preferences\">configuraci\u00f3<\/a>.",
|
||||||
"destination_account": "Compte de dest\u00ed",
|
"destination_account": "Compte de dest\u00ed",
|
||||||
@@ -43,10 +43,10 @@
|
|||||||
"submit": "Enviar",
|
"submit": "Enviar",
|
||||||
"amount": "Import",
|
"amount": "Import",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s) unless you remove the reconciliation flag.",
|
"is_reconciled_fields_dropped": "Com que aquesta transacci\u00f3 est\u00e0 reconciliada, no podreu actualitzar els comptes ni l'import o imports tret que elimineu el senyalador de reconciliaci\u00f3.",
|
||||||
"tags": "Etiquetes",
|
"tags": "Etiquetes",
|
||||||
"no_budget": "(cap pressupost)",
|
"no_budget": "(cap pressupost)",
|
||||||
"no_bill": "(no subscription)",
|
"no_bill": "(cap subscripci\u00f3)",
|
||||||
"category": "Categoria",
|
"category": "Categoria",
|
||||||
"attachments": "Adjunts",
|
"attachments": "Adjunts",
|
||||||
"notes": "Notes",
|
"notes": "Notes",
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
"destination_account_reconciliation": "No pots editar el compte de dest\u00ed d'una transacci\u00f3 de reconciliaci\u00f3.",
|
"destination_account_reconciliation": "No pots editar el compte de dest\u00ed d'una transacci\u00f3 de reconciliaci\u00f3.",
|
||||||
"source_account_reconciliation": "No pots editar el compte d'origen d'una transacci\u00f3 de consolidaci\u00f3.",
|
"source_account_reconciliation": "No pots editar el compte d'origen d'una transacci\u00f3 de consolidaci\u00f3.",
|
||||||
"budget": "Pressupost",
|
"budget": "Pressupost",
|
||||||
"bill": "Subscription",
|
"bill": "Subscripci\u00f3",
|
||||||
"you_create_withdrawal": "Est\u00e0s creant una retirada.",
|
"you_create_withdrawal": "Est\u00e0s creant una retirada.",
|
||||||
"you_create_transfer": "Est\u00e0s creant una transfer\u00e8ncia.",
|
"you_create_transfer": "Est\u00e0s creant una transfer\u00e8ncia.",
|
||||||
"you_create_deposit": "Est\u00e0s creant un ingr\u00e9s.",
|
"you_create_deposit": "Est\u00e0s creant un ingr\u00e9s.",
|
||||||
@@ -140,21 +140,21 @@
|
|||||||
"response": "Resposta",
|
"response": "Resposta",
|
||||||
"visit_webhook_url": "Visitar l'URL del webhook",
|
"visit_webhook_url": "Visitar l'URL del webhook",
|
||||||
"reset_webhook_secret": "Reiniciar el secret del webhook",
|
"reset_webhook_secret": "Reiniciar el secret del webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Tipus de canvi",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III permet descarregar i utilitzar tipus de canvi. M\u00e9s informaci\u00f3 sobre aix\u00f2 a la <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">documentaci\u00f3<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"exchange_rates_from_to": "Entre {from} i {to} (i a la inversa)",
|
||||||
"exchange_rates_intro_rates": "Firefly III uses the following exchange rates. The inverse is automatically calculated when it is not provided. If no exchange rate exists for the date of the transaction, Firefly III will go back in time to find one. If none are present, the rate \"1\" will be used.",
|
"exchange_rates_intro_rates": "Firefly III utilitza els tipus de canvi seg\u00fcents. L'invers es calcula autom\u00e0ticament quan no es proporciona. Si no existeix cap tipus de canvi per a la data de la transacci\u00f3, Firefly III tornar\u00e0 enrere en el temps per trobar-ne un. Si no n'hi ha cap, s'utilitzar\u00e0 el tipus \"1\".",
|
||||||
"header_exchange_rates_rates": "Exchange rates",
|
"header_exchange_rates_rates": "Tipus de canvi",
|
||||||
"header_exchange_rates_table": "Table with exchange rates",
|
"header_exchange_rates_table": "Taula amb els tipus de canvi",
|
||||||
"help_rate_form": "On this day, how many {to} will you get for one {from}?",
|
"help_rate_form": "El dia d'avui, quants {to} obtindr\u00e0s amb un {from}?",
|
||||||
"add_new_rate": "Add a new exchange rate",
|
"add_new_rate": "Afegeix un nou tipus de canvi",
|
||||||
"save_new_rate": "Save new rate"
|
"save_new_rate": "Desa nou tipus"
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Actiu",
|
"active": "Actiu",
|
||||||
"interest_date": "Data d'inter\u00e8s",
|
"interest_date": "Data d'inter\u00e8s",
|
||||||
"administration_currency": "Native currency",
|
"administration_currency": "Moneda nativa",
|
||||||
"title": "T\u00edtol",
|
"title": "T\u00edtol",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"book_date": "Data de registre",
|
"book_date": "Data de registre",
|
||||||
@@ -169,12 +169,12 @@
|
|||||||
"webhook_delivery": "Lliurament",
|
"webhook_delivery": "Lliurament",
|
||||||
"from_currency_to_currency": "{from} → {to}",
|
"from_currency_to_currency": "{from} → {to}",
|
||||||
"to_currency_from_currency": "{to} → {from}",
|
"to_currency_from_currency": "{to} → {from}",
|
||||||
"rate": "Rate"
|
"rate": "Taxa"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "T\u00edtol",
|
"title": "T\u00edtol",
|
||||||
"active": "Est\u00e0 actiu?",
|
"active": "Est\u00e0 actiu?",
|
||||||
"native_currency": "Native currency",
|
"native_currency": "Moneda nativa",
|
||||||
"trigger": "Activador",
|
"trigger": "Activador",
|
||||||
"response": "Resposta",
|
"response": "Resposta",
|
||||||
"delivery": "Lliurament",
|
"delivery": "Lliurament",
|
||||||
|
@@ -40,13 +40,13 @@
|
|||||||
"stored_journal": "\u00dasp\u011b\u0161n\u011b vytvo\u0159ena nov\u00e1 transakce \u201e:description\u201c",
|
"stored_journal": "\u00dasp\u011b\u0161n\u011b vytvo\u0159ena nov\u00e1 transakce \u201e:description\u201c",
|
||||||
"create_another": "Po ulo\u017een\u00ed se vr\u00e1tit sem pro vytvo\u0159en\u00ed dal\u0161\u00ed.",
|
"create_another": "Po ulo\u017een\u00ed se vr\u00e1tit sem pro vytvo\u0159en\u00ed dal\u0161\u00ed.",
|
||||||
"reset_after": "Po odesl\u00e1n\u00ed vymazat obsah formul\u00e1\u0159e",
|
"reset_after": "Po odesl\u00e1n\u00ed vymazat obsah formul\u00e1\u0159e",
|
||||||
"submit": "Odeslat",
|
"submit": "Potvrdit",
|
||||||
"amount": "\u010c\u00e1stka",
|
"amount": "\u010c\u00e1stka",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s) unless you remove the reconciliation flag.",
|
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s) unless you remove the reconciliation flag.",
|
||||||
"tags": "\u0160t\u00edtky",
|
"tags": "\u0160t\u00edtky",
|
||||||
"no_budget": "(\u017e\u00e1dn\u00fd rozpo\u010det)",
|
"no_budget": "(\u017e\u00e1dn\u00fd rozpo\u010det)",
|
||||||
"no_bill": "(no subscription)",
|
"no_bill": "(bez pravideln\u00e9 platby)",
|
||||||
"category": "Kategorie",
|
"category": "Kategorie",
|
||||||
"attachments": "P\u0159\u00edlohy",
|
"attachments": "P\u0159\u00edlohy",
|
||||||
"notes": "Pozn\u00e1mky",
|
"notes": "Pozn\u00e1mky",
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
"destination_account_reconciliation": "C\u00edlov\u00fd \u00fa\u010det odsouhlasen\u00e9 transakce nelze upravit.",
|
"destination_account_reconciliation": "C\u00edlov\u00fd \u00fa\u010det odsouhlasen\u00e9 transakce nelze upravit.",
|
||||||
"source_account_reconciliation": "Nem\u016f\u017eete upravovat zdrojov\u00fd \u00fa\u010det srovn\u00e1vac\u00ed transakce.",
|
"source_account_reconciliation": "Nem\u016f\u017eete upravovat zdrojov\u00fd \u00fa\u010det srovn\u00e1vac\u00ed transakce.",
|
||||||
"budget": "Rozpo\u010det",
|
"budget": "Rozpo\u010det",
|
||||||
"bill": "Subscription",
|
"bill": "Pravideln\u00e1 platba",
|
||||||
"you_create_withdrawal": "Vytv\u00e1\u0159\u00edte v\u00fdb\u011br.",
|
"you_create_withdrawal": "Vytv\u00e1\u0159\u00edte v\u00fdb\u011br.",
|
||||||
"you_create_transfer": "Vytv\u00e1\u0159\u00edte p\u0159evod.",
|
"you_create_transfer": "Vytv\u00e1\u0159\u00edte p\u0159evod.",
|
||||||
"you_create_deposit": "Vytv\u00e1\u0159\u00edte vklad.",
|
"you_create_deposit": "Vytv\u00e1\u0159\u00edte vklad.",
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
"profile_whoops": "Omlouv\u00e1me se, tohle n\u011bjak nefunguje",
|
"profile_whoops": "Omlouv\u00e1me se, tohle n\u011bjak nefunguje",
|
||||||
"profile_something_wrong": "Something went wrong!",
|
"profile_something_wrong": "Something went wrong!",
|
||||||
"profile_try_again": "Something went wrong. Please try again.",
|
"profile_try_again": "Something went wrong. Please try again.",
|
||||||
"profile_oauth_clients": "OAuth Clients",
|
"profile_oauth_clients": "Klienti OAuth",
|
||||||
"profile_oauth_no_clients": "Zat\u00edm jste nevytvo\u0159ili OAuth klienty.",
|
"profile_oauth_no_clients": "Zat\u00edm jste nevytvo\u0159ili OAuth klienty.",
|
||||||
"profile_oauth_clients_header": "Klienti",
|
"profile_oauth_clients_header": "Klienti",
|
||||||
"profile_oauth_client_id": "ID z\u00e1kazn\u00edka",
|
"profile_oauth_client_id": "ID z\u00e1kazn\u00edka",
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
"create_new_webhook": "Vytvo\u0159it nov\u00fd webhook",
|
"create_new_webhook": "Vytvo\u0159it nov\u00fd webhook",
|
||||||
"webhooks": "Webhooky",
|
"webhooks": "Webhooky",
|
||||||
"webhook_trigger_form_help": "Ur\u010dit, na kterou ud\u00e1lost se spust\u00ed webhook",
|
"webhook_trigger_form_help": "Ur\u010dit, na kterou ud\u00e1lost se spust\u00ed webhook",
|
||||||
"webhook_response_form_help": "Ur\u010dit, co mus\u00ed webhook odeslat do URL.",
|
"webhook_response_form_help": "Ur\u010dete, co mus\u00ed webhook odeslat do URL.",
|
||||||
"webhook_delivery_form_help": "V jak\u00e9m form\u00e1tu mus\u00ed webhook pos\u00edlat data.",
|
"webhook_delivery_form_help": "V jak\u00e9m form\u00e1tu mus\u00ed webhook pos\u00edlat data.",
|
||||||
"webhook_active_form_help": "Webhook mus\u00ed b\u00fdt aktivn\u00ed, nebo nebude zavol\u00e1n.",
|
"webhook_active_form_help": "Webhook mus\u00ed b\u00fdt aktivn\u00ed, nebo nebude zavol\u00e1n.",
|
||||||
"edit_webhook_js": "Upravit webhook \"{title}\"",
|
"edit_webhook_js": "Upravit webhook \"{title}\"",
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"firefly": {
|
"firefly": {
|
||||||
"administrations_page_title": "Financial administrations",
|
"administrations_page_title": "Administraciones financieras",
|
||||||
"administrations_index_menu": "Financial administrations",
|
"administrations_index_menu": "Administraciones financieras",
|
||||||
"expires_at": "Expires at",
|
"expires_at": "Expira el",
|
||||||
"temp_administrations_introduction": "Firefly III will soon get the ability to manage multiple financial administrations. Right now, you only have the one. You can set the title of this administration and its native currency. This replaces the previous setting where you would set your \"default currency\". This setting is now tied to the financial administration and can be different per administration.",
|
"temp_administrations_introduction": "Firefly III pronto tendr\u00e1 la capacidad de gestionar m\u00faltiples administraciones financieras. Ahora mismo, solo tienes uno. Puedes establecer el t\u00edtulo de esta administraci\u00f3n y su moneda nativa. Esto reemplaza la configuraci\u00f3n anterior donde establecer\u00eda su \"moneda predeterminada\". Esta situaci\u00f3n est\u00e1 vinculada ahora a la administraci\u00f3n financiera y puede ser diferente por administraci\u00f3n.",
|
||||||
"administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.",
|
"administration_currency_form_help": "Puede tardar mucho tiempo en cargar la p\u00e1gina si cambia la moneda nativa porque la transacci\u00f3n puede necesitar ser convertida a su (nueva) moneda nativa.",
|
||||||
"administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"",
|
"administrations_page_edit_sub_title_js": "Editar administraci\u00f3n financiera \"{title}\"",
|
||||||
"table": "Mesa",
|
"table": "Mesa",
|
||||||
"welcome_back": "\u00bfQu\u00e9 est\u00e1 pasando?",
|
"welcome_back": "\u00bfQu\u00e9 est\u00e1 pasando?",
|
||||||
"flash_error": "\u00a1Error!",
|
"flash_error": "\u00a1Error!",
|
||||||
@@ -16,11 +16,11 @@
|
|||||||
"select_source_account": "Por favor, seleccione o escriba un nombre de cuenta de origen v\u00e1lido",
|
"select_source_account": "Por favor, seleccione o escriba un nombre de cuenta de origen v\u00e1lido",
|
||||||
"split_transaction_title": "Descripci\u00f3n de la transacci\u00f3n dividida",
|
"split_transaction_title": "Descripci\u00f3n de la transacci\u00f3n dividida",
|
||||||
"errors_submission": "Hubo un problema con su env\u00edo. Por favor, compruebe los siguientes errores.",
|
"errors_submission": "Hubo un problema con su env\u00edo. Por favor, compruebe los siguientes errores.",
|
||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Est\u00e1 reconciliado",
|
||||||
"split": "Separar",
|
"split": "Separar",
|
||||||
"single_split": "Divisi\u00f3n",
|
"single_split": "Divisi\u00f3n",
|
||||||
"not_enough_currencies": "Not enough currencies",
|
"not_enough_currencies": "No hay suficientes monedas",
|
||||||
"not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.",
|
"not_enough_currencies_enabled": "Si solo tiene una divisa habilitada, no es necesario a\u00f1adir tipos de cambio.",
|
||||||
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">La transacci\u00f3n #{ID} (\"{title}\")<\/a> ha sido almacenada.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">La transacci\u00f3n #{ID} (\"{title}\")<\/a> ha sido almacenada.",
|
||||||
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido almacenado.",
|
"webhook_stored_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido almacenado.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido actualizado.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">El webhook #{ID} (\"{title}\")<\/a> ha sido actualizado.",
|
||||||
@@ -43,10 +43,10 @@
|
|||||||
"submit": "Enviar",
|
"submit": "Enviar",
|
||||||
"amount": "Cantidad",
|
"amount": "Cantidad",
|
||||||
"date": "Fecha",
|
"date": "Fecha",
|
||||||
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s) unless you remove the reconciliation flag.",
|
"is_reconciled_fields_dropped": "Debido a que esta transacci\u00f3n est\u00e1 reconciliada, no podr\u00e1 actualizar las cuentas, ni la cantidad(es) a menos que elimine la bandera de reconciliaci\u00f3n.",
|
||||||
"tags": "Etiquetas",
|
"tags": "Etiquetas",
|
||||||
"no_budget": "(sin presupuesto)",
|
"no_budget": "(sin presupuesto)",
|
||||||
"no_bill": "(no subscription)",
|
"no_bill": "(sin suscripci\u00f3n)",
|
||||||
"category": "Categor\u00eda",
|
"category": "Categor\u00eda",
|
||||||
"attachments": "Archivos adjuntos",
|
"attachments": "Archivos adjuntos",
|
||||||
"notes": "Notas",
|
"notes": "Notas",
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
"destination_account_reconciliation": "No puedes editar la cuenta de destino de una transacci\u00f3n de reconciliaci\u00f3n.",
|
"destination_account_reconciliation": "No puedes editar la cuenta de destino de una transacci\u00f3n de reconciliaci\u00f3n.",
|
||||||
"source_account_reconciliation": "No puedes editar la cuenta de origen de una transacci\u00f3n de reconciliaci\u00f3n.",
|
"source_account_reconciliation": "No puedes editar la cuenta de origen de una transacci\u00f3n de reconciliaci\u00f3n.",
|
||||||
"budget": "Presupuesto",
|
"budget": "Presupuesto",
|
||||||
"bill": "Subscription",
|
"bill": "Suscripci\u00f3n",
|
||||||
"you_create_withdrawal": "Est\u00e1 creando un gasto.",
|
"you_create_withdrawal": "Est\u00e1 creando un gasto.",
|
||||||
"you_create_transfer": "Est\u00e1 creando una transferencia.",
|
"you_create_transfer": "Est\u00e1 creando una transferencia.",
|
||||||
"you_create_deposit": "Est\u00e1 creando un ingreso.",
|
"you_create_deposit": "Est\u00e1 creando un ingreso.",
|
||||||
@@ -140,11 +140,11 @@
|
|||||||
"response": "Respuesta",
|
"response": "Respuesta",
|
||||||
"visit_webhook_url": "Visita la URL del webhook",
|
"visit_webhook_url": "Visita la URL del webhook",
|
||||||
"reset_webhook_secret": "Restablecer secreto del webhook",
|
"reset_webhook_secret": "Restablecer secreto del webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Tipos de cambio",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
"exchange_rates_intro": "Firefly III soporta la descarga y el uso de tipos de cambio. Lee m\u00e1s sobre esto en <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">la documentaci\u00f3n<\/a>.",
|
||||||
"exchange_rates_from_to": "Entre {from} y {to} (y viceversa)",
|
"exchange_rates_from_to": "Entre {from} y {to} (y viceversa)",
|
||||||
"exchange_rates_intro_rates": "Firefly III utiliza los siguientes tipos de cambio. El inverso se calcula autom\u00e1ticamente cuando no se proporciona. Si no existe un tipo de cambio para la fecha de la transacci\u00f3n, Firefly III retroceder\u00e1 en el tiempo para encontrar uno. Si no hay ninguno presente, se usar\u00e1 la tasa \"1\".",
|
"exchange_rates_intro_rates": "Firefly III utiliza los siguientes tipos de cambio. El inverso se calcula autom\u00e1ticamente cuando no se proporciona. Si no existe un tipo de cambio para la fecha de la transacci\u00f3n, Firefly III retroceder\u00e1 en el tiempo para encontrar uno. Si no hay ninguno presente, se usar\u00e1 la tasa \"1\".",
|
||||||
"header_exchange_rates_rates": "Exchange rates",
|
"header_exchange_rates_rates": "Tipos de cambio",
|
||||||
"header_exchange_rates_table": "Tabla con tipos de cambio",
|
"header_exchange_rates_table": "Tabla con tipos de cambio",
|
||||||
"help_rate_form": "En este d\u00eda, \u00bfcu\u00e1nto {to} conseguir\u00e1s por un {from}?",
|
"help_rate_form": "En este d\u00eda, \u00bfcu\u00e1nto {to} conseguir\u00e1s por un {from}?",
|
||||||
"add_new_rate": "Agregar un nuevo tipo de cambio",
|
"add_new_rate": "Agregar un nuevo tipo de cambio",
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
"list": {
|
"list": {
|
||||||
"title": "T\u00edtulo",
|
"title": "T\u00edtulo",
|
||||||
"active": "\u00bfEst\u00e1 Activo?",
|
"active": "\u00bfEst\u00e1 Activo?",
|
||||||
"native_currency": "Native currency",
|
"native_currency": "Moneda nativa",
|
||||||
"trigger": "Disparador",
|
"trigger": "Disparador",
|
||||||
"response": "Respuesta",
|
"response": "Respuesta",
|
||||||
"delivery": "Entrega",
|
"delivery": "Entrega",
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
"apply_rules_checkbox": "Apply rules",
|
"apply_rules_checkbox": "Apply rules",
|
||||||
"fire_webhooks_checkbox": "Fire webhooks",
|
"fire_webhooks_checkbox": "Fire webhooks",
|
||||||
"no_budget_pointer": "Hen\u00fcz b\u00fct\u00e7eniz yok gibi g\u00f6r\u00fcn\u00fcyor. <a href=\"budgets\">b\u00fct\u00e7eler<\/a> sayfas\u0131nda biraz olu\u015fturmal\u0131s\u0131n\u0131z. B\u00fct\u00e7eler, giderleri takip etmenize yard\u0131mc\u0131 olabilir.",
|
"no_budget_pointer": "Hen\u00fcz b\u00fct\u00e7eniz yok gibi g\u00f6r\u00fcn\u00fcyor. <a href=\"budgets\">b\u00fct\u00e7eler<\/a> sayfas\u0131nda biraz olu\u015fturmal\u0131s\u0131n\u0131z. B\u00fct\u00e7eler, giderleri takip etmenize yard\u0131mc\u0131 olabilir.",
|
||||||
"no_bill_pointer": "You seem to have no subscription yet. You should create some on the <a href=\"subscriptions\">subscription<\/a>-page. Subscriptions can help you keep track of expenses.",
|
"no_bill_pointer": "Hen\u00fcz aboneli\u011finiz yok gibi g\u00f6r\u00fcn\u00fcyor. <a href=\"subscriptions\">Abonelik<\/a> sayfas\u0131nda bir abonelik olu\u015fturmal\u0131s\u0131n\u0131z. Abonelikler, harcamalar\u0131n\u0131z\u0131 takip etmenize yard\u0131mc\u0131 olabilir.",
|
||||||
"source_account": "Kaynak hesap",
|
"source_account": "Kaynak hesap",
|
||||||
"hidden_fields_preferences": "You can enable more transaction options in your <a href=\"preferences\">preferences<\/a>.",
|
"hidden_fields_preferences": "You can enable more transaction options in your <a href=\"preferences\">preferences<\/a>.",
|
||||||
"destination_account": "Hedef hesap",
|
"destination_account": "Hedef hesap",
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
"firefly": {
|
"firefly": {
|
||||||
"administrations_page_title": "\u8d22\u52a1\u7ba1\u7406",
|
"administrations_page_title": "\u8d22\u52a1\u7ba1\u7406",
|
||||||
"administrations_index_menu": "\u8d22\u52a1\u7ba1\u7406",
|
"administrations_index_menu": "\u8d22\u52a1\u7ba1\u7406",
|
||||||
"expires_at": "Expires at",
|
"expires_at": "\u8fc7\u671f\u4e8e",
|
||||||
"temp_administrations_introduction": "Firefly III \u4e0d\u4e45\u5c06\u80fd\u591f\u7ba1\u7406\u591a\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002 \u73b0\u5728\uff0c\u4f60\u53ea\u80fd\u6709\u4e00\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002\u4f60\u53ef\u4ee5\u8bbe\u7f6e\u8fd9\u4e2a\u8d22\u52a1\u7ba1\u7406\u7684\u6807\u9898\u53ca\u5176\u5f53\u5730\u8d27\u5e01\u3002 \u8fd9\u5c06\u53d6\u4ee3\u60a8\u5148\u524d\u8bbe\u7f6e\u7684\u201c\u9ed8\u8ba4\u8d27\u5e01\u201d\u3002 \u8fd9\u79cd\u8bbe\u7f6e\u73b0\u5728\u4e0e\u8d22\u52a1\u7ba1\u7406\u6302\u94a9\uff0c\u6bcf\u4e2a\u7ba1\u7406\u53ef\u4ee5\u6709\u4e0d\u540c\u7684\u8bbe\u7f6e\u3002",
|
"temp_administrations_introduction": "Firefly III \u4e0d\u4e45\u5c06\u80fd\u591f\u7ba1\u7406\u591a\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002 \u73b0\u5728\uff0c\u4f60\u53ea\u80fd\u6709\u4e00\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002\u4f60\u53ef\u4ee5\u8bbe\u7f6e\u8fd9\u4e2a\u8d22\u52a1\u7ba1\u7406\u7684\u6807\u9898\u53ca\u5176\u5f53\u5730\u8d27\u5e01\u3002 \u8fd9\u5c06\u53d6\u4ee3\u60a8\u5148\u524d\u8bbe\u7f6e\u7684\u201c\u9ed8\u8ba4\u8d27\u5e01\u201d\u3002 \u8fd9\u79cd\u8bbe\u7f6e\u73b0\u5728\u4e0e\u8d22\u52a1\u7ba1\u7406\u6302\u94a9\uff0c\u6bcf\u4e2a\u7ba1\u7406\u53ef\u4ee5\u6709\u4e0d\u540c\u7684\u8bbe\u7f6e\u3002",
|
||||||
"administration_currency_form_help": "\u5982\u679c\u60a8\u66f4\u6539\u672c\u5730\u8d27\u5e01\uff0c\u9875\u9762\u52a0\u8f7d\u53ef\u80fd\u9700\u8981\u5f88\u957f\u65f6\u95f4\uff0c\u56e0\u4e3a\u4ea4\u6613\u53ef\u80fd\u9700\u8981\u8f6c\u6362\u4e3a\u60a8\u7684(\u65b0)\u672c\u5730\u8d27\u5e01\u3002",
|
"administration_currency_form_help": "\u5982\u679c\u60a8\u66f4\u6539\u672c\u5730\u8d27\u5e01\uff0c\u9875\u9762\u52a0\u8f7d\u53ef\u80fd\u9700\u8981\u5f88\u957f\u65f6\u95f4\uff0c\u56e0\u4e3a\u4ea4\u6613\u53ef\u80fd\u9700\u8981\u8f6c\u6362\u4e3a\u60a8\u7684(\u65b0)\u672c\u5730\u8d27\u5e01\u3002",
|
||||||
"administrations_page_edit_sub_title_js": "\u7f16\u8f91\u8d22\u52a1\u7ba1\u7406{title}",
|
"administrations_page_edit_sub_title_js": "\u7f16\u8f91\u8d22\u52a1\u7ba1\u7406{title}",
|
||||||
|
@@ -133,7 +133,7 @@ return [
|
|||||||
'expenses_by_budget' => 'Expenses by budget',
|
'expenses_by_budget' => 'Expenses by budget',
|
||||||
'income_by_category' => 'Income by category',
|
'income_by_category' => 'Income by category',
|
||||||
'expenses_by_asset_account' => 'Expenses by asset account',
|
'expenses_by_asset_account' => 'Expenses by asset account',
|
||||||
'expenses_by_expense_account' => 'Expenses by expense account',
|
'expenses_by_expense_account' => 'Expenses by destination account',
|
||||||
'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.',
|
'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.',
|
||||||
'sum_of_expenses' => 'Sum of expenses',
|
'sum_of_expenses' => 'Sum of expenses',
|
||||||
'sum_of_income' => 'Sum of income',
|
'sum_of_income' => 'Sum of income',
|
||||||
|
@@ -64,7 +64,7 @@ return [
|
|||||||
'budget_id' => 'Budget',
|
'budget_id' => 'Budget',
|
||||||
'bill_id' => 'Subscription',
|
'bill_id' => 'Subscription',
|
||||||
'opening_balance' => 'Opening balance',
|
'opening_balance' => 'Opening balance',
|
||||||
'tagMode' => 'Tag mode',
|
'tag_mode' => 'Tag mode',
|
||||||
'virtual_balance' => 'Virtual balance',
|
'virtual_balance' => 'Virtual balance',
|
||||||
|
|
||||||
|
|
||||||
|
@@ -82,13 +82,13 @@
|
|||||||
{% for tag in journal.tags %}
|
{% for tag in journal.tags %}
|
||||||
|
|
||||||
<h4 style="display: inline;"><a class="label label-success" href="{{ route('tags.show',tag) }}">
|
<h4 style="display: inline;"><a class="label label-success" href="{{ route('tags.show',tag) }}">
|
||||||
{% if tag.tagMode == 'nothing' %}
|
{% if tag.tag_mode == 'nothing' %}
|
||||||
<span class="fa fa-fw fa-tag"></span>
|
<span class="fa fa-fw fa-tag"></span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if tag.tagMode == 'balancingAct' %}
|
{% if tag.tag_mode == 'balancingAct' %}
|
||||||
<span class="fa fa-fw fa-refresh"></span>
|
<span class="fa fa-fw fa-refresh"></span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if tag.tagMode == 'advancePayment' %}
|
{% if tag.tag_mode == 'advancePayment' %}
|
||||||
<span class="fa fa-fw fa-sort-numeric-desc"></span>
|
<span class="fa fa-fw fa-sort-numeric-desc"></span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ tag.tag }}</a>
|
{{ tag.tag }}</a>
|
||||||
|
@@ -369,9 +369,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for budgetLimit in budget.budgeted %}
|
{% for budgetLimit in budget.budgeted %}
|
||||||
D
|
|
||||||
{% if null == budget.spent[budgetLimit.currency_id] %}
|
{% if null == budget.spent[budgetLimit.currency_id] %}
|
||||||
E
|
|
||||||
<span class="left_span" data-currency="{{ spentInfo.currency_id }}" data-limit="{{ budgetLimit.id }}"
|
<span class="left_span" data-currency="{{ spentInfo.currency_id }}" data-limit="{{ budgetLimit.id }}"
|
||||||
data-value="{{ spentInfo.spent + budgetLimit.amount }}" class="amount_left">
|
data-value="{{ spentInfo.spent + budgetLimit.amount }}" class="amount_left">
|
||||||
{{ formatAmountBySymbol(budgetLimit.amount, budgetLimit.currency_symbol, budgetLimit.currency_decimal_places) }}
|
{{ formatAmountBySymbol(budgetLimit.amount, budgetLimit.currency_symbol, budgetLimit.currency_decimal_places) }}
|
||||||
|
@@ -44,6 +44,6 @@ final class AccountControllerTest extends TestCase
|
|||||||
$response = $this->get(route('api.v1.autocomplete.accounts'), ['Accept' => 'application/json']);
|
$response = $this->get(route('api.v1.autocomplete.accounts'), ['Accept' => 'application/json']);
|
||||||
$response->assertStatus(401);
|
$response->assertStatus(401);
|
||||||
$response->assertHeader('Content-Type', 'application/json');
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
$response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}');
|
$response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -84,7 +84,7 @@ final class BillControllerTest extends TestCase
|
|||||||
$response = $this->get(route('api.v1.autocomplete.bills'), ['Accept' => 'application/json']);
|
$response = $this->get(route('api.v1.autocomplete.bills'), ['Accept' => 'application/json']);
|
||||||
$response->assertStatus(401);
|
$response->assertStatus(401);
|
||||||
$response->assertHeader('Content-Type', 'application/json');
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
$response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}');
|
$response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGivenAuthenticatedRequestWhenCallingTheBillsEndpointThenReturns200HttpCode(): void
|
public function testGivenAuthenticatedRequestWhenCallingTheBillsEndpointThenReturns200HttpCode(): void
|
||||||
|
@@ -78,7 +78,7 @@ final class BudgetControllerTest extends TestCase
|
|||||||
$response = $this->get(route('api.v1.autocomplete.budgets'), ['Accept' => 'application/json']);
|
$response = $this->get(route('api.v1.autocomplete.budgets'), ['Accept' => 'application/json']);
|
||||||
$response->assertStatus(401);
|
$response->assertStatus(401);
|
||||||
$response->assertHeader('Content-Type', 'application/json');
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
$response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}');
|
$response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGivenAuthenticatedRequestWhenCallingTheBudgetsEndpointThenReturns200HttpCode(): void
|
public function testGivenAuthenticatedRequestWhenCallingTheBudgetsEndpointThenReturns200HttpCode(): void
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user