mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 10:47:00 +00:00 
			
		
		
		
	Compare commits
	
		
			369 Commits
		
	
	
		
			develop-20
			...
			develop-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 71d39707d9 | ||
|  | 9ccb8ae692 | ||
|  | 8cd50bb5bd | ||
|  | ae9e1278e5 | ||
|  | 58c03797b2 | ||
|  | 7db38b4c6c | ||
|  | da6b447e64 | ||
|  | c19ac2b0f3 | ||
|  | d5ca2171b3 | ||
|  | 20972cb29f | ||
|  | 7b714d0866 | ||
|  | 240ae8fa57 | ||
|  | 5a2f6b2652 | ||
|  | 4196ce31f0 | ||
|  | be8ca5db50 | ||
|  | 30a417ea3c | ||
|  | 695ed940e0 | ||
|  | 1353554cf8 | ||
|  | e1ba2732af | ||
|  | 42b57c0e0e | ||
|  | a6072753b2 | ||
|  | e92c224c39 | ||
|  | a3ed7ec8f6 | ||
|  | 17a2f99dff | ||
|  | c14971543c | ||
|  | 55f899608d | ||
|  | 83be63f27e | ||
|  | ed48d190e5 | ||
|  | 3c3b6615e6 | ||
|  | e71e5a877b | ||
|  | b2a65dc660 | ||
|  | d66dccd076 | ||
|  | c1128b28f2 | ||
|  | da8e78c28d | ||
|  | f50aa6b0ce | ||
|  | 661e4e53e6 | ||
|  | 3eeda4a6aa | ||
|  | 4dba9cea21 | ||
|  | 6aab5fab05 | ||
|  | 4b0597d19a | ||
|  | 92f534bcb3 | ||
|  | 76e91be4dc | ||
|  | deca4fed56 | ||
|  | 73512b0365 | ||
|  | aaffc125e7 | ||
|  | 41a48c39a0 | ||
|  | 2d96bd84b5 | ||
|  | ad1c1d2254 | ||
|  | 813206766d | ||
|  | bb25d4a82a | ||
|  | f3b78beecc | ||
|  | 64073768fe | ||
|  | fe6dd0f901 | ||
|  | aac8d11ff6 | ||
|  | afa99a35b5 | ||
|  | e9cb0a51d7 | ||
|  | 9fbcccfd02 | ||
|  | 468c9c9d56 | ||
|  | f76b27a73d | ||
|  | 579fe81616 | ||
|  | ec9ba53690 | ||
|  | 85337c53d4 | ||
|  | eb6d585bb2 | ||
|  | 378ffbc609 | ||
|  | 3b3c8e5bcd | ||
|  | 75cbdb6a57 | ||
|  | cdaff0d983 | ||
|  | dda3863889 | ||
|  | 57dc423b3f | ||
|  | c0570bc3b2 | ||
|  | 65110d1666 | ||
|  | 5a10b29402 | ||
|  | 028544ca2e | ||
|  | af46729372 | ||
|  | 4c7789a668 | ||
|  | 292908048c | ||
|  | e300314e05 | ||
|  | 4f1f360346 | ||
|  | bff856aeff | ||
|  | 7f5a1bda8d | ||
|  | b506281bd6 | ||
|  | dfe9b3e787 | ||
|  | 2428a2a7c5 | ||
|  | 0e8f608e00 | ||
|  | 70071767ab | ||
|  | 0ad6beb66c | ||
|  | 1197f65589 | ||
|  | 7bbf2dcc6f | ||
|  | d4ab69ebe6 | ||
|  | c8c552602e | ||
|  | 1921a8050b | ||
|  | f488feda93 | ||
|  | d90c033b83 | ||
|  | 9f256253f2 | ||
|  | 489b7c12e5 | ||
|  | 1049a8314d | ||
|  | 48301b6b9c | ||
|  | 5a92215921 | ||
|  | ccfc75852a | ||
|  | 9804cffff3 | ||
|  | 901e113fef | ||
|  | a4021ff056 | ||
|  | 902d91ad29 | ||
|  | fa2cf22e73 | ||
|  | 970dad4c49 | ||
|  | 9d01c7bdb8 | ||
|  | dc7d4fb258 | ||
|  | a807ca5002 | ||
|  | d59d326841 | ||
|  | b915548e82 | ||
|  | 8200a81840 | ||
|  | 6a49918707 | ||
|  | e55fc483bd | ||
|  | 4ff5f5883d | ||
|  | eda2eae04a | ||
|  | c07c30ea17 | ||
|  | 56f1eb03e0 | ||
|  | d4e14dd262 | ||
|  | 0c7f04fb17 | ||
|  | 061c01da53 | ||
|  | 716d72d8af | ||
|  | 3233ca4a4c | ||
|  | 1041030b1e | ||
|  | bb3b06cf08 | ||
|  | f35e361915 | ||
|  | 47d697c7dc | ||
|  | 3745d79f1f | ||
|  | 04cbff4b9a | ||
|  | 0c2ca4b97c | ||
|  | 3918665cd1 | ||
|  | 9eb8869649 | ||
|  | 62221af591 | ||
|  | 4d013a44ce | ||
|  | c55cfd1acf | ||
|  | b2652b83ce | ||
|  | 3d28932216 | ||
|  | 87567d5a31 | ||
|  | 37d45f4f87 | ||
|  | 4acf0828e4 | ||
|  | b5bab53e7a | ||
|  | 60b0dc6279 | ||
|  | 883994de19 | ||
|  | 62d72516ba | ||
|  | cfb86c683e | ||
|  | 6278662014 | ||
|  | 65dcad6898 | ||
|  | 8e7bcbdd7b | ||
|  | 084ce02c21 | ||
|  | ea6addafe6 | ||
|  | da36d84b79 | ||
|  | d6d9f665c7 | ||
|  | 73d2621255 | ||
|  | 4299ba033c | ||
|  | 6007687bcc | ||
|  | 6d3f2bd5e7 | ||
|  | 210bd83bd4 | ||
|  | 65a926874b | ||
|  | d0e7681e56 | ||
|  | 33bde854ec | ||
|  | da874c97f4 | ||
|  | aa7ec95a59 | ||
|  | 4dd77303f7 | ||
|  | 166d4bd842 | ||
|  | 54bf56bbb0 | ||
|  | 3d8c6671f4 | ||
|  | 4e33de9c29 | ||
|  | 27d46eb3fa | ||
|  | e1e7a2e497 | ||
|  | a476b4259c | ||
|  | 0c03ec5ddd | ||
|  | 2d95b7f8ef | ||
|  | 34cc79ce4f | ||
|  | 6ff9943fe0 | ||
|  | a0166b45e4 | ||
|  | d27b035b20 | ||
|  | f3b387fc22 | ||
|  | 03904ffcde | ||
|  | a7973190c2 | ||
|  | 671ff95f22 | ||
|  | 01181ceea9 | ||
|  | 97643639d1 | ||
|  | 424783c47b | ||
|  | ea0ced70b2 | ||
|  | 1a633e64ef | ||
|  | 30da3f4399 | ||
|  | 6bdff95d87 | ||
|  | 895ae279d5 | ||
|  | 8b57f45963 | ||
|  | a2d2b7edd3 | ||
|  | 3d65f00c6e | ||
|  | 333004c4d9 | ||
|  | 7451659824 | ||
|  | ec89c23ace | ||
|  | 92d07d346f | ||
|  | a7ac894af2 | ||
|  | 20f89e3a7c | ||
|  | 5d2f11c3c7 | ||
|  | 1eea79e431 | ||
|  | 1aaaac67ca | ||
|  | 1eb86639c9 | ||
|  | 28b911c4ee | ||
|  | c525c70ec0 | ||
|  | 1f7d6e218b | ||
|  | a69b6d9ce2 | ||
|  | 28b2ddde18 | ||
|  | a16cc73c77 | ||
|  | 46395e350a | ||
|  | f62e49090c | ||
|  | af3b40a314 | ||
|  | c3cea0fa9e | ||
|  | 6cbdb2ce70 | ||
|  | b78460100d | ||
|  | bf6e1cb0e1 | ||
|  | 6a53f5031c | ||
|  | ae15ec01e8 | ||
|  | fe3c7c47c4 | ||
|  | 68b934010c | ||
|  | 22852bd238 | ||
|  | 5b3b1804f3 | ||
|  | f2588eb343 | ||
|  | 64a643ceec | ||
|  | 1add505644 | ||
|  | 9663eb6a19 | ||
|  | f30a24a02f | ||
|  | 68655d60a6 | ||
|  | 63b0efcd81 | ||
|  | 93284682c8 | ||
|  | 3bafcb6ad2 | ||
|  | 942d027556 | ||
|  | a60882d5f5 | ||
|  | 680f554981 | ||
|  | 20e4dc07ce | ||
|  | 184d8eb027 | ||
|  | 59725b088a | ||
|  | 32fca4a9f5 | ||
|  | 7dccf6ec48 | ||
|  | 917665feac | ||
|  | 06c50b68c2 | ||
|  | 7035c399d8 | ||
|  | 7c0ac5805c | ||
|  | 3424741583 | ||
|  | baf0297994 | ||
|  | 31d06752fa | ||
|  | 8a27154798 | ||
|  | 6d87e38ec0 | ||
|  | ccdc30a6fb | ||
|  | 90005538d3 | ||
|  | f4e0428ebc | ||
|  | bd1326eca9 | ||
|  | bdfa834251 | ||
|  | 4a9aeb4e44 | ||
|  | 3886c0fbde | ||
|  | d998eff56e | ||
|  | d73df9bf0a | ||
|  | 754f2f3a34 | ||
|  | 43fd7c928a | ||
|  | 05768c2e73 | ||
|  | 3feb2c9955 | ||
|  | 7d9f3ac473 | ||
|  | 8a5755c8f1 | ||
|  | a75a760019 | ||
|  | 78d1a130d2 | ||
|  | 79fd43f32b | ||
|  | 7a7bd65a27 | ||
|  | 01a9ecccac | ||
|  | c1b3c71090 | ||
|  | 323d04fe6c | ||
|  | 80c2f1ea3f | ||
|  | 784494871d | ||
|  | 8e93af5cc7 | ||
|  | ebfdeeedaa | ||
|  | 1d02ed6a56 | ||
|  | cca53cb0e8 | ||
|  | ab33aee4b1 | ||
|  | 41d4fab071 | ||
|  | f0a1913dc6 | ||
|  | b956b463c2 | ||
|  | 43603c4990 | ||
|  | 196e738f60 | ||
|  | 59e2ea357a | ||
|  | 5e9d942069 | ||
|  | 53d5bedd85 | ||
|  | 49c68af07b | ||
|  | c84c8e1aef | ||
|  | a8d43d7174 | ||
|  | 1087278890 | ||
|  | ae5912ab52 | ||
|  | 035bd96ae5 | ||
|  | 7283c616a0 | ||
|  | 5706666bb6 | ||
|  | 4607466fb6 | ||
|  | 34bcfcfe9b | ||
|  | 05986cb6a6 | ||
|  | 0c4ee9f043 | ||
|  | ff222795cf | ||
|  | e0c76695ee | ||
|  | ae126e8322 | ||
|  | 8f9c35fbe8 | ||
|  | 84efd6e2ee | ||
|  | b1fbe4e909 | ||
|  | 8576877072 | ||
|  | c298aced01 | ||
|  | ac61a78d8d | ||
|  | fce90a94c4 | ||
|  | 023a4f178d | ||
|  | ef254995ad | ||
|  | faeb74634b | ||
|  | b5baae373f | ||
|  | 63de711cda | ||
|  | bd28d116cb | ||
|  | 7efc2861bc | ||
|  | 5c689a2ca2 | ||
|  | d5d65df76f | ||
|  | df7d4f700c | ||
|  | efebe3cb41 | ||
|  | 2ba5b6ae49 | ||
|  | 31d93efab2 | ||
|  | 657b95485c | ||
|  | 3bfc12f93b | ||
|  | ccfd2f2ac3 | ||
|  | fb3fe0d87b | ||
|  | c80c6d52fe | ||
|  | 0fb3c0c7bf | ||
|  | 43c625bee2 | ||
|  | 967a5dd256 | ||
|  | 3c9d1bcaa1 | ||
|  | 8cd2de14a9 | ||
|  | 7728a35e04 | ||
|  | 49000da123 | ||
|  | 32a8f89875 | ||
|  | 49e5a81bd3 | ||
|  | a8efe86af0 | ||
|  | 4f07b089d2 | ||
|  | e786bf47c2 | ||
|  | be11778c53 | ||
|  | 3d7325424c | ||
|  | f4ffed99ef | ||
|  | 52dfe9a738 | ||
|  | a0bc8b2ba2 | ||
|  | 4ffca9e2ca | ||
|  | a6afec9afa | ||
|  | 5d859222f8 | ||
|  | 0e3ba14666 | ||
|  | 860767fe5a | ||
|  | 91b0ad625c | ||
|  | 67bab2561a | ||
|  | b7908ebcb4 | ||
|  | a20601ea85 | ||
|  | 14622329a8 | ||
|  | 5577be7b08 | ||
|  | e3bab9d7d8 | ||
|  | e0512bee3d | ||
|  | 20827a5fd1 | ||
|  | 8819dac1e1 | ||
|  | da0a07262c | ||
|  | 9c195dcc66 | ||
|  | 0b45506e52 | ||
|  | 51e58f8d88 | ||
|  | d0c658e79a | ||
|  | 35e0791a9f | ||
|  | 637ecc66d2 | ||
|  | 3a38175b2a | ||
|  | d78fd86d7a | ||
|  | 395332d6dd | ||
|  | c5cbceb81a | ||
|  | adbf785aba | ||
|  | 1fae39a49d | ||
|  | 659240a98b | ||
|  | e9644c9679 | 
| @@ -19,26 +19,25 @@ | |||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| use PhpCsFixer\Runner\Parallel\ParallelConfigFactory; |  | ||||||
| 
 |  | ||||||
| $current = __DIR__; | $current = __DIR__; | ||||||
| 
 | 
 | ||||||
| $paths = [ | $paths = [ | ||||||
|     $current . '/../../app', |     $current . '/../../app', | ||||||
|     $current . '/../../config', |     $current . '/../../config', | ||||||
|     $current . '/../../database', |  | ||||||
|     $current . '/../../routes', |     $current . '/../../routes', | ||||||
|     $current . '/../../tests', |     $current . '/../../tests', | ||||||
|     $current . '/../../resources/lang/en_US', |  | ||||||
| ]; | ]; | ||||||
| 
 | 
 | ||||||
| $finder = PhpCsFixer\Finder::create() | $finder = PhpCsFixer\Finder::create() | ||||||
|                            ->in($paths); |                            ->in($paths); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| $config = new PhpCsFixer\Config(); | $config = (new PhpCsFixer\Config()) | ||||||
| $config->setParallelConfig(ParallelConfigFactory::detect()); |         // ->setUnsupportedPhpVersionAllowed(true) // use this when PHP 8.5 comes out.
 | ||||||
|  |         ->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()) | ||||||
|  |         ; | ||||||
| return $config->setRules( | return $config->setRules( | ||||||
|  | 
 | ||||||
|     [ |     [ | ||||||
|         // rule sets
 |         // rule sets
 | ||||||
|         '@PHP83Migration'               => true, |         '@PHP83Migration'               => true, | ||||||
| @@ -53,9 +52,6 @@ return $config->setRules( | |||||||
|         'statement_indentation'         => true, |         'statement_indentation'         => true, | ||||||
|         'void_return'                   => true, |         'void_return'                   => true, | ||||||
| 
 | 
 | ||||||
|         // about importing statements
 |  | ||||||
|         'global_namespace_import' => ['import_classes' => true, 'import_constants' => true, 'import_functions' => true], |  | ||||||
| 
 |  | ||||||
|         // disabled rules
 |         // disabled rules
 | ||||||
|         'native_function_invocation'    => false, // annoying
 |         'native_function_invocation'    => false, // annoying
 | ||||||
|         'php_unit_data_provider_name'   => false, // bloody annoying long test names
 |         'php_unit_data_provider_name'   => false, // bloody annoying long test names
 | ||||||
| @@ -64,9 +60,15 @@ return $config->setRules( | |||||||
|         'comment_to_phpdoc'             => false, // breaks phpstan lines in combination with PHPStorm.
 |         'comment_to_phpdoc'             => false, // breaks phpstan lines in combination with PHPStorm.
 | ||||||
|         'type_declaration_spaces'       => false, |         'type_declaration_spaces'       => false, | ||||||
|         'cast_spaces'                   => false, |         'cast_spaces'                   => false, | ||||||
|         'phpdoc_to_comment'             => false, // do not overrule single line comment style, breaks phpstan.
 | 
 | ||||||
|  |         // enabled rules
 | ||||||
|  |         'global_namespace_import' => true, // matches with rector.
 | ||||||
| 
 | 
 | ||||||
|         // complex rules
 |         // complex rules
 | ||||||
|  |         'phpdoc_to_comment' => ['ignored_tags' => ['var']], | ||||||
|  |         'php_unit_test_case_static_method_calls' => [ | ||||||
|  |             'call_type' => 'this', | ||||||
|  |         ], | ||||||
|         'array_syntax'                  => ['syntax' => 'short'], |         'array_syntax'                  => ['syntax' => 'short'], | ||||||
|         'binary_operator_spaces'        => [ |         'binary_operator_spaces'        => [ | ||||||
|             'default'   => 'at_least_single_space', |             'default'   => 'at_least_single_space', | ||||||
| @@ -76,5 +78,7 @@ return $config->setRules( | |||||||
|                 '??=' => 'align_single_space_minimal_by_scope', |                 '??=' => 'align_single_space_minimal_by_scope', | ||||||
|             ], |             ], | ||||||
|         ], |         ], | ||||||
|     ]) |     ] | ||||||
|  | 
 | ||||||
|  | ) | ||||||
|               ->setFinder($finder); |               ->setFinder($finder); | ||||||
|   | |||||||
							
								
								
									
										141
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										141
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							| @@ -406,58 +406,59 @@ | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "friendsofphp/php-cs-fixer", |             "name": "friendsofphp/php-cs-fixer", | ||||||
|             "version": "v3.75.0", |             "version": "v3.85.1", | ||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", |                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", | ||||||
|                 "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c" |                 "reference": "2fb6d7f6c3398dca5786a1635b27405d73a417ba" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/399a128ff2fdaf4281e4e79b755693286cdf325c", |                 "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2fb6d7f6c3398dca5786a1635b27405d73a417ba", | ||||||
|                 "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c", |                 "reference": "2fb6d7f6c3398dca5786a1635b27405d73a417ba", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
|                 "clue/ndjson-react": "^1.0", |                 "clue/ndjson-react": "^1.3", | ||||||
|                 "composer/semver": "^3.4", |                 "composer/semver": "^3.4", | ||||||
|                 "composer/xdebug-handler": "^3.0.3", |                 "composer/xdebug-handler": "^3.0.5", | ||||||
|                 "ext-filter": "*", |                 "ext-filter": "*", | ||||||
|                 "ext-hash": "*", |                 "ext-hash": "*", | ||||||
|                 "ext-json": "*", |                 "ext-json": "*", | ||||||
|                 "ext-tokenizer": "*", |                 "ext-tokenizer": "*", | ||||||
|                 "fidry/cpu-core-counter": "^1.2", |                 "fidry/cpu-core-counter": "^1.2", | ||||||
|                 "php": "^7.4 || ^8.0", |                 "php": "^7.4 || ^8.0", | ||||||
|                 "react/child-process": "^0.6.5", |                 "react/child-process": "^0.6.6", | ||||||
|                 "react/event-loop": "^1.0", |                 "react/event-loop": "^1.5", | ||||||
|                 "react/promise": "^2.0 || ^3.0", |                 "react/promise": "^3.2", | ||||||
|                 "react/socket": "^1.0", |                 "react/socket": "^1.16", | ||||||
|                 "react/stream": "^1.0", |                 "react/stream": "^1.4", | ||||||
|                 "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", |                 "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", | ||||||
|                 "symfony/console": "^5.4 || ^6.4 || ^7.0", |                 "symfony/console": "^5.4.47 || ^6.4.13 || ^7.0", | ||||||
|                 "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", |                 "symfony/event-dispatcher": "^5.4.45 || ^6.4.13 || ^7.0", | ||||||
|                 "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", |                 "symfony/filesystem": "^5.4.45 || ^6.4.13 || ^7.0", | ||||||
|                 "symfony/finder": "^5.4 || ^6.4 || ^7.0", |                 "symfony/finder": "^5.4.45 || ^6.4.17 || ^7.0", | ||||||
|                 "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", |                 "symfony/options-resolver": "^5.4.45 || ^6.4.16 || ^7.0", | ||||||
|                 "symfony/polyfill-mbstring": "^1.31", |                 "symfony/polyfill-mbstring": "^1.32", | ||||||
|                 "symfony/polyfill-php80": "^1.31", |                 "symfony/polyfill-php80": "^1.32", | ||||||
|                 "symfony/polyfill-php81": "^1.31", |                 "symfony/polyfill-php81": "^1.32", | ||||||
|                 "symfony/process": "^5.4 || ^6.4 || ^7.2", |                 "symfony/process": "^5.4.47 || ^6.4.20 || ^7.2", | ||||||
|                 "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" |                 "symfony/stopwatch": "^5.4.45 || ^6.4.19 || ^7.0" | ||||||
|             }, |             }, | ||||||
|             "require-dev": { |             "require-dev": { | ||||||
|                 "facile-it/paraunit": "^1.3.1 || ^2.6", |                 "facile-it/paraunit": "^1.3.1 || ^2.6", | ||||||
|                 "infection/infection": "^0.29.14", |                 "infection/infection": "^0.29.14", | ||||||
|                 "justinrainbow/json-schema": "^5.3 || ^6.2", |                 "justinrainbow/json-schema": "^5.3 || ^6.4", | ||||||
|                 "keradus/cli-executor": "^2.1", |                 "keradus/cli-executor": "^2.2", | ||||||
|                 "mikey179/vfsstream": "^1.6.12", |                 "mikey179/vfsstream": "^1.6.12", | ||||||
|                 "php-coveralls/php-coveralls": "^2.7", |                 "php-coveralls/php-coveralls": "^2.8", | ||||||
|                 "php-cs-fixer/accessible-object": "^1.1", |                 "php-cs-fixer/accessible-object": "^1.1", | ||||||
|                 "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", |                 "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", | ||||||
|                 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", |                 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", | ||||||
|                 "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12", |                 "phpunit/phpunit": "^9.6.23 || ^10.5.47 || ^11.5.25", | ||||||
|                 "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3", |                 "symfony/polyfill-php84": "^1.32", | ||||||
|                 "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3" |                 "symfony/var-dumper": "^5.4.48 || ^6.4.23 || ^7.3.1", | ||||||
|  |                 "symfony/yaml": "^5.4.45 || ^6.4.23 || ^7.3.1" | ||||||
|             }, |             }, | ||||||
|             "suggest": { |             "suggest": { | ||||||
|                 "ext-dom": "For handling output formats in XML", |                 "ext-dom": "For handling output formats in XML", | ||||||
| @@ -498,7 +499,7 @@ | |||||||
|             ], |             ], | ||||||
|             "support": { |             "support": { | ||||||
|                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", |                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", | ||||||
|                 "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.75.0" |                 "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.85.1" | ||||||
|             }, |             }, | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
| @@ -506,7 +507,7 @@ | |||||||
|                     "type": "github" |                     "type": "github" | ||||||
|                 } |                 } | ||||||
|             ], |             ], | ||||||
|             "time": "2025-03-31T18:40:42+00:00" |             "time": "2025-07-29T22:22:50+00:00" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "psr/container", |             "name": "psr/container", | ||||||
| @@ -1256,16 +1257,16 @@ | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "symfony/console", |             "name": "symfony/console", | ||||||
|             "version": "v7.3.0", |             "version": "v7.3.2", | ||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/symfony/console.git", |                 "url": "https://github.com/symfony/console.git", | ||||||
|                 "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44" |                 "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44", |                 "url": "https://api.github.com/repos/symfony/console/zipball/5f360ebc65c55265a74d23d7fe27f957870158a1", | ||||||
|                 "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44", |                 "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
| @@ -1330,7 +1331,7 @@ | |||||||
|                 "terminal" |                 "terminal" | ||||||
|             ], |             ], | ||||||
|             "support": { |             "support": { | ||||||
|                 "source": "https://github.com/symfony/console/tree/v7.3.0" |                 "source": "https://github.com/symfony/console/tree/v7.3.2" | ||||||
|             }, |             }, | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
| @@ -1341,12 +1342,16 @@ | |||||||
|                     "url": "https://github.com/fabpot", |                     "url": "https://github.com/fabpot", | ||||||
|                     "type": "github" |                     "type": "github" | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "url": "https://github.com/nicolas-grekas", | ||||||
|  |                     "type": "github" | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", |                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", | ||||||
|                     "type": "tidelift" |                     "type": "tidelift" | ||||||
|                 } |                 } | ||||||
|             ], |             ], | ||||||
|             "time": "2025-05-24T10:34:04+00:00" |             "time": "2025-07-30T17:13:41+00:00" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "symfony/deprecation-contracts", |             "name": "symfony/deprecation-contracts", | ||||||
| @@ -1573,16 +1578,16 @@ | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "symfony/filesystem", |             "name": "symfony/filesystem", | ||||||
|             "version": "v7.3.0", |             "version": "v7.3.2", | ||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/symfony/filesystem.git", |                 "url": "https://github.com/symfony/filesystem.git", | ||||||
|                 "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" |                 "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", |                 "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", | ||||||
|                 "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", |                 "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
| @@ -1619,7 +1624,7 @@ | |||||||
|             "description": "Provides basic utilities for the filesystem", |             "description": "Provides basic utilities for the filesystem", | ||||||
|             "homepage": "https://symfony.com", |             "homepage": "https://symfony.com", | ||||||
|             "support": { |             "support": { | ||||||
|                 "source": "https://github.com/symfony/filesystem/tree/v7.3.0" |                 "source": "https://github.com/symfony/filesystem/tree/v7.3.2" | ||||||
|             }, |             }, | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
| @@ -1630,25 +1635,29 @@ | |||||||
|                     "url": "https://github.com/fabpot", |                     "url": "https://github.com/fabpot", | ||||||
|                     "type": "github" |                     "type": "github" | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "url": "https://github.com/nicolas-grekas", | ||||||
|  |                     "type": "github" | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", |                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", | ||||||
|                     "type": "tidelift" |                     "type": "tidelift" | ||||||
|                 } |                 } | ||||||
|             ], |             ], | ||||||
|             "time": "2024-10-25T15:15:23+00:00" |             "time": "2025-07-07T08:17:47+00:00" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "symfony/finder", |             "name": "symfony/finder", | ||||||
|             "version": "v7.3.0", |             "version": "v7.3.2", | ||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/symfony/finder.git", |                 "url": "https://github.com/symfony/finder.git", | ||||||
|                 "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" |                 "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", |                 "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", | ||||||
|                 "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", |                 "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
| @@ -1683,7 +1692,7 @@ | |||||||
|             "description": "Finds files and directories via an intuitive fluent interface", |             "description": "Finds files and directories via an intuitive fluent interface", | ||||||
|             "homepage": "https://symfony.com", |             "homepage": "https://symfony.com", | ||||||
|             "support": { |             "support": { | ||||||
|                 "source": "https://github.com/symfony/finder/tree/v7.3.0" |                 "source": "https://github.com/symfony/finder/tree/v7.3.2" | ||||||
|             }, |             }, | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
| @@ -1694,25 +1703,29 @@ | |||||||
|                     "url": "https://github.com/fabpot", |                     "url": "https://github.com/fabpot", | ||||||
|                     "type": "github" |                     "type": "github" | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "url": "https://github.com/nicolas-grekas", | ||||||
|  |                     "type": "github" | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", |                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", | ||||||
|                     "type": "tidelift" |                     "type": "tidelift" | ||||||
|                 } |                 } | ||||||
|             ], |             ], | ||||||
|             "time": "2024-12-30T19:00:26+00:00" |             "time": "2025-07-15T13:41:35+00:00" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "symfony/options-resolver", |             "name": "symfony/options-resolver", | ||||||
|             "version": "v7.3.0", |             "version": "v7.3.2", | ||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/symfony/options-resolver.git", |                 "url": "https://github.com/symfony/options-resolver.git", | ||||||
|                 "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca" |                 "reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca", |                 "url": "https://api.github.com/repos/symfony/options-resolver/zipball/119bcf13e67dbd188e5dbc74228b1686f66acd37", | ||||||
|                 "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca", |                 "reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
| @@ -1750,7 +1763,7 @@ | |||||||
|                 "options" |                 "options" | ||||||
|             ], |             ], | ||||||
|             "support": { |             "support": { | ||||||
|                 "source": "https://github.com/symfony/options-resolver/tree/v7.3.0" |                 "source": "https://github.com/symfony/options-resolver/tree/v7.3.2" | ||||||
|             }, |             }, | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
| @@ -1761,12 +1774,16 @@ | |||||||
|                     "url": "https://github.com/fabpot", |                     "url": "https://github.com/fabpot", | ||||||
|                     "type": "github" |                     "type": "github" | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "url": "https://github.com/nicolas-grekas", | ||||||
|  |                     "type": "github" | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", |                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", | ||||||
|                     "type": "tidelift" |                     "type": "tidelift" | ||||||
|                 } |                 } | ||||||
|             ], |             ], | ||||||
|             "time": "2025-04-04T13:12:05+00:00" |             "time": "2025-07-15T11:36:08+00:00" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "symfony/polyfill-ctype", |             "name": "symfony/polyfill-ctype", | ||||||
| @@ -2451,16 +2468,16 @@ | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "symfony/string", |             "name": "symfony/string", | ||||||
|             "version": "v7.3.0", |             "version": "v7.3.2", | ||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/symfony/string.git", |                 "url": "https://github.com/symfony/string.git", | ||||||
|                 "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" |                 "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", |                 "url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca", | ||||||
|                 "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", |                 "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
| @@ -2518,7 +2535,7 @@ | |||||||
|                 "utf8" |                 "utf8" | ||||||
|             ], |             ], | ||||||
|             "support": { |             "support": { | ||||||
|                 "source": "https://github.com/symfony/string/tree/v7.3.0" |                 "source": "https://github.com/symfony/string/tree/v7.3.2" | ||||||
|             }, |             }, | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
| @@ -2529,12 +2546,16 @@ | |||||||
|                     "url": "https://github.com/fabpot", |                     "url": "https://github.com/fabpot", | ||||||
|                     "type": "github" |                     "type": "github" | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "url": "https://github.com/nicolas-grekas", | ||||||
|  |                     "type": "github" | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", |                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", | ||||||
|                     "type": "tidelift" |                     "type": "tidelift" | ||||||
|                 } |                 } | ||||||
|             ], |             ], | ||||||
|             "time": "2025-04-20T20:19:01+00:00" |             "time": "2025-07-10T08:47:49+00:00" | ||||||
|         } |         } | ||||||
|     ], |     ], | ||||||
|     "packages-dev": [], |     "packages-dev": [], | ||||||
|   | |||||||
| @@ -26,9 +26,10 @@ SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) | |||||||
| cd $SCRIPT_DIR/php-cs-fixer | cd $SCRIPT_DIR/php-cs-fixer | ||||||
| composer update --quiet | composer update --quiet | ||||||
| rm -f .php-cs-fixer.cache | rm -f .php-cs-fixer.cache | ||||||
| PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix \ | ./vendor/bin/php-cs-fixer fix \ | ||||||
|     --config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \ |     --config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \ | ||||||
|     --format=txt -v \ |     --format=txt \ | ||||||
|  |     -v \ | ||||||
|     --allow-risky=yes |     --allow-risky=yes | ||||||
|  |  | ||||||
| EXIT_CODE=$? | EXIT_CODE=$? | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ declare(strict_types=1); | |||||||
| 
 | 
 | ||||||
