mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 10:47:00 +00:00 
			
		
		
		
	Compare commits
	
		
			100 Commits
		
	
	
		
			develop-20
			...
			develop-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | e1e18a2a0c | ||
|  | 2c41694f41 | ||
|  | 48a641286c | ||
|  | 5eec91f439 | ||
|  | 782f0c7d54 | ||
|  | a4dff6d39f | ||
|  | 9312ddbb7b | ||
|  | 14a9bede11 | ||
|  | 58d798df86 | ||
|  | e740fc57a6 | ||
|  | ecd7750030 | ||
|  | 19c4a82194 | ||
|  | ffc91d5ead | ||
|  | 4898c29b85 | ||
|  | 84b4ab0cc2 | ||
|  | eb808a0fbc | ||
|  | d25ae50d30 | ||
|  | c43821e29c | ||
|  | b7570b2651 | ||
|  | cb77609f27 | ||
|  | 99651bb61e | ||
|  | bf1e14f66d | ||
|  | d0e55804f8 | ||
|  | 0a9715b8c1 | ||
|  | 61390e67f6 | ||
|  | 536d25980f | ||
|  | 3253b2e569 | ||
|  | 11ac955303 | ||
|  | caf9a31bc4 | ||
|  | 8c84ab5855 | ||
|  | 91a56a7396 | ||
|  | f5806ea6de | ||
|  | 60b3692ac9 | ||
|  | 0bdb4f2e69 | ||
|  | f89f50c2db | ||
|  | 394df46961 | ||
|  | 535e5e4f50 | ||
|  | 00ba2a46d2 | ||
|  | a3ff26e3e4 | ||
|  | 3388cb6f66 | ||
|  | 1c3c9377ca | ||
|  | 54aeb4b4ef | ||
|  | 9eb3ad62dd | ||
|  | 4f0e978687 | ||
|  | e1cf9f7a79 | ||
|  | 7ce055a22c | ||
|  | 7bd915930c | ||
|  | 75aa2d99fd | ||
|  | f52bc0e242 | ||
|  | 55cf924794 | ||
|  | df3e4a6554 | ||
|  | 7c4ada458e | ||
|  | 2a4a98dd10 | ||
|  | a3bf845851 | ||
|  | 78e832cdba | ||
|  | d47e4c4f24 | ||
|  | 056329291f | ||
|  | 977946064d | ||
|  | 1870345ddf | ||
|  | 6980717075 | ||
|  | 1fe0aebacb | ||
|  | cbf7aef0c1 | ||
|  | 8c3e6c0189 | ||
|  | cf7ee79c1c | ||
|  | 7e344e4332 | ||
|  | 0a55e9fb4e | ||
|  | ed2e0e86dc | ||
|  | 9d1fb2cd6a | ||
|  | 57617b750f | ||
|  | f6411fdc5a | ||
|  | 02e24fc919 | ||
|  | dbc0210304 | ||
|  | a709e224d4 | ||
|  | 83f3eddf44 | ||
|  | 7cfc4c2671 | ||
|  | 1c6055cb2d | ||
|  | 4f4576e458 | ||
|  | 84d3bcbb37 | ||
|  | c91c87d646 | ||
|  | e09b6034f7 | ||
|  | ad67bb80f3 | ||
|  | a88d0de34d | ||
|  | ecf498cc81 | ||
|  | 569f553d26 | ||
|  | 7d45bc46b8 | ||
|  | 08553fcfb2 | ||
|  | 58c76bee94 | ||
|  | 3fa1b6dd27 | ||
|  | 63aa8adab7 | ||
|  | 70b8ea0acb | ||
|  | d800a01e33 | ||
|  | 52f3ec7d3d | ||
|  | d4978a09ee | ||
|  | 77095276e2 | ||
|  | b77a8591dc | ||
|  | 132d7d9ff8 | ||
|  | a981e2c5cb | ||
|  | 77b88b7758 | ||
|  | b9894eea57 | ||
|  | 469319a240 | 
							
								
								
									
										37
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										37
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							| @@ -402,16 +402,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "friendsofphp/php-cs-fixer", | ||||
|             "version": "v3.88.2", | ||||
|             "version": "v3.89.1", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", | ||||
|                 "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99" | ||||
|                 "reference": "f34967da2866ace090a2b447de1f357356474573" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a8d15584bafb0f0d9d938827840060fd4a3ebc99", | ||||
|                 "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99", | ||||
|                 "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/f34967da2866ace090a2b447de1f357356474573", | ||||
|                 "reference": "f34967da2866ace090a2b447de1f357356474573", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -426,7 +426,6 @@ | ||||
|                 "php": "^7.4 || ^8.0", | ||||
|                 "react/child-process": "^0.6.6", | ||||
|                 "react/event-loop": "^1.5", | ||||
|                 "react/promise": "^3.3", | ||||
|                 "react/socket": "^1.16", | ||||
|                 "react/stream": "^1.4", | ||||
|                 "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", | ||||
| @@ -494,7 +493,7 @@ | ||||
|             ], | ||||
|             "support": { | ||||
|                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", | ||||
|                 "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.88.2" | ||||
|                 "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.89.1" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -502,7 +501,7 @@ | ||||
|                     "type": "github" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-09-27T00:24:15+00:00" | ||||
|             "time": "2025-10-24T12:05:10+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "psr/container", | ||||
| @@ -1252,16 +1251,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/console", | ||||
|             "version": "v7.3.4", | ||||
|             "version": "v7.3.5", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/console.git", | ||||
|                 "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" | ||||
|                 "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", | ||||
|                 "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", | ||||
|                 "url": "https://api.github.com/repos/symfony/console/zipball/cdb80fa5869653c83cfe1a9084a673b6daf57ea7", | ||||
|                 "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -1326,7 +1325,7 @@ | ||||
|                 "terminal" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/console/tree/v7.3.4" | ||||
|                 "source": "https://github.com/symfony/console/tree/v7.3.5" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -1346,7 +1345,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-09-22T15:31:00+00:00" | ||||
|             "time": "2025-10-14T15:46:26+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/deprecation-contracts", | ||||
| @@ -1647,16 +1646,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/finder", | ||||
|             "version": "v7.3.2", | ||||
|             "version": "v7.3.5", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/finder.git", | ||||
|                 "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" | ||||
|                 "reference": "9f696d2f1e340484b4683f7853b273abff94421f" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", | ||||
|                 "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", | ||||
|                 "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f", | ||||
|                 "reference": "9f696d2f1e340484b4683f7853b273abff94421f", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -1691,7 +1690,7 @@ | ||||
|             "description": "Finds files and directories via an intuitive fluent interface", | ||||
|             "homepage": "https://symfony.com", | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/finder/tree/v7.3.2" | ||||
|                 "source": "https://github.com/symfony/finder/tree/v7.3.5" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -1711,7 +1710,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-07-15T13:41:35+00:00" | ||||
|             "time": "2025-10-15T18:45:57+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/options-resolver", | ||||
|   | ||||
| @@ -4,6 +4,7 @@ Over time, many people have contributed to Firefly III. Their efforts are not al | ||||
| Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution. | ||||
| 
 | ||||
| ## 2025 | ||||
| - jreyesr | ||||
| - codearena-bot | ||||
| - Nicky De Maeyer | ||||
| - Denis Iskandarov | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| @@ -79,20 +79,26 @@ class AccountController extends Controller | ||||
|      * @throws FireflyException | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function accounts(AutocompleteRequest $request): JsonResponse | ||||
|     public function accounts(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data        = $request->getData(); | ||||
|         $types       = $data['types']; | ||||
|         $query       = $data['query']; | ||||
|         $date        = $data['date']; | ||||
|         $return      = []; | ||||
|         $timer       = Timer::getInstance(); | ||||
|         $timer->start(sprintf('AC accounts "%s"', $query)); | ||||
|         $result      = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit')); | ||||
|         [ | ||||
|             'types' => $types, | ||||
|             'query' => $query, | ||||
|             'date'  => $date, | ||||
|             'limit' => $limit, | ||||
|         ] | ||||
|                      = $request->attributes->all(); | ||||
| 
 | ||||
| 
 | ||||
|         $date ??= today(config('app.timezone')); | ||||
| 
 | ||||
|         // set date to end-of-day for account balance. so it is at $date 23:59:59
 | ||||
|         $date->endOfDay(); | ||||
| 
 | ||||
|         $return      = []; | ||||
|         $timer       = Timer::getInstance(); | ||||
|         $timer->start(sprintf('AC accounts "%s"', $query)); | ||||
|         $result      = $this->repository->searchAccount((string)$query, $types, $limit); | ||||
|         $allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary); | ||||
| 
 | ||||
|         /** @var Account $account */ | ||||
| @@ -111,17 +117,17 @@ class AccountController extends Controller | ||||
|             } | ||||
| 
 | ||||
