mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 02:36:28 +00:00 
			
		
		
		
	Compare commits
	
		
			189 Commits
		
	
	
		
			v6.4.0
			...
			develop-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | dbc0210304 | ||
|  | a709e224d4 | ||
|  | 83f3eddf44 | ||
|  | 7cfc4c2671 | ||
|  | 1c6055cb2d | ||
|  | 4f4576e458 | ||
|  | 84d3bcbb37 | ||
|  | c91c87d646 | ||
|  | e09b6034f7 | ||
|  | ad67bb80f3 | ||
|  | a88d0de34d | ||
|  | ecf498cc81 | ||
|  | 569f553d26 | ||
|  | 7d45bc46b8 | ||
|  | 08553fcfb2 | ||
|  | 58c76bee94 | ||
|  | 3fa1b6dd27 | ||
|  | 63aa8adab7 | ||
|  | 70b8ea0acb | ||
|  | d800a01e33 | ||
|  | 52f3ec7d3d | ||
|  | d4978a09ee | ||
|  | 77095276e2 | ||
|  | b77a8591dc | ||
|  | 132d7d9ff8 | ||
|  | a981e2c5cb | ||
|  | 77b88b7758 | ||
|  | b9894eea57 | ||
|  | 469319a240 | ||
|  | 5a55593e34 | ||
|  | 8979e5ad5a | ||
|  | 3ab65c27ac | ||
|  | a3cac6fd0f | ||
|  | 1acb5d8681 | ||
|  | f24cdc7897 | ||
|  | a2b611253b | ||
|  | 252459c29b | ||
|  | 3582baf9f7 | ||
|  | b03ecab035 | ||
|  | 547a4e9dbb | ||
|  | 62e33a51bd | ||
|  | 8b0ee7e20a | ||
|  | 0e0ec89b26 | ||
|  | ec08485c2b | ||
|  | d91d30c8f0 | ||
|  | 634a43c361 | ||
|  | f2f86e1139 | ||
|  | a1c870c962 | ||
|  | 98be3a1414 | ||
|  | e3c3a0a84b | ||
|  | b254074867 | ||
|  | f21a5b3000 | ||
|  | 6029fe2e84 | ||
|  | 651e11ed1c | ||
|  | 5ba29cdacd | ||
|  | f948cc95b4 | ||
|  | 11e721c6c9 | ||
|  | 4bc77b2707 | ||
|  | 6639309935 | ||
|  | 52e08bb9eb | ||
|  | 435ca994cf | ||
|  | b29c35864c | ||
|  | 2ddc012549 | ||
|  | 22c88383ad | ||
|  | 9593f1b44e | ||
|  | 22f67be0b5 | ||
|  | 0e1633b52b | ||
|  | 0070e000b6 | ||
|  | c525a18263 | ||
|  | 68fbd8d5f4 | ||
|  | 0724c005cf | ||
|  | e662275400 | ||
|  | def2dd77ab | ||
|  | 36e87f3383 | ||
|  | e420752991 | ||
|  | c541cf48c3 | ||
|  | 521db984ab | ||
|  | b2b3c3f135 | ||
|  | b0033cf9ed | ||
|  | 50279d623c | ||
|  | 6341743cf9 | ||
|  | 072212c112 | ||
|  | 362705ec71 | ||
|  | 6ce926e7d2 | ||
|  | 1652c3af72 | ||
|  | 012172b0b5 | ||
|  | 957bc00847 | ||
|  | 7f827fb277 | ||
|  | 8e700944fd | ||
|  | 037a128942 | ||
|  | ca364dc877 | ||
|  | e55af7186c | ||
|  | 354bbebbee | ||
|  | a70fab1e87 | ||
|  | b9c93091cd | ||
|  | 4349f8f303 | ||
|  | 5088e20f25 | ||
|  | 3f81aa7403 | ||
|  | 8885d1dbeb | ||
|  | a6ba75d528 | ||
|  | 667cbb1332 | ||
|  | d1bae875f7 | ||
|  | c5cf529413 | ||
|  | 62b9f2785f | ||
|  | 3b85f87502 | ||
|  | 87d3d14504 | ||
|  | 5637573fd0 | ||
|  | 48255ae6ee | ||
|  | ea02986170 | ||
|  | f4fbc15ac6 | ||
|  | a02c4b42a4 | ||
|  | 1ff47441ce | ||
|  | 2cc8568077 | ||
|  | 408687ec6b | ||
|  | 308abffb0b | ||
|  | 6743b3fe83 | ||
|  | ac0113e445 | ||
|  | 0f0a28c3d9 | ||
|  | 79f2d70211 | ||
|  | 8a06c0f7ec | ||
|  | c54da62005 | ||
|  | e5923202af | ||
|  | eb6f78406e | ||
|  | d61f87f649 | ||
|  | 33dcce7525 | ||
|  | b1d86c3a37 | ||
|  | 822dee6e70 | ||
|  | f6dac83777 | ||
|  | d3c557ca22 | ||
|  | 853a99852e | ||
|  | 8f24ac4fcd | ||
|  | 8b09cfb8c9 | ||
|  | 18ae950d2e | ||
|  | 69dfbda847 | ||
|  | 4ec2fcdb8a | ||
|  | 08879d31ba | ||
|  | 66d09450d3 | ||
|  | 74f7c07a76 | ||
|  | ae3d0a3e49 | ||
|  | 61e8d7d7a2 | ||
|  | 62c5440605 | ||
|  | 0aa90b9453 | ||
|  | 855bc2f8e7 | ||
|  | d8f05492c3 | ||
|  | 4a264f34fa | ||
|  | 5a1413e758 | ||
|  | 84dbeeb0ce | ||
|  | d868dc0945 | ||
|  | beecf9c229 | ||
|  | e39ba46398 | ||
|  | e6b6a3cee5 | ||
|  | b5483f6ad3 | ||
|  | a751218d53 | ||
|  | 2af5e6eeef | ||
|  | 013c43f9f2 | ||
|  | 7e08a1f33c | ||
|  | e592b56d7a | ||
|  | a2479f71fe | ||
|  | 7d3b993b98 | ||
|  | 90623101a3 | ||
|  | e2eca79b25 | ||
|  | 8c0ee8f024 | ||
|  | 69cae3ae55 | ||
|  | 8a06298385 | ||
|  | acc3c294d8 | ||
|  | dbf7dba421 | ||
|  | 65813f290d | ||
|  | 3491fbb99d | ||
|  | cb6b3d5f85 | ||
|  | 956d4e09c3 | ||
|  | 6a7c35e7bc | ||
|  | 090aecb5f5 | ||
|  | b653d63d3d | ||
|  | 258dbf4a98 | ||
|  | 53335077ff | ||
|  | ecfb3e2f95 | ||
|  | f512e6724e | ||
|  | de9efb0727 | ||
|  | 9075fa8ac8 | ||
|  | 768bd892c8 | ||
|  | 9d9483e20f | ||
|  | 935453796e | ||
|  | c2d3f5da16 | ||
|  | 9e6f9d16e4 | ||
|  | fad016f92f | ||
|  | 30df6684cb | ||
|  | 4aa911420a | ||
|  | 19555a7046 | ||
|  | e5c409a8fc | 
							
								
								
									
										137
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										137
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							| @@ -402,16 +402,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "friendsofphp/php-cs-fixer", | ||||
|             "version": "v3.87.2", | ||||
|             "version": "v3.88.2", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", | ||||
|                 "reference": "da5f0a7858c79b56fc0b8c36d3efcfe5f37f0992" | ||||
|                 "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/da5f0a7858c79b56fc0b8c36d3efcfe5f37f0992", | ||||
|                 "reference": "da5f0a7858c79b56fc0b8c36d3efcfe5f37f0992", | ||||
|                 "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a8d15584bafb0f0d9d938827840060fd4a3ebc99", | ||||
|                 "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -438,12 +438,13 @@ | ||||
|                 "symfony/polyfill-mbstring": "^1.33", | ||||
|                 "symfony/polyfill-php80": "^1.33", | ||||
|                 "symfony/polyfill-php81": "^1.33", | ||||
|                 "symfony/polyfill-php84": "^1.33", | ||||
|                 "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2", | ||||
|                 "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0" | ||||
|             }, | ||||
|             "require-dev": { | ||||
|                 "facile-it/paraunit": "^1.3.1 || ^2.7", | ||||
|                 "infection/infection": "^0.29.14", | ||||
|                 "infection/infection": "^0.31.0", | ||||
|                 "justinrainbow/json-schema": "^6.5", | ||||
|                 "keradus/cli-executor": "^2.2", | ||||
|                 "mikey179/vfsstream": "^1.6.12", | ||||
| @@ -451,7 +452,6 @@ | ||||
|                 "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", | ||||
|                 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", | ||||
|                 "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", | ||||
|                 "symfony/polyfill-php84": "^1.33", | ||||
|                 "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2", | ||||
|                 "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2" | ||||
|             }, | ||||
| @@ -494,7 +494,7 @@ | ||||
|             ], | ||||
|             "support": { | ||||
|                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", | ||||
|                 "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.87.2" | ||||
|                 "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.88.2" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -502,7 +502,7 @@ | ||||
|                     "type": "github" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-09-10T09:51:40+00:00" | ||||
|             "time": "2025-09-27T00:24:15+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "psr/container", | ||||
| @@ -1252,16 +1252,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/console", | ||||
|             "version": "v7.3.3", | ||||
|             "version": "v7.3.4", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/console.git", | ||||
|                 "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" | ||||
|                 "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", | ||||
|                 "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", | ||||
|                 "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", | ||||
|                 "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -1326,7 +1326,7 @@ | ||||
|                 "terminal" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/console/tree/v7.3.3" | ||||
|                 "source": "https://github.com/symfony/console/tree/v7.3.4" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -1346,7 +1346,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-08-25T06:35:40+00:00" | ||||
|             "time": "2025-09-22T15:31:00+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/deprecation-contracts", | ||||
| @@ -2284,17 +2284,97 @@ | ||||
|             "time": "2024-09-09T11:45:10+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/process", | ||||
|             "version": "v7.3.3", | ||||
|             "name": "symfony/polyfill-php84", | ||||
|             "version": "v1.33.0", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/process.git", | ||||
|                 "reference": "32241012d521e2e8a9d713adb0812bb773b907f1" | ||||
|                 "url": "https://github.com/symfony/polyfill-php84.git", | ||||
|                 "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1", | ||||
|                 "reference": "32241012d521e2e8a9d713adb0812bb773b907f1", | ||||
|                 "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", | ||||
|                 "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": ">=7.2" | ||||
|             }, | ||||
|             "type": "library", | ||||
|             "extra": { | ||||
|                 "thanks": { | ||||
|                     "url": "https://github.com/symfony/polyfill", | ||||
|                     "name": "symfony/polyfill" | ||||
|                 } | ||||
|             }, | ||||
|             "autoload": { | ||||
|                 "files": [ | ||||
|                     "bootstrap.php" | ||||
|                 ], | ||||
|                 "psr-4": { | ||||
|                     "Symfony\\Polyfill\\Php84\\": "" | ||||
|                 }, | ||||
|                 "classmap": [ | ||||
|                     "Resources/stubs" | ||||
|                 ] | ||||
|             }, | ||||
|             "notification-url": "https://packagist.org/downloads/", | ||||
|             "license": [ | ||||
|                 "MIT" | ||||
|             ], | ||||
|             "authors": [ | ||||
|                 { | ||||
|                     "name": "Nicolas Grekas", | ||||
|                     "email": "p@tchwork.com" | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "Symfony Community", | ||||
|                     "homepage": "https://symfony.com/contributors" | ||||
|                 } | ||||
|             ], | ||||
|             "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", | ||||
|             "homepage": "https://symfony.com", | ||||
|             "keywords": [ | ||||
|                 "compatibility", | ||||
|                 "polyfill", | ||||
|                 "portable", | ||||
|                 "shim" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
|                     "url": "https://symfony.com/sponsor", | ||||
|                     "type": "custom" | ||||
|                 }, | ||||
|                 { | ||||
|                     "url": "https://github.com/fabpot", | ||||
|                     "type": "github" | ||||
|                 }, | ||||
|                 { | ||||
|                     "url": "https://github.com/nicolas-grekas", | ||||
|                     "type": "github" | ||||
|                 }, | ||||
|                 { | ||||
|                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-06-24T13:30:11+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/process", | ||||
|             "version": "v7.3.4", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/process.git", | ||||
|                 "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", | ||||
|                 "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -2326,7 +2406,7 @@ | ||||
|             "description": "Executes commands in sub-processes", | ||||
|             "homepage": "https://symfony.com", | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/process/tree/v7.3.3" | ||||
|                 "source": "https://github.com/symfony/process/tree/v7.3.4" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -2346,7 +2426,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-08-18T09:42:54+00:00" | ||||
|             "time": "2025-09-11T10:12:26+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/service-contracts", | ||||
| @@ -2495,16 +2575,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/string", | ||||
|             "version": "v7.3.3", | ||||
|             "version": "v7.3.4", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/string.git", | ||||
|                 "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" | ||||
|                 "reference": "f96476035142921000338bad71e5247fbc138872" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", | ||||
|                 "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", | ||||
|                 "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", | ||||
|                 "reference": "f96476035142921000338bad71e5247fbc138872", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -2519,7 +2599,6 @@ | ||||
|             }, | ||||
|             "require-dev": { | ||||
|                 "symfony/emoji": "^7.1", | ||||
|                 "symfony/error-handler": "^6.4|^7.0", | ||||
|                 "symfony/http-client": "^6.4|^7.0", | ||||
|                 "symfony/intl": "^6.4|^7.0", | ||||
|                 "symfony/translation-contracts": "^2.5|^3.0", | ||||
| @@ -2562,7 +2641,7 @@ | ||||
|                 "utf8" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/string/tree/v7.3.3" | ||||
|                 "source": "https://github.com/symfony/string/tree/v7.3.4" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -2582,7 +2661,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-08-25T06:35:40+00:00" | ||||
|             "time": "2025-09-11T14:36:48+00:00" | ||||
|         } | ||||
|     ], | ||||
|     "packages-dev": [], | ||||
|   | ||||
| @@ -28,5 +28,5 @@ parameters: | ||||
|  | ||||
|   # The level 8 is the highest level. original was 5 | ||||
|   # 7 is more than enough, higher just leaves NULL things. | ||||
|   level: 7 | ||||
|   level: 6 | ||||
|  | ||||
|   | ||||
| @@ -4,8 +4,10 @@ Over time, many people have contributed to Firefly III. Their efforts are not al | ||||
| Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution. | ||||
| 
 | ||||
