mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 02:36:28 +00:00 
			
		
		
		
	Compare commits
	
		
			413 Commits
		
	
	
		
			5.5.0-beta
			...
			5.5.6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 34dc1f9f53 | ||
|  | b9d949d259 | ||
|  | 3376e1e663 | ||
|  | ea98c2631f | ||
|  | 50b9fe649d | ||
|  | 56054531a3 | ||
|  | 1912e46113 | ||
|  | 075f951cfe | ||
|  | 26aad765ae | ||
|  | 73ba78d46d | ||
|  | 0d5dd40134 | ||
|  | f0d84ad142 | ||
|  | 0b4ebf644d | ||
|  | 5b60db120f | ||
|  | f2073a4494 | ||
|  | 3e12d26afd | ||
|  | e458208966 | ||
|  | e28a77dc87 | ||
|  | a709596ccb | ||
|  | 849c7dfe02 | ||
|  | e580093a34 | ||
|  | 4fa7a5c1bc | ||
|  | d668007fee | ||
|  | 6cbccf3be6 | ||
|  | 9cd75dda1a | ||
|  | 56dff7ea67 | ||
|  | 6160f99e92 | ||
|  | 115639a004 | ||
|  | a0c98c7d9f | ||
|  | 7842700bf1 | ||
|  | 4ecda4d4e0 | ||
|  | c76d140d0b | ||
|  | 4f42eb1796 | ||
|  | c67b10e38d | ||
|  | 614ceabd45 | ||
|  | a94b2e8806 | ||
|  | 732616984b | ||
|  | eddf0c1200 | ||
|  | 49013264d5 | ||
|  | f12744ad8c | ||
|  | 4ddcb0c965 | ||
|  | 0846d4898f | ||
|  | cb746200fa | ||
|  | fe06a1f7a0 | ||
|  | 9c1cee738d | ||
|  | 7cc778673a | ||
|  | 38d0f0427f | ||
|  | 8572280b7b | ||
|  | 69b1769f22 | ||
|  | 5ceef2e9c3 | ||
|  | d32446b171 | ||
|  | d8ca39ffea | ||
|  | d47bddde62 | ||
|  | e4802ec958 | ||
|  | 6d855e119d | ||
|  | 7ab81e493a | ||
|  | fa0397e431 | ||
|  | aba3b361be | ||
|  | 1cf188ee08 | ||
|  | f5983f08fd | ||
|  | b812c2e09f | ||
|  | d7466efbe1 | ||
|  | dff30af9f2 | ||
|  | 25dcb73e27 | ||
|  | 63ed3d09d5 | ||
|  | caf1e6010b | ||
|  | 2d97408c1f | ||
|  | 01c0d76c5a | ||
|  | 7c7032d951 | ||
|  | 6e722f5833 | ||
|  | d3502c56d3 | ||
|  | 1b8eb3cd68 | ||
|  | bc7bd84221 | ||
|  | 85b22341a4 | ||
|  | f8c725e5b2 | ||
|  | e6344e4f51 | ||
|  | 8eac10bf89 | ||
|  | c1da0eeced | ||
|  | 0a6d5b1766 | ||
|  | 4035ac09ce | ||
|  | f81a7cfac0 | ||
|  | 2b086879cc | ||
|  | a3091f7509 | ||
|  | 70a6ac0038 | ||
|  | 468a53d587 | ||
|  | 51f3b17ad2 | ||
|  | a864d3bd56 | ||
|  | a4d5aa0d10 | ||
|  | aff5ac2c0a | ||
|  | effe92a05c | ||
|  | a4ca6dfd38 | ||
|  | e6012e1ca2 | ||
|  | 472497cafd | ||
|  | 34f4b16a63 | ||
|  | 7f55a870d9 | ||
|  | 6a37ad7c15 | ||
|  | 788981d170 | ||
|  | f377c92d8a | ||
|  | 0dc3068f7f | ||
|  | 1ad8ec6dd1 | ||
|  | 18a80f3519 | ||
|  | 82f8b091c1 | ||
|  | 71785bae57 | ||
|  | 6d979a68f2 | ||
|  | ef852ef963 | ||
|  | 00b0ce6c6e | ||
|  | 5750087d37 | ||
|  | a2ae977550 | ||
|  | b893651223 | ||
|  | e221d37d2b | ||
|  | f0acab21a3 | ||
|  | 93dc5fae09 | ||
|  | 40746db53e | ||
|  | 4404db650c | ||
|  | ab968a56e6 | ||
|  | 246a3d000a | ||
|  | cbcf251bb3 | ||
|  | 0756054690 | ||
|  | b6109ca93e | ||
|  | 823ee2cea0 | ||
|  | 18f6052681 | ||
|  | 4f2ab72567 | ||
|  | bc6a2c2cca | ||
|  | 7a6a911f7f | ||
|  | abeff39829 | ||
|  | 4d18c1bf83 | ||
|  | 8a818059f2 | ||
|  | 3768262224 | ||
|  | b790a0731e | ||
|  | c38b9eeb08 | ||
|  | 22b376da71 | ||
|  | fde53abb1a | ||
|  | c32e09a2b3 | ||
|  | a243f3d7c2 | ||
|  | 3586c76b95 | ||
|  | c9d9840235 | ||
|  | 10390953fe | ||
|  | d6c6bc05ad | ||
|  | a17601e2a8 | ||
|  | 93d481b515 | ||
|  | 13b8ba3746 | ||
|  | e6fbd9259d | ||
|  | b5eeacc128 | ||
|  | 2c575f3ca5 | ||
|  | 5abbb8a807 | ||
|  | 6401b5c9eb | ||
|  | 7edc1a2571 | ||
|  | f489add855 | ||
|  | adfdcdb9c6 | ||
|  | 922050a79b | ||
|  | 436bef01da | ||
|  | b7ba6f81da | ||
|  | 381b09d68b | ||
|  | fbed65d464 | ||
|  | bcd612d42f | ||
|  | eac2293778 | ||
|  | 72deff81f9 | ||
|  | a8e9ba3041 | ||
|  | 3e73641378 | ||
|  | 7cf44a604a | ||
|  | 9003db6eba | ||
|  | d1c87e1c21 | ||
|  | ccaadd1f52 | ||
|  | e64653eaff | ||
|  | abb0f3d2be | ||
|  | 7f48a1b6ee | ||
|  | 4affed8f68 | ||
|  | 1088a43866 | ||
|  | e0d0f49bfd | ||
|  | ee5b4d6a03 | ||
|  | 7062294419 | ||
|  | 97a687e40a | ||
|  | 206845575c | ||
|  | da1751940e | ||
|  | 9502544abf | ||
|  | b975ed87a0 | ||
|  | cbf3118b8a | ||
|  | 657726e667 | ||
|  | eb90dac89d | ||
|  | 4c2f758f69 | ||
|  | e577db4635 | ||
|  | b1023cdfda | ||
|  | f15da8e4b3 | ||
|  | 5df6135a0e | ||
|  | 186cbed777 | ||
|  | bc5aa4b4cd | ||
|  | 836f0ecf3f | ||
|  | e32f14578c | ||
|  | 03d3ede036 | ||
|  | b4d44fdd2b | ||
|  | a93da2a912 | ||
|  | df86c89acc | ||
|  | 690edb8fcc | ||
|  | a43bd745d1 | ||
|  | d5ee87ddee | ||
|  | a0b46d9d8a | ||
|  | 1783f0beb1 | ||
|  | 8d84dfb3aa | ||
|  | b9bf5c9856 | ||
|  | 83be7c1886 | ||
|  | 81404d934c | ||
|  | 1a73b6d20d | ||
|  | 1817160d48 | ||
|  | 5eb1f93851 | ||
|  | beece4dcbb | ||
|  | 288052905e | ||
|  | 40a463d62a | ||
|  | d82fe2ab4c | ||
|  | fc4d4a455b | ||
|  | e113225b37 | ||
|  | 07f62b0d5c | ||
|  | 25bc0b0b78 | ||
|  | 1f50f65bb7 | ||
|  | 2a4486a8dc | ||
|  | fdcd6befb6 | ||
|  | c9f7f877c0 | ||
|  | 5ab156c7ad | ||
|  | bdb298740a | ||
|  | bd040c80b2 | ||
|  | 7118abe28d | ||
|  | 668b169a5e | ||
|  | a03e000af1 | ||
|  | 81f5224b11 | ||
|  | a05d006fa7 | ||
|  | 748d61fb8f | ||
|  | 97561ab9c9 | ||
|  | aec70cf6a0 | ||
|  | b0c9745982 | ||
|  | ab5df484e8 | ||
|  | cecef98d7d | ||
|  | 625e31d053 | ||
|  | 75c8ec7c0a | ||
|  | 31df959935 | ||
|  | 238a582d8a | ||
|  | 5f4b025be5 | ||
|  | e0c3c91bf2 | ||
|  | 2a975c302f | ||
|  | 9369d908c8 | ||
|  | 83f38eb8c8 | ||
|  | 4d34160ede | ||
|  | ddaec93550 | ||
|  | 66e0cea18d | ||
|  | e3161a8b9c | ||
|  | 91394553c3 | ||
|  | 414c99489c | ||
|  | ba163f82d1 | ||
|  | c4882231d1 | ||
|  | d6dd6795fe | ||
|  | f2e5e7d182 | ||
|  | 7606757d78 | ||
|  | ea07b831f2 | ||
|  | 9cc20bbea7 | ||
|  | 9632f69b15 | ||
|  | b11e3145c5 | ||
|  | fa5d33caf5 | ||
|  | 93a31337fc | ||
|  | a8a1eca89e | ||
|  | 4ba713e553 | ||
|  | cfa9e8b318 | ||
|  | 2437759368 | ||
|  | b43ea5c108 | ||
|  | 84263b9ee8 | ||
|  | 2b2d10d1f1 | ||
|  | 1c041b9543 | ||
|  | c53f8b6dfc | ||
|  | 1c661a86b6 | ||
|  | 0afebb26e0 | ||
|  | 0cb0a628e3 | ||
|  | 30d653faee | ||
|  | b0d4ebbf4b | ||
|  | 711999f589 | ||
|  | fcf578784f | ||
|  | 4f76ea560d | ||
|  | df9c9ce044 | ||
|  | 1f12d81008 | ||
|  | 736f7963d1 | ||
|  | b38e2a994d | ||
|  | b8bd232622 | ||
|  | 27bc33add3 | ||
|  | 0703343748 | ||
|  | 584963f360 | ||
|  | 054e563c59 | ||
|  | fd1dc9ca04 | ||
|  | e5669fcfab | ||
|  | a7f57e10eb | ||
|  | c9dea3f531 | ||
|  | ef74016a13 | ||
|  | ff6a0d2cb5 | ||
|  | 4af923ac78 | ||
|  | 34f1e8a56b | ||
|  | 968ff30058 | ||
|  | aaf0c5d276 | ||
|  | 4b2392c966 | ||
|  | 9bcf56157d | ||
|  | 43e8779e3b | ||
|  | 2287339781 | ||
|  | 4d9aafbeaf | ||
|  | 5944cda03a | ||
|  | 9aa743b31b | ||
|  | 6bd6b1eb95 | ||
|  | fc0202eb74 | ||
|  | fd0dc3d289 | ||
|  | aa4695bbbf | ||
|  | 09d751076e | ||
|  | 419c1a75dd | ||
|  | fb821ea63e | ||
|  | f1be63e8bf | ||
|  | 7725b2a723 | ||
|  | f5a83fa84f | ||
|  | c1d090db67 | ||
|  | 7aaec92ae6 | ||
|  | afe6f07e61 | ||
|  | b151ec0c85 | ||
|  | 978c56b16b | ||
|  | fbbf002451 | ||
|  | 13cd9312f8 | ||
|  | a534c142c1 | ||
|  | 89ece0ce78 | ||
|  | 9b65f468a0 | ||
|  | e1826cdfb2 | ||
|  | 97d12cd77a | ||
|  | 5b5c988aa3 | ||
|  | 6d9acd1dc2 | ||
|  | 860fc507b7 | ||
|  | 5f1d4292ad | ||
|  | 7e2cda7f41 | ||
|  | ef394e1024 | ||
|  | f2f0d82f89 | ||
|  | 2032ef6662 | ||
|  | 7b5c41d541 | ||
|  | f844197954 | ||
|  | 0353e4aa95 | ||
|  | 3ee93de280 | ||
|  | 1175c1d676 | ||
|  | 6d51d0cc79 | ||
|  | 12e19c0a70 | ||
|  | 00f25836c0 | ||
|  | c4669ade29 | ||
|  | 2b06279f05 | ||
|  | 252ea7277b | ||
|  | 20c45aa0e0 | ||
|  | c34a5ed3e4 | ||
|  | 5ff7884596 | ||
|  | e04245de96 | ||
|  | 25e4d78119 | ||
|  | d5d0e6b4ba | ||
|  | 2f14753405 | ||
|  | 5e7c57744c | ||
|  | 0ac0dbc774 | ||
|  | 0b368edd97 | ||
|  | d0e7fe37bb | ||
|  | c2d9dcf696 | ||
|  | 4efc0ffc6e | ||
|  | e64b5dcf3a | ||
|  | cb4b6f7023 | ||
|  | 784b24fe3c | ||
|  | fba23c927b | ||
|  | 5771b8c3c6 | ||
|  | 5c7ba4e065 | ||
|  | e51f593a2d | ||
|  | bfd925fbfe | ||
|  | 993fe3ae0a | ||
|  | 70aaa67cfc | ||
|  | 45f918963e | ||
|  | 1ecc454f70 | ||
|  | 95966cdcd4 | ||
|  | b1f2780fb6 | ||
|  | 416f8e2855 | ||
|  | 1558da60aa | ||
|  | 18a9d90d46 | ||
|  | 934ae994cc | ||
|  | ee4b38c279 | ||
|  | 2171ed7912 | ||
|  | 4e274e6a09 | ||
|  | 1be0cf99b9 | ||
|  | 60a41887cb | ||
|  | f9582cd4fe | ||
|  | edcd5d56c9 | ||
|  | 14fa91d17f | ||
|  | e411e629ce | ||
|  | 5626b11b66 | ||
|  | eee42a0f99 | ||
|  | 03787e3d74 | ||
|  | b9e7d99a87 | ||
|  | b0ac0ea0cf | ||
|  | 8e42f25a1e | ||
|  | d69843d4bc | ||
|  | fdba28fad7 | ||
|  | 3b2dd93316 | ||
|  | 2ad7336605 | ||
|  | 84ad8529df | ||
|  | e441df367d | ||
|  | 08fcff2a98 | ||
|  | 957e34a57a | ||
|  | 71239dbf5b | ||
|  | c5d27f0148 | ||
|  | b8340ddb59 | ||
|  | f16b7c4286 | ||
|  | b126177546 | ||
|  | 1121377d2d | ||
|  | f9220b8999 | ||
|  | be05513ecd | ||
|  | ffe18c63a5 | ||
|  | fd8a59924d | ||
|  | fdd9d81701 | ||
|  | 2dd2d0ef58 | ||
|  | 329c3b14d5 | ||
|  | 27815d0311 | ||
|  | 21da959203 | ||
|  | d60c5a26de | ||
|  | d4c9f53b10 | ||
|  | 02cd0600ea | ||
|  | 7ffc621638 | 
| @@ -10,6 +10,19 @@ parameters: | ||||
|     - '#is neither abstract nor final#' | ||||
|     - '#Control structures using switch should not be used\.#' | ||||
|     - '#has a nullable return type declaration#' | ||||
|     - '#with a nullable type declaration#' | ||||
|     - '#with null as default value#' | ||||
|     - '#Constructor in [a-zA-Z0-9\\_]+ has parameter \$[a-zA-Z0-9\\_]+ with default value#' | ||||
|     - | ||||
|         message: '#Function compact\(\) should not be used.#' | ||||
|         paths: | ||||
|             - ../app/Http/Controllers | ||||
|             - ../app/Support/Http/Controllers/RenderPartialViews.php | ||||
|             - ../app/Support/Form/FormSupport.php | ||||
|             - ../app/Support/Form/CurrencyForm.php | ||||
|             - ../app/Support/Form/AccountForm.php | ||||
|             - ../app/Support/ExpandedForm.php | ||||
|             - ../app/Generator/Report | ||||
|   paths: | ||||
|     - ../app | ||||
|     - ../database | ||||
| @@ -17,4 +30,4 @@ parameters: | ||||
|     - ../bootstrap/app.php | ||||
|  | ||||
|   # The level 8 is the highest level. original was 5 | ||||
|   level: 5 | ||||
|   level: 2 | ||||
|   | ||||
| @@ -1,12 +1,33 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # | ||||
| # phpstan.sh | ||||
| # 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/>. | ||||
| # | ||||
|  | ||||
| # Install composer packages | ||||
| composer install --no-scripts --no-ansi | ||||
| #composer install --no-scripts --no-ansi | ||||
|  | ||||
| # enable test .env file. | ||||
| cp .ci/.env.ci .env | ||||
|  | ||||
| # Do static code analysis. | ||||
| ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress | ||||
| # ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress | ||||
| ./vendor/bin/phpstan analyse -c .ci/phpstan.neon | ||||
|  | ||||
| exit 0 | ||||
| @@ -1,9 +1,30 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # | ||||
| # phpunit.sh | ||||
| # 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/>. | ||||
| # | ||||
|  | ||||
| # enable test .env file. | ||||
| cp .ci/.env.ci ../.env | ||||
|  | ||||
| # download test database | ||||
| # TODO no longer exists | ||||
| wget --quiet https://raw.githubusercontent.com/firefly-iii/test-data/main/test_db.sqlite -o storage/database/test_db.sqlite | ||||
|  | ||||
| # run phpunit | ||||
|   | ||||
| @@ -13,6 +13,7 @@ nb_NO | ||||
| nl_NL | ||||
| pl_PL | ||||
| pt_BR | ||||
| pt_PT | ||||
| ro_RO | ||||
| ru_RU | ||||
| sk_SK | ||||
|   | ||||
							
								
								
									
										10
									
								
								.env.example
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								.env.example
									
									
									
									
									
								
							| @@ -118,6 +118,7 @@ REDIS_CACHE_DB="1" | ||||