| use Rector\Config\RectorConfig; | use Rector\Config\RectorConfig; | ||||||
| use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector; | use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector; | ||||||
|  | use Rector\Php80\Rector\ClassMethod\AddParamBasedOnParentClassMethodRector; | ||||||
| use Rector\Transform\Rector\String_\StringToClassConstantRector; | use Rector\Transform\Rector\String_\StringToClassConstantRector; | ||||||
| use RectorLaravel\Set\LaravelLevelSetList; | use RectorLaravel\Set\LaravelLevelSetList; | ||||||
| 
 | 
 | ||||||
| @@ -32,6 +33,7 @@ use RectorLaravel\Set\LaravelLevelSetList; | |||||||
| return RectorConfig::configure() | return RectorConfig::configure() | ||||||
|     ->withSkip([ |     ->withSkip([ | ||||||
|         ChangeOrIfContinueToMultiContinueRector::class, |         ChangeOrIfContinueToMultiContinueRector::class, | ||||||
|  |         AddParamBasedOnParentClassMethodRector::class, | ||||||
|         StringToClassConstantRector::class => [ |         StringToClassConstantRector::class => [ | ||||||
|             __DIR__ . '/../app/Http/Controllers/Auth/LoginController.php', |             __DIR__ . '/../app/Http/Controllers/Auth/LoginController.php', | ||||||
|         ], |         ], | ||||||
|   | |||||||
| @@ -329,7 +329,7 @@ FIREFLY_III_LAYOUT=v1 | |||||||
| # Which Query Parser implementation to use for the search engine and rules | # Which Query Parser implementation to use for the search engine and rules | ||||||
| # 'new' is experimental, 'legacy' is the classic one | # 'new' is experimental, 'legacy' is the classic one | ||||||
| # | # | ||||||
| QUERY_PARSER_IMPLEMENTATION=legacy | QUERY_PARSER_IMPLEMENTATION=new | ||||||
|  |  | ||||||
| # | # | ||||||
| # Please make sure this URL matches the external URL of your Firefly III installation. | # Please make sure this URL matches the external URL of your Firefly III installation. | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								.github/ISSUE_TEMPLATE/bug.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/ISSUE_TEMPLATE/bug.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| name: Bug Report | name: Bug report | ||||||
| description: Report a bug in Firefly III (or associated tools) | description: Report a bug in Firefly III (or associated tools) | ||||||
| body: | body: | ||||||
|   - type: checkboxes |   - type: checkboxes | ||||||
| @@ -12,7 +12,7 @@ body: | |||||||
|   - type: checkboxes |   - type: checkboxes | ||||||
|     attributes: |     attributes: | ||||||
|       label: I've found a bug and checked that ... |       label: I've found a bug and checked that ... | ||||||
|       description: Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, explain in detail why. |       description: Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, please explain why. | ||||||
|       options: |       options: | ||||||
|         - label: ... [the documentation](https://docs.firefly-iii.org/) does not mention anything about my problem |         - label: ... [the documentation](https://docs.firefly-iii.org/) does not mention anything about my problem | ||||||
|         - label: ... there are no open or closed issues that are related to my problem |         - label: ... there are no open or closed issues that are related to my problem | ||||||
| @@ -33,13 +33,6 @@ body: | |||||||
|     validations: |     validations: | ||||||
|       required: true |       required: true | ||||||
|  |  | ||||||
|   - type: textarea |  | ||||||
|     attributes: |  | ||||||
|       label: Expected behaviour |  | ||||||
|       description: Please describe precisely what you'd expect to happen. Be specific. |  | ||||||
|     validations: |  | ||||||
|       required: false |  | ||||||
|  |  | ||||||
|   - type: textarea |   - type: textarea | ||||||
|     attributes: |     attributes: | ||||||
|       label: Steps to reproduce |       label: Steps to reproduce | ||||||
| @@ -54,4 +47,4 @@ body: | |||||||
|   - type: textarea |   - type: textarea | ||||||
|     attributes: |     attributes: | ||||||
|       label: Additional info |       label: Additional info | ||||||
|       description: Please provide any additional information that seem useful. |       description: Please provide any additional information that seems useful. | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							| @@ -3,3 +3,6 @@ contact_links: | |||||||
|   - name: Ask a question |   - name: Ask a question | ||||||
|     url: https://github.com/firefly-iii/firefly-iii/discussions |     url: https://github.com/firefly-iii/firefly-iii/discussions | ||||||
|     about: Please ask and answer questions here. |     about: Please ask and answer questions here. | ||||||
|  |   - name: I need support!  | ||||||
|  |     url: https://github.com/firefly-iii/firefly-iii/discussions | ||||||
|  |     about: I think I broke something... | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								.github/ISSUE_TEMPLATE/fr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/ISSUE_TEMPLATE/fr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| name: Feature Request | name: Feature request | ||||||
| description: Request a feature or enhancement in Firefly III (or associated tools) | description: Request a feature or enhancement in Firefly III (or associated tools) | ||||||
| body: | body: | ||||||
|   - type: checkboxes |   - type: checkboxes | ||||||
| @@ -31,11 +31,6 @@ body: | |||||||
|     validations: |     validations: | ||||||
|       required: true |       required: true | ||||||
|  |  | ||||||
|   - type: textarea |  | ||||||
|     attributes: |  | ||||||
|       label: What are alternatives? |  | ||||||
|       description: Please describe what alternatives currently exist. |  | ||||||
|  |  | ||||||
|   - type: textarea |   - type: textarea | ||||||
|     attributes: |     attributes: | ||||||
|       label: Additional context |       label: Additional context | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								.github/workflows/cleanup.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/cleanup.yml
									
									
									
									
										vendored
									
									
								
							| @@ -66,7 +66,6 @@ jobs: | |||||||
|               'label-actions.yml', |               'label-actions.yml', | ||||||
|               'lock.yml', |               'lock.yml', | ||||||
|               'release.yml', |               'release.yml', | ||||||
|               'sonarcloud.yml', |  | ||||||
|               'stale.yml' |               'stale.yml' | ||||||
|             ] |             ] | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -259,6 +259,12 @@ jobs: | |||||||
|             echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt |             echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt | ||||||
|             echo "" >> output.txt |             echo "" >> output.txt | ||||||
|             echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt |             echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt | ||||||
|  |  | ||||||
|  |             # donations! | ||||||
|  |             echo '' >> output.txt | ||||||
|  |             echo '### Support Firefly III' >> output.txt | ||||||
|  |             echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt | ||||||
|  |             echo '' >> output.txt | ||||||
|           fi |           fi | ||||||
|           # describe a branch release |           # describe a branch release | ||||||
|           if [[ "$version" == branch* ]]; then |           if [[ "$version" == branch* ]]; then | ||||||
| @@ -279,16 +285,31 @@ jobs: | |||||||
|           if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]] && [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then |           if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]] && [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then | ||||||
|             echo 'Describe the latest release' |             echo 'Describe the latest release' | ||||||
|             sudo chown -R runner:docker output.txt |             sudo chown -R runner:docker output.txt | ||||||
|  |  | ||||||
|  |             # the changelog is in output.txt | ||||||
|  |             mv output.txt output2.txt | ||||||
|  |  | ||||||
|             touch output.txt |             touch output.txt | ||||||
|             echo '' >> output.txt |             echo '' >> output.txt | ||||||
|             echo "Welcome to release $version of Firefly III. It contains the the latest fixes, translations and features. Docker users can find this release under the \`latest\` tag." >> output.txt |             echo "Welcome to release $version of Firefly III. It contains the the latest fixes, translations and features. Docker users can find this release under the \`latest\` tag." >> output.txt | ||||||
|             echo '' >> output.txt |             echo '' >> output.txt | ||||||
|  |  | ||||||
|  |             # add changelog to file. | ||||||
|  |             cat output2.txt >> output.txt | ||||||
|  |             echo '' >> output.txt | ||||||
|  |             rm -f output2.txt | ||||||
|  |  | ||||||
|             echo '### Instructions' >> output.txt |             echo '### Instructions' >> output.txt | ||||||
|             echo '' >> output.txt |             echo '' >> output.txt | ||||||
|             echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt |             echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt | ||||||
|             echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt |             echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt | ||||||
|             echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt |             echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt | ||||||
|  |  | ||||||
|  |             # donations! | ||||||
|  |             echo '' >> output.txt | ||||||
|  |             echo '### Support Firefly III' >> output.txt | ||||||
|  |             echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt | ||||||
|  |             echo '' >> output.txt | ||||||
|           fi |           fi | ||||||
|  |  | ||||||
|           # describe alpha release |           # describe alpha release | ||||||
| @@ -465,20 +486,27 @@ jobs: | |||||||
|       - name: Upload artifacts |       - name: Upload artifacts | ||||||
|         run: | |         run: | | ||||||
|           # add zip file to release. |           # add zip file to release. | ||||||
|  |           echo "Upload $zipName to $releaseName" | ||||||
|           gh release upload $releaseName $zipName |           gh release upload $releaseName $zipName | ||||||
|  |           echo "Upload $tarName to $releaseName" | ||||||
|           gh release upload $releaseName $tarName |           gh release upload $releaseName $tarName | ||||||
|  |  | ||||||
|           # add sha256 sum to release |           # add sha256 sum to release | ||||||
|  |           echo "Upload $zipName.sha256 to $releaseName" | ||||||
|           gh release upload $releaseName $zipName.sha256 |           gh release upload $releaseName $zipName.sha256 | ||||||
|  |           echo "Upload $tarName.sha256 to $releaseName" | ||||||
|           gh release upload $releaseName $tarName.sha256 |           gh release upload $releaseName $tarName.sha256 | ||||||
|  |  | ||||||
|           # add signatures to release |           # add signatures to release | ||||||
|  |           echo "Upload $zipName.asc to $releaseName" | ||||||
|           gh release upload $releaseName $zipName.asc |           gh release upload $releaseName $zipName.asc | ||||||
|  |           echo "Upload $tarName.asc to $releaseName" | ||||||
|           gh release upload $releaseName $tarName.asc |           gh release upload $releaseName $tarName.asc | ||||||
|  |  | ||||||
|           # get current HEAD and add as file to the release |           # get current HEAD and add as file to the release | ||||||
|           HEAD=$(git rev-parse HEAD) |           HEAD=$(git rev-parse HEAD) | ||||||
|           echo $HEAD > HEAD.txt |           echo $HEAD > HEAD.txt | ||||||
|  |           echo "Upload HEAD.txt to $releaseName" | ||||||
|           gh release upload $releaseName HEAD.txt |           gh release upload $releaseName HEAD.txt | ||||||
|  |  | ||||||
|           # remove all temporary files |           # remove all temporary files | ||||||
|   | |||||||
							
								
								
									
										71
									
								
								.github/workflows/sonarcloud.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										71
									
								
								.github/workflows/sonarcloud.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,71 +0,0 @@ | |||||||
| name: 'Code - Run Sonarcloud' |  | ||||||
| on: |  | ||||||
|   pull_request: |  | ||||||
|   workflow_dispatch: |  | ||||||
|   push: |  | ||||||
|     branches: |  | ||||||
|       - main |  | ||||||
| env: |  | ||||||
|   DB_CONNECTION: sqlite |  | ||||||
|   APP_KEY: TestTestTestTestTestTestTestTest |  | ||||||
| jobs: |  | ||||||
|   sonarcloud: |  | ||||||
|     name: SonarCloud |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     steps: |  | ||||||
|       - name: Checkout |  | ||||||
|         uses: actions/checkout@v4 |  | ||||||
|       - name: Setup PHP with Xdebug |  | ||||||
|         uses: shivammathur/setup-php@v2 |  | ||||||
|         with: |  | ||||||
|           php-version: '8.4' |  | ||||||
|           coverage: xdebug |  | ||||||
|           extensions: >- |  | ||||||
|             bcmath |  | ||||||
|             curl |  | ||||||
|             fileinfo |  | ||||||
|             iconv |  | ||||||
|             intl |  | ||||||
|             json |  | ||||||
|             sqlite3 |  | ||||||
|             mbstring |  | ||||||
|             openssl |  | ||||||
|             pdo |  | ||||||
|             session |  | ||||||
|             simplexml |  | ||||||
|             sodium |  | ||||||
|             tokenizer |  | ||||||
|             xml |  | ||||||
|             xmlwriter |  | ||||||
|  |  | ||||||
|       - name: Copy standard configuration |  | ||||||
|         run: cp .env.testing .env |  | ||||||
|  |  | ||||||
|       - name: Install Composer dependencies |  | ||||||
|         run: composer install --prefer-dist --no-interaction --no-progress --no-scripts |  | ||||||
|  |  | ||||||
|       - name: "Create database file" |  | ||||||
|         run: | |  | ||||||
|           touch storage/database/database.sqlite |  | ||||||
|           wget -q https://github.com/firefly-iii/test-fixtures/raw/refs/heads/main/test-database.sqlite -O storage/database/database.sqlite |  | ||||||
|  |  | ||||||
|       - name: "Upgrades the database to the latest version" |  | ||||||
|         run: | |  | ||||||
|           php artisan firefly-iii:upgrade-database |  | ||||||
|           chmod 600 storage/oauth-public.key |  | ||||||
|           chmod 600 storage/oauth-private.key |  | ||||||
|  |  | ||||||
|       - name: "Integrity Database Report" |  | ||||||
|         run: php artisan firefly-iii:report-integrity |  | ||||||
|  |  | ||||||
|       - name: "Run tests with coverage" |  | ||||||
|         run: composer coverage |  | ||||||
|  |  | ||||||
|       - name: Fix code coverage paths |  | ||||||
|         run: sed -i 's@'$GITHUB_WORKSPACE'@/github/workspace/@g' coverage.xml |  | ||||||
|  |  | ||||||
|       - name: SonarCloud Scan |  | ||||||
|         uses: SonarSource/sonarqube-scan-action@v5.2.0 |  | ||||||
|         env: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }} |  | ||||||
|           SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} |  | ||||||
| @@ -31,6 +31,7 @@ use FireflyIII\Exceptions\FireflyException; | |||||||
| use FireflyIII\Models\Account; | use FireflyIII\Models\Account; | ||||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||||
| use FireflyIII\Support\Debug\Timer; | use FireflyIII\Support\Debug\Timer; | ||||||
|  | use FireflyIII\Support\Facades\Amount; | ||||||
| use FireflyIII\Support\Facades\Steam; | use FireflyIII\Support\Facades\Steam; | ||||||
| use FireflyIII\Support\Http\Api\AccountFilter; | use FireflyIII\Support\Http\Api\AccountFilter; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| @@ -79,34 +80,33 @@ class AccountController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function accounts(AutocompleteRequest $request): JsonResponse |     public function accounts(AutocompleteRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $data   = $request->getData(); |         $data        = $request->getData(); | ||||||
|         $types  = $data['types']; |         $types       = $data['types']; | ||||||
|         $query  = $data['query']; |         $query       = $data['query']; | ||||||
|         $date   = $data['date'] ?? today(config('app.timezone')); |         $date        = $data['date'] ?? today(config('app.timezone')); | ||||||
|         $return = []; |         $return      = []; | ||||||
|         Timer::start(sprintf('AC accounts "%s"', $query)); |         $timer       = Timer::getInstance(); | ||||||
|         $result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit')); |         $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 subday + end-of-day for account balance. so it is at $date 23:59:59
 | ||||||
|         $date->endOfDay(); |         $date->endOfDay(); | ||||||
| 
 | 
 | ||||||
|  |         $allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary); | ||||||
|  | 
 | ||||||