| ## 2025 | ||||
| - jreyesr | ||||
| - codearena-bot | ||||
| - Nicky De Maeyer | ||||
| - Denis Iskandarov | ||||
| - = | ||||
| - Lompi | ||||
| - Jose Diaz-Gonzalez | ||||
| - SoftBrix | ||||
|   | ||||
| @@ -84,13 +84,13 @@ class AccountController extends Controller | ||||
|         $data        = $request->getData(); | ||||
|         $types       = $data['types']; | ||||
|         $query       = $data['query']; | ||||
|         $date        = $data['date'] ?? today(config('app.timezone')); | ||||
|         $date        = $data['date']; | ||||
|         $return      = []; | ||||
|         $timer       = Timer::getInstance(); | ||||
|         $timer->start(sprintf('AC accounts "%s"', $query)); | ||||
|         $result      = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit')); | ||||
| 
 | ||||
|         // set date to subday + end-of-day for account balance. so it is at $date 23:59:59
 | ||||
|         // set date to end-of-day for account balance. so it is at $date 23:59:59
 | ||||
|         $date->endOfDay(); | ||||
| 
 | ||||
|         $allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary); | ||||
|   | ||||
| @@ -28,8 +28,10 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Amount; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
| @@ -96,6 +98,7 @@ class PiggyBankController extends Controller | ||||
| 
 | ||||
|         /** @var PiggyBank $piggy */ | ||||
|         foreach ($piggies as $piggy) { | ||||
|             /** @var TransactionCurrency $currency */ | ||||
|             $currency      = $piggy->transactionCurrency; | ||||
|             $currentAmount = $this->piggyRepository->getCurrentAmount($piggy); | ||||
|             $objectGroup   = $piggy->objectGroups()->first(); | ||||
| @@ -105,8 +108,8 @@ class PiggyBankController extends Controller | ||||
|                 'name_with_balance'       => sprintf( | ||||
|                     '%s (%s / %s)', | ||||
|                     $piggy->name, | ||||
|                     app('amount')->formatAnything($currency, $currentAmount, false), | ||||
|                     app('amount')->formatAnything($currency, $piggy->target_amount, false), | ||||
|                     Amount::formatAnything($currency, $currentAmount, false), | ||||
|                     Amount::formatAnything($currency, $piggy->target_amount, false), | ||||
|                 ), | ||||
|                 'currency_id'             => (string) $currency->id, | ||||
|                 'currency_name'           => $currency->name, | ||||
|   | ||||
| @@ -24,10 +24,10 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
| 
 | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; | ||||
|   | ||||
| @@ -259,60 +259,6 @@ class BudgetController extends Controller | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
|     //    /**
 | ||||
|     //     * Function that processes each budget limit (per budget).
 | ||||
|     //     *
 | ||||
|     //     * If you have a budget limit in EUR, only transactions in EUR will be considered.
 | ||||
|     //     * If you have a budget limit in GBP, only transactions in GBP will be considered.
 | ||||
|     //     *
 | ||||
|     //     * If you have a budget limit in EUR, and a transaction in GBP, it will not be considered for the EUR budget limit.
 | ||||
|     //     *
 | ||||
|     //     * @throws FireflyException
 | ||||
|     //     */
 | ||||
|     //    private function budgetLimits(Budget $budget, Collection $limits): array
 | ||||
|     //    {
 | ||||
|     //        Log::debug(sprintf('Now in budgetLimits(#%d)', $budget->id));
 | ||||
|     //        $data = [];
 | ||||
|     //
 | ||||
|     //        /** @var BudgetLimit $limit */
 | ||||
|     //        foreach ($limits as $limit) {
 | ||||
|     //            $data = array_merge($data, $this->processLimit($budget, $limit));
 | ||||
|     //        }
 | ||||
|     //
 | ||||
|     //        return $data;
 | ||||
|     //    }
 | ||||
| 
 | ||||
|     //    /**
 | ||||
|     //     * @throws FireflyException
 | ||||
|     //     */
 | ||||
|     //    private function processLimit(Budget $budget, BudgetLimit $limit): array
 | ||||
|     //    {
 | ||||
|     //        Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__));
 | ||||
|     //        $end             = clone $limit->end_date;
 | ||||
|     //        $end->endOfDay();
 | ||||
|     //        $spent           = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection()->push($budget));
 | ||||
|     //        $limitCurrencyId = $limit->transaction_currency_id;
 | ||||
|     //
 | ||||
|     //        /** @var array $entry */
 | ||||
|     //        // only spent the entry where the entry's currency matches the budget limit's currency
 | ||||
|     //        // so $filtered will only have 1 or 0 entries
 | ||||
|     //        $filtered        = array_filter($spent, fn ($entry) => $entry['currency_id'] === $limitCurrencyId);
 | ||||
|     //        $result          = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end);
 | ||||
|     //        if (1 === count($result)) {
 | ||||
|     //            $compare                              = bccomp($limit->amount, (string)app('steam')->positive($result[$limitCurrencyId]['spent']));
 | ||||
|     //            $result[$limitCurrencyId]['budgeted'] = $limit->amount;
 | ||||
|     //            if (1 === $compare) {
 | ||||
|     //                // convert this amount into the primary currency:
 | ||||
|     //                $result[$limitCurrencyId]['left'] = bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']);
 | ||||
|     //            }
 | ||||
|     //            if ($compare <= 0) {
 | ||||
|     //                $result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']));
 | ||||
|     //            }
 | ||||
|     //        }
 | ||||
|     //
 | ||||
|     //        return $result;
 | ||||
|     //    }
 | ||||
| 
 | ||||
|     private function filterLimit(int $currencyId, Collection $limits): ?BudgetLimit | ||||
|     { | ||||
|         $amount    = '0'; | ||||
|   | ||||
| @@ -107,11 +107,11 @@ class CategoryController extends Controller | ||||
|             $type                           = $journal['transaction_type_type']; | ||||
|             $currency                       = $currencies[$journalCurrencyId] ?? $this->currencyRepos->find($journalCurrencyId); | ||||
|             $currencies[$journalCurrencyId] = $currency; | ||||
|             $currencyId                     = (int)$currency->id; | ||||
|             $currencyName                   = (string)$currency->name; | ||||
|             $currencyCode                   = (string)$currency->code; | ||||
|             $currencySymbol                 = (string)$currency->symbol; | ||||
|             $currencyDecimalPlaces          = (int)$currency->decimal_places; | ||||
|             $currencyId                     = $currency->id; | ||||
|             $currencyName                   = $currency->name; | ||||
|             $currencyCode                   = $currency->code; | ||||
|             $currencySymbol                 = $currency->symbol; | ||||
|             $currencyDecimalPlaces          = $currency->decimal_places; | ||||
|             $amount                         = Steam::positive((string)$journal['amount']); | ||||
|             $pcAmount                       = null; | ||||
| 
 | ||||
| @@ -120,11 +120,11 @@ class CategoryController extends Controller | ||||
|                 $pcAmount = $amount; | ||||
|             } | ||||
|             if ($this->convertToPrimary && $journalCurrencyId !== $this->primaryCurrency->id) { | ||||
|                 $currencyId            = (int)$this->primaryCurrency->id; | ||||
|                 $currencyName          = (string)$this->primaryCurrency->name; | ||||
|                 $currencyCode          = (string)$this->primaryCurrency->code; | ||||
|                 $currencySymbol        = (string)$this->primaryCurrency->symbol; | ||||
|                 $currencyDecimalPlaces = (int)$this->primaryCurrency->decimal_places; | ||||
|                 $currencyId            = $this->primaryCurrency->id; | ||||
|                 $currencyName          = $this->primaryCurrency->name; | ||||
|                 $currencyCode          = $this->primaryCurrency->code; | ||||
|                 $currencySymbol        = $this->primaryCurrency->symbol; | ||||
|                 $currencyDecimalPlaces = $this->primaryCurrency->decimal_places; | ||||
|                 $pcAmount              = $converter->convert($currency, $this->primaryCurrency, $journal['date'], $amount); | ||||
|                 Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->primaryCurrency->code, $pcAmount)); | ||||
|             } | ||||
| @@ -141,10 +141,10 @@ class CategoryController extends Controller | ||||
|                 'currency_symbol'                 => $currencySymbol, | ||||
|                 'currency_decimal_places'         => $currencyDecimalPlaces, | ||||
|                 'primary_currency_id'             => (string)$this->primaryCurrency->id, | ||||
|                 'primary_currency_name'           => (string)$this->primaryCurrency->name, | ||||
|                 'primary_currency_code'           => (string)$this->primaryCurrency->code, | ||||
|                 'primary_currency_symbol'         => (string)$this->primaryCurrency->symbol, | ||||
|                 'primary_currency_decimal_places' => (int)$this->primaryCurrency->decimal_places, | ||||
|                 'primary_currency_name'           => $this->primaryCurrency->name, | ||||
|                 'primary_currency_code'           => $this->primaryCurrency->code, | ||||
|                 'primary_currency_symbol'         => $this->primaryCurrency->symbol, | ||||
|                 'primary_currency_decimal_places' => $this->primaryCurrency->decimal_places, | ||||
|                 'period'                          => null, | ||||
|                 'start_date'                      => $start->toAtomString(), | ||||
|                 'end_date'                        => $end->toAtomString(), | ||||
|   | ||||
| @@ -67,6 +67,8 @@ abstract class Controller extends BaseController | ||||
| 
 | ||||