| COOKIE_PATH="/" | ||||
| COOKIE_DOMAIN= | ||||
| COOKIE_SECURE=false | ||||
| COOKIE_SAMESITE=lax | ||||
|  | ||||
| # If you want Firefly III to mail you, update these settings | ||||
| # For instructions, see: https://docs.firefly-iii.org/advanced-installation/email | ||||
| @@ -154,8 +155,16 @@ SEND_REPORT_JOURNALS=true | ||||
|  | ||||
| # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. | ||||
| # If you use Docker or similar, you can set this variable from a file by appending it with _FILE | ||||
| # Take note: it is no longer necessary to set this value, and it will be removed in future versions. | ||||
| MAPBOX_API_KEY= | ||||
|  | ||||
| # | ||||
| # Instead of the mapbox API key, just set this value to true if you want to set the location | ||||
| # of certain things, like transactions. Since this involves an external service, it's optional | ||||
| # and disabled by default. | ||||
| # | ||||
| ENABLE_EXTERNAL_MAP=false | ||||
|  | ||||
| # The map will default to this location: | ||||
| MAP_DEFAULT_LAT=51.983333 | ||||
| MAP_DEFAULT_LONG=5.916667 | ||||
| @@ -319,6 +328,7 @@ BROADCAST_DRIVER=log | ||||
| QUEUE_DRIVER=sync | ||||
| CACHE_PREFIX=firefly | ||||
| PUSHER_KEY= | ||||
| IPINFO_TOKEN= | ||||
| PUSHER_SECRET= | ||||
| PUSHER_ID= | ||||
| DEMO_USERNAME= | ||||
|   | ||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,7 @@ | ||||
| /node_modules | ||||
| /frontend/node_modules | ||||
| /frontend/fonts | ||||
| /frontend/images | ||||
| /public/hot | ||||
| /public/storage | ||||
| /storage/*.key | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| @@ -43,7 +42,6 @@ class AccountController extends Controller | ||||
|     private array                      $balanceTypes; | ||||
|     private AccountRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
| @@ -90,7 +88,7 @@ class AccountController extends Controller | ||||
|             } | ||||
|  | ||||
|             $return[] = [ | ||||
|                 'id'                      => $account->id, | ||||
|                 'id'                      => (string)$account->id, | ||||
|                 'name'                    => $account->name, | ||||
|                 'name_with_balance'       => $nameWithBalance, | ||||
|                 'type'                    => $account->accountType->type, | ||||
| @@ -104,8 +102,6 @@ class AccountController extends Controller | ||||
|  | ||||
|         // custom order. | ||||
|         $order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE]; | ||||
|  | ||||
|  | ||||
|         usort( | ||||
|             $return, function ($a, $b) use ($order) { | ||||
|             $pos_a = array_search($a['type'], $order); | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Bill; | ||||
| @@ -38,7 +37,6 @@ class BillController extends Controller | ||||
| { | ||||
|     private BillRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      */ | ||||
| @@ -69,13 +67,12 @@ class BillController extends Controller | ||||
|         $filtered = $result->map( | ||||
|             static function (Bill $item) { | ||||
|                 return [ | ||||
|                     'id'   => $item->id, | ||||
|                     'id'   => (string)$item->id, | ||||
|                     'name' => $item->name, | ||||
|                 ]; | ||||
|             } | ||||
|         ); | ||||
|  | ||||
|  | ||||
|         return response()->json($filtered->toArray()); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Budget; | ||||
| @@ -38,7 +37,6 @@ class BudgetController extends Controller | ||||
| { | ||||
|     private BudgetRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * BudgetController constructor. | ||||
|      */ | ||||
| @@ -69,7 +67,7 @@ class BudgetController extends Controller | ||||
|         $filtered = $result->map( | ||||
|             static function (Budget $item) { | ||||
|                 return [ | ||||
|                     'id'   => $item->id, | ||||
|                     'id'   => (string)$item->id, | ||||
|                     'name' => $item->name, | ||||
|                 ]; | ||||
|             } | ||||
|   | ||||
| @@ -37,7 +37,6 @@ class CategoryController extends Controller | ||||
| { | ||||
|     private CategoryRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      */ | ||||
| @@ -68,7 +67,7 @@ class CategoryController extends Controller | ||||
|         $filtered = $result->map( | ||||
|             static function (Category $item) { | ||||
|                 return [ | ||||
|                     'id'   => $item->id, | ||||
|                     'id'   => (string)$item->id, | ||||
|                     'name' => $item->name, | ||||
|                 ]; | ||||
|             } | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| @@ -38,7 +37,6 @@ class CurrencyController extends Controller | ||||
| { | ||||
|     private CurrencyRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * CurrencyController constructor. | ||||
|      */ | ||||
| @@ -62,7 +60,7 @@ class CurrencyController extends Controller | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function currenciesWithCode(AutocompleteRequest $request): JsonResponse | ||||
|     public function currencies(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getData(); | ||||
|         $collection = $this->repository->searchCurrency($data['query'], $data['limit']); | ||||
| @@ -71,8 +69,8 @@ class CurrencyController extends Controller | ||||
|         /** @var TransactionCurrency $currency */ | ||||
|         foreach ($collection as $currency) { | ||||
|             $result[] = [ | ||||
|                 'id'             => $currency->id, | ||||
|                 'name'           => sprintf('%s (%s)', $currency->name, $currency->code), | ||||
|                 'id'             => (string)$currency->id, | ||||
|                 'name'           => $currency->name, | ||||
|                 'code'           => $currency->code, | ||||
|                 'symbol'         => $currency->symbol, | ||||
|                 'decimal_places' => $currency->decimal_places, | ||||
| @@ -87,7 +85,7 @@ class CurrencyController extends Controller | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function currencies(AutocompleteRequest $request): JsonResponse | ||||
|     public function currenciesWithCode(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getData(); | ||||
|         $collection = $this->repository->searchCurrency($data['query'], $data['limit']); | ||||
| @@ -96,8 +94,8 @@ class CurrencyController extends Controller | ||||
|         /** @var TransactionCurrency $currency */ | ||||
|         foreach ($collection as $currency) { | ||||
|             $result[] = [ | ||||
|                 'id'             => $currency->id, | ||||
|                 'name'           => $currency->name, | ||||
|                 'id'             => (string)$currency->id, | ||||
|                 'name'           => sprintf('%s (%s)', $currency->name, $currency->code), | ||||
|                 'code'           => $currency->code, | ||||
|                 'symbol'         => $currency->symbol, | ||||
|                 'decimal_places' => $currency->decimal_places, | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| @@ -38,7 +37,6 @@ class ObjectGroupController extends Controller | ||||
| { | ||||
|     private ObjectGroupRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * CurrencyController constructor. | ||||
|      */ | ||||
| @@ -68,10 +66,10 @@ class ObjectGroupController extends Controller | ||||
|         $return = []; | ||||
|         $result = $this->repository->search($data['query'], $data['limit']); | ||||
|  | ||||
|         /** @var ObjectGroup $account */ | ||||
|         /** @var ObjectGroup $objectGroup */ | ||||
|         foreach ($result as $objectGroup) { | ||||
|             $return[] = [ | ||||
|                 'id'    => $objectGroup->id, | ||||
|                 'id'    => (string)$objectGroup->id, | ||||
|                 'name'  => $objectGroup->title, | ||||
|                 'title' => $objectGroup->title, | ||||
|             ]; | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| @@ -37,11 +36,9 @@ use Illuminate\Http\JsonResponse; | ||||
|  */ | ||||
| class PiggyBankController extends Controller | ||||
| { | ||||
|     private AccountRepositoryInterface $accountRepository; | ||||
|     private PiggyBankRepositoryInterface $piggyRepository; | ||||
|  | ||||
|     private AccountRepositoryInterface   $accountRepository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * PiggyBankController constructor. | ||||
|      */ | ||||
| @@ -78,7 +75,7 @@ class PiggyBankController extends Controller | ||||
|         foreach ($piggies as $piggy) { | ||||
|             $currency   = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; | ||||
|             $response[] = [ | ||||
|                 'id'                      => $piggy->id, | ||||
|                 'id'                      => (string)$piggy->id, | ||||
|                 'name'                    => $piggy->name, | ||||
|                 'currency_id'             => $currency->id, | ||||
|                 'currency_name'           => $currency->name, | ||||
| @@ -106,7 +103,7 @@ class PiggyBankController extends Controller | ||||
|             $currency      = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; | ||||
|             $currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0'; | ||||
|             $response[]    = [ | ||||
|                 'id'                      => $piggy->id, | ||||
|                 'id'                      => (string)$piggy->id, | ||||
|                 'name'                    => $piggy->name, | ||||
|                 'name_with_balance'       => sprintf( | ||||
|                     '%s (%s / %s)', $piggy->name, app('amount')->formatAnything($currency, $currentAmount, false), | ||||
|   | ||||
| @@ -23,13 +23,56 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class RecurrenceController | ||||
|  */ | ||||
| class RecurrenceController extends Controller | ||||
| { | ||||
|     private RecurringRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RecurrenceController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RecurringRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function recurring(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $rules    = $this->repository->searchRecurrence($data['query'], $data['limit']); | ||||
|         $response = []; | ||||
|  | ||||
|         /** @var Rule $rule */ | ||||
|         foreach ($rules as $rule) { | ||||
|             $response[] = [ | ||||
|                 'id'          => (string)$rule->id, | ||||
|                 'name'        => $rule->title, | ||||
|                 'description' => $rule->description, | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($response); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -23,13 +23,56 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class RuleController | ||||
|  */ | ||||
| class RuleController extends Controller | ||||
| { | ||||
|     private RuleRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RuleController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RuleRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function rules(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $rules    = $this->repository->searchRule($data['query'], $data['limit']); | ||||
|         $response = []; | ||||
|  | ||||
|         /** @var Rule $rule */ | ||||
|         foreach ($rules as $rule) { | ||||
|             $response[] = [ | ||||
|                 'id'          => (string)$rule->id, | ||||
|                 'name'        => $rule->title, | ||||
|                 'description' => $rule->description, | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($response); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -23,13 +23,55 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class RuleGroupController | ||||
|  */ | ||||
| class RuleGroupController extends Controller | ||||
| { | ||||
|     private RuleGroupRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RuleGroupController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RuleGroupRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function ruleGroups(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $groups   = $this->repository->searchRuleGroup($data['query'], $data['limit']); | ||||
|         $response = []; | ||||
|  | ||||
|         /** @var RuleGroup $group */ | ||||
|         foreach ($groups as $group) { | ||||
|             $response[] = [ | ||||
|                 'id'          => (string)$group->id, | ||||
|                 'name'        => $group->title, | ||||
|                 'description' => $group->description, | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($response); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Tag; | ||||
| @@ -38,7 +37,6 @@ class TagController extends Controller | ||||
| { | ||||
|     private TagRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * TagController constructor. | ||||
|      */ | ||||
| @@ -71,7 +69,7 @@ class TagController extends Controller | ||||
|         /** @var Tag $tag */ | ||||
|         foreach ($result as $tag) { | ||||
|             $array[] = [ | ||||
|                 'id'   => $tag->id, | ||||
|                 'id'   => (string)$tag->id, | ||||
|                 'name' => $tag->tag, | ||||
|                 'tag'  => $tag->tag, | ||||
|             ]; | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| @@ -38,10 +37,8 @@ use Illuminate\Support\Collection; | ||||
|  */ | ||||
| class TransactionController extends Controller | ||||
| { | ||||
|     private JournalRepositoryInterface          $repository; | ||||
|  | ||||
|     private TransactionGroupRepositoryInterface $groupRepository; | ||||
|  | ||||
|     private JournalRepositoryInterface          $repository; | ||||
|  | ||||
|     /** | ||||
|      * TransactionController constructor. | ||||
| @@ -63,7 +60,6 @@ class TransactionController extends Controller | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
| @@ -81,8 +77,8 @@ class TransactionController extends Controller | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($filtered as $journal) { | ||||
|             $array[] = [ | ||||
|                 'id'                   => $journal->id, | ||||
|                 'transaction_group_id' => $journal->transaction_group_id, | ||||
|                 'id'                   => (string)$journal->id, | ||||
|                 'transaction_group_id' => (string)$journal->transaction_group_id, | ||||
|                 'name'                 => $journal->description, | ||||
|                 'description'          => $journal->description, | ||||
|             ]; | ||||
| @@ -102,7 +98,7 @@ class TransactionController extends Controller | ||||
|         $result = new Collection; | ||||
|         if (is_numeric($data['query'])) { | ||||
|             // search for group, not journal. | ||||
|             $firstResult = $this->groupRepository->find((int) $data['query']); | ||||
|             $firstResult = $this->groupRepository->find((int)$data['query']); | ||||
|             if (null !== $firstResult) { | ||||
|                 // group may contain multiple journals, each a result: | ||||
|                 foreach ($firstResult->transactionJournals as $journal) { | ||||
| @@ -120,8 +116,8 @@ class TransactionController extends Controller | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($result as $journal) { | ||||
|             $array[] = [ | ||||
|                 'id'                   => $journal->id, | ||||
|                 'transaction_group_id' => $journal->transaction_group_id, | ||||
|                 'id'                   => (string)$journal->id, | ||||
|                 'transaction_group_id' => (string)$journal->transaction_group_id, | ||||
|                 'name'                 => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description), | ||||
|                 'description'          => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description), | ||||
|             ]; | ||||
|   | ||||
| @@ -23,7 +23,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| @@ -37,7 +36,6 @@ class TransactionTypeController extends Controller | ||||
| { | ||||
|     private TransactionTypeRepositoryInterface $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * TransactionTypeController constructor. | ||||
|      */ | ||||
| @@ -69,7 +67,7 @@ class TransactionTypeController extends Controller | ||||
|         foreach ($types as $type) { | ||||
|             // different key for consistency. | ||||
|             $array[] = [ | ||||
|                 'id'   => $type->id, | ||||
|                 'id'   => (string)$type->id, | ||||
|                 'name' => $type->type, | ||||
|                 'type' => $type->type, | ||||
|             ]; | ||||
|   | ||||
| @@ -1,259 +0,0 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BudgetLimitController.php | ||||
|  * Copyright (c) 2019 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\Controllers; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\BudgetLimitStoreRequest; | ||||
| use FireflyIII\Api\V1\Requests\BudgetLimitUpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class BudgetLimitController. | ||||
|  */ | ||||
| class BudgetLimitController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
|  | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|     private BudgetRepositoryInterface      $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->repository   = app(BudgetRepositoryInterface::class); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->blRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function delete(BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $this->blRepository->destroyBudgetLimit($budgetLimit); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         $manager  = $this->getManager(); | ||||
|         $manager->parseIncludes('budget'); | ||||
|         $budgetId = (int)($request->get('budget_id') ?? 0); | ||||
|         $budget   = $this->repository->findNull($budgetId); | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $this->parameters->set('budget_id', $budgetId); | ||||
|  | ||||
|         $collection = new Collection; | ||||
|         if (null === $budget) { | ||||
|             $collection = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         } | ||||
|         if (null !== $budget) { | ||||
|             $collection = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         } | ||||
|  | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budget_limits.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display the specified resource. | ||||
|      * | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param BudgetLimitStoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      */ | ||||
|     public function store(BudgetLimitStoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data               = $request->getAll(); | ||||
|         $data['start_date'] = $data['start']; | ||||
|         $data['end_date']   = $data['end']; | ||||
|  | ||||
|         $budgetLimit = $this->blRepository->store($data); | ||||
|         $manager     = $this->getManager(); | ||||
|  | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @param Request     $request | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function transactions(Request $request, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
|  | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|  | ||||
|         // use new group collector: | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on budget. | ||||
|             ->setBudget($budgetLimit->budget) | ||||
|             // all info needed for the API: | ||||
|             ->withAPIInformation() | ||||
|             // set page size: | ||||
|             ->setLimit($pageSize) | ||||
|             // set page to retrieve | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return. | ||||
|             ->setTypes($types); | ||||
|  | ||||
|         $collector->setRange($budgetLimit->start_date, $budgetLimit->end_date); | ||||
|         $collector->setTypes($types); | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budget_limits.transactions', [$budgetLimit->id]) . $this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
|  | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param BudgetLimitUpdateRequest $request | ||||
|      * @param BudgetLimit              $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(BudgetLimitUpdateRequest $request, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $data        = $request->getAll(); | ||||
|         $budgetLimit = $this->blRepository->update($budgetLimit, $data); | ||||
|         $manager     = $this->getManager(); | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -26,10 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Chart; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| @@ -44,9 +43,7 @@ class AccountController extends Controller | ||||
|     use ApiSupport; | ||||
|  | ||||
|     private CurrencyRepositoryInterface $currencyRepository; | ||||
|  | ||||
|     private AccountRepositoryInterface $repository; | ||||
|  | ||||
|     private AccountRepositoryInterface  $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
| @@ -71,92 +68,6 @@ class AccountController extends Controller | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param DateRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function expenseOverview(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for chart: | ||||
|         $dates = $request->getAll(); | ||||
|         /** @var Carbon $start */ | ||||
|         $start = $dates['start']; | ||||
|         /** @var Carbon $end */ | ||||
|         $end = $dates['end']; | ||||
|  | ||||
|         $start->subDay(); | ||||
|  | ||||
|         // prep some vars: | ||||
|         $currencies = []; | ||||
|         $chartData  = []; | ||||
|         $tempData   = []; | ||||
|  | ||||
|         // grab all accounts and names | ||||
|         $accounts      = $this->repository->getAccountsByType([AccountType::EXPENSE]); | ||||
|         $accountNames  = $this->extractNames($accounts); | ||||
|         $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); | ||||
|         $endBalances   = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); | ||||
|  | ||||
|         // loop the end balances. This is an array for each account ($expenses) | ||||
|         foreach ($endBalances as $accountId => $expenses) { | ||||
|             $accountId = (int) $accountId; | ||||
|             // loop each expense entry (each entry can be a different currency). | ||||
|             foreach ($expenses as $currencyId => $endAmount) { | ||||
|                 $currencyId = (int) $currencyId; | ||||
|  | ||||
|                 // see if there is an accompanying start amount. | ||||
|                 // grab the difference and find the currency. | ||||
|                 $startAmount             = $startBalances[$accountId][$currencyId] ?? '0'; | ||||
|                 $diff                    = bcsub($endAmount, $startAmount); | ||||
|                 $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); | ||||
|                 if (0 !== bccomp($diff, '0')) { | ||||
|                     // store the values in a temporary array. | ||||
|                     $tempData[] = [ | ||||
|                         'name'        => $accountNames[$accountId], | ||||
|                         'difference'  => $diff, | ||||
|                         'diff_float'  => (float) $diff, | ||||
|                         'currency_id' => $currencyId, | ||||
|                     ]; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // sort temp array by amount. | ||||
|         $amounts = array_column($tempData, 'diff_float'); | ||||
|         array_multisort($amounts, SORT_DESC, $tempData); | ||||
|  | ||||
|         // loop all found currencies and build the data array for the chart. | ||||
|         /** | ||||
|          * @var int                 $currencyId | ||||
|          * @var TransactionCurrency $currency | ||||
|          */ | ||||
|         foreach ($currencies as $currencyId => $currency) { | ||||
|             $currentSet             = [ | ||||
|                 'label'                   => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]), | ||||
|                 'currency_id'             => $currency->id, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'type'                    => 'bar', // line, area or bar | ||||
|                 'yAxisID'                 => 0, // 0, 1, 2 | ||||
|                 'entries'                 => $this->expandNames($tempData), | ||||
|             ]; | ||||
|             $chartData[$currencyId] = $currentSet; | ||||
|         } | ||||
|  | ||||
|         // loop temp data and place data in correct array: | ||||
|         foreach ($tempData as $entry) { | ||||
|             $currencyId                               = $entry['currency_id']; | ||||
|             $name                                     = $entry['name']; | ||||
|             $chartData[$currencyId]['entries'][$name] = round((float) $entry['difference'], $chartData[$currencyId]['currency_decimal_places']); | ||||
|         } | ||||
|         $chartData = array_values($chartData); | ||||
|  | ||||
|         return response()->json($chartData); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param DateRequest $request | ||||
|      * | ||||
| @@ -175,12 +86,12 @@ class AccountController extends Controller | ||||
|         $defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray(); | ||||
|         $frontPage  = app('preferences')->get('frontPageAccounts', $defaultSet); | ||||
|         $default    = app('amount')->getDefaultCurrency(); | ||||
|         // @codeCoverageIgnoreStart | ||||
|  | ||||
|         if (0 === count($frontPage->data)) { | ||||
|             $frontPage->data = $defaultSet; | ||||
|             $frontPage->save(); | ||||
|         } | ||||
|         // @codeCoverageIgnoreEnd | ||||
|  | ||||
|  | ||||
|         // get accounts: | ||||
|         $accounts  = $this->repository->getAccountsById($frontPage->data); | ||||
| @@ -189,16 +100,16 @@ class AccountController extends Controller | ||||
|         foreach ($accounts as $account) { | ||||
|             $currency = $this->repository->getAccountCurrency($account); | ||||
|             if (null === $currency) { | ||||
|                 $currency = $default; // @codeCoverageIgnore | ||||
|                 $currency = $default;  | ||||
|             } | ||||
|             $currentSet = [ | ||||
|                 'label'                   => $account->name, | ||||
|                 'currency_id'             => $currency->id, | ||||
|                 'currency_id'             => (string)$currency->id, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'start_date'              => $start->format('Y-m-d'), | ||||
|                 'end_date'                => $end->format('Y-m-d'), | ||||
|                 'start_date'              => $start->toAtomString(), | ||||
|                 'end_date'                => $end->toAtomString(), | ||||
|                 'type'                    => 'line', // line, area or bar | ||||
|                 'yAxisID'                 => 0, // 0, 1, 2 | ||||
|                 'entries'                 => [], | ||||
| @@ -206,11 +117,11 @@ class AccountController extends Controller | ||||
|             /** @var Carbon $currentStart */ | ||||
|             $currentStart = clone $start; | ||||
|             $range        = app('steam')->balanceInRange($account, $start, clone $end); | ||||
|             $previous     = round((float) array_values($range)[0], 12); | ||||
|             $previous     = round((float)array_values($range)[0], 12); | ||||
|             while ($currentStart <= $end) { | ||||
|                 $format   = $currentStart->format('Y-m-d'); | ||||
|                 $label    = $currentStart->format('Y-m-d'); | ||||
|                 $balance  = array_key_exists($format, $range) ? round((float) $range[$format], 12) : $previous; | ||||
|                 $label    = $currentStart->toAtomString(); | ||||
|                 $balance  = array_key_exists($format, $range) ? round((float)$range[$format], 12) : $previous; | ||||
|                 $previous = $balance; | ||||
|                 $currentStart->addDay(); | ||||
|                 $currentSet['entries'][$label] = $balance; | ||||
| @@ -220,91 +131,4 @@ class AccountController extends Controller | ||||
|  | ||||
|         return response()->json($chartData); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param DateRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function revenueOverview(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for chart: | ||||
|         $dates = $request->getAll(); | ||||
|         /** @var Carbon $start */ | ||||
|         $start = $dates['start']; | ||||
|         /** @var Carbon $end */ | ||||
|         $end = $dates['end']; | ||||
|  | ||||
|         $start->subDay(); | ||||
|  | ||||
|         // prep some vars: | ||||
|         $currencies = []; | ||||
|         $chartData  = []; | ||||
|         $tempData   = []; | ||||
|  | ||||
|         // grab all accounts and names | ||||
|         $accounts      = $this->repository->getAccountsByType([AccountType::REVENUE]); | ||||
|         $accountNames  = $this->extractNames($accounts); | ||||
|         $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); | ||||
|         $endBalances   = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); | ||||
|  | ||||
|         // loop the end balances. This is an array for each account ($expenses) | ||||
|         foreach ($endBalances as $accountId => $expenses) { | ||||
|             $accountId = (int) $accountId; | ||||
|             // loop each expense entry (each entry can be a different currency). | ||||
|             foreach ($expenses as $currencyId => $endAmount) { | ||||
|                 $currencyId = (int) $currencyId; | ||||
|  | ||||
|                 // see if there is an accompanying start amount. | ||||
|                 // grab the difference and find the currency. | ||||
|                 $startAmount             = $startBalances[$accountId][$currencyId] ?? '0'; | ||||
|                 $diff                    = bcsub($endAmount, $startAmount); | ||||
|                 $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); | ||||
|                 if (0 !== bccomp($diff, '0')) { | ||||
|                     // store the values in a temporary array. | ||||
|                     $tempData[] = [ | ||||
|                         'name'        => $accountNames[$accountId], | ||||
|                         'difference'  => bcmul($diff, '-1'), | ||||
|                         //  For some reason this line is never covered in code coverage: | ||||
|                         'diff_float'  => ((float) $diff) * -1, // @codeCoverageIgnore | ||||
|                         'currency_id' => $currencyId, | ||||
|                     ]; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // sort temp array by amount. | ||||
|         $amounts = array_column($tempData, 'diff_float'); | ||||
|         array_multisort($amounts, SORT_DESC, $tempData); | ||||
|  | ||||
|         // loop all found currencies and build the data array for the chart. | ||||
|         /** | ||||
|          * @var int                 $currencyId | ||||
|          * @var TransactionCurrency $currency | ||||
|          */ | ||||
|         foreach ($currencies as $currencyId => $currency) { | ||||
|             $currentSet             = [ | ||||
|                 'label'                   => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]), | ||||
|                 'currency_id'             => $currency->id, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'type'                    => 'bar', // line, area or bar | ||||
|                 'yAxisID'                 => 0, // 0, 1, 2 | ||||
|                 'entries'                 => $this->expandNames($tempData), | ||||
|             ]; | ||||
|             $chartData[$currencyId] = $currentSet; | ||||
|         } | ||||
|  | ||||
|         // loop temp data and place data in correct array: | ||||
|         foreach ($tempData as $entry) { | ||||
|             $currencyId                               = $entry['currency_id']; | ||||
|             $name                                     = $entry['name']; | ||||
|             $chartData[$currencyId]['entries'][$name] = round((float) $entry['difference'], $chartData[$currencyId]['currency_decimal_places']); | ||||
|         } | ||||
|         $chartData = array_values($chartData); | ||||
|  | ||||
|         return response()->json($chartData); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,115 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * AvailableBudgetController.php | ||||
|  * Copyright (c) 2019 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\Controllers\Chart; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\AvailableBudget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class AvailableBudgetController | ||||
|  */ | ||||
| class AvailableBudgetController extends Controller | ||||
| { | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private BudgetRepositoryInterface     $repository; | ||||
|  | ||||
|     /** | ||||
|      * AvailableBudgetController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->repository    = app(BudgetRepositoryInterface::class); | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param AvailableBudget $availableBudget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function overview(AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $currency             = $availableBudget->transactionCurrency; | ||||
|         $budgets              = $this->repository->getActiveBudgets(); | ||||
|         $newBudgetInformation = $this->opsRepository->sumExpenses($availableBudget->start_date, $availableBudget->end_date, null, $budgets); | ||||
|         $spent                = '0'; | ||||
|  | ||||
|         foreach ($newBudgetInformation as $currencyId => $info) { | ||||
|             if ($currencyId === (int) $availableBudget->transaction_currency_id) { | ||||
|                 $spent = $info['sum']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $left = bcadd($availableBudget->amount, $spent); | ||||
|         // left less than zero? Set to zero. | ||||
|         if (-1 === bccomp($left, '0')) { | ||||
|             $left = '0'; | ||||
|         } | ||||
|  | ||||
|         $chartData = [ | ||||
|             [ | ||||
|                 'label'                   => trans('firefly.spent'), | ||||
|                 'currency_id'             => $currency->id, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'type'                    => 'pie', | ||||
|                 'yAxisID'                 => 0, // 0, 1, 2 | ||||
|                 'entries'                 => [$spent * -1], | ||||
|             ], | ||||
|             [ | ||||
|                 'label'                   => trans('firefly.left'), | ||||
|                 'currency_id'             => $currency->id, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'type'                    => 'line', // line, area or bar | ||||
|                 'yAxisID'                 => 0, // 0, 1, 2 | ||||
|                 'entries'                 => [round((float) $left, $currency->decimal_places)], | ||||
|             ], | ||||
|         ]; | ||||
|  | ||||
|         return response()->json($chartData); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,297 +0,0 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BudgetController.php | ||||
|  * Copyright (c) 2020 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\Controllers\Chart; | ||||
|  | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class BudgetController | ||||
|  */ | ||||
| class BudgetController extends Controller | ||||
| { | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|  | ||||
|     private OperationsRepositoryInterface  $opsRepository; | ||||
|  | ||||
|     private BudgetRepositoryInterface      $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * BudgetController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|  | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository    = app(BudgetRepositoryInterface::class); | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->blRepository  = app(BudgetLimitRepositoryInterface::class); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * [ | ||||
|      *   'label'                   => 'label for entire set' | ||||
|      *   'currency_id'             => 0, | ||||
|      *   'currency_code'           => 'EUR', | ||||
|      *   'currency_symbol'         => '$', | ||||
|      *   'currency_decimal_places' => 2, | ||||
|      *   'type'                    => 'bar', // line, area or bar | ||||
|      *   'yAxisID'                 => 0, // 0, 1, 2 | ||||
|      *   'entries'                 => ['a' => 1, 'b' => 4], | ||||
|      * ], | ||||
|      * | ||||
|      * @param DateRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function overview(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         $dates         = $request->getAll(); | ||||
|         $budgets       = $this->repository->getActiveBudgets(); | ||||
|         $budgetNames   = []; | ||||
|         $currencyNames = []; | ||||
|         $sets          = []; | ||||
|         /** @var Budget $budget */ | ||||
|         foreach ($budgets as $budget) { | ||||
|             $expenses = $this->getExpenses($budget, $dates['start'], $dates['end']); | ||||
|             $expenses = $this->filterNulls($expenses); | ||||
|             foreach ($expenses as $set) { | ||||
|                 $budgetNames[]   = $set['budget_name']; | ||||
|                 $currencyNames[] = $set['currency_name']; | ||||
|                 $sets[]          = $set; | ||||
|             } | ||||
|         } | ||||
|         $budgetNames   = array_unique($budgetNames); | ||||
|         $currencyNames = array_unique($currencyNames); | ||||
|         $basic         = $this->createSets($budgetNames, $currencyNames); | ||||
|         $filled        = $this->fillSets($basic, $sets); | ||||
|         $keys          = array_values($filled); | ||||
|  | ||||
|         return response()->json($keys); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $limits | ||||
|      * @param Carbon     $start | ||||
|      * @param Carbon     $end | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     protected function getExpenses(Budget $budget, Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         $limits = $this->blRepository->getBudgetLimits($budget, $start, $end); | ||||
|         if (0 === $limits->count()) { | ||||
|             return $this->getExpenseInRange($budget, $start, $end); | ||||
|         } | ||||
|         $arr = []; | ||||
|         /** @var BudgetLimit $limit */ | ||||
|         foreach ($limits as $limit) { | ||||
|             $arr[] = $this->getExpensesForLimit($limit); | ||||
|         } | ||||
|  | ||||
|         return $arr; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Budget $budget | ||||
|      * @param Carbon $start | ||||
|      * @param Carbon $end | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function getExpenseInRange(Budget $budget, Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         $spent  = $this->opsRepository->sumExpenses($start, $end, null, new Collection([$budget]), null); | ||||
|         $return = []; | ||||
|         /** @var array $set */ | ||||
|         foreach ($spent as $set) { | ||||
|             $current                            = [ | ||||
|                 'label'                   => sprintf('%s (%s)', $budget->name, $set['currency_name']), | ||||
|                 'budget_name'             => $budget->name, | ||||
|                 'start_date'              => $start->format('Y-m-d'), | ||||
|                 'end_date'                => $end->format('Y-m-d'), | ||||
|                 'currency_id'             => (int) $set['currency_id'], | ||||
|                 'currency_code'           => $set['currency_code'], | ||||
|                 'currency_name'           => $set['currency_name'], | ||||
|                 'currency_symbol'         => $set['currency_symbol'], | ||||
|                 'currency_decimal_places' => (int) $set['currency_decimal_places'], | ||||
|                 'type'                    => 'bar', // line, area or bar, | ||||
|                 'entries'                 => [], | ||||
|             ]; | ||||
|             $sumSpent                           = bcmul($set['sum'], '-1'); // spent | ||||
|             $current['entries']['spent']        = $sumSpent; | ||||
|             $current['entries']['amount']       = '0'; | ||||
|             $current['entries']['spent_capped'] = $sumSpent; | ||||
|             $current['entries']['left']         = '0'; | ||||
|             $current['entries']['overspent']    = '0'; | ||||
|             $return[]                           = $current; | ||||
|         } | ||||
|  | ||||
|         return $return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param BudgetLimit $limit | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function getExpensesForLimit(BudgetLimit $limit): array | ||||
|     { | ||||
|         $budget   = $limit->budget; | ||||
|         $spent    = $this->opsRepository->sumExpenses($limit->start_date, $limit->end_date, null, new Collection([$budget]), $limit->transactionCurrency); | ||||
|         $currency = $limit->transactionCurrency; | ||||
|         // when limited to a currency, the count is always one. Or it's empty. | ||||
|         $set = array_shift($spent); | ||||
|         if (null === $set) { | ||||
|             return []; | ||||
|         } | ||||
|         $return                            = [ | ||||
|             'label'                   => sprintf('%s (%s)', $budget->name, $set['currency_name']), | ||||
|             'budget_name'             => $budget->name, | ||||
|             'start_date'              => $limit->start_date->format('Y-m-d'), | ||||
|             'end_date'                => $limit->end_date->format('Y-m-d'), | ||||
|             'currency_id'             => (int) $currency->id, | ||||
|             'currency_code'           => $currency->code, | ||||
|             'currency_name'           => $currency->name, | ||||
|             'currency_symbol'         => $currency->symbol, | ||||
|             'currency_decimal_places' => (int) $currency->decimal_places, | ||||
|             'type'                    => 'bar', // line, area or bar, | ||||
|             'entries'                 => [], | ||||
|         ]; | ||||
|         $sumSpent                          = bcmul($set['sum'], '-1'); // spent | ||||
|         $return['entries']['spent']        = $sumSpent; | ||||
|         $return['entries']['amount']       = $limit->amount; | ||||
|         $return['entries']['spent_capped'] = 1 === bccomp($sumSpent, $limit->amount) ? $limit->amount : $sumSpent; | ||||
|         $return['entries']['left']         = 1 === bccomp($limit->amount, $sumSpent) ? bcadd($set['sum'], $limit->amount) : '0';              // left | ||||
|         $return['entries']['overspent']    = 1 === bccomp($limit->amount, $sumSpent) ? '0' : bcmul(bcadd($set['sum'], $limit->amount), '-1'); // overspent | ||||
|  | ||||
|         return $return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $expenses | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function filterNulls(array $expenses): array | ||||
|     { | ||||
|         $return = []; | ||||
|         /** @var array|null $arr */ | ||||
|         foreach ($expenses as $arr) { | ||||
|             if ([] !== $arr) { | ||||
|                 $return[] = $arr; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $budgetNames | ||||
|      * @param array $currencyNames | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function createSets(array $budgetNames, array $currencyNames): array | ||||
|     { | ||||
|         $return = []; | ||||
|         foreach ($currencyNames as $currencyName) { | ||||
|             $entries = []; | ||||
|             foreach ($budgetNames as $budgetName) { | ||||
|                 $label           = sprintf('%s (%s)', $budgetName, $currencyName); | ||||
|                 $entries[$label] = '0'; | ||||
|             } | ||||
|  | ||||
|             // left | ||||
|             $return['left'] = [ | ||||
|                 'label'         => sprintf('%s (%s)', trans('firefly.left'), $currencyName), | ||||
|                 'data_type'     => 'left', | ||||
|                 'currency_name' => $currencyName, | ||||
|                 'type'          => 'bar', | ||||
|                 'yAxisID'       => 0, // 0, 1, 2 | ||||
|                 'entries'       => $entries, | ||||
|             ]; | ||||
|  | ||||
|             // spent_capped | ||||
|             $return['spent_capped'] = [ | ||||
|                 'label'         => sprintf('%s (%s)', trans('firefly.spent'), $currencyName), | ||||
|                 'data_type'     => 'spent_capped', | ||||
|                 'currency_name' => $currencyName, | ||||
|                 'type'          => 'bar', | ||||
|                 'yAxisID'       => 0, // 0, 1, 2 | ||||
|                 'entries'       => $entries, | ||||
|             ]; | ||||
|  | ||||
|             // overspent | ||||
|             $return['overspent'] = [ | ||||
|                 'label'         => sprintf('%s (%s)', trans('firefly.overspent'), $currencyName), | ||||
|                 'data_type'     => 'overspent', | ||||
|                 'currency_name' => $currencyName, | ||||
|                 'type'          => 'bar', | ||||
|                 'yAxisID'       => 0, // 0, 1, 2 | ||||
|                 'entries'       => $entries, | ||||
|             ]; | ||||
|  | ||||
|         } | ||||
|  | ||||
|         return $return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $basic | ||||
|      * @param array $sets | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function fillSets(array $basic, array $sets): array | ||||
|     { | ||||
|         foreach ($sets as $set) { | ||||
|             $label                                    = $set['label']; | ||||
|             $basic['spent_capped']['entries'][$label] = $set['entries']['spent_capped']; | ||||
|             $basic['left']['entries'][$label]         = $set['entries']['left']; | ||||
|             $basic['overspent']['entries'][$label]    = $set['entries']['overspent']; | ||||
|         } | ||||
|  | ||||
|         return $basic; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,157 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * CategoryController.php | ||||
|  * Copyright (c) 2019 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\Controllers\Chart; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\NoCategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\OperationsRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryController | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| { | ||||
|     private CategoryRepositoryInterface   $categoryRepository; | ||||
|     private NoCategoryRepositoryInterface $noCatRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private array                         $categories; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user                     = auth()->user(); | ||||
|                 $this->categoryRepository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->opsRepository      = app(OperationsRepositoryInterface::class); | ||||
|                 $this->noCatRepository    = app(NoCategoryRepositoryInterface::class); | ||||
|                 $this->categories         = []; | ||||
|                 $this->categoryRepository->setUser($user); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|                 $this->noCatRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param DateRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function overview(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for chart: | ||||
|         $dates = $request->getAll(); | ||||
|         /** @var Carbon $start */ | ||||
|         $start = $dates['start']; | ||||
|         /** @var Carbon $end */ | ||||
|         $end = $dates['end']; | ||||
|  | ||||
|         $tempData     = []; | ||||
|         $spentWith    = $this->opsRepository->listExpenses($start, $end); | ||||
|         $spentWithout = $this->noCatRepository->listExpenses($start, $end); | ||||
|  | ||||
|         /** @var array $set */ | ||||
|         foreach ([$spentWith, $spentWithout,] as $set) { | ||||
|             $tempData = $this->processArray($tempData, $set); | ||||
|         } | ||||
|  | ||||
|         $chartData = $this->sortArray($tempData); | ||||
|  | ||||
|         return response()->json($chartData); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $tempData | ||||
|      * @param array $set | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function processArray(array $tempData, array $set): array | ||||
|     { | ||||
|         foreach ($set as $currency) { | ||||
|             foreach ($currency['categories'] as $category) { | ||||
|                 $this->categories[] = $category['name']; | ||||
|                 $outKey             = sprintf('%d-e', $currency['currency_id']); | ||||
|                 $tempData[$outKey]  = $tempData[$outKey] ?? [ | ||||
|                         'currency_id'             => $currency['currency_id'], | ||||
|                         'label'                   => (string)trans('firefly.box_spent_in_currency', ['currency' => $currency['currency_name']]), | ||||
|                         'currency_code'           => $currency['currency_code'], | ||||
|                         'currency_symbol'         => $currency['currency_symbol'], | ||||
|                         'currency_decimal_places' => $currency['currency_decimal_places'], | ||||
|                         'type'                    => 'bar', // line, area or bar | ||||
|                         'yAxisID'                 => 0, // 0, 1, 2 | ||||
|                         'entries'                 => [], | ||||
|                     ]; | ||||
|  | ||||
|                 foreach ($category['transaction_journals'] as $journal) { | ||||
|                     // is it expense or income? | ||||
|                     $currentKey                              = sprintf('%d-%s', $currency['currency_id'], 'e'); | ||||
|                     $name                                    = $category['name']; | ||||
|                     $tempData[$currentKey]['entries'][$name] = $tempData[$currentKey]['entries'][$name] ?? '0'; | ||||
|                     $tempData[$currentKey]['entries'][$name] = bcadd($tempData[$currentKey]['entries'][$name], $journal['amount']); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $tempData; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $tempData | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function sortArray(array $tempData): array | ||||
|     { | ||||
|         // re-sort every spent array and add 0 for missing entries. | ||||
|         foreach ($tempData as $index => $set) { | ||||
|             $oldSet = $set['entries']; | ||||
|             $newSet = []; | ||||
|             foreach ($this->categories as $category) { | ||||
|                 $value             = $oldSet[$category] ?? '0'; | ||||
|                 $value             = -1 === bccomp($value, '0') ? bcmul($value, '-1') : $value; | ||||
|                 $newSet[$category] = $value; | ||||
|             } | ||||
|             $tempData[$index]['entries'] = $newSet; | ||||
|         } | ||||
|  | ||||
|         return array_values($tempData); | ||||
|     } | ||||
| } | ||||
| @@ -1,117 +0,0 @@ | ||||
| <?php | ||||
| /** | ||||
|  * ConfigurationController.php | ||||
|  * Copyright (c) 2019 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\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\ConfigurationRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Configuration; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class ConfigurationController. | ||||
|  * | ||||
|  * @codeCoverageIgnore | ||||
|  */ | ||||
| class ConfigurationController extends Controller | ||||
| { | ||||
|     /** @var UserRepositoryInterface The user repository */ | ||||
|     private $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * ConfigurationController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(UserRepositoryInterface::class); | ||||
|                 /** @var User $admin */ | ||||
|                 $admin = auth()->user(); | ||||
|  | ||||
|                 if (!$this->repository->hasRole($admin, 'owner')) { | ||||
|                     throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore | ||||
|                 } | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show all configuration. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $configData = $this->getConfigData(); | ||||
|  | ||||
|         return response()->json(['data' => $configData])->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get all config values. | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function getConfigData(): array | ||||
|     { | ||||
|         /** @var Configuration $isDemoSite */ | ||||
|         $isDemoSite = app('fireflyconfig')->get('is_demo_site'); | ||||
|         /** @var Configuration $updateCheck */ | ||||
|         $updateCheck = app('fireflyconfig')->get('permission_update_check'); | ||||
|         /** @var Configuration $lastCheck */ | ||||
|         $lastCheck = app('fireflyconfig')->get('last_update_check'); | ||||
|         /** @var Configuration $singleUser */ | ||||
|         $singleUser = app('fireflyconfig')->get('single_user_mode'); | ||||
|  | ||||
|         return [ | ||||
|             'is_demo_site'            => null === $isDemoSite ? null : $isDemoSite->data, | ||||
|             'permission_update_check' => null === $updateCheck ? null : (int) $updateCheck->data, | ||||
|             'last_update_check'       => null === $lastCheck ? null : (int) $lastCheck->data, | ||||
|             'single_user_mode'        => null === $singleUser ? null : $singleUser->data, | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the configuration. | ||||
|      * | ||||
|      * @param ConfigurationRequest $request | ||||
|      * @param string               $name | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(ConfigurationRequest $request, string $name): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         app('fireflyconfig')->set($name, $data['value']); | ||||
|         $configData = $this->getConfigData(); | ||||
|  | ||||
|         return response()->json(['data' => $configData])->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										71
									
								
								app/Api/V1/Controllers/Data/Bulk/AccountController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								app/Api/V1/Controllers/Data/Bulk/AccountController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * AccountController.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/>. | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Data\Bulk; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\Bulk\MoveTransactionsRequest; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Services\Internal\Destroy\AccountDestroyService; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| { | ||||
|     private AccountRepositoryInterface $repository; | ||||
|  | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param MoveTransactionsRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function moveTransactions(MoveTransactionsRequest $request): JsonResponse | ||||
|     { | ||||
|         $accountIds  = $request->getAll(); | ||||
|         $original    = $this->repository->findNull($accountIds['original_account']); | ||||
|         $destination = $this->repository->findNull($accountIds['destination_account']); | ||||
|  | ||||
|         /** @var AccountDestroyService $service */ | ||||
|         $service = app(AccountDestroyService::class); | ||||
|         $service->moveTransactions($original, $destination); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /** | ||||
| /* | ||||
|  * DestroyController.php | ||||
|  * Copyright (c) 2020 james@firefly-iii.org | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
| @@ -24,7 +24,7 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Data; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\DataDestroyRequest; | ||||
| use FireflyIII\Api\V1\Requests\Data\DestroyRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
| @@ -52,9 +52,12 @@ use Illuminate\Http\JsonResponse; | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     /** | ||||
|      * @param DestroyRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function destroy(DataDestroyRequest $request): JsonResponse | ||||
|     public function destroy(DestroyRequest $request): JsonResponse | ||||
|     { | ||||
|         $objects = $request->getObjects(); | ||||
|  | ||||
|   | ||||
							
								
								
									
										204
									
								
								app/Api/V1/Controllers/Data/Export/ExportController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								app/Api/V1/Controllers/Data/Export/ExportController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,204 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * AccountController.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/>. | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Data\Export; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest; | ||||
| use FireflyIII\Support\Export\ExportDataGenerator; | ||||
| use Illuminate\Http\Response as LaravelResponse; | ||||
| use League\Csv\CannotInsertRecord; | ||||
|  | ||||
| /** | ||||
|  * Class ExportController | ||||
|  */ | ||||
| class ExportController extends Controller | ||||
| { | ||||
|     private ExportDataGenerator $exporter; | ||||
|  | ||||
|     /** | ||||
|      * ExportController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->exporter = app(ExportDataGenerator::class); | ||||
|                 $this->exporter->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function accounts(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportAccounts(true); | ||||
|  | ||||
|         return $this->returnExport('accounts'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $key | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     private function returnExport(string $key): LaravelResponse | ||||
|     { | ||||
|         $date     = date('Y-m-d-H-i-s'); | ||||
|         $fileName = sprintf('%s-export-%s.csv', $date, $key); | ||||
|         $data     = $this->exporter->export(); | ||||
|  | ||||
|         /** @var LaravelResponse $response */ | ||||
|         $response = response($data[$key]); | ||||
|         $response | ||||
|             ->header('Content-Description', 'File Transfer') | ||||
|             ->header('Content-Type', 'application/octet-stream') | ||||
|             ->header('Content-Disposition', 'attachment; filename=' . $fileName) | ||||
|             ->header('Content-Transfer-Encoding', 'binary') | ||||
|             ->header('Connection', 'Keep-Alive') | ||||
|             ->header('Expires', '0') | ||||
|             ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') | ||||
|             ->header('Pragma', 'public') | ||||
|             ->header('Content-Length', (string)strlen($data[$key])); | ||||
|  | ||||
|         return $response; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function bills(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportBills(true); | ||||
|  | ||||
|         return $this->returnExport('bills'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function budgets(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportBudgets(true); | ||||
|  | ||||
|         return $this->returnExport('budgets'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function categories(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportCategories(true); | ||||
|  | ||||
|         return $this->returnExport('categories'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function piggyBanks(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportPiggies(true); | ||||
|  | ||||
|         return $this->returnExport('piggies'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function recurring(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportRecurring(true); | ||||
|  | ||||
|         return $this->returnExport('recurrences'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function rules(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportRules(true); | ||||
|  | ||||
|         return $this->returnExport('rules'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function tags(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportTags(true); | ||||
|  | ||||
|         return $this->returnExport('tags'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws CannotInsertRecord | ||||
|      */ | ||||
|     public function transactions(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $params = $request->getAll(); | ||||
|         $this->exporter->setStart($params['start']); | ||||
|         $this->exporter->setEnd($params['end']); | ||||
|         $this->exporter->setAccounts($params['accounts']); | ||||
|         $this->exporter->setExportTransactions(true); | ||||
|  | ||||
|         return $this->returnExport('transactions'); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										132
									
								
								app/Api/V1/Controllers/Insight/Expense/AccountController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								app/Api/V1/Controllers/Insight/Expense/AccountController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * DateController.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\Controllers\Insight\Expense; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Account\OperationsRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class AccountController | ||||
|  * | ||||
|  * Shows expense information grouped or limited by date. | ||||
|  * Ie. all expenses grouped by account + currency. | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
|  | ||||
|     private CurrencyRepositoryInterface   $currencyRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private AccountRepositoryInterface    $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
|  | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function asset(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $expenses      = $this->opsRepository->sumExpensesBySource($start, $end, $assetAccounts); | ||||
|         $result        = []; | ||||
|  | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|                 'id'               => (string)$expense['id'], | ||||
|                 'name'             => $expense['name'], | ||||
|                 'difference'       => $expense['sum'], | ||||
|                 'difference_float' => (float)$expense['sum'], | ||||
|                 'currency_id'      => (string)$expense['currency_id'], | ||||
|                 'currency_code'    => $expense['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function expense(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $assetAccounts   = $request->getAssetAccounts(); | ||||
|         $expenseAccounts = $request->getExpenseAccounts(); | ||||
|         $expenses        = $this->opsRepository->sumExpensesByDestination($start, $end, $assetAccounts, $expenseAccounts); | ||||
|         $result          = []; | ||||
|  | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|                 'id'               => (string)$expense['id'], | ||||
|                 'name'             => $expense['name'], | ||||
|                 'difference'       => $expense['sum'], | ||||
|                 'difference_float' => (float)$expense['sum'], | ||||
|                 'currency_id'      => (string)$expense['currency_id'], | ||||
|                 'currency_code'    => $expense['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										166
									
								
								app/Api/V1/Controllers/Insight/Expense/BillController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								app/Api/V1/Controllers/Insight/Expense/BillController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,166 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * PeriodController.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/>. | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Insight\Expense; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class BillController | ||||
|  */ | ||||
| class BillController extends Controller | ||||
| { | ||||
|     private BillRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Expenses per bill, possibly filtered by bill and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function bill(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $bills    = $request->getBills(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // get all bills: | ||||
|         if (0 === $bills->count()) { | ||||
|             $bills = $this->repository->getBills(); | ||||
|         } | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->setBills($bills); | ||||
|  | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $billId            = (int)$journal['bill_id']; | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|             $key               = sprintf('%d-%d', $billId, $currencyId); | ||||
|             $foreignKey        = sprintf('%d-%d', $billId, $foreignCurrencyId); | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$key]                     = $response[$key] ?? [ | ||||
|                         'id'               => (string)$billId, | ||||
|                         'name'             => $journal['bill_name'], | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$key]['difference']       = bcadd($response[$key]['difference'], $journal['amount']); | ||||
|                 $response[$key]['difference_float'] = (float)$response[$key]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignKey]                     = $response[$foreignKey] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignKey]['difference']       = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']); | ||||
|                 $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Expenses for no bill filtered by account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noBill(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->withoutBill(); | ||||
|  | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|  | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], $journal['amount']); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										127
									
								
								app/Api/V1/Controllers/Insight/Expense/BudgetController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								app/Api/V1/Controllers/Insight/Expense/BudgetController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| <?php | ||||
| /* | ||||
|  * BudgetController.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\Controllers\Insight\Expense; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\NoBudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class BudgetController | ||||
|  */ | ||||
| class BudgetController extends Controller | ||||
| { | ||||
|     private NoBudgetRepositoryInterface   $noRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private BudgetRepositoryInterface     $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->repository    = app(BudgetRepositoryInterface::class); | ||||
|                 $this->noRepository  = app(NoBudgetRepositoryInterface::class); | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->noRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function budget(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $budgets       = $request->getBudgets(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         if (0 === $budgets->count()) { | ||||
|             $budgets = $this->repository->getActiveBudgets(); | ||||
|         } | ||||
|         /** @var Budget $budget */ | ||||
|         foreach ($budgets as $budget) { | ||||
|             $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$budget]), null); | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
|                     'id'               => (string)$budget->id, | ||||
|                     'name'             => $budget->name, | ||||
|                     'difference'       => $expense['sum'], | ||||
|                     'difference_float' => (float)$expense['sum'], | ||||
|                     'currency_id'      => (string)$expense['currency_id'], | ||||
|                     'currency_code'    => $expense['currency_code'], | ||||
|                 ]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noBudget(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumExpenses($start, $end, $assetAccounts, null); | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|                 'difference'       => $expense['sum'], | ||||
|                 'difference_float' => (float)$expense['sum'], | ||||
|                 'currency_id'      => (string)$expense['currency_id'], | ||||
|                 'currency_code'    => $expense['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										127
									
								
								app/Api/V1/Controllers/Insight/Expense/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								app/Api/V1/Controllers/Insight/Expense/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * CategoryController.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\Controllers\Insight\Expense; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\NoCategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\OperationsRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryController | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| { | ||||
|     private NoCategoryRepositoryInterface $noRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private CategoryRepositoryInterface   $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->repository    = app(CategoryRepositoryInterface::class); | ||||
|                 $this->noRepository  = app(NoCategoryRepositoryInterface::class); | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->noRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function category(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $categories    = $request->getCategories(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         if (0 === $categories->count()) { | ||||
|             $categories = $this->repository->getCategories(); | ||||
|         } | ||||
|         /** @var Category $category */ | ||||
|         foreach ($categories as $category) { | ||||
|             $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$category])); | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
|                     'id'               => (string)$category->id, | ||||
|                     'name'             => $category->name, | ||||
|                     'difference'       => $expense['sum'], | ||||
|                     'difference_float' => (float)$expense['sum'], | ||||
|                     'currency_id'      => (string)$expense['currency_id'], | ||||
|                     'currency_code'    => $expense['currency_code'], | ||||
|                 ]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noCategory(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumExpenses($start, $end, $assetAccounts); | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|                 'difference'       => $expense['sum'], | ||||
|                 'difference_float' => (float)$expense['sum'], | ||||
|                 'currency_id'      => (string)$expense['currency_id'], | ||||
|                 'currency_code'    => $expense['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -1,131 +0,0 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * DateController.php | ||||
|  * Copyright (c) 2020 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/>. | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Insight\Expense; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DateController | ||||
|  * | ||||
|  * Shows expense information grouped or limited by date. | ||||
|  * Ie. all expenses grouped by account + currency. | ||||
|  */ | ||||
| class DateController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
|  | ||||
|     private CurrencyRepositoryInterface $currencyRepository; | ||||
|     private AccountRepositoryInterface  $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function basic(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for chart: | ||||
|         $dates = $request->getAll(); | ||||
|         /** @var Carbon $start */ | ||||
|         $start = $dates['start']; | ||||
|         /** @var Carbon $end */ | ||||
|         $end = $dates['end']; | ||||
|  | ||||
|         $start->subDay(); | ||||
|  | ||||
|         // prep some vars: | ||||
|         $currencies = []; | ||||
|         $chartData  = []; | ||||
|         $tempData   = []; | ||||
|  | ||||
|         // grab all accounts and names | ||||
|         $accounts      = $this->repository->getAccountsByType([AccountType::EXPENSE]); | ||||
|         $accountNames  = $this->extractNames($accounts); | ||||
|         $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); | ||||
|         $endBalances   = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); | ||||
|  | ||||
|         // loop the end balances. This is an array for each account ($expenses) | ||||
|         foreach ($endBalances as $accountId => $expenses) { | ||||
|             $accountId = (int)$accountId; | ||||
|             // loop each expense entry (each entry can be a different currency). | ||||
|             foreach ($expenses as $currencyId => $endAmount) { | ||||
|                 $currencyId = (int)$currencyId; | ||||
|  | ||||
|                 // see if there is an accompanying start amount. | ||||
|                 // grab the difference and find the currency. | ||||
|                 $startAmount             = $startBalances[$accountId][$currencyId] ?? '0'; | ||||
|                 $diff                    = bcsub($endAmount, $startAmount); | ||||
|                 $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); | ||||
|                 if (0 !== bccomp($diff, '0')) { | ||||
|                     // store the values in a temporary array. | ||||
|                     $tempData[] = [ | ||||
|                         'id'               => $accountId, | ||||
|                         'name'             => $accountNames[$accountId], | ||||
|                         'difference'       => bcmul($diff, '-1'), | ||||
|                         'difference_float' => ((float)$diff) * -1, | ||||
|                         'currency_id'      => $currencyId, | ||||
|                         'currency_code'    => $currencies[$currencyId]->code, | ||||
|                     ]; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|  | ||||
|         // sort temp array by amount. | ||||
|         $amounts = array_column($tempData, 'difference_float'); | ||||
|         array_multisort($amounts, SORT_ASC, $tempData); | ||||
|  | ||||
|         return response()->json($tempData); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										83
									
								
								app/Api/V1/Controllers/Insight/Expense/PeriodController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								app/Api/V1/Controllers/Insight/Expense/PeriodController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| <?php | ||||
| /* | ||||
|  * PeriodController.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\Controllers\Insight\Expense; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class PeriodController | ||||
|  */ | ||||
| class PeriodController extends Controller | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], $journal['amount']); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										172
									
								
								app/Api/V1/Controllers/Insight/Expense/TagController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								app/Api/V1/Controllers/Insight/Expense/TagController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * PeriodController.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/>. | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Insight\Expense; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class TagController | ||||
|  */ | ||||
| class TagController extends Controller | ||||
| { | ||||
|     private TagRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * TagController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(TagRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Expenses for no tag filtered by account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
|  | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|  | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], $journal['amount']); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Expenses per tag, possibly filtered by tag and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function tag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $tags     = $request->getTags(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // get all tags: | ||||
|         if (0 === $tags->count()) { | ||||
|             $tags = $this->repository->get(); | ||||
|         } | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->setTags($tags); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         /** @var array $journal */ | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             /** @var array $tag */ | ||||
|             foreach ($journal['tags'] as $tag) { | ||||
|                 $tagId      = $tag['id']; | ||||
|                 $key        = sprintf('%d-%d', $tagId, $currencyId); | ||||
|                 $foreignKey = sprintf('%d-%d', $tagId, $foreignCurrencyId); | ||||
|  | ||||
|                 // on currency ID | ||||
|                 if (0 !== $currencyId) { | ||||
|                     $response[$key]                     = $response[$key] ?? [ | ||||
|                             'id'               => (string)$tagId, | ||||
|                             'name'             => $tag['name'], | ||||
|                             'difference'       => '0', | ||||
|                             'difference_float' => 0, | ||||
|                             'currency_id'      => (string)$currencyId, | ||||
|                             'currency_code'    => $journal['currency_code'], | ||||
|                         ]; | ||||
|                     $response[$key]['difference']       = bcadd($response[$key]['difference'], $journal['amount']); | ||||
|                     $response[$key]['difference_float'] = (float)$response[$key]['difference']; | ||||
|                 } | ||||
|  | ||||
|                 // on foreign ID | ||||
|                 if (0 !== $foreignCurrencyId) { | ||||
|                     $response[$foreignKey]                     = $journal[$foreignKey] ?? [ | ||||
|                             'difference'       => '0', | ||||
|                             'difference_float' => 0, | ||||
|                             'currency_id'      => (string)$foreignCurrencyId, | ||||
|                             'currency_code'    => $journal['foreign_currency_code'], | ||||
|                         ]; | ||||
|                     $response[$foreignKey]['difference']       = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']); | ||||
|                     $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										136
									
								
								app/Api/V1/Controllers/Insight/Income/AccountController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								app/Api/V1/Controllers/Insight/Income/AccountController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * DateController.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\Controllers\Insight\Income; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Account\OperationsRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class AccountController | ||||
|  * | ||||
|  * Shows income information grouped or limited by date. | ||||
|  * Ie. all income grouped by account + currency. | ||||
|  * TODO same code as Expense/AccountController. | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
|  | ||||
|     private CurrencyRepositoryInterface   $currencyRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private AccountRepositoryInterface    $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
|  | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * TODO same code as Expense/AccountController. | ||||
|      * TODO does not actually include the name of the expense account. | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function asset(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $income        = $this->opsRepository->sumIncomeByDestination($start, $end, $assetAccounts); | ||||
|         $result        = []; | ||||
|         /** @var array $entry */ | ||||
|         foreach ($income as $entry) { | ||||
|             $result[] = [ | ||||
|                 'id'               => (string)$entry['id'], | ||||
|                 'name'             => $entry['name'], | ||||
|                 'difference'       => $entry['sum'], | ||||
|                 'difference_float' => (float)$entry['sum'], | ||||
|                 'currency_id'      => (string)$entry['currency_id'], | ||||
|                 'currency_code'    => $entry['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * TODO does not actually include the name of the expense account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function revenue(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $assetAccounts   = $request->getAssetAccounts(); | ||||
|         $revenueAccounts = $request->getRevenueAccounts(); | ||||
|         $income          = $this->opsRepository->sumIncomeBySource($start, $end, $assetAccounts, $revenueAccounts); | ||||
|         $result          = []; | ||||
|  | ||||
|         /** @var array $entry */ | ||||
|         foreach ($income as $entry) { | ||||
|             $result[] = [ | ||||
|                 'id'               => (string)$entry['id'], | ||||
|                 'name'             => $entry['name'], | ||||
|                 'difference'       => $entry['sum'], | ||||
|                 'difference_float' => (float)$entry['sum'], | ||||
|                 'currency_id'      => (string)$entry['currency_id'], | ||||
|                 'currency_code'    => $entry['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										128
									
								
								app/Api/V1/Controllers/Insight/Income/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								app/Api/V1/Controllers/Insight/Income/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * CategoryController.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\Controllers\Insight\Income; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\NoCategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\OperationsRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryController | ||||
|  * TODO same as opposing category controller | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| { | ||||
|     private NoCategoryRepositoryInterface $noRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private CategoryRepositoryInterface   $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->repository    = app(CategoryRepositoryInterface::class); | ||||
|                 $this->noRepository  = app(NoCategoryRepositoryInterface::class); | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->noRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function category(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $categories    = $request->getCategories(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         if (0 === $categories->count()) { | ||||
|             $categories = $this->repository->getCategories(); | ||||
|         } | ||||
|         /** @var Category $category */ | ||||
|         foreach ($categories as $category) { | ||||
|             $expenses = $this->opsRepository->sumIncome($start, $end, $assetAccounts, new Collection([$category])); | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
|                     'id'               => (string)$category->id, | ||||
|                     'name'             => $category->name, | ||||
|                     'difference'       => $expense['sum'], | ||||
|                     'difference_float' => (float)$expense['sum'], | ||||
|                     'currency_id'      => (string)$expense['currency_id'], | ||||
|                     'currency_code'    => $expense['currency_code'], | ||||
|                 ]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noCategory(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumIncome($start, $end, $assetAccounts); | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|                 'difference'       => $expense['sum'], | ||||
|                 'difference_float' => (float)$expense['sum'], | ||||
|                 'currency_id'      => (string)$expense['currency_id'], | ||||
|                 'currency_code'    => $expense['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -1,131 +0,0 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * DateController.php | ||||
|  * Copyright (c) 2020 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/>. | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Insight\Income; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DateController | ||||
|  * | ||||
|  * Shows income information grouped or limited by date. | ||||
|  * Ie. all income grouped by revenue + currency. | ||||
|  */ | ||||
| class DateController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
|  | ||||
|     private CurrencyRepositoryInterface $currencyRepository; | ||||
|     private AccountRepositoryInterface  $repository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function basic(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for chart: | ||||
|         $dates = $request->getAll(); | ||||
|         /** @var Carbon $start */ | ||||
|         $start = $dates['start']; | ||||
|         /** @var Carbon $end */ | ||||
|         $end = $dates['end']; | ||||
|  | ||||
|         $start->subDay(); | ||||
|  | ||||
|         // prep some vars: | ||||
|         $currencies = []; | ||||
|         $chartData  = []; | ||||
|         $tempData   = []; | ||||
|  | ||||
|         // grab all accounts and names | ||||
|         $accounts      = $this->repository->getAccountsByType([AccountType::REVENUE]); | ||||
|         $accountNames  = $this->extractNames($accounts); | ||||
|         $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); | ||||
|         $endBalances   = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); | ||||
|  | ||||
|         // loop the end balances. This is an array for each account ($expenses) | ||||
|         foreach ($endBalances as $accountId => $expenses) { | ||||
|             $accountId = (int)$accountId; | ||||
|             // loop each expense entry (each entry can be a different currency). | ||||
|             foreach ($expenses as $currencyId => $endAmount) { | ||||
|                 $currencyId = (int)$currencyId; | ||||
|  | ||||
|                 // see if there is an accompanying start amount. | ||||
|                 // grab the difference and find the currency. | ||||
|                 $startAmount             = $startBalances[$accountId][$currencyId] ?? '0'; | ||||
|                 $diff                    = bcsub($endAmount, $startAmount); | ||||
|                 $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); | ||||
|                 if (0 !== bccomp($diff, '0')) { | ||||
|                     // store the values in a temporary array. | ||||
|                     $tempData[] = [ | ||||
|                         'id'               => $accountId, | ||||
|                         'name'             => $accountNames[$accountId], | ||||
|                         'difference'       => $diff, | ||||
|                         'difference_float' => (float)$diff, | ||||
|                         'currency_id'      => $currencyId, | ||||
|                         'currency_code'    => $currencies[$currencyId]->code, | ||||
|                     ]; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|  | ||||
|         // sort temp array by amount. | ||||
|         $amounts = array_column($tempData, 'difference_float'); | ||||
|         array_multisort($amounts, SORT_ASC, $tempData); | ||||
|  | ||||
|         return response()->json($tempData); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										85
									
								
								app/Api/V1/Controllers/Insight/Income/PeriodController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								app/Api/V1/Controllers/Insight/Income/PeriodController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| <?php | ||||
| /* | ||||
|  * PeriodController.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\Controllers\Insight\Income; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class PeriodController | ||||
|  */ | ||||
| class PeriodController extends Controller | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd( | ||||
|                     $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) | ||||
|                 ); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										177
									
								
								app/Api/V1/Controllers/Insight/Income/TagController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								app/Api/V1/Controllers/Insight/Income/TagController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * PeriodController.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/>. | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers\Insight\Income; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class TagController | ||||
|  */ | ||||
| class TagController extends Controller | ||||
| { | ||||
|     private TagRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * TagController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(TagRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Expenses for no tag filtered by account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
|  | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|  | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd( | ||||
|                     $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) | ||||
|                 ); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Expenses per tag, possibly filtered by tag and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function tag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $tags     = $request->getTags(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // get all tags: | ||||
|         if (0 === $tags->count()) { | ||||
|             $tags = $this->repository->get(); | ||||
|         } | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->setTags($tags); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         /** @var array $journal */ | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             /** @var array $tag */ | ||||
|             foreach ($journal['tags'] as $tag) { | ||||
|                 $tagId      = $tag['id']; | ||||
|                 $key        = sprintf('%d-%d', $tagId, $currencyId); | ||||
|                 $foreignKey = sprintf('%d-%d', $tagId, $foreignCurrencyId); | ||||
|  | ||||
|                 // on currency ID | ||||
|                 if (0 !== $currencyId) { | ||||
|                     $response[$key]                     = $response[$key] ?? [ | ||||
|                             'id'               => (string)$tagId, | ||||
|                             'name'             => $tag['name'], | ||||
|                             'difference'       => '0', | ||||
|                             'difference_float' => 0, | ||||
|                             'currency_id'      => (string)$currencyId, | ||||
|                             'currency_code'    => $journal['currency_code'], | ||||
|                         ]; | ||||
|                     $response[$key]['difference']       = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount'])); | ||||
|                     $response[$key]['difference_float'] = (float)$response[$key]['difference']; | ||||
|                 } | ||||
|  | ||||
|                 // on foreign ID | ||||
|                 if (0 !== $foreignCurrencyId) { | ||||
|                     $response[$foreignKey]                     = $journal[$foreignKey] ?? [ | ||||
|                             'difference'       => '0', | ||||
|                             'difference_float' => 0, | ||||
|                             'currency_id'      => (string)$foreignCurrencyId, | ||||
|                             'currency_code'    => $journal['foreign_currency_code'], | ||||
|                         ]; | ||||
|                     $response[$foreignKey]['difference']       = bcadd( | ||||
|                         $response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount']) | ||||
|                     ); | ||||
|                     $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,76 @@ | ||||
| <?php | ||||
| /* | ||||
|  * AccountController.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\Controllers\Insight\Transfer; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Repositories\Account\OperationsRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
|  | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * TODO same code as Expense/AccountController. | ||||
|      * TODO does not actually include the name of the expense account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function asset(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $transfers     = $this->opsRepository->sumTransfers($start, $end, $assetAccounts); | ||||
|         return response()->json($transfers); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										126
									
								
								app/Api/V1/Controllers/Insight/Transfer/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								app/Api/V1/Controllers/Insight/Transfer/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| <?php | ||||
| /* | ||||
|  * CategoryController.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\Controllers\Insight\Transfer; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\NoCategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\OperationsRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryController | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| { | ||||
|     private NoCategoryRepositoryInterface $noRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private CategoryRepositoryInterface   $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->repository    = app(CategoryRepositoryInterface::class); | ||||
|                 $this->noRepository  = app(NoCategoryRepositoryInterface::class); | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->opsRepository->setUser($user); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->noRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function category(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $categories    = $request->getCategories(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         if (0 === $categories->count()) { | ||||
|             $categories = $this->repository->getCategories(); | ||||
|         } | ||||
|         /** @var Category $category */ | ||||
|         foreach ($categories as $category) { | ||||
|             $expenses = $this->opsRepository->sumTransfers($start, $end, $assetAccounts, new Collection([$category])); | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
|                     'id'               => (string)$category->id, | ||||
|                     'name'             => $category->name, | ||||
|                     'difference'       => $expense['sum'], | ||||
|                     'difference_float' => (float)$expense['sum'], | ||||
|                     'currency_id'      => (string)$expense['currency_id'], | ||||
|                     'currency_code'    => $expense['currency_code'], | ||||
|                 ]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noCategory(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $start         = $request->getStart(); | ||||
|         $end           = $request->getEnd(); | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumTransfers($start, $end, $assetAccounts); | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|                 'difference'       => $expense['sum'], | ||||
|                 'difference_float' => (float)$expense['sum'], | ||||
|                 'currency_id'      => (string)$expense['currency_id'], | ||||
|                 'currency_code'    => $expense['currency_code'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($result); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										85
									
								
								app/Api/V1/Controllers/Insight/Transfer/PeriodController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								app/Api/V1/Controllers/Insight/Transfer/PeriodController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| <?php | ||||
| /* | ||||
|  * PeriodController.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\Controllers\Insight\Transfer; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class PeriodController | ||||
|  */ | ||||
| class PeriodController extends Controller | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd( | ||||
|                     $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) | ||||
|                 ); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										178
									
								
								app/Api/V1/Controllers/Insight/Transfer/TagController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								app/Api/V1/Controllers/Insight/Transfer/TagController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| <?php | ||||
| /* | ||||
|  * TagController.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\Controllers\Insight\Transfer; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class TagController | ||||
|  */ | ||||
| class TagController extends Controller | ||||
| { | ||||
|     private TagRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * TagController constructor. | ||||
|      * TODO lots of copying and pasting here. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(TagRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Expenses for no tag filtered by account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
|  | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|  | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd( | ||||
|                     $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) | ||||
|                 ); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Transfers per tag, possibly filtered by tag and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function tag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $tags     = $request->getTags(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|  | ||||
|         // get all tags: | ||||
|         if (0 === $tags->count()) { | ||||
|             $tags = $this->repository->get(); | ||||
|         } | ||||
|  | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts. | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->setTags($tags); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         /** @var array $journal */ | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|  | ||||
|             /** @var array $tag */ | ||||
|             foreach ($journal['tags'] as $tag) { | ||||
|                 $tagId      = $tag['id']; | ||||
|                 $key        = sprintf('%d-%d', $tagId, $currencyId); | ||||
|                 $foreignKey = sprintf('%d-%d', $tagId, $foreignCurrencyId); | ||||
|  | ||||
|                 // on currency ID | ||||
|                 if (0 !== $currencyId) { | ||||
|                     $response[$key]                     = $response[$key] ?? [ | ||||
|                             'id'               => (string)$tagId, | ||||
|                             'name'             => $tag['name'], | ||||
|                             'difference'       => '0', | ||||
|                             'difference_float' => 0, | ||||
|                             'currency_id'      => (string)$currencyId, | ||||
|                             'currency_code'    => $journal['currency_code'], | ||||
|                         ]; | ||||
|                     $response[$key]['difference']       = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount'])); | ||||
|                     $response[$key]['difference_float'] = (float)$response[$key]['difference']; | ||||
|                 } | ||||
|  | ||||
|                 // on foreign ID | ||||
|                 if (0 !== $foreignCurrencyId) { | ||||
|                     $response[$foreignKey]                     = $journal[$foreignKey] ?? [ | ||||
|                             'difference'       => '0', | ||||
|                             'difference_float' => 0, | ||||
|                             'currency_id'      => (string)$foreignCurrencyId, | ||||
|                             'currency_code'    => $journal['foreign_currency_code'], | ||||
|                         ]; | ||||
|                     $response[$foreignKey]['difference']       = bcadd( | ||||
|                         $response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount']) | ||||
|                     ); | ||||
|                     $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return response()->json(array_values($response)); | ||||
|     } | ||||
| } | ||||
| @@ -1,274 +0,0 @@ | ||||
| <?php | ||||
| /** | ||||
|  * LinkTypeController.php | ||||
|  * Copyright (c) 2019 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\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\LinkTypeStoreRequest; | ||||
| use FireflyIII\Api\V1\Requests\LinkTypeUpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\LinkType; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\LinkTypeTransformer; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class LinkTypeController. | ||||
|  */ | ||||
| class LinkTypeController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
|  | ||||
|     /** @var LinkTypeRepositoryInterface The link type repository */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** @var UserRepositoryInterface The user repository */ | ||||
|     private $userRepository; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * LinkTypeController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user                 = auth()->user(); | ||||
|                 $this->repository     = app(LinkTypeRepositoryInterface::class); | ||||
|                 $this->userRepository = app(UserRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param LinkType $linkType | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function delete(LinkType $linkType): JsonResponse | ||||
|     { | ||||
|         if (false === $linkType->editable) { | ||||
|             throw new FireflyException('200020: Link type cannot be changed.'); | ||||
|         } | ||||
|         $this->repository->destroy($linkType); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager  = $this->getManager(); | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of accounts. Count it and split it. | ||||
|         $collection = $this->repository->get(); | ||||
|         $count      = $collection->count(); | ||||
|         $linkTypes  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($linkTypes, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.link_types.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var LinkTypeTransformer $transformer */ | ||||
|         $transformer = app(LinkTypeTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($linkTypes, $transformer, 'link_types'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param LinkType $linkType | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(LinkType $linkType): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var LinkTypeTransformer $transformer */ | ||||
|         $transformer = app(LinkTypeTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($linkType, $transformer, 'link_types'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param LinkTypeStoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(LinkTypeStoreRequest $request): JsonResponse | ||||
|     { | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|  | ||||
|         if (!$this->userRepository->hasRole($admin, 'owner')) { | ||||
|             throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore | ||||
|         } | ||||
|         $data = $request->getAll(); | ||||
|         // if currency ID is 0, find the currency by the code: | ||||
|         $linkType = $this->repository->store($data); | ||||
|         $manager  = $this->getManager(); | ||||
|  | ||||
|         /** @var LinkTypeTransformer $transformer */ | ||||
|         $transformer = app(LinkTypeTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($linkType, $transformer, 'link_types'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param Request  $request | ||||
|      * @param LinkType $linkType | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function transactions(Request $request, LinkType $linkType): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
|  | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         // whatever is returned by the query, it must be part of these journals: | ||||
|         $journalIds = $this->repository->getJournalIds($linkType); | ||||
|  | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|  | ||||
|         // use new group collector: | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on journal IDs. | ||||
|             ->setJournalIds($journalIds) | ||||
|             // all info needed for the API: | ||||
|             ->withAPIInformation() | ||||
|             // set page size: | ||||
|             ->setLimit($pageSize) | ||||
|             // set page to retrieve | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return. | ||||
|             ->setTypes($types); | ||||
|  | ||||
|  | ||||
|         if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) { | ||||
|             $collector->setRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         } | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.transactions.index') . $this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
|  | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Update object. | ||||
|      * | ||||
|      * @param LinkTypeUpdateRequest $request | ||||
|      * @param LinkType        $linkType | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function update(LinkTypeUpdateRequest $request, LinkType $linkType): JsonResponse | ||||
|     { | ||||
|         if (false === $linkType->editable) { | ||||
|             throw new FireflyException('200020: Link type cannot be changed.'); | ||||
|         } | ||||
|  | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|  | ||||
|         if (!$this->userRepository->hasRole($admin, 'owner')) { | ||||
|             throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore | ||||
|         } | ||||
|  | ||||
|         $data = $request->getAll(); | ||||
|         $this->repository->update($linkType, $data); | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var LinkTypeTransformer $transformer */ | ||||
|         $transformer = app(LinkTypeTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($linkType, $transformer, 'link_types'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										72
									
								
								app/Api/V1/Controllers/Models/Account/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								app/Api/V1/Controllers/Models/Account/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2019 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\Controllers\Models\Account; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|  | ||||
|     private AccountRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(Account $account): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($account, null); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -21,16 +21,13 @@ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\AccountStoreRequest; | ||||
| use FireflyIII\Api\V1\Requests\AccountUpdateRequest; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| @@ -41,20 +38,18 @@ use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController. | ||||
|  * Class ListController | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| class ListController extends Controller | ||||
| { | ||||
|     use AccountFilter, TransactionFilter; | ||||
|     use TransactionFilter; | ||||
| 
 | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
| 
 | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| @@ -65,11 +60,8 @@ class AccountController extends Controller | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|                 // @var AccountRepositoryInterface repository
 | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
| @@ -85,7 +77,7 @@ class AccountController extends Controller | ||||
|     public function attachments(Account $account): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($account); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
| @@ -105,60 +97,6 @@ class AccountController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Account $account): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($account, null); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $type    = $request->get('type') ?? 'all'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $types    = $this->mapAccountTypes($this->parameters->get('type')); | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $collection = $this->repository->getAccountsByType($types); | ||||
|         $count      = $collection->count(); | ||||
|         $accounts   = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.index') . $this->buildParams()); | ||||
| 
 | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * List all piggies. | ||||
|      * | ||||
| @@ -173,7 +111,7 @@ class AccountController extends Controller | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getPiggyBanks($account); | ||||
| @@ -195,47 +133,6 @@ class AccountController extends Controller | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show single instance. | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Account $account): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Store a new instance. | ||||
|      * | ||||
|      * @param AccountStoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(AccountStoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAllAccountData(); | ||||
|         $account = $this->repository->store($data); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show all transaction groups related to the account. | ||||
|      * | ||||
| @@ -248,7 +145,7 @@ class AccountController extends Controller | ||||
|      */ | ||||
|     public function transactions(Request $request, Account $account): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
| @@ -285,27 +182,4 @@ class AccountController extends Controller | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update account. | ||||
|      * | ||||
|      * @param AccountUpdateRequest $request | ||||
|      * @param Account              $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(AccountUpdateRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         $data         = $request->getUpdateData(); | ||||
|         $data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type); | ||||
|         $this->repository->update($account, $data); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										127
									
								
								app/Api/V1/Controllers/Models/Account/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								app/Api/V1/Controllers/Models/Account/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\Account; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     use AccountFilter; | ||||
|  | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|  | ||||
|     private AccountRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $type    = $request->get('type') ?? 'all'; | ||||
|         $this->parameters->set('type', $type); | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $types    = $this->mapAccountTypes($this->parameters->get('type')); | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of accounts. Count it and split it. | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $collection = $this->repository->getAccountsByType($types); | ||||
|         $count      = $collection->count(); | ||||
|         $accounts   = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show single instance. | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Account $account): JsonResponse | ||||
|     { | ||||
|         // get list of accounts. Count it and split it. | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $account->refresh(); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										83
									
								
								app/Api/V1/Controllers/Models/Account/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								app/Api/V1/Controllers/Models/Account/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2019 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\Controllers\Models\Account; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Account\StoreRequest; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|  | ||||
|     private AccountRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a new instance. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAllAccountData(); | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $account = $this->repository->store($data); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										86
									
								
								app/Api/V1/Controllers/Models/Account/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								app/Api/V1/Controllers/Models/Account/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2019 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\Controllers\Models\Account; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Account\UpdateRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|  | ||||
|     private AccountRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update account. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Account       $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $data         = $request->getUpdateData(); | ||||
|         $data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type); | ||||
|         $account      = $this->repository->update($account, $data); | ||||
|         $manager      = $this->getManager(); | ||||
|         $account->refresh(); | ||||
|  | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,76 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\Attachment; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Middleware\ApiDemoUser; | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private AttachmentRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * DestroyController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AttachmentRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($attachment); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AttachmentController.php | ||||
|  * Copyright (c) 2019 james@firefly-iii.org | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
| @@ -21,38 +21,31 @@ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Attachment; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Middleware\ApiDemoUser; | ||||
| use FireflyIII\Api\V1\Requests\AttachmentStoreRequest; | ||||
| use FireflyIII\Api\V1\Requests\AttachmentUpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Http\Response as LaravelResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Log; | ||||
| use function strlen; | ||||
| 
 | ||||
| /** | ||||
|  * Class AttachmentController. | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class AttachmentController extends Controller | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     /** @var AttachmentRepositoryInterface The attachment repository */ | ||||
|     private $repository; | ||||
| 
 | ||||
|     private AttachmentRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * ShowController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
| @@ -67,28 +60,11 @@ class AttachmentController extends Controller | ||||
|                 $this->repository = app(AttachmentRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
| 
 | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($attachment); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download an attachment. | ||||
|      * | ||||
| @@ -124,7 +100,7 @@ class AttachmentController extends Controller | ||||
|                 ->header('Expires', '0') | ||||
|                 ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') | ||||
|                 ->header('Pragma', 'public') | ||||
|                 ->header('Content-Length', strlen($content)); | ||||
|                 ->header('Content-Length', (string)strlen($content)); | ||||
| 
 | ||||
|             return $response; | ||||
|         } | ||||
| @@ -142,9 +118,9 @@ class AttachmentController extends Controller | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         // get list of attachments. Count it and split it.
 | ||||
|         $collection  = $this->repository->get(); | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| @@ -181,76 +157,4 @@ class AttachmentController extends Controller | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param AttachmentStoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(AttachmentStoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getAll(); | ||||
|         $attachment = $this->repository->store($data); | ||||
|         $manager    = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($attachment, $transformer, 'attachments'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param AttachmentUpdateRequest $request | ||||
|      * @param Attachment              $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(AttachmentUpdateRequest $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         $this->repository->update($attachment, $data); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($attachment, $transformer, 'attachments'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Upload an attachment. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param Request    $request | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function upload(Request $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         /** @var AttachmentHelperInterface $helper */ | ||||
|         $helper = app(AttachmentHelperInterface::class); | ||||
|         $body   = $request->getContent(); | ||||
|         if ('' === $body) { | ||||
|             Log::error('Body of attachment is empty.'); | ||||
| 
 | ||||
|             return response()->json([], 422); | ||||
|         } | ||||
|         $helper->saveAttachmentFromApi($attachment, $body); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										116
									
								
								app/Api/V1/Controllers/Models/Attachment/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								app/Api/V1/Controllers/Models/Attachment/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\Attachment; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Middleware\ApiDemoUser; | ||||
| use FireflyIII\Api\V1\Requests\Models\Attachment\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private AttachmentRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * StoreController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AttachmentRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $data       = $request->getAll(); | ||||
|         $attachment = $this->repository->store($data); | ||||
|         $manager    = $this->getManager(); | ||||
|  | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($attachment, $transformer, 'attachments'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Upload an attachment. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param Request    $request | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function upload(Request $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         /** @var AttachmentHelperInterface $helper */ | ||||
|         $helper = app(AttachmentHelperInterface::class); | ||||
|         $body   = $request->getContent(); | ||||
|         if ('' === $body) { | ||||
|             Log::error('Body of attachment is empty.'); | ||||
|  | ||||
|             return response()->json([], 422); | ||||
|         } | ||||
|         $helper->saveAttachmentFromApi($attachment, $body); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,86 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\Attachment; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Middleware\ApiDemoUser; | ||||
| use FireflyIII\Api\V1\Requests\Models\Attachment\UpdateRequest; | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private AttachmentRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * UpdateController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AttachmentRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Attachment    $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         $this->repository->update($attachment, $data); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($attachment, $transformer, 'attachments'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,74 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\AvailableBudget; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\AvailableBudget; | ||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private AvailableBudgetRepositoryInterface $abRepository; | ||||
|  | ||||
|     /** | ||||
|      * AvailableBudgetController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->abRepository = app(AvailableBudgetRepositoryInterface::class); | ||||
|                 $this->abRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param AvailableBudget $availableBudget | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $this->abRepository->destroyAvailableBudget($availableBudget); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AvailableBudgetController.php | ||||
|  * Copyright (c) 2019 james@firefly-iii.org | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
| @@ -21,12 +21,10 @@ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\AvailableBudgetRequest; | ||||
| use FireflyIII\Factory\TransactionCurrencyFactory; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\AvailableBudget; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\AvailableBudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| @@ -37,9 +35,9 @@ use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| /** | ||||
|  * Class AvailableBudgetController. | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class AvailableBudgetController extends Controller | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private AvailableBudgetRepositoryInterface $abRepository; | ||||
| 
 | ||||
| @@ -63,22 +61,6 @@ class AvailableBudgetController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param AvailableBudget $availableBudget | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $this->abRepository->destroyAvailableBudget($availableBudget); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
| @@ -90,7 +72,7 @@ class AvailableBudgetController extends Controller | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         $start = $this->parameters->get('start'); | ||||
|         $end   = $this->parameters->get('end'); | ||||
| @@ -135,77 +117,4 @@ class AvailableBudgetController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param AvailableBudgetRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(AvailableBudgetRequest $request): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         $data['start']->startOfDay(); | ||||
|         $data['end']->endOfDay(); | ||||
| 
 | ||||
|         /** @var TransactionCurrencyFactory $factory */ | ||||
|         $factory  = app(TransactionCurrencyFactory::class); | ||||
|         $currency = $factory->find($data['currency_id'], $data['currency_code']); | ||||
| 
 | ||||
|         if (null === $currency) { | ||||
|             $currency = app('amount')->getDefaultCurrency(); | ||||
|         } | ||||
|         $data['currency'] = $currency; | ||||
|         $availableBudget  = $this->abRepository->store($data); | ||||
|         $manager          = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AvailableBudgetTransformer $transformer */ | ||||
|         $transformer = app(AvailableBudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param AvailableBudgetRequest $request | ||||
|      * @param AvailableBudget        $availableBudget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(AvailableBudgetRequest $request, AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
| 
 | ||||
|         /** @var TransactionCurrencyFactory $factory */ | ||||
|         $factory = app(TransactionCurrencyFactory::class); | ||||
|         /** @var TransactionCurrency $currency */ | ||||
|         $currency = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null); | ||||
| 
 | ||||
|         if (null === $currency) { | ||||
|             // use default currency:
 | ||||
|             $currency = app('amount')->getDefaultCurrency(); | ||||
|         } | ||||
|         $currency->enabled = true; | ||||
|         $currency->save(); | ||||
|         unset($data['currency_code']); | ||||
|         $data['currency_id'] = $currency->id; | ||||
| 
 | ||||
| 
 | ||||
|         $this->abRepository->updateAvailableBudget($availableBudget, $data); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AvailableBudgetTransformer $transformer */ | ||||
|         $transformer = app(AvailableBudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,98 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\AvailableBudget; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\AvailableBudget\Request; | ||||
| use FireflyIII\Factory\TransactionCurrencyFactory; | ||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\AvailableBudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private AvailableBudgetRepositoryInterface $abRepository; | ||||
|  | ||||
|     /** | ||||
|      * AvailableBudgetController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->abRepository = app(AvailableBudgetRepositoryInterface::class); | ||||
|                 $this->abRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(Request $request): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         $data['start']->startOfDay(); | ||||
|         $data['end']->endOfDay(); | ||||
|  | ||||
|         // currency is not mandatory: | ||||
|         if (array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) { | ||||
|             $factory             = app(TransactionCurrencyFactory::class); | ||||
|             $currency            = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null); | ||||
|             $data['currency_id'] = $currency->id; | ||||
|             unset($data['currency_code']); | ||||
|         } | ||||
|         if (!array_key_exists('currency_id', $data)) { | ||||
|             $currency            = app('amount')->getDefaultCurrencyByUser(auth()->user()); | ||||
|             $data['currency_id'] = $currency->id; | ||||
|         } | ||||
|  | ||||
|         $availableBudget = $this->abRepository->store($data); | ||||
|         $manager         = $this->getManager(); | ||||
|  | ||||
|         /** @var AvailableBudgetTransformer $transformer */ | ||||
|         $transformer = app(AvailableBudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,97 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\AvailableBudget; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\AvailableBudget\Request; | ||||
| use FireflyIII\Factory\TransactionCurrencyFactory; | ||||
| use FireflyIII\Models\AvailableBudget; | ||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\AvailableBudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private AvailableBudgetRepositoryInterface $abRepository; | ||||
|  | ||||
|     /** | ||||
|      * AvailableBudgetController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->abRepository = app(AvailableBudgetRepositoryInterface::class); | ||||
|                 $this->abRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param Request         $request | ||||
|      * @param AvailableBudget $availableBudget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(Request $request, AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|  | ||||
|         // find and validate currency ID | ||||
|         if (array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) { | ||||
|             $factory           = app(TransactionCurrencyFactory::class); | ||||
|             $currency          = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null) ?? app('amount')->getDefaultCurrency(); | ||||
|             $currency->enabled = true; | ||||
|             $currency->save(); | ||||
|             unset($data['currency_code']); | ||||
|             $data['currency_id'] = $currency->id; | ||||
|         } | ||||
|  | ||||
|         $this->abRepository->updateAvailableBudget($availableBudget, $data); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var AvailableBudgetTransformer $transformer */ | ||||
|         $transformer = app(AvailableBudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										72
									
								
								app/Api/V1/Controllers/Models/Bill/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								app/Api/V1/Controllers/Models/Bill/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\Bill; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private BillRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($bill); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,8 +1,7 @@ | ||||
| <?php | ||||
| 
 | ||||
| /** | ||||
|  * BillController.php | ||||
|  * Copyright (c) 2019 james@firefly-iii.org | ||||
| /* | ||||
|  * ListController.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
| @@ -22,17 +21,14 @@ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Bill; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\BillUpdateRequest; | ||||
| use FireflyIII\Api\V1\Requests\BillStoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| @@ -41,18 +37,16 @@ use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| /** | ||||
|  * Class BillController. | ||||
|  * Class ListController | ||||
|  */ | ||||
| class BillController extends Controller | ||||
| class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
| 
 | ||||
|     private BillRepositoryInterface $repository; | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
| @@ -63,12 +57,8 @@ class BillController extends Controller | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $admin */ | ||||
|                 $admin = auth()->user(); | ||||
| 
 | ||||
|                 /** @var BillRepositoryInterface repository */ | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUser($admin); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
| @@ -86,7 +76,7 @@ class BillController extends Controller | ||||
|     public function attachments(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($bill); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
| @@ -106,46 +96,6 @@ class BillController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function delete(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($bill); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $bills     = $this->repository->getBills(); | ||||
|         $manager   = $this->getManager(); | ||||
|         $pageSize  = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $count     = $bills->count(); | ||||
|         $bills     = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||
| 
 | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($bills, $transformer, 'bills'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
| @@ -159,7 +109,7 @@ class BillController extends Controller | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getRulesForBill($bill); | ||||
| @@ -173,8 +123,6 @@ class BillController extends Controller | ||||
|         /** @var RuleTransformer $transformer */ | ||||
|         $transformer = app(RuleTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
| 
 | ||||
|         $resource = new FractalCollection($rules, $transformer, 'rules'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
| @@ -182,48 +130,6 @@ class BillController extends Controller | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show the specified bill. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Store a bill. | ||||
|      * | ||||
|      * @param BillStoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(BillStoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $bill    = $this->repository->store($request->getAll()); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show all transactions. | ||||
|      * | ||||
| @@ -236,7 +142,7 @@ class BillController extends Controller | ||||
|      */ | ||||
|     public function transactions(Request $request, Bill $bill): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
| @@ -282,27 +188,4 @@ class BillController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update a bill. | ||||
|      * | ||||
|      * @param BillUpdateRequest $request | ||||
|      * @param Bill        $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(BillUpdateRequest $request, Bill $bill): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $bill    = $this->repository->update($bill, $data); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| 
 | ||||
|     } | ||||
| } | ||||
							
								
								
									
										107
									
								
								app/Api/V1/Controllers/Models/Bill/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								app/Api/V1/Controllers/Models/Bill/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\Bill; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private BillRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $this->repository->correctOrder(); | ||||
|         $bills     = $this->repository->getBills(); | ||||
|         $manager   = $this->getManager(); | ||||
|         $pageSize  = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $count     = $bills->count(); | ||||
|         $bills     = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||
|  | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($bills, $transformer, 'bills'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the specified bill. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										85
									
								
								app/Api/V1/Controllers/Models/Bill/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								app/Api/V1/Controllers/Models/Bill/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\Bill; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Bill\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
|  | ||||
|     private BillRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a bill. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $bill    = $this->repository->store($data); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										84
									
								
								app/Api/V1/Controllers/Models/Bill/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								app/Api/V1/Controllers/Models/Bill/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\Bill; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Bill\UpdateRequest; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private BillRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update a bill. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Bill          $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Bill $bill): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $bill    = $this->repository->update($bill, $data); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										70
									
								
								app/Api/V1/Controllers/Models/Budget/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								app/Api/V1/Controllers/Models/Budget/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\Budget; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private BudgetRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * DestroyController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($budget); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BudgetController.php | ||||
|  * Copyright (c) 2019 james@firefly-iii.org | ||||
| /* | ||||
|  * ListController.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
| @@ -21,11 +21,9 @@ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Budget; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\BudgetStoreRequest; | ||||
| use FireflyIII\Api\V1\Requests\BudgetUpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| @@ -33,7 +31,6 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -41,24 +38,19 @@ use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| /** | ||||
|  * Class BudgetController. | ||||
| /*** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class BudgetController extends Controller | ||||
| class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
| 
 | ||||
|     /** @var BudgetLimitRepositoryInterface */ | ||||
|     private $blRepository; | ||||
| 
 | ||||
|     /** @var BudgetRepositoryInterface The budget repository */ | ||||
|     private $repository; | ||||
| 
 | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|     private BudgetRepositoryInterface      $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * BudgetController constructor. | ||||
|      * ListController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
| @@ -67,49 +59,16 @@ class BudgetController extends Controller | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $admin */ | ||||
|                 $admin = auth()->user(); | ||||
| 
 | ||||
|                 $this->repository   = app(BudgetRepositoryInterface::class); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->repository->setUser($admin); | ||||
|                 $this->blRepository->setUser($admin); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|                 $this->blRepository->setUser(auth()->user()); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function budgetLimits(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager  = $this->getManager(); | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $this->parameters->set('budget_id', $budget->id); | ||||
|         $collection   = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.budget_limits', [$budget->id]) . $this->buildParams()); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
| 
 | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param Budget $budget | ||||
|      * | ||||
| @@ -119,7 +78,7 @@ class BudgetController extends Controller | ||||
|     public function attachments(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($budget); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
| @@ -139,93 +98,30 @@ class BudgetController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function delete(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($budget); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getBudgets(); | ||||
|         $count      = $collection->count(); | ||||
|         $budgets    = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.index') . $this->buildParams()); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($budgets, $transformer, 'budgets'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show a budget. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Budget $budget): JsonResponse | ||||
|     public function budgetLimits(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager  = $this->getManager(); | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $this->parameters->set('budget_id', $budget->id); | ||||
|         $collection   = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.budget_limits', [$budget->id]) . $this->buildParams()); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Store a budget. | ||||
|      * | ||||
|      * @param BudgetStoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      */ | ||||
|     public function store(BudgetStoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $budget  = $this->repository->store($request->getAll()); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| @@ -242,7 +138,7 @@ class BudgetController extends Controller | ||||
|      */ | ||||
|     public function transactions(Request $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // user can overrule page size with limit parameter.
 | ||||
|         $limit = $this->parameters->get('limit'); | ||||
| @@ -286,36 +182,10 @@ class BudgetController extends Controller | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
| 
 | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update a budget. | ||||
|      * | ||||
|      * @param BudgetUpdateRequest $request | ||||
|      * @param Budget              $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(BudgetUpdateRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $budget  = $this->repository->update($budget, $data); | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										118
									
								
								app/Api/V1/Controllers/Models/Budget/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								app/Api/V1/Controllers/Models/Budget/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\Budget; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|     private BudgetRepositoryInterface      $repository; | ||||
|  | ||||
|     /** | ||||
|      * ListController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository   = app(BudgetRepositoryInterface::class); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|                 $this->blRepository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getBudgets(); | ||||
|         $count      = $collection->count(); | ||||
|         $budgets    = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($budgets, $transformer, 'budgets'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show a budget. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										82
									
								
								app/Api/V1/Controllers/Models/Budget/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								app/Api/V1/Controllers/Models/Budget/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\Budget; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Budget\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private BudgetRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * StoreController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a budget. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $budget = $this->repository->store($request->getAll()); | ||||
|         $budget->refresh(); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										82
									
								
								app/Api/V1/Controllers/Models/Budget/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								app/Api/V1/Controllers/Models/Budget/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\Budget; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Budget\UpdateRequest; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private BudgetRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * UpdateController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update a budget. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Budget        $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $budget  = $this->repository->update($budget, $data); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,79 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\BudgetLimit; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|  | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->blRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Budget      $budget | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         if ($budget->id !== $budgetLimit->budget_id) { | ||||
|             throw new FireflyException('20028: The budget limit does not belong to the budget.'); | ||||
|         } | ||||
|         $this->blRepository->destroyBudgetLimit($budgetLimit); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										121
									
								
								app/Api/V1/Controllers/Models/BudgetLimit/ListController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								app/Api/V1/Controllers/Models/BudgetLimit/ListController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ListController.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\Controllers\Models\BudgetLimit; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
|  | ||||
| /** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
|  | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|  | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->blRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @param Request     $request | ||||
|      * @param Budget      $budget | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function transactions(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
|  | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|  | ||||
|         // use new group collector: | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on budget. | ||||
|             ->setBudget($budget) | ||||
|             // all info needed for the API: | ||||
|             ->withAPIInformation() | ||||
|             // set page size: | ||||
|             ->setLimit($pageSize) | ||||
|             // set page to retrieve | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return. | ||||
|             ->setTypes($types); | ||||
|  | ||||
|         $collector->setRange($budgetLimit->start_date, $budgetLimit->end_date); | ||||
|         $collector->setTypes($types); | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budgets.limits.transactions', [$budget->id, $budgetLimit->id]) . $this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
|  | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										154
									
								
								app/Api/V1/Controllers/Models/BudgetLimit/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								app/Api/V1/Controllers/Models/BudgetLimit/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\BudgetLimit; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|     private BudgetRepositoryInterface      $repository; | ||||
|  | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->repository   = app(BudgetRepositoryInterface::class); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->blRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the budget limits for this budget.. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(Request $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager->parseIncludes('budget'); | ||||
|         $pageSize     = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection   = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]) . $this->buildParams()); | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the budget limits for this budget.. | ||||
|      * | ||||
|      * @param DateRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function indexAll(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager->parseIncludes('budget'); | ||||
|         $pageSize     = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection   = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budget-limits.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Request     $request | ||||
|      * @param Budget      $budget | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         if ((int)$budget->id !== (int)$budgetLimit->budget_id) { | ||||
|             throw new FireflyException('20028: The budget limit does not belong to the budget.'); | ||||
|         } | ||||
|         // continue! | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,89 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\BudgetLimit; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|  | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->blRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      */ | ||||
|     public function store(StoreRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data               = $request->getAll(); | ||||
|         $data['start_date'] = $data['start']; | ||||
|         $data['end_date']   = $data['end']; | ||||
|         $data['budget_id']  = $budget->id; | ||||
|  | ||||
|         $budgetLimit = $this->blRepository->store($data); | ||||
|         $manager     = $this->getManager(); | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,93 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\BudgetLimit; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\BudgetLimit\UpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
|  | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->blRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Budget        $budget | ||||
|      * @param BudgetLimit   $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|  | ||||
|         if ((int)$budget->id !== (int)$budgetLimit->budget_id) { | ||||
|             throw new FireflyException('20028: The budget limit does not belong to the budget.'); | ||||
|         } | ||||
|         $data              = $request->getAll(); | ||||
|         $data['budget_id'] = $budget->id; | ||||
|         $budgetLimit       = $this->blRepository->update($budgetLimit, $data); | ||||
|         $manager           = $this->getManager(); | ||||
|  | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										71
									
								
								app/Api/V1/Controllers/Models/Category/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								app/Api/V1/Controllers/Models/Category/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\Category; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private CategoryRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(Category $category): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($category); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CategoryController.php | ||||
|  * Copyright (c) 2019 james@firefly-iii.org | ||||
| /* | ||||
|  * ListController.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
| @@ -21,17 +21,14 @@ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Category; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\CategoryStoreRequest; | ||||
| use FireflyIII\Api\V1\Requests\CategoryUpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -39,16 +36,15 @@ use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| /** | ||||
|  * Class CategoryController. | ||||
|  * Class ListController | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
|     private CategoryRepositoryInterface $repository; | ||||
| 
 | ||||
|     private CategoryRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
| @@ -60,12 +56,8 @@ class CategoryController extends Controller | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $admin */ | ||||
|                 $admin = auth()->user(); | ||||
| 
 | ||||
|                 /** @var CategoryRepositoryInterface repository */ | ||||
|                 $this->repository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->repository->setUser($admin); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
| @@ -81,7 +73,7 @@ class CategoryController extends Controller | ||||
|     public function attachments(Category $category): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($category); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
| @@ -101,98 +93,6 @@ class CategoryController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function delete(Category $category): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($category); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getCategories(); | ||||
|         $count      = $collection->count(); | ||||
|         $categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.index') . $this->buildParams()); | ||||
| 
 | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
| 
 | ||||
|         $resource = new FractalCollection($categories, $transformer, 'categories'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Show the category. | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Category $category): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Store new category. | ||||
|      * | ||||
|      * @param CategoryStoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(CategoryStoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $category = $this->repository->store($request->getAll()); | ||||
|         $manager  = $this->getManager(); | ||||
| 
 | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show all transactions. | ||||
|      * | ||||
| @@ -205,7 +105,7 @@ class CategoryController extends Controller | ||||
|      */ | ||||
|     public function transactions(Request $request, Category $category): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
| @@ -249,28 +149,4 @@ class CategoryController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update the category. | ||||
|      * | ||||
|      * @param CategoryUpdateRequest $request | ||||
|      * @param Category        $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(CategoryUpdateRequest $request, Category $category): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getAll(); | ||||
|         $category = $this->repository->update($category, $data); | ||||
|         $manager  = $this->getManager(); | ||||
| 
 | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										113
									
								
								app/Api/V1/Controllers/Models/Category/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								app/Api/V1/Controllers/Models/Category/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\Category; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private CategoryRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getCategories(); | ||||
|         $count      = $collection->count(); | ||||
|         $categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new FractalCollection($categories, $transformer, 'categories'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the category. | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Category $category): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										82
									
								
								app/Api/V1/Controllers/Models/Category/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								app/Api/V1/Controllers/Models/Category/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\Category; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Category\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private CategoryRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new category. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $category = $this->repository->store($request->getAll()); | ||||
|         $manager  = $this->getManager(); | ||||
|  | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										83
									
								
								app/Api/V1/Controllers/Models/Category/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								app/Api/V1/Controllers/Models/Category/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\Category; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Category\UpdateRequest; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private CategoryRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the category. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Category      $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Category $category): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getAll(); | ||||
|         $category = $this->repository->update($category, $data); | ||||
|         $manager  = $this->getManager(); | ||||
|  | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,73 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\ObjectGroup; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private ObjectGroupRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * ObjectGroupController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(ObjectGroupRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param ObjectGroup $objectGroup | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($objectGroup); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										131
									
								
								app/Api/V1/Controllers/Models/ObjectGroup/ListController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								app/Api/V1/Controllers/Models/ObjectGroup/ListController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ListController.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\Controllers\Models\ObjectGroup; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
|  | ||||
| /** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class ListController extends Controller | ||||
| { | ||||
|     private ObjectGroupRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * ObjectGroupController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(ObjectGroupRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all bills | ||||
|      * | ||||
|      * @param ObjectGroup $objectGroup | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function bills(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         // get list of piggy banks. Count it and split it. | ||||
|         $collection = $this->repository->getBills($objectGroup); | ||||
|         $count      = $collection->count(); | ||||
|         $bills      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]) . $this->buildParams()); | ||||
|  | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($bills, $transformer, 'bills'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all piggies under the object group. | ||||
|      * | ||||
|      * @param ObjectGroup $objectGroup | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function piggyBanks(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of piggy banks. Count it and split it. | ||||
|         $collection = $this->repository->getPiggyBanks($objectGroup); | ||||
|         $count      = $collection->count(); | ||||
|         $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.object-groups.piggy_banks', [$objectGroup->id]) . $this->buildParams()); | ||||
|  | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /** | ||||
|  * GroupController.php | ||||
|  * Copyright (c) 2019 james@firefly-iii.org | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
| @@ -21,14 +21,12 @@ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\ObjectGroupUpdateRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\ObjectGroupTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| @@ -38,13 +36,12 @@ use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| /** | ||||
|  * Class GroupController. | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ObjectGroupController extends Controller | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private ObjectGroupRepositoryInterface $repository; | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * ObjectGroupController constructor. | ||||
|      * | ||||
| @@ -65,21 +62,6 @@ class ObjectGroupController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param ObjectGroup $objectGroup | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($objectGroup); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
| @@ -93,9 +75,9 @@ class ObjectGroupController extends Controller | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $this->repository->resetOrder(); | ||||
|         $collection   = $this->repository->get(); | ||||
|         $count        = $collection->count(); | ||||
|         $objectGroups = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| @@ -114,43 +96,6 @@ class ObjectGroupController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * List all piggies under the object group. | ||||
|      * | ||||
|      * @param ObjectGroup $objectGroup | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function piggyBanks(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         // create some objects:
 | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
| 
 | ||||
|         // get list of piggy banks. Count it and split it.
 | ||||
|         $collection = $this->repository->getPiggyBanks($objectGroup); | ||||
|         $count      = $collection->count(); | ||||
|         $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.object-groups.piggy_banks', [$objectGroup->id]) . $this->buildParams()); | ||||
| 
 | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show single instance. | ||||
|      * | ||||
| @@ -161,29 +106,8 @@ class ObjectGroupController extends Controller | ||||
|     public function show(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
| 
 | ||||
|         /** @var ObjectGroupTransformer $transformer */ | ||||
|         $transformer = app(ObjectGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($objectGroup, $transformer, 'object_groups'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update object. | ||||
|      * | ||||
|      * @param ObjectGroupUpdateRequest $request | ||||
|      * @param Account                  $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(ObjectGroupUpdateRequest $request, ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         $data = $request->getUpdateData(); | ||||
|         $this->repository->update($objectGroup, $data); | ||||
|         $this->repository->sort(); | ||||
|         $manager = $this->getManager(); | ||||
|         $this->repository->resetOrder(); | ||||
|         $objectGroup->refresh(); | ||||
| 
 | ||||
|         /** @var ObjectGroupTransformer $transformer */ | ||||
|         $transformer = app(ObjectGroupTransformer::class); | ||||
| @@ -0,0 +1,82 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\ObjectGroup; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\ObjectGroup\UpdateRequest; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\ObjectGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private ObjectGroupRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * ObjectGroupController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(ObjectGroupRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param UpdateRequest $request | ||||
|      * @param ObjectGroup   $objectGroup | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         $data = $request->getUpdateData(); | ||||
|         $this->repository->update($objectGroup, $data); | ||||
|         $this->repository->resetOrder(); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var ObjectGroupTransformer $transformer */ | ||||
|         $transformer = app(ObjectGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($objectGroup, $transformer, 'object_groups'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,70 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\PiggyBank; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private PiggyBankRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * Constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(PiggyBankRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param PiggyBank $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($piggyBank); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										122
									
								
								app/Api/V1/Controllers/Models/PiggyBank/ListController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								app/Api/V1/Controllers/Models/PiggyBank/ListController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ListController.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\Controllers\Models\PiggyBank; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankEventTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
|  | ||||
| /** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class ListController extends Controller | ||||
| { | ||||
|     private PiggyBankRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * Constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(PiggyBankRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param PiggyBank $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function attachments(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($piggyBank); | ||||
|  | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.piggy_banks.attachments', [$piggyBank->id]) . $this->buildParams()); | ||||
|  | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param PiggyBank $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function piggyBankEvents(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $manager  = $this->getManager(); | ||||
|  | ||||
|         $collection = $this->repository->getEvents($piggyBank); | ||||
|         $count      = $collection->count(); | ||||
|         $events     = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.piggy_banks.events', [$piggyBank->id]) . $this->buildParams()); | ||||
|  | ||||
|         /** @var PiggyBankEventTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankEventTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($events, $transformer, 'piggy_bank_events'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										114
									
								
								app/Api/V1/Controllers/Models/PiggyBank/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								app/Api/V1/Controllers/Models/PiggyBank/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\PiggyBank; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private PiggyBankRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * Constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(PiggyBankRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getPiggyBanks(); | ||||
|         $count      = $collection->count(); | ||||
|         $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.piggy_banks.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param PiggyBank $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($piggyBank, $transformer, 'piggy_banks'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										80
									
								
								app/Api/V1/Controllers/Models/PiggyBank/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								app/Api/V1/Controllers/Models/PiggyBank/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\PiggyBank; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\PiggyBank\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private PiggyBankRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * Constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(PiggyBankRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $piggyBank = $this->repository->store($request->getAll()); | ||||
|         $manager   = $this->getManager(); | ||||
|  | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($piggyBank, $transformer, 'piggy_banks'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										86
									
								
								app/Api/V1/Controllers/Models/PiggyBank/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								app/Api/V1/Controllers/Models/PiggyBank/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\PiggyBank; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\PiggyBank\UpdateRequest; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private PiggyBankRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * Constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(PiggyBankRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update piggy bank. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param PiggyBank     $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $data      = $request->getAll(); | ||||
|         $piggyBank = $this->repository->update($piggyBank, $data); | ||||
|  | ||||
|         if (array_key_exists('current_amount', $data) && '' !== $data['current_amount']) { | ||||
|             $this->repository->setCurrentAmount($piggyBank, $data['current_amount']); | ||||
|         } | ||||
|  | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($piggyBank, $transformer, 'piggy_banks'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,71 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\Recurrence; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private RecurringRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RecurrenceController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RecurringRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param Recurrence $recurrence | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($recurrence); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										120
									
								
								app/Api/V1/Controllers/Models/Recurrence/ListController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								app/Api/V1/Controllers/Models/Recurrence/ListController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ListController.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\Controllers\Models\Recurrence; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
|  | ||||
| /** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
|  | ||||
|     private RecurringRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RecurrenceController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RecurringRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show transactions for this recurrence. | ||||
|      * | ||||
|      * @param Request    $request | ||||
|      * @param Recurrence $recurrence | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function transactions(Request $request, Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
|  | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|         // whatever is returned by the query, it must be part of these journals: | ||||
|         $journalIds = $this->repository->getJournalIds($recurrence); | ||||
|  | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|  | ||||
|         // use new group collector: | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on journal IDs. | ||||
|             ->setJournalIds($journalIds) | ||||
|             // all info needed for the API: | ||||
|             ->withAPIInformation() | ||||
|             // set page size: | ||||
|             ->setLimit($pageSize) | ||||
|             // set page to retrieve | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return. | ||||
|             ->setTypes($types); | ||||
|  | ||||
|         if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) { | ||||
|             $collector->setRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         } | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.transactions.index') . $this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
|  | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										115
									
								
								app/Api/V1/Controllers/Models/Recurrence/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								app/Api/V1/Controllers/Models/Recurrence/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\Recurrence; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Transformers\RecurrenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private RecurringRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RecurrenceController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RecurringRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getAll(); | ||||
|         $count      = $collection->count(); | ||||
|         $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.recurrences.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($piggyBanks, $transformer, 'recurrences'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Recurrence $recurrence | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($recurrence, $transformer, 'recurrences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										82
									
								
								app/Api/V1/Controllers/Models/Recurrence/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								app/Api/V1/Controllers/Models/Recurrence/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\Recurrence; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Recurrence\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Transformers\RecurrenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private RecurringRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RecurrenceController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RecurringRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getAll(); | ||||
|         $recurrence = $this->repository->store($data); | ||||
|         $manager    = $this->getManager(); | ||||
|  | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($recurrence, $transformer, 'recurrences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,83 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\Recurrence; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Recurrence\UpdateRequest; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Transformers\RecurrenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private RecurringRepositoryInterface $repository; | ||||
|  | ||||
|     /** | ||||
|      * RecurrenceController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(RecurringRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update single recurrence. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Recurrence    $recurrence | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getAll(); | ||||
|         $recurrence = $this->repository->update($recurrence, $data); | ||||
|         $manager    = $this->getManager(); | ||||
|  | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($recurrence, $transformer, 'recurrences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										74
									
								
								app/Api/V1/Controllers/Models/Rule/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								app/Api/V1/Controllers/Models/Rule/DestroyController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\Rule; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private RuleRepositoryInterface $ruleRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleRepository = app(RuleRepositoryInterface::class); | ||||
|                 $this->ruleRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param Rule $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(Rule $rule): JsonResponse | ||||
|     { | ||||
|         $this->ruleRepository->destroy($rule); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										62
									
								
								app/Api/V1/Controllers/Models/Rule/ListController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								app/Api/V1/Controllers/Models/Rule/ListController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ListController.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\Controllers\Models\Rule; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
|  | ||||
| /** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class ListController extends Controller | ||||
| { | ||||
|     private AccountRepositoryInterface $accountRepository; | ||||
|     private RuleRepositoryInterface    $ruleRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleRepository = app(RuleRepositoryInterface::class); | ||||
|                 $this->ruleRepository->setUser($user); | ||||
|  | ||||
|                 $this->accountRepository = app(AccountRepositoryInterface::class); | ||||
|                 $this->accountRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										118
									
								
								app/Api/V1/Controllers/Models/Rule/ShowController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								app/Api/V1/Controllers/Models/Rule/ShowController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ShowController.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\Controllers\Models\Rule; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private RuleRepositoryInterface $ruleRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleRepository = app(RuleRepositoryInterface::class); | ||||
|                 $this->ruleRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->ruleRepository->getAll(); | ||||
|         $count      = $collection->count(); | ||||
|         $rules      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.rules.index') . $this->buildParams()); | ||||
|  | ||||
|         /** @var RuleTransformer $transformer */ | ||||
|         $transformer = app(RuleTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($rules, $transformer, 'rules'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Rule $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function show(Rule $rule): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var RuleTransformer $transformer */ | ||||
|         $transformer = app(RuleTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($rule, $transformer, 'rules'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										81
									
								
								app/Api/V1/Controllers/Models/Rule/StoreController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								app/Api/V1/Controllers/Models/Rule/StoreController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| <?php | ||||
| /* | ||||
|  * StoreController.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\Controllers\Models\Rule; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Rule\StoreRequest; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private RuleRepositoryInterface $ruleRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleRepository = app(RuleRepositoryInterface::class); | ||||
|                 $this->ruleRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $rule    = $this->ruleRepository->store($request->getAll()); | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var RuleTransformer $transformer */ | ||||
|         $transformer = app(RuleTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($rule, $transformer, 'rules'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										151
									
								
								app/Api/V1/Controllers/Models/Rule/TriggerController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								app/Api/V1/Controllers/Models/Rule/TriggerController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | ||||
| <?php | ||||
| /* | ||||
|  * TriggerController.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\Controllers\Models\Rule; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Rule\TestRequest; | ||||
| use FireflyIII\Api\V1\Requests\Models\Rule\TriggerRequest; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\TransactionRules\Engine\RuleEngineInterface; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
|  | ||||
| /** | ||||
|  * Class TriggerController | ||||
|  */ | ||||
| class TriggerController extends Controller | ||||
| { | ||||
|     private RuleRepositoryInterface $ruleRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleRepository = app(RuleRepositoryInterface::class); | ||||
|                 $this->ruleRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param TestRequest $request | ||||
|      * @param Rule        $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function testRule(TestRequest $request, Rule $rule): JsonResponse | ||||
|     { | ||||
|         $parameters = $request->getTestParameters(); | ||||
|  | ||||
|         /** @var RuleEngineInterface $ruleEngine */ | ||||
|         $ruleEngine = app(RuleEngineInterface::class); | ||||
|         $ruleEngine->setRules(new Collection([$rule])); | ||||
|  | ||||
|         // overrule the rule(s) if necessary. | ||||
|         if (array_key_exists('start', $parameters) && null !== $parameters['start']) { | ||||
|             // add a range: | ||||
|             $ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]); | ||||
|         } | ||||
|  | ||||
|         if (array_key_exists('end', $parameters) && null !== $parameters['end']) { | ||||
|             // add a range: | ||||
|             $ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]); | ||||
|         } | ||||
|         if (array_key_exists('accounts', $parameters) && '' !== $parameters['accounts']) { | ||||
|             $ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]); | ||||
|         } | ||||
|  | ||||
|         // file the rule(s) | ||||
|         $transactions = $ruleEngine->find(); | ||||
|         $count        = $transactions->count(); | ||||
|  | ||||
|         $paginator = new LengthAwarePaginator($transactions, $count, 31337, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.rules.test', [$rule->id]) . $this->buildParams()); | ||||
|  | ||||
|         // resulting list is presented as JSON thing. | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Execute the given rule group on a set of existing transactions. | ||||
|      * | ||||
|      * @param TriggerRequest $request | ||||
|      * @param Rule           $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function triggerRule(TriggerRequest $request, Rule $rule): JsonResponse | ||||
|     { | ||||
|         // Get parameters specified by the user | ||||
|         $parameters = $request->getTriggerParameters(); | ||||
|  | ||||
|         /** @var RuleEngineInterface $ruleEngine */ | ||||
|         $ruleEngine = app(RuleEngineInterface::class); | ||||
|         $ruleEngine->setRules(new Collection([$rule])); | ||||
|  | ||||
|         // overrule the rule(s) if necessary. | ||||
|         if (array_key_exists('start', $parameters) && null !== $parameters['start']) { | ||||
|             // add a range: | ||||
|             $ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]); | ||||
|         } | ||||
|  | ||||
|         if (array_key_exists('end', $parameters) && null !== $parameters['end']) { | ||||
|             // add a range: | ||||
|             $ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]); | ||||
|         } | ||||
|         if (array_key_exists('accounts', $parameters) && '' !== $parameters['accounts']) { | ||||
|             $ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]); | ||||
|         } | ||||
|  | ||||
|         // file the rule(s) | ||||
|         $ruleEngine->fire(); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										85
									
								
								app/Api/V1/Controllers/Models/Rule/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								app/Api/V1/Controllers/Models/Rule/UpdateController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| <?php | ||||
| /* | ||||
|  * UpdateController.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\Controllers\Models\Rule; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Rule\UpdateRequest; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
|  | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private RuleRepositoryInterface $ruleRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleRepository = app(RuleRepositoryInterface::class); | ||||
|                 $this->ruleRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update a rule. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Rule          $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Rule $rule): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $rule    = $this->ruleRepository->update($rule, $data); | ||||
|         $manager = $this->getManager(); | ||||
|  | ||||
|         /** @var RuleTransformer $transformer */ | ||||
|         $transformer = app(RuleTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new Item($rule, $transformer, 'rules'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,74 @@ | ||||
| <?php | ||||
| /* | ||||
|  * DestroyController.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\Controllers\Models\RuleGroup; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
|  | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private RuleGroupRepositoryInterface $ruleGroupRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleGroupController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleGroupRepository = app(RuleGroupRepositoryInterface::class); | ||||
|                 $this->ruleGroupRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param RuleGroup $ruleGroup | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function destroy(RuleGroup $ruleGroup): JsonResponse | ||||
|     { | ||||
|         $this->ruleGroupRepository->destroy($ruleGroup, null); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										95
									
								
								app/Api/V1/Controllers/Models/RuleGroup/ListController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								app/Api/V1/Controllers/Models/RuleGroup/ListController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| <?php | ||||
| /* | ||||
|  * ListController.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\Controllers\Models\RuleGroup; | ||||
|  | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
|  | ||||
| /** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class ListController extends Controller | ||||
| { | ||||
|     private RuleGroupRepositoryInterface $ruleGroupRepository; | ||||
|  | ||||
|     /** | ||||
|      * RuleGroupController constructor. | ||||
|      * | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleGroupRepository = app(RuleGroupRepositoryInterface::class); | ||||
|                 $this->ruleGroupRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param RuleGroup $group | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function rules(RuleGroup $group): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->ruleGroupRepository->getRules($group); | ||||
|         $count      = $collection->count(); | ||||
|         $rules      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.rule_groups.rules', [$group->id]) . $this->buildParams()); | ||||
|  | ||||
|         /** @var RuleTransformer $transformer */ | ||||
|         $transformer = app(RuleTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|  | ||||
|         $resource = new FractalCollection($rules, $transformer, 'rules'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|  | ||||
|     } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user