|         /** @var Account $account */ |         /** @var Account $account */ | ||||||
|         foreach ($result as $account) { |         foreach ($result as $account) { | ||||||
|             $nameWithBalance = $account->name; |             $nameWithBalance = $account->name; | ||||||
|             $currency        = $this->repository->getAccountCurrency($account) ?? $this->nativeCurrency; |             $currency        = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency; | ||||||
|             $useCurrency     = $currency; |             $useCurrency     = $currency; | ||||||
|             if (in_array($account->accountType->type, $this->balanceTypes, true)) { |             if (in_array($account->accountType->type, $this->balanceTypes, true)) { | ||||||
|                 // this one is correct.
 |                 // this one is correct.
 | ||||||
|                 Log::debug(sprintf('accounts: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); |                 Log::debug(sprintf('accounts: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); | ||||||
|                 $balance         = Steam::finalAccountBalance($account, $date); |                 $balance         = $allBalances[$account->id] ?? []; | ||||||
|                 $key             = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? 'native_balance' : 'balance'; |                 $key             = $this->convertToPrimary && $currency->id !== $this->primaryCurrency->id ? 'pc_balance' : 'balance'; | ||||||
|                 $useCurrency     = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? $this->nativeCurrency : $currency; |                 $useCurrency     = $this->convertToPrimary && $currency->id !== $this->primaryCurrency->id ? $this->primaryCurrency : $currency; | ||||||
|                 $amount          = $balance[$key] ?? '0'; |                 $amount          = $balance[$key] ?? '0'; | ||||||
|                 $nameWithBalance = sprintf( |                 $nameWithBalance = sprintf('%s (%s)', $account->name, Amount::formatAnything($useCurrency, $amount, false)); | ||||||
|                     '%s (%s)', |  | ||||||
|                     $account->name, |  | ||||||
|                     app('amount')->formatAnything($useCurrency, $amount, false) |  | ||||||
|                 ); |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             $return[]        = [ |             $return[]        = [ | ||||||
| @@ -138,7 +138,7 @@ class AccountController extends Controller | |||||||
|                 return $posA - $posB; |                 return $posA - $posB; | ||||||
|             } |             } | ||||||
|         ); |         ); | ||||||
|         Timer::stop(sprintf('AC accounts "%s"', $query)); |         $timer->stop(sprintf('AC accounts "%s"', $query)); | ||||||
| 
 | 
 | ||||||
|         return response()->api($return); |         return response()->api($return); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ declare(strict_types=1); | |||||||
| 
 | 
 | ||||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||||
| 
 | 
 | ||||||
|  | use Deprecated; | ||||||
| use FireflyIII\Api\V1\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||||
| use FireflyIII\Models\TransactionCurrency; | use FireflyIII\Models\TransactionCurrency; | ||||||
| @@ -83,9 +84,8 @@ class CurrencyController extends Controller | |||||||
|     /** |     /** | ||||||
|      * Documentation for this endpoint is at: |      * Documentation for this endpoint is at: | ||||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
 |      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
 | ||||||
|      * |  | ||||||
|      * @deprecated |  | ||||||
|      */ |      */ | ||||||
|  |     #[Deprecated]
 | ||||||
|     public function currenciesWithCode(AutocompleteRequest $request): JsonResponse |     public function currenciesWithCode(AutocompleteRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $data       = $request->getData(); |         $data       = $request->getData(); | ||||||
|   | |||||||
| @@ -24,22 +24,25 @@ declare(strict_types=1); | |||||||
| 
 | 
 | ||||||
| namespace FireflyIII\Api\V1\Controllers\Chart; | namespace FireflyIII\Api\V1\Controllers\Chart; | ||||||
| 
 | 
 | ||||||
| use FireflyIII\Models\TransactionCurrency; |  | ||||||
| use Carbon\Carbon; | use Carbon\Carbon; | ||||||
| use FireflyIII\Api\V1\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Api\V1\Requests\Chart\ChartRequest; | use FireflyIII\Api\V1\Requests\Chart\ChartRequest; | ||||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||||
| use FireflyIII\Enums\AccountTypeEnum; | use FireflyIII\Enums\AccountTypeEnum; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
|  | use FireflyIII\Exceptions\ValidationException; | ||||||
| use FireflyIII\Models\Account; | use FireflyIII\Models\Account; | ||||||
| use FireflyIII\Models\Preference; | use FireflyIII\Models\Preference; | ||||||
|  | use FireflyIII\Models\TransactionCurrency; | ||||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||||
| use FireflyIII\Support\Chart\ChartData; | use FireflyIII\Support\Chart\ChartData; | ||||||
|  | use FireflyIII\Support\Facades\Preferences; | ||||||
| use FireflyIII\Support\Facades\Steam; | use FireflyIII\Support\Facades\Steam; | ||||||
| use FireflyIII\Support\Http\Api\ApiSupport; | use FireflyIII\Support\Http\Api\ApiSupport; | ||||||
| use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; | use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Class AccountController |  * Class AccountController | ||||||
| @@ -84,10 +87,12 @@ class AccountController extends Controller | |||||||
|         // move date to end of day
 |         // move date to end of day
 | ||||||
|         $queryParameters['start']->startOfDay(); |         $queryParameters['start']->startOfDay(); | ||||||
|         $queryParameters['end']->endOfDay(); |         $queryParameters['end']->endOfDay(); | ||||||
|  |         Log::debug(sprintf('dashboard(), convert to primary: %s', var_export($this->convertToPrimary, true))); | ||||||
| 
 | 
 | ||||||
|         // loop each account, and collect info:
 |         // loop each account, and collect info:
 | ||||||
|         /** @var Account $account */ |         /** @var Account $account */ | ||||||
|         foreach ($accounts as $account) { |         foreach ($accounts as $account) { | ||||||
|  |             Log::debug(sprintf('Account #%d ("%s")', $account->id, $account->name)); | ||||||
|             $this->renderAccountData($queryParameters, $account); |             $this->renderAccountData($queryParameters, $account); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @@ -99,7 +104,14 @@ class AccountController extends Controller | |||||||
|      */ |      */ | ||||||
|     private function renderAccountData(array $params, Account $account): void |     private function renderAccountData(array $params, Account $account): void | ||||||
|     { |     { | ||||||
|  |         Log::debug(sprintf('Now in %s(array, #%d)', __METHOD__, $account->id)); | ||||||
|         $currency     = $this->repository->getAccountCurrency($account); |         $currency     = $this->repository->getAccountCurrency($account); | ||||||
|  |         $currentStart = clone $params['start']; | ||||||
|  |         $range        = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToPrimary); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $previous     = array_values($range)[0]['balance']; | ||||||
|  |         $pcPrevious   = null; | ||||||
|         if (!$currency instanceof TransactionCurrency) { |         if (!$currency instanceof TransactionCurrency) { | ||||||
|             $currency = $this->default; |             $currency = $this->default; | ||||||
|         } |         } | ||||||
| @@ -107,7 +119,7 @@ class AccountController extends Controller | |||||||
|             'label'                   => $account->name, |             'label'                   => $account->name, | ||||||
| 
 | 
 | ||||||
|             // the currency that belongs to the account.
 |             // the currency that belongs to the account.
 | ||||||
|             'currency_id'             => (string) $currency->id, |             'currency_id'             => (string)$currency->id, | ||||||
|             'currency_code'           => $currency->code, |             'currency_code'           => $currency->code, | ||||||
|             'currency_symbol'         => $currency->symbol, |             'currency_symbol'         => $currency->symbol, | ||||||
|             'currency_decimal_places' => $currency->decimal_places, |             'currency_decimal_places' => $currency->decimal_places, | ||||||
| @@ -119,18 +131,33 @@ class AccountController extends Controller | |||||||
|             'period'                  => '1D', |             'period'                  => '1D', | ||||||
|             'entries'                 => [], |             'entries'                 => [], | ||||||
|         ]; |         ]; | ||||||
|         $currentStart = clone $params['start']; |         if ($this->convertToPrimary) { | ||||||
|         $range        = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToNative); |             $currentSet['pc_entries']                      = []; | ||||||
|  |             $currentSet['primary_currency_id']             = (string)$this->primaryCurrency->id; | ||||||
|  |             $currentSet['primary_currency_code']           = $this->primaryCurrency->code; | ||||||
|  |             $currentSet['primary_currency_symbol']         = $this->primaryCurrency->symbol; | ||||||
|  |             $currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places; | ||||||
|  |             $pcPrevious                                    = array_values($range)[0]['pc_balance']; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         $previous     = array_values($range)[0]['balance']; |  | ||||||
|         while ($currentStart <= $params['end']) { |         while ($currentStart <= $params['end']) { | ||||||
|             $format                        = $currentStart->format('Y-m-d'); |             $format                        = $currentStart->format('Y-m-d'); | ||||||
|             $label                         = $currentStart->toAtomString(); |             $label                         = $currentStart->toAtomString(); | ||||||
|             $balance                       = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous; |             $balance                       = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous; | ||||||
|             $previous                      = $balance; |             $previous                      = $balance; | ||||||
|  |             $currentSet['entries'][$label] = $balance; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             // do the same for the primary currency balance, if relevant:
 | ||||||
|  |             $pcBalance                     = null; | ||||||
|  |             if ($this->convertToPrimary) { | ||||||
|  |                 $pcBalance                        = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious; | ||||||
|  |                 $pcPrevious                       = $pcBalance; | ||||||
|  |                 $currentSet['pc_entries'][$label] = $pcBalance; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             $currentStart->addDay(); |             $currentStart->addDay(); | ||||||
|             $currentSet['entries'][$label] = $balance; |  | ||||||
|         } |         } | ||||||
|         $this->chartData->add($currentSet); |         $this->chartData->add($currentSet); | ||||||
|     } |     } | ||||||
| @@ -139,45 +166,39 @@ class AccountController extends Controller | |||||||
|      * This endpoint is documented at: |      * This endpoint is documented at: | ||||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
 |      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
 | ||||||
|      * |      * | ||||||
|      * @throws FireflyException |      * @throws ValidationException | ||||||
|      */ |      */ | ||||||
|     public function overview(DateRequest $request): JsonResponse |     public function overview(DateRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         // parameters for chart:
 |         // parameters for chart:
 | ||||||
|         $dates      = $request->getAll(); |         $dates        = $request->getAll(); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         /** @var Carbon $start */ |         /** @var Carbon $start */ | ||||||
|         $start      = $dates['start']; |         $start        = $dates['start']; | ||||||
| 
 | 
 | ||||||
|         /** @var Carbon $end */ |         /** @var Carbon $end */ | ||||||
|         $end        = $dates['end']; |         $end          = $dates['end']; | ||||||
| 
 | 
 | ||||||
|         // set dates to end of day + start of day:
 |         // set dates to end of day + start of day:
 | ||||||
|         $start->startOfDay(); |         $start->startOfDay(); | ||||||
|         $end->endOfDay(); |         $end->endOfDay(); | ||||||
| 
 | 
 | ||||||
|         // user's preferences
 |         $frontPageIds = $this->getFrontPageAccountIds(); | ||||||
|         $defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray(); |         $accounts     = $this->repository->getAccountsById($frontPageIds); | ||||||
| 
 |         $chartData    = []; | ||||||
|         /** @var Preference $frontpage */ |  | ||||||
|         $frontpage  = app('preferences')->get('frontpageAccounts', $defaultSet); |  | ||||||
| 
 |  | ||||||
|         if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) { |  | ||||||
|             $frontpage->data = $defaultSet; |  | ||||||
|             $frontpage->save(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // get accounts:
 |  | ||||||
|         $accounts   = $this->repository->getAccountsById($frontpage->data); |  | ||||||
|         $chartData  = []; |  | ||||||
| 
 | 
 | ||||||
|         /** @var Account $account */ |         /** @var Account $account */ | ||||||
|         foreach ($accounts as $account) { |         foreach ($accounts as $account) { | ||||||
|             $currency     = $this->repository->getAccountCurrency($account) ?? $this->nativeCurrency; |             Log::debug(sprintf('Rendering chart data for account %s (%d)', $account->name, $account->id)); | ||||||
|             $field        = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? 'native_balance' : 'balance'; |             $currency     = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency; | ||||||
|  |             $currentStart = clone $start; | ||||||
|  |             $range        = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToPrimary); | ||||||
|  |             $previous     = array_values($range)[0]['balance']; | ||||||
|  |             $pcPrevious   = null; | ||||||
|             $currentSet   = [ |             $currentSet   = [ | ||||||
|                 'label'                   => $account->name, |                 'label'                   => $account->name, | ||||||
|                 'currency_id'             => (string) $currency->id, |                 'currency_id'             => (string)$currency->id, | ||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
| @@ -187,21 +208,57 @@ class AccountController extends Controller | |||||||
|                 'yAxisID'                 => 0, // 0, 1, 2
 |                 'yAxisID'                 => 0, // 0, 1, 2
 | ||||||
|                 'entries'                 => [], |                 'entries'                 => [], | ||||||
|             ]; |             ]; | ||||||
|             // TODO this code is also present in the V2 chart account controller so this method is due to be deprecated.
 | 
 | ||||||
|             $currentStart = clone $start; |             // add "pc_entries" if convertToPrimary is true:
 | ||||||
|             $range        = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToNative); |             if ($this->convertToPrimary) { | ||||||
|             $previous     = array_values($range)[0][$field]; |                 $currentSet['pc_entries']                      = []; | ||||||
|  |                 $currentSet['primary_currency_id']             = (string)$this->primaryCurrency->id; | ||||||
|  |                 $currentSet['primary_currency_code']           = $this->primaryCurrency->code; | ||||||
|  |                 $currentSet['primary_currency_symbol']         = $this->primaryCurrency->symbol; | ||||||
|  |                 $currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places; | ||||||
|  |                 $pcPrevious                                    = array_values($range)[0]['pc_balance']; | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // also get the primary balance if convertToPrimary is true:
 | ||||||
|             while ($currentStart <= $end) { |             while ($currentStart <= $end) { | ||||||
|                 $format                        = $currentStart->format('Y-m-d'); |                 $format                        = $currentStart->format('Y-m-d'); | ||||||
|                 $label                         = $currentStart->toAtomString(); |                 $label                         = $currentStart->toAtomString(); | ||||||
|                 $balance                       = array_key_exists($format, $range) ? $range[$format][$field] : $previous; | 
 | ||||||
|  |                 // balance is based on "balance" from the $range variable.
 | ||||||
|  |                 $balance                       = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous; | ||||||
|                 $previous                      = $balance; |                 $previous                      = $balance; | ||||||
|                 $currentStart->addDay(); |  | ||||||
|                 $currentSet['entries'][$label] = $balance; |                 $currentSet['entries'][$label] = $balance; | ||||||
|  | 
 | ||||||
|  |                 // do the same for the primary balance, if relevant:
 | ||||||
|  |                 $pcBalance                     = null; | ||||||
|  |                 if ($this->convertToPrimary) { | ||||||
|  |                     $pcBalance                        = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious; | ||||||
|  |                     $pcPrevious                       = $pcBalance; | ||||||
|  |                     $currentSet['pc_entries'][$label] = $pcBalance; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 $currentStart->addDay(); | ||||||
|  | 
 | ||||||
|             } |             } | ||||||
|             $chartData[]  = $currentSet; |             $chartData[]  = $currentSet; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return response()->json($chartData); |         return response()->json($chartData); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     private function getFrontPageAccountIds(): array | ||||||
|  |     { | ||||||
|  |         $defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray(); | ||||||
|  | 
 | ||||||
|  |         /** @var Preference $frontpage */ | ||||||
|  |         $frontpage  = Preferences::get('frontpageAccounts', $defaultSet); | ||||||
|  | 
 | ||||||
|  |         if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) { | ||||||
|  |             $frontpage->data = $defaultSet; | ||||||
|  |             $frontpage->save(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $frontpage->data ?? $defaultSet; | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,37 +1,18 @@ | |||||||
| <?php | <?php | ||||||
| 
 | 
 | ||||||
| /* |  | ||||||
|  * BalanceController.php |  | ||||||
|  * Copyright (c) 2023 james@firefly-iii.org |  | ||||||
|  * |  | ||||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU Affero General Public License as |  | ||||||
|  * published by the Free Software Foundation, either version 3 of the |  | ||||||
|  * License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU Affero General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Affero General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| declare(strict_types=1); | declare(strict_types=1); | ||||||
| 
 | 
 | ||||||
| namespace FireflyIII\Api\V2\Controllers\Chart; | namespace FireflyIII\Api\V1\Controllers\Chart; | ||||||
| 
 | 
 | ||||||
| use FireflyIII\Api\V2\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Api\V2\Request\Chart\ChartRequest; | use FireflyIII\Api\V1\Requests\Chart\ChartRequest; | ||||||
| use FireflyIII\Enums\TransactionTypeEnum; | use FireflyIII\Enums\TransactionTypeEnum; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||||
| use FireflyIII\Models\TransactionCurrency; | use FireflyIII\Models\TransactionCurrency; | ||||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||||
| use FireflyIII\Support\Chart\ChartData; | use FireflyIII\Support\Chart\ChartData; | ||||||
|  | use FireflyIII\Support\Facades\Amount; | ||||||
| use FireflyIII\Support\Http\Api\AccountBalanceGrouped; | use FireflyIII\Support\Http\Api\AccountBalanceGrouped; | ||||||
| use FireflyIII\Support\Http\Api\CleansChartData; | use FireflyIII\Support\Http\Api\CleansChartData; | ||||||
| use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; | use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; | ||||||
| @@ -62,7 +43,7 @@ class BalanceController extends Controller | |||||||
|                 $this->repository->setUserGroup($userGroup); |                 $this->repository->setUserGroup($userGroup); | ||||||
|                 $this->collector->setUserGroup($userGroup); |                 $this->collector->setUserGroup($userGroup); | ||||||
|                 $this->chartData  = new ChartData(); |                 $this->chartData  = new ChartData(); | ||||||
|                 // $this->default    = app('amount')->getNativeCurrency();
 |                 // $this->default    = app('amount')->getPrimaryCurrency();
 | ||||||
| 
 | 
 | ||||||
|                 return $next($request); |                 return $next($request); | ||||||
|             } |             } | ||||||
| @@ -86,8 +67,8 @@ class BalanceController extends Controller | |||||||
|         $accounts        = $this->getAccountList($queryParameters); |         $accounts        = $this->getAccountList($queryParameters); | ||||||
| 
 | 
 | ||||||
|         // prepare for currency conversion and data collection:
 |         // prepare for currency conversion and data collection:
 | ||||||
|         /** @var TransactionCurrency $default */ |         /** @var TransactionCurrency $primary */ | ||||||
|         $default         = app('amount')->getNativeCurrency(); |         $primary         = Amount::getPrimaryCurrency(); | ||||||
| 
 | 
 | ||||||
|         // get journals for entire period:
 |         // get journals for entire period:
 | ||||||
| 
 | 
 | ||||||
| @@ -100,7 +81,7 @@ class BalanceController extends Controller | |||||||
| 
 | 
 | ||||||
|         $object          = new AccountBalanceGrouped(); |         $object          = new AccountBalanceGrouped(); | ||||||
|         $object->setPreferredRange($queryParameters['period']); |         $object->setPreferredRange($queryParameters['period']); | ||||||
|         $object->setDefault($default); |         $object->setPrimary($primary); | ||||||
|         $object->setAccounts($accounts); |         $object->setAccounts($accounts); | ||||||
|         $object->setJournals($journals); |         $object->setJournals($journals); | ||||||
|         $object->setStart($queryParameters['start']); |         $object->setStart($queryParameters['start']); | ||||||
| @@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart; | |||||||
| 
 | 
 | ||||||
| use Carbon\Carbon; | use Carbon\Carbon; | ||||||
| use FireflyIII\Api\V1\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Api\V1\Requests\Generic\DateRequest; | use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||||
| use FireflyIII\Enums\UserRoleEnum; | use FireflyIII\Enums\UserRoleEnum; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Models\Budget; | use FireflyIII\Models\Budget; | ||||||
| @@ -36,6 +36,7 @@ use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | |||||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||||
| use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; | use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\CleansChartData; | use FireflyIII\Support\Http\Api\CleansChartData; | ||||||
|  | use FireflyIII\Support\Http\Api\ExchangeRateConverter; | ||||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use Illuminate\Support\Collection; | use Illuminate\Support\Collection; | ||||||
| @@ -77,6 +78,8 @@ class BudgetController extends Controller | |||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * TODO see autocomplete/accountcontroller |      * TODO see autocomplete/accountcontroller | ||||||
|  |      * | ||||||
|  |      * @throws FireflyException | ||||||
|      */ |      */ | ||||||
|     public function dashboard(DateRequest $request): JsonResponse |     public function dashboard(DateRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
| @@ -107,23 +110,41 @@ class BudgetController extends Controller | |||||||
|     private function processBudget(Budget $budget, Carbon $start, Carbon $end): array |     private function processBudget(Budget $budget, Carbon $start, Carbon $end): array | ||||||
|     { |     { | ||||||
|         // get all limits:
 |         // get all limits:
 | ||||||
|         $limits = $this->blRepository->getBudgetLimits($budget, $start, $end); |         $limits   = $this->blRepository->getBudgetLimits($budget, $start, $end); | ||||||
|         $rows   = []; |         $rows     = []; | ||||||
|  |         $spent    = $this->opsRepository->listExpenses($start, $end, null, new Collection([$budget])); | ||||||
|  |         $expenses = $this->processExpenses($budget->id, $spent, $start, $end); | ||||||
|  | 
 | ||||||
|  |         /** | ||||||
|  |          * @var int   $currencyId | ||||||
|  |          * @var array $row | ||||||
|  |          */ | ||||||
|  |         foreach ($expenses as $currencyId => $row) { | ||||||
|  |             // budgeted, left and overspent are now 0.
 | ||||||
|  |             $limit  = $this->filterLimit($currencyId, $limits); | ||||||
|  |             if (null !== $limit) { | ||||||
|  |                 $row['budgeted']  = $limit->amount; | ||||||
|  |                 $row['left']      = bcsub($row['budgeted'], bcmul($row['spent'], '-1')); | ||||||
|  |                 $row['overspent'] = bcmul($row['left'], '-1'); | ||||||
|  |                 $row['left']      = 1 === bccomp($row['left'], '0') ? $row['left'] : '0'; | ||||||
|  |                 $row['overspent'] = 1 === bccomp($row['overspent'], '0') ? $row['overspent'] : '0'; | ||||||
|  |             } | ||||||
|  |             $rows[] = $row; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         // if no limits
 |         // if no limits
 | ||||||
|         if (0 === $limits->count()) { |         //        if (0 === $limits->count()) {
 | ||||||
|             // return as a single item in an array
 |         //             return as a single item in an array
 | ||||||
|             $rows = $this->noBudgetLimits($budget, $start, $end); |         //            $rows = $this->noBudgetLimits($budget, $start, $end);
 | ||||||
|         } |         //        }
 | ||||||
|         if ($limits->count() > 0) { | 
 | ||||||
|             $rows = $this->budgetLimits($budget, $limits); |  | ||||||
|         } |  | ||||||
|         // is always an array
 |         // is always an array
 | ||||||
|         $return = []; |         $return   = []; | ||||||
|         foreach ($rows as $row) { |         foreach ($rows as $row) { | ||||||
|             $current  = [ |             $current  = [ | ||||||
|                 'label'                   => $budget->name, |                 'label'                   => $budget->name, | ||||||
|                 'currency_id'             => (string) $row['currency_id'], |                 'currency_id'             => (string)$row['currency_id'], | ||||||
|                 'currency_code'           => $row['currency_code'], |                 'currency_code'           => $row['currency_code'], | ||||||
|                 'currency_name'           => $row['currency_name'], |                 'currency_name'           => $row['currency_name'], | ||||||
|                 'currency_decimal_places' => $row['currency_decimal_places'], |                 'currency_decimal_places' => $row['currency_decimal_places'], | ||||||
| @@ -131,6 +152,7 @@ class BudgetController extends Controller | |||||||
|                 'start'                   => $row['start'], |                 'start'                   => $row['start'], | ||||||
|                 'end'                     => $row['end'], |                 'end'                     => $row['end'], | ||||||
|                 'entries'                 => [ |                 'entries'                 => [ | ||||||
|  |                     'budgeted'  => $row['budgeted'], | ||||||
|                     'spent'     => $row['spent'], |                     'spent'     => $row['spent'], | ||||||
|                     'left'      => $row['left'], |                     'left'      => $row['left'], | ||||||
|                     'overspent' => $row['overspent'], |                     'overspent' => $row['overspent'], | ||||||
| @@ -159,11 +181,9 @@ class BudgetController extends Controller | |||||||
|      * Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return |      * Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return | ||||||
|      * its info. |      * its info. | ||||||
|      * |      * | ||||||
|      * @param array<int, array<int, string>> $array |  | ||||||
|      * |  | ||||||
|      * @throws FireflyException |      * @throws FireflyException | ||||||
|      */ |      */ | ||||||
|     private function processExpenses(int $budgetId, array $array, Carbon $start, Carbon $end): array |     private function processExpenses(int $budgetId, array $spent, Carbon $start, Carbon $end): array | ||||||
|     { |     { | ||||||
|         $return = []; |         $return = []; | ||||||
| 
 | 
 | ||||||
| @@ -174,16 +194,17 @@ class BudgetController extends Controller | |||||||
|          * @var int   $currencyId |          * @var int   $currencyId | ||||||
|          * @var array $block |          * @var array $block | ||||||
|          */ |          */ | ||||||
|         foreach ($array as $currencyId => $block) { |         foreach ($spent as $currencyId => $block) { | ||||||
|             $this->currencies[$currencyId] ??= TransactionCurrency::find($currencyId); |             $this->currencies[$currencyId] ??= TransactionCurrency::find($currencyId); | ||||||
|             $return[$currencyId]           ??= [ |             $return[$currencyId]           ??= [ | ||||||
|                 'currency_id'             => (string) $currencyId, |                 'currency_id'             => (string)$currencyId, | ||||||
|                 'currency_code'           => $block['currency_code'], |                 'currency_code'           => $block['currency_code'], | ||||||
|                 'currency_name'           => $block['currency_name'], |                 'currency_name'           => $block['currency_name'], | ||||||
|                 'currency_symbol'         => $block['currency_symbol'], |                 'currency_symbol'         => $block['currency_symbol'], | ||||||
|                 'currency_decimal_places' => (int) $block['currency_decimal_places'], |                 'currency_decimal_places' => (int)$block['currency_decimal_places'], | ||||||
|                 'start'                   => $start->toAtomString(), |                 'start'                   => $start->toAtomString(), | ||||||
|                 'end'                     => $end->toAtomString(), |                 'end'                     => $end->toAtomString(), | ||||||
|  |                 'budgeted'                => '0', | ||||||
|                 'spent'                   => '0', |                 'spent'                   => '0', | ||||||
|                 'left'                    => '0', |                 'left'                    => '0', | ||||||
|                 'overspent'               => '0', |                 'overspent'               => '0', | ||||||
| @@ -193,7 +214,7 @@ class BudgetController extends Controller | |||||||
|             // var_dump($return);
 |             // var_dump($return);
 | ||||||
|             /** @var array $journal */ |             /** @var array $journal */ | ||||||
|             foreach ($currentBudgetArray['transaction_journals'] as $journal) { |             foreach ($currentBudgetArray['transaction_journals'] as $journal) { | ||||||
|                 $return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], (string) $journal['amount']); |                 $return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], (string)$journal['amount']); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @@ -212,7 +233,7 @@ class BudgetController extends Controller | |||||||
|      */ |      */ | ||||||
|     private function budgetLimits(Budget $budget, Collection $limits): array |     private function budgetLimits(Budget $budget, Collection $limits): array | ||||||
|     { |     { | ||||||
|         app('log')->debug(sprintf('Now in budgetLimits(#%d)', $budget->id)); |         Log::debug(sprintf('Now in budgetLimits(#%d)', $budget->id)); | ||||||
|         $data = []; |         $data = []; | ||||||
| 
 | 
 | ||||||
|         /** @var BudgetLimit $limit */ |         /** @var BudgetLimit $limit */ | ||||||
| @@ -233,28 +254,59 @@ class BudgetController extends Controller | |||||||
|         $end->endOfDay(); |         $end->endOfDay(); | ||||||
|         $spent           = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget])); |         $spent           = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget])); | ||||||
|         $limitCurrencyId = $limit->transaction_currency_id; |         $limitCurrencyId = $limit->transaction_currency_id; | ||||||
|         $filtered        = []; |  | ||||||
| 
 | 
 | ||||||
|         /** @var array $entry */ |         /** @var array $entry */ | ||||||
|         foreach ($spent as $currencyId => $entry) { |         // only spent the entry where the entry's currency matches the budget limit's currency
 | ||||||
|             // only spent the entry where the entry's currency matches the budget limit's currency
 |         // so $filtered will only have 1 or 0 entries
 | ||||||
|             // so $filtered will only have 1 or 0 entries
 |         $filtered        = array_filter($spent, fn ($entry) => $entry['currency_id'] === $limitCurrencyId); | ||||||
|             if ($entry['currency_id'] === $limitCurrencyId) { |  | ||||||
|                 $filtered[$currencyId] = $entry; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         $result          = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end); |         $result          = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end); | ||||||
|         if (1 === count($result)) { |         if (1 === count($result)) { | ||||||
|             $compare = bccomp($limit->amount, (string) app('steam')->positive($result[$limitCurrencyId]['spent'])); |             $compare                              = bccomp($limit->amount, (string)app('steam')->positive($result[$limitCurrencyId]['spent'])); | ||||||
|  |             $result[$limitCurrencyId]['budgeted'] = $limit->amount; | ||||||
|             if (1 === $compare) { |             if (1 === $compare) { | ||||||
|                 // convert this amount into the native currency:
 |                 // convert this amount into the primary currency:
 | ||||||
|                 $result[$limitCurrencyId]['left'] = bcadd($limit->amount, (string) $result[$limitCurrencyId]['spent']); |                 $result[$limitCurrencyId]['left'] = bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']); | ||||||
|             } |             } | ||||||
|             if ($compare <= 0) { |             if ($compare <= 0) { | ||||||
|                 $result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, (string) $result[$limitCurrencyId]['spent'])); |                 $result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent'])); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return $result; |         return $result; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     private function filterLimit(int $currencyId, Collection $limits): ?BudgetLimit | ||||||
|  |     { | ||||||
|  |         $amount    = '0'; | ||||||
|  |         $limit     = null; | ||||||
|  |         $converter = new ExchangeRateConverter(); | ||||||
|  | 
 | ||||||
|  |         /** @var BudgetLimit $current */ | ||||||
|  |         foreach ($limits as $current) { | ||||||
|  |             if (true === $this->convertToPrimary) { | ||||||
|  |                 if ($current->transaction_currency_id === $this->primaryCurrency->id) { | ||||||
|  |                     // simply add it.
 | ||||||
|  |                     $amount = bcadd($amount, (string)$current->amount); | ||||||
|  |                     Log::debug(sprintf('Set amount in limit to %s', $amount)); | ||||||
|  |                 } | ||||||
|  |                 if ($current->transaction_currency_id !== $this->primaryCurrency->id) { | ||||||
|  |                     // convert and then add it.
 | ||||||
|  |                     $converted = $converter->convert($current->transactionCurrency, $this->primaryCurrency, $current->start_date, $current->amount); | ||||||
|  |                     $amount    = bcadd($amount, $converted); | ||||||
|  |                     Log::debug(sprintf('Budgeted in limit #%d: %s %s, converted to %s %s', $current->id, $current->transactionCurrency->code, $current->amount, $this->primaryCurrency->code, $converted)); | ||||||
|  |                     Log::debug(sprintf('Set amount in limit to %s', $amount)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if ($current->transaction_currency_id === $currencyId) { | ||||||
|  |                 $limit = $current; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (null !== $limit && true === $this->convertToPrimary) { | ||||||
|  |             // convert and add all amounts.
 | ||||||
|  |             $limit->amount = app('steam')->positive($amount); | ||||||
|  |             Log::debug(sprintf('Final amount in limit with converted amount %s', $limit->amount)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $limit; | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -25,17 +25,20 @@ declare(strict_types=1); | |||||||
| namespace FireflyIII\Api\V1\Controllers\Chart; | namespace FireflyIII\Api\V1\Controllers\Chart; | ||||||
| 
 | 
 | ||||||
| use Carbon\Carbon; | use Carbon\Carbon; | ||||||
| use FireflyIII\Api\V2\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||||
| use FireflyIII\Enums\AccountTypeEnum; | use FireflyIII\Enums\AccountTypeEnum; | ||||||
| use FireflyIII\Enums\TransactionTypeEnum; | use FireflyIII\Enums\TransactionTypeEnum; | ||||||
|  | use FireflyIII\Enums\UserRoleEnum; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\CleansChartData; | use FireflyIII\Support\Http\Api\CleansChartData; | ||||||
|  | use FireflyIII\Support\Http\Api\ExchangeRateConverter; | ||||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Class BudgetController |  * Class BudgetController | ||||||
| @@ -45,6 +48,8 @@ class CategoryController extends Controller | |||||||
|     use CleansChartData; |     use CleansChartData; | ||||||
|     use ValidatesUserGroupTrait; |     use ValidatesUserGroupTrait; | ||||||
| 
 | 
 | ||||||
|  |     protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; | ||||||
|  | 
 | ||||||
|     private AccountRepositoryInterface  $accountRepos; |     private AccountRepositoryInterface  $accountRepos; | ||||||
|     private CurrencyRepositoryInterface $currencyRepos; |     private CurrencyRepositoryInterface $currencyRepos; | ||||||
| 
 | 
 | ||||||
| @@ -79,9 +84,10 @@ class CategoryController extends Controller | |||||||
| 
 | 
 | ||||||
|         /** @var Carbon $end */ |         /** @var Carbon $end */ | ||||||
|         $end        = $this->parameters->get('end'); |         $end        = $this->parameters->get('end'); | ||||||
|         $accounts   = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value]); |         $accounts   = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value]); | ||||||
|         $currencies = []; |         $currencies = []; | ||||||
|         $return     = []; |         $return     = []; | ||||||
|  |         $converter  = new ExchangeRateConverter(); | ||||||
| 
 | 
 | ||||||
|         // get journals for entire period:
 |         // get journals for entire period:
 | ||||||
|         /** @var GroupCollectorInterface $collector */ |         /** @var GroupCollectorInterface $collector */ | ||||||
| @@ -93,20 +99,40 @@ class CategoryController extends Controller | |||||||
| 
 | 
 | ||||||
|         /** @var array $journal */ |         /** @var array $journal */ | ||||||
|         foreach ($journals as $journal) { |         foreach ($journals as $journal) { | ||||||
|             $currencyId              = (int) $journal['currency_id']; |             // find journal:
 | ||||||
|             $currency                = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); |             $journalCurrencyId              = (int)$journal['currency_id']; | ||||||
|             $currencies[$currencyId] = $currency; |             $currency                       = $currencies[$journalCurrencyId] ?? $this->currencyRepos->find($journalCurrencyId); | ||||||
|             $categoryName            = $journal['category_name'] ?? (string) trans('firefly.no_category'); |             $currencies[$journalCurrencyId] = $currency; | ||||||
|             $amount                  = app('steam')->positive($journal['amount']); |             $currencyId                     = (int)$currency->id; | ||||||
|             $key                     = sprintf('%s-%s', $categoryName, $currency->code); |             $currencyName                   = (string)$currency->name; | ||||||
|  |             $currencyCode                   = (string)$currency->code; | ||||||
|  |             $currencySymbol                 = (string)$currency->symbol; | ||||||
|  |             $currencyDecimalPlaces          = (int)$currency->decimal_places; | ||||||
|  |             $amount                         = app('steam')->positive($journal['amount']); | ||||||
|  | 
 | ||||||
|  |             // overrule if necessary:
 | ||||||
|  |             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; | ||||||
|  |                 $convertedAmount       = $converter->convert($currency, $this->primaryCurrency, $journal['date'], $amount); | ||||||
|  |                 Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->primaryCurrency->code, $convertedAmount)); | ||||||
|  |                 $amount                = $convertedAmount; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             $categoryName                   = $journal['category_name'] ?? (string)trans('firefly.no_category'); | ||||||
|  |             $key                            = sprintf('%s-%s', $categoryName, $currencyCode); | ||||||
|             // create arrays
 |             // create arrays
 | ||||||
|             $return[$key] ??= [ |             $return[$key] ??= [ | ||||||
|                 'label'                   => $categoryName, |                 'label'                   => $categoryName, | ||||||
|                 'currency_id'             => (string) $currency->id, |                 'currency_id'             => (string)$currencyId, | ||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currencyCode, | ||||||
|                 'currency_name'           => $currency->name, |                 'currency_name'           => $currencyName, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currencySymbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currencyDecimalPlaces, | ||||||
|                 'period'                  => null, |                 'period'                  => null, | ||||||
|                 'start'                   => $start->toAtomString(), |                 'start'                   => $start->toAtomString(), | ||||||
|                 'end'                     => $end->toAtomString(), |                 'end'                     => $end->toAtomString(), | ||||||
| @@ -114,12 +140,12 @@ class CategoryController extends Controller | |||||||
|             ]; |             ]; | ||||||
| 
 | 
 | ||||||
|             // add monies
 |             // add monies
 | ||||||
|             $return[$key]['amount']  = bcadd($return[$key]['amount'], (string) $amount); |             $return[$key]['amount']         = bcadd($return[$key]['amount'], (string)$amount); | ||||||
|         } |         } | ||||||
|         $return     = array_values($return); |         $return     = array_values($return); | ||||||
| 
 | 
 | ||||||
|         // order by amount
 |         // order by amount
 | ||||||
|         usort($return, static fn (array $a, array $b) => (float) $a['amount'] < (float) $b['amount'] ? 1 : -1); |         usort($return, static fn (array $a, array $b) => (float)$a['amount'] < (float)$b['amount'] ? 1 : -1); | ||||||
| 
 | 
 | ||||||
|         return response()->json($this->clean($return)); |         return response()->json($this->clean($return)); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -62,14 +62,14 @@ abstract class Controller extends BaseController | |||||||
|     use ValidatesRequests; |     use ValidatesRequests; | ||||||
|     use ValidatesUserGroupTrait; |     use ValidatesUserGroupTrait; | ||||||
| 
 | 
 | ||||||
|     protected const string CONTENT_TYPE            = 'application/vnd.api+json'; |     protected const string CONTENT_TYPE             = 'application/vnd.api+json'; | ||||||
|     protected const string JSON_CONTENT_TYPE       = 'application/json'; |     protected const string JSON_CONTENT_TYPE        = 'application/json'; | ||||||
|     protected array               $accepts         = ['application/json', 'application/vnd.api+json']; |     protected array               $accepts          = ['application/json', 'application/vnd.api+json']; | ||||||
| 
 | 
 | ||||||
|     /** @var array<int, string> */ |     /** @var array<int, string> */ | ||||||
|     protected array               $allowedSort; |     protected array               $allowedSort; | ||||||
|     protected bool                $convertToNative = false; |     protected bool                $convertToPrimary = false; | ||||||
|     protected TransactionCurrency $nativeCurrency; |     protected TransactionCurrency $primaryCurrency; | ||||||
|     protected ParameterBag        $parameters; |     protected ParameterBag        $parameters; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @@ -83,9 +83,9 @@ abstract class Controller extends BaseController | |||||||
|             function ($request, $next) { |             function ($request, $next) { | ||||||
|                 $this->parameters = $this->getParameters(); |                 $this->parameters = $this->getParameters(); | ||||||
|                 if (auth()->check()) { |                 if (auth()->check()) { | ||||||
|                     $language              = Steam::getLanguage(); |                     $language               = Steam::getLanguage(); | ||||||
|                     $this->convertToNative = Amount::convertToNative(); |                     $this->convertToPrimary = Amount::convertToPrimary(); | ||||||
|                     $this->nativeCurrency  = Amount::getNativeCurrency(); |                     $this->primaryCurrency  = Amount::getPrimaryCurrency(); | ||||||
|                     app()->setLocale($language); |                     app()->setLocale($language); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
| @@ -127,7 +127,6 @@ abstract class Controller extends BaseController | |||||||
|                 Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field)); |                 Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field)); | ||||||
|                 Log::error($e->getMessage()); |                 Log::error($e->getMessage()); | ||||||
|                 Log::error($e->getTraceAsString()); |                 Log::error($e->getTraceAsString()); | ||||||
|                 $value = null; |  | ||||||
|             } |             } | ||||||
|             $obj  = null; |             $obj  = null; | ||||||
|             if (null !== $date) { |             if (null !== $date) { | ||||||
|   | |||||||
| @@ -64,7 +64,7 @@ class DestroyController extends Controller | |||||||
|     public function destroy(DestroyRequest $request): JsonResponse |     public function destroy(DestroyRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $objects         = $request->getObjects(); |         $objects         = $request->getObjects(); | ||||||
|         $this->unused    = $request->boolean('unused', false); |         $this->unused    = $request->boolean('unused'); | ||||||
| 
 | 
 | ||||||
|         $allExceptAssets = [AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::RECONCILIATION->value, AccountTypeEnum::REVENUE->value]; |         $allExceptAssets = [AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::RECONCILIATION->value, AccountTypeEnum::REVENUE->value]; | ||||||
|         $all             = [AccountTypeEnum::ASSET->value, AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::RECONCILIATION->value]; |         $all             = [AccountTypeEnum::ASSET->value, AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::RECONCILIATION->value]; | ||||||
| @@ -176,14 +176,14 @@ class DestroyController extends Controller | |||||||
|         foreach ($collection as $account) { |         foreach ($collection as $account) { | ||||||
|             $count = $account->transactions()->count(); |             $count = $account->transactions()->count(); | ||||||
|             if (true === $this->unused && 0 === $count) { |             if (true === $this->unused && 0 === $count) { | ||||||
|                 app('log')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); |                 Log::info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); | ||||||
|                 Log::channel('audit')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); |                 Log::channel('audit')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); | ||||||
|                 $service->destroy($account, null); |                 $service->destroy($account, null); | ||||||
| 
 | 
 | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             if (false === $this->unused) { |             if (false === $this->unused) { | ||||||
|                 app('log')->info(sprintf('Deleting account #%d "%s"', $account->id, $account->name)); |                 Log::info(sprintf('Deleting account #%d "%s"', $account->id, $account->name)); | ||||||
|                 Log::channel('audit')->warning(sprintf('Deleted account #%d "%s"', $account->id, $account->name)); |                 Log::channel('audit')->warning(sprintf('Deleted account #%d "%s"', $account->id, $account->name)); | ||||||
|                 $service->destroy($account, null); |                 $service->destroy($account, null); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Support\Export\ExportDataGenerator; | use FireflyIII\Support\Export\ExportDataGenerator; | ||||||
| use Illuminate\Http\Response as LaravelResponse; | use Illuminate\Http\Response as LaravelResponse; | ||||||
|  | use Safe\Exceptions\DatetimeException; | ||||||
| 
 | 
 | ||||||
| use function Safe\date; | use function Safe\date; | ||||||
| 
 | 
 | ||||||
| @@ -72,6 +73,7 @@ class ExportController extends Controller | |||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * @throws FireflyException |      * @throws FireflyException | ||||||
|  |      * @throws DatetimeException | ||||||
|      */ |      */ | ||||||
|     private function returnExport(string $key): LaravelResponse |     private function returnExport(string $key): LaravelResponse | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -65,13 +65,13 @@ class BillController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function bill(GenericRequest $request): JsonResponse |     public function bill(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $bills           = $request->getBills(); |         $bills            = $request->getBills(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
| 
 | 
 | ||||||
|         // get all bills:
 |         // get all bills:
 | ||||||
|         if (0 === $bills->count()) { |         if (0 === $bills->count()) { | ||||||
| @@ -79,25 +79,25 @@ class BillController extends Controller | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 |         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||||
|         $collector->setBills($bills); |         $collector->setBills($bills); | ||||||
| 
 | 
 | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             $billId       = (int) $journal['bill_id']; |             $billId       = (int) $journal['bill_id']; | ||||||
|             $currencyId   = (int) $journal['currency_id']; |             $currencyId   = (int) $journal['currency_id']; | ||||||
|             $currencyCode = $journal['currency_code']; |             $currencyCode = $journal['currency_code']; | ||||||
|             $field        = 'amount'; |             $field        = 'amount'; | ||||||
| 
 | 
 | ||||||
|             // use the native amount if the user wants to convert to native currency
 |             // use the primary amount if the user wants to convert to primary currency
 | ||||||
|             if ($convertToNative && $currencyId !== $default->id) { |             if ($convertToPrimary && $currencyId !== $primary->id) { | ||||||
|                 $currencyId   = $default->id; |                 $currencyId   = $primary->id; | ||||||
|                 $currencyCode = $default->code; |                 $currencyCode = $primary->code; | ||||||
|                 $field        = 'native_amount'; |                 $field        = 'pc_amount'; | ||||||
|             } |             } | ||||||
|             // use foreign amount when the foreign currency IS the default currency.
 |             // use foreign amount when the foreign currency IS the default currency.
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||||
|                 $field = 'foreign_amount'; |                 $field = 'foreign_amount'; | ||||||
|             } |             } | ||||||
|             Log::debug(sprintf('Journal #%d in bill #%d will use %s (%s %s)', $journal['transaction_group_id'], $billId, $field, $currencyCode, $journal[$field] ?? '0')); |             Log::debug(sprintf('Journal #%d in bill #%d will use %s (%s %s)', $journal['transaction_group_id'], $billId, $field, $currencyCode, $journal[$field] ?? '0')); | ||||||
| @@ -129,33 +129,33 @@ class BillController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function noBill(GenericRequest $request): JsonResponse |     public function noBill(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 |         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||||
|         $collector->withoutBill(); |         $collector->withoutBill(); | ||||||
| 
 | 
 | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
| 
 | 
 | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             $currencyId   = (int) $journal['currency_id']; |             $currencyId   = (int) $journal['currency_id']; | ||||||
|             $currencyCode = $journal['currency_code']; |             $currencyCode = $journal['currency_code']; | ||||||
|             $field        = 'amount'; |             $field        = 'amount'; | ||||||
| 
 | 
 | ||||||
|             // use the native amount if the user wants to convert to native currency
 |             // use the primary amount if the user wants to convert to primary currency
 | ||||||
|             if ($convertToNative && $currencyId !== $default->id) { |             if ($convertToPrimary && $currencyId !== $primary->id) { | ||||||
|                 $currencyId   = $default->id; |                 $currencyId   = $primary->id; | ||||||
|                 $currencyCode = $default->code; |                 $currencyCode = $primary->code; | ||||||
|                 $field        = 'native_amount'; |                 $field        = 'pc_amount'; | ||||||
|             } |             } | ||||||
|             // use foreign amount when the foreign currency IS the default currency.
 |             // use foreign amount when the foreign currency IS the default currency.
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||||
|                 $field = 'foreign_amount'; |                 $field = 'foreign_amount'; | ||||||
|             } |             } | ||||||
|             Log::debug(sprintf('Journal #%d will use %s (%s %s)', $journal['transaction_group_id'], $field, $currencyCode, $journal[$field] ?? '0')); |             Log::debug(sprintf('Journal #%d will use %s (%s %s)', $journal['transaction_group_id'], $field, $currencyCode, $journal[$field] ?? '0')); | ||||||
|   | |||||||
| @@ -43,35 +43,35 @@ class PeriodController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function total(GenericRequest $request): JsonResponse |     public function total(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type)
 |         // collect all expenses in this period (regardless of type)
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             // same code as many other sumExpense methods. I think this needs some kind of generic method.
 |             // same code as many other sumExpense methods. I think this needs some kind of generic method.
 | ||||||
|             $amount                                    = '0'; |             $amount                                    = '0'; | ||||||
|             $currencyId                                = (int) $journal['currency_id']; |             $currencyId                                = (int) $journal['currency_id']; | ||||||
|             $currencyCode                              = $journal['currency_code']; |             $currencyCode                              = $journal['currency_code']; | ||||||
|             if ($convertToNative) { |             if ($convertToPrimary) { | ||||||
|                 $amount = Amount::getAmountFromJournal($journal); |                 $amount = Amount::getAmountFromJournal($journal); | ||||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id !== (int) $journal['foreign_currency_id']) { |                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id !== (int) $journal['foreign_currency_id']) { | ||||||
|                     $currencyId   = $default->id; |                     $currencyId   = $primary->id; | ||||||
|                     $currencyCode = $default->code; |                     $currencyCode = $primary->code; | ||||||
|                 } |                 } | ||||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id === (int) $journal['foreign_currency_id']) { |                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id === (int) $journal['foreign_currency_id']) { | ||||||
|                     $currencyId   = $journal['foreign_currency_id']; |                     $currencyId   = $journal['foreign_currency_id']; | ||||||
|                     $currencyCode = $journal['foreign_currency_code']; |                     $currencyCode = $journal['foreign_currency_code']; | ||||||
|                 } |                 } | ||||||
|                 Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount)); |                 Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount)); | ||||||
|             } |             } | ||||||
|             if (!$convertToNative) { |             if (!$convertToPrimary) { | ||||||
|                 // ignore the amount in foreign currency.
 |                 // ignore the amount in foreign currency.
 | ||||||
|                 Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount'])); |                 Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount'])); | ||||||
|                 $amount = $journal['amount']; |                 $amount = $journal['amount']; | ||||||
|   | |||||||
| @@ -64,38 +64,38 @@ class TagController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function noTag(GenericRequest $request): JsonResponse |     public function noTag(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 |         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||||
|         $collector->withoutTags(); |         $collector->withoutTags(); | ||||||
| 
 | 
 | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
| 
 | 
 | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             // same code as many other sumExpense methods. I think this needs some kind of generic method.
 |             // same code as many other sumExpense methods. I think this needs some kind of generic method.
 | ||||||
|             $amount                                    = '0'; |             $amount                                    = '0'; | ||||||
|             $currencyId                                = (int) $journal['currency_id']; |             $currencyId                                = (int) $journal['currency_id']; | ||||||
|             $currencyCode                              = $journal['currency_code']; |             $currencyCode                              = $journal['currency_code']; | ||||||
|             if ($convertToNative) { |             if ($convertToPrimary) { | ||||||
|                 $amount = Amount::getAmountFromJournal($journal); |                 $amount = Amount::getAmountFromJournal($journal); | ||||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id !== (int) $journal['foreign_currency_id']) { |                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id !== (int) $journal['foreign_currency_id']) { | ||||||
|                     $currencyId   = $default->id; |                     $currencyId   = $primary->id; | ||||||
|                     $currencyCode = $default->code; |                     $currencyCode = $primary->code; | ||||||
|                 } |                 } | ||||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id === (int) $journal['foreign_currency_id']) { |                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id === (int) $journal['foreign_currency_id']) { | ||||||
|                     $currencyId   = $journal['foreign_currency_id']; |                     $currencyId   = $journal['foreign_currency_id']; | ||||||
|                     $currencyCode = $journal['foreign_currency_code']; |                     $currencyCode = $journal['foreign_currency_code']; | ||||||
|                 } |                 } | ||||||
|                 Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount)); |                 Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount)); | ||||||
|             } |             } | ||||||
|             if (!$convertToNative) { |             if (!$convertToPrimary) { | ||||||
|                 // ignore the amount in foreign currency.
 |                 // ignore the amount in foreign currency.
 | ||||||
|                 Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount'])); |                 Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount'])); | ||||||
|                 $amount = $journal['amount']; |                 $amount = $journal['amount']; | ||||||
|   | |||||||
| @@ -42,30 +42,30 @@ class PeriodController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function total(GenericRequest $request): JsonResponse |     public function total(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type)
 |         // collect all expenses in this period (regardless of type)
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             // currency
 |             // currency
 | ||||||
|             $currencyId                                = $journal['currency_id']; |             $currencyId                                = $journal['currency_id']; | ||||||
|             $currencyCode                              = $journal['currency_code']; |             $currencyCode                              = $journal['currency_code']; | ||||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; |             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||||
| 
 | 
 | ||||||
|             // perhaps use default currency instead?
 |             // perhaps use default currency instead?
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||||
|                 $currencyId   = $default->id; |                 $currencyId   = $primary->id; | ||||||
|                 $currencyCode = $default->code; |                 $currencyCode = $primary->code; | ||||||
|             } |             } | ||||||
|             // use foreign amount when the foreign currency IS the default currency.
 |             // use foreign amount when the foreign currency IS the default currency.
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||||
|                 $field = 'foreign_amount'; |                 $field = 'foreign_amount'; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -64,33 +64,33 @@ class TagController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function noTag(GenericRequest $request): JsonResponse |     public function noTag(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 |         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||||
|         $collector->withoutTags(); |         $collector->withoutTags(); | ||||||
| 
 | 
 | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
| 
 | 
 | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             // currency
 |             // currency
 | ||||||
|             $currencyId                                = $journal['currency_id']; |             $currencyId                                = $journal['currency_id']; | ||||||
|             $currencyCode                              = $journal['currency_code']; |             $currencyCode                              = $journal['currency_code']; | ||||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; |             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||||
| 
 | 
 | ||||||
|             // perhaps use default currency instead?
 |             // perhaps use default currency instead?
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||||
|                 $currencyId   = $default->id; |                 $currencyId   = $primary->id; | ||||||
|                 $currencyCode = $default->code; |                 $currencyCode = $primary->code; | ||||||
|             } |             } | ||||||
|             // use foreign amount when the foreign currency IS the default currency.
 |             // use foreign amount when the foreign currency IS the default currency.
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||||
|                 $field = 'foreign_amount'; |                 $field = 'foreign_amount'; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -42,30 +42,30 @@ class PeriodController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function total(GenericRequest $request): JsonResponse |     public function total(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type)
 |         // collect all expenses in this period (regardless of type)
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             // currency
 |             // currency
 | ||||||
|             $currencyId                                = $journal['currency_id']; |             $currencyId                                = $journal['currency_id']; | ||||||
|             $currencyCode                              = $journal['currency_code']; |             $currencyCode                              = $journal['currency_code']; | ||||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; |             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||||
| 
 | 
 | ||||||
|             // perhaps use default currency instead?
 |             // perhaps use default currency instead?
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||||
|                 $currencyId   = $default->id; |                 $currencyId   = $primary->id; | ||||||
|                 $currencyCode = $default->code; |                 $currencyCode = $primary->code; | ||||||
|             } |             } | ||||||
|             // use foreign amount when the foreign currency IS the default currency.
 |             // use foreign amount when the foreign currency IS the default currency.
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||||
|                 $field = 'foreign_amount'; |                 $field = 'foreign_amount'; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -62,34 +62,34 @@ class TagController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function noTag(GenericRequest $request): JsonResponse |     public function noTag(GenericRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         $accounts        = $request->getAssetAccounts(); |         $accounts         = $request->getAssetAccounts(); | ||||||
|         $start           = $request->getStart(); |         $start            = $request->getStart(); | ||||||
|         $end             = $request->getEnd(); |         $end              = $request->getEnd(); | ||||||
|         $response        = []; |         $response         = []; | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 |         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts); |         $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||||
|         $collector->withoutTags(); |         $collector->withoutTags(); | ||||||
| 
 | 
 | ||||||
|         $genericSet      = $collector->getExtractedJournals(); |         $genericSet       = $collector->getExtractedJournals(); | ||||||
| 
 | 
 | ||||||
|         foreach ($genericSet as $journal) { |         foreach ($genericSet as $journal) { | ||||||
|             // currency
 |             // currency
 | ||||||
|             $currencyId                                = $journal['currency_id']; |             $currencyId                                = $journal['currency_id']; | ||||||
|             $currencyCode                              = $journal['currency_code']; |             $currencyCode                              = $journal['currency_code']; | ||||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; |             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||||
| 
 | 
 | ||||||
|             // perhaps use default currency instead?
 |             // perhaps use default currency instead?
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||||
|                 $currencyId   = $default->id; |                 $currencyId   = $primary->id; | ||||||
|                 $currencyCode = $default->code; |                 $currencyCode = $primary->code; | ||||||
|             } |             } | ||||||
|             // use foreign amount when the foreign currency IS the default currency.
 |             // use foreign amount when the foreign currency IS the default currency.
 | ||||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { |             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||||
|                 $field = 'foreign_amount'; |                 $field = 'foreign_amount'; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface; | |||||||
| use FireflyIII\Models\Account; | use FireflyIII\Models\Account; | ||||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | use FireflyIII\Support\Http\Api\TransactionFilter; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||||
| use FireflyIII\Transformers\AttachmentTransformer; | use FireflyIII\Transformers\AttachmentTransformer; | ||||||
| use FireflyIII\Transformers\PiggyBankTransformer; | use FireflyIII\Transformers\PiggyBankTransformer; | ||||||
| @@ -117,6 +118,13 @@ class ListController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $piggyBanks  = $enrichment->enrich($piggyBanks); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams()); |         $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams()); | ||||||
| @@ -125,7 +133,7 @@ class ListController extends Controller | |||||||
|         $transformer = app(PiggyBankTransformer::class); |         $transformer = app(PiggyBankTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); |         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); | ||||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); |         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|   | |||||||
| @@ -96,8 +96,8 @@ class ShowController extends Controller | |||||||
|         /** @var User $admin */ |         /** @var User $admin */ | ||||||
|         $admin       = auth()->user(); |         $admin       = auth()->user(); | ||||||
|         $enrichment  = new AccountEnrichment(); |         $enrichment  = new AccountEnrichment(); | ||||||
|  |         $enrichment->setDate($this->parameters->get('date')); | ||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $enrichment->setNative($this->nativeCurrency); |  | ||||||
|         $accounts    = $enrichment->enrich($accounts); |         $accounts    = $enrichment->enrich($accounts); | ||||||
| 
 | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
| @@ -131,8 +131,8 @@ class ShowController extends Controller | |||||||
|         /** @var User $admin */ |         /** @var User $admin */ | ||||||
|         $admin       = auth()->user(); |         $admin       = auth()->user(); | ||||||
|         $enrichment  = new AccountEnrichment(); |         $enrichment  = new AccountEnrichment(); | ||||||
|  |         $enrichment->setDate($this->parameters->get('date')); | ||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $enrichment->setNative($this->nativeCurrency); |  | ||||||
|         $account     = $enrichment->enrichSingle($account); |         $account     = $enrichment->enrichSingle($account); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -75,8 +75,8 @@ class StoreController extends Controller | |||||||
|         /** @var User $admin */ |         /** @var User $admin */ | ||||||
|         $admin       = auth()->user(); |         $admin       = auth()->user(); | ||||||
|         $enrichment  = new AccountEnrichment(); |         $enrichment  = new AccountEnrichment(); | ||||||
|  |         $enrichment->setDate(null); | ||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $enrichment->setNative($this->nativeCurrency); |  | ||||||
|         $account     = $enrichment->enrichSingle($account); |         $account     = $enrichment->enrichSingle($account); | ||||||
| 
 | 
 | ||||||
|         /** @var AccountTransformer $transformer */ |         /** @var AccountTransformer $transformer */ | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | |||||||
| use FireflyIII\Transformers\AccountTransformer; | use FireflyIII\Transformers\AccountTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @@ -67,7 +68,7 @@ class UpdateController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function update(UpdateRequest $request, Account $account): JsonResponse |     public function update(UpdateRequest $request, Account $account): JsonResponse | ||||||
|     { |     { | ||||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); |         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||||
|         $data         = $request->getUpdateData(); |         $data         = $request->getUpdateData(); | ||||||
|         $data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type); |         $data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type); | ||||||
|         $account      = $this->repository->update($account, $data); |         $account      = $this->repository->update($account, $data); | ||||||
| @@ -79,8 +80,8 @@ class UpdateController extends Controller | |||||||
|         /** @var User $admin */ |         /** @var User $admin */ | ||||||
|         $admin        = auth()->user(); |         $admin        = auth()->user(); | ||||||
|         $enrichment   = new AccountEnrichment(); |         $enrichment   = new AccountEnrichment(); | ||||||
|  |         $enrichment->setDate(null); | ||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $enrichment->setNative($this->nativeCurrency); |  | ||||||
|         $account      = $enrichment->enrichSingle($account); |         $account      = $enrichment->enrichSingle($account); | ||||||
| 
 | 
 | ||||||
|         /** @var AccountTransformer $transformer */ |         /** @var AccountTransformer $transformer */ | ||||||
|   | |||||||
| @@ -80,7 +80,7 @@ class StoreController extends Controller | |||||||
| 
 | 
 | ||||||
|             throw new NotFoundHttpException(); |             throw new NotFoundHttpException(); | ||||||
|         } |         } | ||||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); |         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||||
|         $data        = $request->getAll(); |         $data        = $request->getAll(); | ||||||
|         $attachment  = $this->repository->store($data); |         $attachment  = $this->repository->store($data); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| @@ -109,13 +109,13 @@ class StoreController extends Controller | |||||||
|         $helper = app(AttachmentHelperInterface::class); |         $helper = app(AttachmentHelperInterface::class); | ||||||
|         $body   = $request->getContent(); |         $body   = $request->getContent(); | ||||||
|         if ('' === $body) { |         if ('' === $body) { | ||||||
|             app('log')->error('Body of attachment is empty.'); |             Log::error('Body of attachment is empty.'); | ||||||
| 
 | 
 | ||||||
|             return response()->json([], 422); |             return response()->json([], 422); | ||||||
|         } |         } | ||||||
|         $result = $helper->saveAttachmentFromApi($attachment, $body); |         $result = $helper->saveAttachmentFromApi($attachment, $body); | ||||||
|         if (false === $result) { |         if (false === $result) { | ||||||
|             app('log')->error('Could not save attachment from API.'); |             Log::error('Could not save attachment from API.'); | ||||||
| 
 | 
 | ||||||
|             return response()->json([], 422); |             return response()->json([], 422); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Models\AvailableBudget; | use FireflyIII\Models\AvailableBudget; | ||||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment; | ||||||
| use FireflyIII\Transformers\AvailableBudgetTransformer; | use FireflyIII\Transformers\AvailableBudgetTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| @@ -75,7 +76,6 @@ class ShowController extends Controller | |||||||
| 
 | 
 | ||||||
|         // types to get, page size:
 |         // types to get, page size:
 | ||||||
|         $pageSize         = $this->parameters->get('limit'); |         $pageSize         = $this->parameters->get('limit'); | ||||||
| 
 |  | ||||||
|         $start            = $this->parameters->get('start'); |         $start            = $this->parameters->get('start'); | ||||||
|         $end              = $this->parameters->get('end'); |         $end              = $this->parameters->get('end'); | ||||||
| 
 | 
 | ||||||
| @@ -84,6 +84,13 @@ class ShowController extends Controller | |||||||
|         $count            = $collection->count(); |         $count            = $collection->count(); | ||||||
|         $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin            = auth()->user(); | ||||||
|  |         $enrichment       = new AvailableBudgetEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $availableBudgets = $enrichment->enrich($availableBudgets); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator        = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); |         $paginator        = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams()); |         $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams()); | ||||||
| @@ -106,13 +113,25 @@ class ShowController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function show(AvailableBudget $availableBudget): JsonResponse |     public function show(AvailableBudget $availableBudget): JsonResponse | ||||||
|     { |     { | ||||||
|         $manager     = $this->getManager(); |         $manager         = $this->getManager(); | ||||||
|  |         $start           = $this->parameters->get('start'); | ||||||
|  |         $end             = $this->parameters->get('end'); | ||||||
| 
 | 
 | ||||||
|         /** @var AvailableBudgetTransformer $transformer */ |         /** @var AvailableBudgetTransformer $transformer */ | ||||||
|         $transformer = app(AvailableBudgetTransformer::class); |         $transformer     = app(AvailableBudgetTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new Item($availableBudget, $transformer, 'available_budgets'); |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin           = auth()->user(); | ||||||
|  |         $enrichment      = new AvailableBudgetEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($start); | ||||||
|  |         $enrichment->setEnd($end); | ||||||
|  |         $availableBudget = $enrichment->enrichSingle($availableBudget); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $resource        = new Item($availableBudget, $transformer, 'available_budgets'); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Models\Bill; | use FireflyIII\Models\Bill; | ||||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||||
| use FireflyIII\Transformers\BillTransformer; | use FireflyIII\Transformers\BillTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use Illuminate\Pagination\LengthAwarePaginator; | use Illuminate\Pagination\LengthAwarePaginator; | ||||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||||
| @@ -76,6 +78,15 @@ class ShowController extends Controller | |||||||
|         $bills       = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $bills       = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
|         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new SubscriptionEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $bills       = $enrichment->enrich($bills); | ||||||
|  | 
 | ||||||
|         /** @var BillTransformer $transformer */ |         /** @var BillTransformer $transformer */ | ||||||
|         $transformer = app(BillTransformer::class); |         $transformer = app(BillTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| @@ -96,6 +107,15 @@ class ShowController extends Controller | |||||||
|     { |     { | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new SubscriptionEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $bill        = $enrichment->enrichSingle($bill); | ||||||
|  | 
 | ||||||
|         /** @var BillTransformer $transformer */ |         /** @var BillTransformer $transformer */ | ||||||
|         $transformer = app(BillTransformer::class); |         $transformer = app(BillTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -29,7 +29,9 @@ use FireflyIII\Api\V1\Requests\Models\Bill\StoreRequest; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | use FireflyIII\Support\Http\Api\TransactionFilter; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||||
| use FireflyIII\Transformers\BillTransformer; | use FireflyIII\Transformers\BillTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -72,6 +74,15 @@ class StoreController extends Controller | |||||||
|         $bill        = $this->repository->store($data); |         $bill        = $this->repository->store($data); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new SubscriptionEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $bill        = $enrichment->enrichSingle($bill); | ||||||
|  | 
 | ||||||
|         /** @var BillTransformer $transformer */ |         /** @var BillTransformer $transformer */ | ||||||
|         $transformer = app(BillTransformer::class); |         $transformer = app(BillTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\Bill\UpdateRequest; | use FireflyIII\Api\V1\Requests\Models\Bill\UpdateRequest; | ||||||
| use FireflyIII\Models\Bill; | use FireflyIII\Models\Bill; | ||||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||||
| use FireflyIII\Transformers\BillTransformer; | use FireflyIII\Transformers\BillTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -67,6 +69,15 @@ class UpdateController extends Controller | |||||||
|         $bill        = $this->repository->update($bill, $data); |         $bill        = $this->repository->update($bill, $data); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new SubscriptionEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $bill        = $enrichment->enrichSingle($bill); | ||||||
|  | 
 | ||||||
|         /** @var BillTransformer $transformer */ |         /** @var BillTransformer $transformer */ | ||||||
|         $transformer = app(BillTransformer::class); |         $transformer = app(BillTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ use FireflyIII\Models\Budget; | |||||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | use FireflyIII\Support\Http\Api\TransactionFilter; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||||
| use FireflyIII\Transformers\AttachmentTransformer; | use FireflyIII\Transformers\AttachmentTransformer; | ||||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | use FireflyIII\Transformers\BudgetLimitTransformer; | ||||||
| @@ -117,6 +118,14 @@ class ListController extends Controller | |||||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); |         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]).$this->buildParams()); |         $paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]).$this->buildParams()); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin        = auth()->user(); | ||||||
|  |         $enrichment   = new BudgetLimitEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         /** @var BudgetLimitTransformer $transformer */ |         /** @var BudgetLimitTransformer $transformer */ | ||||||
|         $transformer  = app(BudgetLimitTransformer::class); |         $transformer  = app(BudgetLimitTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -29,7 +29,9 @@ use FireflyIII\Exceptions\FireflyException; | |||||||
| use FireflyIII\Models\Budget; | use FireflyIII\Models\Budget; | ||||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment; | ||||||
| use FireflyIII\Transformers\BudgetTransformer; | use FireflyIII\Transformers\BudgetTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use Illuminate\Pagination\LengthAwarePaginator; | use Illuminate\Pagination\LengthAwarePaginator; | ||||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||||
| @@ -82,6 +84,15 @@ class ShowController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $budgets     = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $budgets     = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new BudgetEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $budgets     = $enrichment->enrich($budgets); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.budgets.index').$this->buildParams()); |         $paginator->setPath(route('api.v1.budgets.index').$this->buildParams()); | ||||||
| @@ -103,6 +114,15 @@ class ShowController extends Controller | |||||||
|     { |     { | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new BudgetEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $budget      = $enrichment->enrichSingle($budget); | ||||||
|  | 
 | ||||||
|         /** @var BudgetTransformer $transformer */ |         /** @var BudgetTransformer $transformer */ | ||||||
|         $transformer = app(BudgetTransformer::class); |         $transformer = app(BudgetTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\Budget\StoreRequest; | use FireflyIII\Api\V1\Requests\Models\Budget\StoreRequest; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment; | ||||||
| use FireflyIII\Transformers\BudgetTransformer; | use FireflyIII\Transformers\BudgetTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -69,6 +71,13 @@ class StoreController extends Controller | |||||||
|         $budget->refresh(); |         $budget->refresh(); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new BudgetEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budget      = $enrichment->enrichSingle($budget); | ||||||
|  | 
 | ||||||
|         /** @var BudgetTransformer $transformer */ |         /** @var BudgetTransformer $transformer */ | ||||||
|         $transformer = app(BudgetTransformer::class); |         $transformer = app(BudgetTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\Budget\UpdateRequest; | use FireflyIII\Api\V1\Requests\Models\Budget\UpdateRequest; | ||||||
| use FireflyIII\Models\Budget; | use FireflyIII\Models\Budget; | ||||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment; | ||||||
| use FireflyIII\Transformers\BudgetTransformer; | use FireflyIII\Transformers\BudgetTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -67,6 +69,13 @@ class UpdateController extends Controller | |||||||
|         $budget      = $this->repository->update($budget, $data); |         $budget      = $this->repository->update($budget, $data); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new BudgetEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budget      = $enrichment->enrichSingle($budget); | ||||||
|  | 
 | ||||||
|         /** @var BudgetTransformer $transformer */ |         /** @var BudgetTransformer $transformer */ | ||||||
|         $transformer = app(BudgetTransformer::class); |         $transformer = app(BudgetTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -31,6 +31,7 @@ use FireflyIII\Models\Budget; | |||||||
| use FireflyIII\Models\BudgetLimit; | use FireflyIII\Models\BudgetLimit; | ||||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | use FireflyIII\Transformers\BudgetLimitTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| @@ -84,6 +85,14 @@ class ShowController extends Controller | |||||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); |         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams()); |         $paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams()); | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin        = auth()->user(); | ||||||
|  |         $enrichment   = new BudgetLimitEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||||
|  | 
 | ||||||
|         /** @var BudgetLimitTransformer $transformer */ |         /** @var BudgetLimitTransformer $transformer */ | ||||||
|         $transformer  = app(BudgetLimitTransformer::class); |         $transformer  = app(BudgetLimitTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| @@ -113,6 +122,13 @@ class ShowController extends Controller | |||||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); |         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.budget-limits.index').$this->buildParams()); |         $paginator->setPath(route('api.v1.budget-limits.index').$this->buildParams()); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin        = auth()->user(); | ||||||
|  |         $enrichment   = new BudgetLimitEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||||
|  | 
 | ||||||
|         /** @var BudgetLimitTransformer $transformer */ |         /** @var BudgetLimitTransformer $transformer */ | ||||||
|         $transformer  = app(BudgetLimitTransformer::class); |         $transformer  = app(BudgetLimitTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| @@ -137,6 +153,13 @@ class ShowController extends Controller | |||||||
|         // continue!
 |         // continue!
 | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new BudgetLimitEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budgetLimit = $enrichment->enrichSingle($budgetLimit); | ||||||
|  | 
 | ||||||
|         /** @var BudgetLimitTransformer $transformer */ |         /** @var BudgetLimitTransformer $transformer */ | ||||||
|         $transformer = app(BudgetLimitTransformer::class); |         $transformer = app(BudgetLimitTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest; | use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest; | ||||||
| use FireflyIII\Models\Budget; | use FireflyIII\Models\Budget; | ||||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | use FireflyIII\Transformers\BudgetLimitTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| @@ -69,12 +70,18 @@ class StoreController extends Controller | |||||||
|         $data               = $request->getAll(); |         $data               = $request->getAll(); | ||||||
|         $data['start_date'] = $data['start']; |         $data['start_date'] = $data['start']; | ||||||
|         $data['end_date']   = $data['end']; |         $data['end_date']   = $data['end']; | ||||||
|         $data['notes']      = $data['notes']; |  | ||||||
|         $data['budget_id']  = $budget->id; |         $data['budget_id']  = $budget->id; | ||||||
| 
 | 
 | ||||||
|         $budgetLimit        = $this->blRepository->store($data); |         $budgetLimit        = $this->blRepository->store($data); | ||||||
|         $manager            = $this->getManager(); |         $manager            = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin              = auth()->user(); | ||||||
|  |         $enrichment         = new BudgetLimitEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budgetLimit        = $enrichment->enrichSingle($budgetLimit); | ||||||
|  | 
 | ||||||
|         /** @var BudgetLimitTransformer $transformer */ |         /** @var BudgetLimitTransformer $transformer */ | ||||||
|         $transformer        = app(BudgetLimitTransformer::class); |         $transformer        = app(BudgetLimitTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ use FireflyIII\Exceptions\FireflyException; | |||||||
| use FireflyIII\Models\Budget; | use FireflyIII\Models\Budget; | ||||||
| use FireflyIII\Models\BudgetLimit; | use FireflyIII\Models\BudgetLimit; | ||||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | use FireflyIII\Transformers\BudgetLimitTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| @@ -80,6 +81,13 @@ class UpdateController extends Controller | |||||||
|         $budgetLimit       = $this->blRepository->update($budgetLimit, $data); |         $budgetLimit       = $this->blRepository->update($budgetLimit, $data); | ||||||
|         $manager           = $this->getManager(); |         $manager           = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin             = auth()->user(); | ||||||
|  |         $enrichment        = new BudgetLimitEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budgetLimit       = $enrichment->enrich($budgetLimit); | ||||||
|  | 
 | ||||||
|         /** @var BudgetLimitTransformer $transformer */ |         /** @var BudgetLimitTransformer $transformer */ | ||||||
|         $transformer       = app(BudgetLimitTransformer::class); |         $transformer       = app(BudgetLimitTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Models\Category; | use FireflyIII\Models\Category; | ||||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment; | ||||||
| use FireflyIII\Transformers\CategoryTransformer; | use FireflyIII\Transformers\CategoryTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use Illuminate\Pagination\LengthAwarePaginator; | use Illuminate\Pagination\LengthAwarePaginator; | ||||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||||
| @@ -78,6 +80,15 @@ class ShowController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $categories  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $categories  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new CategoryEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $categories  = $enrichment->enrich($categories); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.categories.index').$this->buildParams()); |         $paginator->setPath(route('api.v1.categories.index').$this->buildParams()); | ||||||
| @@ -105,6 +116,15 @@ class ShowController extends Controller | |||||||
|         $transformer = app(CategoryTransformer::class); |         $transformer = app(CategoryTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new CategoryEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $category    = $enrichment->enrichSingle($category); | ||||||
|  | 
 | ||||||
|         $resource    = new Item($category, $transformer, 'categories'); |         $resource    = new Item($category, $transformer, 'categories'); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\Category\StoreRequest; | use FireflyIII\Api\V1\Requests\Models\Category\StoreRequest; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment; | ||||||
| use FireflyIII\Transformers\CategoryTransformer; | use FireflyIII\Transformers\CategoryTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -72,6 +74,15 @@ class StoreController extends Controller | |||||||
|         $transformer = app(CategoryTransformer::class); |         $transformer = app(CategoryTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new CategoryEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $category    = $enrichment->enrichSingle($category); | ||||||
|  | 
 | ||||||
|         $resource    = new Item($category, $transformer, 'categories'); |         $resource    = new Item($category, $transformer, 'categories'); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\Category\UpdateRequest; | use FireflyIII\Api\V1\Requests\Models\Category\UpdateRequest; | ||||||
| use FireflyIII\Models\Category; | use FireflyIII\Models\Category; | ||||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment; | ||||||
| use FireflyIII\Transformers\CategoryTransformer; | use FireflyIII\Transformers\CategoryTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -71,6 +73,15 @@ class UpdateController extends Controller | |||||||
|         $transformer = app(CategoryTransformer::class); |         $transformer = app(CategoryTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new CategoryEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $category    = $enrichment->enrichSingle($category); | ||||||
|  | 
 | ||||||
|         $resource    = new Item($category, $transformer, 'categories'); |         $resource    = new Item($category, $transformer, 'categories'); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|   | |||||||
| @@ -24,7 +24,8 @@ declare(strict_types=1); | |||||||
| 
 | 
 | ||||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||||
| 
 | 
 | ||||||
| use FireflyIII\Api\V2\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
|  | use FireflyIII\Enums\UserRoleEnum; | ||||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||||
| use FireflyIII\Transformers\ExchangeRateTransformer; | use FireflyIII\Transformers\ExchangeRateTransformer; | ||||||
| @@ -39,7 +40,7 @@ class IndexController extends Controller | |||||||
|     use ValidatesUserGroupTrait; |     use ValidatesUserGroupTrait; | ||||||
| 
 | 
 | ||||||
|     public const string RESOURCE_KEY = 'currency_exchange_rates'; |     public const string RESOURCE_KEY = 'currency_exchange_rates'; | ||||||
| 
 |     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||||
|     private ExchangeRateRepositoryInterface $repository; |     private ExchangeRateRepositoryInterface $repository; | ||||||
| 
 | 
 | ||||||
|     public function __construct() |     public function __construct() | ||||||
|   | |||||||
| @@ -24,7 +24,8 @@ declare(strict_types=1); | |||||||
| 
 | 
 | ||||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||||
| 
 | 
 | ||||||
| use FireflyIII\Api\V2\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
|  | use FireflyIII\Enums\UserRoleEnum; | ||||||
| use FireflyIII\Models\CurrencyExchangeRate; | use FireflyIII\Models\CurrencyExchangeRate; | ||||||
| use FireflyIII\Models\TransactionCurrency; | use FireflyIII\Models\TransactionCurrency; | ||||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||||
| @@ -41,7 +42,7 @@ class ShowController extends Controller | |||||||
|     use ValidatesUserGroupTrait; |     use ValidatesUserGroupTrait; | ||||||
| 
 | 
 | ||||||
|     public const string RESOURCE_KEY = 'exchange-rates'; |     public const string RESOURCE_KEY = 'exchange-rates'; | ||||||
| 
 |     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||||
|     private ExchangeRateRepositoryInterface $repository; |     private ExchangeRateRepositoryInterface $repository; | ||||||
| 
 | 
 | ||||||
|     public function __construct() |     public function __construct() | ||||||
|   | |||||||
| @@ -24,9 +24,10 @@ declare(strict_types=1); | |||||||
| 
 | 
 | ||||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||||
| 
 | 
 | ||||||
|  | use FireflyIII\Enums\UserRoleEnum; | ||||||
| use FireflyIII\Models\CurrencyExchangeRate; | use FireflyIII\Models\CurrencyExchangeRate; | ||||||
| use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest; | use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest; | ||||||
| use FireflyIII\Api\V2\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||||
| use FireflyIII\Transformers\ExchangeRateTransformer; | use FireflyIII\Transformers\ExchangeRateTransformer; | ||||||
| @@ -37,7 +38,7 @@ class StoreController extends Controller | |||||||
|     use ValidatesUserGroupTrait; |     use ValidatesUserGroupTrait; | ||||||
| 
 | 
 | ||||||
|     public const string RESOURCE_KEY = 'exchange-rates'; |     public const string RESOURCE_KEY = 'exchange-rates'; | ||||||
| 
 |     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||||
|     private ExchangeRateRepositoryInterface $repository; |     private ExchangeRateRepositoryInterface $repository; | ||||||
| 
 | 
 | ||||||
|     public function __construct() |     public function __construct() | ||||||
|   | |||||||
| @@ -25,7 +25,8 @@ declare(strict_types=1); | |||||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||||
| 
 | 
 | ||||||
| use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest; | use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest; | ||||||
| use FireflyIII\Api\V2\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
|  | use FireflyIII\Enums\UserRoleEnum; | ||||||
| use FireflyIII\Models\CurrencyExchangeRate; | use FireflyIII\Models\CurrencyExchangeRate; | ||||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||||
| @@ -37,7 +38,7 @@ class UpdateController extends Controller | |||||||
|     use ValidatesUserGroupTrait; |     use ValidatesUserGroupTrait; | ||||||
| 
 | 
 | ||||||
|     public const string RESOURCE_KEY = 'exchange-rates'; |     public const string RESOURCE_KEY = 'exchange-rates'; | ||||||
| 
 |     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||||
|     private ExchangeRateRepositoryInterface $repository; |     private ExchangeRateRepositoryInterface $repository; | ||||||
| 
 | 
 | ||||||
|     public function __construct() |     public function __construct() | ||||||
|   | |||||||
| @@ -28,6 +28,8 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Models\ObjectGroup; | use FireflyIII\Models\ObjectGroup; | ||||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||||
| use FireflyIII\Transformers\BillTransformer; | use FireflyIII\Transformers\BillTransformer; | ||||||
| use FireflyIII\Transformers\PiggyBankTransformer; | use FireflyIII\Transformers\PiggyBankTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| @@ -79,6 +81,15 @@ class ListController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $bills       = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $bills       = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new SubscriptionEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $bills       = $enrichment->enrich($bills); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]).$this->buildParams()); |         $paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]).$this->buildParams()); | ||||||
| @@ -114,6 +125,13 @@ class ListController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $piggyBanks  = $enrichment->enrich($piggyBanks); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.object-groups.piggy-banks', [$objectGroup->id]).$this->buildParams()); |         $paginator->setPath(route('api.v1.object-groups.piggy-banks', [$objectGroup->id]).$this->buildParams()); | ||||||
| @@ -122,7 +140,7 @@ class ListController extends Controller | |||||||
|         $transformer = app(PiggyBankTransformer::class); |         $transformer = app(PiggyBankTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); |         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); | ||||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); |         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException; | |||||||
| use FireflyIII\Models\PiggyBank; | use FireflyIII\Models\PiggyBank; | ||||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||||
| use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEventEnrichment; | ||||||
| use FireflyIII\Transformers\AccountTransformer; | use FireflyIII\Transformers\AccountTransformer; | ||||||
| use FireflyIII\Transformers\AttachmentTransformer; | use FireflyIII\Transformers\AttachmentTransformer; | ||||||
| use FireflyIII\Transformers\PiggyBankEventTransformer; | use FireflyIII\Transformers\PiggyBankEventTransformer; | ||||||
| @@ -83,8 +84,8 @@ class ListController extends Controller | |||||||
|         /** @var User $admin */ |         /** @var User $admin */ | ||||||
|         $admin       = auth()->user(); |         $admin       = auth()->user(); | ||||||
|         $enrichment  = new AccountEnrichment(); |         $enrichment  = new AccountEnrichment(); | ||||||
|  |         $enrichment->setDate($this->parameters->get('date')); | ||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $enrichment->setNative($this->nativeCurrency); |  | ||||||
|         $accounts    = $enrichment->enrich($accounts); |         $accounts    = $enrichment->enrich($accounts); | ||||||
| 
 | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
| @@ -148,6 +149,13 @@ class ListController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $events      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $events      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEventEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $events      = $enrichment->enrich($events); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.piggy-banks.events', [$piggyBank->id]).$this->buildParams()); |         $paginator->setPath(route('api.v1.piggy-banks.events', [$piggyBank->id]).$this->buildParams()); | ||||||
| @@ -156,7 +164,7 @@ class ListController extends Controller | |||||||
|         $transformer = app(PiggyBankEventTransformer::class); |         $transformer = app(PiggyBankEventTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new FractalCollection($events, $transformer, 'piggy_bank_events'); |         $resource    = new FractalCollection($events, $transformer, sprintf('piggy-banks/%d/events', $piggyBank->id)); | ||||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); |         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Models\PiggyBank; | use FireflyIII\Models\PiggyBank; | ||||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||||
| use FireflyIII\Transformers\PiggyBankTransformer; | use FireflyIII\Transformers\PiggyBankTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use Illuminate\Pagination\LengthAwarePaginator; | use Illuminate\Pagination\LengthAwarePaginator; | ||||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||||
| @@ -77,6 +79,13 @@ class ShowController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $piggyBanks  = $enrichment->enrich($piggyBanks); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.piggy-banks.index').$this->buildParams()); |         $paginator->setPath(route('api.v1.piggy-banks.index').$this->buildParams()); | ||||||
| @@ -85,7 +94,7 @@ class ShowController extends Controller | |||||||
|         $transformer = app(PiggyBankTransformer::class); |         $transformer = app(PiggyBankTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); |         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); | ||||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); |         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
| @@ -101,11 +110,19 @@ class ShowController extends Controller | |||||||
|     { |     { | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $piggyBank   = $enrichment->enrichSingle($piggyBank); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         /** @var PiggyBankTransformer $transformer */ |         /** @var PiggyBankTransformer $transformer */ | ||||||
|         $transformer = app(PiggyBankTransformer::class); |         $transformer = app(PiggyBankTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new Item($piggyBank, $transformer, 'piggy_banks'); |         $resource    = new Item($piggyBank, $transformer, 'piggy-banks'); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\PiggyBank\StoreRequest; | use FireflyIII\Api\V1\Requests\Models\PiggyBank\StoreRequest; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||||
| use FireflyIII\Transformers\PiggyBankTransformer; | use FireflyIII\Transformers\PiggyBankTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -68,6 +70,13 @@ class StoreController extends Controller | |||||||
|         $piggyBank   = $this->repository->store($request->getAll()); |         $piggyBank   = $this->repository->store($request->getAll()); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $piggyBank   = $enrichment->enrichSingle($piggyBank); | ||||||
|  | 
 | ||||||
|         /** @var PiggyBankTransformer $transformer */ |         /** @var PiggyBankTransformer $transformer */ | ||||||
|         $transformer = app(PiggyBankTransformer::class); |         $transformer = app(PiggyBankTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\PiggyBank\UpdateRequest; | use FireflyIII\Api\V1\Requests\Models\PiggyBank\UpdateRequest; | ||||||
| use FireflyIII\Models\PiggyBank; | use FireflyIII\Models\PiggyBank; | ||||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||||
| use FireflyIII\Transformers\PiggyBankTransformer; | use FireflyIII\Transformers\PiggyBankTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -70,13 +72,20 @@ class UpdateController extends Controller | |||||||
|             $this->repository->setCurrentAmount($piggyBank, $data['current_amount']); |             $this->repository->setCurrentAmount($piggyBank, $data['current_amount']); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $piggyBank   = $enrichment->enrichSingle($piggyBank); | ||||||
|  | 
 | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|         /** @var PiggyBankTransformer $transformer */ |         /** @var PiggyBankTransformer $transformer */ | ||||||
|         $transformer = app(PiggyBankTransformer::class); |         $transformer = app(PiggyBankTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new Item($piggyBank, $transformer, 'piggy_banks'); |         $resource    = new Item($piggyBank, $transformer, 'piggy-banks'); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Models\Recurrence; | use FireflyIII\Models\Recurrence; | ||||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||||
| use FireflyIII\Transformers\RecurrenceTransformer; | use FireflyIII\Transformers\RecurrenceTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use Illuminate\Pagination\LengthAwarePaginator; | use Illuminate\Pagination\LengthAwarePaginator; | ||||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||||
| @@ -76,17 +78,24 @@ class ShowController extends Controller | |||||||
|         // get list of budgets. Count it and split it.
 |         // get list of budgets. Count it and split it.
 | ||||||
|         $collection  = $this->repository->get(); |         $collection  = $this->repository->get(); | ||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $recurrences = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
|  | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new RecurringEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $recurrences = $enrichment->enrich($recurrences); | ||||||
| 
 | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($recurrences, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.recurrences.index').$this->buildParams()); |         $paginator->setPath(route('api.v1.recurrences.index').$this->buildParams()); | ||||||
| 
 | 
 | ||||||
|         /** @var RecurrenceTransformer $transformer */ |         /** @var RecurrenceTransformer $transformer */ | ||||||
|         $transformer = app(RecurrenceTransformer::class); |         $transformer = app(RecurrenceTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'recurrences'); |         $resource    = new FractalCollection($recurrences, $transformer, 'recurrences'); | ||||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); |         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
| @@ -102,6 +111,13 @@ class ShowController extends Controller | |||||||
|     { |     { | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new RecurringEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $recurrence  = $enrichment->enrichSingle($recurrence); | ||||||
|  | 
 | ||||||
|         /** @var RecurrenceTransformer $transformer */ |         /** @var RecurrenceTransformer $transformer */ | ||||||
|         $transformer = app(RecurrenceTransformer::class); |         $transformer = app(RecurrenceTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\Recurrence\StoreRequest; | use FireflyIII\Api\V1\Requests\Models\Recurrence\StoreRequest; | ||||||
| use FireflyIII\Exceptions\FireflyException; | use FireflyIII\Exceptions\FireflyException; | ||||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||||
| use FireflyIII\Transformers\RecurrenceTransformer; | use FireflyIII\Transformers\RecurrenceTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -69,6 +71,13 @@ class StoreController extends Controller | |||||||
|         $recurrence  = $this->repository->store($data); |         $recurrence  = $this->repository->store($data); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new RecurringEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $recurrence  = $enrichment->enrichSingle($recurrence); | ||||||
|  | 
 | ||||||
|         /** @var RecurrenceTransformer $transformer */ |         /** @var RecurrenceTransformer $transformer */ | ||||||
|         $transformer = app(RecurrenceTransformer::class); |         $transformer = app(RecurrenceTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\Models\Recurrence\UpdateRequest; | use FireflyIII\Api\V1\Requests\Models\Recurrence\UpdateRequest; | ||||||
| use FireflyIII\Models\Recurrence; | use FireflyIII\Models\Recurrence; | ||||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||||
| use FireflyIII\Transformers\RecurrenceTransformer; | use FireflyIII\Transformers\RecurrenceTransformer; | ||||||
|  | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| @@ -67,6 +69,13 @@ class UpdateController extends Controller | |||||||
|         $recurrence  = $this->repository->update($recurrence, $data); |         $recurrence  = $this->repository->update($recurrence, $data); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new RecurringEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $recurrence  = $enrichment->enrichSingle($recurrence); | ||||||
|  | 
 | ||||||
|         /** @var RecurrenceTransformer $transformer */ |         /** @var RecurrenceTransformer $transformer */ | ||||||
|         $transformer = app(RecurrenceTransformer::class); |         $transformer = app(RecurrenceTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | |||||||
| use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository; | use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Class DestroyController |  * Class DestroyController | ||||||
| @@ -73,7 +74,7 @@ class DestroyController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function destroy(TransactionGroup $transactionGroup): JsonResponse |     public function destroy(TransactionGroup $transactionGroup): JsonResponse | ||||||
|     { |     { | ||||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); |         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||||
|         // grab asset account(s) from group:
 |         // grab asset account(s) from group:
 | ||||||
|         $accounts = []; |         $accounts = []; | ||||||
| 
 | 
 | ||||||
| @@ -95,7 +96,7 @@ class DestroyController extends Controller | |||||||
| 
 | 
 | ||||||
|         /** @var Account $account */ |         /** @var Account $account */ | ||||||
|         foreach ($accounts as $account) { |         foreach ($accounts as $account) { | ||||||
|             app('log')->debug(sprintf('Now going to trigger updated account event for account #%d', $account->id)); |             Log::debug(sprintf('Now going to trigger updated account event for account #%d', $account->id)); | ||||||
|             event(new UpdatedAccount($account)); |             event(new UpdatedAccount($account)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException; | |||||||
| use FireflyIII\Models\TransactionGroup; | use FireflyIII\Models\TransactionGroup; | ||||||
| use FireflyIII\Models\TransactionJournal; | use FireflyIII\Models\TransactionJournal; | ||||||
| use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface; | use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEventEnrichment; | ||||||
| use FireflyIII\Transformers\AttachmentTransformer; | use FireflyIII\Transformers\AttachmentTransformer; | ||||||
| use FireflyIII\Transformers\PiggyBankEventTransformer; | use FireflyIII\Transformers\PiggyBankEventTransformer; | ||||||
| use FireflyIII\Transformers\TransactionLinkTransformer; | use FireflyIII\Transformers\TransactionLinkTransformer; | ||||||
| @@ -113,6 +114,14 @@ class ListController extends Controller | |||||||
|         } |         } | ||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $events      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $events      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
|  | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new PiggyBankEventEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $events      = $enrichment->enrich($events); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.transactions.piggy-bank-events', [$transactionGroup->id]).$this->buildParams()); |         $paginator->setPath(route('api.v1.transactions.piggy-bank-events', [$transactionGroup->id]).$this->buildParams()); | ||||||
|   | |||||||
| @@ -147,6 +147,7 @@ class ShowController extends Controller | |||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $selectedGroup = $enrichment->enrichSingle($selectedGroup); |         $selectedGroup = $enrichment->enrichSingle($selectedGroup); | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|         /** @var TransactionGroupTransformer $transformer */ |         /** @var TransactionGroupTransformer $transformer */ | ||||||
|         $transformer   = app(TransactionGroupTransformer::class); |         $transformer   = app(TransactionGroupTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
|   | |||||||
| @@ -84,7 +84,7 @@ class StoreController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function store(StoreRequest $request): JsonResponse |     public function store(StoreRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|         app('log')->debug('Now in API StoreController::store()'); |         Log::debug('Now in API StoreController::store()'); | ||||||
|         $data               = $request->getAll(); |         $data               = $request->getAll(); | ||||||
|         $data['user']       = auth()->user(); |         $data['user']       = auth()->user(); | ||||||
|         $data['user_group'] = $this->userGroup; |         $data['user_group'] = $this->userGroup; | ||||||
| @@ -95,13 +95,13 @@ class StoreController extends Controller | |||||||
|         try { |         try { | ||||||
|             $transactionGroup = $this->groupRepository->store($data); |             $transactionGroup = $this->groupRepository->store($data); | ||||||
|         } catch (DuplicateTransactionException $e) { |         } catch (DuplicateTransactionException $e) { | ||||||
|             app('log')->warning('Caught a duplicate transaction. Return error message.'); |             Log::warning('Caught a duplicate transaction. Return error message.'); | ||||||
|             $validator = Validator::make(['transactions' => [['description' => $e->getMessage()]]], ['transactions.0.description' => new IsDuplicateTransaction()]); |             $validator = Validator::make(['transactions' => [['description' => $e->getMessage()]]], ['transactions.0.description' => new IsDuplicateTransaction()]); | ||||||
| 
 | 
 | ||||||
|             throw new ValidationException($validator); |             throw new ValidationException($validator); | ||||||
|         } catch (FireflyException $e) { |         } catch (FireflyException $e) { | ||||||
|             app('log')->warning('Caught an exception. Return error message.'); |             Log::warning('Caught an exception. Return error message.'); | ||||||
|             app('log')->error($e->getMessage()); |             Log::error($e->getMessage()); | ||||||
|             $message   = sprintf('Internal exception: %s', $e->getMessage()); |             $message   = sprintf('Internal exception: %s', $e->getMessage()); | ||||||
|             $validator = Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]); |             $validator = Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]); | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | |||||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | use FireflyIII\Transformers\TransactionGroupTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||||
| 
 | 
 | ||||||
| @@ -71,7 +72,7 @@ class UpdateController extends Controller | |||||||
|      */ |      */ | ||||||
|     public function update(UpdateRequest $request, TransactionGroup $transactionGroup): JsonResponse |     public function update(UpdateRequest $request, TransactionGroup $transactionGroup): JsonResponse | ||||||
|     { |     { | ||||||
|         app('log')->debug('Now in update routine for transaction group'); |         Log::debug('Now in update routine for transaction group'); | ||||||
|         $data              = $request->getAll(); |         $data              = $request->getAll(); | ||||||
|         $oldHash           = $this->groupRepository->getCompareHash($transactionGroup); |         $oldHash           = $this->groupRepository->getCompareHash($transactionGroup); | ||||||
|         $transactionGroup  = $this->groupRepository->update($transactionGroup, $data); |         $transactionGroup  = $this->groupRepository->update($transactionGroup, $data); | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | |||||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Validation\ValidationException; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Class DestroyController |  * Class DestroyController | ||||||
| @@ -65,6 +66,7 @@ class DestroyController extends Controller | |||||||
|      * Remove the specified resource from storage. |      * Remove the specified resource from storage. | ||||||
|      * |      * | ||||||
|      * @throws FireflyException |      * @throws FireflyException | ||||||
|  |      * @throws ValidationException | ||||||
|      */ |      */ | ||||||
|     public function destroy(TransactionCurrency $currency): JsonResponse |     public function destroy(TransactionCurrency $currency): JsonResponse | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -43,6 +43,9 @@ use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | |||||||
| use FireflyIII\Support\Http\Api\AccountFilter; | use FireflyIII\Support\Http\Api\AccountFilter; | ||||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | use FireflyIII\Support\Http\Api\TransactionFilter; | ||||||
| use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||||
|  | use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||||
| use FireflyIII\Transformers\AccountTransformer; | use FireflyIII\Transformers\AccountTransformer; | ||||||
| use FireflyIII\Transformers\AvailableBudgetTransformer; | use FireflyIII\Transformers\AvailableBudgetTransformer; | ||||||
| @@ -106,8 +109,8 @@ class ListController extends Controller | |||||||
|         /** @var User $admin */ |         /** @var User $admin */ | ||||||
|         $admin             = auth()->user(); |         $admin             = auth()->user(); | ||||||
|         $enrichment        = new AccountEnrichment(); |         $enrichment        = new AccountEnrichment(); | ||||||
|  |         $enrichment->setDate($this->parameters->get('date')); | ||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $enrichment->setNative($this->nativeCurrency); |  | ||||||
|         $accounts          = $enrichment->enrich($accounts); |         $accounts          = $enrichment->enrich($accounts); | ||||||
| 
 | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
| @@ -182,6 +185,15 @@ class ListController extends Controller | |||||||
|         $count       = $collection->count(); |         $count       = $collection->count(); | ||||||
|         $bills       = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $bills       = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin       = auth()->user(); | ||||||
|  |         $enrichment  = new SubscriptionEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $enrichment->setStart($this->parameters->get('start')); | ||||||
|  |         $enrichment->setEnd($this->parameters->get('end')); | ||||||
|  |         $bills       = $enrichment->enrichSingle($bills); | ||||||
|  | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); |         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.currencies.bills', [$currency->code]).$this->buildParams()); |         $paginator->setPath(route('api.v1.currencies.bills', [$currency->code]).$this->buildParams()); | ||||||
| @@ -217,6 +229,13 @@ class ListController extends Controller | |||||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); |         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.currencies.budget-limits', [$currency->code]).$this->buildParams()); |         $paginator->setPath(route('api.v1.currencies.budget-limits', [$currency->code]).$this->buildParams()); | ||||||
| 
 | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin        = auth()->user(); | ||||||
|  |         $enrichment   = new BudgetLimitEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||||
|  | 
 | ||||||
|         /** @var BudgetLimitTransformer $transformer */ |         /** @var BudgetLimitTransformer $transformer */ | ||||||
|         $transformer  = app(BudgetLimitTransformer::class); |         $transformer  = app(BudgetLimitTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| @@ -250,27 +269,32 @@ class ListController extends Controller | |||||||
|         $collection     = $unfiltered->filter( |         $collection     = $unfiltered->filter( | ||||||
|             static function (Recurrence $recurrence) use ($currency) {  // @phpstan-ignore-line
 |             static function (Recurrence $recurrence) use ($currency) {  // @phpstan-ignore-line
 | ||||||
|                 /** @var RecurrenceTransaction $transaction */ |                 /** @var RecurrenceTransaction $transaction */ | ||||||
|                 foreach ($recurrence->recurrenceTransactions as $transaction) { |                 if (array_any($recurrence->recurrenceTransactions, fn ($transaction) => $transaction->transaction_currency_id === $currency->id || $transaction->foreign_currency_id === $currency->id)) { | ||||||
|                     if ($transaction->transaction_currency_id === $currency->id || $transaction->foreign_currency_id === $currency->id) { |                     return $recurrence; | ||||||
|                         return $recurrence; |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 return null; |                 return null; | ||||||
|             } |             } | ||||||
|         ); |         ); | ||||||
|         $count          = $collection->count(); |         $count          = $collection->count(); | ||||||
|         $piggyBanks     = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); |         $recurrences    = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||||
|  | 
 | ||||||
|  |         // enrich
 | ||||||
|  |         /** @var User $admin */ | ||||||
|  |         $admin          = auth()->user(); | ||||||
|  |         $enrichment     = new RecurringEnrichment(); | ||||||
|  |         $enrichment->setUser($admin); | ||||||
|  |         $recurrences    = $enrichment->enrich($recurrences); | ||||||
| 
 | 
 | ||||||
|         // make paginator:
 |         // make paginator:
 | ||||||
|         $paginator      = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); |         $paginator      = new LengthAwarePaginator($recurrences, $count, $pageSize, $this->parameters->get('page')); | ||||||
|         $paginator->setPath(route('api.v1.currencies.recurrences', [$currency->code]).$this->buildParams()); |         $paginator->setPath(route('api.v1.currencies.recurrences', [$currency->code]).$this->buildParams()); | ||||||
| 
 | 
 | ||||||
|         /** @var RecurrenceTransformer $transformer */ |         /** @var RecurrenceTransformer $transformer */ | ||||||
|         $transformer    = app(RecurrenceTransformer::class); |         $transformer    = app(RecurrenceTransformer::class); | ||||||
|         $transformer->setParameters($this->parameters); |         $transformer->setParameters($this->parameters); | ||||||
| 
 | 
 | ||||||
|         $resource       = new FractalCollection($piggyBanks, $transformer, 'recurrences'); |         $resource       = new FractalCollection($recurrences, $transformer, 'recurrences'); | ||||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); |         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||||
| 
 | 
 | ||||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); |         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||||
| @@ -297,10 +321,8 @@ class ListController extends Controller | |||||||
|         $collection  = $unfiltered->filter( |         $collection  = $unfiltered->filter( | ||||||
|             static function (Rule $rule) use ($currency) { // @phpstan-ignore-line
 |             static function (Rule $rule) use ($currency) { // @phpstan-ignore-line
 | ||||||
|                 /** @var RuleTrigger $trigger */ |                 /** @var RuleTrigger $trigger */ | ||||||
|                 foreach ($rule->ruleTriggers as $trigger) { |                 if (array_any($rule->ruleTriggers, fn ($trigger) => 'currency_is' === $trigger->trigger_type && $currency->name === $trigger->trigger_value)) { | ||||||
|                     if ('currency_is' === $trigger->trigger_type && $currency->name === $trigger->trigger_value) { |                     return $rule; | ||||||
|                         return $rule; |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 return null; |                 return null; | ||||||
|   | |||||||
| @@ -107,7 +107,7 @@ class ShowController extends Controller | |||||||
|         /** @var User $user */ |         /** @var User $user */ | ||||||
|         $user        = auth()->user(); |         $user        = auth()->user(); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
|         $this->parameters->set('nativeCurrency', $this->nativeCurrency); |         $this->parameters->set('primaryCurrency', $this->primaryCurrency); | ||||||
| 
 | 
 | ||||||
|         // update fields with user info.
 |         // update fields with user info.
 | ||||||
|         $currency->refreshForUser($user); |         $currency->refreshForUser($user); | ||||||
| @@ -122,9 +122,6 @@ class ShowController extends Controller | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This endpoint is documented at: |  | ||||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/getNativeCurrency
 |  | ||||||
|      * |  | ||||||
|      * Show a currency. |      * Show a currency. | ||||||
|      * |      * | ||||||
|      * @throws FireflyException |      * @throws FireflyException | ||||||
| @@ -134,7 +131,7 @@ class ShowController extends Controller | |||||||
|         /** @var User $user */ |         /** @var User $user */ | ||||||
|         $user        = auth()->user(); |         $user        = auth()->user(); | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
|         $currency    = $this->nativeCurrency; |         $currency    = $this->primaryCurrency; | ||||||
| 
 | 
 | ||||||
|         // update fields with user info.
 |         // update fields with user info.
 | ||||||
|         $currency->refreshForUser($user); |         $currency->refreshForUser($user); | ||||||
|   | |||||||
| @@ -99,11 +99,6 @@ class UpdateController extends Controller | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This endpoint is documented at: |  | ||||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/nativeCurrency
 |  | ||||||
|      * |  | ||||||
|      * Make the currency a default currency. |  | ||||||
|      * |  | ||||||
|      * @throws FireflyException |      * @throws FireflyException | ||||||
|      */ |      */ | ||||||
|     public function makeDefault(TransactionCurrency $currency): JsonResponse |     public function makeDefault(TransactionCurrency $currency): JsonResponse | ||||||
|   | |||||||
| @@ -27,13 +27,13 @@ namespace FireflyIII\Api\V1\Controllers\Models\TransactionLinkType; | |||||||
| use Illuminate\Support\Facades\Validator; | use Illuminate\Support\Facades\Validator; | ||||||
| use FireflyIII\Api\V1\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Api\V1\Requests\Models\TransactionLinkType\StoreRequest; | use FireflyIII\Api\V1\Requests\Models\TransactionLinkType\StoreRequest; | ||||||
| use FireflyIII\Exceptions\FireflyException; |  | ||||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | use FireflyIII\Support\Http\Api\TransactionFilter; | ||||||
| use FireflyIII\Transformers\LinkTypeTransformer; | use FireflyIII\Transformers\LinkTypeTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Validation\ValidationException; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @@ -71,7 +71,7 @@ class StoreController extends Controller | |||||||
|      * |      * | ||||||
|      * Store new object. |      * Store new object. | ||||||
|      * |      * | ||||||
|      * @throws FireflyException |      * @throws ValidationException | ||||||
|      */ |      */ | ||||||
|     public function store(StoreRequest $request): JsonResponse |     public function store(StoreRequest $request): JsonResponse | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ use FireflyIII\Support\Http\Api\TransactionFilter; | |||||||
| use FireflyIII\Transformers\LinkTypeTransformer; | use FireflyIII\Transformers\LinkTypeTransformer; | ||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Validation\ValidationException; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @@ -73,6 +74,7 @@ class UpdateController extends Controller | |||||||
|      * Update object. |      * Update object. | ||||||
|      * |      * | ||||||
|      * @throws FireflyException |      * @throws FireflyException | ||||||
|  |      * @throws ValidationException | ||||||
|      */ |      */ | ||||||
|     public function update(UpdateRequest $request, LinkType $linkType): JsonResponse |     public function update(UpdateRequest $request, LinkType $linkType): JsonResponse | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ use FireflyIII\Models\UserGroup; | |||||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||||
| use FireflyIII\Transformers\UserGroupTransformer; | use FireflyIII\Transformers\UserGroupTransformer; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| 
 | 
 | ||||||
| class UpdateController extends Controller | class UpdateController extends Controller | ||||||
| { | { | ||||||
| @@ -54,7 +55,7 @@ class UpdateController extends Controller | |||||||
| 
 | 
 | ||||||
|     public function update(UpdateRequest $request, UserGroup $userGroup): JsonResponse |     public function update(UpdateRequest $request, UserGroup $userGroup): JsonResponse | ||||||
|     { |     { | ||||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); |         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||||
|         $data        = $request->getData(); |         $data        = $request->getData(); | ||||||
|         $userGroup   = $this->repository->update($userGroup, $data); |         $userGroup   = $this->repository->update($userGroup, $data); | ||||||
|         $userGroup->refresh(); |         $userGroup->refresh(); | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ use Illuminate\Http\JsonResponse; | |||||||
| use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||||
| use Illuminate\Http\Response; | use Illuminate\Http\Response; | ||||||
| use Illuminate\Pagination\LengthAwarePaginator; | use Illuminate\Pagination\LengthAwarePaginator; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||||
| use League\Fractal\Resource\Collection as FractalCollection; | use League\Fractal\Resource\Collection as FractalCollection; | ||||||
| 
 | 
 | ||||||
| @@ -71,7 +72,7 @@ class AccountController extends Controller | |||||||
|         if ('' === $query || !in_array($field, $this->validFields, true)) { |         if ('' === $query || !in_array($field, $this->validFields, true)) { | ||||||
|             return response(null, 422); |             return response(null, 422); | ||||||
|         } |         } | ||||||
|         app('log')->debug(sprintf('Now in account search("%s", "%s")', $field, $query)); |         Log::debug(sprintf('Now in account search("%s", "%s")', $field, $query)); | ||||||
|         $types       = $this->mapAccountTypes($type); |         $types       = $this->mapAccountTypes($type); | ||||||
| 
 | 
 | ||||||
|         /** @var AccountSearch $search */ |         /** @var AccountSearch $search */ | ||||||
| @@ -87,8 +88,8 @@ class AccountController extends Controller | |||||||
|         /** @var User $admin */ |         /** @var User $admin */ | ||||||
|         $admin       = auth()->user(); |         $admin       = auth()->user(); | ||||||
|         $enrichment  = new AccountEnrichment(); |         $enrichment  = new AccountEnrichment(); | ||||||
|  |         $enrichment->setDate($this->parameters->get('date')); | ||||||
|         $enrichment->setUser($admin); |         $enrichment->setUser($admin); | ||||||
|         $enrichment->setNative($this->nativeCurrency); |  | ||||||
|         $accounts    = $enrichment->enrich($accounts); |         $accounts    = $enrichment->enrich($accounts); | ||||||
| 
 | 
 | ||||||
|         /** @var AccountTransformer $transformer */ |         /** @var AccountTransformer $transformer */ | ||||||
|   | |||||||
| @@ -127,58 +127,56 @@ class BasicController extends Controller | |||||||
|     { |     { | ||||||
|         Log::debug('getBalanceInformation'); |         Log::debug('getBalanceInformation'); | ||||||
|         // some config settings
 |         // some config settings
 | ||||||
|         $convertToNative = Amount::convertToNative(); |         $convertToPrimary = Amount::convertToPrimary(); | ||||||
|         $default         = Amount::getNativeCurrency(); |         $primary          = Amount::getPrimaryCurrency(); | ||||||
|         // prep some arrays:
 |         // prep some arrays:
 | ||||||
|         $incomes         = []; |         $sums             = []; | ||||||
|         $expenses        = []; |         $return           = []; | ||||||
|         $sums            = []; |         $currencies       = [ | ||||||
|         $return          = []; |             $primary->id => $primary, | ||||||
|         $currencies      = [ |  | ||||||
|             $default->id => $default, |  | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         // collect income of user using the new group collector.
 |         // collect income of user using the new group collector.
 | ||||||
|         /** @var GroupCollectorInterface $collector */ |         /** @var GroupCollectorInterface $collector */ | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $summarizer      = new TransactionSummarizer(); |         $summarizer       = new TransactionSummarizer(); | ||||||
|         $set             = $collector->setRange($start, $end)->setTypes([TransactionTypeEnum::DEPOSIT->value])->getExtractedJournals(); |         $set              = $collector->setRange($start, $end)->setTypes([TransactionTypeEnum::DEPOSIT->value])->getExtractedJournals(); | ||||||
|         $incomes         = $summarizer->groupByCurrencyId($set, 'positive', false); |         $incomes          = $summarizer->groupByCurrencyId($set, 'positive', false); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         // collect expenses of user.
 |         // collect expenses of user.
 | ||||||
|         // collect expenses of user using the new group collector.
 |         // collect expenses of user using the new group collector.
 | ||||||
|         /** @var GroupCollectorInterface $collector */ |         /** @var GroupCollectorInterface $collector */ | ||||||
|         $collector       = app(GroupCollectorInterface::class); |         $collector        = app(GroupCollectorInterface::class); | ||||||
|         $set             = $collector->setRange($start, $end)->setPage($this->parameters->get('page'))->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->getExtractedJournals(); |         $set              = $collector->setRange($start, $end)->setPage($this->parameters->get('page'))->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->getExtractedJournals(); | ||||||
|         $expenses        = $summarizer->groupByCurrencyId($set, 'negative', false); |         $expenses         = $summarizer->groupByCurrencyId($set, 'negative', false); | ||||||
| 
 | 
 | ||||||
|         // if convert to native, do so right now.
 |         // if convert to primary, do so right now.
 | ||||||
|         if ($convertToNative) { |         if ($convertToPrimary) { | ||||||
|             $newExpenses = [ |             $newExpenses = [ | ||||||
|                 $default->id => [ |                 $primary->id => [ | ||||||
|                     'currency_id'             => $default->id, |                     'currency_id'             => $primary->id, | ||||||
|                     'currency_code'           => $default->code, |                     'currency_code'           => $primary->code, | ||||||
|                     'currency_symbol'         => $default->symbol, |                     'currency_symbol'         => $primary->symbol, | ||||||
|                     'currency_decimal_places' => $default->decimal_places, |                     'currency_decimal_places' => $primary->decimal_places, | ||||||
|                     'sum'                     => '0', |                     'sum'                     => '0', | ||||||
|                 ], |                 ], | ||||||
|             ]; |             ]; | ||||||
|             $newIncomes  = [ |             $newIncomes  = [ | ||||||
|                 $default->id => [ |                 $primary->id => [ | ||||||
|                     'currency_id'             => $default->id, |                     'currency_id'             => $primary->id, | ||||||
|                     'currency_code'           => $default->code, |                     'currency_code'           => $primary->code, | ||||||
|                     'currency_symbol'         => $default->symbol, |                     'currency_symbol'         => $primary->symbol, | ||||||
|                     'currency_decimal_places' => $default->decimal_places, |                     'currency_decimal_places' => $primary->decimal_places, | ||||||
|                     'sum'                     => '0', |                     'sum'                     => '0', | ||||||
|                 ], |                 ], | ||||||
|             ]; |             ]; | ||||||
|             $sums        = [ |             $sums        = [ | ||||||
|                 $default->id => [ |                 $primary->id => [ | ||||||
|                     'currency_id'             => $default->id, |                     'currency_id'             => $primary->id, | ||||||
|                     'currency_code'           => $default->code, |                     'currency_code'           => $primary->code, | ||||||
|                     'currency_symbol'         => $default->symbol, |                     'currency_symbol'         => $primary->symbol, | ||||||
|                     'currency_decimal_places' => $default->decimal_places, |                     'currency_decimal_places' => $primary->decimal_places, | ||||||
|                     'sum'                     => '0', |                     'sum'                     => '0', | ||||||
|                 ], |                 ], | ||||||
|             ]; |             ]; | ||||||
| @@ -190,36 +188,36 @@ class BasicController extends Controller | |||||||
|                 // loop over either one.
 |                 // loop over either one.
 | ||||||
|                 foreach ($array as $entry) { |                 foreach ($array as $entry) { | ||||||
| 
 | 
 | ||||||
|                     // if it is the native currency already.
 |                     // if it is the primary currency already.
 | ||||||
|                     if ($entry['currency_id'] === $default->id) { |                     if ($entry['currency_id'] === $primary->id) { | ||||||
|                         $sums[$default->id]['sum'] = bcadd((string) $entry['sum'], $sums[$default->id]['sum']); |                         $sums[$primary->id]['sum'] = bcadd((string) $entry['sum'], $sums[$primary->id]['sum']); | ||||||
| 
 | 
 | ||||||
|                         // don't forget to add it to newExpenses and newIncome
 |                         // don't forget to add it to newExpenses and newIncome
 | ||||||
|                         if (0 === $index) { |                         if (0 === $index) { | ||||||
|                             $newExpenses[$default->id]['sum'] = bcadd($newExpenses[$default->id]['sum'], (string) $entry['sum']); |                             $newExpenses[$primary->id]['sum'] = bcadd($newExpenses[$primary->id]['sum'], (string) $entry['sum']); | ||||||
|                         } |                         } | ||||||
|                         if (1 === $index) { |                         if (1 === $index) { | ||||||
|                             $newIncomes[$default->id]['sum'] = bcadd($newIncomes[$default->id]['sum'], (string) $entry['sum']); |                             $newIncomes[$primary->id]['sum'] = bcadd($newIncomes[$primary->id]['sum'], (string) $entry['sum']); | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     $currencies[$entry['currency_id']] ??= $this->currencyRepos->find($entry['currency_id']); |                     $currencies[$entry['currency_id']] ??= $this->currencyRepos->find($entry['currency_id']); | ||||||
|                     $convertedSum              = $converter->convert($currencies[$entry['currency_id']], $default, $start, $entry['sum']); |                     $convertedSum              = $converter->convert($currencies[$entry['currency_id']], $primary, $start, $entry['sum']); | ||||||
|                     $sums[$default->id]['sum'] = bcadd($sums[$default->id]['sum'], $convertedSum); |                     $sums[$primary->id]['sum'] = bcadd($sums[$primary->id]['sum'], $convertedSum); | ||||||
|                     if (0 === $index) { |                     if (0 === $index) { | ||||||
|                         $newExpenses[$default->id]['sum'] = bcadd($newExpenses[$default->id]['sum'], $convertedSum); |                         $newExpenses[$primary->id]['sum'] = bcadd($newExpenses[$primary->id]['sum'], $convertedSum); | ||||||
|                     } |                     } | ||||||
|                     if (1 === $index) { |                     if (1 === $index) { | ||||||
|                         $newIncomes[$default->id]['sum'] = bcadd($newIncomes[$default->id]['sum'], $convertedSum); |                         $newIncomes[$primary->id]['sum'] = bcadd($newIncomes[$primary->id]['sum'], $convertedSum); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             $incomes     = $newIncomes; |             $incomes     = $newIncomes; | ||||||
|             $expenses    = $newExpenses; |             $expenses    = $newExpenses; | ||||||
|         } |         } | ||||||
|         if (!$convertToNative) { |         if (!$convertToPrimary) { | ||||||
|             foreach ([$expenses, $incomes] as $array) { |             foreach ([$expenses, $incomes] as $array) { | ||||||
|                 foreach ($array as $entry) { |                 foreach ($array as $entry) { | ||||||
|                     $currencyId               = $entry['currency_id']; |                     $currencyId               = $entry['currency_id']; | ||||||
| @@ -235,7 +233,7 @@ class BasicController extends Controller | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // format amounts:
 |         // format amounts:
 | ||||||
|         $keys            = array_keys($sums); |         $keys             = array_keys($sums); | ||||||
|         foreach ($keys as $currencyId) { |         foreach ($keys as $currencyId) { | ||||||
|             $currency = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); |             $currency = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); | ||||||
|             if (null === $currency) { |             if (null === $currency) { | ||||||
| @@ -250,10 +248,10 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, $sums[$currencyId]['sum'] ?? '0', false), |                 'value_parsed'            => Amount::formatAnything($currency, $sums[$currencyId]['sum'] ?? '0', false), | ||||||
|                 'local_icon'              => 'balance-scale', |                 'local_icon'              => 'balance-scale', | ||||||
|                 'sub_title'               => app('amount')->formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false) |                 'sub_title'               => Amount::formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false) | ||||||
|                                              .' + '.app('amount')->formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), |                                              .' + '.Amount::formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), | ||||||
|             ]; |             ]; | ||||||
|             $return[] = [ |             $return[] = [ | ||||||
|                 'key'                     => sprintf('spent-in-%s', $currency->code), |                 'key'                     => sprintf('spent-in-%s', $currency->code), | ||||||
| @@ -263,7 +261,7 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false), |                 'value_parsed'            => Amount::formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false), | ||||||
|                 'local_icon'              => 'balance-scale', |                 'local_icon'              => 'balance-scale', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
| @@ -275,13 +273,13 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), |                 'value_parsed'            => Amount::formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), | ||||||
|                 'local_icon'              => 'balance-scale', |                 'local_icon'              => 'balance-scale', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
|         } |         } | ||||||
|         if (0 === count($return)) { |         if (0 === count($return)) { | ||||||
|             $currency = $this->nativeCurrency; |             $currency = $this->primaryCurrency; | ||||||
|             // create objects for big array.
 |             // create objects for big array.
 | ||||||
|             $return[] = [ |             $return[] = [ | ||||||
|                 'key'                     => sprintf('balance-in-%s', $currency->code), |                 'key'                     => sprintf('balance-in-%s', $currency->code), | ||||||
| @@ -291,10 +289,10 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, '0', false), |                 'value_parsed'            => Amount::formatAnything($currency, '0', false), | ||||||
|                 'local_icon'              => 'balance-scale', |                 'local_icon'              => 'balance-scale', | ||||||
|                 'sub_title'               => app('amount')->formatAnything($currency, '0', false) |                 'sub_title'               => Amount::formatAnything($currency, '0', false) | ||||||
|                                              .' + '.app('amount')->formatAnything($currency, '0', false), |                                              .' + '.Amount::formatAnything($currency, '0', false), | ||||||
|             ]; |             ]; | ||||||
|             $return[] = [ |             $return[] = [ | ||||||
|                 'key'                     => sprintf('spent-in-%s', $currency->code), |                 'key'                     => sprintf('spent-in-%s', $currency->code), | ||||||
| @@ -304,7 +302,7 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, '0', false), |                 'value_parsed'            => Amount::formatAnything($currency, '0', false), | ||||||
|                 'local_icon'              => 'balance-scale', |                 'local_icon'              => 'balance-scale', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
| @@ -316,7 +314,7 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, '0', false), |                 'value_parsed'            => Amount::formatAnything($currency, '0', false), | ||||||
|                 'local_icon'              => 'balance-scale', |                 'local_icon'              => 'balance-scale', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
| @@ -335,26 +333,26 @@ class BasicController extends Controller | |||||||
|         $paidAmount   = $this->billRepository->sumPaidInRange($start, $end); |         $paidAmount   = $this->billRepository->sumPaidInRange($start, $end); | ||||||
|         $unpaidAmount = $this->billRepository->sumUnpaidInRange($start, $end); |         $unpaidAmount = $this->billRepository->sumUnpaidInRange($start, $end); | ||||||
|         $currencies   = [ |         $currencies   = [ | ||||||
|             $this->nativeCurrency->id => $this->nativeCurrency, |             $this->primaryCurrency->id => $this->primaryCurrency, | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         if ($this->convertToNative) { |         if ($this->convertToPrimary) { | ||||||
|             $converter       = new ExchangeRateConverter(); |             $converter       = new ExchangeRateConverter(); | ||||||
|             $newPaidAmount   = [[ |             $newPaidAmount   = [[ | ||||||
|                 'id'             => $this->nativeCurrency->id, |                 'id'             => $this->primaryCurrency->id, | ||||||
|                 'name'           => $this->nativeCurrency->name, |                 'name'           => $this->primaryCurrency->name, | ||||||
|                 'symbol'         => $this->nativeCurrency->symbol, |                 'symbol'         => $this->primaryCurrency->symbol, | ||||||
|                 'code'           => $this->nativeCurrency->code, |                 'code'           => $this->primaryCurrency->code, | ||||||
|                 'decimal_places' => $this->nativeCurrency->decimal_places, |                 'decimal_places' => $this->primaryCurrency->decimal_places, | ||||||
|                 'sum'            => '0', |                 'sum'            => '0', | ||||||
|             ]]; |             ]]; | ||||||
| 
 | 
 | ||||||
|             $newUnpaidAmount = [[ |             $newUnpaidAmount = [[ | ||||||
|                 'id'             => $this->nativeCurrency->id, |                 'id'             => $this->primaryCurrency->id, | ||||||
|                 'name'           => $this->nativeCurrency->name, |                 'name'           => $this->primaryCurrency->name, | ||||||
|                 'symbol'         => $this->nativeCurrency->symbol, |                 'symbol'         => $this->primaryCurrency->symbol, | ||||||
|                 'code'           => $this->nativeCurrency->code, |                 'code'           => $this->primaryCurrency->code, | ||||||
|                 'decimal_places' => $this->nativeCurrency->decimal_places, |                 'decimal_places' => $this->primaryCurrency->decimal_places, | ||||||
|                 'sum'            => '0', |                 'sum'            => '0', | ||||||
|             ]]; |             ]]; | ||||||
|             foreach ([$paidAmount, $unpaidAmount] as $index => $array) { |             foreach ([$paidAmount, $unpaidAmount] as $index => $array) { | ||||||
| @@ -362,25 +360,25 @@ class BasicController extends Controller | |||||||
|                     $currencyId                = (int) $item['id']; |                     $currencyId                = (int) $item['id']; | ||||||
|                     if (0 === $index) { |                     if (0 === $index) { | ||||||
|                         // paid amount
 |                         // paid amount
 | ||||||
|                         if ($currencyId === $this->nativeCurrency->id) { |                         if ($currencyId === $this->primaryCurrency->id) { | ||||||
|                             $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], (string) $item['sum']); |                             $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], (string) $item['sum']); | ||||||
| 
 | 
 | ||||||
|                             continue; |                             continue; | ||||||
|                         } |                         } | ||||||
|                         $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); |                         $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); | ||||||
|                         $convertedAmount         = $converter->convert($currencies[$currencyId], $this->nativeCurrency, $start, $item['sum']); |                         $convertedAmount         = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $item['sum']); | ||||||
|                         $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], $convertedAmount); |                         $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], $convertedAmount); | ||||||
| 
 | 
 | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
|                     // unpaid amount
 |                     // unpaid amount
 | ||||||
|                     if ($currencyId === $this->nativeCurrency->id) { |                     if ($currencyId === $this->primaryCurrency->id) { | ||||||
|                         $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], (string) $item['sum']); |                         $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], (string) $item['sum']); | ||||||
| 
 | 
 | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
|                     $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); |                     $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); | ||||||
|                     $convertedAmount           = $converter->convert($currencies[$currencyId], $this->nativeCurrency, $start, $item['sum']); |                     $convertedAmount           = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $item['sum']); | ||||||
|                     $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], $convertedAmount); |                     $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], $convertedAmount); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -407,7 +405,7 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $info['code'], |                 'currency_code'           => $info['code'], | ||||||
|                 'currency_symbol'         => $info['symbol'], |                 'currency_symbol'         => $info['symbol'], | ||||||
|                 'currency_decimal_places' => $info['decimal_places'], |                 'currency_decimal_places' => $info['decimal_places'], | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($info['symbol'], $info['decimal_places'], $amount, false), |                 'value_parsed'            => Amount::formatFlat($info['symbol'], $info['decimal_places'], $amount, false), | ||||||
|                 'local_icon'              => 'check', |                 'local_icon'              => 'check', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
| @@ -426,7 +424,7 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $info['code'], |                 'currency_code'           => $info['code'], | ||||||
|                 'currency_symbol'         => $info['symbol'], |                 'currency_symbol'         => $info['symbol'], | ||||||
|                 'currency_decimal_places' => $info['decimal_places'], |                 'currency_decimal_places' => $info['decimal_places'], | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($info['symbol'], $info['decimal_places'], $amount, false), |                 'value_parsed'            => Amount::formatFlat($info['symbol'], $info['decimal_places'], $amount, false), | ||||||
|                 'local_icon'              => 'calendar-o', |                 'local_icon'              => 'calendar-o', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
| @@ -434,7 +432,7 @@ class BasicController extends Controller | |||||||
|         Log::debug(sprintf('Done with getBillInformation("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d-'))); |         Log::debug(sprintf('Done with getBillInformation("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d-'))); | ||||||
| 
 | 
 | ||||||
|         if (0 === count($return)) { |         if (0 === count($return)) { | ||||||
|             $currency = $this->nativeCurrency; |             $currency = $this->primaryCurrency; | ||||||
|             unset($info, $amount); |             unset($info, $amount); | ||||||
| 
 | 
 | ||||||
|             $return[] = [ |             $return[] = [ | ||||||
| @@ -445,7 +443,7 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($currency->symbol, $currency->decimal_places, '0', false), |                 'value_parsed'            => Amount::formatFlat($currency->symbol, $currency->decimal_places, '0', false), | ||||||
|                 'local_icon'              => 'check', |                 'local_icon'              => 'check', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
| @@ -457,7 +455,7 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currency->code, |                 'currency_code'           => $currency->code, | ||||||
|                 'currency_symbol'         => $currency->symbol, |                 'currency_symbol'         => $currency->symbol, | ||||||
|                 'currency_decimal_places' => $currency->decimal_places, |                 'currency_decimal_places' => $currency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($currency->symbol, $currency->decimal_places, '0', false), |                 'value_parsed'            => Amount::formatFlat($currency->symbol, $currency->decimal_places, '0', false), | ||||||
|                 'local_icon'              => 'calendar-o', |                 'local_icon'              => 'calendar-o', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
| @@ -495,14 +493,9 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $currencies[$currencyId]->code, |                 'currency_code'           => $currencies[$currencyId]->code, | ||||||
|                 'currency_symbol'         => $currencies[$currencyId]->symbol, |                 'currency_symbol'         => $currencies[$currencyId]->symbol, | ||||||
|                 'currency_decimal_places' => $currencies[$currencyId]->decimal_places, |                 'currency_decimal_places' => $currencies[$currencyId]->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), |                 'value_parsed'            => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), | ||||||
|                 'local_icon'              => 'money', |                 'local_icon'              => 'money', | ||||||
|                 'sub_title'               => app('amount')->formatFlat( |                 'sub_title'               => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), | ||||||
|                     $currencies[$currencyId]->symbol, |  | ||||||
|                     $currencies[$currencyId]->decimal_places, |  | ||||||
|                     $availableBudget, |  | ||||||
|                     false |  | ||||||
|                 ), |  | ||||||
|             ]; |             ]; | ||||||
|         } |         } | ||||||
|         foreach ($spent as $row) { |         foreach ($spent as $row) { | ||||||
| @@ -531,18 +524,14 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $row['currency_code'], |                 'currency_code'           => $row['currency_code'], | ||||||
|                 'currency_symbol'         => $row['currency_symbol'], |                 'currency_symbol'         => $row['currency_symbol'], | ||||||
|                 'currency_decimal_places' => $row['currency_decimal_places'], |                 'currency_decimal_places' => $row['currency_decimal_places'], | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false), |                 'value_parsed'            => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false), | ||||||
|                 'local_icon'              => 'money', |                 'local_icon'              => 'money', | ||||||
|                 'sub_title'               => app('amount')->formatFlat( |                 'sub_title'               => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $perDay, false), | ||||||
|                     $row['currency_symbol'], |  | ||||||
|                     $row['currency_decimal_places'], |  | ||||||
|                     $perDay, |  | ||||||
|                     false |  | ||||||
|                 ), |  | ||||||
|             ]; |             ]; | ||||||
|         } |         } | ||||||
|         unset($leftToSpend); |         unset($leftToSpend); | ||||||
|         if (0 === count($return)) { |         if (0 === count($return)) { | ||||||
|  |             $days  = (int) $start->diffInDays($end, true) + 1; | ||||||
|             // a small trick to get every expense in this period, regardless of budget.
 |             // a small trick to get every expense in this period, regardless of budget.
 | ||||||
|             $spent = $this->opsRepository->sumExpenses($start, $end, null, new Collection()); |             $spent = $this->opsRepository->sumExpenses($start, $end, null, new Collection()); | ||||||
|             foreach ($spent as $row) { |             foreach ($spent as $row) { | ||||||
| @@ -565,21 +554,16 @@ class BasicController extends Controller | |||||||
|                     'currency_code'           => $row['currency_code'], |                     'currency_code'           => $row['currency_code'], | ||||||
|                     'currency_symbol'         => $row['currency_symbol'], |                     'currency_symbol'         => $row['currency_symbol'], | ||||||
|                     'currency_decimal_places' => $row['currency_decimal_places'], |                     'currency_decimal_places' => $row['currency_decimal_places'], | ||||||
|                     'value_parsed'            => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $spentInCurrency, false), |                     'value_parsed'            => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $spentInCurrency, false), | ||||||
|                     'local_icon'              => 'money', |                     'local_icon'              => 'money', | ||||||
|                     'sub_title'               => app('amount')->formatFlat( |                     'sub_title'               => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $perDay, false), | ||||||
|                         $row['currency_symbol'], |  | ||||||
|                         $row['currency_decimal_places'], |  | ||||||
|                         $perDay, |  | ||||||
|                         false |  | ||||||
|                     ), |  | ||||||
|                 ]; |                 ]; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             //            $amount = '0';
 |             //            $amount = '0';
 | ||||||
|             //            // $days
 |             //            // $days
 | ||||||
|             //            // fill in by money spent, just count it.
 |             //            // fill in by money spent, just count it.
 | ||||||
|             //            $currency              = $this->nativeCurrency;
 |             //            $currency              = $this->primaryCurrency;
 | ||||||
|             //            $return[$currency->id] = [
 |             //            $return[$currency->id] = [
 | ||||||
|             //                'key'                     => sprintf('left-to-spend-in-%s', $currency->code),
 |             //                'key'                     => sprintf('left-to-spend-in-%s', $currency->code),
 | ||||||
|             //                'title'                   => trans('firefly.box_left_to_spend_in_currency', ['currency' => $currency->symbol]),
 |             //                'title'                   => trans('firefly.box_left_to_spend_in_currency', ['currency' => $currency->symbol]),
 | ||||||
| @@ -589,9 +573,9 @@ class BasicController extends Controller | |||||||
|             //                'currency_code'           => $currency->code,
 |             //                'currency_code'           => $currency->code,
 | ||||||
|             //                'currency_symbol'         => $currency->symbol,
 |             //                'currency_symbol'         => $currency->symbol,
 | ||||||
|             //                'currency_decimal_places' => $currency->decimal_places,
 |             //                'currency_decimal_places' => $currency->decimal_places,
 | ||||||
|             //                'value_parsed'            => app('amount')->formatFlat($currency->symbol, $currency->decimal_places, '0', false),
 |             //                'value_parsed'            => Amount::formatFlat($currency->symbol, $currency->decimal_places, '0', false),
 | ||||||
|             //                'local_icon'              => 'money',
 |             //                'local_icon'              => 'money',
 | ||||||
|             //                'sub_title'               => app('amount')->formatFlat(
 |             //                'sub_title'               => Amount::formatFlat(
 | ||||||
|             //                    $currency->symbol,
 |             //                    $currency->symbol,
 | ||||||
|             //                    $currency->decimal_places,
 |             //                    $currency->decimal_places,
 | ||||||
|             //                    '0',
 |             //                    '0',
 | ||||||
| @@ -628,7 +612,7 @@ class BasicController extends Controller | |||||||
|         $netWorthSet    = $netWorthHelper->byAccounts($filtered, $end); |         $netWorthSet    = $netWorthHelper->byAccounts($filtered, $end); | ||||||
|         $return         = []; |         $return         = []; | ||||||
|         foreach ($netWorthSet as $key => $data) { |         foreach ($netWorthSet as $key => $data) { | ||||||
|             if ('native' === $key) { |             if ('pc' === $key) { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             $amount   = $data['balance']; |             $amount   = $data['balance']; | ||||||
| @@ -644,21 +628,21 @@ class BasicController extends Controller | |||||||
|                 'currency_code'           => $data['currency_code'], |                 'currency_code'           => $data['currency_code'], | ||||||
|                 'currency_symbol'         => $data['currency_symbol'], |                 'currency_symbol'         => $data['currency_symbol'], | ||||||
|                 'currency_decimal_places' => $data['currency_decimal_places'], |                 'currency_decimal_places' => $data['currency_decimal_places'], | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($data['currency_symbol'], $data['currency_decimal_places'], $data['balance'], false), |                 'value_parsed'            => Amount::formatFlat($data['currency_symbol'], $data['currency_decimal_places'], $data['balance'], false), | ||||||
|                 'local_icon'              => 'line-chart', |                 'local_icon'              => 'line-chart', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
|         } |         } | ||||||
|         if (0 === count($return)) { |         if (0 === count($return)) { | ||||||
|             $return[] = [ |             $return[] = [ | ||||||
|                 'key'                     => sprintf('net-worth-in-%s', $this->nativeCurrency->code), |                 'key'                     => sprintf('net-worth-in-%s', $this->primaryCurrency->code), | ||||||
|                 'title'                   => trans('firefly.box_net_worth_in_currency', ['currency' => $this->nativeCurrency->symbol]), |                 'title'                   => trans('firefly.box_net_worth_in_currency', ['currency' => $this->primaryCurrency->symbol]), | ||||||
|                 'monetary_value'          => '0', |                 'monetary_value'          => '0', | ||||||
|                 'currency_id'             => (string) $this->nativeCurrency->id, |                 'currency_id'             => (string) $this->primaryCurrency->id, | ||||||
|                 'currency_code'           => $this->nativeCurrency->code, |                 'currency_code'           => $this->primaryCurrency->code, | ||||||
|                 'currency_symbol'         => $this->nativeCurrency->symbol, |                 'currency_symbol'         => $this->primaryCurrency->symbol, | ||||||
|                 'currency_decimal_places' => $this->nativeCurrency->decimal_places, |                 'currency_decimal_places' => $this->primaryCurrency->decimal_places, | ||||||
|                 'value_parsed'            => app('amount')->formatFlat($this->nativeCurrency->symbol, $this->nativeCurrency->decimal_places, '0', false), |                 'value_parsed'            => Amount::formatFlat($this->primaryCurrency->symbol, $this->primaryCurrency->decimal_places, '0', false), | ||||||
|                 'local_icon'              => 'line-chart', |                 'local_icon'              => 'line-chart', | ||||||
|                 'sub_title'               => '', |                 'sub_title'               => '', | ||||||
|             ]; |             ]; | ||||||
|   | |||||||
| @@ -24,6 +24,8 @@ declare(strict_types=1); | |||||||
| 
 | 
 | ||||||
| namespace FireflyIII\Api\V1\Controllers\System; | namespace FireflyIII\Api\V1\Controllers\System; | ||||||
| 
 | 
 | ||||||
|  | use FireflyIII\Support\Facades\FireflyConfig; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| use Illuminate\Support\Facades\Validator; | use Illuminate\Support\Facades\Validator; | ||||||
| use FireflyIII\Api\V1\Controllers\Controller; | use FireflyIII\Api\V1\Controllers\Controller; | ||||||
| use FireflyIII\Api\V1\Requests\System\UpdateRequest; | use FireflyIII\Api\V1\Requests\System\UpdateRequest; | ||||||
| @@ -31,6 +33,7 @@ use FireflyIII\Exceptions\FireflyException; | |||||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||||
| use FireflyIII\Support\Binder\EitherConfigKey; | use FireflyIII\Support\Binder\EitherConfigKey; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Validation\ValidationException; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Class ConfigurationController |  * Class ConfigurationController | ||||||
| @@ -65,8 +68,8 @@ class ConfigurationController extends Controller | |||||||
|         try { |         try { | ||||||
|             $dynamicData = $this->getDynamicConfiguration(); |             $dynamicData = $this->getDynamicConfiguration(); | ||||||
|         } catch (FireflyException $e) { |         } catch (FireflyException $e) { | ||||||
|             app('log')->error($e->getMessage()); |             Log::error($e->getMessage()); | ||||||
|             app('log')->error($e->getTraceAsString()); |             Log::error($e->getTraceAsString()); | ||||||
| 
 | 
 | ||||||
|             throw new FireflyException('200030: Could not load config variables.', 0, $e); |             throw new FireflyException('200030: Could not load config variables.', 0, $e); | ||||||
|         } |         } | ||||||
| @@ -92,13 +95,15 @@ class ConfigurationController extends Controller | |||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Get all config values. |      * Get all config values. | ||||||
|  |      * | ||||||
|  |      * @throws FireflyException | ||||||
|      */ |      */ | ||||||
|     private function getDynamicConfiguration(): array |     private function getDynamicConfiguration(): array | ||||||
|     { |     { | ||||||
|         $isDemoSite  = app('fireflyconfig')->get('is_demo_site'); |         $isDemoSite  = FireflyConfig::get('is_demo_site'); | ||||||
|         $updateCheck = app('fireflyconfig')->get('permission_update_check'); |         $updateCheck = FireflyConfig::get('permission_update_check'); | ||||||
|         $lastCheck   = app('fireflyconfig')->get('last_update_check'); |         $lastCheck   = FireflyConfig::get('last_update_check'); | ||||||
|         $singleUser  = app('fireflyconfig')->get('single_user_mode'); |         $singleUser  = FireflyConfig::get('single_user_mode'); | ||||||
| 
 | 
 | ||||||
|         return [ |         return [ | ||||||
|             'is_demo_site'            => $isDemoSite?->data, |             'is_demo_site'            => $isDemoSite?->data, | ||||||
| @@ -153,6 +158,7 @@ class ConfigurationController extends Controller | |||||||
|      * Update the configuration. |      * Update the configuration. | ||||||
|      * |      * | ||||||
|      * @throws FireflyException |      * @throws FireflyException | ||||||
|  |      * @throws ValidationException | ||||||
|      */ |      */ | ||||||
|     public function update(UpdateRequest $request, string $name): JsonResponse |     public function update(UpdateRequest $request, string $name): JsonResponse | ||||||
|     { |     { | ||||||
| @@ -164,7 +170,7 @@ class ConfigurationController extends Controller | |||||||
|         $data      = $request->getAll(); |         $data      = $request->getAll(); | ||||||
|         $shortName = str_replace('configuration.', '', $name); |         $shortName = str_replace('configuration.', '', $name); | ||||||
| 
 | 
 | ||||||
|         app('fireflyconfig')->set($shortName, $data['value']); |         FireflyConfig::set($shortName, $data['value']); | ||||||
| 
 | 
 | ||||||
|         // get updated config:
 |         // get updated config:
 | ||||||
|         $newConfig = $this->getDynamicConfiguration(); |         $newConfig = $this->getDynamicConfiguration(); | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | |||||||
| use FireflyIII\Api\V1\Requests\System\CronRequest; | use FireflyIII\Api\V1\Requests\System\CronRequest; | ||||||
| use FireflyIII\Support\Http\Controllers\CronRunner; | use FireflyIII\Support\Http\Controllers\CronRunner; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Class CronController |  * Class CronController | ||||||
| @@ -44,8 +45,8 @@ class CronController extends Controller | |||||||
|     { |     { | ||||||
|         $config                           = $request->getAll(); |         $config                           = $request->getAll(); | ||||||
| 
 | 
 | ||||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); |         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||||
|         app('log')->debug(sprintf('Date is %s', $config['date']->toIsoString())); |         Log::debug(sprintf('Date is %s', $config['date']->toIsoString())); | ||||||
|         $return                           = []; |         $return                           = []; | ||||||
|         $return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']); |         $return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']); | ||||||
|         $return['auto_budgets']           = $this->runAutoBudget($config['force'], $config['date']); |         $return['auto_budgets']           = $this->runAutoBudget($config['force'], $config['date']); | ||||||
| @@ -53,6 +54,7 @@ class CronController extends Controller | |||||||
|             $return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']); |             $return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']); | ||||||
|         } |         } | ||||||
|         $return['bill_notifications']     = $this->billWarningCronJob($config['force'], $config['date']); |         $return['bill_notifications']     = $this->billWarningCronJob($config['force'], $config['date']); | ||||||
|  |         $return['webhooks']               = $this->webhookCronJob($config['force'], $config['date']); | ||||||
| 
 | 
 | ||||||
|         return response()->api($return); |         return response()->api($return); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ use FireflyIII\Transformers\UserTransformer; | |||||||
| use FireflyIII\User; | use FireflyIII\User; | ||||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||||
| use Illuminate\Pagination\LengthAwarePaginator; | use Illuminate\Pagination\LengthAwarePaginator; | ||||||
|  | use Illuminate\Support\Facades\Log; | ||||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||||
| use League\Fractal\Resource\Collection as FractalCollection; | use League\Fractal\Resource\Collection as FractalCollection; | ||||||
| use League\Fractal\Resource\Item; | use League\Fractal\Resource\Item; | ||||||
| @@ -174,7 +175,7 @@ class UserController extends Controller | |||||||
| 
 | 
 | ||||||
|         // can only update 'blocked' when user is admin.
 |         // can only update 'blocked' when user is admin.
 | ||||||
|         if (!$this->repository->hasRole(auth()->user(), 'owner')) { |         if (!$this->repository->hasRole(auth()->user(), 'owner')) { | ||||||
|             app('log')->debug('Quietly drop fields "blocked" and "blocked_code" from request.'); |             Log::debug('Quietly drop fields "blocked" and "blocked_code" from request.'); | ||||||
|             unset($data['blocked'], $data['blocked_code']); |             unset($data['blocked'], $data['blocked_code']); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -85,7 +85,7 @@ class PreferencesController extends Controller | |||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
| 
 | 
 | ||||||
|         if ('currencyPreference' === $preference->name) { |         if ('currencyPreference' === $preference->name) { | ||||||
|             throw new FireflyException('Please use api/v1/currencies/native instead.'); |             throw new FireflyException('Please use api/v1/currencies/primary instead.'); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /** @var PreferenceTransformer $transformer */ |         /** @var PreferenceTransformer $transformer */ | ||||||
| @@ -132,7 +132,7 @@ class PreferencesController extends Controller | |||||||
|     public function update(PreferenceUpdateRequest $request, Preference $preference): JsonResponse |     public function update(PreferenceUpdateRequest $request, Preference $preference): JsonResponse | ||||||
|     { |     { | ||||||
|         if ('currencyPreference' === $preference->name) { |         if ('currencyPreference' === $preference->name) { | ||||||
|             throw new FireflyException('Please use api/v1/currencies/native instead.'); |             throw new FireflyException('Please use api/v1/currencies/primary instead.'); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         $manager     = $this->getManager(); |         $manager     = $this->getManager(); | ||||||
|   | |||||||
| @@ -138,7 +138,7 @@ class ShowController extends Controller | |||||||
|             throw new NotFoundHttpException('Webhooks are not enabled.'); |             throw new NotFoundHttpException('Webhooks are not enabled.'); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         app('log')->debug(sprintf('Now in triggerTransaction(%d, %d)', $webhook->id, $group->id)); |         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)); |         Log::channel('audit')->info(sprintf('User triggers webhook #%d on transaction group #%d.', $webhook->id, $group->id)); | ||||||
| 
 | 
 | ||||||
|         /** @var MessageGeneratorInterface $engine */ |         /** @var MessageGeneratorInterface $engine */ | ||||||
| @@ -155,7 +155,7 @@ class ShowController extends Controller | |||||||
|         $engine->generateMessages(); |         $engine->generateMessages(); | ||||||
| 
 | 
 | ||||||
|         // trigger event to send them:
 |         // trigger event to send them:
 | ||||||
|         app('log')->debug('send event RequestedSendWebhookMessages'); |         Log::debug('send event RequestedSendWebhookMessages'); | ||||||
|         event(new RequestedSendWebhookMessages()); |         event(new RequestedSendWebhookMessages()); | ||||||
| 
 | 
 | ||||||
|         return response()->json([], 204); |         return response()->json([], 204); | ||||||
|   | |||||||
| @@ -76,6 +76,6 @@ class SubmitController extends Controller | |||||||
|             SendWebhookMessage::dispatch($message)->afterResponse(); |             SendWebhookMessage::dispatch($message)->afterResponse(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return response()->json([]); |         return response()->json(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ class AutocompleteRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'date' => 'date|after:1900-01-01|before:2099-12-31', |             'date' => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -60,8 +60,8 @@ class ChartRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'start'       => 'required|date|after:1900-01-01|before:2099-12-31|before_or_equal:end', |             'start'       => 'required|date|after:1970-01-02|before:2038-01-17|before_or_equal:end', | ||||||
|             'end'         => 'required|date|after:1900-01-01|before:2099-12-31|after_or_equal:start', |             'end'         => 'required|date|after:1970-01-02|before:2038-01-17|after_or_equal:start', | ||||||
|             'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))), |             'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))), | ||||||
|             'period'      => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))), |             'period'      => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))), | ||||||
|             'accounts.*'  => 'exists:accounts,id', |             'accounts.*'  => 'exists:accounts,id', | ||||||
|   | |||||||
| @@ -54,8 +54,8 @@ class TransactionRequest extends FormRequest | |||||||
|                 'query' => json_decode($this->get('query'), true, 8, JSON_THROW_ON_ERROR), |                 'query' => json_decode($this->get('query'), true, 8, JSON_THROW_ON_ERROR), | ||||||
|             ]; |             ]; | ||||||
|         } catch (JsonException $e) { |         } catch (JsonException $e) { | ||||||
|             // dont really care. the validation should catch invalid json.
 |             // don't really care. the validation should catch invalid json.
 | ||||||
|             app('log')->error($e->getMessage()); |             Log::error($e->getMessage()); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return $data; |         return $data; | ||||||
|   | |||||||
| @@ -65,9 +65,9 @@ class DateRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'date'  => 'date|after:1900-01-01|before:2099-12-31', |             'date'  => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'start' => 'date|after:1900-01-01|before:2099-12-31|before:end|required_with:end', |             'start' => 'date|after:1970-01-02|before:2038-01-17|before:end|required_with:end', | ||||||
|             'end'   => 'date|after:1900-01-01|before:2099-12-31|after:start|required_with:start', |             'end'   => 'date|after:1970-01-02|before:2038-01-17|after:start|required_with:start', | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,62 +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\Generic; |  | ||||||
| 
 |  | ||||||
| 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 |  | ||||||
|     { |  | ||||||
|         return [ |  | ||||||
|             'start' => $this->getCarbonDate('start')->startOfDay(), |  | ||||||
|             'end'   => $this->getCarbonDate('end')->endOfDay(), |  | ||||||
|         ]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * The rules that the incoming request must be matched against. |  | ||||||
|      */ |  | ||||||
|     public function rules(): array |  | ||||||
|     { |  | ||||||
|         return [ |  | ||||||
|             'start' => 'required|date|after:1900-01-01|before:2099-12-31', |  | ||||||
|             'end'   => 'required|date|after_or_equal:start|before:2099-12-31|after:1900-01-01', |  | ||||||
|         ]; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -53,7 +53,7 @@ class SingleDateRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'date' => 'required|date|after:1900-01-01|before:2099-12-31', |             'date' => 'required|date|after:1970-01-02|before:2038-01-17', | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -66,8 +66,8 @@ class Request extends FormRequest | |||||||
|             'currency_id'   => 'numeric|exists:transaction_currencies,id', |             'currency_id'   => 'numeric|exists:transaction_currencies,id', | ||||||
|             'currency_code' => 'min:3|max:51|exists:transaction_currencies,code', |             'currency_code' => 'min:3|max:51|exists:transaction_currencies,code', | ||||||
|             'amount'        => ['nullable', new IsValidPositiveAmount()], |             'amount'        => ['nullable', new IsValidPositiveAmount()], | ||||||
|             'start'         => 'date|after:1900-01-01|before:2099-12-31', |             'start'         => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'end'           => 'date|after:1900-01-01|before:2099-12-31', |             'end'           => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -47,7 +47,7 @@ class StoreRequest extends FormRequest | |||||||
|      */ |      */ | ||||||
|     public function getAll(): array |     public function getAll(): array | ||||||
|     { |     { | ||||||
|         app('log')->debug('Raw fields in Bill StoreRequest', $this->all()); |         Log::debug('Raw fields in Bill StoreRequest', $this->all()); | ||||||
|         $fields = [ |         $fields = [ | ||||||
|             'name'               => ['name', 'convertString'], |             'name'               => ['name', 'convertString'], | ||||||
|             'amount_min'         => ['amount_min', 'convertString'], |             'amount_min'         => ['amount_min', 'convertString'], | ||||||
| @@ -80,9 +80,9 @@ class StoreRequest extends FormRequest | |||||||
|             'amount_max'     => ['required', new IsValidPositiveAmount()], |             'amount_max'     => ['required', new IsValidPositiveAmount()], | ||||||
|             'currency_id'    => 'numeric|exists:transaction_currencies,id', |             'currency_id'    => 'numeric|exists:transaction_currencies,id', | ||||||
|             'currency_code'  => 'min:3|max:51|exists:transaction_currencies,code', |             'currency_code'  => 'min:3|max:51|exists:transaction_currencies,code', | ||||||
|             'date'           => 'date|required|after:1900-01-01|before:2099-12-31', |             'date'           => 'date|required|after:1970-01-02|before:2038-01-17', | ||||||
|             'end_date'       => 'nullable|date|after:date|after:1900-01-01|before:2099-12-31', |             'end_date'       => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17', | ||||||
|             'extension_date' => 'nullable|date|after:date|after:1900-01-01|before:2099-12-31', |             'extension_date' => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17', | ||||||
|             'repeat_freq'    => 'in:weekly,monthly,quarterly,half-year,yearly|required', |             'repeat_freq'    => 'in:weekly,monthly,quarterly,half-year,yearly|required', | ||||||
|             'skip'           => 'min:0|max:31|numeric', |             'skip'           => 'min:0|max:31|numeric', | ||||||
|             'active'         => [new IsBoolean()], |             'active'         => [new IsBoolean()], | ||||||
| @@ -128,7 +128,6 @@ class StoreRequest extends FormRequest | |||||||
|             $failed = $validator->fails(); |             $failed = $validator->fails(); | ||||||
|         } catch (TypeError $e) { |         } catch (TypeError $e) { | ||||||
|             Log::error($e->getMessage()); |             Log::error($e->getMessage()); | ||||||
|             $failed = false; |  | ||||||
|         } |         } | ||||||
|         if ($failed) { |         if ($failed) { | ||||||
|             Log::channel('audit')->error(sprintf('Validation errors in %s', self::class), $validator->errors()->toArray()); |             Log::channel('audit')->error(sprintf('Validation errors in %s', self::class), $validator->errors()->toArray()); | ||||||
|   | |||||||
| @@ -81,9 +81,9 @@ class UpdateRequest extends FormRequest | |||||||
|             'amount_max'     => ['nullable', new IsValidPositiveAmount()], |             'amount_max'     => ['nullable', new IsValidPositiveAmount()], | ||||||
|             'currency_id'    => 'numeric|exists:transaction_currencies,id', |             'currency_id'    => 'numeric|exists:transaction_currencies,id', | ||||||
|             'currency_code'  => 'min:3|max:51|exists:transaction_currencies,code', |             'currency_code'  => 'min:3|max:51|exists:transaction_currencies,code', | ||||||
|             'date'           => 'date|after:1900-01-01|before:2099-12-31', |             'date'           => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'end_date'       => 'date|after:date|after:1900-01-01|before:2099-12-31', |             'end_date'       => 'date|after:date|after:1970-01-02|before:2038-01-17', | ||||||
|             'extension_date' => 'date|after:date|after:1900-01-01|before:2099-12-31', |             'extension_date' => 'date|after:date|after:1970-01-02|before:2038-01-17', | ||||||
|             'repeat_freq'    => 'in:weekly,monthly,quarterly,half-year,yearly', |             'repeat_freq'    => 'in:weekly,monthly,quarterly,half-year,yearly', | ||||||
|             'skip'           => 'min:0|max:31|numeric', |             'skip'           => 'min:0|max:31|numeric', | ||||||
|             'active'         => [new IsBoolean()], |             'active'         => [new IsBoolean()], | ||||||
|   | |||||||
| @@ -67,8 +67,8 @@ class UpdateRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'start'         => 'date|after:1900-01-01|before:2099-12-31', |             'start'         => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'end'           => 'date|after:1900-01-01|before:2099-12-31', |             'end'           => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'amount'        => ['nullable', new IsValidPositiveAmount()], |             'amount'        => ['nullable', new IsValidPositiveAmount()], | ||||||
|             'currency_id'   => 'numeric|exists:transaction_currencies,id', |             'currency_id'   => 'numeric|exists:transaction_currencies,id', | ||||||
|             'currency_code' => 'min:3|max:51|exists:transaction_currencies,code', |             'currency_code' => 'min:3|max:51|exists:transaction_currencies,code', | ||||||
|   | |||||||
| @@ -45,7 +45,7 @@ class DestroyRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'date' => 'required|date|after:1900-01-01|before:2099-12-31', |             'date' => 'required|date|after:1970-01-02|before:2038-01-17', | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -61,7 +61,7 @@ class StoreRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'date' => 'required|date|after:1900-01-01|before:2099-12-31', |             'date' => 'required|date|after:1970-01-02|before:2038-01-17', | ||||||
|             'rate' => 'required|numeric|gt:0', |             'rate' => 'required|numeric|gt:0', | ||||||
|             'from' => 'required|exists:transaction_currencies,code', |             'from' => 'required|exists:transaction_currencies,code', | ||||||
|             'to'   => 'required|exists:transaction_currencies,code', |             'to'   => 'required|exists:transaction_currencies,code', | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ class UpdateRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'date' => 'date|after:1900-01-01|before:2099-12-31', |             'date' => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'rate' => 'required|numeric|gt:0', |             'rate' => 'required|numeric|gt:0', | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | |||||||
| namespace FireflyIII\Api\V1\Requests\Models\PiggyBank; | namespace FireflyIII\Api\V1\Requests\Models\PiggyBank; | ||||||
| 
 | 
 | ||||||
| use Illuminate\Contracts\Validation\Validator; | use Illuminate\Contracts\Validation\Validator; | ||||||
| use FireflyIII\Exceptions\FireflyException; |  | ||||||
| use FireflyIII\Models\TransactionCurrency; | use FireflyIII\Models\TransactionCurrency; | ||||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||||
| use FireflyIII\Rules\IsValidZeroOrMoreAmount; | use FireflyIII\Rules\IsValidZeroOrMoreAmount; | ||||||
| @@ -96,7 +95,10 @@ class StoreRequest extends FormRequest | |||||||
|             function (Validator $validator): void { |             function (Validator $validator): void { | ||||||
|                 // validate start before end only if both are there.
 |                 // validate start before end only if both are there.
 | ||||||
|                 $data          = $validator->getData(); |                 $data          = $validator->getData(); | ||||||
|                 $currency      = $this->getCurrencyFromData($data); |                 $currency      = $this->getCurrencyFromData($validator, $data); | ||||||
|  |                 if (null === $currency) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|                 $targetAmount  = (string) ($data['target_amount'] ?? '0'); |                 $targetAmount  = (string) ($data['target_amount'] ?? '0'); | ||||||
|                 $currentAmount = '0'; |                 $currentAmount = '0'; | ||||||
|                 if (array_key_exists('accounts', $data) && is_array($data['accounts'])) { |                 if (array_key_exists('accounts', $data) && is_array($data['accounts'])) { | ||||||
| @@ -130,7 +132,7 @@ class StoreRequest extends FormRequest | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private function getCurrencyFromData(array $data): TransactionCurrency |     private function getCurrencyFromData(Validator $validator, array $data): ?TransactionCurrency | ||||||
|     { |     { | ||||||
|         if (array_key_exists('transaction_currency_code', $data) && '' !== (string) $data['transaction_currency_code']) { |         if (array_key_exists('transaction_currency_code', $data) && '' !== (string) $data['transaction_currency_code']) { | ||||||
|             $currency = TransactionCurrency::whereCode($data['transaction_currency_code'])->first(); |             $currency = TransactionCurrency::whereCode($data['transaction_currency_code'])->first(); | ||||||
| @@ -144,7 +146,8 @@ class StoreRequest extends FormRequest | |||||||
|                 return $currency; |                 return $currency; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         $validator->errors()->add('transaction_currency_id', trans('validation.require_currency_id_code')); | ||||||
| 
 | 
 | ||||||
|         throw new FireflyException('Unexpected empty currency.'); |         return null; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -76,7 +76,7 @@ class StoreRequest extends FormRequest | |||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Returns the transaction data as it is found in the submitted data. It's a complex method according to code |      * Returns the transaction data as it is found in the submitted data. It's a complex method according to code | ||||||
|      * standards but it just has a lot of ??-statements because of the fields that may or may not exist. |      * standards, but it just has a lot of ??-statements because of the fields that may or may not exist. | ||||||
|      */ |      */ | ||||||
|     private function getTransactionData(): array |     private function getTransactionData(): array | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -122,7 +122,7 @@ class UpdateRequest extends FormRequest | |||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Returns the transaction data as it is found in the submitted data. It's a complex method according to code |      * Returns the transaction data as it is found in the submitted data. It's a complex method according to code | ||||||
|      * standards but it just has a lot of ??-statements because of the fields that may or may not exist. |      * standards, but it just has a lot of ??-statements because of the fields that may or may not exist. | ||||||
|      */ |      */ | ||||||
|     private function getTransactionData(): array |     private function getTransactionData(): array | ||||||
|     { |     { | ||||||
| @@ -154,7 +154,7 @@ class UpdateRequest extends FormRequest | |||||||
|         return [ |         return [ | ||||||
|             'title'                                => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id), |             'title'                                => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id), | ||||||
|             'description'                          => 'min:1|max:32768', |             'description'                          => 'min:1|max:32768', | ||||||
|             'first_date'                           => 'date|after:1900-01-01|before:2099-12-31', |             'first_date'                           => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'apply_rules'                          => [new IsBoolean()], |             'apply_rules'                          => [new IsBoolean()], | ||||||
|             'active'                               => [new IsBoolean()], |             'active'                               => [new IsBoolean()], | ||||||
|             'repeat_until'                         => 'nullable|date', |             'repeat_until'                         => 'nullable|date', | ||||||
|   | |||||||
| @@ -71,8 +71,8 @@ class TestRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'start'      => 'date|after:1900-01-01|before:2099-12-31', |             'start'      => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'end'        => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31', |             'end'        => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17', | ||||||
|             'accounts'   => '', |             'accounts'   => '', | ||||||
|             'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts', |             'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts', | ||||||
|         ]; |         ]; | ||||||
|   | |||||||
| @@ -65,8 +65,8 @@ class TriggerRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'start'      => 'date|after:1900-01-01|before:2099-12-31', |             'start'      => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'end'        => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31', |             'end'        => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17', | ||||||
|             'accounts'   => '', |             'accounts'   => '', | ||||||
|             'accounts.*' => 'exists:accounts,id|belongsToUser:accounts', |             'accounts.*' => 'exists:accounts,id|belongsToUser:accounts', | ||||||
|         ]; |         ]; | ||||||
|   | |||||||
| @@ -65,8 +65,8 @@ class TestRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'start'      => 'date|after:1900-01-01|before:2099-12-31', |             'start'      => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'end'        => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31', |             'end'        => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17', | ||||||
|             'accounts'   => '', |             'accounts'   => '', | ||||||
|             'accounts.*' => 'exists:accounts,id|belongsToUser:accounts', |             'accounts.*' => 'exists:accounts,id|belongsToUser:accounts', | ||||||
|         ]; |         ]; | ||||||
|   | |||||||
| @@ -69,8 +69,8 @@ class TriggerRequest extends FormRequest | |||||||
|     public function rules(): array |     public function rules(): array | ||||||
|     { |     { | ||||||
|         return [ |         return [ | ||||||
|             'start' => 'date|after:1900-01-01|before:2099-12-31', |             'start' => 'date|after:1970-01-02|before:2038-01-17', | ||||||
|             'end'   => 'date|after_or_equal:start|after:1900-01-01|before:2099-12-31', |             'end'   => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17', | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -62,7 +62,7 @@ class StoreRequest extends FormRequest | |||||||
|         $rules = [ |         $rules = [ | ||||||
|             'tag'         => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024', |             'tag'         => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024', | ||||||
|             'description' => 'min:1|nullable|max:32768', |             'description' => 'min:1|nullable|max:32768', | ||||||
|             'date'        => 'date|nullable|after:1900-01-01|before:2099-12-31', |             'date'        => 'date|nullable|after:1970-01-02|before:2038-01-17', | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         return Location::requestRules($rules); |         return Location::requestRules($rules); | ||||||
|   | |||||||
| @@ -66,7 +66,7 @@ class UpdateRequest extends FormRequest | |||||||
|         $rules = [ |         $rules = [ | ||||||
|             'tag'         => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id, |             'tag'         => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id, | ||||||
|             'description' => 'min:1|nullable|max:32768', |             'description' => 'min:1|nullable|max:32768', | ||||||
|             'date'        => 'date|nullable|after:1900-01-01|before:2099-12-31', |             'date'        => 'date|nullable|after:1970-01-02|before:2038-01-17', | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         return Location::requestRules($rules); |         return Location::requestRules($rules); | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user