|     protected bool                $convertToPrimary = false; | ||||
|     protected TransactionCurrency $primaryCurrency; | ||||
| 
 | ||||
|     /** @deprecated use Request classes */ | ||||
|     protected ParameterBag        $parameters; | ||||
| 
 | ||||
|     /** | ||||
| @@ -98,7 +100,8 @@ abstract class Controller extends BaseController | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Method to grab all parameters from the URL. | ||||
|      * @deprecated use Request classes | ||||
|      * Method to grab all parameters from the URL | ||||
|      */ | ||||
|     private function getParameters(): ParameterBag | ||||
|     { | ||||
|   | ||||
| @@ -61,6 +61,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -100,6 +101,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -112,6 +114,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -124,6 +127,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -136,6 +140,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -148,6 +153,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -160,6 +166,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -172,6 +179,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
| @@ -184,6 +192,7 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws DatetimeException | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(ExportRequest $request): LaravelResponse | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| @@ -70,9 +69,6 @@ class ListController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Account $account): JsonResponse | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
| @@ -96,9 +92,6 @@ class ListController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function piggyBanks(Account $account): JsonResponse | ||||
|     { | ||||
|         // create some objects:
 | ||||
| @@ -135,8 +128,6 @@ class ListController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * Show all transaction groups related to the account. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Account $account): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -26,7 +26,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Account\ShowRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| @@ -68,46 +67,49 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(ShowRequest $request): JsonResponse | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
|         $params      = $request->getParameters(); | ||||
|         $this->parameters->set('type', $params['type']); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $types       = $this->mapAccountTypes($params['type']); | ||||
|         [ | ||||
|             'types'  => $types, | ||||
|             'page'   => $page, | ||||
|             'limit'  => $limit, | ||||
|             'offset' => $offset, | ||||
|             'sort'   => $sort, | ||||
|             'start'  => $start, | ||||
|             'end'    => $end, | ||||
|             'date'   => $date, | ||||
|         ] | ||||
|                      = $request->attributes->all(); | ||||
| 
 | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $collection  = $this->repository->getAccountsByType($types, $params['sort']); | ||||
|         $collection  = $this->repository->getAccountsByType($types, $sort); | ||||
|         $count       = $collection->count(); | ||||
| 
 | ||||
|         // continue sort:
 | ||||
|         // TODO if the user sorts on DB dependent field there must be no slice before enrichment, only after.
 | ||||
|         // TODO still need to figure out how to do this easily.
 | ||||