|             $return[]        = [ | ||||
|                 'id'                              => (string) $account->id, | ||||
|                 'id'                              => (string)$account->id, | ||||
|                 'name'                            => $account->name, | ||||
|                 'name_with_balance'               => $nameWithBalance, | ||||
|                 'active'                          => $account->active, | ||||
|                 'type'                            => $account->accountType->type, | ||||
|                 'currency_id'                     => (string) $useCurrency->id, | ||||
|                 'currency_id'                     => (string)$useCurrency->id, | ||||
|                 'currency_name'                   => $useCurrency->name, | ||||
|                 'currency_code'                   => $useCurrency->code, | ||||
|                 'currency_symbol'                 => $useCurrency->symbol, | ||||
|                 'currency_decimal_places'         => $useCurrency->decimal_places, | ||||
|                 'account_currency_id'             => (string) $currency->id, | ||||
|                 'account_currency_id'             => (string)$currency->id, | ||||
|                 'account_currency_name'           => $currency->name, | ||||
|                 'account_currency_code'           => $currency->code, | ||||
|                 'account_currency_symbol'         => $currency->symbol, | ||||
| @@ -134,8 +140,8 @@ class AccountController extends Controller | ||||
|             $return, | ||||
|             static function (array $left, array $right) { | ||||
|                 $order = [AccountTypeEnum::ASSET->value, AccountTypeEnum::REVENUE->value, AccountTypeEnum::EXPENSE->value]; | ||||
|                 $posA  = (int) array_search($left['type'], $order, true); | ||||
|                 $posB  = (int) array_search($right['type'], $order, true); | ||||
|                 $posA  = (int)array_search($left['type'], $order, true); | ||||
|                 $posB  = (int)array_search($right['type'], $order, true); | ||||
| 
 | ||||
|                 return $posA - $posB; | ||||
|             } | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| @@ -61,10 +61,9 @@ class BillController extends Controller | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBillsAC
 | ||||
|      */ | ||||
|     public function bills(AutocompleteRequest $request): JsonResponse | ||||
|     public function bills(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchBill($data['query'], $this->parameters->get('limit')); | ||||
|         $result   = $this->repository->searchBill($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $filtered = $result->map( | ||||
|             static fn (Bill $item) => [ | ||||
|                 'id'     => (string) $item->id, | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| @@ -61,10 +61,9 @@ class BudgetController extends Controller | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBudgetsAC
 | ||||
|      */ | ||||
|     public function budgets(AutocompleteRequest $request): JsonResponse | ||||
|     public function budgets(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchBudget($data['query'], $this->parameters->get('limit')); | ||||
|         $result   = $this->repository->searchBudget($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $filtered = $result->map( | ||||
|             static fn (Budget $item) => [ | ||||
|                 'id'     => (string) $item->id, | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| @@ -61,10 +61,9 @@ class CategoryController extends Controller | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCategoriesAC
 | ||||
|      */ | ||||
|     public function categories(AutocompleteRequest $request): JsonResponse | ||||
|     public function categories(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchCategory($data['query'], $this->parameters->get('limit')); | ||||
|         $result   = $this->repository->searchCategory($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $filtered = $result->map( | ||||
|             static fn (Category $item) => [ | ||||
|                 'id'   => (string) $item->id, | ||||
|   | ||||
| @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
| 
 | ||||
| use Deprecated; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| @@ -62,10 +63,9 @@ class CurrencyController extends Controller | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesAC
 | ||||
|      */ | ||||
|     public function currencies(AutocompleteRequest $request): JsonResponse | ||||
|     public function currencies(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getData(); | ||||
|         $collection = $this->repository->searchCurrency($data['query'], $this->parameters->get('limit')); | ||||
|         $collection = $this->repository->searchCurrency($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $result     = []; | ||||
| 
 | ||||
|         /** @var TransactionCurrency $currency */ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| @@ -61,11 +61,10 @@ class ObjectGroupController extends Controller | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getObjectGroupsAC
 | ||||
|      */ | ||||
|     public function objectGroups(AutocompleteRequest $request): JsonResponse | ||||
|     public function objectGroups(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getData(); | ||||
|         $return = []; | ||||
|         $result = $this->repository->search($data['query'], $this->parameters->get('limit')); | ||||
|         $result = $this->repository->search($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
| 
 | ||||
|         /** @var ObjectGroup $objectGroup */ | ||||
|         foreach ($result as $objectGroup) { | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| @@ -64,10 +64,9 @@ class PiggyBankController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function piggyBanks(AutocompleteRequest $request): JsonResponse | ||||
|     public function piggyBanks(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $piggies  = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit')); | ||||
|         $piggies  = $this->piggyRepository->searchPiggyBank($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $response = []; | ||||
| 
 | ||||
|         /** @var PiggyBank $piggy */ | ||||
| @@ -90,10 +89,9 @@ class PiggyBankController extends Controller | ||||
|         return response()->api($response); | ||||
|     } | ||||
| 
 | ||||
|     public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse | ||||
|     public function piggyBanksWithBalance(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $piggies  = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit')); | ||||
|         $piggies  = $this->piggyRepository->searchPiggyBank($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $response = []; | ||||
| 
 | ||||
|         /** @var PiggyBank $piggy */ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| @@ -57,10 +57,9 @@ class RecurrenceController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function recurring(AutocompleteRequest $request): JsonResponse | ||||
|     public function recurring(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data        = $request->getData(); | ||||
|         $recurrences = $this->repository->searchRecurrence($data['query'], $this->parameters->get('limit')); | ||||
|         $recurrences = $this->repository->searchRecurrence($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $response    = []; | ||||
| 
 | ||||
|         /** @var Recurrence $recurrence */ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| @@ -57,10 +57,9 @@ class RuleController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function rules(AutocompleteRequest $request): JsonResponse | ||||
|     public function rules(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $rules    = $this->repository->searchRule($data['query'], $this->parameters->get('limit')); | ||||
|         $rules    = $this->repository->searchRule($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $response = []; | ||||
| 
 | ||||
|         /** @var Rule $rule */ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| @@ -57,10 +57,9 @@ class RuleGroupController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function ruleGroups(AutocompleteRequest $request): JsonResponse | ||||
|     public function ruleGroups(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $groups   = $this->repository->searchRuleGroup($data['query'], $this->parameters->get('limit')); | ||||
|         $groups   = $this->repository->searchRuleGroup($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $response = []; | ||||
| 
 | ||||
|         /** @var RuleGroup $group */ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| @@ -57,10 +57,9 @@ class TagController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function tags(AutocompleteRequest $request): JsonResponse | ||||
|     public function tags(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getData(); | ||||
|         $result = $this->repository->searchTags($data['query'], $this->parameters->get('limit')); | ||||
|         $result = $this->repository->searchTags($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $array  = []; | ||||
| 
 | ||||
|         /** @var Tag $tag */ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| @@ -64,10 +64,9 @@ class TransactionController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function transactions(AutocompleteRequest $request): JsonResponse | ||||
|     public function transactions(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit')); | ||||
|         $result   = $this->repository->searchJournalDescriptions($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
| 
 | ||||
|         // limit and unique
 | ||||
|         $filtered = $result->unique('description'); | ||||
| @@ -86,13 +85,12 @@ class TransactionController extends Controller | ||||
|         return response()->api($array); | ||||
|     } | ||||
| 
 | ||||
|     public function transactionsWithID(AutocompleteRequest $request): JsonResponse | ||||
|     public function transactionsWithID(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getData(); | ||||
|         $result = new Collection(); | ||||
|         if (is_numeric($data['query'])) { | ||||
|         if (is_numeric($request->attributes->get('query'))) { | ||||
|             // search for group, not journal.
 | ||||
|             $firstResult = $this->groupRepository->find((int) $data['query']); | ||||
|             $firstResult = $this->groupRepository->find((int) $request->attributes->get('query')); | ||||
|             if ($firstResult instanceof TransactionGroup) { | ||||
|                 // group may contain multiple journals, each a result:
 | ||||
|                 foreach ($firstResult->transactionJournals as $journal) { | ||||
| @@ -100,8 +98,8 @@ class TransactionController extends Controller | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if (!is_numeric($data['query'])) { | ||||
|             $result = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit')); | ||||
|         if (!is_numeric($request->attributes->get('query'))) { | ||||
|             $result = $this->repository->searchJournalDescriptions($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         } | ||||
| 
 | ||||
|         // limit and unique
 | ||||
|   | ||||
| @@ -25,7 +25,7 @@ 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\Api\V1\Requests\Autocomplete\AutocompleteApiRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; | ||||
| @@ -55,10 +55,9 @@ class TransactionTypeController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function transactionTypes(AutocompleteRequest $request): JsonResponse | ||||
|     public function transactionTypes(AutocompleteApiRequest $request): JsonResponse | ||||
|     { | ||||
|         $data  = $request->getData(); | ||||
|         $types = $this->repository->searchTypes($data['query'], $this->parameters->get('limit')); | ||||
|         $types = $this->repository->searchTypes($request->attributes->get('query'), $request->attributes->get('limit')); | ||||
|         $array = []; | ||||
| 
 | ||||
|         /** @var TransactionType $type */ | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\SameDateRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRangeRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| @@ -83,15 +83,13 @@ class BudgetController extends Controller | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function overview(SameDateRequest $request): JsonResponse | ||||
|     public function overview(DateRangeRequest $request): JsonResponse | ||||
|     { | ||||
|         $params  = $request->getAll(); | ||||
| 
 | ||||
|         /** @var Carbon $start */ | ||||
|         $start   = $params['start']; | ||||
|         $start   = $request->attributes->get('start'); | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end     = $params['end']; | ||||
|         $end     = $request->attributes->get('end'); | ||||
| 
 | ||||
|         // code from FrontpageChartGenerator, but not in separate class
 | ||||
|         $budgets = $this->repository->getActiveBudgets(); | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\SameDateRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRangeRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| @@ -80,13 +80,13 @@ class CategoryController extends Controller | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
|      */ | ||||
|     public function overview(SameDateRequest $request): JsonResponse | ||||
|     public function overview(DateRangeRequest $request): JsonResponse | ||||
|     { | ||||
|         /** @var Carbon $start */ | ||||
|         $start      = $this->parameters->get('start'); | ||||
|         $start      = $request->attributes->get('start'); | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end        = $this->parameters->get('end'); | ||||
|         $end        = $request->attributes->get('end'); | ||||
|         $accounts   = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value]); | ||||
|         $currencies = []; | ||||
|         $return     = []; | ||||
|   | ||||
| @@ -29,6 +29,7 @@ use Carbon\Exceptions\InvalidFormatException; | ||||
| use FireflyIII\Exceptions\BadHttpHeaderException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Support\Facades\Amount; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\Facades\Steam; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Transformers\AbstractTransformer; | ||||
| @@ -67,6 +68,8 @@ abstract class Controller extends BaseController | ||||
| 
 | ||||
|     protected bool                $convertToPrimary = false; | ||||
|     protected TransactionCurrency $primaryCurrency; | ||||
| 
 | ||||
|     /** @deprecated use Request classes */ | ||||
|     protected ParameterBag        $parameters; | ||||
| 
 | ||||
|     /** | ||||
| @@ -98,7 +101,8 @@ abstract class Controller extends BaseController | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Method to grab all parameters from the URL. | ||||
|      * @deprecated use Request classes | ||||
|      * Method to grab all parameters from the URL | ||||
|      */ | ||||
|     private function getParameters(): ParameterBag | ||||
|     { | ||||
| @@ -156,7 +160,7 @@ abstract class Controller extends BaseController | ||||
|                 /** @var User $user */ | ||||
|                 $user     = auth()->user(); | ||||
| 
 | ||||
|                 $pageSize = (int)app('preferences')->getForUser($user, 'listPageSize', 50)->data; | ||||
|                 $pageSize = (int)Preferences::getForUser($user, 'listPageSize', 50)->data; | ||||
|                 $bag->set($integer, $pageSize); | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -46,6 +46,7 @@ use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use FireflyIII\Services\Internal\Destroy\AccountDestroyService; | ||||
| use FireflyIII\Services\Internal\Destroy\JournalDestroyService; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| @@ -102,7 +103,7 @@ class DestroyController extends Controller | ||||
|             default                  => throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)), | ||||
|         }; | ||||
| 
 | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ 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\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
| @@ -60,7 +61,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(Account $account): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($account, null); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -25,6 +25,7 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\PaginationRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| @@ -69,22 +70,25 @@ class ListController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function attachments(Account $account): JsonResponse | ||||
|     public function attachments(PaginationRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         [ | ||||
|             'limit'  => $limit, | ||||
|             'offset' => $offset, | ||||
|             'page'   => $page, | ||||
|         ]            = $request->attributes->all(); | ||||
|         $collection  = $this->repository->getAttachments($account); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $attachments = $collection->slice($offset, $limit); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator   = new LengthAwarePaginator($attachments, $count, $limit, $page); | ||||
|         $paginator->setPath(route('api.v1.accounts.attachments', [$account->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)); | ||||
| @@ -92,18 +96,21 @@ class ListController extends Controller | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     public function piggyBanks(Account $account): JsonResponse | ||||
|     public function piggyBanks(PaginationRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         // create some objects:
 | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         [ | ||||
|             'limit'  => $limit, | ||||
|             'offset' => $offset, | ||||
|             'page'   => $page, | ||||
|         ]            = $request->attributes->all(); | ||||
| 
 | ||||
|         // get list of piggy banks. Count it and split it.
 | ||||
|         $collection  = $this->repository->getPiggyBanks($account); | ||||
|         $count       = $collection->count(); | ||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $piggyBanks  = $collection->slice(($page - 1) * $limit, $limit); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
| @@ -113,12 +120,12 @@ class ListController extends Controller | ||||
|         $piggyBanks  = $enrichment->enrich($piggyBanks); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $limit, $page); | ||||
|         $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         // $transformer->setParameters($this->parameters);
 | ||||
| 
 | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|   | ||||
| @@ -71,45 +71,45 @@ class ShowController extends Controller | ||||
|     public function index(ShowRequest $request): JsonResponse | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
|         $params      = $request->getParameters(); | ||||
|         $this->parameters->set('type', $params['type']); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $types       = $this->mapAccountTypes($params['type']); | ||||
|         [ | ||||
|             'types'  => $types, | ||||
|             'page'   => $page, | ||||
|             'limit'  => $limit, | ||||
|             'offset' => $offset, | ||||
|             'sort'   => $sort, | ||||
|             'start'  => $start, | ||||
|             'end'    => $end, | ||||
|             'date'   => $date, | ||||
|         ] | ||||
|                      = $request->attributes->all(); | ||||
| 
 | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $collection  = $this->repository->getAccountsByType($types, $params['sort']); | ||||
|         $collection  = $this->repository->getAccountsByType($types, $sort); | ||||
|         $count       = $collection->count(); | ||||
| 
 | ||||
|         // continue sort:
 | ||||
|         // TODO if the user sorts on DB dependent field there must be no slice before enrichment, only after.
 | ||||
|         // TODO still need to figure out how to do this easily.
 | ||||
|         $accounts    = $collection->slice(($this->parameters->get('page') - 1) * $params['limit'], $params['limit']); | ||||
| 
 | ||||
|         // #11007 go to the end of the previous day.
 | ||||
|         $this->parameters->set('start', $this->parameters->get('start')?->subSecond()); | ||||
|         // #11018 also end of the day.
 | ||||
|         $this->parameters->set('end', $this->parameters->get('end')?->endOfDay()); | ||||
|         $accounts    = $collection->slice($offset, $limit); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setSort($params['sort']); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $enrichment->setSort($sort); | ||||
|         $enrichment->setDate($date); | ||||
|         $enrichment->setStart($start); | ||||
|         $enrichment->setEnd($end); | ||||
|         $enrichment->setUser($admin); | ||||
|         $accounts    = $enrichment->enrich($accounts); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($accounts, $count, $params['limit'], $this->parameters->get('page')); | ||||
|         $paginator   = new LengthAwarePaginator($accounts, $count, $limit, $page); | ||||
|         $paginator->setPath(route('api.v1.accounts.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| @@ -128,28 +128,25 @@ class ShowController extends Controller | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $account->refresh(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // #11007 go to the end of the previous day.
 | ||||
|         $this->parameters->set('start', $this->parameters->get('start')?->subSecond()); | ||||
|         // #11018 also end of the day.
 | ||||
|         $this->parameters->set('end', $this->parameters->get('end')?->endOfDay()); | ||||
|         $manager                = $this->getManager(); | ||||
|         ['start'     => $start, | ||||
|             'end'    => $end, | ||||
|             'date'   => $date,] = $request->attributes->all(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $admin                  = auth()->user(); | ||||
|         $enrichment             = new AccountEnrichment(); | ||||
|         $enrichment->setDate($date); | ||||
|         $enrichment->setStart($start); | ||||
|         $enrichment->setEnd($end); | ||||
|         $enrichment->setUser($admin); | ||||
|         $account     = $enrichment->enrichSingle($account); | ||||
|         $account                = $enrichment->enrichSingle($account); | ||||
| 
 | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource    = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|         $transformer            = app(AccountTransformer::class); | ||||
|         $resource               = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -28,6 +28,7 @@ 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\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use FireflyIII\User; | ||||
| @@ -74,7 +75,7 @@ class UpdateController extends Controller | ||||
|         $account      = $this->repository->update($account, $data); | ||||
|         $manager      = $this->getManager(); | ||||
|         $account->refresh(); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Middleware\ApiDemoUser; | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| @@ -74,7 +75,7 @@ class DestroyController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         $this->repository->destroy($attachment); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Bill; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
| @@ -61,7 +62,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($bill); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Budget; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
| @@ -61,7 +62,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($budget); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| @@ -71,7 +72,7 @@ class DestroyController extends Controller | ||||
|             throw new FireflyException('20028: The budget limit does not belong to the budget.'); | ||||
|         } | ||||
|         $this->blRepository->destroyBudgetLimit($budgetLimit); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -172,7 +172,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
| 
 | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Category; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
| @@ -61,7 +62,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(Category $category): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($category); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\CurrencyExchangeRate; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||
| @@ -75,6 +76,9 @@ class DestroyController extends Controller | ||||
|         if ($exchangeRate instanceof CurrencyExchangeRate) { | ||||
|             $this->repository->deleteRate($exchangeRate); | ||||
|         } | ||||
|         if (!$exchangeRate instanceof CurrencyExchangeRate) { | ||||
|             throw new FireflyException('Bla'); | ||||
|         } | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -82,7 +82,6 @@ class UpdateController extends Controller | ||||
|         $exchangeRate = $this->repository->updateExchangeRate($exchangeRate, $rate, $date); | ||||
| 
 | ||||
|         $transformer  = new ExchangeRateTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer)) | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| @@ -64,7 +65,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(ObjectGroup $objectGroup): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($objectGroup); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\PiggyBank; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
| @@ -61,7 +62,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($piggyBank); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Recurrence; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
| @@ -61,7 +62,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($recurrence); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Rule; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| @@ -65,7 +66,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(Rule $rule): JsonResponse | ||||
|     { | ||||
|         $this->ruleRepository->destroy($rule); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\RuleGroup; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| @@ -65,7 +66,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(RuleGroup $ruleGroup): JsonResponse | ||||
|     { | ||||
|         $this->ruleGroupRepository->destroy($ruleGroup, null); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Tag; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| @@ -65,7 +66,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(Tag $tag): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($tag); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -32,6 +32,7 @@ use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| @@ -92,7 +93,7 @@ class DestroyController extends Controller | ||||
| 
 | ||||
|         $this->groupRepository->destroy($transactionGroup); | ||||
| 
 | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         /** @var Account $account */ | ||||
|         foreach ($accounts as $account) { | ||||
| @@ -112,7 +113,7 @@ class DestroyController extends Controller | ||||
|     public function destroyJournal(TransactionJournal $transactionJournal): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroyJournal($transactionJournal); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -33,6 +33,7 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; | ||||
| use FireflyIII\Rules\IsDuplicateTransaction; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| @@ -107,7 +108,7 @@ class StoreController extends Controller | ||||
| 
 | ||||
|             throw new ValidationException($validator); | ||||
|         } | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
|         $applyRules         = $data['apply_rules'] ?? true; | ||||
|         $fireWebhooks       = $data['fire_webhooks'] ?? true; | ||||
|         event(new StoredTransactionGroup($transactionGroup, $applyRules, $fireWebhooks)); | ||||
|   | ||||
| @@ -30,6 +30,7 @@ use FireflyIII\Events\UpdatedTransactionGroup; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| @@ -79,7 +80,7 @@ class UpdateController extends Controller | ||||
|         $newHash           = $this->groupRepository->getCompareHash($transactionGroup); | ||||
|         $manager           = $this->getManager(); | ||||
| 
 | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
|         $applyRules        = $data['apply_rules'] ?? true; | ||||
|         $fireWebhooks      = $data['fire_webhooks'] ?? true; | ||||
|         $runRecalculations = $oldHash !== $newHash; | ||||
|   | ||||
| @@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| @@ -89,7 +90,7 @@ class DestroyController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         $this->repository->destroy($currency); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\TransactionCurrency; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\StoreRequest; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\CurrencyTransformer; | ||||
| @@ -71,7 +72,7 @@ class StoreController extends Controller | ||||
|         $currency    = $this->repository->store($request->getAll()); | ||||
|         if (true === $request->boolean('default')) { | ||||
|             $this->repository->makePrimary($currency); | ||||
|             app('preferences')->mark(); | ||||
|             Preferences::mark(); | ||||
|         } | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|   | ||||
| @@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\UpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\CurrencyTransformer; | ||||
| @@ -105,7 +106,7 @@ class UpdateController extends Controller | ||||
|         $this->repository->enable($currency); | ||||
|         $this->repository->makePrimary($currency); | ||||
| 
 | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         $manager     = $this->getManager(); | ||||
|         $currency->refreshForUser($user); | ||||
| @@ -172,14 +173,13 @@ class UpdateController extends Controller | ||||
| 
 | ||||
|         $currency    = $this->repository->update($currency, $data); | ||||
| 
 | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         $manager     = $this->getManager(); | ||||
|         $currency->refreshForUser($user); | ||||
| 
 | ||||
|         /** @var CurrencyTransformer $transformer */ | ||||
|         $transformer = app(CurrencyTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new Item($currency, $transformer, 'currencies'); | ||||
| 
 | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\TransactionLink; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Models\TransactionJournalLink; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| @@ -66,7 +67,7 @@ class DestroyController extends Controller | ||||
|     public function destroy(TransactionJournalLink $link): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroyLink($link); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\LinkType; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -73,7 +74,7 @@ class DestroyController extends Controller | ||||
|             throw new FireflyException('200020: Link type cannot be changed.'); | ||||
|         } | ||||
|         $this->repository->destroy($linkType); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
| @@ -25,7 +25,7 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\UserGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\PaginationRequest; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\UserGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -52,17 +52,19 @@ class IndexController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function index(DateRequest $request): JsonResponse | ||||
|     public function index(PaginationRequest $request): JsonResponse | ||||
|     { | ||||
|         $administrations = $this->repository->get(); | ||||
|         $pageSize        = $this->parameters->get('limit'); | ||||
|         [ | ||||
|             'page'   => $page, | ||||
|             'limit'  => $limit, | ||||
|             'offset' => $offset, | ||||
|         ]                = $request->attributes->all(); | ||||
|         $count           = $administrations->count(); | ||||
|         $administrations = $administrations->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator       = new LengthAwarePaginator($administrations, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $administrations = $administrations->slice($offset, $limit); | ||||
|         $paginator       = new LengthAwarePaginator($administrations, $count, $limit, $page); | ||||
|         $transformer     = new UserGroupTransformer(); | ||||
| 
 | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\UserGroup\UpdateRequest; | ||||
| use FireflyIII\Models\UserGroup; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Transformers\UserGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| @@ -59,7 +60,7 @@ class UpdateController extends Controller | ||||
|         $data        = $request->getData(); | ||||
|         $userGroup   = $this->repository->update($userGroup, $data); | ||||
|         $userGroup->refresh(); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         $transformer = new UserGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -27,7 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Summary; | ||||
| use Carbon\Carbon; | ||||
| use Exception; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\Summary\BasicRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| @@ -88,34 +88,25 @@ class BasicController extends Controller | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/summary/getBasicSummary
 | ||||
|      * | ||||
|      * @throws Exception | ||||
|      */ | ||||
|     public function basic(DateRequest $request): JsonResponse | ||||
|     public function basic(BasicRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for boxes:
 | ||||
|         $dates        = $request->getAll(); | ||||
|         $start        = $dates['start']; | ||||
|         $end          = $dates['end']; | ||||
|         $code         = $request->get('currency_code'); | ||||
|         ['start' => $start, 'end' => $end, 'code' => $code] = $request->attributes->all(); | ||||
|         // balance information:
 | ||||
|         $balanceData  = $this->getBalanceInformation($start, $end); | ||||
|         $billData     = $this->getSubscriptionInformation($start, $end); | ||||
|         $spentData    = $this->getLeftToSpendInfo($start, $end); | ||||
|         $netWorthData = $this->getNetWorthInfo($end); | ||||
|         $balanceData                                        = $this->getBalanceInformation($start, $end); | ||||
|         $billData                                           = $this->getSubscriptionInformation($start, $end); | ||||
|         $spentData                                          = $this->getLeftToSpendInfo($start, $end); | ||||
|         $netWorthData                                       = $this->getNetWorthInfo($end); | ||||
|         //                        $balanceData  = [];
 | ||||
|         //                        $billData     = [];
 | ||||
|         //                $spentData    = [];
 | ||||
|         //                        $netWorthData = [];
 | ||||
|         $total        = array_merge($balanceData, $billData, $spentData, $netWorthData); | ||||
|         $total                                              = array_merge($balanceData, $billData, $spentData, $netWorthData); | ||||
| 
 | ||||
|         // give new keys
 | ||||
|         $return       = []; | ||||
|         $return                                             = []; | ||||
|         foreach ($total as $entry) { | ||||
|             if (null === $code || ($code === $entry['currency_code'])) { | ||||
|             if ('' === $code || ($code === $entry['currency_code'])) { | ||||
|                 $return[$entry['key']] = $entry; | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\User\PreferenceStoreRequest; | ||||
| use FireflyIII\Api\V1\Requests\User\PreferenceUpdateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Transformers\PreferenceTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| @@ -52,7 +53,7 @@ class PreferencesController extends Controller | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $collection  = app('preferences')->all(); | ||||
|         $collection  = Preferences::all(); | ||||
|         $manager     = $this->getManager(); | ||||
|         $count       = $collection->count(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
| @@ -110,7 +111,7 @@ class PreferencesController extends Controller | ||||
|             throw new FireflyException('Please use api/v1/currencies/default instead.'); | ||||
|         } | ||||
| 
 | ||||
|         $pref        = app('preferences')->set($data['name'], $data['data']); | ||||
|         $pref        = Preferences::set($data['name'], $data['data']); | ||||
| 
 | ||||
|         /** @var PreferenceTransformer $transformer */ | ||||
|         $transformer = app(PreferenceTransformer::class); | ||||
| @@ -135,7 +136,7 @@ class PreferencesController extends Controller | ||||
| 
 | ||||
|         $manager     = $this->getManager(); | ||||
|         $data        = $request->getAll(); | ||||
|         $pref        = app('preferences')->set($preference->name, $data['data']); | ||||
|         $pref        = Preferences::set($preference->name, $data['data']); | ||||
| 
 | ||||
|         /** @var PreferenceTransformer $transformer */ | ||||
|         $transformer = app(PreferenceTransformer::class); | ||||
|   | ||||
| @@ -30,6 +30,7 @@ use FireflyIII\Models\Webhook; | ||||
| use FireflyIII\Models\WebhookAttempt; | ||||
| use FireflyIII\Models\WebhookMessage; | ||||
| use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
| @@ -70,7 +71,7 @@ class DestroyController extends Controller | ||||
| 
 | ||||
|         Log::channel('audit')->info(sprintf('User destroys webhook #%d.', $webhook->id)); | ||||
|         $this->repository->destroy($webhook); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| @@ -101,7 +102,7 @@ class DestroyController extends Controller | ||||
|         Log::channel('audit')->info(sprintf('User destroys webhook #%d, message #%d, attempt #%d.', $webhook->id, $message->id, $attempt->id)); | ||||
| 
 | ||||
|         $this->repository->destroyAttempt($attempt); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| @@ -128,7 +129,7 @@ class DestroyController extends Controller | ||||
|         Log::channel('audit')->info(sprintf('User destroys webhook #%d, message #%d.', $webhook->id, $message->id)); | ||||
| 
 | ||||
|         $this->repository->destroyMessage($message); | ||||
|         app('preferences')->mark(); | ||||
|         Preferences::mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|   | ||||
							
								
								
									
										97
									
								
								app/Api/V1/Requests/AggregateFormRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								app/Api/V1/Requests/AggregateFormRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,97 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Validation\Validator; | ||||
| use RuntimeException; | ||||
| 
 | ||||
| abstract class AggregateFormRequest extends ApiRequest | ||||
| { | ||||
|     /** | ||||
|      * @var ApiRequest[] | ||||
|      */ | ||||
|     protected array $requests = []; | ||||
| 
 | ||||
|     /** @return class-string[] */ | ||||
|     abstract protected function getRequests(): array; | ||||
| 
 | ||||
|     public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): void | ||||
|     { | ||||
|         parent::initialize($query, $request, $attributes, $cookies, $files, $server, $content); | ||||
| 
 | ||||
|         // instantiate all subrequests and share current requests' bags with them
 | ||||
|         Log::debug('Initializing AggregateFormRequest.'); | ||||
|         foreach ($this->getRequests() as $config) { | ||||
|             $requestClass         = is_array($config) ? array_shift($config) : $config; | ||||
| 
 | ||||
|             if (!is_a($requestClass, Request::class, true)) { | ||||
|                 throw new RuntimeException('getRequests() must return class-strings of subclasses of Request'); | ||||
|             } | ||||
|             Log::debug(sprintf('Initializing subrequest %s', $requestClass)); | ||||
| 
 | ||||
|             $instance             = $this->requests[] = new $requestClass(); | ||||
|             $instance->request    = $this->request; | ||||
|             $instance->query      = $this->query; | ||||
|             $instance->attributes = $this->attributes; | ||||
|             $instance->cookies    = $this->cookies; | ||||
|             $instance->files      = $this->files; | ||||
|             $instance->server     = $this->server; | ||||
|             $instance->headers    = $this->headers; | ||||
| 
 | ||||
|             if ($instance instanceof ApiRequest) { | ||||
|                 $instance->handleConfig(is_array($config) ? $config : []); | ||||
|             } | ||||
|         } | ||||
|         Log::debug('Done initializing AggregateFormRequest.'); | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         // check all subrequests for rules and combine them
 | ||||
|         return array_reduce( | ||||
|             $this->requests, | ||||
|             static fn (array $rules, FormRequest $request) => $rules | ||||
|                 + ( | ||||
|                     method_exists($request, 'rules') | ||||
|                     ? $request->rules() | ||||
|                     : [] | ||||
|                 ), | ||||
|             [], | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         // register all subrequests' validators
 | ||||
|         foreach ($this->requests as $request) { | ||||
|             if (method_exists($request, 'withValidator')) { | ||||
|                 Log::debug(sprintf('Process withValidator from class %s', get_class($request))); | ||||
|                 $request->withValidator($validator); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								app/Api/V1/Requests/ApiRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								app/Api/V1/Requests/ApiRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| class ApiRequest extends FormRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     protected string $required = ''; | ||||
| 
 | ||||
|     public function handleConfig(array $config): void | ||||
|     { | ||||
|         if (in_array('required', $config, true)) { | ||||
|             $this->required = 'required'; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										46
									
								
								app/Api/V1/Requests/Autocomplete/AutocompleteApiRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								app/Api/V1/Requests/Autocomplete/AutocompleteApiRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| <?php | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * AutocompleteApiRequest.php | ||||
|  * Copyright (c) 2025 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\Requests\Autocomplete; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\AggregateFormRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\Generic\QueryRequest; | ||||
| use FireflyIII\Api\V1\Requests\Models\Account\AccountTypesApiRequest; | ||||
| use FireflyIII\Api\V1\Requests\PaginationRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use Override; | ||||
| 
 | ||||
| class AutocompleteApiRequest extends AggregateFormRequest | ||||
| { | ||||
|     #[Override]
 | ||||
|     protected function getRequests(): array | ||||
|     { | ||||
|         return [ | ||||
|             DateRequest::class, | ||||
|             [PaginationRequest::class, 'sort_class' => Account::class], | ||||
|             AccountTypesApiRequest::class, | ||||
|             QueryRequest::class, | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -31,6 +31,8 @@ use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| /** | ||||
|  * Class AutocompleteRequest | ||||
|  * | ||||
|  * @deprecated | ||||
|  */ | ||||
| class AutocompleteRequest extends FormRequest | ||||
| { | ||||
|   | ||||
| @@ -1,82 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * DateRequest.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Data; | ||||
| 
 | ||||
| use FireflyIII\Exceptions\ValidationException; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| /** | ||||
|  * Request class for end points that require date parameters. | ||||
|  * | ||||
|  * Class DateRequest | ||||
|  */ | ||||
| class DateRequest extends FormRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     /** | ||||
|      * Get all data from the request. | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         $start         = $this->getCarbonDate('start'); | ||||
|         $end           = $this->getCarbonDate('end'); | ||||
|         if (null === $start) { | ||||
|             $start = now()->startOfMonth(); | ||||
|         } | ||||
|         if (null === $end) { | ||||
|             $end = now()->endOfMonth(); | ||||
|         } | ||||
|         // sanity check on dates:
 | ||||
|         [$start, $end] = $end < $start ? [$end, $start] : [$start, $end]; | ||||
| 
 | ||||
|         $start->startOfDay(); | ||||
|         $end->endOfDay(); | ||||
|         if ($start->diffInYears($end, true) > 5) { | ||||
|             throw new ValidationException('Date range out of range.'); | ||||
|         } | ||||
| 
 | ||||
|         return [ | ||||
|             'start' => $start, | ||||
|             'end'   => $end, | ||||
|             'date'  => $this->getCarbonDate('date'), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The rules that the incoming request must be matched against. | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'date'  => 'date|after:1970-01-02|before:2038-01-17', | ||||
|             'start' => 'date|after:1970-01-02|before:2038-01-17|before:end|required_with:end', | ||||
|             'end'   => 'date|after:1970-01-02|before:2038-01-17|after:start|required_with:start', | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -32,6 +32,8 @@ use Illuminate\Foundation\Http\FormRequest; | ||||
|  * Request class for end points that require date parameters. | ||||
|  * | ||||
|  * Class SameDateRequest | ||||
|  * | ||||
|  * @deprecated Replaced by DateRangeRequest | ||||
|  */ | ||||
| class SameDateRequest extends FormRequest | ||||
| { | ||||
|   | ||||
							
								
								
									
										57
									
								
								app/Api/V1/Requests/DateRangeRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/Api/V1/Requests/DateRangeRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class DateRangeRequest extends ApiRequest | ||||
| { | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start' => sprintf('date|after:1970-01-02|before:2038-01-17|before:end|required_with:end|%s', $this->required), | ||||
|             'end'   => sprintf('date|after:1970-01-02|before:2038-01-17|after:start|required_with:start|%s', $this->required), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if ($validator->failed()) { | ||||
|                     // set null values
 | ||||
|                     $this->attributes->set('start', null); | ||||
|                     $this->attributes->set('end', null); | ||||
| 
 | ||||
|                     return; | ||||
|                 } | ||||
|                 $start = $this->getCarbonDate('start')?->startOfDay(); | ||||
|                 $end   = $this->getCarbonDate('end')?->endOfDay(); | ||||
| 
 | ||||
|                 $this->attributes->set('start', $start); | ||||
|                 $this->attributes->set('end', $end); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										58
									
								
								app/Api/V1/Requests/DateRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								app/Api/V1/Requests/DateRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class DateRequest extends ApiRequest | ||||
| { | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'date'  => 'date|after:1970-01-02|before:2038-01-17|'.$this->required, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if ($validator->failed()) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $date  = $this->getCarbonDate('date')?->endOfDay(); | ||||
| 
 | ||||
|                 // if we also have a range, date must be in that range
 | ||||
|                 $start = $this->attributes->get('start'); | ||||
|                 $end   = $this->attributes->get('end'); | ||||
|                 if ($date instanceof Carbon && $start instanceof Carbon && $end instanceof Carbon && !$date->between($start, $end)) { | ||||
|                     $validator->errors()->add('date', (string)trans('validation.between_date')); | ||||
|                 } | ||||
| 
 | ||||
|                 $this->attributes->set('date', $date); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										55
									
								
								app/Api/V1/Requests/Generic/QueryRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								app/Api/V1/Requests/Generic/QueryRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| <?php | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * QueryRequest.php | ||||
|  * Copyright (c) 2025 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\Requests\Generic; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\ApiRequest; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class QueryRequest extends ApiRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'query' => sprintf('min:1|max:50|%s', $this->required), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if ($validator->failed()) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $query = $this->convertString('query'); | ||||
|                 $this->attributes->set('query', $query); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -33,6 +33,8 @@ use Illuminate\Foundation\Http\FormRequest; | ||||
|  * Request class for end points that require a date parameter. | ||||
|  * | ||||
|  * Class SingleDateRequest | ||||
|  * | ||||
|  * @deprecated | ||||
|  */ | ||||
| class SingleDateRequest extends FormRequest | ||||
| { | ||||
|   | ||||
							
								
								
									
										57
									
								
								app/Api/V1/Requests/Models/Account/AccountTypeApiRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/Api/V1/Requests/Models/Account/AccountTypeApiRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <?php | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * AccountTypeApiRequest.php | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\ApiRequest; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class AccountTypeApiRequest extends ApiRequest | ||||
| { | ||||
|     use AccountFilter; | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'type'  => sprintf('in:%s', implode(',', array_keys($this->types))), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if ($validator->failed()) { | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 $type = $this->convertString('type', 'all'); | ||||
|                 $this->attributes->add([ | ||||
|                     'type'  => $type, | ||||
|                     'types' => $this->mapAccountTypes($type), | ||||
|                 ]); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,58 @@ | ||||
| <?php | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * AccountTypeApiRequest.php | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\ApiRequest; | ||||
| use FireflyIII\Rules\Account\IsValidAccountTypeList; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class AccountTypesApiRequest extends ApiRequest | ||||
| { | ||||
|     use AccountFilter; | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         //  sprintf('in:%s', implode(',', array_keys($this->types))),
 | ||||
|         return [ | ||||
|             'types'  => new IsValidAccountTypeList(), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if ($validator->failed()) { | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 $type = $this->convertString('types', 'all'); | ||||
|                 $this->attributes->add([ | ||||
|                     'types' => $this->mapAccountTypes($type), | ||||
|                 ]); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -23,77 +23,21 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Models\Account; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Requests\AggregateFormRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRangeRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\PaginationRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Rules\IsValidSortInstruction; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class ShowRequest extends FormRequest | ||||
| class ShowRequest extends AggregateFormRequest | ||||
| { | ||||
|     use AccountFilter; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     public function getParameters(): array | ||||
|     protected function getRequests(): array | ||||
|     { | ||||
|         $limit = $this->convertInteger('limit'); | ||||
|         if (0 === $limit) { | ||||
|             // get default for user:
 | ||||
|             /** @var User $user */ | ||||
|             $user  = auth()->user(); | ||||
|             $limit = (int)Preferences::getForUser($user, 'listPageSize', 50)->data; | ||||
|         } | ||||
| 
 | ||||
|         $page  = $this->convertInteger('page'); | ||||
|         $page  = min(max(1, $page), 2 ** 16); | ||||
| 
 | ||||
|         return [ | ||||
|             'type'  => $this->convertString('type', 'all'), | ||||
|             'limit' => $limit, | ||||
|             'sort'  => $this->convertSortParameters('sort', Account::class), | ||||
|             'page'  => $page, | ||||
|             [PaginationRequest::class, 'sort_class' => Account::class], | ||||
|             DateRangeRequest::class, | ||||
|             DateRequest::class, | ||||
|             AccountTypeApiRequest::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $keys = implode(',', array_keys($this->types)); | ||||
| 
 | ||||
|         return [ | ||||
|             'date'  => 'date', | ||||
|             'start' => 'date|present_with:end|before_or_equal:end|before:2038-01-17|after:1970-01-02', | ||||
|             'end'   => 'date|present_with:start|after_or_equal:start|before:2038-01-17|after:1970-01-02', | ||||
|             'sort'  => ['nullable', new IsValidSortInstruction(Account::class)], | ||||
|             'type'  => sprintf('in:%s', $keys), | ||||
|             'limit' => 'numeric|min:1|max:131337', | ||||
|             'page'  => 'numeric|min:1|max:131337', | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if (count($validator->failed()) > 0) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $data = $validator->getData(); | ||||
| 
 | ||||
| 
 | ||||
|                 if (array_key_exists('date', $data) && array_key_exists('start', $data) && array_key_exists('end', $data)) { | ||||
|                     // assume valid dates, before we got here.
 | ||||
|                     $start = Carbon::parse($data['start'], config('app.timezone'))->startOfDay(); | ||||
|                     $end   = Carbon::parse($data['end'], config('app.timezone'))->endOfDay(); | ||||
|                     $date  = Carbon::parse($data['date'], config('app.timezone')); | ||||
|                     if (!$date->between($start, $end)) { | ||||
|                         $validator->errors()->add('date', (string)trans('validation.between_date')); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,50 @@ | ||||
| <?php | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * CurrencyCodeRequest.php | ||||
|  * Copyright (c) 2025 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\Requests\Models\TransactionCurrency; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\ApiRequest; | ||||
| use Illuminate\Validation\Validator; | ||||
| 
 | ||||
| class CurrencyCodeRequest extends ApiRequest | ||||
| { | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'code' => sprintf('exists:transaction_currencies,code|%s', $this->required), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if (!$validator->valid()) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $code = $this->convertString('code', ''); | ||||
|                 $this->attributes->set('code', $code); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										84
									
								
								app/Api/V1/Requests/PaginationRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								app/Api/V1/Requests/PaginationRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Copyright (c) 2025 https://github.com/ctrl-f5 | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| use FireflyIII\Rules\IsValidSortInstruction; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Validation\Validator; | ||||
| use RuntimeException; | ||||
| 
 | ||||
| class PaginationRequest extends ApiRequest | ||||
| { | ||||
|     private ?string $sortClass = null; | ||||
| 
 | ||||
|     public function handleConfig(array $config): void | ||||
|     { | ||||
|         parent::handleConfig($config); | ||||
| 
 | ||||
|         $this->sortClass = $config['sort_class'] ?? null; | ||||
| 
 | ||||
|         if (!$this->sortClass) { | ||||
|             throw new RuntimeException('PaginationRequest requires a sort_class config'); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'sort'  => ['nullable', new IsValidSortInstruction((string)$this->sortClass)], | ||||
|             'limit' => 'numeric|min:1|max:131337', | ||||
|             'page'  => 'numeric|min:1|max:131337', | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator): void { | ||||
|                 if ($validator->failed()) { | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 $limit  = $this->convertInteger('limit'); | ||||
|                 if (0 === $limit) { | ||||
|                     // get default for user:
 | ||||
|                     /** @var User $user */ | ||||
|                     $user  = auth()->user(); | ||||
|                     $limit = (int)Preferences::getForUser($user, 'listPageSize', 50)->data; | ||||
|                 } | ||||
| 
 | ||||
|                 $page   = $this->convertInteger('page'); | ||||
|                 $page   = min(max(1, $page), 2 ** 16); | ||||
|                 $offset = ($page - 1) * $limit; | ||||
|                 $sort   = $this->sortClass ? $this->convertSortParameters('sort', $this->sortClass) : $this->get('sort'); | ||||
| 
 | ||||
|                 $this->attributes->set('limit', $limit); | ||||
|                 $this->attributes->set('sort', $sort); | ||||
|                 $this->attributes->set('page', $page); | ||||
|                 $this->attributes->set('offset', $offset); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										39
									
								
								app/Api/V1/Requests/Summary/BasicRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								app/Api/V1/Requests/Summary/BasicRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| <?php | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| /* | ||||
|  * BasicRequest.php | ||||
|  * Copyright (c) 2025 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\Requests\Summary; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\AggregateFormRequest; | ||||
| use FireflyIII\Api\V1\Requests\DateRangeRequest; | ||||
| use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\CurrencyCodeRequest; | ||||
| 
 | ||||
| class BasicRequest extends AggregateFormRequest | ||||
| { | ||||
|     protected function getRequests(): array | ||||
|     { | ||||
|         return [ | ||||
|             [DateRangeRequest::class, 'required'], | ||||
|             CurrencyCodeRequest::class, | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Console\Command; | ||||
| 
 | ||||
| @@ -47,7 +48,7 @@ class CorrectsFrontpageAccounts extends Command | ||||
| 
 | ||||
|         /** @var User $user */ | ||||
|         foreach ($users as $user) { | ||||
|             $preference = app('preferences')->getForUser($user, 'frontpageAccounts'); | ||||
|             $preference = Preferences::getForUser($user, 'frontpageAccounts'); | ||||
|             if (null !== $preference) { | ||||
|                 $this->fixPreference($preference); | ||||
|             } | ||||
| @@ -79,6 +80,6 @@ class CorrectsFrontpageAccounts extends Command | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         app('preferences')->setForUser($preference->user, 'frontpageAccounts', $fixed); | ||||
|         Preferences::setForUser($preference->user, 'frontpageAccounts', $fixed); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Console\Commands\Correction; | ||||
| use Exception; | ||||
| use FireflyIII\Console\Commands\ShowsFriendlyMessages; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Console\Command; | ||||
| 
 | ||||
| @@ -54,10 +55,10 @@ class CreatesAccessTokens extends Command | ||||
| 
 | ||||
|         /** @var User $user */ | ||||
|         foreach ($users as $user) { | ||||
|             $pref = app('preferences')->getForUser($user, 'access_token'); | ||||
|             $pref = Preferences::getForUser($user, 'access_token'); | ||||
|             if (null === $pref) { | ||||
|                 $token = $user->generateAccessToken(); | ||||
|                 app('preferences')->setForUser($user, 'access_token', $token); | ||||
|                 Preferences::setForUser($user, 'access_token', $token); | ||||
|                 $this->friendlyInfo(sprintf('Generated access token for user %s', $user->email)); | ||||
|                 ++$count; | ||||
|             } | ||||
|   | ||||
| @@ -46,7 +46,7 @@ class SetsLatestVersion extends Command | ||||
| 
 | ||||
|             return 0; | ||||
|         } | ||||
|         FireflyConfig::set('ff3_version', config('firefly.version')); | ||||
|         FireflyConfig::set('ff3_build_time', (int) config('firefly.build_time')); | ||||
|         $this->friendlyInfo('Updated version.'); | ||||
| 
 | ||||
|         return 0; | ||||
|   | ||||
| @@ -33,6 +33,7 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Console\Command; | ||||
| 
 | ||||
| @@ -114,7 +115,7 @@ class UpgradesBillsToRules extends Command | ||||
|         $this->ruleRepository->setUser($user); | ||||
| 
 | ||||
|         /** @var Preference $lang */ | ||||
|         $lang       = app('preferences')->getForUser($user, 'language', 'en_US'); | ||||
|         $lang       = Preferences::getForUser($user, 'language', 'en_US'); | ||||
|         $language   = null !== $lang->data && !is_array($lang->data) ? (string) $lang->data : 'en_US'; | ||||
|         $groupTitle = (string) trans('firefly.rulegroup_for_bills_title', [], $language); | ||||
|         $ruleGroup  = $this->ruleGroupRepository->findByTitle($groupTitle); | ||||
|   | ||||
| @@ -87,7 +87,7 @@ class UpgradesDatabase extends Command | ||||
|             $this->call($command, $args); | ||||
|         } | ||||
|         // index will set FF3 version.
 | ||||
|         FireflyConfig::set('ff3_version', (string) config('firefly.version')); | ||||
|         FireflyConfig::set('ff3_build_time', (int) config('firefly.build_time')); | ||||
| 
 | ||||
|         return 0; | ||||
|     } | ||||
|   | ||||
| @@ -26,6 +26,7 @@ namespace FireflyIII\Console\Commands; | ||||
| 
 | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| @@ -79,7 +80,7 @@ trait VerifiesAccessToken | ||||
| 
 | ||||
|             return false; | ||||
|         } | ||||
|         $accessToken = app('preferences')->getForUser($user, 'access_token'); | ||||
|         $accessToken = Preferences::getForUser($user, 'access_token'); | ||||
|         if (null === $accessToken) { | ||||
|             Log::error(sprintf('User #%d has no access token, so cannot access command line options.', $userId)); | ||||
| 
 | ||||
|   | ||||
| @@ -84,8 +84,10 @@ class AttachmentFactory | ||||
|         return $attachment; | ||||
|     } | ||||
| 
 | ||||
|     public function setUser(User $user): void | ||||
|     public function setUser(User $user): static | ||||
|     { | ||||
|         $this->user = $user; | ||||
| 
 | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -26,6 +26,7 @@ namespace FireflyIII\Factory; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Create piggy bank events. | ||||
| @@ -36,9 +37,9 @@ class PiggyBankEventFactory | ||||
| { | ||||
|     public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): void | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type)); | ||||
|         Log::debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type)); | ||||
|         if (!$piggyBank instanceof PiggyBank) { | ||||
|             app('log')->debug('Piggy bank is null'); | ||||
|             Log::debug('Piggy bank is null'); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
| @@ -49,7 +50,7 @@ class PiggyBankEventFactory | ||||
| 
 | ||||
|         $amount     = $piggyRepos->getExactAmount($piggyBank, $journal); | ||||
|         if (0 === bccomp($amount, '0')) { | ||||
|             app('log')->debug('Amount is zero, will not create event.'); | ||||
|             Log::debug('Amount is zero, will not create event.'); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
|   | ||||
| @@ -221,10 +221,26 @@ class TransactionJournalFactory | ||||
|         ]; | ||||
|         Log::debug('Source info:', $sourceInfo); | ||||
|         Log::debug('Destination info:', $destInfo); | ||||
|         $sourceAccount         = $this->getAccount($type->type, 'source', $sourceInfo); | ||||
|         $destinationAccount    = $this->getAccount($type->type, 'destination', $destInfo, $sourceAccount); | ||||
|         $destinationAccount    = null; | ||||
|         $sourceAccount         = null; | ||||
|         if (TransactionTypeEnum::DEPOSIT->value === $type->type) { | ||||
|             Log::debug('Transaction type is deposit, start with destination first.'); | ||||
|             $destinationAccount = $this->getAccount($type->type, 'destination', $destInfo); | ||||
|             $sourceAccount      = $this->getAccount($type->type, 'source', $sourceInfo, $destinationAccount); | ||||
|         } | ||||
|         if (TransactionTypeEnum::DEPOSIT->value !== $type->type) { | ||||
|             Log::debug('Transaction type is not deposit, start with source first.'); | ||||
|             $sourceAccount      = $this->getAccount($type->type, 'source', $sourceInfo); | ||||
|             $destinationAccount = $this->getAccount($type->type, 'destination', $destInfo, $sourceAccount); | ||||
|         } | ||||
| 
 | ||||
|         Log::debug('Done with getAccount(2x)'); | ||||
| 
 | ||||
|         // there is a safety catch here. If either account is NULL, they will be replaced with the cash account.
 | ||||
|         if (null === $destinationAccount) { | ||||
|             Log::warning('Destination account is NULL, will replace with cash account.'); | ||||
|             $destinationAccount = $this->accountRepository->getCashAccount(); | ||||
|         } | ||||
| 
 | ||||
|         // this is the moment for a reconciliation sanity check (again).
 | ||||
|         if (TransactionTypeEnum::RECONCILIATION->value === $type->type) { | ||||
|   | ||||
| @@ -30,6 +30,7 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Notifications\User\TransactionCreation; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use Illuminate\Support\Facades\Notification; | ||||
| 
 | ||||
| @@ -52,7 +53,7 @@ class AutomationHandler | ||||
|         $user        = $repository->find($event->userId); | ||||
| 
 | ||||
|         /** @var bool $sendReport */ | ||||
|         $sendReport  = app('preferences')->getForUser($user, 'notification_transaction_creation', false)->data; | ||||
|         $sendReport  = Preferences::getForUser($user, 'notification_transaction_creation', false)->data; | ||||
| 
 | ||||
|         if (false === $sendReport) { | ||||
|             app('log')->debug('Not sending report, because config says so.'); | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace FireflyIII\Handlers\Events\Model; | ||||
| use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; | ||||
| use FireflyIII\Events\Model\Rule\RuleActionFailedOnObject; | ||||
| use FireflyIII\Notifications\User\RuleActionFailed; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use GuzzleHttp\Exception\ClientException; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Support\Facades\Notification; | ||||
| @@ -42,7 +43,7 @@ class RuleHandler | ||||
|         $rule        = $ruleAction->rule; | ||||
| 
 | ||||
|         /** @var bool $preference */ | ||||
|         $preference  = app('preferences')->getForUser($rule->user, 'notification_rule_action_failures', true)->data; | ||||
|         $preference  = Preferences::getForUser($rule->user, 'notification_rule_action_failures', true)->data; | ||||
|         if (false === $preference) { | ||||
|             return; | ||||
|         } | ||||
| @@ -71,7 +72,7 @@ class RuleHandler | ||||
|         $rule        = $ruleAction->rule; | ||||
| 
 | ||||
|         /** @var bool $preference */ | ||||
|         $preference  = app('preferences')->getForUser($rule->user, 'notification_rule_action_failures', true)->data; | ||||
|         $preference  = Preferences::getForUser($rule->user, 'notification_rule_action_failures', true)->data; | ||||
|         if (false === $preference) { | ||||
|             return; | ||||
|         } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ use FireflyIII\Enums\WebhookTrigger; | ||||
| use FireflyIII\Events\RequestedSendWebhookMessages; | ||||
| use FireflyIII\Events\StoredTransactionGroup; | ||||
| use FireflyIII\Generator\Webhook\MessageGeneratorInterface; | ||||
| use FireflyIII\Models\Transaction; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\PeriodStatistic\PeriodStatisticRepositoryInterface; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| @@ -105,10 +106,18 @@ class StoredGroupEventHandler | ||||
| 
 | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($event->transactionGroup->transactionJournals as $journal) { | ||||
|             /** @var null|Transaction $source */ | ||||
|             $source     = $journal->transactions()->where('amount', '<', '0')->first(); | ||||
| 
 | ||||
|             /** @var null|Transaction $dest */ | ||||
|             $dest       = $journal->transactions()->where('amount', '>', '0')->first(); | ||||
|             $repository->deleteStatisticsForModel($source->account, $journal->date); | ||||
|             $repository->deleteStatisticsForModel($dest->account, $journal->date); | ||||
| 
 | ||||
|             if (null !== $source) { | ||||
|                 $repository->deleteStatisticsForModel($source->account, $journal->date); | ||||
|             } | ||||
|             if (null !== $dest) { | ||||
|                 $repository->deleteStatisticsForModel($dest->account, $journal->date); | ||||
|             } | ||||
|             $categories = $journal->categories; | ||||
|             $tags       = $journal->tags; | ||||
|             $budgets    = $journal->budgets; | ||||
|   | ||||
| @@ -51,6 +51,7 @@ use FireflyIII\Notifications\User\UserLogin; | ||||
| use FireflyIII\Notifications\User\UserNewPassword; | ||||
| use FireflyIII\Notifications\User\UserRegistration as UserRegistrationNotification; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Auth\Events\Login; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| @@ -174,9 +175,10 @@ class UserEventHandler | ||||
|         $user       = $event->user; | ||||
|         if ($repository->hasRole($user, 'demo')) { | ||||
|             // set user back to English.
 | ||||
|             app('preferences')->setForUser($user, 'language', 'en_US'); | ||||
|             app('preferences')->setForUser($user, 'locale', 'equal'); | ||||
|             app('preferences')->mark(); | ||||
|             Preferences::setForUser($user, 'language', 'en_US'); | ||||
|             Preferences::setForUser($user, 'locale', 'equal'); | ||||
|             Preferences::setForUser($user, 'anonymous', false); | ||||
|             Preferences::mark(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @@ -188,7 +190,7 @@ class UserEventHandler | ||||
|             return; // do not email demo user.
 | ||||
|         } | ||||
| 
 | ||||
|         $list = app('preferences')->getForUser($user, 'login_ip_history', [])->data; | ||||
|         $list = Preferences::getForUser($user, 'login_ip_history', [])->data; | ||||
|         if (!is_array($list)) { | ||||
|             $list = []; | ||||
|         } | ||||
| @@ -217,12 +219,12 @@ class UserEventHandler | ||||
|             $list[$index]['notified'] = true; | ||||
|         } | ||||
| 
 | ||||
|         app('preferences')->setForUser($user, 'login_ip_history', $list); | ||||
|         Preferences::setForUser($user, 'login_ip_history', $list); | ||||
|     } | ||||
| 
 | ||||
|     public function sendAdminRegistrationNotification(RegisteredUser $event): void | ||||
|     { | ||||
|         $sendMail = (bool) app('fireflyconfig')->get('notification_admin_new_reg', true)->data; | ||||
|         $sendMail = (bool)app('fireflyconfig')->get('notification_admin_new_reg', true)->data; | ||||
|         if ($sendMail) { | ||||
|             $owner = $event->owner; | ||||
| 
 | ||||
| @@ -257,7 +259,7 @@ class UserEventHandler | ||||
|         $newEmail = $event->newEmail; | ||||
|         $oldEmail = $event->oldEmail; | ||||
|         $user     = $event->user; | ||||
|         $token    = app('preferences')->getForUser($user, 'email_change_confirm_token', 'invalid'); | ||||
|         $token    = Preferences::getForUser($user, 'email_change_confirm_token', 'invalid'); | ||||
|         $url      = route('profile.confirm-email-change', [$token->data]); | ||||
| 
 | ||||
|         try { | ||||
| @@ -281,8 +283,8 @@ class UserEventHandler | ||||
|         $newEmail = $event->newEmail; | ||||
|         $oldEmail = $event->oldEmail; | ||||
|         $user     = $event->user; | ||||
|         $token    = app('preferences')->getForUser($user, 'email_change_undo_token', 'invalid'); | ||||
|         $hashed   = hash('sha256', sprintf('%s%s', (string) config('app.key'), $oldEmail)); | ||||
|         $token    = Preferences::getForUser($user, 'email_change_undo_token', 'invalid'); | ||||
|         $hashed   = hash('sha256', sprintf('%s%s', (string)config('app.key'), $oldEmail)); | ||||
|         $url      = route('profile.undo-email-change', [$token->data, $hashed]); | ||||
| 
 | ||||
|         try { | ||||
| @@ -365,7 +367,7 @@ class UserEventHandler | ||||
|      */ | ||||
|     public function sendRegistrationMail(RegisteredUser $event): void | ||||
|     { | ||||
|         $sendMail = (bool) app('fireflyconfig')->get('notification_user_new_reg', true)->data; | ||||
|         $sendMail = (bool)app('fireflyconfig')->get('notification_user_new_reg', true)->data; | ||||
|         if ($sendMail) { | ||||
|             try { | ||||
|                 Notification::send($event->user, new UserRegistrationNotification()); | ||||
| @@ -455,7 +457,7 @@ class UserEventHandler | ||||
| 
 | ||||
|         try { | ||||
|             /** @var array $preference */ | ||||
|             $preference = app('preferences')->getForUser($user, 'login_ip_history', [])->data; | ||||
|             $preference = Preferences::getForUser($user, 'login_ip_history', [])->data; | ||||
|         } catch (FireflyException $e) { | ||||
|             // don't care.
 | ||||
|             app('log')->error($e->getMessage()); | ||||
| @@ -491,8 +493,8 @@ class UserEventHandler | ||||
|         $preference = array_values($preference); | ||||
| 
 | ||||
|         /** @var bool $send */ | ||||
|         $send       = app('preferences')->getForUser($user, 'notification_user_login', true)->data; | ||||
|         app('preferences')->setForUser($user, 'login_ip_history', $preference); | ||||
|         $send       = Preferences::getForUser($user, 'notification_user_login', true)->data; | ||||
|         Preferences::setForUser($user, 'login_ip_history', $preference); | ||||
| 
 | ||||
|         if (false === $inArray && true === $send) { | ||||
|             event(new DetectedNewIPAddress($user)); | ||||
|   | ||||
| @@ -24,6 +24,7 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Helpers\Fiscal; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Support\Facades\Preferences; | ||||
| use Psr\Container\ContainerExceptionInterface; | ||||
| use Psr\Container\NotFoundExceptionInterface; | ||||
| 
 | ||||
| @@ -40,7 +41,7 @@ class FiscalHelper implements FiscalHelperInterface | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         $this->useCustomFiscalYear = (bool) app('preferences')->get('customFiscalYear', false)->data; | ||||
|         $this->useCustomFiscalYear = (bool) Preferences::get('customFiscalYear', false)->data; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -74,7 +75,7 @@ class FiscalHelper implements FiscalHelperInterface | ||||
|         // get start mm-dd. Then create a start date in the year passed.
 | ||||
|         $startDate = clone $date; | ||||
|         if (true === $this->useCustomFiscalYear) { | ||||
|             $prefStartStr = app('preferences')->get('fiscalYearStart', '01-01')->data; | ||||
|             $prefStartStr = Preferences::get('fiscalYearStart', '01-01')->data; | ||||
|             if (is_array($prefStartStr)) { | ||||
|                 $prefStartStr = '01-01'; | ||||
|             } | ||||
|   | ||||
| @@ -77,6 +77,7 @@ abstract class Controller extends BaseController | ||||
|         View::share('DEMO_USERNAME', config('firefly.demo_username')); | ||||
|         View::share('DEMO_PASSWORD', config('firefly.demo_password')); | ||||
|         View::share('FF_VERSION', config('firefly.version')); | ||||
|         View::share('FF_BUILD_TIME', config('firefly.build_time')); | ||||
| 
 | ||||
|         // is webhooks enabled?
 | ||||
|         View::share('featuringWebhooks', true === config('firefly.feature_flags.webhooks') && true === config('firefly.allow_webhooks')); | ||||
| @@ -131,6 +132,7 @@ abstract class Controller extends BaseController | ||||
|                 $this->primaryCurrency   = null; | ||||
|                 // get shown-intro-preference:
 | ||||
|                 if (auth()->check()) { | ||||
|                     View::share('anonymous', Steam::anonymous()); | ||||
|                     $this->primaryCurrency  = Amount::getPrimaryCurrency(); | ||||
|                     $language               = Steam::getLanguage(); | ||||
|                     $locale                 = Steam::getLocale(); | ||||
|   | ||||
| @@ -81,11 +81,11 @@ class DebugController extends Controller | ||||
|      */ | ||||
|     public function displayError(): void | ||||
|     { | ||||
|         app('log')->debug('This is a test message at the DEBUG level.'); | ||||
|         app('log')->info('This is a test message at the INFO level.'); | ||||
|         Log::debug('This is a test message at the DEBUG level.'); | ||||
|         Log::info('This is a test message at the INFO level.'); | ||||
|         Log::notice('This is a test message at the NOTICE level.'); | ||||
|         app('log')->warning('This is a test message at the WARNING level.'); | ||||
|         app('log')->error('This is a test message at the ERROR level.'); | ||||
|         Log::warning('This is a test message at the WARNING level.'); | ||||
|         Log::error('This is a test message at the ERROR level.'); | ||||
|         Log::critical('This is a test message at the CRITICAL level.'); | ||||
|         Log::alert('This is a test message at the ALERT level.'); | ||||
|         Log::emergency('This is a test message at the EMERGENCY level.'); | ||||
| @@ -187,6 +187,8 @@ class DebugController extends Controller | ||||
|         return [ | ||||
|             'php_version'     => PHP_VERSION, | ||||
|             'php_os'          => PHP_OS, | ||||
|             'build_time'      => config('firefly.build_time'), | ||||
|             'build_time_nice' => Carbon::parse(config('firefly.build_time'), 'Europe/Amsterdam')->setTimezone('Europe/Amsterdam')->format('Y-m-d H:i:s e'), | ||||
|             'uname'           => php_uname('m'), | ||||
|             'interface'       => PHP_SAPI, | ||||
|             'bits'            => PHP_INT_SIZE * 8, | ||||
| @@ -212,11 +214,11 @@ class DebugController extends Controller | ||||
|         try { | ||||
|             if (file_exists('/var/www/counter-main.txt')) { | ||||
|                 $return['build'] = trim(file_get_contents('/var/www/counter-main.txt')); | ||||
|                 app('log')->debug(sprintf('build is now "%s"', $return['build'])); | ||||
|                 Log::debug(sprintf('build is now "%s"', $return['build'])); | ||||
|             } | ||||
|         } catch (Exception $e) { | ||||
|             app('log')->debug('Could not check build counter, but thats ok.'); | ||||
|             app('log')->warning($e->getMessage()); | ||||
|             Log::debug('Could not check build counter, but thats ok.'); | ||||
|             Log::warning($e->getMessage()); | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
| @@ -224,8 +226,8 @@ class DebugController extends Controller | ||||
|                 $return['build_date'] = trim(file_get_contents('/var/www/build-date-main.txt')); | ||||
|             } | ||||
|         } catch (Exception $e) { | ||||
|             app('log')->debug('Could not check build date, but thats ok.'); | ||||
|             app('log')->warning($e->getMessage()); | ||||
|             Log::debug('Could not check build date, but thats ok.'); | ||||
|             Log::warning($e->getMessage()); | ||||
|         } | ||||
|         if ('' !== (string) env('BASE_IMAGE_BUILD')) {       // @phpstan-ignore-line
 | ||||
|             $return['base_build'] = env('BASE_IMAGE_BUILD'); // @phpstan-ignore-line
 | ||||
| @@ -282,7 +284,7 @@ class DebugController extends Controller | ||||
|         $parts          = Steam::getLocaleArray(Steam::getLocale()); | ||||
|         foreach ($parts as $code) { | ||||
|             $code                  = trim($code); | ||||
|             app('log')->debug(sprintf('Trying to set %s', $code)); | ||||
|             Log::debug(sprintf('Trying to set %s', $code)); | ||||
|             $result                = setlocale(LC_ALL, $code); | ||||
|             $localeAttempts[$code] = $result === $code; | ||||
|         } | ||||
|   | ||||
| @@ -30,6 +30,7 @@ use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Steam; | ||||
| use FireflyIII\Support\Http\Controllers\GetConfigurationData; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Http\Response; | ||||
| @@ -114,6 +115,7 @@ class JavascriptController extends Controller | ||||
|             'currencyCode'         => $currency->code, | ||||
|             'currencySymbol'       => $currency->symbol, | ||||
|             'accountingLocaleInfo' => $accounting, | ||||
|             'anonymous'            => var_export(Steam::anonymous(), true), | ||||
|             'language'             => $lang, | ||||
|             'dateRangeTitle'       => $dateRange['title'], | ||||
|             'locale'               => $locale, | ||||
|   | ||||
| @@ -81,6 +81,12 @@ class ReconcileController extends Controller | ||||
|         if (!$start instanceof Carbon && !$end instanceof Carbon) { | ||||
|             throw new FireflyException('Invalid dates submitted.'); | ||||
|         } | ||||
|         if (!is_numeric($startBalance)) { | ||||
|             $startBalance = '0'; | ||||
|         } | ||||
|         if (!is_numeric($endBalance)) { | ||||
|             $endBalance = '0'; | ||||
|         } | ||||
|         if ($end->lt($start)) { | ||||
|             [$start, $end] = [$end, $start]; | ||||
|         } | ||||
|   | ||||
| @@ -268,7 +268,6 @@ class CreateController extends Controller | ||||
|     public function store(RuleFormRequest $request) | ||||
|     { | ||||
|         $data     = $request->getRuleData(); | ||||
| 
 | ||||
|         $rule     = $this->ruleRepos->store($data); | ||||
|         session()->flash('success_url', route('rules.select-transactions', [$rule->id])); | ||||
|         session()->flash('success', (string) trans('firefly.stored_new_rule', ['title' => $rule->title])); | ||||
| @@ -283,6 +282,9 @@ class CreateController extends Controller | ||||
|         if ((int) $request->get('bill_id') > 0) { | ||||
|             return redirect($this->getPreviousUrl('bills.create.url')); | ||||
|         } | ||||
|         if (true === $data['run_after_form']) { | ||||
|             return redirect(route('rules.select-transactions', [$rule->id])); | ||||
|         } | ||||
| 
 | ||||
|         $redirect = redirect($this->getPreviousUrl('rules.create.url')); | ||||
| 
 | ||||
|   | ||||
| @@ -205,6 +205,11 @@ class EditController extends Controller | ||||
|         session()->flash('success', (string) trans('firefly.updated_rule', ['title' => $rule->title])); | ||||
|         app('preferences')->mark(); | ||||
|         $redirect = redirect($this->getPreviousUrl('rules.edit.url')); | ||||
| 
 | ||||
|         if (true === $data['run_after_form']) { | ||||
|             return redirect(route('rules.select-transactions', [$rule->id])); | ||||
|         } | ||||
| 
 | ||||
|         if (1 === (int) $request->get('return_to_edit')) { | ||||
|             session()->put('rules.edit.fromUpdate', true); | ||||
| 
 | ||||
|   | ||||
| @@ -24,6 +24,7 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Http\Controllers\Rule; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Http\Requests\SelectTransactionsRequest; | ||||
| @@ -56,7 +57,7 @@ class SelectController extends Controller | ||||
| 
 | ||||
|         $this->middleware( | ||||
|             static function ($request, $next) { | ||||
|                 app('view')->share('title', (string) trans('firefly.rules')); | ||||
|                 app('view')->share('title', (string)trans('firefly.rules')); | ||||
|                 app('view')->share('mainTitleIcon', 'fa-random'); | ||||
| 
 | ||||
|                 return $next($request); | ||||
| @@ -73,11 +74,20 @@ class SelectController extends Controller | ||||
|         /** @var User $user */ | ||||
|         $user          = auth()->user(); | ||||
|         $accounts      = implode(',', $request->get('accounts')); | ||||
| 
 | ||||
|         // create new rule engine:
 | ||||
|         $newRuleEngine = app(RuleEngineInterface::class); | ||||
|         $newRuleEngine->setUser($user); | ||||
| 
 | ||||
|         // add date operators.
 | ||||
|         if (null !== $request->get('start')) { | ||||
|             $startDate = new Carbon($request->get('start')); | ||||
|             $newRuleEngine->addOperator(['type' => 'date_after', 'value' => $startDate->format('Y-m-d')]); | ||||
|         } | ||||
|         if (null !== $request->get('end')) { | ||||
|             $endDate = new Carbon($request->get('end')); | ||||
|             $newRuleEngine->addOperator(['type' => 'date_before', 'value' => $endDate->format('Y-m-d')]); | ||||
|         } | ||||
| 
 | ||||
|         // add extra operators:
 | ||||
|         $newRuleEngine->addOperator(['type' => 'account_id', 'value' => $accounts]); | ||||
| 
 | ||||
| @@ -102,7 +112,7 @@ class SelectController extends Controller | ||||
|             return redirect(route('rules.index')); | ||||
|         } | ||||
|         // does the user have shared accounts?
 | ||||
|         $subTitle = (string) trans('firefly.apply_rule_selection', ['title' => $rule->title]); | ||||
|         $subTitle = (string)trans('firefly.apply_rule_selection', ['title' => $rule->title]); | ||||
| 
 | ||||
|         return view('rules.rule.select-transactions', compact('rule', 'subTitle')); | ||||
|     } | ||||
| @@ -127,7 +137,7 @@ class SelectController extends Controller | ||||
| 
 | ||||
|         // warn if nothing.
 | ||||
|         if (0 === count($textTriggers)) { | ||||
|             return response()->json(['html' => '', 'warning' => (string) trans('firefly.warning_no_valid_triggers')]); | ||||
|             return response()->json(['html' => '', 'warning' => (string)trans('firefly.warning_no_valid_triggers')]); | ||||
|         } | ||||
| 
 | ||||
|         foreach ($textTriggers as $textTrigger) { | ||||
| @@ -160,7 +170,7 @@ class SelectController extends Controller | ||||
|         // Warn the user if only a subset of transactions is returned
 | ||||
|         $warning            = ''; | ||||
|         if (0 === count($collection)) { | ||||
|             $warning = (string) trans('firefly.warning_no_matching_transactions'); | ||||
|             $warning = (string)trans('firefly.warning_no_matching_transactions'); | ||||
|         } | ||||
| 
 | ||||
|         // Return json response
 | ||||
| @@ -190,7 +200,7 @@ class SelectController extends Controller | ||||
|         $triggers      = $rule->ruleTriggers; | ||||
| 
 | ||||
|         if (0 === count($triggers)) { | ||||
|             return response()->json(['html' => '', 'warning' => (string) trans('firefly.warning_no_valid_triggers')]); | ||||
|             return response()->json(['html' => '', 'warning' => (string)trans('firefly.warning_no_valid_triggers')]); | ||||
|         } | ||||
|         // create new rule engine:
 | ||||
|         $newRuleEngine = app(RuleEngineInterface::class); | ||||
| @@ -202,7 +212,7 @@ class SelectController extends Controller | ||||
| 
 | ||||
|         $warning       = ''; | ||||
|         if (0 === count($collection)) { | ||||
|             $warning = (string) trans('firefly.warning_no_matching_transactions'); | ||||
|             $warning = (string)trans('firefly.warning_no_matching_transactions'); | ||||
|         } | ||||
| 
 | ||||
|         // Return json response
 | ||||
|   | ||||
| @@ -24,6 +24,7 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Http\Controllers\RuleGroup; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use Exception; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Http\Requests\SelectTransactionsRequest; | ||||
| @@ -73,6 +74,16 @@ class ExecutionController extends Controller | ||||
|         $newRuleEngine = app(RuleEngineInterface::class); | ||||
|         $newRuleEngine->setUser($user); | ||||
| 
 | ||||
|         // add date operators.
 | ||||
|         if (null !== $request->get('start')) { | ||||
|             $startDate = new Carbon($request->get('start')); | ||||
|             $newRuleEngine->addOperator(['type' => 'date_after', 'value' => $startDate->format('Y-m-d')]); | ||||
|         } | ||||
|         if (null !== $request->get('end')) { | ||||
|             $endDate = new Carbon($request->get('end')); | ||||
|             $newRuleEngine->addOperator(['type' => 'date_before', 'value' => $endDate->format('Y-m-d')]); | ||||
|         } | ||||
| 
 | ||||
|         // add extra operators:
 | ||||
|         $newRuleEngine->addOperator(['type' => 'account_id', 'value' => $accounts]); | ||||
| 
 | ||||
|   | ||||
| @@ -34,6 +34,7 @@ use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Support\Facades\Artisan; | ||||
| use Illuminate\Support\Facades\Cache; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\View\View; | ||||
| use Laravel\Passport\Passport; | ||||
| use phpseclib3\Crypt\RSA; | ||||
| @@ -81,8 +82,10 @@ class InstallController extends Controller | ||||
|     public function index() | ||||
|     { | ||||
|         app('view')->share('FF_VERSION', config('firefly.version')); | ||||
| 
 | ||||
|         // index will set FF3 version.
 | ||||
|         FireflyConfig::set('ff3_version', (string) config('firefly.version')); | ||||
|         FireflyConfig::set('ff3_build_time', (int) config('firefly.build_time')); | ||||
| 
 | ||||
|         return view('install.index'); | ||||
|     } | ||||
| @@ -98,18 +101,18 @@ class InstallController extends Controller | ||||
|             'errorMessage'   => null, | ||||
|         ]; | ||||
| 
 | ||||
|         app('log')->debug(sprintf('Will now run commands. Request index is %d', $requestIndex)); | ||||
|         Log::debug(sprintf('Will now run commands. Request index is %d', $requestIndex)); | ||||
|         $indexes      = array_keys($this->upgradeCommands); | ||||
|         if (array_key_exists($requestIndex, $indexes)) { | ||||
|             $command                    = $indexes[$requestIndex]; | ||||
|             $parameters                 = $this->upgradeCommands[$command]; | ||||
|             app('log')->debug(sprintf('Will now execute command "%s" with parameters', $command), $parameters); | ||||
|             Log::debug(sprintf('Will now execute command "%s" with parameters', $command), $parameters); | ||||
| 
 | ||||
|             try { | ||||
|                 $result = $this->executeCommand($command, $parameters); | ||||
|             } catch (FireflyException $e) { | ||||
|                 app('log')->error($e->getMessage()); | ||||
|                 app('log')->error($e->getTraceAsString()); | ||||
|                 Log::error($e->getMessage()); | ||||
|                 Log::error($e->getTraceAsString()); | ||||
|                 if (str_contains($e->getMessage(), 'open_basedir restriction in effect')) { | ||||
|                     $this->lastError = self::BASEDIR_ERROR; | ||||
|                 } | ||||
| @@ -134,7 +137,7 @@ class InstallController extends Controller | ||||
|      */ | ||||
|     private function executeCommand(string $command, array $args): bool | ||||
|     { | ||||
|         app('log')->debug(sprintf('Will now call command %s with args.', $command), $args); | ||||
|         Log::debug(sprintf('Will now call command %s with args.', $command), $args); | ||||
| 
 | ||||
|         try { | ||||
|             if ('generate-keys' === $command) { | ||||
| @@ -142,7 +145,7 @@ class InstallController extends Controller | ||||
|             } | ||||
|             if ('generate-keys' !== $command) { | ||||
|                 Artisan::call($command, $args); | ||||
|                 app('log')->debug(Artisan::output()); | ||||
|                 Log::debug(Artisan::output()); | ||||
|             } | ||||
|         } catch (Exception $e) { // intentional generic exception
 | ||||
|             throw new FireflyException($e->getMessage(), 0, $e); | ||||
|   | ||||
| @@ -54,6 +54,7 @@ class RuleFormRequest extends FormRequest | ||||
|             'description'     => $this->stringWithNewlines('description'), | ||||
|             'stop_processing' => $this->boolean('stop_processing'), | ||||
|             'strict'          => $this->boolean('strict'), | ||||
|             'run_after_form'  => $this->boolean('run_after_form'), | ||||
|             'triggers'        => $this->getRuleTriggerData(), | ||||
|             'actions'         => $this->getRuleActionData(), | ||||
|         ]; | ||||
| @@ -140,16 +141,17 @@ class RuleFormRequest extends FormRequest | ||||
| 
 | ||||
|         // initial set of rules:
 | ||||
|         $rules           = [ | ||||
|             'title'            => 'required|min:1|max:255|uniqueObjectForUser:rules,title', | ||||
|             'description'      => 'min:1|max:32768|nullable', | ||||
|             'stop_processing'  => 'boolean', | ||||
|             'rule_group_id'    => 'required|belongsToUser:rule_groups', | ||||
|             'trigger'          => 'required|in:store-journal,update-journal,manual-activation', | ||||
|             'triggers.*.type'  => 'required|in:'.implode(',', $validTriggers), | ||||
|             'triggers.*.value' => sprintf('required_if:triggers.*.type,%s|max:1024|min:1|ruleTriggerValue', $contextTriggers), | ||||
|             'actions.*.type'   => 'required|in:'.implode(',', $validActions), | ||||
|             'actions.*.value'  => [sprintf('required_if:actions.*.type,%s|min:0|max:1024', $contextActions), new IsValidActionExpression(), 'ruleActionValue'], | ||||
|             'strict'           => 'in:0,1', | ||||
|             'title'                    => 'required|min:1|max:255|uniqueObjectForUser:rules,title', | ||||
|             'description'              => 'min:1|max:32768|nullable', | ||||
|             'stop_processing'          => 'boolean', | ||||
|             'rule_group_id'            => 'required|belongsToUser:rule_groups', | ||||
|             'trigger'                  => 'required|in:store-journal,update-journal,manual-activation', | ||||
|             'triggers.*.type'          => 'required|in:'.implode(',', $validTriggers), | ||||
|             'triggers.*.value'         => sprintf('required_if:triggers.*.type,%s|max:1024|min:1|ruleTriggerValue', $contextTriggers), | ||||
|             'actions.*.type'           => 'required|in:'.implode(',', $validActions), | ||||
|             'actions.*.value'          => [sprintf('required_if:actions.*.type,%s|min:0|max:1024', $contextActions), new IsValidActionExpression(), 'ruleActionValue'], | ||||
|             'strict'                   => 'in:0,1', | ||||
|             'run_after_form'           => 'in:0,1', | ||||
|         ]; | ||||
| 
 | ||||
|         /** @var null|Rule $rule */ | ||||
|   | ||||
| @@ -31,6 +31,8 @@ use Illuminate\Queue\InteractsWithQueue; | ||||
| use Illuminate\Queue\SerializesModels; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\Support\Facades\Mail; | ||||
| use Safe\Exceptions\FilesystemException; | ||||
| use Safe\Exceptions\JsonException; | ||||
| use Symfony\Component\Mailer\Exception\TransportException; | ||||
| 
 | ||||
| use function Safe\file_get_contents; | ||||
| @@ -54,7 +56,7 @@ class MailError extends Job implements ShouldQueue | ||||
|         $debug = $this->exception; | ||||
|         unset($debug['stackTrace'], $debug['headers']); | ||||
| 
 | ||||
|         app('log')->error(sprintf('Exception is: %s', json_encode($debug))); | ||||
|         Log::error(sprintf('Exception is: %s', json_encode($debug))); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -90,17 +92,17 @@ class MailError extends Job implements ShouldQueue | ||||
|             } catch (Exception|TransportException $e) { | ||||
|                 $message = $e->getMessage(); | ||||
|                 if (str_contains($message, 'Bcc')) { | ||||
|                     app('log')->warning('[Bcc] Could not email or log the error. Please validate your email settings, use the .env.example file as a guide.'); | ||||
|                     Log::warning('[Bcc] Could not email or log the error. Please validate your email settings, use the .env.example file as a guide.'); | ||||
| 
 | ||||
|                     return; | ||||
|                 } | ||||
|                 if (str_contains($message, 'RFC 2822')) { | ||||
|                     app('log')->warning('[RFC] Could not email or log the error. Please validate your email settings, use the .env.example file as a guide.'); | ||||
|                     Log::warning('[RFC] Could not email or log the error. Please validate your email settings, use the .env.example file as a guide.'); | ||||
| 
 | ||||
|                     return; | ||||
|                 } | ||||
|                 app('log')->error($e->getMessage()); | ||||
|                 app('log')->error($e->getTraceAsString()); | ||||
|                 Log::error($e->getMessage()); | ||||
|                 Log::error($e->getTraceAsString()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -125,11 +127,25 @@ class MailError extends Job implements ShouldQueue | ||||
| 
 | ||||
|         if (!file_exists($file)) { | ||||
|             Log::debug(sprintf('Wrote new file in "%s"', $file)); | ||||
|             file_put_contents($file, json_encode($limits, JSON_PRETTY_PRINT)); | ||||
| 
 | ||||
|             try { | ||||
|                 file_put_contents($file, json_encode($limits, JSON_PRETTY_PRINT)); | ||||
|             } catch (FilesystemException $e) { | ||||
|                 Log::warning(sprintf('[a] Could not write file "%s": %s', $file, $e->getMessage())); | ||||
|             } catch (JsonException $e) { | ||||
|                 Log::warning(sprintf('[b] Could not parse file "%s": %s', $file, $e->getMessage())); | ||||
|             } | ||||
|         } | ||||
|         if (file_exists($file)) { | ||||
|             Log::debug(sprintf('Read file in "%s"', $file)); | ||||
|             $limits = json_decode(file_get_contents($file), true); | ||||
| 
 | ||||
|             try { | ||||
|                 $limits = json_decode(file_get_contents($file), true); | ||||
|             } catch (FilesystemException $e) { | ||||
|                 Log::warning(sprintf('[c] Could not read file "%s": %s', $file, $e->getMessage())); | ||||
|             } catch (JsonException $e) { | ||||
|                 Log::warning(sprintf('[d] Could not parse file "%s": %s', $file, $e->getMessage())); | ||||
|             } | ||||
|         } | ||||
|         // limit reached?
 | ||||
|         foreach ($types as $type => $info) { | ||||
| @@ -157,7 +173,14 @@ class MailError extends Job implements ShouldQueue | ||||
|             } | ||||
|             ++$limits[$type]['sent']; | ||||
|         } | ||||
|         file_put_contents($file, json_encode($limits, JSON_PRETTY_PRINT)); | ||||
| 
 | ||||
|         try { | ||||
|             file_put_contents($file, json_encode($limits, JSON_PRETTY_PRINT)); | ||||
|         } catch (FilesystemException $e) { | ||||
|             Log::warning(sprintf('[c] Could not write file "%s": %s', $file, $e->getMessage())); | ||||
|         } catch (JsonException $e) { | ||||
|             Log::warning(sprintf('[c] Could not parse file "%s": %s', $file, $e->getMessage())); | ||||
|         } | ||||
|         Log::debug('No limits reached, return FALSE.'); | ||||
| 
 | ||||
|         return false; | ||||
|   | ||||
| @@ -263,6 +263,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte | ||||
|                 [ // @phpstan-ignore-line
 | ||||
|                     'rules'              => static function (HasMany $query): void { | ||||
|                         $query->orderBy('order', 'ASC'); | ||||
|                         $query->where('rules.active', true); | ||||
|                     }, | ||||
|                     'rules.ruleTriggers' => static function (HasMany $query): void { | ||||
|                         $query->orderBy('order', 'ASC'); | ||||
| @@ -319,6 +320,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte | ||||
|                 [ // @phpstan-ignore-line
 | ||||
|                     'rules'              => static function (HasMany $query): void { | ||||
|                         $query->orderBy('order', 'ASC'); | ||||
|                         $query->where('rules.active', true); | ||||
|                     }, | ||||
|                     'rules.ruleTriggers' => static function (HasMany $query): void { | ||||
|                         $query->orderBy('order', 'ASC'); | ||||
|   | ||||
							
								
								
									
										56
									
								
								app/Rules/Account/IsValidAccountTypeList.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								app/Rules/Account/IsValidAccountTypeList.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * IsValidAccountType.php | ||||
|  * Copyright (c) 2024 james@firefly-iii.org. | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see https://www.gnu.org/licenses/. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Rules\Account; | ||||
| 
 | ||||
| use Closure; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use Illuminate\Contracts\Validation\ValidationRule; | ||||
| use Override; | ||||
| 
 | ||||
| class IsValidAccountTypeList implements ValidationRule | ||||
| { | ||||
|     use AccountFilter; | ||||
| 
 | ||||
|     #[Override]
 | ||||
|     public function validate(string $attribute, mixed $value, Closure $fail): void | ||||
|     { | ||||
| 
 | ||||
|         // only check the type.
 | ||||
|         $values = []; | ||||
|         if (is_string($value)) { | ||||
|             $values = explode(',', $value); | ||||
|         } | ||||
|         if (!is_array($values)) { | ||||
|             $fail('validation.invalid_account_list')->translate(); | ||||
|         } | ||||
|         $keys   = array_keys($this->types); | ||||
|         foreach ($values as $entry) { | ||||
|             $entry = (string) $entry; | ||||
|             if (!in_array($entry, $keys, true)) { | ||||
|                 $fail('validation.invalid_account_list')->translate(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -38,6 +38,11 @@ class IsValidSortInstruction implements ValidationRule | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
|         if ('' === $value) { | ||||
|             // don't validate.
 | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
|         $validParameters = config(sprintf('firefly.allowed_sort_parameters.%s', $shortClass)); | ||||
|         if (!is_array($validParameters)) { | ||||
|             $fail('validation.no_sort_instructions')->translate(['object' => $shortClass]); | ||||
|   | ||||
| @@ -88,6 +88,7 @@ trait JournalServiceTrait | ||||
| 
 | ||||
|         // the account that Firefly III creates must be "creatable", aka select the one we can create from the list just in case
 | ||||
|         $creatableType = $this->getCreatableType($expectedTypes[$transactionType]); | ||||
|         Log::debug(sprintf('Creatable type is "%s"', $creatableType), $expectedTypes[$transactionType]); | ||||
| 
 | ||||
|         // if the result is NULL but the ID is set, an account could exist of the wrong type.
 | ||||
|         // that data can be used to create a new account of the right type.
 | ||||
| @@ -227,9 +228,11 @@ trait JournalServiceTrait | ||||
|         } | ||||
| 
 | ||||
|         // find by preferred type.
 | ||||
|         Log::debug('Find by preferred type.'); | ||||
|         $result = $this->accountRepository->findByName($data['name'], [$types[0]]); | ||||
| 
 | ||||
|         // or any expected type.
 | ||||
|         Log::debug('Find by any expected type.'); | ||||
|         $result ??= $this->accountRepository->findByName($data['name'], $types); | ||||
| 
 | ||||
|         if (null !== $result) { | ||||
|   | ||||
| @@ -163,6 +163,7 @@ class Amount | ||||
|      */ | ||||
|     public function formatFlat(string $symbol, int $decimalPlaces, string $amount, ?bool $coloured = null): string | ||||
|     { | ||||
|         $amount  = Steam::anonymous() ? '0' : $amount; | ||||
|         $locale  = Steam::getLocale(); | ||||
|         $rounded = Steam::bcround($amount, $decimalPlaces); | ||||
|         $coloured ??= true; | ||||
|   | ||||
| @@ -634,10 +634,10 @@ trait PeriodOverview | ||||
|             $currencySymbol                = $journal['currency_symbol']; | ||||
|             $currencyDecimalPlaces         = $journal['currency_decimal_places']; | ||||
|             $foreignCurrencyId             = $journal['foreign_currency_id']; | ||||
|             $amount                        = $journal['amount'] ?? '0'; | ||||
|             $amount                        = (string) ($journal['amount'] ?? '0'); | ||||
| 
 | ||||
|             if ($this->convertToPrimary && $currencyId !== $this->primaryCurrency->id && $foreignCurrencyId !== $this->primaryCurrency->id) { | ||||
|                 $amount                = $journal['pc_amount'] ?? '0'; | ||||
|                 $amount                = (string)  ($journal['pc_amount'] ?? '0'); | ||||
|                 $currencyId            = $this->primaryCurrency->id; | ||||
|                 $currencyCode          = $this->primaryCurrency->code; | ||||
|                 $currencyName          = $this->primaryCurrency->name; | ||||
| @@ -650,7 +650,7 @@ trait PeriodOverview | ||||
|                 $currencyName          = $journal['foreign_currency_name']; | ||||
|                 $currencySymbol        = $journal['foreign_currency_symbol']; | ||||
|                 $currencyDecimalPlaces = $journal['foreign_currency_decimal_places']; | ||||
|                 $amount                = $journal['foreign_amount'] ?? '0'; | ||||
|                 $amount                = (string) ($journal['foreign_amount'] ?? '0'); | ||||
|             } | ||||
|             $return[$currencyId] ??= [ | ||||
|                 'amount'                  => '0', | ||||
|   | ||||
| @@ -154,6 +154,9 @@ class BudgetLimitEnrichment implements EnrichmentInterface | ||||
|         $this->start       = $this->collection->min('start_date') ?? Carbon::now()->startOfMonth(); | ||||
|         $this->end         = $this->collection->max('end_date') ?? Carbon::now()->endOfMonth(); | ||||
| 
 | ||||
|         // #11096 make sure that the max end date is also at the end of the day,
 | ||||
|         $this->end->endOfDay(); | ||||
| 
 | ||||
|         /** @var BudgetLimit $limit */ | ||||
|         foreach ($this->collection as $limit) { | ||||
|             $id          = (int)$limit->id; | ||||
|   | ||||
| @@ -420,6 +420,7 @@ class Navigation | ||||
|             'week'     => (string)trans('config.week_in_year_js'), | ||||
|             'weekly'   => (string)trans('config.week_in_year_js'), | ||||
|             '1M'       => (string)trans('config.month_js'), | ||||
|             'MTD'      => (string)trans('config.month_js'), | ||||
|             'month'    => (string)trans('config.month_js'), | ||||
|             'monthly'  => (string)trans('config.month_js'), | ||||
|             '1Y'       => (string)trans('config.year_js'), | ||||
| @@ -427,6 +428,11 @@ class Navigation | ||||
|             'year'     => (string)trans('config.year_js'), | ||||
|             'yearly'   => (string)trans('config.year_js'), | ||||
|             '6M'       => (string)trans('config.half_year_js'), | ||||
|             'last7'    => (string)trans('config.specific_day_js'), | ||||
|             'last30'   => (string)trans('config.month_js'), | ||||
|             'last90'   => (string)trans('config.month_js'), | ||||
|             'last365'  => (string)trans('config.year_js'), | ||||
|             'QTD'      => (string)trans('config.month_js'), | ||||
|         ]; | ||||
| 
 | ||||
|         if (array_key_exists($repeatFrequency, $formatMap)) { | ||||
|   | ||||
| @@ -88,7 +88,7 @@ trait UserGroupTrait | ||||
|     public function setUserGroup(UserGroup $userGroup): void | ||||
|     { | ||||
|         if (null === $this->user) { | ||||
|             Log::warning(sprintf('User is not set in repository %s', static::class)); | ||||
|             Log::warning(sprintf('User is not set in repository %s. This does not have to be a problem.', static::class)); | ||||
|         } | ||||
|         $this->userGroup = $userGroup; | ||||
|     } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user