|         $accounts    = $collection->slice(($this->parameters->get('page') - 1) * $params['limit'], $params['limit']); | ||||
|         $accounts    = $collection->slice($offset, $limit); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setSort($params['sort']); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $enrichment->setSort($sort); | ||||
|         $enrichment->setDate($date); | ||||
|         $enrichment->setStart($start); | ||||
|         $enrichment->setEnd($end); | ||||
|         $enrichment->setUser($admin); | ||||
|         $accounts    = $enrichment->enrich($accounts); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($accounts, $count, $params['limit'], $this->parameters->get('page')); | ||||
|         $paginator   = new LengthAwarePaginator($accounts, $count, $limit, $page); | ||||
|         $paginator->setPath(route('api.v1.accounts.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| @@ -126,23 +128,23 @@ class ShowController extends Controller | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $account->refresh(); | ||||
|         $manager     = $this->getManager(); | ||||
|         $manager              = $this->getManager(); | ||||
|         [$start, $end, $date] = $request->attributes->all(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $admin                = auth()->user(); | ||||
|         $enrichment           = new AccountEnrichment(); | ||||
|         $enrichment->setDate($date); | ||||
|         $enrichment->setStart($start); | ||||
|         $enrichment->setEnd($end); | ||||
|         $enrichment->setUser($admin); | ||||
|         $account     = $enrichment->enrichSingle($account); | ||||
|         $account              = $enrichment->enrichSingle($account); | ||||
| 
 | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource    = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|         $transformer          = app(AccountTransformer::class); | ||||
|         $resource             = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -119,8 +119,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/listAttachment
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\AvailableBudget; | ||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment; | ||||
| @@ -67,8 +66,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/available_budgets/getAvailableBudget
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Bill; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| @@ -71,8 +70,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listAttachmentByBill
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Bill $bill): JsonResponse | ||||
|     { | ||||
| @@ -102,8 +99,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listRuleByBill
 | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function rules(Bill $bill): JsonResponse | ||||
|     { | ||||
| @@ -135,8 +130,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listTransactionByBill
 | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Bill $bill): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Bill; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||
| @@ -65,8 +64,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listBill
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -26,7 +26,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Budget; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| @@ -73,8 +72,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listAttachmentByBudget
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Budget $budget): JsonResponse | ||||
|     { | ||||
| @@ -104,8 +101,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudgetLimitByBudget
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function budgetLimits(Budget $budget): JsonResponse | ||||
|     { | ||||
| @@ -140,8 +135,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionByBudget
 | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Budget $budget): JsonResponse | ||||
|     { | ||||
| @@ -202,8 +195,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionWithoutBudget
 | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function withoutBudget(Request $request): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Budget; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| @@ -69,8 +68,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudget
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -67,7 +67,9 @@ class StoreController extends Controller | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $budget      = $this->repository->store($request->getAll()); | ||||
|         $data        = $request->getAll(); | ||||
|         $data['fire_webhooks'] ??= true; | ||||
|         $budget      = $this->repository->store($data); | ||||
|         $budget->refresh(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|   | ||||
| @@ -57,15 +57,10 @@ class UpdateController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudget
 | ||||
|      * | ||||
|      * Update a budget. | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data        = $request->getAll(); | ||||
|         $data['fire_webhooks'] ??= true; | ||||
|         $budget      = $this->repository->update($budget, $data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| @@ -49,8 +48,6 @@ class ListController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionByBudgetLimit
 | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -70,6 +70,7 @@ class StoreController extends Controller | ||||
|         $data               = $request->getAll(); | ||||
|         $data['start_date'] = $data['start']; | ||||
|         $data['end_date']   = $data['end']; | ||||
|         $data['fire_webhooks'] ??= true; | ||||
|         $data['budget_id']  = $budget->id; | ||||
| 
 | ||||
|         $budgetLimit        = $this->blRepository->store($data); | ||||
|   | ||||
| @@ -77,6 +77,7 @@ class UpdateController extends Controller | ||||
|             throw new FireflyException('20028: The budget limit does not belong to the budget.'); | ||||
|         } | ||||
|         $data              = $request->getAll(); | ||||
|         $data['fire_webhooks'] ??= true; | ||||
|         $data['budget_id'] = $budget->id; | ||||
|         $budgetLimit       = $this->blRepository->update($budgetLimit, $data); | ||||
|         $manager           = $this->getManager(); | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Category; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| @@ -68,8 +67,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/listAttachmentByCategory
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Category $category): JsonResponse | ||||
|     { | ||||
| @@ -99,8 +96,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/listTransactionByCategory
 | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Category $category): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Category; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment; | ||||
| @@ -65,8 +64,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/listCategory
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -72,7 +72,7 @@ class DestroyController extends Controller | ||||
|     public function destroySingleByDate(TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse | ||||
|     { | ||||
|         $exchangeRate = $this->repository->getSpecificRateOnDate($from, $to, $date); | ||||
|         if (null !== $exchangeRate) { | ||||
|         if ($exchangeRate instanceof CurrencyExchangeRate) { | ||||
|             $this->repository->deleteRate($exchangeRate); | ||||
|         } | ||||
| 
 | ||||
|   | ||||
| @@ -95,7 +95,7 @@ class ShowController extends Controller | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $exchangeRate = $this->repository->getSpecificRateOnDate($from, $to, $date); | ||||
|         if (null === $exchangeRate) { | ||||
|         if (!$exchangeRate instanceof CurrencyExchangeRate) { | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
| 
 | ||||
|   | ||||
| @@ -74,7 +74,7 @@ class UpdateController extends Controller | ||||
|     public function updateByDate(UpdateRequest $request, TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse | ||||
|     { | ||||
|         $exchangeRate = $this->repository->getSpecificRateOnDate($from, $to, $date); | ||||
|         if (null === $exchangeRate) { | ||||
|         if (!$exchangeRate instanceof CurrencyExchangeRate) { | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
|         $date         = $request->getDate(); | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||
| @@ -68,8 +67,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/listBillByObjectGroup
 | ||||
|      * | ||||
|      * List all bills in this object group | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function bills(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
| @@ -109,8 +106,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/listPiggyBankByObjectGroup
 | ||||
|      * | ||||
|      * List all piggies under the object group. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function piggyBanks(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\PiggyBank; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | ||||
| @@ -67,8 +66,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listAccountByPiggyBank
 | ||||
|      * | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function accounts(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
| @@ -105,8 +102,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listAttachmentByPiggyBank
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
| @@ -136,8 +131,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listEventByPiggyBank
 | ||||
|      * | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function piggyBankEvents(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\PiggyBank; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||
| @@ -65,8 +64,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listPiggyBank
 | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -68,10 +68,6 @@ class UpdateController extends Controller | ||||
|         $data        = $request->getAll(); | ||||
|         $piggyBank   = $this->repository->update($piggyBank, $data); | ||||
| 
 | ||||
|         if (array_key_exists('current_amount', $data) && '' !== $data['current_amount']) { | ||||
|             $this->repository->setCurrentAmount($piggyBank, $data['current_amount']); | ||||
|         } | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Recurrence; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| @@ -68,8 +67,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/recurrences/listTransactionByRecurrence
 | ||||
|      * | ||||
|      * Show transactions for this recurrence. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Recurrence; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||
| @@ -65,8 +64,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/recurrences/listRecurrence
 | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -87,9 +87,7 @@ class TriggerController extends Controller | ||||
| 
 | ||||
|         // enrich groups and return them:
 | ||||
| 
 | ||||
|         if (0 === $groups->count()) { | ||||
|             $paginator = new LengthAwarePaginator(new Collection(), 0, 1); | ||||
|         } | ||||
|         $paginator                  = new LengthAwarePaginator(new Collection(), 0, 1); | ||||
|         if ($groups->count() > 0) { | ||||
|             /** @var User $admin */ | ||||
|             $admin     = auth()->user(); | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Rule; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| @@ -67,8 +66,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/rules/listRule
 | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\RuleGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| @@ -64,8 +63,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/rule_groups/listRuleByGroup
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function rules(RuleGroup $group): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\RuleGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleGroupTransformer; | ||||
| @@ -66,8 +65,6 @@ class ShowController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/rule_groups/listRuleGroup
 | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Tag; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| @@ -71,8 +70,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/tags/listAttachmentByTag
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Tag $tag): JsonResponse | ||||
|     { | ||||
| @@ -102,8 +99,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/tags/listTransactionByTag
 | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Tag $tag): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Tag; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use FireflyIII\Transformers\TagTransformer; | ||||
| @@ -67,8 +66,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/tags/listTag
 | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Transaction; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface; | ||||
| @@ -69,8 +68,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/transactions/listAttachmentByTransaction
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(TransactionGroup $transactionGroup): JsonResponse | ||||
|     { | ||||
| @@ -101,8 +98,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/transactions/listEventByTransaction
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function piggyBankEvents(TransactionGroup $transactionGroup): JsonResponse | ||||
|     { | ||||
| @@ -144,8 +139,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/transactions/listLinksByJournal
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactionLinks(TransactionJournal $transactionJournal): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Transaction; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| @@ -52,8 +51,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/transactions/listTransaction
 | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionCurrency; | ||||
| 
 | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| @@ -32,6 +31,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| use Illuminate\Validation\ValidationException; | ||||
| 
 | ||||
| /** | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionCurrency; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\Bill; | ||||
| @@ -71,8 +70,6 @@ class ListController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listAccountByCurrency
 | ||||
|      * Display a list of accounts. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function accounts(Request $request, TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
| @@ -103,11 +100,18 @@ class ListController extends Controller | ||||
|         $count             = $collection->count(); | ||||
|         $accounts          = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // #11007 go to the end of the previous day.
 | ||||
|         $this->parameters->set('start', $this->parameters->get('start')?->subSecond()); | ||||
|         // #11018 also end of the day.
 | ||||
|         $this->parameters->set('end', $this->parameters->get('end')?->endOfDay()); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin             = auth()->user(); | ||||
|         $enrichment        = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $enrichment->setUser($admin); | ||||
|         $accounts          = $enrichment->enrich($accounts); | ||||
| 
 | ||||
| @@ -129,8 +133,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listAvailableBudgetByCurrency
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function availableBudgets(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
| @@ -164,8 +166,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listBillByCurrency
 | ||||
|      * | ||||
|      * List all bills | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function bills(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
| @@ -211,8 +211,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listBudgetLimitByCurrency
 | ||||
|      * | ||||
|      * List all budget limits | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function budgetLimits(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
| @@ -249,8 +247,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listRecurrenceByCurrency
 | ||||
|      * | ||||
|      * List all recurring transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function recurrences(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
| @@ -302,8 +298,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listRuleByCurrency
 | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function rules(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
| @@ -347,8 +341,6 @@ class ListController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listTransactionByCurrency
 | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionCurrency; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| @@ -69,8 +68,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/listCurrency
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
| @@ -99,8 +96,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/getCurrency
 | ||||
|      * | ||||
|      * Show a currency. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function show(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
| @@ -123,8 +118,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * Show a currency. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function showPrimary(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -26,7 +26,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\TransactionCurrency; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| @@ -66,8 +65,6 @@ class StoreController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/storeCurrency
 | ||||
|      * | ||||
|      * Store new currency. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -98,9 +98,6 @@ class UpdateController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function makePrimary(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
|         /** @var User $user */ | ||||
| @@ -127,8 +124,6 @@ class UpdateController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/enableCurrency
 | ||||
|      * | ||||
|      * Enable a currency. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function enable(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionLink; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionJournalLink; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Transformers\TransactionLinkTransformer; | ||||
| @@ -69,8 +68,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/links/listTransactionLink
 | ||||
|      * | ||||
|      * List all transaction links there are. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -24,10 +24,10 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionLink; | ||||
| 
 | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\TransactionLink\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionLinkType; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\LinkType; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| @@ -68,8 +67,6 @@ class ListController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/links/listTransactionByLinkType
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, LinkType $linkType): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionLinkType; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\LinkType; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| @@ -67,8 +66,6 @@ class ShowController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/links/listLinkType
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionLinkType; | ||||
| 
 | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\TransactionLinkType\StoreRequest; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| @@ -33,6 +32,7 @@ use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\LinkTypeTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| use Illuminate\Validation\ValidationException; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\TransactionLinkType; | ||||
| 
 | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\TransactionLinkType\UpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| @@ -35,6 +34,7 @@ use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\LinkTypeTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| use Illuminate\Validation\ValidationException; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
|   | ||||
| @@ -25,7 +25,7 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\UserGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\PaginationRequest; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\UserGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -52,17 +52,19 @@ class IndexController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function index(DateRequest $request): JsonResponse | ||||
|     public function index(PaginationRequest $request): JsonResponse | ||||
|     { | ||||
|         $administrations = $this->repository->get(); | ||||
|         $pageSize        = $this->parameters->get('limit'); | ||||
|         [ | ||||
|             'page'   => $page, | ||||
|             'limit'  => $limit, | ||||
|             'offset' => $offset, | ||||
|         ]                = $request->attributes->all(); | ||||
|         $count           = $administrations->count(); | ||||
|         $administrations = $administrations->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator       = new LengthAwarePaginator($administrations, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $administrations = $administrations->slice($offset, $limit); | ||||
|         $paginator       = new LengthAwarePaginator($administrations, $count, $limit, $page); | ||||
|         $transformer     = new UserGroupTransformer(); | ||||
| 
 | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|   | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Search; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||
| use FireflyIII\Support\Search\SearchInterface; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| @@ -42,8 +41,6 @@ class TransactionController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/search/searchTransactions
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function search(Request $request, SearchInterface $searcher): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -24,10 +24,10 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Summary; | ||||
| 
 | ||||
| use Exception; | ||||
| use Carbon\Carbon; | ||||
| use Exception; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRangeRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| @@ -94,10 +94,10 @@ class BasicController extends Controller | ||||
|      * | ||||
|      * @throws Exception | ||||
|      */ | ||||
|     public function basic(DateRequest $request): JsonResponse | ||||
|     public function basic(DateRangeRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for boxes:
 | ||||
|         $dates        = $request->getAll(); | ||||
|         $dates        = $request->attributes->all(); | ||||
|         $start        = $dates['start']; | ||||
|         $end          = $dates['end']; | ||||
|         $code         = $request->get('currency_code'); | ||||
| @@ -589,8 +589,6 @@ class BasicController extends Controller | ||||
| 
 | ||||
|     private function getNetWorthInfo(Carbon $end): array | ||||
|     { | ||||
|         $end->endOfDay(); | ||||
| 
 | ||||
|         /** @var User $user */ | ||||
|         $user           = auth()->user(); | ||||
|         Log::debug(sprintf('getNetWorthInfo up until "%s".', $end->format('Y-m-d H:i:s'))); | ||||
|   | ||||
| @@ -90,8 +90,6 @@ class UserController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/users/listUser
 | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -49,8 +49,6 @@ class PreferencesController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/preferences/listPreference
 | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -62,8 +62,6 @@ class MessageController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/webhooks/getWebhookMessages
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(Webhook $webhook): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -27,7 +27,6 @@ namespace FireflyIII\Api\V1\Controllers\Webhook; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Enums\WebhookTrigger; | ||||
| use FireflyIII\Events\RequestedSendWebhookMessages; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Generator\Webhook\MessageGeneratorInterface; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\Webhook; | ||||
| @@ -70,8 +69,6 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/webhooks/listWebhook
 | ||||
|      * | ||||
|      * Display a listing of the webhooks of the user. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
| @@ -158,18 +155,23 @@ class ShowController extends Controller | ||||
|         Log::debug(sprintf('Now in triggerTransaction(%d, %d)', $webhook->id, $group->id)); | ||||
|         Log::channel('audit')->info(sprintf('User triggers webhook #%d on transaction group #%d.', $webhook->id, $group->id)); | ||||
| 
 | ||||
|         /** @var MessageGeneratorInterface $engine */ | ||||
|         $engine = app(MessageGeneratorInterface::class); | ||||
|         $engine->setUser(auth()->user()); | ||||
| 
 | ||||
|         // tell the generator which trigger it should look for
 | ||||
|         $engine->setTrigger(WebhookTrigger::tryFrom($webhook->trigger)); | ||||
|         // tell the generator which objects to process
 | ||||
|         $engine->setObjects(new Collection()->push($group)); | ||||
|         // set the webhook to trigger
 | ||||
|         $engine->setWebhooks(new Collection()->push($webhook)); | ||||
|         // tell the generator to generate the messages
 | ||||
|         $engine->generateMessages(); | ||||
|         /** @var \FireflyIII\Models\WebhookTrigger $trigger */ | ||||
|         foreach ($webhook->webhookTriggers as $trigger) { | ||||
|             /** @var MessageGeneratorInterface $engine */ | ||||
|             $engine = app(MessageGeneratorInterface::class); | ||||
|             $engine->setUser(auth()->user()); | ||||
| 
 | ||||
|             // tell the generator which trigger it should look for
 | ||||
|             $engine->setTrigger(WebhookTrigger::tryFrom((int)$trigger->key)); | ||||
|             // tell the generator which objects to process
 | ||||
|             $engine->setObjects(new Collection()->push($group)); | ||||
|             // set the webhook to trigger
 | ||||
|             $engine->setWebhooks(new Collection()->push($webhook)); | ||||
|             // tell the generator to generate the messages
 | ||||
|             $engine->generateMessages(); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         // trigger event to send them:
 | ||||
|         Log::debug('send event RequestedSendWebhookMessages from ShowController::triggerTransaction()'); | ||||
|   | ||||
							
								
								
									
										92
									
								
								app/Api/V1/Requests/AggregateFormRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								app/Api/V1/Requests/AggregateFormRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Validation\Validator; | ||||
| use RuntimeException; | ||||
| 
 | ||||
| abstract class AggregateFormRequest extends ApiRequest | ||||
| { | ||||
|     /** | ||||
|      * @var ApiRequest[] | ||||
|      */ | ||||
|     protected array $requests = []; | ||||
| 
 | ||||
|     /** @return class-string[] */ | ||||
|     abstract protected function getRequests(): array; | ||||
| 
 | ||||
|     public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): void | ||||
|     { | ||||
|         parent::initialize($query, $request, $attributes, $cookies, $files, $server, $content); | ||||
| 
 | ||||
|         // instantiate all subrequests and share current requests' bags with them
 | ||||
|         foreach ($this->getRequests() as $config) { | ||||
|             $requestClass         = is_array($config) ? array_shift($config) : $config; | ||||
| 
 | ||||
|             if (!is_a($requestClass, Request::class, true)) { | ||||
|                 throw new RuntimeException('getRequests() must return class-strings of subclasses of Request'); | ||||
|             } | ||||
| 
 | ||||
|             $instance             = $this->requests[] = new $requestClass(); | ||||
|             $instance->request    = $this->request; | ||||
|             $instance->query      = $this->query; | ||||
|             $instance->attributes = $this->attributes; | ||||
|             $instance->cookies    = $this->cookies; | ||||
|             $instance->files      = $this->files; | ||||
|             $instance->server     = $this->server; | ||||
|             $instance->headers    = $this->headers; | ||||
| 
 | ||||
|             if ($instance instanceof ApiRequest) { | ||||
|                 $instance->handleConfig(is_array($config) ? $config : []); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         // check all subrequests for rules and combine them
 | ||||
|         return array_reduce( | ||||
|             $this->requests, | ||||
|             static fn (array $rules, FormRequest $request) => $rules | ||||
|                 + ( | ||||
|                     method_exists($request, 'rules') | ||||
|                     ? $request->rules() | ||||
|                     : [] | ||||
|                 ), | ||||
|             [], | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         // register all subrequests' validators
 | ||||
|         foreach ($this->requests as $request) { | ||||
|             if (method_exists($request, 'withValidator')) { | ||||
|                 $request->withValidator($validator); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								app/Api/V1/Requests/ApiRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								app/Api/V1/Requests/ApiRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| class ApiRequest extends FormRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     protected string $required = ''; | ||||
| 
 | ||||
|     public function handleConfig(array $config): void | ||||
|     { | ||||
|         if (in_array('required', $config, true)) { | ||||
|             $this->required = 'required'; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -48,10 +48,12 @@ class AutocompleteRequest extends FormRequest | ||||
|         // remove 'initial balance' from allowed types. its internal
 | ||||
|         $array = array_diff($array, [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value]); | ||||
| 
 | ||||
|         $date  = $this->getCarbonDate('date') ?? today(config('app.timezone')); | ||||
| 
 | ||||
|         return [ | ||||
|             'types' => $array, | ||||
|             'query' => $this->convertString('query'), | ||||
|             'date'  => $this->getCarbonDate('date'), | ||||
|             'date'  => $date->endOfDay(), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -24,13 +24,13 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Chart; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class ChartRequest | ||||
|   | ||||
| @@ -24,12 +24,12 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Data\Bulk; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class MoveTransactionsRequest | ||||
|   | ||||
| @@ -24,8 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Data\Bulk; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use JsonException; | ||||
| use FireflyIII\Enums\ClauseType; | ||||
| use FireflyIII\Rules\IsValidBulkClause; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| @@ -33,6 +31,8 @@ use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\Validation\Api\Data\Bulk\ValidatesBulkTransactionQuery; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| use JsonException; | ||||
| 
 | ||||
| use function Safe\json_decode; | ||||
| 
 | ||||
|   | ||||
| @@ -1,73 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * DateRequest.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Data; | ||||
| 
 | ||||
| use FireflyIII\Exceptions\ValidationException; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| /** | ||||
|  * Request class for end points that require date parameters. | ||||
|  * | ||||
|  * Class DateRequest | ||||
|  */ | ||||
| class DateRequest extends FormRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     /** | ||||
|      * Get all data from the request. | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         $start = $this->getCarbonDate('start'); | ||||
|         $end   = $this->getCarbonDate('end'); | ||||
|         $start->startOfDay(); | ||||
|         $end->endOfDay(); | ||||
|         if ($start->diffInYears($end, true) > 5) { | ||||
|             throw new ValidationException('Date range out of range.'); | ||||
|         } | ||||
| 
 | ||||
|         return [ | ||||
|             'start' => $start, | ||||
|             'end'   => $end, | ||||
|             'date'  => $this->getCarbonDate('date'), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The rules that the incoming request must be matched against. | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'date'  => 'date|after:1970-01-02|before:2038-01-17', | ||||
|             'start' => 'date|after:1970-01-02|before:2038-01-17|before:end|required_with:end', | ||||
|             'end'   => 'date|after:1970-01-02|before:2038-01-17|after:start|required_with:start', | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										53
									
								
								app/Api/V1/Requests/DateRangeRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								app/Api/V1/Requests/DateRangeRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class DateRangeRequest extends ApiRequest | ||||
| { | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start' => sprintf('date|after:1970-01-02|before:2038-01-17|before:end|required_with:end|', $this->required), | ||||
|             'end'   => sprintf('date|after:1970-01-02|before:2038-01-17|after:start|required_with:start|', $this->required), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if (!$validator->valid()) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $start = $this->getCarbonDate('start')?->startOfDay(); | ||||
|                 $end   = $this->getCarbonDate('end')?->endOfDay(); | ||||
| 
 | ||||
|                 $this->attributes->set('start', $start); | ||||
|                 $this->attributes->set('end', $end); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										57
									
								
								app/Api/V1/Requests/DateRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/Api/V1/Requests/DateRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class DateRequest extends ApiRequest | ||||
| { | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'date'  => 'date|after:1970-01-02|before:2038-01-17|'.$this->required, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if (!$validator->valid()) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $date  = $this->getCarbonDate('date')?->endOfDay(); | ||||
| 
 | ||||
|                 // if we also have a range, date must be in that range
 | ||||
|                 $start = $this->attributes->get('start'); | ||||
|                 $end   = $this->attributes->get('end'); | ||||
|                 if ($date && $start && $end && !$date->between($start, $end)) { | ||||
|                     $validator->errors()->add('date', (string)trans('validation.between_date')); | ||||
|                 } | ||||
| 
 | ||||
|                 $this->attributes->set('date', $date); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										57
									
								
								app/Api/V1/Requests/Models/Account/AccountTypeApiRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/Api/V1/Requests/Models/Account/AccountTypeApiRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <?php | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * AccountTypeApiRequest.php | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\ApiRequest; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class AccountTypeApiRequest extends ApiRequest | ||||
| { | ||||
|     use AccountFilter; | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'type'  => sprintf('in:%s', implode(',', array_keys($this->types))), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if (!$validator->valid()) { | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 $type = $this->convertString('type', 'all'); | ||||
|                 $this->attributes->add([ | ||||
|                     'type'  => $type, | ||||
|                     'types' => $this->mapAccountTypes($type), | ||||
|                 ]); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -23,77 +23,21 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Account; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Requests\AggregateFormRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRangeRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\PaginationRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Rules\IsValidSortInstruction; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| class ShowRequest extends FormRequest | ||||
| class ShowRequest extends AggregateFormRequest | ||||
| { | ||||
|     use AccountFilter; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     public function getParameters(): array | ||||
|     protected function getRequests(): array | ||||
|     { | ||||
|         $limit = $this->convertInteger('limit'); | ||||
|         if (0 === $limit) { | ||||
|             // get default for user:
 | ||||
|             /** @var User $user */ | ||||
|             $user  = auth()->user(); | ||||
|             $limit = (int)Preferences::getForUser($user, 'listPageSize', 50)->data; | ||||
|         } | ||||
| 
 | ||||
|         $page  = $this->convertInteger('page'); | ||||
|         $page  = min(max(1, $page), 2 ** 16); | ||||
| 
 | ||||
|         return [ | ||||
|             'type'  => $this->convertString('type', 'all'), | ||||
|             'limit' => $limit, | ||||
|             'sort'  => $this->convertSortParameters('sort', Account::class), | ||||
|             'page'  => $page, | ||||
|             [PaginationRequest::class, 'sort_class' => Account::class], | ||||
|             DateRangeRequest::class, | ||||
|             DateRequest::class, | ||||
|             AccountTypeApiRequest::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $keys = implode(',', array_keys($this->types)); | ||||
| 
 | ||||
|         return [ | ||||
|             'date'  => 'date', | ||||
|             'start' => 'date|present_with:end|before_or_equal:end|before:2038-01-17|after:1970-01-02', | ||||
|             'end'   => 'date|present_with:start|after_or_equal:start|before:2038-01-17|after:1970-01-02', | ||||
|             'sort'  => ['nullable', new IsValidSortInstruction(Account::class)], | ||||
|             'type'  => sprintf('in:%s', $keys), | ||||
|             'limit' => 'numeric|min:1|max:131337', | ||||
|             'page'  => 'numeric|min:1|max:131337', | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if (count($validator->failed()) > 0) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $data = $validator->getData(); | ||||
| 
 | ||||
| 
 | ||||
|                 if (array_key_exists('date', $data) && array_key_exists('start', $data) && array_key_exists('end', $data)) { | ||||
|                     // assume valid dates, before we got here.
 | ||||
|                     $start = Carbon::parse($data['start'], config('app.timezone'))->startOfDay(); | ||||
|                     $end   = Carbon::parse($data['end'], config('app.timezone'))->endOfDay(); | ||||
|                     $date  = Carbon::parse($data['date'], config('app.timezone')); | ||||
|                     if (!$date->between($start, $end)) { | ||||
|                         $validator->errors()->add('date', (string)trans('validation.between_date')); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Account; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\Location; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| @@ -36,6 +35,7 @@ use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
|   | ||||
| @@ -24,13 +24,13 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\AvailableBudget; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class Request | ||||
|   | ||||
| @@ -24,15 +24,15 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Bill; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use ValueError; | ||||
| use TypeError; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| use TypeError; | ||||
| use ValueError; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Bill; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| @@ -32,6 +31,7 @@ use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Budget; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| @@ -32,6 +31,7 @@ use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\Validation\AutoBudget\ValidatesAutoBudgetRequest; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
| @@ -48,17 +48,20 @@ class StoreRequest extends FormRequest | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         $fields = [ | ||||
|             'name'               => ['name', 'convertString'], | ||||
|             'active'             => ['active', 'boolean'], | ||||
|             'order'              => ['active', 'convertInteger'], | ||||
|             'notes'              => ['notes', 'convertString'], | ||||
|             'name'                    => ['name', 'convertString'], | ||||
|             'active'                  => ['active', 'boolean'], | ||||
|             'order'                   => ['active', 'convertInteger'], | ||||
|             'notes'                   => ['notes', 'convertString'], | ||||
| 
 | ||||
|             // auto budget currency:
 | ||||
|             'currency_id'        => ['auto_budget_currency_id', 'convertInteger'], | ||||
|             'currency_code'      => ['auto_budget_currency_code', 'convertString'], | ||||
|             'auto_budget_type'   => ['auto_budget_type', 'convertString'], | ||||
|             'auto_budget_amount' => ['auto_budget_amount', 'convertString'], | ||||
|             'auto_budget_period' => ['auto_budget_period', 'convertString'], | ||||
|             'currency_id'             => ['auto_budget_currency_id', 'convertInteger'], | ||||
|             'currency_code'           => ['auto_budget_currency_code', 'convertString'], | ||||
|             'auto_budget_type'        => ['auto_budget_type', 'convertString'], | ||||
|             'auto_budget_amount'      => ['auto_budget_amount', 'convertString'], | ||||
|             'auto_budget_period'      => ['auto_budget_period', 'convertString'], | ||||
| 
 | ||||
|             // webhooks
 | ||||
|             'fire_webhooks'           => ['fire_webhooks', 'boolean'], | ||||
|         ]; | ||||
| 
 | ||||
|         return $this->getAllData($fields); | ||||
| @@ -70,15 +73,18 @@ class StoreRequest extends FormRequest | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'name'               => 'required|min:1|max:255|uniqueObjectForUser:budgets,name', | ||||
|             'active'             => [new IsBoolean()], | ||||
|             'currency_id'        => 'exists:transaction_currencies,id', | ||||
|             'currency_code'      => 'exists:transaction_currencies,code', | ||||
|             'notes'              => 'nullable|min:1|max:32768', | ||||
|             'name'                       => 'required|min:1|max:255|uniqueObjectForUser:budgets,name', | ||||
|             'active'                     => [new IsBoolean()], | ||||
|             'currency_id'                => 'exists:transaction_currencies,id', | ||||
|             'currency_code'              => 'exists:transaction_currencies,code', | ||||
|             'notes'                      => 'nullable|min:1|max:32768', | ||||
|             // auto budget info
 | ||||
|             'auto_budget_type'   => 'in:reset,rollover,adjusted,none', | ||||
|             'auto_budget_amount' => ['required_if:auto_budget_type,reset', 'required_if:auto_budget_type,rollover', 'required_if:auto_budget_type,adjusted', new IsValidPositiveAmount()], | ||||
|             'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly|required_if:auto_budget_type,reset|required_if:auto_budget_type,rollover|required_if:auto_budget_type,adjusted', | ||||
|             'auto_budget_type'           => 'in:reset,rollover,adjusted,none', | ||||
|             'auto_budget_amount'         => ['required_if:auto_budget_type,reset', 'required_if:auto_budget_type,rollover', 'required_if:auto_budget_type,adjusted', new IsValidPositiveAmount()], | ||||
|             'auto_budget_period'         => 'in:daily,weekly,monthly,quarterly,half_year,yearly|required_if:auto_budget_type,reset|required_if:auto_budget_type,rollover|required_if:auto_budget_type,adjusted', | ||||
| 
 | ||||
|             // webhooks
 | ||||
|             'fire_webhooks'              => [new IsBoolean()], | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Budget; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| @@ -33,6 +32,7 @@ use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\Validation\AutoBudget\ValidatesAutoBudgetRequest; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
| @@ -50,15 +50,18 @@ class UpdateRequest extends FormRequest | ||||
|     { | ||||
|         // this is the way:
 | ||||
|         $fields  = [ | ||||
|             'name'               => ['name', 'convertString'], | ||||
|             'active'             => ['active', 'boolean'], | ||||
|             'order'              => ['order', 'convertInteger'], | ||||
|             'notes'              => ['notes', 'convertString'], | ||||
|             'currency_id'        => ['auto_budget_currency_id', 'convertInteger'], | ||||
|             'currency_code'      => ['auto_budget_currency_code', 'convertString'], | ||||
|             'auto_budget_type'   => ['auto_budget_type', 'convertString'], | ||||
|             'auto_budget_amount' => ['auto_budget_amount', 'convertString'], | ||||
|             'auto_budget_period' => ['auto_budget_period', 'convertString'], | ||||
|             'name'                    => ['name', 'convertString'], | ||||
|             'active'                  => ['active', 'boolean'], | ||||
|             'order'                   => ['order', 'convertInteger'], | ||||
|             'notes'                   => ['notes', 'convertString'], | ||||
|             'currency_id'             => ['auto_budget_currency_id', 'convertInteger'], | ||||
|             'currency_code'           => ['auto_budget_currency_code', 'convertString'], | ||||
|             'auto_budget_type'        => ['auto_budget_type', 'convertString'], | ||||
|             'auto_budget_amount'      => ['auto_budget_amount', 'convertString'], | ||||
|             'auto_budget_period'      => ['auto_budget_period', 'convertString'], | ||||
| 
 | ||||
|             // webhooks
 | ||||
|             'fire_webhooks'           => ['fire_webhooks', 'boolean'], | ||||
|         ]; | ||||
|         $allData = $this->getAllData($fields); | ||||
|         if (array_key_exists('auto_budget_type', $allData)) { | ||||
| @@ -83,14 +86,17 @@ class UpdateRequest extends FormRequest | ||||
|         $budget = $this->route()->parameter('budget'); | ||||
| 
 | ||||
|         return [ | ||||
|             'name'                      => sprintf('min:1|max:100|uniqueObjectForUser:budgets,name,%d', $budget->id), | ||||
|             'active'                    => [new IsBoolean()], | ||||
|             'notes'                     => 'nullable|min:1|max:32768', | ||||
|             'auto_budget_type'          => 'in:reset,rollover,adjusted,none', | ||||
|             'auto_budget_currency_id'   => 'exists:transaction_currencies,id', | ||||
|             'auto_budget_currency_code' => 'exists:transaction_currencies,code', | ||||
|             'auto_budget_amount'        => ['nullable', new IsValidPositiveAmount()], | ||||
|             'auto_budget_period'        => 'in:daily,weekly,monthly,quarterly,half_year,yearly', | ||||
|             'name'                       => sprintf('min:1|max:100|uniqueObjectForUser:budgets,name,%d', $budget->id), | ||||
|             'active'                     => [new IsBoolean()], | ||||
|             'notes'                      => 'nullable|min:1|max:32768', | ||||
|             'auto_budget_type'           => 'in:reset,rollover,adjusted,none', | ||||
|             'auto_budget_currency_id'    => 'exists:transaction_currencies,id', | ||||
|             'auto_budget_currency_code'  => 'exists:transaction_currencies,code', | ||||
|             'auto_budget_amount'         => ['nullable', new IsValidPositiveAmount()], | ||||
|             'auto_budget_period'         => 'in:daily,weekly,monthly,quarterly,half_year,yearly', | ||||
| 
 | ||||
|             // webhooks
 | ||||
|             'fire_webhooks'              => [new IsBoolean()], | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -24,10 +24,16 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\BudgetLimit; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Factory\TransactionCurrencyFactory; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| use FireflyIII\Support\Facades\Amount; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
| @@ -49,6 +55,9 @@ class StoreRequest extends FormRequest | ||||
|             'currency_id'   => $this->convertInteger('currency_id'), | ||||
|             'currency_code' => $this->convertString('currency_code'), | ||||
|             'notes'         => $this->stringWithNewlines('notes'), | ||||
| 
 | ||||
|             // for webhooks:
 | ||||
|             'fire_webhooks' => $this->boolean('fire_webhooks', true), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
| @@ -58,12 +67,59 @@ class StoreRequest extends FormRequest | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start'         => 'required|before:end|date', | ||||
|             'end'           => 'required|after:start|date', | ||||
|             'amount'        => ['required', new IsValidPositiveAmount()], | ||||
|             'currency_id'   => 'numeric|exists:transaction_currencies,id', | ||||
|             'currency_code' => 'min:3|max:51|exists:transaction_currencies,code', | ||||
|             'notes'         => 'nullable|min:0|max:32768', | ||||
|             'start'                      => 'required|before:end|date', | ||||
|             'end'                        => 'required|after:start|date', | ||||
|             'amount'                     => ['required', new IsValidPositiveAmount()], | ||||
|             'currency_id'                => 'numeric|exists:transaction_currencies,id', | ||||
|             'currency_code'              => 'min:3|max:51|exists:transaction_currencies,code', | ||||
|             'notes'                      => 'nullable|min:0|max:32768', | ||||
| 
 | ||||
|             // webhooks
 | ||||
|             'fire_webhooks'              => [new IsBoolean()], | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Configure the validator instance. | ||||
|      */ | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $budget = $this->route()->parameter('budget'); | ||||
|         $validator->after( | ||||
|             static function (Validator $validator) use ($budget): void { | ||||
|                 if (0 !== count($validator->failed())) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $data              = $validator->getData(); | ||||
| 
 | ||||
|                 // if no currency has been provided, use the user's default currency:
 | ||||
|                 /** @var TransactionCurrencyFactory $factory */ | ||||
|                 $factory           = app(TransactionCurrencyFactory::class); | ||||
|                 $currency          = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null); | ||||
|                 if (null === $currency) { | ||||
|                     $currency = Amount::getPrimaryCurrency(); | ||||
|                 } | ||||
|                 $currency->enabled = true; | ||||
|                 $currency->save(); | ||||
| 
 | ||||
|                 // validator already concluded start and end are valid dates:
 | ||||
|                 $start             = Carbon::parse($data['start'], config('app.timezone')); | ||||
|                 $end               = Carbon::parse($data['end'], config('app.timezone')); | ||||
| 
 | ||||
|                 // find limit with same date range and currency.
 | ||||
|                 $limit             = $budget->budgetlimits() | ||||
|                     ->where('budget_limits.start_date', $start->format('Y-m-d')) | ||||
|                     ->where('budget_limits.end_date', $end->format('Y-m-d')) | ||||
|                     ->where('budget_limits.transaction_currency_id', $currency->id) | ||||
|                     ->first(['budget_limits.*']) | ||||
|                 ; | ||||
|                 if (null !== $limit) { | ||||
|                     $validator->errors()->add('start', trans('validation.limit_exists')); | ||||
|                 } | ||||
|             } | ||||
|         ); | ||||
|         if ($validator->fails()) { | ||||
|             Log::channel('audit')->error(sprintf('Validation errors in %s', self::class), $validator->errors()->toArray()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -24,13 +24,14 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\BudgetLimit; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
| @@ -46,12 +47,15 @@ class UpdateRequest extends FormRequest | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         $fields = [ | ||||
|             'start'         => ['start', 'date'], | ||||
|             'end'           => ['end', 'date'], | ||||
|             'amount'        => ['amount', 'convertString'], | ||||
|             'currency_id'   => ['currency_id', 'convertInteger'], | ||||
|             'currency_code' => ['currency_code', 'convertString'], | ||||
|             'notes'         => ['notes', 'stringWithNewlines'], | ||||
|             'start'                   => ['start', 'date'], | ||||
|             'end'                     => ['end', 'date'], | ||||
|             'amount'                  => ['amount', 'convertString'], | ||||
|             'currency_id'             => ['currency_id', 'convertInteger'], | ||||
|             'currency_code'           => ['currency_code', 'convertString'], | ||||
|             'notes'                   => ['notes', 'stringWithNewlines'], | ||||
| 
 | ||||
|             // webhooks
 | ||||
|             'fire_webhooks'           => ['fire_webhooks', 'boolean'], | ||||
|         ]; | ||||
|         if (false === $this->has('notes')) { | ||||
|             // ignore notes, not submitted.
 | ||||
| @@ -67,12 +71,15 @@ class UpdateRequest extends FormRequest | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start'         => 'date|after:1970-01-02|before:2038-01-17', | ||||
|             'end'           => 'date|after:1970-01-02|before:2038-01-17', | ||||
|             'amount'        => ['nullable', new IsValidPositiveAmount()], | ||||
|             'currency_id'   => 'numeric|exists:transaction_currencies,id', | ||||
|             'currency_code' => 'min:3|max:51|exists:transaction_currencies,code', | ||||
|             'notes'         => 'nullable|min:0|max:32768', | ||||
|             'start'                      => 'date|after:1970-01-02|before:2038-01-17', | ||||
|             'end'                        => 'date|after:1970-01-02|before:2038-01-17', | ||||
|             'amount'                     => ['nullable', new IsValidPositiveAmount()], | ||||
|             'currency_id'                => 'numeric|exists:transaction_currencies,id', | ||||
|             'currency_code'              => 'min:3|max:51|exists:transaction_currencies,code', | ||||
|             'notes'                      => 'nullable|min:0|max:32768', | ||||
| 
 | ||||
|             // webhooks
 | ||||
|             'fire_webhooks'              => [new IsBoolean()], | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -28,8 +28,8 @@ use Carbon\Carbon; | ||||
| use Carbon\Exceptions\InvalidFormatException; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Validation\Validator; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class StoreByCurrenciesRequest extends FormRequest | ||||
| { | ||||
|   | ||||
| @@ -24,13 +24,13 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Support\Facades\Amount; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class StoreByDateRequest extends FormRequest | ||||
| { | ||||
|   | ||||
| @@ -24,15 +24,15 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\PiggyBank; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Support\Facades\Amount; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Rules\IsValidZeroOrMoreAmount; | ||||
| use FireflyIII\Support\Facades\Amount; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Recurrence; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Rules\BelongsUser; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidPositiveAmount; | ||||
| @@ -36,6 +35,7 @@ use FireflyIII\Validation\RecurrenceValidation; | ||||
| use FireflyIII\Validation\TransactionValidation; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Recurrence; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Rules\BelongsUser; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| @@ -37,6 +36,7 @@ use FireflyIII\Validation\RecurrenceValidation; | ||||
| use FireflyIII\Validation\TransactionValidation; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Rule; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidActionExpression; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| @@ -32,6 +31,7 @@ use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\Support\Request\GetRuleConfiguration; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Rule; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Rules\IsValidActionExpression; | ||||
| @@ -33,6 +32,7 @@ use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\Support\Request\GetRuleConfiguration; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Transaction; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Models\Location; | ||||
| use FireflyIII\Rules\BelongsUser; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| @@ -40,6 +39,7 @@ use FireflyIII\Validation\GroupValidation; | ||||
| use FireflyIII\Validation\TransactionValidation; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
| @@ -183,6 +183,7 @@ class StoreRequest extends FormRequest | ||||
|             // basic fields for group:
 | ||||
|             'group_title'                          => 'min:1|max:1000|nullable', | ||||
|             'error_if_duplicate_hash'              => [new IsBoolean()], | ||||
|             'fire_webhooks'                        => [new IsBoolean()], | ||||
|             'apply_rules'                          => [new IsBoolean()], | ||||
| 
 | ||||
|             // location rules
 | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Transaction; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Rules\BelongsUser; | ||||
| @@ -38,6 +37,7 @@ use FireflyIII\Validation\GroupValidation; | ||||
| use FireflyIII\Validation\TransactionValidation; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
| @@ -64,7 +64,7 @@ class UpdateRequest extends FormRequest | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $this->integerFields  = ['order', 'currency_id', 'foreign_currency_id', 'transaction_journal_id', 'source_id', 'destination_id', 'budget_id', 'category_id', 'bill_id', 'recurrence_id']; | ||||
|         $this->dateFields     = ['date', 'interest_date', 'book_date', 'process_date', 'due_date', 'payment_date', 'invoice_date']; | ||||
|         $this->textareaFields = ['notes']; | ||||
| @@ -97,7 +97,7 @@ class UpdateRequest extends FormRequest | ||||
|      */ | ||||
|     private function getTransactionData(): array | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $return       = []; | ||||
| 
 | ||||
|         /** @var null|array $transactions */ | ||||
| @@ -181,7 +181,7 @@ class UpdateRequest extends FormRequest | ||||
|     private function getDateData(array $current, array $transaction): array | ||||
|     { | ||||
|         foreach ($this->dateFields as $fieldName) { | ||||
|             app('log')->debug(sprintf('Now at date field %s', $fieldName)); | ||||
|             Log::debug(sprintf('Now at date field %s', $fieldName)); | ||||
|             if (array_key_exists($fieldName, $transaction)) { | ||||
|                 Log::debug(sprintf('New value: "%s"', $transaction[$fieldName])); | ||||
|                 $current[$fieldName] = $this->dateFromValue((string) $transaction[$fieldName]); | ||||
| @@ -247,7 +247,7 @@ class UpdateRequest extends FormRequest | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $validProtocols = config('firefly.valid_url_protocols'); | ||||
| 
 | ||||
|         return [ | ||||
| @@ -330,7 +330,7 @@ class UpdateRequest extends FormRequest | ||||
|      */ | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         app('log')->debug('Now in withValidator'); | ||||
|         Log::debug('Now in withValidator'); | ||||
| 
 | ||||
|         /** @var TransactionGroup $transactionGroup */ | ||||
|         $transactionGroup = $this->route()->parameter('transactionGroup'); | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\TransactionLink; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| @@ -32,6 +31,7 @@ use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreRequest | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\TransactionLink; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Models\TransactionJournalLink; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| @@ -32,6 +31,7 @@ use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateRequest | ||||
|   | ||||
							
								
								
									
										84
									
								
								app/Api/V1/Requests/PaginationRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								app/Api/V1/Requests/PaginationRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use FireflyIII\Rules\IsValidSortInstruction; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Validation\Validator; | ||||
| use RuntimeException; | ||||
| 
 | ||||
| class PaginationRequest extends ApiRequest | ||||
| { | ||||
|     private ?string $sortClass = null; | ||||
| 
 | ||||
|     public function handleConfig(array $config): void | ||||
|     { | ||||
|         parent::handleConfig($config); | ||||
| 
 | ||||
|         $this->sortClass = $config['sort_class'] ?? null; | ||||
| 
 | ||||
|         if (!$this->sortClass) { | ||||
|             throw new RuntimeException('PaginationRequest requires a sort_class config'); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'sort'  => ['nullable', new IsValidSortInstruction($this->sortClass)], | ||||
|             'limit' => 'numeric|min:1|max:131337', | ||||
|             'page'  => 'numeric|min:1|max:131337', | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if (!$validator->valid()) { | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 $limit  = $this->convertInteger('limit'); | ||||
|                 if (0 === $limit) { | ||||
|                     // get default for user:
 | ||||
|                     /** @var User $user */ | ||||
|                     $user  = auth()->user(); | ||||
|                     $limit = (int)Preferences::getForUser($user, 'listPageSize', 50)->data; | ||||
|                 } | ||||
| 
 | ||||
|                 $page   = $this->convertInteger('page'); | ||||
|                 $page   = min(max(1, $page), 2 ** 16); | ||||
|                 $offset = ($page - 1) * $limit; | ||||
|                 $sort   = $this->sortClass ? $this->convertSortParameters('sort', $this->sortClass) : $this->get('sort'); | ||||
| 
 | ||||
|                 $this->attributes->set('limit', $limit); | ||||
|                 $this->attributes->set('sort', $sort); | ||||
|                 $this->attributes->set('page', $page); | ||||
|                 $this->attributes->set('offset', $offset); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -24,13 +24,13 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\System; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| use FireflyIII\Rules\IsBoolean; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| /** | ||||
|  * Class UserUpdateRequest | ||||
|   | ||||
| @@ -28,7 +28,6 @@ namespace FireflyIII\Casts; | ||||
| use Carbon\Carbon; | ||||
| use Illuminate\Contracts\Database\Eloquent\CastsAttributes; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Class SeparateTimezoneCaster | ||||
|   | ||||
| @@ -92,7 +92,6 @@ class ConvertsDatesToUTC extends Command | ||||
|         $this->friendlyInfo(sprintf('Converting field "%s" of model "%s" to UTC.', $field, $shortModel)); | ||||
|         $items->each( | ||||
|             function ($item) use ($field, $timezoneField): void { | ||||
|                 /** @var Carbon $date */ | ||||
|                 $date                   = Carbon::parse($item->{$field}, $item->{$timezoneField}); // @phpstan-ignore-line
 | ||||
|                 $date->setTimezone('UTC'); | ||||
|                 $item->{$field}         = $date->format('Y-m-d H:i:s'); // @phpstan-ignore-line
 | ||||
|   | ||||
| @@ -29,12 +29,15 @@ use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Factory\AccountFactory; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\Transaction; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Illuminate\Console\Command; | ||||
| use Illuminate\Database\Eloquent\Builder; | ||||
| use Illuminate\Database\Query\JoinClause; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| class CorrectsAccountTypes extends Command | ||||
| { | ||||
| @@ -45,6 +48,7 @@ class CorrectsAccountTypes extends Command | ||||
|     private int            $count; | ||||
|     private array          $expected; | ||||
|     private AccountFactory $factory; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * Execute the console command. | ||||
| @@ -110,7 +114,7 @@ class CorrectsAccountTypes extends Command | ||||
|         if ($resultSet->count() > 0) { | ||||
|             $this->friendlyLine(sprintf('Found %d journals that need to be fixed.', $resultSet->count())); | ||||
|             foreach ($resultSet as $entry) { | ||||
|                 app('log')->debug(sprintf('Now fixing journal #%d', $entry->id)); | ||||
|                 Log::debug(sprintf('Now fixing journal #%d', $entry->id)); | ||||
| 
 | ||||
|                 /** @var null|TransactionJournal $journal */ | ||||
|                 $journal = TransactionJournal::find($entry->id); | ||||
| @@ -120,7 +124,7 @@ class CorrectsAccountTypes extends Command | ||||
|             } | ||||
|         } | ||||
|         if (0 !== $this->count) { | ||||
|             app('log')->debug(sprintf('%d journals had to be fixed.', $this->count)); | ||||
|             Log::debug(sprintf('%d journals had to be fixed.', $this->count)); | ||||
|             $this->friendlyInfo(sprintf('Acted on %d transaction(s)', $this->count)); | ||||
|         } | ||||
| 
 | ||||
| @@ -134,10 +138,10 @@ class CorrectsAccountTypes extends Command | ||||
| 
 | ||||
|     private function inspectJournal(TransactionJournal $journal): void | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now inspecting journal #%d', $journal->id)); | ||||
|         Log::debug(sprintf('Now inspecting journal #%d', $journal->id)); | ||||
|         $transactions      = $journal->transactions()->count(); | ||||
|         if (2 !== $transactions) { | ||||
|             app('log')->debug(sprintf('Journal has %d transactions, so can\'t fix.', $transactions)); | ||||
|             Log::debug(sprintf('Journal has %d transactions, so can\'t fix.', $transactions)); | ||||
|             $this->friendlyError(sprintf('Cannot inspect transaction journal #%d because it has %d transaction(s) instead of 2.', $journal->id, $transactions)); | ||||
| 
 | ||||
|             return; | ||||
| @@ -151,20 +155,20 @@ class CorrectsAccountTypes extends Command | ||||
|         $destAccountType   = $destAccount->accountType->type; | ||||
| 
 | ||||
|         if (!array_key_exists($type, $this->expected)) { | ||||
|             app('log')->info(sprintf('No source/destination info for transaction type %s.', $type)); | ||||
|             Log::info(sprintf('No source/destination info for transaction type %s.', $type)); | ||||
|             $this->friendlyError(sprintf('No source/destination info for transaction type %s.', $type)); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
|         if (!array_key_exists($sourceAccountType, $this->expected[$type])) { | ||||
|             app('log')->debug(sprintf('[a] Going to fix journal #%d', $journal->id)); | ||||
|             Log::debug(sprintf('[a] Going to fix journal #%d', $journal->id)); | ||||
|             $this->fixJournal($journal, $type, $sourceTransaction, $destTransaction); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
|         $expectedTypes     = $this->expected[$type][$sourceAccountType]; | ||||
|         if (!in_array($destAccountType, $expectedTypes, true)) { | ||||
|             app('log')->debug(sprintf('[b] Going to fix journal #%d', $journal->id)); | ||||
|             Log::debug(sprintf('[b] Going to fix journal #%d', $journal->id)); | ||||
|             $this->fixJournal($journal, $type, $sourceTransaction, $destTransaction); | ||||
|         } | ||||
|     } | ||||
| @@ -181,13 +185,15 @@ class CorrectsAccountTypes extends Command | ||||
| 
 | ||||
|     private function fixJournal(TransactionJournal $journal, string $transactionType, Transaction $source, Transaction $dest): void | ||||
|     { | ||||
|         app('log')->debug(sprintf('Going to fix journal #%d', $journal->id)); | ||||
|         Log::debug(sprintf('Going to fix journal #%d', $journal->id)); | ||||
|         $this->repository       = app(AccountRepositoryInterface::class); | ||||
|         $this->repository->setUser($journal->user); | ||||
|         ++$this->count; | ||||
|         // variables:
 | ||||
|         $sourceType           = $source->account->accountType->type; | ||||
|         $destinationType      = $dest->account->accountType->type; | ||||
|         $combination          = sprintf('%s%s%s', $transactionType, $source->account->accountType->type, $dest->account->accountType->type); | ||||
|         app('log')->debug(sprintf('Combination is "%s"', $combination)); | ||||
|         $sourceType             = $source->account->accountType->type; | ||||
|         $destinationType        = $dest->account->accountType->type; | ||||
|         $combination            = sprintf('%s%s%s', $transactionType, $source->account->accountType->type, $dest->account->accountType->type); | ||||
|         Log::debug(sprintf('Combination is "%s"', $combination)); | ||||
| 
 | ||||
|         if ($this->shouldBeTransfer($transactionType, $sourceType, $destinationType)) { | ||||
|             $this->makeTransfer($journal); | ||||
| @@ -211,37 +217,45 @@ class CorrectsAccountTypes extends Command | ||||
|         } | ||||
| 
 | ||||
|         // transaction has no valid source.
 | ||||
|         $validSources         = array_keys($this->expected[$transactionType]); | ||||
|         $canCreateSource      = $this->canCreateSource($validSources); | ||||
|         $hasValidSource       = $this->hasValidAccountType($validSources, $sourceType); | ||||
|         $validSources           = array_keys($this->expected[$transactionType]); | ||||
|         $canCreateSource        = $this->canCreateSource($validSources); | ||||
|         $hasValidSource         = $this->hasValidAccountType($validSources, $sourceType); | ||||
|         if (!$hasValidSource && $canCreateSource) { | ||||
|             $this->giveNewRevenue($journal, $source); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
|         if (!$canCreateSource && !$hasValidSource) { | ||||
|             app('log')->debug('This transaction type has no source we can create. Just give error.'); | ||||
|             Log::debug('This transaction type has no source we can create. Just give error.'); | ||||
|             $message = sprintf('The source account of %s #%d cannot be of type "%s". Firefly III cannot fix this. You may have to remove the transaction yourself.', $transactionType, $journal->id, $source->account->accountType->type); | ||||
|             $this->friendlyError($message); | ||||
|             app('log')->debug($message); | ||||
|             Log::debug($message); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         /** @var array $validDestinations */ | ||||
|         $validDestinations    = $this->expected[$transactionType][$sourceType] ?? []; | ||||
|         $canCreateDestination = $this->canCreateDestination($validDestinations); | ||||
|         $hasValidDestination  = $this->hasValidAccountType($validDestinations, $destinationType); | ||||
|         $validDestinations      = $this->expected[$transactionType][$sourceType] ?? []; | ||||
|         $canCreateDestination   = $this->canCreateDestination($validDestinations); | ||||
|         $hasValidDestination    = $this->hasValidAccountType($validDestinations, $destinationType); | ||||
|         $alternativeDestination = $this->repository->findByName($dest->account->name, $validDestinations); | ||||
|         if (!$hasValidDestination && $canCreateDestination) { | ||||
|             $this->giveNewExpense($journal, $dest); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
|         if (!$canCreateDestination && !$hasValidDestination) { | ||||
|             app('log')->debug('This transaction type has no destination we can create. Just give error.'); | ||||
|         if (!$canCreateDestination && !$hasValidDestination && null === $alternativeDestination) { | ||||
|             Log::debug('This transaction type has no destination we can create. Just give error.'); | ||||
|             $message = sprintf('The destination account of %s #%d cannot be of type "%s". Firefly III cannot fix this. You may have to remove the transaction yourself.', $transactionType, $journal->id, $dest->account->accountType->type); | ||||
|             $this->friendlyError($message); | ||||
|             app('log')->debug($message); | ||||
|             Log::debug($message); | ||||
|         } | ||||
|         if (!$canCreateDestination && !$hasValidDestination && null !== $alternativeDestination) { | ||||
|             Log::debug('This transaction type has no destination we can create, but found alternative with the same name.'); | ||||
|             $message = sprintf('The destination account of %s #%d cannot be of type "%s". Firefly III found an alternative account. Please make sure this transaction is correct.', $transactionType, $journal->transaction_group_id, $dest->account->accountType->type); | ||||
|             $this->friendlyInfo($message); | ||||
|             Log::debug($message); | ||||
|             $this->giveNewDestinationAccount($journal, $alternativeDestination); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @@ -263,7 +277,7 @@ class CorrectsAccountTypes extends Command | ||||
|         $journal->save(); | ||||
|         $message    = sprintf('Converted transaction #%d from a transfer to a withdrawal.', $journal->id); | ||||
|         $this->friendlyInfo($message); | ||||
|         app('log')->debug($message); | ||||
|         Log::debug($message); | ||||
|         // check it again:
 | ||||
|         $this->inspectJournal($journal); | ||||
|     } | ||||
| @@ -281,7 +295,7 @@ class CorrectsAccountTypes extends Command | ||||
|         $journal->save(); | ||||
|         $message = sprintf('Converted transaction #%d from a transfer to a deposit.', $journal->id); | ||||
|         $this->friendlyInfo($message); | ||||
|         app('log')->debug($message); | ||||
|         Log::debug($message); | ||||
|         // check it again:
 | ||||
|         $this->inspectJournal($journal); | ||||
|     } | ||||
| @@ -308,7 +322,7 @@ class CorrectsAccountTypes extends Command | ||||
|             $result->name | ||||
|         ); | ||||
|         $this->friendlyWarning($message); | ||||
|         app('log')->debug($message); | ||||
|         Log::debug($message); | ||||
|         $this->inspectJournal($journal); | ||||
|     } | ||||
| 
 | ||||
| @@ -335,7 +349,7 @@ class CorrectsAccountTypes extends Command | ||||
|             $result->name | ||||
|         ); | ||||
|         $this->friendlyWarning($message); | ||||
|         app('log')->debug($message); | ||||
|         Log::debug($message); | ||||
|         $this->inspectJournal($journal); | ||||
|     } | ||||
| 
 | ||||
| @@ -354,14 +368,14 @@ class CorrectsAccountTypes extends Command | ||||
| 
 | ||||
|     private function giveNewRevenue(TransactionJournal $journal, Transaction $source): void | ||||
|     { | ||||
|         app('log')->debug(sprintf('An account of type "%s" could be a valid source.', AccountTypeEnum::REVENUE->value)); | ||||
|         Log::debug(sprintf('An account of type "%s" could be a valid source.', AccountTypeEnum::REVENUE->value)); | ||||
|         $this->factory->setUser($journal->user); | ||||
|         $name      = $source->account->name; | ||||
|         $newSource = $this->factory->findOrCreate($name, AccountTypeEnum::REVENUE->value); | ||||
|         $source->account()->associate($newSource); | ||||
|         $source->save(); | ||||
|         $this->friendlyPositive(sprintf('Firefly III gave transaction #%d a new source %s: #%d ("%s").', $journal->transaction_group_id, AccountTypeEnum::REVENUE->value, $newSource->id, $newSource->name)); | ||||
|         app('log')->debug(sprintf('Associated account #%d with transaction #%d', $newSource->id, $source->id)); | ||||
|         Log::debug(sprintf('Associated account #%d with transaction #%d', $newSource->id, $source->id)); | ||||
|         $this->inspectJournal($journal); | ||||
|     } | ||||
| 
 | ||||
| @@ -372,14 +386,33 @@ class CorrectsAccountTypes extends Command | ||||
| 
 | ||||
|     private function giveNewExpense(TransactionJournal $journal, Transaction $destination): void | ||||
|     { | ||||
|         app('log')->debug(sprintf('An account of type "%s" could be a valid destination.', AccountTypeEnum::EXPENSE->value)); | ||||
|         Log::debug(sprintf('An account of type "%s" could be a valid destination.', AccountTypeEnum::EXPENSE->value)); | ||||
|         $this->factory->setUser($journal->user); | ||||
|         $name           = $destination->account->name; | ||||
|         $newDestination = $this->factory->findOrCreate($name, AccountTypeEnum::EXPENSE->value); | ||||
|         $destination->account()->associate($newDestination); | ||||
|         $destination->save(); | ||||
|         $this->friendlyPositive(sprintf('Firefly III gave transaction #%d a new destination %s: #%d ("%s").', $journal->transaction_group_id, AccountTypeEnum::EXPENSE->value, $newDestination->id, $newDestination->name)); | ||||
|         app('log')->debug(sprintf('Associated account #%d with transaction #%d', $newDestination->id, $destination->id)); | ||||
|         Log::debug(sprintf('Associated account #%d with transaction #%d', $newDestination->id, $destination->id)); | ||||
|         $this->inspectJournal($journal); | ||||
|     } | ||||
| 
 | ||||
|     private function giveNewDestinationAccount(TransactionJournal $journal, Account $newDestination): void | ||||
|     { | ||||
|         $destTransaction             = $this->getDestinationTransaction($journal); | ||||
|         $oldDest                     = $destTransaction->account; | ||||
|         $destTransaction->account_id = $newDestination->id; | ||||
|         $destTransaction->save(); | ||||
|         $message                     = sprintf( | ||||
|             'Transaction journal #%d, destination account changed from #%d ("%s") to #%d ("%s").', | ||||
|             $journal->id, | ||||
|             $oldDest->id, | ||||
|             $oldDest->name, | ||||
|             $newDestination->id, | ||||
|             $newDestination->name | ||||
|         ); | ||||
|         $this->friendlyInfo($message); | ||||
|         $journal->refresh(); | ||||
|         Log::debug($message); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -75,7 +75,8 @@ class CorrectsDatabase extends Command | ||||
|             'correction:recalculates-liabilities', | ||||
|             'correction:preferences', | ||||
|             // 'correction:transaction-types', // resource heavy, disabled.
 | ||||
|             'correction:recalculate-pc-amounts', // not necessary, disabled.
 | ||||
|             'correction:recalculate-pc-amounts', | ||||
|             'correction:remove-links-to-deleted-objects', | ||||
|             'firefly-iii:report-integrity', | ||||
|         ]; | ||||
|         foreach ($commands as $command) { | ||||
|   | ||||
| @@ -34,6 +34,7 @@ use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Illuminate\Console\Command; | ||||
| use Illuminate\Support\Collection; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| class CorrectsOpeningBalanceCurrencies extends Command | ||||
| { | ||||
| @@ -78,7 +79,7 @@ class CorrectsOpeningBalanceCurrencies extends Command | ||||
|         $account = $this->getAccount($journal); | ||||
|         if (!$account instanceof Account) { | ||||
|             $message = sprintf('Transaction journal #%d has no valid account. Can\'t fix this line.', $journal->id); | ||||
|             app('log')->warning($message); | ||||
|             Log::warning($message); | ||||
|             $this->friendlyError($message); | ||||
| 
 | ||||
|             return 0; | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use Illuminate\Console\Command; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| class CorrectsTransferBudgets extends Command | ||||
| { | ||||
| @@ -53,13 +54,13 @@ class CorrectsTransferBudgets extends Command | ||||
|         foreach ($set as $entry) { | ||||
|             $message = sprintf('Transaction journal #%d is a %s, so has no longer a budget.', $entry->id, $entry->transactionType->type); | ||||
|             $this->friendlyInfo($message); | ||||
|             app('log')->debug($message); | ||||
|             Log::debug($message); | ||||
|             $entry->budgets()->sync([]); | ||||
|             ++$count; | ||||
|         } | ||||
|         if (0 !== $count) { | ||||
|             $message = sprintf('Corrected %d invalid budget/journal entries (entry).', $count); | ||||
|             app('log')->debug($message); | ||||
|             Log::debug($message); | ||||
|             $this->friendlyInfo($message); | ||||
|         } | ||||
| 
 | ||||
|   | ||||
| @@ -35,8 +35,8 @@ use FireflyIII\Support\Models\AccountBalanceCalculator; | ||||
| use Illuminate\Console\Command; | ||||
| use Illuminate\Support\Facades\DB; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use ValueError; | ||||
| use stdClass; | ||||
| use ValueError; | ||||
| 
 | ||||
| class CorrectsUnevenAmount extends Command | ||||
| { | ||||
| @@ -152,7 +152,7 @@ class CorrectsUnevenAmount extends Command | ||||
|                     $entry->the_sum | ||||
|                 ); | ||||
|                 $this->friendlyWarning($message); | ||||
|                 app('log')->warning($message); | ||||
|                 Log::warning($message); | ||||
|                 ++$this->count; | ||||
| 
 | ||||
|                 continue; | ||||
| @@ -230,7 +230,7 @@ class CorrectsUnevenAmount extends Command | ||||
|         $message             = sprintf('Sum of journal #%d is not zero, journal is broken and now fixed.', $journal->id); | ||||
| 
 | ||||
|         $this->friendlyWarning($message); | ||||
|         app('log')->warning($message); | ||||
|         Log::warning($message); | ||||
| 
 | ||||
|         $destination->amount = $amount; | ||||
|         $destination->save(); | ||||
|   | ||||
| @@ -24,11 +24,11 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Console\Commands\Correction; | ||||
| 
 | ||||
| use Exception; | ||||
| use FireflyIII\Console\Commands\ShowsFriendlyMessages; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Console\Command; | ||||
| use Exception; | ||||
| 
 | ||||
| class CreatesAccessTokens extends Command | ||||
| { | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user