mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 18:54:58 +00:00 
			
		
		
		
	Compare commits
	
		
			116 Commits
		
	
	
		
			develop-20
			...
			develop-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | aaffc125e7 | ||
|  | 41a48c39a0 | ||
|  | 2d96bd84b5 | ||
|  | ad1c1d2254 | ||
|  | 813206766d | ||
|  | bb25d4a82a | ||
|  | f3b78beecc | ||
|  | 64073768fe | ||
|  | fe6dd0f901 | ||
|  | aac8d11ff6 | ||
|  | afa99a35b5 | ||
|  | e9cb0a51d7 | ||
|  | 9fbcccfd02 | ||
|  | 468c9c9d56 | ||
|  | f76b27a73d | ||
|  | 579fe81616 | ||
|  | ec9ba53690 | ||
|  | 85337c53d4 | ||
|  | eb6d585bb2 | ||
|  | 378ffbc609 | ||
|  | 3b3c8e5bcd | ||
|  | 75cbdb6a57 | ||
|  | cdaff0d983 | ||
|  | dda3863889 | ||
|  | 57dc423b3f | ||
|  | c0570bc3b2 | ||
|  | 65110d1666 | ||
|  | 5a10b29402 | ||
|  | 028544ca2e | ||
|  | af46729372 | ||
|  | 4c7789a668 | ||
|  | 292908048c | ||
|  | e300314e05 | ||
|  | 4f1f360346 | ||
|  | bff856aeff | ||
|  | 7f5a1bda8d | ||
|  | b506281bd6 | ||
|  | dfe9b3e787 | ||
|  | 2428a2a7c5 | ||
|  | 0e8f608e00 | ||
|  | 70071767ab | ||
|  | 0ad6beb66c | ||
|  | 1197f65589 | ||
|  | 7bbf2dcc6f | ||
|  | d4ab69ebe6 | ||
|  | c8c552602e | ||
|  | 1921a8050b | ||
|  | f488feda93 | ||
|  | d90c033b83 | ||
|  | 9f256253f2 | ||
|  | 489b7c12e5 | ||
|  | 1049a8314d | ||
|  | 48301b6b9c | ||
|  | 5a92215921 | ||
|  | ccfc75852a | ||
|  | 9804cffff3 | ||
|  | 901e113fef | ||
|  | a4021ff056 | ||
|  | 902d91ad29 | ||
|  | fa2cf22e73 | ||
|  | 970dad4c49 | ||
|  | 9d01c7bdb8 | ||
|  | dc7d4fb258 | ||
|  | a807ca5002 | ||
|  | d59d326841 | ||
|  | b915548e82 | ||
|  | 8200a81840 | ||
|  | 6a49918707 | ||
|  | e55fc483bd | ||
|  | 4ff5f5883d | ||
|  | eda2eae04a | ||
|  | c07c30ea17 | ||
|  | 56f1eb03e0 | ||
|  | d4e14dd262 | ||
|  | 0c7f04fb17 | ||
|  | 061c01da53 | ||
|  | 716d72d8af | ||
|  | 3233ca4a4c | ||
|  | 1041030b1e | ||
|  | bb3b06cf08 | ||
|  | f35e361915 | ||
|  | 47d697c7dc | ||
|  | 3745d79f1f | ||
|  | 04cbff4b9a | ||
|  | 0c2ca4b97c | ||
|  | 3918665cd1 | ||
|  | 9eb8869649 | ||
|  | 62221af591 | ||
|  | 4d013a44ce | ||
|  | c55cfd1acf | ||
|  | b2652b83ce | ||
|  | 3d28932216 | ||
|  | 87567d5a31 | ||
|  | 37d45f4f87 | ||
|  | 4acf0828e4 | ||
|  | b5bab53e7a | ||
|  | 60b0dc6279 | ||
|  | 883994de19 | ||
|  | 62d72516ba | ||
|  | cfb86c683e | ||
|  | 6278662014 | ||
|  | 65dcad6898 | ||
|  | 8e7bcbdd7b | ||
|  | 084ce02c21 | ||
|  | ea6addafe6 | ||
|  | da36d84b79 | ||
|  | d6d9f665c7 | ||
|  | 73d2621255 | ||
|  | 4299ba033c | ||
|  | 6007687bcc | ||
|  | 6d3f2bd5e7 | ||
|  | 210bd83bd4 | ||
|  | 65a926874b | ||
|  | d0e7681e56 | ||
|  | 33bde854ec | ||
|  | 166d4bd842 | 
| @@ -93,14 +93,14 @@ class AccountController extends Controller | ||||
|         /** @var Account $account */ | ||||
|         foreach ($result as $account) { | ||||
|             $nameWithBalance = $account->name; | ||||
|             $currency        = $this->repository->getAccountCurrency($account) ?? $this->nativeCurrency; | ||||
|             $currency        = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency; | ||||
|             $useCurrency     = $currency; | ||||
|             if (in_array($account->accountType->type, $this->balanceTypes, true)) { | ||||
|                 // this one is correct.
 | ||||
|                 Log::debug(sprintf('accounts: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); | ||||
|                 $balance         = Steam::finalAccountBalance($account, $date); | ||||
|                 $key             = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? 'native_balance' : 'balance'; | ||||
|                 $useCurrency     = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? $this->nativeCurrency : $currency; | ||||
|                 $key             = $this->convertToPrimary && $currency->id !== $this->primaryCurrency->id ? 'pc_balance' : 'balance'; | ||||
|                 $useCurrency     = $this->convertToPrimary && $currency->id !== $this->primaryCurrency->id ? $this->primaryCurrency : $currency; | ||||
|                 $amount          = $balance[$key] ?? '0'; | ||||
|                 $nameWithBalance = sprintf( | ||||
|                     '%s (%s)', | ||||
|   | ||||
| @@ -87,7 +87,7 @@ class AccountController extends Controller | ||||
|         // move date to end of day
 | ||||
|         $queryParameters['start']->startOfDay(); | ||||
|         $queryParameters['end']->endOfDay(); | ||||
|         Log::debug(sprintf('dashboard(), convert to native: %s', var_export($this->convertToNative, true))); | ||||
|         Log::debug(sprintf('dashboard(), convert to primary: %s', var_export($this->convertToPrimary, true))); | ||||
| 
 | ||||
|         // loop each account, and collect info:
 | ||||
|         /** @var Account $account */ | ||||
| @@ -105,17 +105,17 @@ class AccountController extends Controller | ||||
|     private function renderAccountData(array $params, Account $account): void | ||||
|     { | ||||
|         Log::debug(sprintf('Now in %s(array, #%d)', __METHOD__, $account->id)); | ||||
|         $currency       = $this->repository->getAccountCurrency($account); | ||||
|         $currentStart   = clone $params['start']; | ||||
|         $range          = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToNative); | ||||
|         $currency     = $this->repository->getAccountCurrency($account); | ||||
|         $currentStart = clone $params['start']; | ||||
|         $range        = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToPrimary); | ||||
| 
 | ||||
| 
 | ||||
|         $previous       = array_values($range)[0]['balance']; | ||||
|         $nativePrevious = null; | ||||
|         $previous     = array_values($range)[0]['balance']; | ||||
|         $pcPrevious   = null; | ||||
|         if (!$currency instanceof TransactionCurrency) { | ||||
|             $currency = $this->default; | ||||
|         } | ||||
|         $currentSet     = [ | ||||
|         $currentSet   = [ | ||||
|             'label'                   => $account->name, | ||||
| 
 | ||||
|             // the currency that belongs to the account.
 | ||||
| @@ -131,13 +131,13 @@ class AccountController extends Controller | ||||
|             'period'                  => '1D', | ||||
|             'entries'                 => [], | ||||
|         ]; | ||||
|         if ($this->convertToNative) { | ||||
|             $currentSet['native_entries']                 = []; | ||||
|             $currentSet['native_currency_id']             = (string)$this->nativeCurrency->id; | ||||
|             $currentSet['native_currency_code']           = $this->nativeCurrency->code; | ||||
|             $currentSet['native_currency_symbol']         = $this->nativeCurrency->symbol; | ||||
|             $currentSet['native_currency_decimal_places'] = $this->nativeCurrency->decimal_places; | ||||
|             $nativePrevious                               = array_values($range)[0]['native_balance']; | ||||
|         if ($this->convertToPrimary) { | ||||
|             $currentSet['pc_entries']                      = []; | ||||
|             $currentSet['primary_currency_id']             = (string)$this->primaryCurrency->id; | ||||
|             $currentSet['primary_currency_code']           = $this->primaryCurrency->code; | ||||
|             $currentSet['primary_currency_symbol']         = $this->primaryCurrency->symbol; | ||||
|             $currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places; | ||||
|             $pcPrevious                                    = array_values($range)[0]['pc_balance']; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| @@ -149,12 +149,12 @@ class AccountController extends Controller | ||||
|             $currentSet['entries'][$label] = $balance; | ||||
| 
 | ||||
| 
 | ||||
|             // do the same for the native balance, if relevant:
 | ||||
|             $nativeBalance                 = null; | ||||
|             if ($this->convertToNative) { | ||||
|                 $nativeBalance                        = array_key_exists($format, $range) ? $range[$format]['native_balance'] : $nativePrevious; | ||||
|                 $nativePrevious                       = $nativeBalance; | ||||
|                 $currentSet['native_entries'][$label] = $nativeBalance; | ||||
|             // do the same for the primary currency balance, if relevant:
 | ||||
|             $pcBalance                     = null; | ||||
|             if ($this->convertToPrimary) { | ||||
|                 $pcBalance                        = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious; | ||||
|                 $pcPrevious                       = $pcBalance; | ||||
|                 $currentSet['pc_entries'][$label] = $pcBalance; | ||||
|             } | ||||
| 
 | ||||
|             $currentStart->addDay(); | ||||
| @@ -191,12 +191,12 @@ class AccountController extends Controller | ||||
|         /** @var Account $account */ | ||||
|         foreach ($accounts as $account) { | ||||
|             Log::debug(sprintf('Rendering chart data for account %s (%d)', $account->name, $account->id)); | ||||
|             $currency       = $this->repository->getAccountCurrency($account) ?? $this->nativeCurrency; | ||||
|             $currentStart   = clone $start; | ||||
|             $range          = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToNative); | ||||
|             $previous       = array_values($range)[0]['balance']; | ||||
|             $nativePrevious = null; | ||||
|             $currentSet     = [ | ||||
|             $currency     = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency; | ||||
|             $currentStart = clone $start; | ||||
|             $range        = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToPrimary); | ||||
|             $previous     = array_values($range)[0]['balance']; | ||||
|             $pcPrevious   = null; | ||||
|             $currentSet   = [ | ||||
|                 'label'                   => $account->name, | ||||
|                 'currency_id'             => (string)$currency->id, | ||||
|                 'currency_code'           => $currency->code, | ||||
| @@ -209,18 +209,18 @@ class AccountController extends Controller | ||||
|                 'entries'                 => [], | ||||
|             ]; | ||||
| 
 | ||||
|             // add "native_entries" if convertToNative is true:
 | ||||
|             if ($this->convertToNative) { | ||||
|                 $currentSet['native_entries']                 = []; | ||||
|                 $currentSet['native_currency_id']             = (string)$this->nativeCurrency->id; | ||||
|                 $currentSet['native_currency_code']           = $this->nativeCurrency->code; | ||||
|                 $currentSet['native_currency_symbol']         = $this->nativeCurrency->symbol; | ||||
|                 $currentSet['native_currency_decimal_places'] = $this->nativeCurrency->decimal_places; | ||||
|                 $nativePrevious                               = array_values($range)[0]['native_balance']; | ||||
|             // add "pc_entries" if convertToPrimary is true:
 | ||||
|             if ($this->convertToPrimary) { | ||||
|                 $currentSet['pc_entries']                      = []; | ||||
|                 $currentSet['primary_currency_id']             = (string)$this->primaryCurrency->id; | ||||
|                 $currentSet['primary_currency_code']           = $this->primaryCurrency->code; | ||||
|                 $currentSet['primary_currency_symbol']         = $this->primaryCurrency->symbol; | ||||
|                 $currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places; | ||||
|                 $pcPrevious                                    = array_values($range)[0]['pc_balance']; | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|             // also get the native balance if convertToNative is true:
 | ||||
|             // also get the primary balance if convertToPrimary is true:
 | ||||
|             while ($currentStart <= $end) { | ||||
|                 $format                        = $currentStart->format('Y-m-d'); | ||||
|                 $label                         = $currentStart->toAtomString(); | ||||
| @@ -230,18 +230,18 @@ class AccountController extends Controller | ||||
|                 $previous                      = $balance; | ||||
|                 $currentSet['entries'][$label] = $balance; | ||||
| 
 | ||||
|                 // do the same for the native balance, if relevant:
 | ||||
|                 $nativeBalance                 = null; | ||||
|                 if ($this->convertToNative) { | ||||
|                     $nativeBalance                        = array_key_exists($format, $range) ? $range[$format]['native_balance'] : $nativePrevious; | ||||
|                     $nativePrevious                       = $nativeBalance; | ||||
|                     $currentSet['native_entries'][$label] = $nativeBalance; | ||||
|                 // do the same for the primary balance, if relevant:
 | ||||
|                 $pcBalance                     = null; | ||||
|                 if ($this->convertToPrimary) { | ||||
|                     $pcBalance                        = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious; | ||||
|                     $pcPrevious                       = $pcBalance; | ||||
|                     $currentSet['pc_entries'][$label] = $pcBalance; | ||||
|                 } | ||||
| 
 | ||||
|                 $currentStart->addDay(); | ||||
| 
 | ||||
|             } | ||||
|             $chartData[]    = $currentSet; | ||||
|             $chartData[]  = $currentSet; | ||||
|         } | ||||
| 
 | ||||
|         return response()->json($chartData); | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Generic\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| @@ -264,7 +264,7 @@ class BudgetController extends Controller | ||||
|             $compare                              = bccomp($limit->amount, (string)app('steam')->positive($result[$limitCurrencyId]['spent'])); | ||||
|             $result[$limitCurrencyId]['budgeted'] = $limit->amount; | ||||
|             if (1 === $compare) { | ||||
|                 // convert this amount into the native currency:
 | ||||
|                 // convert this amount into the primary currency:
 | ||||
|                 $result[$limitCurrencyId]['left'] = bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']); | ||||
|             } | ||||
|             if ($compare <= 0) { | ||||
| @@ -283,17 +283,17 @@ class BudgetController extends Controller | ||||
| 
 | ||||
|         /** @var BudgetLimit $current */ | ||||
|         foreach ($limits as $current) { | ||||
|             if (true === $this->convertToNative) { | ||||
|                 if ($current->transaction_currency_id === $this->nativeCurrency->id) { | ||||
|             if (true === $this->convertToPrimary) { | ||||
|                 if ($current->transaction_currency_id === $this->primaryCurrency->id) { | ||||
|                     // simply add it.
 | ||||
|                     $amount = bcadd($amount, (string)$current->amount); | ||||
|                     Log::debug(sprintf('Set amount in limit to %s', $amount)); | ||||
|                 } | ||||
|                 if ($current->transaction_currency_id !== $this->nativeCurrency->id) { | ||||
|                 if ($current->transaction_currency_id !== $this->primaryCurrency->id) { | ||||
|                     // convert and then add it.
 | ||||
|                     $converted = $converter->convert($current->transactionCurrency, $this->nativeCurrency, $limit->start_date, $limit->amount); | ||||
|                     $converted = $converter->convert($current->transactionCurrency, $this->primaryCurrency, $current->start_date, $current->amount); | ||||
|                     $amount    = bcadd($amount, $converted); | ||||
|                     Log::debug(sprintf('Budgeted in limit #%d: %s %s, converted to %s %s', $current->id, $current->transactionCurrency->code, $current->amount, $this->nativeCurrency->code, $converted)); | ||||
|                     Log::debug(sprintf('Budgeted in limit #%d: %s %s, converted to %s %s', $current->id, $current->transactionCurrency->code, $current->amount, $this->primaryCurrency->code, $converted)); | ||||
|                     Log::debug(sprintf('Set amount in limit to %s', $amount)); | ||||
|                 } | ||||
|             } | ||||
| @@ -301,7 +301,7 @@ class BudgetController extends Controller | ||||
|                 $limit = $current; | ||||
|             } | ||||
|         } | ||||
|         if (null !== $limit && true === $this->convertToNative) { | ||||
|         if (null !== $limit && true === $this->convertToPrimary) { | ||||
|             // convert and add all amounts.
 | ||||
|             $limit->amount = app('steam')->positive($amount); | ||||
|             Log::debug(sprintf('Final amount in limit with converted amount %s', $limit->amount)); | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | ||||
| use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| @@ -111,14 +111,14 @@ class CategoryController extends Controller | ||||
|             $amount                         = app('steam')->positive($journal['amount']); | ||||
| 
 | ||||
|             // overrule if necessary:
 | ||||
|             if ($this->convertToNative && $journalCurrencyId !== $this->nativeCurrency->id) { | ||||
|                 $currencyId            = (int)$this->nativeCurrency->id; | ||||
|                 $currencyName          = (string)$this->nativeCurrency->name; | ||||
|                 $currencyCode          = (string)$this->nativeCurrency->code; | ||||
|                 $currencySymbol        = (string)$this->nativeCurrency->symbol; | ||||
|                 $currencyDecimalPlaces = (int)$this->nativeCurrency->decimal_places; | ||||
|                 $convertedAmount       = $converter->convert($currency, $this->nativeCurrency, $journal['date'], $amount); | ||||
|                 Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->nativeCurrency->code, $convertedAmount)); | ||||
|             if ($this->convertToPrimary && $journalCurrencyId !== $this->primaryCurrency->id) { | ||||
|                 $currencyId            = (int)$this->primaryCurrency->id; | ||||
|                 $currencyName          = (string)$this->primaryCurrency->name; | ||||
|                 $currencyCode          = (string)$this->primaryCurrency->code; | ||||
|                 $currencySymbol        = (string)$this->primaryCurrency->symbol; | ||||
|                 $currencyDecimalPlaces = (int)$this->primaryCurrency->decimal_places; | ||||
|                 $convertedAmount       = $converter->convert($currency, $this->primaryCurrency, $journal['date'], $amount); | ||||
|                 Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->primaryCurrency->code, $convertedAmount)); | ||||
|                 $amount                = $convertedAmount; | ||||
|             } | ||||
| 
 | ||||
|   | ||||
| @@ -62,14 +62,14 @@ abstract class Controller extends BaseController | ||||
|     use ValidatesRequests; | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     protected const string CONTENT_TYPE            = 'application/vnd.api+json'; | ||||
|     protected const string JSON_CONTENT_TYPE       = 'application/json'; | ||||
|     protected array               $accepts         = ['application/json', 'application/vnd.api+json']; | ||||
|     protected const string CONTENT_TYPE             = 'application/vnd.api+json'; | ||||
|     protected const string JSON_CONTENT_TYPE        = 'application/json'; | ||||
|     protected array               $accepts          = ['application/json', 'application/vnd.api+json']; | ||||
| 
 | ||||
|     /** @var array<int, string> */ | ||||
|     protected array               $allowedSort; | ||||
|     protected bool                $convertToNative = false; | ||||
|     protected TransactionCurrency $nativeCurrency; | ||||
|     protected bool                $convertToPrimary = false; | ||||
|     protected TransactionCurrency $primaryCurrency; | ||||
|     protected ParameterBag        $parameters; | ||||
| 
 | ||||
|     /** | ||||
| @@ -83,9 +83,9 @@ abstract class Controller extends BaseController | ||||
|             function ($request, $next) { | ||||
|                 $this->parameters = $this->getParameters(); | ||||
|                 if (auth()->check()) { | ||||
|                     $language              = Steam::getLanguage(); | ||||
|                     $this->convertToNative = Amount::convertToNative(); | ||||
|                     $this->nativeCurrency  = Amount::getNativeCurrency(); | ||||
|                     $language               = Steam::getLanguage(); | ||||
|                     $this->convertToPrimary = Amount::convertToPrimary(); | ||||
|                     $this->primaryCurrency  = Amount::getPrimaryCurrency(); | ||||
|                     app()->setLocale($language); | ||||
|                 } | ||||
| 
 | ||||
|   | ||||
| @@ -65,13 +65,13 @@ class BillController extends Controller | ||||
|      */ | ||||
|     public function bill(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $bills           = $request->getBills(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $response        = []; | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $bills            = $request->getBills(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
|         $response         = []; | ||||
| 
 | ||||
|         // get all bills:
 | ||||
|         if (0 === $bills->count()) { | ||||
| @@ -79,25 +79,25 @@ class BillController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->setBills($bills); | ||||
| 
 | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $billId       = (int) $journal['bill_id']; | ||||
|             $currencyId   = (int) $journal['currency_id']; | ||||
|             $currencyCode = $journal['currency_code']; | ||||
|             $field        = 'amount'; | ||||
| 
 | ||||
|             // use the native amount if the user wants to convert to native currency
 | ||||
|             if ($convertToNative && $currencyId !== $default->id) { | ||||
|                 $currencyId   = $default->id; | ||||
|                 $currencyCode = $default->code; | ||||
|                 $field        = 'native_amount'; | ||||
|             // use the primary amount if the user wants to convert to primary currency
 | ||||
|             if ($convertToPrimary && $currencyId !== $primary->id) { | ||||
|                 $currencyId   = $primary->id; | ||||
|                 $currencyCode = $primary->code; | ||||
|                 $field        = 'pc_amount'; | ||||
|             } | ||||
|             // use foreign amount when the foreign currency IS the default currency.
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||
|                 $field = 'foreign_amount'; | ||||
|             } | ||||
|             Log::debug(sprintf('Journal #%d in bill #%d will use %s (%s %s)', $journal['transaction_group_id'], $billId, $field, $currencyCode, $journal[$field] ?? '0')); | ||||
| @@ -129,33 +129,33 @@ class BillController extends Controller | ||||
|      */ | ||||
|     public function noBill(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $response        = []; | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
|         $response         = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->withoutBill(); | ||||
| 
 | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId   = (int) $journal['currency_id']; | ||||
|             $currencyCode = $journal['currency_code']; | ||||
|             $field        = 'amount'; | ||||
| 
 | ||||
|             // use the native amount if the user wants to convert to native currency
 | ||||
|             if ($convertToNative && $currencyId !== $default->id) { | ||||
|                 $currencyId   = $default->id; | ||||
|                 $currencyCode = $default->code; | ||||
|                 $field        = 'native_amount'; | ||||
|             // use the primary amount if the user wants to convert to primary currency
 | ||||
|             if ($convertToPrimary && $currencyId !== $primary->id) { | ||||
|                 $currencyId   = $primary->id; | ||||
|                 $currencyCode = $primary->code; | ||||
|                 $field        = 'pc_amount'; | ||||
|             } | ||||
|             // use foreign amount when the foreign currency IS the default currency.
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||
|                 $field = 'foreign_amount'; | ||||
|             } | ||||
|             Log::debug(sprintf('Journal #%d will use %s (%s %s)', $journal['transaction_group_id'], $field, $currencyCode, $journal[$field] ?? '0')); | ||||
|   | ||||
| @@ -43,35 +43,35 @@ class PeriodController extends Controller | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $response        = []; | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $response         = []; | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type)
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             // same code as many other sumExpense methods. I think this needs some kind of generic method.
 | ||||
|             $amount                                    = '0'; | ||||
|             $currencyId                                = (int) $journal['currency_id']; | ||||
|             $currencyCode                              = $journal['currency_code']; | ||||
|             if ($convertToNative) { | ||||
|             if ($convertToPrimary) { | ||||
|                 $amount = Amount::getAmountFromJournal($journal); | ||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id !== (int) $journal['foreign_currency_id']) { | ||||
|                     $currencyId   = $default->id; | ||||
|                     $currencyCode = $default->code; | ||||
|                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id !== (int) $journal['foreign_currency_id']) { | ||||
|                     $currencyId   = $primary->id; | ||||
|                     $currencyCode = $primary->code; | ||||
|                 } | ||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id === (int) $journal['foreign_currency_id']) { | ||||
|                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id === (int) $journal['foreign_currency_id']) { | ||||
|                     $currencyId   = $journal['foreign_currency_id']; | ||||
|                     $currencyCode = $journal['foreign_currency_code']; | ||||
|                 } | ||||
|                 Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount)); | ||||
|             } | ||||
|             if (!$convertToNative) { | ||||
|             if (!$convertToPrimary) { | ||||
|                 // ignore the amount in foreign currency.
 | ||||
|                 Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount'])); | ||||
|                 $amount = $journal['amount']; | ||||
|   | ||||
| @@ -64,38 +64,38 @@ class TagController extends Controller | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $response        = []; | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $response         = []; | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
| 
 | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         foreach ($genericSet as $journal) { | ||||
|             // same code as many other sumExpense methods. I think this needs some kind of generic method.
 | ||||
|             $amount                                    = '0'; | ||||
|             $currencyId                                = (int) $journal['currency_id']; | ||||
|             $currencyCode                              = $journal['currency_code']; | ||||
|             if ($convertToNative) { | ||||
|             if ($convertToPrimary) { | ||||
|                 $amount = Amount::getAmountFromJournal($journal); | ||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id !== (int) $journal['foreign_currency_id']) { | ||||
|                     $currencyId   = $default->id; | ||||
|                     $currencyCode = $default->code; | ||||
|                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id !== (int) $journal['foreign_currency_id']) { | ||||
|                     $currencyId   = $primary->id; | ||||
|                     $currencyCode = $primary->code; | ||||
|                 } | ||||
|                 if ($default->id !== (int) $journal['currency_id'] && $default->id === (int) $journal['foreign_currency_id']) { | ||||
|                 if ($primary->id !== (int) $journal['currency_id'] && $primary->id === (int) $journal['foreign_currency_id']) { | ||||
|                     $currencyId   = $journal['foreign_currency_id']; | ||||
|                     $currencyCode = $journal['foreign_currency_code']; | ||||
|                 } | ||||
|                 Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount)); | ||||
|             } | ||||
|             if (!$convertToNative) { | ||||
|             if (!$convertToPrimary) { | ||||
|                 // ignore the amount in foreign currency.
 | ||||
|                 Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount'])); | ||||
|                 $amount = $journal['amount']; | ||||
|   | ||||
| @@ -42,30 +42,30 @@ class PeriodController extends Controller | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $response        = []; | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $response         = []; | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type)
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             // currency
 | ||||
|             $currencyId                                = $journal['currency_id']; | ||||
|             $currencyCode                              = $journal['currency_code']; | ||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; | ||||
|             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||
| 
 | ||||
|             // perhaps use default currency instead?
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { | ||||
|                 $currencyId   = $default->id; | ||||
|                 $currencyCode = $default->code; | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||
|                 $currencyId   = $primary->id; | ||||
|                 $currencyCode = $primary->code; | ||||
|             } | ||||
|             // use foreign amount when the foreign currency IS the default currency.
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||
|                 $field = 'foreign_amount'; | ||||
|             } | ||||
| 
 | ||||
|   | ||||
| @@ -64,33 +64,33 @@ class TagController extends Controller | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $response        = []; | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $response         = []; | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
| 
 | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         foreach ($genericSet as $journal) { | ||||
|             // currency
 | ||||
|             $currencyId                                = $journal['currency_id']; | ||||
|             $currencyCode                              = $journal['currency_code']; | ||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; | ||||
|             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||
| 
 | ||||
|             // perhaps use default currency instead?
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { | ||||
|                 $currencyId   = $default->id; | ||||
|                 $currencyCode = $default->code; | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||
|                 $currencyId   = $primary->id; | ||||
|                 $currencyCode = $primary->code; | ||||
|             } | ||||
|             // use foreign amount when the foreign currency IS the default currency.
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||
|                 $field = 'foreign_amount'; | ||||
|             } | ||||
| 
 | ||||
|   | ||||
| @@ -42,30 +42,30 @@ class PeriodController extends Controller | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $response        = []; | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $response         = []; | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type)
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
|             // currency
 | ||||
|             $currencyId                                = $journal['currency_id']; | ||||
|             $currencyCode                              = $journal['currency_code']; | ||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; | ||||
|             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||
| 
 | ||||
|             // perhaps use default currency instead?
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { | ||||
|                 $currencyId   = $default->id; | ||||
|                 $currencyCode = $default->code; | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||
|                 $currencyId   = $primary->id; | ||||
|                 $currencyCode = $primary->code; | ||||
|             } | ||||
|             // use foreign amount when the foreign currency IS the default currency.
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||
|                 $field = 'foreign_amount'; | ||||
|             } | ||||
| 
 | ||||
|   | ||||
| @@ -62,34 +62,34 @@ class TagController extends Controller | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts        = $request->getAssetAccounts(); | ||||
|         $start           = $request->getStart(); | ||||
|         $end             = $request->getEnd(); | ||||
|         $response        = []; | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $accounts         = $request->getAssetAccounts(); | ||||
|         $start            = $request->getStart(); | ||||
|         $end              = $request->getEnd(); | ||||
|         $response         = []; | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
| 
 | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
| 
 | ||||
|         $genericSet      = $collector->getExtractedJournals(); | ||||
|         $genericSet       = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         foreach ($genericSet as $journal) { | ||||
|             // currency
 | ||||
|             $currencyId                                = $journal['currency_id']; | ||||
|             $currencyCode                              = $journal['currency_code']; | ||||
|             $field                                     = $convertToNative && $currencyId !== $default->id ? 'native_amount' : 'amount'; | ||||
|             $field                                     = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; | ||||
| 
 | ||||
|             // perhaps use default currency instead?
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id) { | ||||
|                 $currencyId   = $default->id; | ||||
|                 $currencyCode = $default->code; | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { | ||||
|                 $currencyId   = $primary->id; | ||||
|                 $currencyCode = $primary->code; | ||||
|             } | ||||
|             // use foreign amount when the foreign currency IS the default currency.
 | ||||
|             if ($convertToNative && $journal['currency_id'] !== $default->id && $default->id === $journal['foreign_currency_id']) { | ||||
|             if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { | ||||
|                 $field = 'foreign_amount'; | ||||
|             } | ||||
| 
 | ||||
|   | ||||
| @@ -30,6 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| @@ -117,6 +118,13 @@ class ListController extends Controller | ||||
|         $count       = $collection->count(); | ||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $piggyBanks  = $enrichment->enrich($piggyBanks); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams()); | ||||
| @@ -125,7 +133,7 @@ class ListController extends Controller | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -96,8 +96,8 @@ class ShowController extends Controller | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $accounts    = $enrichment->enrich($accounts); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
| @@ -131,8 +131,8 @@ class ShowController extends Controller | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $account     = $enrichment->enrichSingle($account); | ||||
| 
 | ||||
| 
 | ||||
|   | ||||
| @@ -75,8 +75,8 @@ class StoreController extends Controller | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setDate(null); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $account     = $enrichment->enrichSingle($account); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|   | ||||
| @@ -80,8 +80,8 @@ class UpdateController extends Controller | ||||
|         /** @var User $admin */ | ||||
|         $admin        = auth()->user(); | ||||
|         $enrichment   = new AccountEnrichment(); | ||||
|         $enrichment->setDate(null); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $account      = $enrichment->enrichSingle($account); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\AvailableBudget; | ||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment; | ||||
| use FireflyIII\Transformers\AvailableBudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -75,7 +76,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize         = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         $start            = $this->parameters->get('start'); | ||||
|         $end              = $this->parameters->get('end'); | ||||
| 
 | ||||
| @@ -84,6 +84,13 @@ class ShowController extends Controller | ||||
|         $count            = $collection->count(); | ||||
|         $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin            = auth()->user(); | ||||
|         $enrichment       = new AvailableBudgetEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $availableBudgets = $enrichment->enrich($availableBudgets); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator        = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams()); | ||||
| @@ -106,13 +113,25 @@ class ShowController extends Controller | ||||
|      */ | ||||
|     public function show(AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
|         $manager         = $this->getManager(); | ||||
|         $start           = $this->parameters->get('start'); | ||||
|         $end             = $this->parameters->get('end'); | ||||
| 
 | ||||
|         /** @var AvailableBudgetTransformer $transformer */ | ||||
|         $transformer = app(AvailableBudgetTransformer::class); | ||||
|         $transformer     = app(AvailableBudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin           = auth()->user(); | ||||
|         $enrichment      = new AvailableBudgetEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setStart($start); | ||||
|         $enrichment->setEnd($end); | ||||
|         $availableBudget = $enrichment->enrichSingle($availableBudget); | ||||
| 
 | ||||
| 
 | ||||
|         $resource        = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -83,8 +83,6 @@ class ShowController extends Controller | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new SubscriptionEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setConvertToNative($this->convertToNative); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $bills       = $enrichment->enrich($bills); | ||||
| @@ -114,8 +112,6 @@ class ShowController extends Controller | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new SubscriptionEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setConvertToNative($this->convertToNative); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $bill        = $enrichment->enrichSingle($bill); | ||||
|   | ||||
| @@ -79,8 +79,6 @@ class StoreController extends Controller | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new SubscriptionEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setConvertToNative($this->convertToNative); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $bill        = $enrichment->enrichSingle($bill); | ||||
|   | ||||
| @@ -74,8 +74,6 @@ class UpdateController extends Controller | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new SubscriptionEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setConvertToNative($this->convertToNative); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $bill        = $enrichment->enrichSingle($bill); | ||||
|   | ||||
| @@ -32,6 +32,7 @@ use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| @@ -117,6 +118,14 @@ class ListController extends Controller | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]).$this->buildParams()); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin        = auth()->user(); | ||||
|         $enrichment   = new BudgetLimitEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||
| 
 | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer  = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -29,7 +29,9 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| @@ -82,6 +84,15 @@ class ShowController extends Controller | ||||
|         $count       = $collection->count(); | ||||
|         $budgets     = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new BudgetEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $budgets     = $enrichment->enrich($budgets); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.index').$this->buildParams()); | ||||
| @@ -103,6 +114,15 @@ class ShowController extends Controller | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new BudgetEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $budget      = $enrichment->enrichSingle($budget); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Budget\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -69,6 +71,13 @@ class StoreController extends Controller | ||||
|         $budget->refresh(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new BudgetEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budget      = $enrichment->enrichSingle($budget); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Budget\UpdateRequest; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -67,6 +69,13 @@ class UpdateController extends Controller | ||||
|         $budget      = $this->repository->update($budget, $data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new BudgetEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budget      = $enrichment->enrichSingle($budget); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -31,6 +31,7 @@ use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -84,6 +85,14 @@ class ShowController extends Controller | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams()); | ||||
| 
 | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin        = auth()->user(); | ||||
|         $enrichment   = new BudgetLimitEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer  = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| @@ -113,6 +122,13 @@ class ShowController extends Controller | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budget-limits.index').$this->buildParams()); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin        = auth()->user(); | ||||
|         $enrichment   = new BudgetLimitEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer  = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| @@ -137,6 +153,13 @@ class ShowController extends Controller | ||||
|         // continue!
 | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new BudgetLimitEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budgetLimit = $enrichment->enrichSingle($budgetLimit); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -74,6 +75,13 @@ class StoreController extends Controller | ||||
|         $budgetLimit        = $this->blRepository->store($data); | ||||
|         $manager            = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin              = auth()->user(); | ||||
|         $enrichment         = new BudgetLimitEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budgetLimit        = $enrichment->enrichSingle($budgetLimit); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer        = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -30,6 +30,7 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| @@ -80,6 +81,13 @@ class UpdateController extends Controller | ||||
|         $budgetLimit       = $this->blRepository->update($budgetLimit, $data); | ||||
|         $manager           = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin             = auth()->user(); | ||||
|         $enrichment        = new BudgetLimitEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budgetLimit       = $enrichment->enrich($budgetLimit); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer       = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| @@ -78,6 +80,15 @@ class ShowController extends Controller | ||||
|         $count       = $collection->count(); | ||||
|         $categories  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new CategoryEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $categories  = $enrichment->enrich($categories); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.index').$this->buildParams()); | ||||
| @@ -105,6 +116,15 @@ class ShowController extends Controller | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new CategoryEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $category    = $enrichment->enrichSingle($category); | ||||
| 
 | ||||
|         $resource    = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Category\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -72,6 +74,15 @@ class StoreController extends Controller | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new CategoryEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $category    = $enrichment->enrichSingle($category); | ||||
| 
 | ||||
|         $resource    = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Category\UpdateRequest; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -71,6 +73,15 @@ class UpdateController extends Controller | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new CategoryEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $category    = $enrichment->enrichSingle($category); | ||||
| 
 | ||||
|         $resource    = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -24,7 +24,8 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Transformers\ExchangeRateTransformer; | ||||
| @@ -39,7 +40,7 @@ class IndexController extends Controller | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     public const string RESOURCE_KEY = 'currency_exchange_rates'; | ||||
| 
 | ||||
|     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||
|     private ExchangeRateRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|   | ||||
| @@ -24,7 +24,8 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\CurrencyExchangeRate; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||
| @@ -41,7 +42,7 @@ class ShowController extends Controller | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     public const string RESOURCE_KEY = 'exchange-rates'; | ||||
| 
 | ||||
|     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||
|     private ExchangeRateRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|   | ||||
| @@ -24,9 +24,10 @@ declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||
| 
 | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\CurrencyExchangeRate; | ||||
| use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest; | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Transformers\ExchangeRateTransformer; | ||||
| @@ -37,7 +38,7 @@ class StoreController extends Controller | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     public const string RESOURCE_KEY = 'exchange-rates'; | ||||
| 
 | ||||
|     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||
|     private ExchangeRateRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|   | ||||
| @@ -25,7 +25,8 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; | ||||
| 
 | ||||
| use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest; | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\CurrencyExchangeRate; | ||||
| use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| @@ -37,7 +38,7 @@ class UpdateController extends Controller | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     public const string RESOURCE_KEY = 'exchange-rates'; | ||||
| 
 | ||||
|     protected array $acceptedRoles   = [UserRoleEnum::OWNER]; | ||||
|     private ExchangeRateRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\ObjectGroup; | ||||
| use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| @@ -85,8 +86,6 @@ class ListController extends Controller | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new SubscriptionEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setConvertToNative($this->convertToNative); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $bills       = $enrichment->enrich($bills); | ||||
| @@ -126,6 +125,13 @@ class ListController extends Controller | ||||
|         $count       = $collection->count(); | ||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $piggyBanks  = $enrichment->enrich($piggyBanks); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.object-groups.piggy-banks', [$objectGroup->id]).$this->buildParams()); | ||||
| @@ -134,7 +140,7 @@ class ListController extends Controller | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEventEnrichment; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankEventTransformer; | ||||
| @@ -83,8 +84,8 @@ class ListController extends Controller | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $accounts    = $enrichment->enrich($accounts); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
| @@ -148,6 +149,13 @@ class ListController extends Controller | ||||
|         $count       = $collection->count(); | ||||
|         $events      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEventEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $events      = $enrichment->enrich($events); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.piggy-banks.events', [$piggyBank->id]).$this->buildParams()); | ||||
| @@ -156,7 +164,7 @@ class ListController extends Controller | ||||
|         $transformer = app(PiggyBankEventTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new FractalCollection($events, $transformer, 'piggy_bank_events'); | ||||
|         $resource    = new FractalCollection($events, $transformer, sprintf('piggy-banks/%d/events', $piggyBank->id)); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| @@ -77,6 +79,13 @@ class ShowController extends Controller | ||||
|         $count       = $collection->count(); | ||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $piggyBanks  = $enrichment->enrich($piggyBanks); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.piggy-banks.index').$this->buildParams()); | ||||
| @@ -85,7 +94,7 @@ class ShowController extends Controller | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -101,11 +110,19 @@ class ShowController extends Controller | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $piggyBank   = $enrichment->enrichSingle($piggyBank); | ||||
| 
 | ||||
| 
 | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new Item($piggyBank, $transformer, 'piggy_banks'); | ||||
|         $resource    = new Item($piggyBank, $transformer, 'piggy-banks'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\PiggyBank\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -68,6 +70,13 @@ class StoreController extends Controller | ||||
|         $piggyBank   = $this->repository->store($request->getAll()); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $piggyBank   = $enrichment->enrichSingle($piggyBank); | ||||
| 
 | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\PiggyBank\UpdateRequest; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -70,13 +72,20 @@ class UpdateController extends Controller | ||||
|             $this->repository->setCurrentAmount($piggyBank, $data['current_amount']); | ||||
|         } | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $piggyBank   = $enrichment->enrichSingle($piggyBank); | ||||
| 
 | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new Item($piggyBank, $transformer, 'piggy_banks'); | ||||
|         $resource    = new Item($piggyBank, $transformer, 'piggy-banks'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||
| use FireflyIII\Transformers\RecurrenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| @@ -76,17 +78,24 @@ class ShowController extends Controller | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection  = $this->repository->get(); | ||||
|         $count       = $collection->count(); | ||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $recurrences = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new RecurringEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $recurrences = $enrichment->enrich($recurrences); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator   = new LengthAwarePaginator($recurrences, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.recurrences.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'recurrences'); | ||||
|         $resource    = new FractalCollection($recurrences, $transformer, 'recurrences'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -102,6 +111,13 @@ class ShowController extends Controller | ||||
|     { | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new RecurringEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $recurrence  = $enrichment->enrichSingle($recurrence); | ||||
| 
 | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Recurrence\StoreRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||
| use FireflyIII\Transformers\RecurrenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -69,6 +71,13 @@ class StoreController extends Controller | ||||
|         $recurrence  = $this->repository->store($data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new RecurringEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $recurrence  = $enrichment->enrichSingle($recurrence); | ||||
| 
 | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Models\Recurrence\UpdateRequest; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||
| use FireflyIII\Transformers\RecurrenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use League\Fractal\Resource\Item; | ||||
| 
 | ||||
| @@ -67,6 +69,13 @@ class UpdateController extends Controller | ||||
|         $recurrence  = $this->repository->update($recurrence, $data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new RecurringEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $recurrence  = $enrichment->enrichSingle($recurrence); | ||||
| 
 | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|   | ||||
| @@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEventEnrichment; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\Transformers\PiggyBankEventTransformer; | ||||
| use FireflyIII\Transformers\TransactionLinkTransformer; | ||||
| @@ -113,6 +114,14 @@ class ListController extends Controller | ||||
|         } | ||||
|         $count       = $collection->count(); | ||||
|         $events      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new PiggyBankEventEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $events      = $enrichment->enrich($events); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator   = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.transactions.piggy-bank-events', [$transactionGroup->id]).$this->buildParams()); | ||||
|   | ||||
| @@ -43,6 +43,8 @@ use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; | ||||
| use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| @@ -107,8 +109,8 @@ class ListController extends Controller | ||||
|         /** @var User $admin */ | ||||
|         $admin             = auth()->user(); | ||||
|         $enrichment        = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $accounts          = $enrichment->enrich($accounts); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
| @@ -188,8 +190,6 @@ class ListController extends Controller | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new SubscriptionEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setConvertToNative($this->convertToNative); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $enrichment->setStart($this->parameters->get('start')); | ||||
|         $enrichment->setEnd($this->parameters->get('end')); | ||||
|         $bills       = $enrichment->enrichSingle($bills); | ||||
| @@ -229,6 +229,13 @@ class ListController extends Controller | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.currencies.budget-limits', [$currency->code]).$this->buildParams()); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin        = auth()->user(); | ||||
|         $enrichment   = new BudgetLimitEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $budgetLimits = $enrichment->enrich($budgetLimits); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer  = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| @@ -270,17 +277,24 @@ class ListController extends Controller | ||||
|             } | ||||
|         ); | ||||
|         $count          = $collection->count(); | ||||
|         $piggyBanks     = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $recurrences    = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // enrich
 | ||||
|         /** @var User $admin */ | ||||
|         $admin          = auth()->user(); | ||||
|         $enrichment     = new RecurringEnrichment(); | ||||
|         $enrichment->setUser($admin); | ||||
|         $recurrences    = $enrichment->enrich($recurrences); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator      = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator      = new LengthAwarePaginator($recurrences, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.currencies.recurrences', [$currency->code]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var RecurrenceTransformer $transformer */ | ||||
|         $transformer    = app(RecurrenceTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource       = new FractalCollection($piggyBanks, $transformer, 'recurrences'); | ||||
|         $resource       = new FractalCollection($recurrences, $transformer, 'recurrences'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -107,7 +107,7 @@ class ShowController extends Controller | ||||
|         /** @var User $user */ | ||||
|         $user        = auth()->user(); | ||||
|         $manager     = $this->getManager(); | ||||
|         $this->parameters->set('nativeCurrency', $this->nativeCurrency); | ||||
|         $this->parameters->set('primaryCurrency', $this->primaryCurrency); | ||||
| 
 | ||||
|         // update fields with user info.
 | ||||
|         $currency->refreshForUser($user); | ||||
| @@ -122,9 +122,6 @@ class ShowController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/getNativeCurrency
 | ||||
|      * | ||||
|      * Show a currency. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
| @@ -134,7 +131,7 @@ class ShowController extends Controller | ||||
|         /** @var User $user */ | ||||
|         $user        = auth()->user(); | ||||
|         $manager     = $this->getManager(); | ||||
|         $currency    = $this->nativeCurrency; | ||||
|         $currency    = $this->primaryCurrency; | ||||
| 
 | ||||
|         // update fields with user info.
 | ||||
|         $currency->refreshForUser($user); | ||||
|   | ||||
| @@ -99,11 +99,6 @@ class UpdateController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/currencies/nativeCurrency
 | ||||
|      * | ||||
|      * Make the currency a default currency. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function makeDefault(TransactionCurrency $currency): JsonResponse | ||||
|   | ||||
| @@ -88,8 +88,8 @@ class AccountController extends Controller | ||||
|         /** @var User $admin */ | ||||
|         $admin       = auth()->user(); | ||||
|         $enrichment  = new AccountEnrichment(); | ||||
|         $enrichment->setDate($this->parameters->get('date')); | ||||
|         $enrichment->setUser($admin); | ||||
|         $enrichment->setNative($this->nativeCurrency); | ||||
|         $accounts    = $enrichment->enrich($accounts); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|   | ||||
| @@ -127,56 +127,56 @@ class BasicController extends Controller | ||||
|     { | ||||
|         Log::debug('getBalanceInformation'); | ||||
|         // some config settings
 | ||||
|         $convertToNative = Amount::convertToNative(); | ||||
|         $default         = Amount::getNativeCurrency(); | ||||
|         $convertToPrimary = Amount::convertToPrimary(); | ||||
|         $primary          = Amount::getPrimaryCurrency(); | ||||
|         // prep some arrays:
 | ||||
|         $sums            = []; | ||||
|         $return          = []; | ||||
|         $currencies      = [ | ||||
|             $default->id => $default, | ||||
|         $sums             = []; | ||||
|         $return           = []; | ||||
|         $currencies       = [ | ||||
|             $primary->id => $primary, | ||||
|         ]; | ||||
| 
 | ||||
|         // collect income of user using the new group collector.
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $summarizer      = new TransactionSummarizer(); | ||||
|         $set             = $collector->setRange($start, $end)->setTypes([TransactionTypeEnum::DEPOSIT->value])->getExtractedJournals(); | ||||
|         $incomes         = $summarizer->groupByCurrencyId($set, 'positive', false); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $summarizer       = new TransactionSummarizer(); | ||||
|         $set              = $collector->setRange($start, $end)->setTypes([TransactionTypeEnum::DEPOSIT->value])->getExtractedJournals(); | ||||
|         $incomes          = $summarizer->groupByCurrencyId($set, 'positive', false); | ||||
| 
 | ||||
| 
 | ||||
|         // collect expenses of user.
 | ||||
|         // collect expenses of user using the new group collector.
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector       = app(GroupCollectorInterface::class); | ||||
|         $set             = $collector->setRange($start, $end)->setPage($this->parameters->get('page'))->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->getExtractedJournals(); | ||||
|         $expenses        = $summarizer->groupByCurrencyId($set, 'negative', false); | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $set              = $collector->setRange($start, $end)->setPage($this->parameters->get('page'))->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->getExtractedJournals(); | ||||
|         $expenses         = $summarizer->groupByCurrencyId($set, 'negative', false); | ||||
| 
 | ||||
|         // if convert to native, do so right now.
 | ||||
|         if ($convertToNative) { | ||||
|         // if convert to primary, do so right now.
 | ||||
|         if ($convertToPrimary) { | ||||
|             $newExpenses = [ | ||||
|                 $default->id => [ | ||||
|                     'currency_id'             => $default->id, | ||||
|                     'currency_code'           => $default->code, | ||||
|                     'currency_symbol'         => $default->symbol, | ||||
|                     'currency_decimal_places' => $default->decimal_places, | ||||
|                 $primary->id => [ | ||||
|                     'currency_id'             => $primary->id, | ||||
|                     'currency_code'           => $primary->code, | ||||
|                     'currency_symbol'         => $primary->symbol, | ||||
|                     'currency_decimal_places' => $primary->decimal_places, | ||||
|                     'sum'                     => '0', | ||||
|                 ], | ||||
|             ]; | ||||
|             $newIncomes  = [ | ||||
|                 $default->id => [ | ||||
|                     'currency_id'             => $default->id, | ||||
|                     'currency_code'           => $default->code, | ||||
|                     'currency_symbol'         => $default->symbol, | ||||
|                     'currency_decimal_places' => $default->decimal_places, | ||||
|                 $primary->id => [ | ||||
|                     'currency_id'             => $primary->id, | ||||
|                     'currency_code'           => $primary->code, | ||||
|                     'currency_symbol'         => $primary->symbol, | ||||
|                     'currency_decimal_places' => $primary->decimal_places, | ||||
|                     'sum'                     => '0', | ||||
|                 ], | ||||
|             ]; | ||||
|             $sums        = [ | ||||
|                 $default->id => [ | ||||
|                     'currency_id'             => $default->id, | ||||
|                     'currency_code'           => $default->code, | ||||
|                     'currency_symbol'         => $default->symbol, | ||||
|                     'currency_decimal_places' => $default->decimal_places, | ||||
|                 $primary->id => [ | ||||
|                     'currency_id'             => $primary->id, | ||||
|                     'currency_code'           => $primary->code, | ||||
|                     'currency_symbol'         => $primary->symbol, | ||||
|                     'currency_decimal_places' => $primary->decimal_places, | ||||
|                     'sum'                     => '0', | ||||
|                 ], | ||||
|             ]; | ||||
| @@ -188,36 +188,36 @@ class BasicController extends Controller | ||||
|                 // loop over either one.
 | ||||
|                 foreach ($array as $entry) { | ||||
| 
 | ||||
|                     // if it is the native currency already.
 | ||||
|                     if ($entry['currency_id'] === $default->id) { | ||||
|                         $sums[$default->id]['sum'] = bcadd((string) $entry['sum'], $sums[$default->id]['sum']); | ||||
|                     // if it is the primary currency already.
 | ||||
|                     if ($entry['currency_id'] === $primary->id) { | ||||
|                         $sums[$primary->id]['sum'] = bcadd((string) $entry['sum'], $sums[$primary->id]['sum']); | ||||
| 
 | ||||
|                         // don't forget to add it to newExpenses and newIncome
 | ||||
|                         if (0 === $index) { | ||||
|                             $newExpenses[$default->id]['sum'] = bcadd($newExpenses[$default->id]['sum'], (string) $entry['sum']); | ||||
|                             $newExpenses[$primary->id]['sum'] = bcadd($newExpenses[$primary->id]['sum'], (string) $entry['sum']); | ||||
|                         } | ||||
|                         if (1 === $index) { | ||||
|                             $newIncomes[$default->id]['sum'] = bcadd($newIncomes[$default->id]['sum'], (string) $entry['sum']); | ||||
|                             $newIncomes[$primary->id]['sum'] = bcadd($newIncomes[$primary->id]['sum'], (string) $entry['sum']); | ||||
|                         } | ||||
| 
 | ||||
|                         continue; | ||||
|                     } | ||||
| 
 | ||||
|                     $currencies[$entry['currency_id']] ??= $this->currencyRepos->find($entry['currency_id']); | ||||
|                     $convertedSum              = $converter->convert($currencies[$entry['currency_id']], $default, $start, $entry['sum']); | ||||
|                     $sums[$default->id]['sum'] = bcadd($sums[$default->id]['sum'], $convertedSum); | ||||
|                     $convertedSum              = $converter->convert($currencies[$entry['currency_id']], $primary, $start, $entry['sum']); | ||||
|                     $sums[$primary->id]['sum'] = bcadd($sums[$primary->id]['sum'], $convertedSum); | ||||
|                     if (0 === $index) { | ||||
|                         $newExpenses[$default->id]['sum'] = bcadd($newExpenses[$default->id]['sum'], $convertedSum); | ||||
|                         $newExpenses[$primary->id]['sum'] = bcadd($newExpenses[$primary->id]['sum'], $convertedSum); | ||||
|                     } | ||||
|                     if (1 === $index) { | ||||
|                         $newIncomes[$default->id]['sum'] = bcadd($newIncomes[$default->id]['sum'], $convertedSum); | ||||
|                         $newIncomes[$primary->id]['sum'] = bcadd($newIncomes[$primary->id]['sum'], $convertedSum); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             $incomes     = $newIncomes; | ||||
|             $expenses    = $newExpenses; | ||||
|         } | ||||
|         if (!$convertToNative) { | ||||
|         if (!$convertToPrimary) { | ||||
|             foreach ([$expenses, $incomes] as $array) { | ||||
|                 foreach ($array as $entry) { | ||||
|                     $currencyId               = $entry['currency_id']; | ||||
| @@ -233,7 +233,7 @@ class BasicController extends Controller | ||||
|             } | ||||
|         } | ||||
|         // format amounts:
 | ||||
|         $keys            = array_keys($sums); | ||||
|         $keys             = array_keys($sums); | ||||
|         foreach ($keys as $currencyId) { | ||||
|             $currency = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); | ||||
|             if (null === $currency) { | ||||
| @@ -248,10 +248,10 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, $sums[$currencyId]['sum'] ?? '0', false), | ||||
|                 'value_parsed'            => Amount::formatAnything($currency, $sums[$currencyId]['sum'] ?? '0', false), | ||||
|                 'local_icon'              => 'balance-scale', | ||||
|                 'sub_title'               => app('amount')->formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false) | ||||
|                                              .' + '.app('amount')->formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), | ||||
|                 'sub_title'               => Amount::formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false) | ||||
|                                              .' + '.Amount::formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), | ||||
|             ]; | ||||
|             $return[] = [ | ||||
|                 'key'                     => sprintf('spent-in-%s', $currency->code), | ||||
| @@ -261,7 +261,7 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false), | ||||
|                 'value_parsed'            => Amount::formatAnything($currency, $expenses[$currencyId]['sum'] ?? '0', false), | ||||
|                 'local_icon'              => 'balance-scale', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
| @@ -273,13 +273,13 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), | ||||
|                 'value_parsed'            => Amount::formatAnything($currency, $incomes[$currencyId]['sum'] ?? '0', false), | ||||
|                 'local_icon'              => 'balance-scale', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
|         } | ||||
|         if (0 === count($return)) { | ||||
|             $currency = $this->nativeCurrency; | ||||
|             $currency = $this->primaryCurrency; | ||||
|             // create objects for big array.
 | ||||
|             $return[] = [ | ||||
|                 'key'                     => sprintf('balance-in-%s', $currency->code), | ||||
| @@ -289,10 +289,10 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, '0', false), | ||||
|                 'value_parsed'            => Amount::formatAnything($currency, '0', false), | ||||
|                 'local_icon'              => 'balance-scale', | ||||
|                 'sub_title'               => app('amount')->formatAnything($currency, '0', false) | ||||
|                                              .' + '.app('amount')->formatAnything($currency, '0', false), | ||||
|                 'sub_title'               => Amount::formatAnything($currency, '0', false) | ||||
|                                              .' + '.Amount::formatAnything($currency, '0', false), | ||||
|             ]; | ||||
|             $return[] = [ | ||||
|                 'key'                     => sprintf('spent-in-%s', $currency->code), | ||||
| @@ -302,7 +302,7 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, '0', false), | ||||
|                 'value_parsed'            => Amount::formatAnything($currency, '0', false), | ||||
|                 'local_icon'              => 'balance-scale', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
| @@ -314,7 +314,7 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatAnything($currency, '0', false), | ||||
|                 'value_parsed'            => Amount::formatAnything($currency, '0', false), | ||||
|                 'local_icon'              => 'balance-scale', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
| @@ -333,26 +333,26 @@ class BasicController extends Controller | ||||
|         $paidAmount   = $this->billRepository->sumPaidInRange($start, $end); | ||||
|         $unpaidAmount = $this->billRepository->sumUnpaidInRange($start, $end); | ||||
|         $currencies   = [ | ||||
|             $this->nativeCurrency->id => $this->nativeCurrency, | ||||
|             $this->primaryCurrency->id => $this->primaryCurrency, | ||||
|         ]; | ||||
| 
 | ||||
|         if ($this->convertToNative) { | ||||
|         if ($this->convertToPrimary) { | ||||
|             $converter       = new ExchangeRateConverter(); | ||||
|             $newPaidAmount   = [[ | ||||
|                 'id'             => $this->nativeCurrency->id, | ||||
|                 'name'           => $this->nativeCurrency->name, | ||||
|                 'symbol'         => $this->nativeCurrency->symbol, | ||||
|                 'code'           => $this->nativeCurrency->code, | ||||
|                 'decimal_places' => $this->nativeCurrency->decimal_places, | ||||
|                 'id'             => $this->primaryCurrency->id, | ||||
|                 'name'           => $this->primaryCurrency->name, | ||||
|                 'symbol'         => $this->primaryCurrency->symbol, | ||||
|                 'code'           => $this->primaryCurrency->code, | ||||
|                 'decimal_places' => $this->primaryCurrency->decimal_places, | ||||
|                 'sum'            => '0', | ||||
|             ]]; | ||||
| 
 | ||||
|             $newUnpaidAmount = [[ | ||||
|                 'id'             => $this->nativeCurrency->id, | ||||
|                 'name'           => $this->nativeCurrency->name, | ||||
|                 'symbol'         => $this->nativeCurrency->symbol, | ||||
|                 'code'           => $this->nativeCurrency->code, | ||||
|                 'decimal_places' => $this->nativeCurrency->decimal_places, | ||||
|                 'id'             => $this->primaryCurrency->id, | ||||
|                 'name'           => $this->primaryCurrency->name, | ||||
|                 'symbol'         => $this->primaryCurrency->symbol, | ||||
|                 'code'           => $this->primaryCurrency->code, | ||||
|                 'decimal_places' => $this->primaryCurrency->decimal_places, | ||||
|                 'sum'            => '0', | ||||
|             ]]; | ||||
|             foreach ([$paidAmount, $unpaidAmount] as $index => $array) { | ||||
| @@ -360,25 +360,25 @@ class BasicController extends Controller | ||||
|                     $currencyId                = (int) $item['id']; | ||||
|                     if (0 === $index) { | ||||
|                         // paid amount
 | ||||
|                         if ($currencyId === $this->nativeCurrency->id) { | ||||
|                         if ($currencyId === $this->primaryCurrency->id) { | ||||
|                             $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], (string) $item['sum']); | ||||
| 
 | ||||
|                             continue; | ||||
|                         } | ||||
|                         $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); | ||||
|                         $convertedAmount         = $converter->convert($currencies[$currencyId], $this->nativeCurrency, $start, $item['sum']); | ||||
|                         $convertedAmount         = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $item['sum']); | ||||
|                         $newPaidAmount[0]['sum'] = bcadd($newPaidAmount[0]['sum'], $convertedAmount); | ||||
| 
 | ||||
|                         continue; | ||||
|                     } | ||||
|                     // unpaid amount
 | ||||
|                     if ($currencyId === $this->nativeCurrency->id) { | ||||
|                     if ($currencyId === $this->primaryCurrency->id) { | ||||
|                         $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], (string) $item['sum']); | ||||
| 
 | ||||
|                         continue; | ||||
|                     } | ||||
|                     $currencies[$currencyId] ??= $this->currencyRepos->find($currencyId); | ||||
|                     $convertedAmount           = $converter->convert($currencies[$currencyId], $this->nativeCurrency, $start, $item['sum']); | ||||
|                     $convertedAmount           = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $item['sum']); | ||||
|                     $newUnpaidAmount[0]['sum'] = bcadd($newUnpaidAmount[0]['sum'], $convertedAmount); | ||||
|                 } | ||||
|             } | ||||
| @@ -405,7 +405,7 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $info['code'], | ||||
|                 'currency_symbol'         => $info['symbol'], | ||||
|                 'currency_decimal_places' => $info['decimal_places'], | ||||
|                 'value_parsed'            => app('amount')->formatFlat($info['symbol'], $info['decimal_places'], $amount, false), | ||||
|                 'value_parsed'            => Amount::formatFlat($info['symbol'], $info['decimal_places'], $amount, false), | ||||
|                 'local_icon'              => 'check', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
| @@ -424,7 +424,7 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $info['code'], | ||||
|                 'currency_symbol'         => $info['symbol'], | ||||
|                 'currency_decimal_places' => $info['decimal_places'], | ||||
|                 'value_parsed'            => app('amount')->formatFlat($info['symbol'], $info['decimal_places'], $amount, false), | ||||
|                 'value_parsed'            => Amount::formatFlat($info['symbol'], $info['decimal_places'], $amount, false), | ||||
|                 'local_icon'              => 'calendar-o', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
| @@ -432,7 +432,7 @@ class BasicController extends Controller | ||||
|         Log::debug(sprintf('Done with getBillInformation("%s", "%s")', $start->format('Y-m-d'), $end->format('Y-m-d-'))); | ||||
| 
 | ||||
|         if (0 === count($return)) { | ||||
|             $currency = $this->nativeCurrency; | ||||
|             $currency = $this->primaryCurrency; | ||||
|             unset($info, $amount); | ||||
| 
 | ||||
|             $return[] = [ | ||||
| @@ -443,7 +443,7 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatFlat($currency->symbol, $currency->decimal_places, '0', false), | ||||
|                 'value_parsed'            => Amount::formatFlat($currency->symbol, $currency->decimal_places, '0', false), | ||||
|                 'local_icon'              => 'check', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
| @@ -455,7 +455,7 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatFlat($currency->symbol, $currency->decimal_places, '0', false), | ||||
|                 'value_parsed'            => Amount::formatFlat($currency->symbol, $currency->decimal_places, '0', false), | ||||
|                 'local_icon'              => 'calendar-o', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
| @@ -493,14 +493,9 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $currencies[$currencyId]->code, | ||||
|                 'currency_symbol'         => $currencies[$currencyId]->symbol, | ||||
|                 'currency_decimal_places' => $currencies[$currencyId]->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), | ||||
|                 'value_parsed'            => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), | ||||
|                 'local_icon'              => 'money', | ||||
|                 'sub_title'               => app('amount')->formatFlat( | ||||
|                     $currencies[$currencyId]->symbol, | ||||
|                     $currencies[$currencyId]->decimal_places, | ||||
|                     $availableBudget, | ||||
|                     false | ||||
|                 ), | ||||
|                 'sub_title'               => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), | ||||
|             ]; | ||||
|         } | ||||
|         foreach ($spent as $row) { | ||||
| @@ -529,18 +524,14 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $row['currency_code'], | ||||
|                 'currency_symbol'         => $row['currency_symbol'], | ||||
|                 'currency_decimal_places' => $row['currency_decimal_places'], | ||||
|                 'value_parsed'            => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false), | ||||
|                 'value_parsed'            => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false), | ||||
|                 'local_icon'              => 'money', | ||||
|                 'sub_title'               => app('amount')->formatFlat( | ||||
|                     $row['currency_symbol'], | ||||
|                     $row['currency_decimal_places'], | ||||
|                     $perDay, | ||||
|                     false | ||||
|                 ), | ||||
|                 'sub_title'               => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $perDay, false), | ||||
|             ]; | ||||
|         } | ||||
|         unset($leftToSpend); | ||||
|         if (0 === count($return)) { | ||||
|             $days  = (int) $start->diffInDays($end, true) + 1; | ||||
|             // a small trick to get every expense in this period, regardless of budget.
 | ||||
|             $spent = $this->opsRepository->sumExpenses($start, $end, null, new Collection()); | ||||
|             foreach ($spent as $row) { | ||||
| @@ -563,21 +554,16 @@ class BasicController extends Controller | ||||
|                     'currency_code'           => $row['currency_code'], | ||||
|                     'currency_symbol'         => $row['currency_symbol'], | ||||
|                     'currency_decimal_places' => $row['currency_decimal_places'], | ||||
|                     'value_parsed'            => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $spentInCurrency, false), | ||||
|                     'value_parsed'            => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $spentInCurrency, false), | ||||
|                     'local_icon'              => 'money', | ||||
|                     'sub_title'               => app('amount')->formatFlat( | ||||
|                         $row['currency_symbol'], | ||||
|                         $row['currency_decimal_places'], | ||||
|                         $perDay, | ||||
|                         false | ||||
|                     ), | ||||
|                     'sub_title'               => Amount::formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $perDay, false), | ||||
|                 ]; | ||||
|             } | ||||
| 
 | ||||
|             //            $amount = '0';
 | ||||
|             //            // $days
 | ||||
|             //            // fill in by money spent, just count it.
 | ||||
|             //            $currency              = $this->nativeCurrency;
 | ||||
|             //            $currency              = $this->primaryCurrency;
 | ||||
|             //            $return[$currency->id] = [
 | ||||
|             //                'key'                     => sprintf('left-to-spend-in-%s', $currency->code),
 | ||||
|             //                'title'                   => trans('firefly.box_left_to_spend_in_currency', ['currency' => $currency->symbol]),
 | ||||
| @@ -587,9 +573,9 @@ class BasicController extends Controller | ||||
|             //                'currency_code'           => $currency->code,
 | ||||
|             //                'currency_symbol'         => $currency->symbol,
 | ||||
|             //                'currency_decimal_places' => $currency->decimal_places,
 | ||||
|             //                'value_parsed'            => app('amount')->formatFlat($currency->symbol, $currency->decimal_places, '0', false),
 | ||||
|             //                'value_parsed'            => Amount::formatFlat($currency->symbol, $currency->decimal_places, '0', false),
 | ||||
|             //                'local_icon'              => 'money',
 | ||||
|             //                'sub_title'               => app('amount')->formatFlat(
 | ||||
|             //                'sub_title'               => Amount::formatFlat(
 | ||||
|             //                    $currency->symbol,
 | ||||
|             //                    $currency->decimal_places,
 | ||||
|             //                    '0',
 | ||||
| @@ -626,7 +612,7 @@ class BasicController extends Controller | ||||
|         $netWorthSet    = $netWorthHelper->byAccounts($filtered, $end); | ||||
|         $return         = []; | ||||
|         foreach ($netWorthSet as $key => $data) { | ||||
|             if ('native' === $key) { | ||||
|             if ('pc' === $key) { | ||||
|                 continue; | ||||
|             } | ||||
|             $amount   = $data['balance']; | ||||
| @@ -642,21 +628,21 @@ class BasicController extends Controller | ||||
|                 'currency_code'           => $data['currency_code'], | ||||
|                 'currency_symbol'         => $data['currency_symbol'], | ||||
|                 'currency_decimal_places' => $data['currency_decimal_places'], | ||||
|                 'value_parsed'            => app('amount')->formatFlat($data['currency_symbol'], $data['currency_decimal_places'], $data['balance'], false), | ||||
|                 'value_parsed'            => Amount::formatFlat($data['currency_symbol'], $data['currency_decimal_places'], $data['balance'], false), | ||||
|                 'local_icon'              => 'line-chart', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
|         } | ||||
|         if (0 === count($return)) { | ||||
|             $return[] = [ | ||||
|                 'key'                     => sprintf('net-worth-in-%s', $this->nativeCurrency->code), | ||||
|                 'title'                   => trans('firefly.box_net_worth_in_currency', ['currency' => $this->nativeCurrency->symbol]), | ||||
|                 'key'                     => sprintf('net-worth-in-%s', $this->primaryCurrency->code), | ||||
|                 'title'                   => trans('firefly.box_net_worth_in_currency', ['currency' => $this->primaryCurrency->symbol]), | ||||
|                 'monetary_value'          => '0', | ||||
|                 'currency_id'             => (string) $this->nativeCurrency->id, | ||||
|                 'currency_code'           => $this->nativeCurrency->code, | ||||
|                 'currency_symbol'         => $this->nativeCurrency->symbol, | ||||
|                 'currency_decimal_places' => $this->nativeCurrency->decimal_places, | ||||
|                 'value_parsed'            => app('amount')->formatFlat($this->nativeCurrency->symbol, $this->nativeCurrency->decimal_places, '0', false), | ||||
|                 'currency_id'             => (string) $this->primaryCurrency->id, | ||||
|                 'currency_code'           => $this->primaryCurrency->code, | ||||
|                 'currency_symbol'         => $this->primaryCurrency->symbol, | ||||
|                 'currency_decimal_places' => $this->primaryCurrency->decimal_places, | ||||
|                 'value_parsed'            => Amount::formatFlat($this->primaryCurrency->symbol, $this->primaryCurrency->decimal_places, '0', false), | ||||
|                 'local_icon'              => 'line-chart', | ||||
|                 'sub_title'               => '', | ||||
|             ]; | ||||
|   | ||||
| @@ -85,7 +85,7 @@ class PreferencesController extends Controller | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         if ('currencyPreference' === $preference->name) { | ||||
|             throw new FireflyException('Please use api/v1/currencies/native instead.'); | ||||
|             throw new FireflyException('Please use api/v1/currencies/primary instead.'); | ||||
|         } | ||||
| 
 | ||||
|         /** @var PreferenceTransformer $transformer */ | ||||
| @@ -132,7 +132,7 @@ class PreferencesController extends Controller | ||||
|     public function update(PreferenceUpdateRequest $request, Preference $preference): JsonResponse | ||||
|     { | ||||
|         if ('currencyPreference' === $preference->name) { | ||||
|             throw new FireflyException('Please use api/v1/currencies/native instead.'); | ||||
|             throw new FireflyException('Please use api/v1/currencies/primary instead.'); | ||||
|         } | ||||
| 
 | ||||
|         $manager     = $this->getManager(); | ||||
|   | ||||
| @@ -1,62 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * DateRequest.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V1\Requests\Generic; | ||||
| 
 | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| /** | ||||
|  * Request class for end points that require date parameters. | ||||
|  * | ||||
|  * Class DateRequest | ||||
|  */ | ||||
| class DateRequest extends FormRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     /** | ||||
|      * Get all data from the request. | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start' => $this->getCarbonDate('start')->startOfDay(), | ||||
|             'end'   => $this->getCarbonDate('end')->endOfDay(), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The rules that the incoming request must be matched against. | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start' => 'required|date|after:1970-01-02|before:2038-01-17', | ||||
|             'end'   => 'required|date|after_or_equal:start|before:2038-01-17|after:1970-01-02', | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -25,7 +25,6 @@ declare(strict_types=1); | ||||
| namespace FireflyIII\Api\V1\Requests\Models\PiggyBank; | ||||
| 
 | ||||
| use Illuminate\Contracts\Validation\Validator; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Rules\IsValidZeroOrMoreAmount; | ||||
| @@ -96,7 +95,10 @@ class StoreRequest extends FormRequest | ||||
|             function (Validator $validator): void { | ||||
|                 // validate start before end only if both are there.
 | ||||
|                 $data          = $validator->getData(); | ||||
|                 $currency      = $this->getCurrencyFromData($data); | ||||
|                 $currency      = $this->getCurrencyFromData($validator, $data); | ||||
|                 if (null === $currency) { | ||||
|                     return; | ||||
|                 } | ||||
|                 $targetAmount  = (string) ($data['target_amount'] ?? '0'); | ||||
|                 $currentAmount = '0'; | ||||
|                 if (array_key_exists('accounts', $data) && is_array($data['accounts'])) { | ||||
| @@ -130,7 +132,7 @@ class StoreRequest extends FormRequest | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private function getCurrencyFromData(array $data): TransactionCurrency | ||||
|     private function getCurrencyFromData(Validator $validator, array $data): ?TransactionCurrency | ||||
|     { | ||||
|         if (array_key_exists('transaction_currency_code', $data) && '' !== (string) $data['transaction_currency_code']) { | ||||
|             $currency = TransactionCurrency::whereCode($data['transaction_currency_code'])->first(); | ||||
| @@ -144,7 +146,8 @@ class StoreRequest extends FormRequest | ||||
|                 return $currency; | ||||
|             } | ||||
|         } | ||||
|         $validator->errors()->add('transaction_currency_id', trans('validation.require_currency_id_code')); | ||||
| 
 | ||||
|         throw new FireflyException('Unexpected empty currency.'); | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -39,9 +39,9 @@ class UpdateRequest extends FormRequest | ||||
|     public function getData(): array | ||||
|     { | ||||
|         $fields = [ | ||||
|             'title'                => ['title', 'convertString'], | ||||
|             'native_currency_id'   => ['native_currency_id', 'convertInteger'], | ||||
|             'native_currency_code' => ['native_currency_code', 'convertString'], | ||||
|             'title'                 => ['title', 'convertString'], | ||||
|             'primary_currency_id'   => ['primary_currency_id', 'convertInteger'], | ||||
|             'primary_currency_code' => ['primary_currency_code', 'convertString'], | ||||
|         ]; | ||||
| 
 | ||||
|         return $this->getAllData($fields); | ||||
| @@ -53,9 +53,9 @@ class UpdateRequest extends FormRequest | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'title'                => ['required', 'min:1', 'max:255'], | ||||
|             'native_currency_id'   => 'exists:transaction_currencies,id', | ||||
|             'native_currency_code' => 'exists:transaction_currencies,code', | ||||
|             'title'                 => ['required', 'min:1', 'max:255'], | ||||
|             'primary_currency_id'   => 'exists:transaction_currencies,id', | ||||
|             'primary_currency_code' => 'exists:transaction_currencies,code', | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,140 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Autocomplete; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountBalance; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ExchangeRateConverter; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| { | ||||
|     private ExchangeRateConverter      $converter; | ||||
|     private TransactionCurrency        $default; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $userGroup        = $this->validateUserGroup($request); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
|                 $this->default    = app('amount')->getNativeCurrency(); | ||||
|                 $this->converter  = app(ExchangeRateConverter::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getAccountsAC
 | ||||
|      */ | ||||
|     public function accounts(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $params = $request->getParameters(); | ||||
|         $result = $this->repository->searchAccount($params['query'], $params['account_types'], $params['size']); | ||||
|         $return = []; | ||||
| 
 | ||||
|         /** @var Account $account */ | ||||
|         foreach ($result as $account) { | ||||
|             $return[] = $this->parseAccount($account); | ||||
|         } | ||||
| 
 | ||||
|         return response()->json($return); | ||||
|     } | ||||
| 
 | ||||
|     private function parseAccount(Account $account): array | ||||
|     { | ||||
|         $currency = $this->repository->getAccountCurrency($account); | ||||
| 
 | ||||
|         return [ | ||||
|             'id'    => (string) $account->id, | ||||
|             'title' => $account->name, | ||||
|             'meta'  => [ | ||||
|                 'type'                    => $account->accountType->type, | ||||
|                 // TODO is multi currency property.
 | ||||
|                 'currency_id'             => $currency instanceof TransactionCurrency ? (string) $currency->id : null, | ||||
|                 'currency_code'           => $currency?->code, | ||||
|                 'currency_symbol'         => $currency?->symbol, | ||||
|                 'currency_decimal_places' => $currency?->decimal_places, | ||||
|                 'account_balances'        => $this->getAccountBalances($account), | ||||
|             ], | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     private function getAccountBalances(Account $account): array | ||||
|     { | ||||
|         $return   = []; | ||||
|         $balances = $this->repository->getAccountBalances($account); | ||||
| 
 | ||||
|         /** @var AccountBalance $balance */ | ||||
|         foreach ($balances as $balance) { | ||||
|             try { | ||||
|                 $return[] = $this->parseAccountBalance($balance); | ||||
|             } catch (FireflyException $e) { | ||||
|                 Log::error(sprintf('Could not parse convert account balance: %s', $e->getMessage())); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function parseAccountBalance(AccountBalance $balance): array | ||||
|     { | ||||
|         $currency = $balance->transactionCurrency; | ||||
| 
 | ||||
|         return [ | ||||
|             'title'                          => $balance->title, | ||||
|             'native_amount'                  => $this->converter->convert($currency, $this->default, today(), $balance->balance), | ||||
|             'amount'                         => app('steam')->bcround($balance->balance, $currency->decimal_places), | ||||
|             'currency_id'                    => (string) $currency->id, | ||||
|             'currency_code'                  => $currency->code, | ||||
|             'currency_symbol'                => $currency->symbol, | ||||
|             'currency_decimal_places'        => $currency->decimal_places, | ||||
|             'native_currency_id'             => (string) $this->default->id, | ||||
|             'native_currency_code'           => $this->default->code, | ||||
|             'native_currency_symbol'         => $this->default->symbol, | ||||
|             'native_currency_decimal_places' => $this->default->decimal_places, | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -1,73 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * CategoryController.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\Api\V2\Controllers\Autocomplete; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class CategoryController | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| { | ||||
|     private CategoryRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getCategoriesAC
 | ||||
|      */ | ||||
|     public function categories(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $queryParameters = $request->getParameters(); | ||||
|         $result          = $this->repository->searchCategory($queryParameters['query'], $queryParameters['size']); | ||||
|         $filtered        = $result->map( | ||||
|             static fn (Category $item) => [ | ||||
|                 'id'    => (string) $item->id, | ||||
|                 'title' => $item->name, | ||||
|                 'meta'  => [], | ||||
|             ] | ||||
|         ); | ||||
| 
 | ||||
|         return response()->json($filtered); | ||||
|     } | ||||
| } | ||||
| @@ -1,75 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * CategoryController.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\Api\V2\Controllers\Autocomplete; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class TagController | ||||
|  */ | ||||
| class TagController extends Controller | ||||
| { | ||||
|     private TagRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(TagRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTagsAC
 | ||||
|      */ | ||||
|     public function tags(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $queryParameters = $request->getParameters(); | ||||
|         $result          = $this->repository->searchTag($queryParameters['query']); | ||||
|         $filtered        = $result->map( | ||||
|             static fn (Tag $item) => [ | ||||
|                 'id'    => (string) $item->id, | ||||
|                 'title' => $item->tag, | ||||
|                 'value' => (string) $item->id, | ||||
|                 'label' => $item->tag, | ||||
|                 'meta'  => [], | ||||
|             ] | ||||
|         ); | ||||
| 
 | ||||
|         return response()->json($filtered); | ||||
|     } | ||||
| } | ||||
| @@ -1,81 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * TransactionController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Autocomplete; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class TransactionController | ||||
|  */ | ||||
| class TransactionController extends Controller | ||||
| { | ||||
|     private JournalRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(JournalRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Documentation: https://api-docs.firefly-iii.org/?urls.primaryName=2.1.0%20(v2)#/autocomplete/getTransactionsAC
 | ||||
|      */ | ||||
|     public function transactionDescriptions(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $queryParameters = $request->getParameters(); | ||||
|         $result          = $this->repository->searchJournalDescriptions($queryParameters['query'], $queryParameters['size']); | ||||
| 
 | ||||
|         // limit and unique
 | ||||
|         $filtered        = $result->unique('description'); | ||||
|         $array           = []; | ||||
| 
 | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($filtered as $journal) { | ||||
|             $array[] = [ | ||||
|                 'id'    => (string) $journal->id, | ||||
|                 'title' => $journal->description, | ||||
|                 'meta'  => [ | ||||
|                     'transaction_group_id' => (string) $journal->transaction_group_id, | ||||
|                 ], | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|         return response()->json($array); | ||||
|     } | ||||
| } | ||||
| @@ -1,140 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Chart; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Chart\ChartRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Chart\ChartData; | ||||
| use FireflyIII\Support\Facades\Steam; | ||||
| use FireflyIII\Support\Http\Api\CleansChartData; | ||||
| use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| { | ||||
|     use CleansChartData; | ||||
|     use CollectsAccountsFromFilter; | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private ChartData                  $chartData; | ||||
|     private TransactionCurrency        $default; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
|                 $this->chartData  = new ChartData(); | ||||
|                 $this->default    = app('amount')->getNativeCurrency(); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO fix documentation | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function dashboard(ChartRequest $request): JsonResponse | ||||
|     { | ||||
|         $queryParameters = $request->getParameters(); | ||||
|         $accounts        = $this->getAccountList($queryParameters); | ||||
| 
 | ||||
|         // move date to end of day
 | ||||
|         $queryParameters['start']->startOfDay(); | ||||
|         $queryParameters['end']->endOfDay(); | ||||
| 
 | ||||
|         // loop each account, and collect info:
 | ||||
|         /** @var Account $account */ | ||||
|         foreach ($accounts as $account) { | ||||
|             $this->renderAccountData($queryParameters, $account); | ||||
|         } | ||||
| 
 | ||||
|         return response()->json($this->chartData->render()); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function renderAccountData(array $params, Account $account): void | ||||
|     { | ||||
|         $currency       = $this->repository->getAccountCurrency($account); | ||||
|         if (!$currency instanceof TransactionCurrency) { | ||||
|             $currency = $this->default; | ||||
|         } | ||||
|         $currentSet     = [ | ||||
|             'label'                          => $account->name, | ||||
| 
 | ||||
|             // the currency that belongs to the account.
 | ||||
|             'currency_id'                    => (string) $currency->id, | ||||
|             'currency_code'                  => $currency->code, | ||||
|             'currency_symbol'                => $currency->symbol, | ||||
|             'currency_decimal_places'        => $currency->decimal_places, | ||||
| 
 | ||||
|             // the default currency of the user (could be the same!)
 | ||||
|             'native_currency_id'             => (string) $this->default->id, | ||||
|             'native_currency_code'           => $this->default->code, | ||||
|             'native_currency_symbol'         => $this->default->symbol, | ||||
|             'native_currency_decimal_places' => $this->default->decimal_places, | ||||
|             'date'                           => $params['start']->toAtomString(), | ||||
|             'start'                          => $params['start']->toAtomString(), | ||||
|             'end'                            => $params['end']->toAtomString(), | ||||
|             'period'                         => '1D', | ||||
|             'entries'                        => [], | ||||
|             'native_entries'                 => [], | ||||
|         ]; | ||||
|         $currentStart   = clone $params['start']; | ||||
|         $range          = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToNative); | ||||
| 
 | ||||
|         $previous       = array_values($range)[0]['balance']; | ||||
|         $previousNative = array_values($range)[0]['native_balance']; | ||||
|         while ($currentStart <= $params['end']) { | ||||
|             $format                               = $currentStart->format('Y-m-d'); | ||||
|             $label                                = $currentStart->toAtomString(); | ||||
|             $balance                              = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous; | ||||
|             $balanceNative                        = array_key_exists($format, $range) ? $range[$format]['balance_native'] : $previousNative; | ||||
|             $previous                             = $balance; | ||||
|             $previousNative                       = $balanceNative; | ||||
| 
 | ||||
|             $currentStart->addDay(); | ||||
|             $currentSet['entries'][$label]        = $balance; | ||||
|             $currentSet['native_entries'][$label] = $balanceNative; | ||||
|         } | ||||
|         $this->chartData->add($currentSet); | ||||
|     } | ||||
| } | ||||
| @@ -1,116 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * BalanceController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Chart; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Chart\ChartRequest; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Chart\ChartData; | ||||
| use FireflyIII\Support\Http\Api\AccountBalanceGrouped; | ||||
| use FireflyIII\Support\Http\Api\CleansChartData; | ||||
| use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class BalanceController | ||||
|  */ | ||||
| class BalanceController extends Controller | ||||
| { | ||||
|     use CleansChartData; | ||||
|     use CollectsAccountsFromFilter; | ||||
| 
 | ||||
|     private ChartData                  $chartData; | ||||
|     private GroupCollectorInterface    $collector; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     // private TransactionCurrency        $default;
 | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->collector  = app(GroupCollectorInterface::class); | ||||
|                 $userGroup        = $this->validateUserGroup($request); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
|                 $this->collector->setUserGroup($userGroup); | ||||
|                 $this->chartData  = new ChartData(); | ||||
|                 // $this->default    = app('amount')->getNativeCurrency();
 | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The code is practically a duplicate of ReportController::operations. | ||||
|      * | ||||
|      * Currency is up to the account/transactions in question, but conversion to the default | ||||
|      * currency is possible. | ||||
|      * | ||||
|      * If the transaction being processed is already in native currency OR if the | ||||
|      * foreign amount is in the native currency, the amount will not be converted. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function balance(ChartRequest $request): JsonResponse | ||||
|     { | ||||
|         $queryParameters = $request->getParameters(); | ||||
|         $accounts        = $this->getAccountList($queryParameters); | ||||
| 
 | ||||
|         // prepare for currency conversion and data collection:
 | ||||
|         /** @var TransactionCurrency $default */ | ||||
|         $default         = app('amount')->getNativeCurrency(); | ||||
| 
 | ||||
|         // get journals for entire period:
 | ||||
| 
 | ||||
|         $this->collector->setRange($queryParameters['start'], $queryParameters['end']) | ||||
|             ->withAccountInformation() | ||||
|             ->setXorAccounts($accounts) | ||||
|             ->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::RECONCILIATION->value, TransactionTypeEnum::TRANSFER->value]) | ||||
|         ; | ||||
|         $journals        = $this->collector->getExtractedJournals(); | ||||
| 
 | ||||
|         $object          = new AccountBalanceGrouped(); | ||||
|         $object->setPreferredRange($queryParameters['period']); | ||||
|         $object->setDefault($default); | ||||
|         $object->setAccounts($accounts); | ||||
|         $object->setJournals($journals); | ||||
|         $object->setStart($queryParameters['start']); | ||||
|         $object->setEnd($queryParameters['end']); | ||||
|         $object->groupByCurrencyAndPeriod(); | ||||
|         $data            = $object->convertToChartData(); | ||||
|         foreach ($data as $entry) { | ||||
|             $this->chartData->add($entry); | ||||
|         } | ||||
| 
 | ||||
|         return response()->json($this->chartData->render()); | ||||
|     } | ||||
| } | ||||
| @@ -1,293 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * BudgetController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Chart; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\CleansChartData; | ||||
| use FireflyIII\Support\Http\Api\ExchangeRateConverter; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Collection; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Class BudgetController | ||||
|  */ | ||||
| class BudgetController extends Controller | ||||
| { | ||||
|     use CleansChartData; | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     protected OperationsRepositoryInterface $opsRepository; | ||||
|     private BudgetLimitRepositoryInterface  $blRepository; | ||||
|     private array                           $currencies = []; | ||||
|     private TransactionCurrency             $currency; | ||||
|     private BudgetRepositoryInterface       $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository    = app(BudgetRepositoryInterface::class); | ||||
|                 $this->blRepository  = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->currency      = app('amount')->getNativeCurrency(); | ||||
|                 $userGroup           = $this->validateUserGroup($request); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
|                 $this->opsRepository->setUserGroup($userGroup); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO see autocomplete/accountcontroller | ||||
|      */ | ||||
|     public function dashboard(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         $params  = $request->getAll(); | ||||
| 
 | ||||
|         /** @var Carbon $start */ | ||||
|         $start   = $params['start']; | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end     = $params['end']; | ||||
| 
 | ||||
|         // code from FrontpageChartGenerator, but not in separate class
 | ||||
|         $budgets = $this->repository->getActiveBudgets(); | ||||
|         $data    = []; | ||||
| 
 | ||||
|         /** @var Budget $budget */ | ||||
|         foreach ($budgets as $budget) { | ||||
|             // could return multiple arrays, so merge.
 | ||||
|             $data = array_merge($data, $this->processBudget($budget, $start, $end)); | ||||
|         } | ||||
| 
 | ||||
|         return response()->json($this->clean($data)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function processBudget(Budget $budget, Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         // get all limits:
 | ||||
|         $limits = $this->blRepository->getBudgetLimits($budget, $start, $end); | ||||
|         $rows   = []; | ||||
| 
 | ||||
|         // if no limits
 | ||||
|         if (0 === $limits->count()) { | ||||
|             // return as a single item in an array
 | ||||
|             $rows = $this->noBudgetLimits($budget, $start, $end); | ||||
|         } | ||||
|         if ($limits->count() > 0) { | ||||
|             $rows = $this->budgetLimits($budget, $limits); | ||||
|         } | ||||
|         // is always an array
 | ||||
|         $return = []; | ||||
|         foreach ($rows as $row) { | ||||
|             $current  = [ | ||||
|                 'label'                          => $budget->name, | ||||
|                 'currency_id'                    => (string) $row['currency_id'], | ||||
|                 'currency_code'                  => $row['currency_code'], | ||||
|                 'currency_name'                  => $row['currency_name'], | ||||
|                 'currency_decimal_places'        => $row['currency_decimal_places'], | ||||
|                 'native_currency_id'             => (string) $row['native_currency_id'], | ||||
|                 'native_currency_code'           => $row['native_currency_code'], | ||||
|                 'native_currency_name'           => $row['native_currency_name'], | ||||
|                 'native_currency_decimal_places' => $row['native_currency_decimal_places'], | ||||
|                 'period'                         => null, | ||||
|                 'start'                          => $row['start'], | ||||
|                 'end'                            => $row['end'], | ||||
|                 'entries'                        => [ | ||||
|                     'spent'     => $row['spent'], | ||||
|                     'left'      => $row['left'], | ||||
|                     'overspent' => $row['overspent'], | ||||
|                 ], | ||||
|                 'native_entries'                 => [ | ||||
|                     'spent'     => $row['native_spent'], | ||||
|                     'left'      => $row['native_left'], | ||||
|                     'overspent' => $row['native_overspent'], | ||||
|                 ], | ||||
|             ]; | ||||
|             $return[] = $current; | ||||
|         } | ||||
| 
 | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * When no budget limits are present, the expenses of the whole period are collected and grouped. | ||||
|      * This is grouped per currency. Because there is no limit set, "left to spend" and "overspent" are empty. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function noBudgetLimits(Budget $budget, Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         $spent = $this->opsRepository->listExpenses($start, $end, null, new Collection([$budget])); | ||||
| 
 | ||||
|         return $this->processExpenses($budget->id, $spent, $start, $end); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return | ||||
|      * its info. | ||||
|      * | ||||
|      * @param array<int, array<int, string>> $array | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function processExpenses(int $budgetId, array $array, Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__)); | ||||
|         $converter = new ExchangeRateConverter(); | ||||
|         $return    = []; | ||||
| 
 | ||||
|         /** | ||||
|          * This array contains the expenses in this budget. Grouped per currency. | ||||
|          * The grouping is on the main currency only. | ||||
|          * | ||||
|          * @var int   $currencyId | ||||
|          * @var array $block | ||||
|          */ | ||||
|         foreach ($array as $currencyId => $block) { | ||||
|             $this->currencies[$currencyId] ??= TransactionCurrency::find($currencyId); | ||||
|             $return[$currencyId]           ??= [ | ||||
|                 'currency_id'                    => (string) $currencyId, | ||||
|                 'currency_code'                  => $block['currency_code'], | ||||
|                 'currency_name'                  => $block['currency_name'], | ||||
|                 'currency_symbol'                => $block['currency_symbol'], | ||||
|                 'currency_decimal_places'        => (int) $block['currency_decimal_places'], | ||||
|                 'native_currency_id'             => (string) $this->currency->id, | ||||
|                 'native_currency_code'           => $this->currency->code, | ||||
|                 'native_currency_name'           => $this->currency->name, | ||||
|                 'native_currency_symbol'         => $this->currency->symbol, | ||||
|                 'native_currency_decimal_places' => $this->currency->decimal_places, | ||||
|                 'start'                          => $start->toAtomString(), | ||||
|                 'end'                            => $end->toAtomString(), | ||||
|                 'spent'                          => '0', | ||||
|                 'native_spent'                   => '0', | ||||
|                 'left'                           => '0', | ||||
|                 'native_left'                    => '0', | ||||
|                 'overspent'                      => '0', | ||||
|                 'native_overspent'               => '0', | ||||
|             ]; | ||||
|             $currentBudgetArray = $block['budgets'][$budgetId]; | ||||
| 
 | ||||
|             // var_dump($return);
 | ||||
|             /** @var array $journal */ | ||||
|             foreach ($currentBudgetArray['transaction_journals'] as $journal) { | ||||
|                 // convert the amount to the native currency.
 | ||||
|                 $rate                                = $converter->getCurrencyRate($this->currencies[$currencyId], $this->currency, $journal['date']); | ||||
|                 $convertedAmount                     = bcmul((string) $journal['amount'], $rate); | ||||
|                 if ($journal['foreign_currency_id'] === $this->currency->id) { | ||||
|                     $convertedAmount = $journal['foreign_amount']; | ||||
|                 } | ||||
| 
 | ||||
|                 $return[$currencyId]['spent']        = bcadd($return[$currencyId]['spent'], (string) $journal['amount']); | ||||
|                 $return[$currencyId]['native_spent'] = bcadd($return[$currencyId]['native_spent'], (string) $convertedAmount); | ||||
|             } | ||||
|         } | ||||
|         $converter->summarize(); | ||||
| 
 | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Function that processes each budget limit (per budget). | ||||
|      * | ||||
|      * If you have a budget limit in EUR, only transactions in EUR will be considered. | ||||
|      * If you have a budget limit in GBP, only transactions in GBP will be considered. | ||||
|      * | ||||
|      * If you have a budget limit in EUR, and a transaction in GBP, it will not be considered for the EUR budget limit. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function budgetLimits(Budget $budget, Collection $limits): array | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now in budgetLimits(#%d)', $budget->id)); | ||||
|         $data = []; | ||||
| 
 | ||||
|         /** @var BudgetLimit $limit */ | ||||
|         foreach ($limits as $limit) { | ||||
|             $data = array_merge($data, $this->processLimit($budget, $limit)); | ||||
|         } | ||||
| 
 | ||||
|         return $data; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function processLimit(Budget $budget, BudgetLimit $limit): array | ||||
|     { | ||||
|         Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__)); | ||||
|         $end                  = clone $limit->end_date; | ||||
|         $end->endOfDay(); | ||||
|         $spent                = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget])); | ||||
|         $limitCurrencyId      = $limit->transaction_currency_id; | ||||
|         $limitCurrency        = $limit->transactionCurrency; | ||||
|         $converter            = new ExchangeRateConverter(); | ||||
|         $filtered             = []; | ||||
|         $rate                 = $converter->getCurrencyRate($limitCurrency, $this->currency, $limit->start_date); | ||||
|         $convertedLimitAmount = bcmul($limit->amount, $rate); | ||||
| 
 | ||||
|         /** @var array $entry */ | ||||
|         foreach ($spent as $currencyId => $entry) { | ||||
|             // only spent the entry where the entry's currency matches the budget limit's currency
 | ||||
|             // so $filtered will only have 1 or 0 entries
 | ||||
|             if ($entry['currency_id'] === $limitCurrencyId) { | ||||
|                 $filtered[$currencyId] = $entry; | ||||
|             } | ||||
|         } | ||||
|         $result               = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end); | ||||
|         if (1 === count($result)) { | ||||
|             $compare = bccomp($limit->amount, (string) app('steam')->positive($result[$limitCurrencyId]['spent'])); | ||||
|             if (1 === $compare) { | ||||
|                 // convert this amount into the native currency:
 | ||||
|                 $result[$limitCurrencyId]['left']        = bcadd($limit->amount, (string) $result[$limitCurrencyId]['spent']); | ||||
|                 $result[$limitCurrencyId]['native_left'] = bcadd($convertedLimitAmount, (string) $result[$limitCurrencyId]['native_spent']); | ||||
|             } | ||||
|             if ($compare <= 0) { | ||||
|                 $result[$limitCurrencyId]['overspent']        = app('steam')->positive(bcadd($limit->amount, (string) $result[$limitCurrencyId]['spent'])); | ||||
|                 $result[$limitCurrencyId]['native_overspent'] = app('steam')->positive(bcadd($convertedLimitAmount, (string) $result[$limitCurrencyId]['native_spent'])); | ||||
|             } | ||||
|         } | ||||
|         $converter->summarize(); | ||||
| 
 | ||||
|         return $result; | ||||
|     } | ||||
| } | ||||
| @@ -1,142 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * CategoryController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Chart; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\CleansChartData; | ||||
| use FireflyIII\Support\Http\Api\ExchangeRateConverter; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Class BudgetController | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| { | ||||
|     use CleansChartData; | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private AccountRepositoryInterface  $accountRepos; | ||||
|     private CurrencyRepositoryInterface $currencyRepos; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->accountRepos  = app(AccountRepositoryInterface::class); | ||||
|                 $this->currencyRepos = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->accountRepos->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO may be worth to move to a handler but the data is simple enough. | ||||
|      * TODO see autoComplete/account controller | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
|      */ | ||||
|     public function dashboard(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__)); | ||||
| 
 | ||||
|         /** @var Carbon $start */ | ||||
|         $start      = $this->parameters->get('start'); | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end        = $this->parameters->get('end'); | ||||
|         $accounts   = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value]); | ||||
|         $default    = app('amount')->getNativeCurrency(); | ||||
|         $converter  = new ExchangeRateConverter(); | ||||
|         $currencies = []; | ||||
|         $return     = []; | ||||
| 
 | ||||
|         // get journals for entire period:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setRange($start, $end)->withAccountInformation(); | ||||
|         $collector->setXorAccounts($accounts)->withCategoryInformation(); | ||||
|         $collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::RECONCILIATION->value]); | ||||
|         $journals   = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         /** @var array $journal */ | ||||
|         foreach ($journals as $journal) { | ||||
|             $currencyId                    = (int) $journal['currency_id']; | ||||
|             $currency                      = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); | ||||
|             $currencies[$currencyId]       = $currency; | ||||
|             $categoryName                  = $journal['category_name'] ?? (string) trans('firefly.no_category'); | ||||
|             $amount                        = app('steam')->positive($journal['amount']); | ||||
|             $nativeAmount                  = $converter->convert($default, $currency, $journal['date'], $amount); | ||||
|             $key                           = sprintf('%s-%s', $categoryName, $currency->code); | ||||
|             if ((int) $journal['foreign_currency_id'] === $default->id) { | ||||
|                 $nativeAmount = app('steam')->positive($journal['foreign_amount']); | ||||
|             } | ||||
|             // create arrays
 | ||||
|             $return[$key] ??= [ | ||||
|                 'label'                          => $categoryName, | ||||
|                 'currency_id'                    => (string) $currency->id, | ||||
|                 'currency_code'                  => $currency->code, | ||||
|                 'currency_name'                  => $currency->name, | ||||
|                 'currency_symbol'                => $currency->symbol, | ||||
|                 'currency_decimal_places'        => $currency->decimal_places, | ||||
|                 'native_currency_id'             => (string) $default->id, | ||||
|                 'native_currency_code'           => $default->code, | ||||
|                 'native_currency_name'           => $default->name, | ||||
|                 'native_currency_symbol'         => $default->symbol, | ||||
|                 'native_currency_decimal_places' => $default->decimal_places, | ||||
|                 'period'                         => null, | ||||
|                 'start'                          => $start->toAtomString(), | ||||
|                 'end'                            => $end->toAtomString(), | ||||
|                 'amount'                         => '0', | ||||
|                 'native_amount'                  => '0', | ||||
|             ]; | ||||
| 
 | ||||
|             // add monies
 | ||||
|             $return[$key]['amount']        = bcadd($return[$key]['amount'], (string) $amount); | ||||
|             $return[$key]['native_amount'] = bcadd($return[$key]['native_amount'], (string) $nativeAmount); | ||||
|         } | ||||
|         $return     = array_values($return); | ||||
| 
 | ||||
|         // order by native amount
 | ||||
|         usort($return, static fn (array $a, array $b) => (float) $a['native_amount'] < (float) $b['native_amount'] ? 1 : -1); | ||||
|         $converter->summarize(); | ||||
| 
 | ||||
|         return response()->json($this->clean($return)); | ||||
|     } | ||||
| } | ||||
| @@ -1,195 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * Controller.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use Carbon\Exceptions\InvalidDateException; | ||||
| use Carbon\Exceptions\InvalidFormatException; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Transformers\AbstractTransformer; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Routing\Controller as BaseController; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Psr\Container\ContainerExceptionInterface; | ||||
| use Symfony\Component\HttpFoundation\Exception\BadRequestException; | ||||
| use Symfony\Component\HttpFoundation\ParameterBag; | ||||
| 
 | ||||
| /** | ||||
|  * Class Controller | ||||
|  * | ||||
|  * @SuppressWarnings("PHPMD.CouplingBetweenObjects") | ||||
|  * @SuppressWarnings("PHPMD.NumberOfChildren") | ||||
|  */ | ||||
| class Controller extends BaseController | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     protected const string CONTENT_TYPE     = 'application/vnd.api+json'; | ||||
|     protected array        $acceptedRoles   = [UserRoleEnum::READ_ONLY]; | ||||
|     protected bool         $convertToNative = false; | ||||
|     protected ParameterBag $parameters; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->parameters = $this->getParameters(); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO duplicate from V1 controller | ||||
|      * Method to grab all parameters from the URL. | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.NPathComplexity") | ||||
|      */ | ||||
|     private function getParameters(): ParameterBag | ||||
|     { | ||||
|         $bag      = new ParameterBag(); | ||||
|         $bag->set('limit', 50); | ||||
| 
 | ||||
|         try { | ||||
|             $page = (int) request()->get('page'); | ||||
|         } catch (ContainerExceptionInterface) { | ||||
|             $page = 1; | ||||
|         } | ||||
| 
 | ||||
|         $integers = ['limit', 'administration']; | ||||
|         $dates    = ['start', 'end', 'date']; | ||||
| 
 | ||||
|         if ($page < 1) { | ||||
|             $page = 1; | ||||
|         } | ||||
|         if ($page > 2 ** 16) { | ||||
|             $page = 2 ** 16; | ||||
|         } | ||||
|         $bag->set('page', $page); | ||||
| 
 | ||||
|         // some date fields:
 | ||||
|         foreach ($dates as $field) { | ||||
|             $date = null; | ||||
|             $obj  = null; | ||||
| 
 | ||||
|             try { | ||||
|                 $date = request()->query->get($field); | ||||
|             } catch (BadRequestException $e) { | ||||
|                 app('log')->error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field)); | ||||
|                 app('log')->error($e->getMessage()); | ||||
|                 app('log')->error($e->getTraceAsString()); | ||||
|             } | ||||
|             if (null !== $date) { | ||||
|                 try { | ||||
|                     $obj = Carbon::parse((string) $date, config('app.timezone')); | ||||
|                 } catch (InvalidDateException|InvalidFormatException $e) { | ||||
|                     // don't care
 | ||||
|                     app('log')->warning(sprintf('Ignored invalid date "%s" in API v2 controller parameter check: %s', substr((string) $date, 0, 20), $e->getMessage())); | ||||
|                 } | ||||
|                 // out of range? set to null.
 | ||||
|                 if ($obj instanceof Carbon && ($obj->year <= 1970 || $obj->year > 2038)) { | ||||
|                     app('log')->warning(sprintf('Refuse to use date "%s" in API v2 controller parameter check: %s', $field, $obj->toAtomString())); | ||||
|                     $obj = null; | ||||
|                 } | ||||
|             } | ||||
|             if (null !== $date && 'end' === $field) { | ||||
|                 $obj->endOfDay(); | ||||
|             } | ||||
|             $bag->set($field, $obj); | ||||
|         } | ||||
| 
 | ||||
|         // integer fields:
 | ||||
|         foreach ($integers as $integer) { | ||||
|             try { | ||||
|                 $value = request()->query->get($integer); | ||||
|             } catch (BadRequestException $e) { | ||||
|                 app('log')->error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer)); | ||||
|                 app('log')->error($e->getMessage()); | ||||
|                 $value = null; | ||||
|             } | ||||
|             if (null !== $value) { | ||||
|                 $bag->set($integer, (int) $value); | ||||
|             } | ||||
|             if (null === $value && 'limit' === $integer && auth()->check()) { | ||||
|                 // set default for user:
 | ||||
|                 $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|                 $bag->set($integer, $pageSize); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // sort fields:
 | ||||
|         //   return $this->getSortParameters($bag);
 | ||||
| 
 | ||||
|         return $bag; | ||||
|     } | ||||
| 
 | ||||
|     final protected function jsonApiList(string $key, LengthAwarePaginator $paginator, AbstractTransformer $transformer): array | ||||
|     { | ||||
|         $manager  = new Manager(); | ||||
|         $baseUrl  = request()->getSchemeAndHttpHost().'/api/v2'; | ||||
| 
 | ||||
|         // TODO add stuff to path?
 | ||||
| 
 | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
| 
 | ||||
|         $objects  = $paginator->getCollection(); | ||||
| 
 | ||||
|         // the transformer, at this point, needs to collect information that ALL items in the collection
 | ||||
|         // require, like meta-data and stuff like that, and save it for later.
 | ||||
|         // $objects  = $transformer->collectMetaData($objects);
 | ||||
|         $paginator->setCollection($objects); | ||||
| 
 | ||||
|         $resource = new FractalCollection($objects, $transformer, $key); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return $manager->createData($resource)->toArray(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns a JSON API object and returns it. | ||||
|      * | ||||
|      * @param array<int, mixed>|Model $object | ||||
|      */ | ||||
|     final protected function jsonApiObject(string $key, array|Model $object, AbstractTransformer $transformer): array | ||||
|     { | ||||
|         // create some objects:
 | ||||
|         $manager  = new Manager(); | ||||
|         $baseUrl  = request()->getSchemeAndHttpHost().'/api/v2'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
| 
 | ||||
|         // $transformer->collectMetaData(new Collection([$object]));
 | ||||
| 
 | ||||
|         $resource = new Item($object, $transformer, $key); | ||||
| 
 | ||||
|         return $manager->createData($resource)->toArray(); | ||||
|     } | ||||
| } | ||||
| @@ -1,32 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Data\Bulk; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller {} | ||||
| @@ -1,32 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Data\Export; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller {} | ||||
| @@ -1,32 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Data\MassDestroy; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller {} | ||||
| @@ -1,97 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * IndexController.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\Api\V2\Controllers\Model\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\Account\IndexRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     public const string RESOURCE_KEY                  = 'accounts'; | ||||
|     protected array                    $acceptedRoles = [UserRoleEnum::READ_ONLY, UserRoleEnum::MANAGE_TRANSACTIONS]; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 // new way of user group validation
 | ||||
|                 $userGroup        = $this->validateUserGroup($request); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO the sort instructions need proper repeatable documentation. | ||||
|      * TODO see autocomplete/account controller for list. | ||||
|      */ | ||||
|     public function index(IndexRequest $request): JsonResponse | ||||
|     { | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $types             = $request->getAccountTypes(); | ||||
|         $sorting           = $request->getSortInstructions('accounts'); | ||||
|         $filters           = $request->getFilterInstructions('accounts'); | ||||
|         $accounts          = $this->repository->getAccountsByType($types, $sorting); | ||||
|         $pageSize          = $this->parameters->get('limit'); | ||||
|         $count             = $accounts->count(); | ||||
| 
 | ||||
|         // depending on the sort parameters, this list must not be split, because the
 | ||||
|         // order is calculated in the account transformer and by that time it's too late.
 | ||||
|         $first             = array_key_first($sorting); | ||||
|         $disablePagination = in_array($first, ['last_activity', 'balance', 'balance_difference'], true); | ||||
|         Log::debug(sprintf('Will disable pagination in account index v2? %s', var_export($disablePagination, true))); | ||||
|         if (!$disablePagination) { | ||||
|             $accounts = $accounts->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         } | ||||
|         $paginator         = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer       = new AccountTransformer(); | ||||
| 
 | ||||
|         $this->parameters->set('disablePagination', $disablePagination); | ||||
|         $this->parameters->set('pageSize', $pageSize); | ||||
|         $this->parameters->set('sort', $sorting); | ||||
| 
 | ||||
|         $this->parameters->set('filters', $filters); | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('accounts', $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,76 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Model\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Show = show a single account. | ||||
|  * Index = show all accounts | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     public const string RESOURCE_KEY                  = 'accounts'; | ||||
|     protected array                    $acceptedRoles = [UserRoleEnum::READ_ONLY, UserRoleEnum::MANAGE_TRANSACTIONS]; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 // new way of user group validation
 | ||||
|                 $userGroup        = $this->validateUserGroup($request); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO this endpoint is not yet reachable. | ||||
|      */ | ||||
|     public function show(Account $account): JsonResponse | ||||
|     { | ||||
|         $transformer = new AccountTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('accounts', $account, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,76 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * UpdateController.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\Api\V2\Controllers\Model\Account; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\Account\UpdateRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     public const string RESOURCE_KEY = 'accounts'; | ||||
| 
 | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO this endpoint is not yet reachable. | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $data         = $request->getUpdateData(); | ||||
|         $data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type); | ||||
|         $account      = $this->repository->update($account, $data); | ||||
|         $account->refresh(); | ||||
|         app('preferences')->mark(); | ||||
| 
 | ||||
|         $transformer  = new AccountTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('accounts', $account, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,75 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\Bill; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| 
 | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private BillRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO see autocomplete/accountcontroller for list. | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $this->repository->correctOrder(); | ||||
|         $bills       = $this->repository->getBills(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $count       = $bills->count(); | ||||
|         $bills       = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer = new BillTransformer(); | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('subscriptions', $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,69 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\Bill; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Transformers\BillTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private BillRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO this endpoint is not documented | ||||
|      */ | ||||
|     public function show(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $transformer = new BillTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('subscriptions', $bill, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,86 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * SumController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Model\Bill; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class SumController | ||||
|  */ | ||||
| class SumController extends Controller | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private BillRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BillRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/transactions-sum/getBillsPaidTrSum
 | ||||
|      * | ||||
|      * TODO see autocomplete/accountcontroller for list. | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
|      */ | ||||
|     public function paid(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         $result = $this->repository->sumPaidInRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
| 
 | ||||
|         // convert to JSON response:
 | ||||
|         return response()->api(array_values($result)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/transactions-sum/getBillsUnpaidTrSum
 | ||||
|      * | ||||
|      * TODO see autocomplete/accountcontroller for list. | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
|      */ | ||||
|     public function unpaid(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         $result = $this->repository->sumUnpaidInRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
| 
 | ||||
|         // convert to JSON response:
 | ||||
|         return response()->api(array_values($result)); | ||||
|     } | ||||
| } | ||||
| @@ -1,71 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ListController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Model\Budget; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| 
 | ||||
| /** | ||||
|  * Class IndexController | ||||
|  */ | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     private BudgetRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/listBudgets
 | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $collection  = $this->repository->getActiveBudgets(); | ||||
|         $total       = $collection->count(); | ||||
|         $collection->slice($pageSize * $this->parameters->get('page'), $pageSize); | ||||
| 
 | ||||
|         $paginator   = new LengthAwarePaginator($collection, $total, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer = new BudgetTransformer(); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiList('budgets', $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,94 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\Budget; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class ShowController | ||||
|  * TODO lots of deprecated code here. | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private BudgetRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 2023-10-29 removed the cerSum reference, not sure where this is used atm | ||||
|      * so removed from api.php. Also applies to "spent" method. | ||||
|      * | ||||
|      * This endpoint is documented at: | ||||
|      * TODO add URL | ||||
|      */ | ||||
|     public function budgeted(DateRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getAll(); | ||||
|         $result = $this->repository->budgetedInPeriodForBudget($budget, $data['start'], $data['end']); | ||||
| 
 | ||||
|         return response()->json($result); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Show a budget. | ||||
|      */ | ||||
|     public function show(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $transformer = new BudgetTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('budgets', $budget, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * TODO add URL | ||||
|      */ | ||||
|     public function spent(DateRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getAll(); | ||||
|         $result = $this->repository->spentInPeriodForBudget($budget, $data['start'], $data['end']); | ||||
| 
 | ||||
|         return response()->json($result); | ||||
|     } | ||||
| } | ||||
| @@ -1,74 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * SumController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Model\Budget; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class SumController | ||||
|  */ | ||||
| class SumController extends Controller | ||||
| { | ||||
|     private BudgetRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/getBudgetedForBudget
 | ||||
|      */ | ||||
|     public function budgeted(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getAll(); | ||||
|         $result = $this->repository->budgetedInPeriod($data['start'], $data['end']); | ||||
| 
 | ||||
|         return response()->json($result); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/getSpentForBudget
 | ||||
|      */ | ||||
|     public function spent(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getAll(); | ||||
|         $result = $this->repository->spentInPeriod($data['start'], $data['end']); | ||||
| 
 | ||||
|         return response()->json($result); | ||||
|     } | ||||
| } | ||||
| @@ -1,66 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * IndexController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\BudgetLimit; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| 
 | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     private BudgetLimitRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(BudgetLimitRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * TODO add URL | ||||
|      */ | ||||
|     public function index(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $collection  = $this->repository->getBudgetLimits($budget); | ||||
|         $total       = $collection->count(); | ||||
|         $collection->slice($pageSize * $this->parameters->get('page'), $pageSize); | ||||
| 
 | ||||
|         $paginator   = new LengthAwarePaginator($collection, $total, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer = new BudgetLimitTransformer(); | ||||
| 
 | ||||
|         return response()->api($this->jsonApiList('budget-limits', $paginator, $transformer))->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -1,71 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ListController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Model\BudgetLimit; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class ListController | ||||
|  */ | ||||
| class ListController extends Controller | ||||
| { | ||||
|     //    private BudgetLimitRepositoryInterface $repository;
 | ||||
|     //
 | ||||
|     //    public function __construct()
 | ||||
|     //    {
 | ||||
|     //        parent::__construct();
 | ||||
|     //        $this->middleware(
 | ||||
|     //            function ($request, $next) {
 | ||||
|     //                $this->repository = app(BudgetLimitRepositoryInterface::class);
 | ||||
|     //
 | ||||
|     //                return $next($request);
 | ||||
|     //            }
 | ||||
|     //        );
 | ||||
|     //    }
 | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/listBudgetLimitByBudget
 | ||||
|      * // DateRequest $request, Budget $budget
 | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         return response()->json(); | ||||
|         //        throw new FireflyException('Needs refactoring, move to IndexController.');
 | ||||
|         //        $pageSize   = $this->parameters->get('limit');
 | ||||
|         //        $dates      = $request->getAll();
 | ||||
|         //        $collection = $this->repository->getBudgetLimits($budget, $dates['start'], $dates['end']);
 | ||||
|         //        $total      = $collection->count();
 | ||||
|         //        $collection->slice($pageSize * $this->parameters->get('page'), $pageSize);
 | ||||
|         //
 | ||||
|         //        $paginator   = new LengthAwarePaginator($collection, $total, $pageSize, $this->parameters->get('page'));
 | ||||
|         //        $transformer = new BudgetLimitTransformer();
 | ||||
|         //
 | ||||
|         //        return response()
 | ||||
|         //            ->api($this->jsonApiList('budget-limits', $paginator, $transformer))
 | ||||
|         //            ->header('Content-Type', self::CONTENT_TYPE);
 | ||||
|     } | ||||
| } | ||||
| @@ -1,72 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * IndexController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\Currency; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Transformers\CurrencyTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| 
 | ||||
| /** | ||||
|  * Class IndexController | ||||
|  */ | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     private CurrencyRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CurrencyRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO This endpoint is not yet documented. | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $bills       = $this->repository->getAll(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $count       = $bills->count(); | ||||
|         $bills       = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer = new CurrencyTransformer(); | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('currencies', $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,74 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\PiggyBank; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| 
 | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private PiggyBankRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(PiggyBankRepositoryInterface::class); | ||||
|                 $this->repository->setUserGroup($this->validateUserGroup($request)); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO see autocomplete/accountcontroller for list. | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $piggies     = $this->repository->getPiggyBanks(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $count       = $piggies->count(); | ||||
|         $piggies     = $piggies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator   = new LengthAwarePaginator($piggies, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer = new PiggyBankTransformer(); | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('piggy-banks', $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,44 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.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\Api\V2\Controllers\Model\Transaction; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     /** | ||||
|      * TODO this endpoint is not yet reachable. | ||||
|      */ | ||||
|     public function show(TransactionGroup $transactionGroup): JsonResponse | ||||
|     { | ||||
|         $transformer = new TransactionGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response()->api($this->jsonApiObject('transactions', $transactionGroup, $transformer))->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -1,130 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * StoreController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\Transaction; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\Transaction\StoreRequest; | ||||
| use FireflyIII\Events\StoredTransactionGroup; | ||||
| use FireflyIII\Exceptions\DuplicateTransactionException; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; | ||||
| use FireflyIII\Rules\IsDuplicateTransaction; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Validator; | ||||
| use Illuminate\Validation\ValidationException; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private TransactionGroupRepositoryInterface $groupRepository; | ||||
| 
 | ||||
|     /** | ||||
|      * TransactionController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->groupRepository = app(TransactionGroupRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO this method is practically the same as the V1 method and borrows as much code as possible. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * @throws ValidationException | ||||
|      */ | ||||
|     public function post(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         app('log')->debug('Now in API v2 StoreController::store()'); | ||||
|         $data               = $request->getAll(); | ||||
|         $userGroup          = $request->getUserGroup(); | ||||
|         $data['user_group'] = $userGroup; | ||||
| 
 | ||||
| 
 | ||||
|         // overrule user group and see where we end up.
 | ||||
|         // what happens when we refer to a budget that is not in this user group?
 | ||||
| 
 | ||||
|         app('log')->channel('audit')->info('Store new transaction over API.', $data); | ||||
| 
 | ||||
|         try { | ||||
|             $transactionGroup = $this->groupRepository->store($data); | ||||
|         } catch (DuplicateTransactionException $e) { | ||||
|             app('log')->warning('Caught a duplicate transaction. Return error message.'); | ||||
|             $validator = Validator::make( | ||||
|                 ['transactions' => [['description' => $e->getMessage()]]], | ||||
|                 ['transactions.0.description' => new IsDuplicateTransaction()] | ||||
|             ); | ||||
| 
 | ||||
|             throw new ValidationException($validator); | ||||
|         } catch (FireflyException $e) { | ||||
|             app('log')->warning('Caught an exception. Return error message.'); | ||||
|             app('log')->error($e->getMessage()); | ||||
|             $message   = sprintf('Internal exception: %s', $e->getMessage()); | ||||
|             $validator = Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]); | ||||
| 
 | ||||
|             throw new ValidationException($validator); | ||||
|         } | ||||
|         app('preferences')->mark(); | ||||
|         $applyRules         = $data['apply_rules'] ?? true; | ||||
|         $fireWebhooks       = $data['fire_webhooks'] ?? true; | ||||
|         event(new StoredTransactionGroup($transactionGroup, $applyRules, $fireWebhooks)); | ||||
| 
 | ||||
|         /** @var User $admin */ | ||||
|         $admin              = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector          = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on transaction group.
 | ||||
|             ->setTransactionGroup($transactionGroup) | ||||
|         ; | ||||
| 
 | ||||
|         $selectedGroup      = $collector->getGroups()->first(); | ||||
|         if (null === $selectedGroup) { | ||||
|             throw new FireflyException('200032: Cannot find transaction. Possibly, a rule deleted this transaction after its creation.'); | ||||
|         } | ||||
| 
 | ||||
|         $transformer        = new TransactionGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('transactions', $selectedGroup, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,94 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * UpdateController.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\Api\V2\Controllers\Model\Transaction; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\Transaction\UpdateRequest; | ||||
| use FireflyIII\Events\UpdatedTransactionGroup; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     private TransactionGroupRepositoryInterface $groupRepository; | ||||
| 
 | ||||
|     /** | ||||
|      * TransactionController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->groupRepository = app(TransactionGroupRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/transactions/updateTransaction
 | ||||
|      * | ||||
|      * Update a transaction. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, TransactionGroup $transactionGroup): JsonResponse | ||||
|     { | ||||
|         app('log')->debug('Now in update routine for transaction group [v2]!'); | ||||
|         $data             = $request->getAll(); | ||||
|         $transactionGroup = $this->groupRepository->update($transactionGroup, $data); | ||||
|         $applyRules       = $data['apply_rules'] ?? true; | ||||
|         $fireWebhooks     = $data['fire_webhooks'] ?? true; | ||||
| 
 | ||||
|         event(new UpdatedTransactionGroup($transactionGroup, $applyRules, $fireWebhooks, true)); | ||||
|         app('preferences')->mark(); | ||||
| 
 | ||||
|         /** @var User $admin */ | ||||
|         $admin            = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector        = app(GroupCollectorInterface::class); | ||||
|         $collector->setUser($admin)->setTransactionGroup($transactionGroup); | ||||
| 
 | ||||
|         $selectedGroup    = $collector->getGroups()->first(); | ||||
|         if (null === $selectedGroup) { | ||||
|             throw new FireflyException('200032: Cannot find transaction. Possibly, a rule deleted this transaction after its creation.'); | ||||
|         } | ||||
| 
 | ||||
|         $transformer      = new TransactionGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response()->api($this->jsonApiObject('transactions', $selectedGroup, $transformer))->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| } | ||||
| @@ -1,85 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * IndexController.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\Api\V2\Controllers\Model\TransactionCurrency; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\TransactionCurrency\IndexRequest; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Transformers\CurrencyTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| 
 | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     public const string RESOURCE_KEY                   = 'transaction-currencies'; | ||||
|     protected array                     $acceptedRoles = [UserRoleEnum::READ_ONLY]; | ||||
|     private CurrencyRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CurrencyRepositoryInterface::class); | ||||
|                 // new way of user group validation
 | ||||
|                 $userGroup        = $this->validateUserGroup($request); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function index(IndexRequest $request): JsonResponse | ||||
|     { | ||||
|         $settings    = $request->getAll(); | ||||
|         $currencies  = new Collection(); | ||||
|         if (true === $settings['enabled']) { | ||||
|             $currencies = $this->repository->get(); | ||||
|         } | ||||
|         if (true !== $settings['enabled']) { | ||||
|             $currencies = $this->repository->getAll(); | ||||
|         } | ||||
| 
 | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $count       = $currencies->count(); | ||||
| 
 | ||||
|         // depending on the sort parameters, this list must not be split, because the
 | ||||
|         // order is calculated in the account transformer and by that time it's too late.
 | ||||
|         $accounts    = $currencies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator   = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer = new CurrencyTransformer(); | ||||
| 
 | ||||
|         $this->parameters->set('pageSize', $pageSize); | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,80 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2021 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Model\TransactionCurrency; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Models\UserGroup; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Transformers\CurrencyTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     public const string RESOURCE_KEY = 'transaction-currencies'; | ||||
| 
 | ||||
|     private CurrencyRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CurrencyRepositoryInterface::class); | ||||
|                 // new way of user group validation
 | ||||
|                 $userGroup        = $this->validateUserGroup($request); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function show(TransactionCurrency $currency): JsonResponse | ||||
|     { | ||||
|         $groups                     = $currency->userGroups()->where('user_groups.id', $this->repository->getUserGroup()->id)->get(); | ||||
|         $enabled                    = $groups->count() > 0; | ||||
|         $default                    = false; | ||||
| 
 | ||||
|         /** @var UserGroup $group */ | ||||
|         foreach ($groups as $group) { | ||||
|             $default = 1 === $group->pivot->group_default; | ||||
|         } | ||||
|         $currency->userGroupEnabled = $enabled; | ||||
|         $currency->userGroupNative  = $default; | ||||
| 
 | ||||
| 
 | ||||
|         $transformer                = new CurrencyTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject(self::RESOURCE_KEY, $currency, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,32 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\Search; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller {} | ||||
| @@ -1,412 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * SummaryController.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\V2\Controllers\Summary; | ||||
| 
 | ||||
| use Exception; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\DateRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Enums\TransactionTypeEnum; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Helpers\Report\NetWorthInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\UserGroup; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ExchangeRateConverter; | ||||
| use FireflyIII\Support\Http\Api\SummaryBalanceGrouped; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Class BasicController | ||||
|  */ | ||||
| class BasicController extends Controller | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private AvailableBudgetRepositoryInterface $abRepository; | ||||
|     private AccountRepositoryInterface         $accountRepository; | ||||
|     private BillRepositoryInterface            $billRepository; | ||||
|     private BudgetRepositoryInterface          $budgetRepository; | ||||
|     private CurrencyRepositoryInterface        $currencyRepos; | ||||
|     private OperationsRepositoryInterface      $opsRepository; | ||||
| 
 | ||||
|     /** | ||||
|      * BasicController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->abRepository      = app(AvailableBudgetRepositoryInterface::class); | ||||
|                 $this->accountRepository = app(AccountRepositoryInterface::class); | ||||
|                 $this->billRepository    = app(BillRepositoryInterface::class); | ||||
|                 $this->budgetRepository  = app(BudgetRepositoryInterface::class); | ||||
|                 $this->currencyRepos     = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->opsRepository     = app(OperationsRepositoryInterface::class); | ||||
| 
 | ||||
|                 $userGroup               = $this->validateUserGroup($request); | ||||
|                 $this->abRepository->setUserGroup($userGroup); | ||||
|                 $this->accountRepository->setUserGroup($userGroup); | ||||
|                 $this->billRepository->setUserGroup($userGroup); | ||||
|                 $this->budgetRepository->setUserGroup($userGroup); | ||||
|                 $this->opsRepository->setUserGroup($userGroup); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/summary/getBasicSummary
 | ||||
|      * | ||||
|      * @throws Exception | ||||
|      * | ||||
|      * @SuppressWarnings("PHPMD.UnusedFormalParameter") | ||||
|      */ | ||||
|     public function basic(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for boxes:
 | ||||
|         $start        = $this->parameters->get('start'); | ||||
|         $end          = $this->parameters->get('end'); | ||||
| 
 | ||||
|         // balance information:
 | ||||
|         $balanceData  = $this->getBalanceInformation($start, $end); | ||||
|         $billData     = $this->getBillInformation($start, $end); | ||||
|         $spentData    = $this->getLeftToSpendInfo($start, $end); | ||||
|         $netWorthData = $this->getNetWorthInfo($start, $end); | ||||
|         $total        = array_merge($balanceData, $billData, $spentData, $netWorthData); | ||||
| 
 | ||||
|         return response()->json($total); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function getBalanceInformation(Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         $object    = new SummaryBalanceGrouped(); | ||||
|         $default   = app('amount')->getNativeCurrency(); | ||||
| 
 | ||||
|         $object->setDefault($default); | ||||
| 
 | ||||
|         /** @var User $user */ | ||||
|         $user      = auth()->user(); | ||||
| 
 | ||||
|         // collect income of user using the new group collector.
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setRange($start, $end) | ||||
|             ->setUserGroup($user->userGroup) | ||||
|             // set page to retrieve
 | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return.
 | ||||
|             ->setTypes([TransactionTypeEnum::DEPOSIT->value]) | ||||
|             ->setRange($start, $end) | ||||
|         ; | ||||
| 
 | ||||
|         $set       = $collector->getExtractedJournals(); | ||||
|         $object->groupTransactions('income', $set); | ||||
| 
 | ||||
|         // collect expenses of user using the new group collector.
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setRange($start, $end) | ||||
|             ->setUserGroup($user->userGroup) | ||||
|             // set page to retrieve
 | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return.
 | ||||
|             ->setTypes([TransactionTypeEnum::WITHDRAWAL->value]) | ||||
|             ->setRange($start, $end) | ||||
|         ; | ||||
|         $set       = $collector->getExtractedJournals(); | ||||
|         $object->groupTransactions('expense', $set); | ||||
| 
 | ||||
|         return $object->groupData(); | ||||
|     } | ||||
| 
 | ||||
|     private function getBillInformation(Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         /* | ||||
|          * Since both this method and the chart use the exact same data, we can suffice | ||||
|          * with calling the one method in the bill repository that will get this amount. | ||||
|          */ | ||||
|         $paidAmount   = $this->billRepository->sumPaidInRange($start, $end); | ||||
|         $unpaidAmount = $this->billRepository->sumUnpaidInRange($start, $end); | ||||
| 
 | ||||
|         $return       = []; | ||||
| 
 | ||||
|         /** | ||||
|          * @var array $info | ||||
|          */ | ||||
|         foreach ($paidAmount as $info) { | ||||
|             $amount       = bcmul((string) $info['sum'], '-1'); | ||||
|             $nativeAmount = bcmul((string) $info['native_sum'], '-1'); | ||||
|             $return[]     = [ | ||||
|                 'key'                     => sprintf('bills-paid-in-%s', $info['currency_code']), | ||||
|                 'value'                   => $amount, | ||||
|                 'currency_id'             => (string) $info['currency_id'], | ||||
|                 'currency_code'           => $info['currency_code'], | ||||
|                 'currency_symbol'         => $info['currency_symbol'], | ||||
|                 'currency_decimal_places' => $info['currency_decimal_places'], | ||||
|             ]; | ||||
|             $return[]     = [ | ||||
|                 'key'                     => 'bills-paid-in-native', | ||||
|                 'value'                   => $nativeAmount, | ||||
|                 'currency_id'             => (string) $info['native_currency_id'], | ||||
|                 'currency_code'           => $info['native_currency_code'], | ||||
|                 'currency_symbol'         => $info['native_currency_symbol'], | ||||
|                 'currency_decimal_places' => $info['native_currency_decimal_places'], | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * @var array $info | ||||
|          */ | ||||
|         foreach ($unpaidAmount as $info) { | ||||
|             $amount       = bcmul((string) $info['sum'], '-1'); | ||||
|             $nativeAmount = bcmul((string) $info['native_sum'], '-1'); | ||||
|             $return[]     = [ | ||||
|                 'key'                     => sprintf('bills-unpaid-in-%s', $info['currency_code']), | ||||
|                 'value'                   => $amount, | ||||
|                 'currency_id'             => (string) $info['currency_id'], | ||||
|                 'currency_code'           => $info['currency_code'], | ||||
|                 'currency_symbol'         => $info['currency_symbol'], | ||||
|                 'currency_decimal_places' => $info['currency_decimal_places'], | ||||
|             ]; | ||||
|             $return[]     = [ | ||||
|                 'key'                     => 'bills-unpaid-in-native', | ||||
|                 'value'                   => $nativeAmount, | ||||
|                 'currency_id'             => (string) $info['native_currency_id'], | ||||
|                 'currency_code'           => $info['native_currency_code'], | ||||
|                 'currency_symbol'         => $info['native_currency_symbol'], | ||||
|                 'currency_decimal_places' => $info['native_currency_decimal_places'], | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @SuppressWarnings("PHPMD.ExcessiveMethodLength") | ||||
|      */ | ||||
|     private function getLeftToSpendInfo(Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__)); | ||||
|         app('log')->debug('Now in getLeftToSpendInfo'); | ||||
|         $return       = []; | ||||
|         $today        = today(config('app.timezone')); | ||||
|         $available    = $this->abRepository->getAvailableBudgetWithCurrency($start, $end); | ||||
|         $budgets      = $this->budgetRepository->getActiveBudgets(); | ||||
|         $spent        = $this->opsRepository->listExpenses($start, $end, null, $budgets); | ||||
|         $default      = app('amount')->getNativeCurrency(); | ||||
|         $currencies   = []; | ||||
|         $converter    = new ExchangeRateConverter(); | ||||
| 
 | ||||
|         // native info:
 | ||||
|         $nativeLeft   = [ | ||||
|             'key'                     => 'left-to-spend-in-native', | ||||
|             'value'                   => '0', | ||||
|             'currency_id'             => (string) $default->id, | ||||
|             'currency_code'           => $default->code, | ||||
|             'currency_symbol'         => $default->symbol, | ||||
|             'currency_decimal_places' => $default->decimal_places, | ||||
|         ]; | ||||
|         $nativePerDay = [ | ||||
|             'key'                     => 'left-per-day-to-spend-in-native', | ||||
|             'value'                   => '0', | ||||
|             'currency_id'             => (string) $default->id, | ||||
|             'currency_code'           => $default->code, | ||||
|             'currency_symbol'         => $default->symbol, | ||||
|             'currency_decimal_places' => $default->decimal_places, | ||||
|         ]; | ||||
| 
 | ||||
|         /** | ||||
|          * @var int   $currencyId | ||||
|          * @var array $row | ||||
|          */ | ||||
|         foreach ($spent as $currencyId => $row) { | ||||
|             app('log')->debug(sprintf('Processing spent array in currency #%d', $currencyId)); | ||||
|             $spent                   = '0'; | ||||
|             $spentNative             = '0'; | ||||
| 
 | ||||
|             // get the sum from the array of transactions (double loop but who cares)
 | ||||
|             /** @var array $budget */ | ||||
|             foreach ($row['budgets'] as $budget) { | ||||
|                 app('log')->debug(sprintf('Processing expenses in budget "%s".', $budget['name'])); | ||||
| 
 | ||||
|                 /** @var array $journal */ | ||||
|                 foreach ($budget['transaction_journals'] as $journal) { | ||||
|                     $journalCurrencyId       = $journal['currency_id']; | ||||
|                     $currency                = $currencies[$journalCurrencyId] ?? $this->currencyRepos->find($journalCurrencyId); | ||||
|                     $currencies[$currencyId] = $currency; | ||||
|                     $amount                  = app('steam')->negative($journal['amount']); | ||||
|                     $amountNative            = $converter->convert($default, $currency, $start, $amount); | ||||
|                     if ((int) $journal['foreign_currency_id'] === $default->id) { | ||||
|                         $amountNative = $journal['foreign_amount']; | ||||
|                     } | ||||
|                     $spent                   = bcadd($spent, (string) $amount); | ||||
|                     $spentNative             = bcadd($spentNative, (string) $amountNative); | ||||
|                 } | ||||
|                 app('log')->debug(sprintf('Total spent in budget "%s" is %s', $budget['name'], $spent)); | ||||
|             } | ||||
| 
 | ||||
|             // either an amount was budgeted or 0 is available.
 | ||||
|             $currency                = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId); | ||||
|             $currencies[$currencyId] = $currency; | ||||
|             $amount                  = $available[$currencyId]['amount'] ?? '0'; | ||||
|             $amountNative            = $available[$currencyId]['native_amount'] ?? '0'; | ||||
|             $left                    = bcadd($amount, $spent); | ||||
|             $leftNative              = bcadd($amountNative, $spentNative); | ||||
|             app('log')->debug(sprintf('Available amount is %s', $amount)); | ||||
|             app('log')->debug(sprintf('Amount left is %s', $left)); | ||||
| 
 | ||||
|             // how much left per day?
 | ||||
|             $days                    = (int) $today->diffInDays($end, true) + 1; | ||||
|             $perDay                  = '0'; | ||||
|             $perDayNative            = '0'; | ||||
|             if (0 !== $days && bccomp($left, '0') > -1) { | ||||
|                 $perDay = bcdiv($left, (string) $days); | ||||
|             } | ||||
|             if (0 !== $days && bccomp($leftNative, '0') > -1) { | ||||
|                 $perDayNative = bcdiv($leftNative, (string) $days); | ||||
|             } | ||||
| 
 | ||||
|             // left
 | ||||
|             $return[]                = [ | ||||
|                 'key'                     => sprintf('left-to-spend-in-%s', $row['currency_code']), | ||||
|                 'value'                   => $left, | ||||
|                 'currency_id'             => (string) $row['currency_id'], | ||||
|                 'currency_code'           => $row['currency_code'], | ||||
|                 'currency_symbol'         => $row['currency_symbol'], | ||||
|                 'currency_decimal_places' => (int) $row['currency_decimal_places'], | ||||
|             ]; | ||||
|             // left (native)
 | ||||
|             $nativeLeft['value']     = $leftNative; | ||||
| 
 | ||||
|             // left per day:
 | ||||
|             $return[]                = [ | ||||
|                 'key'                     => sprintf('left-per-day-to-spend-in-%s', $row['currency_code']), | ||||
|                 'value'                   => $perDay, | ||||
|                 'currency_id'             => (string) $row['currency_id'], | ||||
|                 'currency_code'           => $row['currency_code'], | ||||
|                 'currency_symbol'         => $row['currency_symbol'], | ||||
|                 'currency_decimal_places' => (int) $row['currency_decimal_places'], | ||||
|             ]; | ||||
| 
 | ||||
|             // left per day (native)
 | ||||
|             $nativePerDay['value']   = $perDayNative; | ||||
|         } | ||||
|         $return[]     = $nativeLeft; | ||||
|         $return[]     = $nativePerDay; | ||||
|         $converter->summarize(); | ||||
| 
 | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
|     private function getNetWorthInfo(Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         /** @var UserGroup $userGroup */ | ||||
|         $userGroup      = auth()->user()->userGroup; | ||||
|         $date           = today(config('app.timezone'))->startOfDay(); | ||||
|         // start and end in the future? use $end
 | ||||
|         if ($this->notInDateRange($date, $start, $end)) { | ||||
|             /** @var Carbon $date */ | ||||
|             $date = session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         } | ||||
| 
 | ||||
|         /** @var NetWorthInterface $netWorthHelper */ | ||||
|         $netWorthHelper = app(NetWorthInterface::class); | ||||
|         $netWorthHelper->setUserGroup($userGroup); | ||||
|         $allAccounts    = $this->accountRepository->getActiveAccountsByType( | ||||
|             [AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::DEBT->value] | ||||
|         ); | ||||
| 
 | ||||
|         // filter list on preference of being included.
 | ||||
|         $filtered       = $allAccounts->filter( | ||||
|             function (Account $account) { | ||||
|                 $includeNetWorth = $this->accountRepository->getMetaValue($account, 'include_net_worth'); | ||||
| 
 | ||||
|                 return null === $includeNetWorth || '1' === $includeNetWorth; | ||||
|             } | ||||
|         ); | ||||
| 
 | ||||
|         $netWorthSet    = $netWorthHelper->byAccounts($filtered, $date); | ||||
|         $return         = []; | ||||
|         // in native amount
 | ||||
|         $return[]       = [ | ||||
|             'key'                     => 'net-worth-in-native', | ||||
|             'value'                   => $netWorthSet['native']['balance'], | ||||
|             'currency_id'             => (string) $netWorthSet['native']['currency_id'], | ||||
|             'currency_code'           => $netWorthSet['native']['currency_code'], | ||||
|             'currency_symbol'         => $netWorthSet['native']['currency_symbol'], | ||||
|             'currency_decimal_places' => $netWorthSet['native']['currency_decimal_places'], | ||||
|         ]; | ||||
|         foreach ($netWorthSet as $key => $data) { | ||||
|             if ('native' === $key) { | ||||
|                 continue; | ||||
|             } | ||||
|             $return[] = [ | ||||
|                 'key'                     => sprintf('net-worth-in-%s', $data['currency_code']), | ||||
|                 'value'                   => $data['balance'], | ||||
|                 'currency_id'             => (string) $data['currency_id'], | ||||
|                 'currency_code'           => $data['currency_code'], | ||||
|                 'currency_symbol'         => $data['currency_symbol'], | ||||
|                 'currency_decimal_places' => $data['currency_decimal_places'], | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Check if date is outside session range. | ||||
|      */ | ||||
|     protected function notInDateRange(Carbon $date, Carbon $start, Carbon $end): bool // Validate a preference
 | ||||
|     { | ||||
|         if ($start->greaterThanOrEqualTo($date) && $end->greaterThanOrEqualTo($date)) { | ||||
|             return true; | ||||
|         } | ||||
|         // start and end in the past? use $end
 | ||||
|         if ($start->lessThanOrEqualTo($date) && $end->lessThanOrEqualTo($date)) { | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| @@ -1,86 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * NetWorthController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Summary; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Generic\SingleDateRequest; | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Helpers\Report\NetWorthInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class NetWorthController | ||||
|  */ | ||||
| class NetWorthController extends Controller | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     private NetWorthInterface          $netWorth; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->netWorth   = app(NetWorthInterface::class); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 // new way of user group validation
 | ||||
|                 $userGroup        = $this->validateUserGroup($request); | ||||
|                 $this->netWorth->setUserGroup($userGroup); | ||||
|                 $this->repository->setUserGroup($userGroup); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/net-worth/getNetWorth
 | ||||
|      */ | ||||
|     public function get(SingleDateRequest $request): JsonResponse | ||||
|     { | ||||
|         $date     = $request->getDate(); | ||||
|         $accounts = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value]); | ||||
| 
 | ||||
|         // filter list on preference of being included.
 | ||||
|         $filtered = $accounts->filter( | ||||
|             function (Account $account) { | ||||
|                 $includeNetWorth = $this->repository->getMetaValue($account, 'include_net_worth'); | ||||
| 
 | ||||
|                 return null === $includeNetWorth || '1' === $includeNetWorth; | ||||
|             } | ||||
|         ); | ||||
| 
 | ||||
|         // skip accounts that should not be in the net worth
 | ||||
|         $result   = $this->netWorth->byAccounts($filtered, $date); | ||||
| 
 | ||||
|         return response()->api($result); | ||||
|     } | ||||
| } | ||||
| @@ -1,30 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ConfigurationController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\System; | ||||
| 
 | ||||
| /** | ||||
|  * Class ConfigurationController | ||||
|  */ | ||||
| class ConfigurationController {} | ||||
| @@ -1,32 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * DebugController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\System; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Class DebugController | ||||
|  */ | ||||
| class DebugController extends Controller {} | ||||
| @@ -1,48 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * PreferencesController.php | ||||
|  * Copyright (c) 2022 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\V2\Controllers\System; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\Transformers\PreferenceTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class PreferencesController | ||||
|  */ | ||||
| class PreferencesController extends Controller | ||||
| { | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/preferences/getPreference
 | ||||
|      */ | ||||
|     public function get(Preference $preference): JsonResponse | ||||
|     { | ||||
|         return response() | ||||
|             ->json($this->jsonApiObject('preferences', $preference, new PreferenceTransformer())) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,32 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * VersionUpdateController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\System; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Class VersionUpdateController | ||||
|  */ | ||||
| class VersionUpdateController extends Controller {} | ||||
| @@ -1,89 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Transaction\List; | ||||
| 
 | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\Transaction\ListRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Collection; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
|  */ | ||||
| class AccountController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/accounts/listTransactionByAccount
 | ||||
|      */ | ||||
|     public function list(ListRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         // collect transactions:
 | ||||
|         $page      = $request->getPage(); | ||||
|         $page      = max($page, 1); | ||||
|         $pageSize  = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setAccounts(new Collection([$account])) | ||||
|             ->withAPIInformation() | ||||
|             ->setLimit($pageSize) | ||||
|             ->setPage($page) | ||||
|             ->setTypes($request->getTransactionTypes()) | ||||
|         ; | ||||
| 
 | ||||
|         $start     = $request->getStartDate(); | ||||
|         $end       = $request->getEndDate(); | ||||
|         if ($start instanceof Carbon) { | ||||
|             app('log')->debug(sprintf('Set start date to %s', $start->toIso8601String())); | ||||
|             $collector->setStart($start); | ||||
|         } | ||||
|         if ($end instanceof Carbon) { | ||||
|             app('log')->debug(sprintf('Set end date to %s', $start->toIso8601String())); | ||||
|             $collector->setEnd($end); | ||||
|         } | ||||
| 
 | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath( | ||||
|             sprintf( | ||||
|                 '%s?%s', | ||||
|                 route('api.v2.accounts.transactions', [$account->id]), | ||||
|                 $request->buildParams($pageSize) | ||||
|             ) | ||||
|         ); | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('transactions', $paginator, new TransactionGroupTransformer())) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,120 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * TransactionController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Transaction\List; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\Transaction\InfiniteListRequest; | ||||
| use FireflyIII\Api\V2\Request\Model\Transaction\ListRequest; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class TransactionController | ||||
|  */ | ||||
| class TransactionController extends Controller | ||||
| { | ||||
|     public function infiniteList(InfiniteListRequest $request): JsonResponse | ||||
|     { | ||||
|         // get sort instructions
 | ||||
|         $instructions = $request->getSortInstructions('transactions'); | ||||
| 
 | ||||
|         // collect transactions:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector    = app(GroupCollectorInterface::class); | ||||
|         $collector->setUserGroup(auth()->user()->userGroup) | ||||
|             ->withAPIInformation() | ||||
|             ->setStartRow($request->getStartRow()) | ||||
|             ->setEndRow($request->getEndRow()) | ||||
|             ->setTypes($request->getTransactionTypes()) | ||||
|             ->setSorting($instructions) | ||||
|         ; | ||||
| 
 | ||||
|         $start        = $this->parameters->get('start'); | ||||
|         $end          = $this->parameters->get('end'); | ||||
|         if (null !== $start) { | ||||
|             $collector->setStart($start); | ||||
|         } | ||||
|         if (null !== $end) { | ||||
|             $collector->setEnd($end); | ||||
|         } | ||||
| 
 | ||||
|         $paginator    = $collector->getPaginatedGroups(); | ||||
|         $params       = $request->buildParams(); | ||||
|         $paginator->setPath( | ||||
|             sprintf( | ||||
|                 '%s?%s', | ||||
|                 route('api.v2.infinite.transactions.list'), | ||||
|                 $params | ||||
|             ) | ||||
|         ); | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('transactions', $paginator, new TransactionGroupTransformer())) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| 
 | ||||
|     public function list(ListRequest $request): JsonResponse | ||||
|     { | ||||
|         // collect transactions:
 | ||||
|         $pageSize  = $this->parameters->get('limit'); | ||||
|         $page      = $request->getPage(); | ||||
|         $page      = max($page, 1); | ||||
| 
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector->setUserGroup(auth()->user()->userGroup) | ||||
|             ->withAPIInformation() | ||||
|             ->setLimit($pageSize) | ||||
|             ->setPage($page) | ||||
|             ->setTypes($request->getTransactionTypes()) | ||||
|         ; | ||||
| 
 | ||||
|         $start     = $this->parameters->get('start'); | ||||
|         $end       = $this->parameters->get('end'); | ||||
|         if (null !== $start) { | ||||
|             $collector->setStart($start); | ||||
|         } | ||||
|         if (null !== $end) { | ||||
|             $collector->setEnd($end); | ||||
|         } | ||||
| 
 | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $params    = $request->buildParams($pageSize); | ||||
|         $paginator->setPath( | ||||
|             sprintf( | ||||
|                 '%s?%s', | ||||
|                 route('api.v2.transactions.list'), | ||||
|                 $params | ||||
|             ) | ||||
|         ); | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('transactions', $paginator, new TransactionGroupTransformer())) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,32 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * BillController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\Transaction\Sum; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Class BillController | ||||
|  */ | ||||
| class BillController extends Controller {} | ||||
| @@ -1,68 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * DestroyController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\UserGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Models\UserGroup; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
| 
 | ||||
| /** | ||||
|  * Class DestroyController | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     private UserGroupRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(UserGroupRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function destroy(UserGroup $userGroup): JsonResponse | ||||
|     { | ||||
|         /** @var User $user */ | ||||
|         $user   = auth()->user(); | ||||
|         // to access this function: must be group owner or sysadmin.
 | ||||
|         // need owner role or system owner role to delete user group.
 | ||||
|         $access = $user->hasSpecificRoleInGroup($userGroup, UserRoleEnum::OWNER) || $user->hasRole('owner'); | ||||
|         if (false === $access) { | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
|         $this->repository->destroy($userGroup); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -1,74 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * IndexController.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\Api\V2\Controllers\UserGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\Model\Account\IndexRequest; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\UserGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| 
 | ||||
| class IndexController extends Controller | ||||
| { | ||||
|     public const string RESOURCE_KEY = 'user_groups'; | ||||
| 
 | ||||
|     private UserGroupRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(UserGroupRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * TODO see autocomplete/accountcontroller for list. | ||||
|      */ | ||||
|     public function index(IndexRequest $request): JsonResponse | ||||
|     { | ||||
|         $administrations = $this->repository->get(); | ||||
|         $pageSize        = $this->parameters->get('limit'); | ||||
|         $count           = $administrations->count(); | ||||
|         $administrations = $administrations->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator       = new LengthAwarePaginator($administrations, $count, $pageSize, $this->parameters->get('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) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,88 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * ShowController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\UserGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Models\UserGroup; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\UserGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| 
 | ||||
| /** | ||||
|  * Class ShowController | ||||
|  */ | ||||
| class ShowController extends Controller | ||||
| { | ||||
|     private UserGroupRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(UserGroupRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $collection  = new Collection(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         // if the user has the system owner role, get all. Otherwise, get only the users' groups.
 | ||||
|         if (!auth()->user()->hasRole('owner')) { | ||||
|             $collection = $this->repository->get(); | ||||
|         } | ||||
|         if (auth()->user()->hasRole('owner')) { | ||||
|             $collection = $this->repository->getAll(); | ||||
|         } | ||||
|         $count       = $collection->count(); | ||||
|         $userGroups  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         $paginator   = new LengthAwarePaginator($userGroups, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $transformer = new UserGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); // give params to transformer
 | ||||
| 
 | ||||
|         return response() | ||||
|             ->json($this->jsonApiList('user-groups', $paginator, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| 
 | ||||
|     public function show(UserGroup $userGroup): JsonResponse | ||||
|     { | ||||
|         $transformer = new UserGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('user-groups', $userGroup, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,64 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * StoreController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\UserGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\UserGroup\StoreRequest; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\UserGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreController | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     private UserGroupRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(UserGroupRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $all         = $request->getAll(); | ||||
|         $userGroup   = $this->repository->store($all); | ||||
|         $transformer = new UserGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('user-groups', $userGroup, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| } | ||||
| @@ -1,90 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * UpdateController.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Controllers\UserGroup; | ||||
| 
 | ||||
| use FireflyIII\Api\V2\Controllers\Controller; | ||||
| use FireflyIII\Api\V2\Request\UserGroup\UpdateMembershipRequest; | ||||
| use FireflyIII\Api\V2\Request\UserGroup\UpdateRequest; | ||||
| use FireflyIII\Models\UserGroup; | ||||
| use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\UserGroupTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     // basic update van group
 | ||||
|     // add user, add rights, remove user, remove rights.
 | ||||
| 
 | ||||
|     private UserGroupRepositoryInterface $repository; | ||||
| 
 | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(UserGroupRepositoryInterface::class); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public function update(UpdateRequest $request, UserGroup $userGroup): JsonResponse | ||||
|     { | ||||
|         $all         = $request->getAll(); | ||||
|         $userGroup   = $this->repository->update($userGroup, $all); | ||||
|         $transformer = new UserGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('user-groups', $userGroup, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| 
 | ||||
|     public function updateMembership(UpdateMembershipRequest $request, UserGroup $userGroup): JsonResponse | ||||
|     { | ||||
|         $all         = $request->getAll(); | ||||
|         $userGroup   = $this->repository->updateMembership($userGroup, $all); | ||||
|         $transformer = new UserGroupTransformer(); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         return response() | ||||
|             ->api($this->jsonApiObject('user-groups', $userGroup, $transformer)) | ||||
|             ->header('Content-Type', self::CONTENT_TYPE) | ||||
|         ; | ||||
|     } | ||||
| 
 | ||||
|     public function useUserGroup(UserGroup $userGroup): JsonResponse | ||||
|     { | ||||
|         // group validation is already in place, so can just update the user.
 | ||||
|         $this->repository->useUserGroup($userGroup); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| } | ||||
| @@ -1,97 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * AutocompleteRequest.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Request\Autocomplete; | ||||
| 
 | ||||
| use FireflyIII\Enums\AccountTypeEnum; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| 
 | ||||
| /** | ||||
|  * Class AutocompleteRequest | ||||
|  */ | ||||
| class AutocompleteRequest extends FormRequest | ||||
| { | ||||
|     use AccountFilter; | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
| 
 | ||||
|     /** | ||||
|      * Loops over all possible query parameters (these are shared over ALL auto complete requests) | ||||
|      * and returns a validated array of parameters. | ||||
|      * | ||||
|      * The advantage is a single class. But you may also submit "account types" to an endpoint that doesn't use these. | ||||
|      */ | ||||
|     public function getParameters(): array | ||||
|     { | ||||
|         $array                  = [ | ||||
|             'date'              => $this->convertDateTime('date'), | ||||
|             'query'             => $this->clearString((string) $this->get('query')), | ||||
|             'size'              => $this->integerFromValue('size'), | ||||
|             'page'              => $this->integerFromValue('page'), | ||||
|             'account_types'     => $this->arrayFromValue($this->get('account_types')), | ||||
|             'transaction_types' => $this->arrayFromValue($this->get('transaction_types')), | ||||
|         ]; | ||||
|         $array['size']          = $array['size'] < 1 || $array['size'] > 100 ? 15 : $array['size']; | ||||
|         $array['page']          = max($array['page'], 1); | ||||
|         if (null === $array['account_types']) { | ||||
|             $array['account_types'] = []; | ||||
|         } | ||||
|         if (null === $array['transaction_types']) { | ||||
|             $array['transaction_types'] = []; | ||||
|         } | ||||
| 
 | ||||
|         // remove 'initial balance' from allowed types. its internal
 | ||||
|         $array['account_types'] = array_diff($array['account_types'], [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value, AccountTypeEnum::CREDITCARD->value]); | ||||
|         $array['account_types'] = $this->getAccountTypeParameter($array['account_types']); | ||||
| 
 | ||||
|         return $array; | ||||
|     } | ||||
| 
 | ||||
|     private function getAccountTypeParameter(array $types): array | ||||
|     { | ||||
|         $return = []; | ||||
|         foreach ($types as $type) { | ||||
|             $return = array_merge($return, $this->mapAccountTypes($type)); | ||||
|         } | ||||
| 
 | ||||
|         return array_unique($return); | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $valid = array_keys($this->types); | ||||
| 
 | ||||
|         return [ | ||||
|             'date'              => 'nullable|date|after:1970-01-02|before:2038-01-17', | ||||
|             'query'             => 'nullable|string', | ||||
|             'size'              => 'nullable|integer|min:1|max:100', | ||||
|             'page'              => 'nullable|integer|min:1', | ||||
|             'account_types'     => sprintf('nullable|in:%s', implode(',', $valid)), | ||||
|             'transaction_types' => 'nullable|in:todo', | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -1,90 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * BalanceChartRequest.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Request\Chart; | ||||
| 
 | ||||
| use Illuminate\Contracts\Validation\Validator; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Class BalanceChartRequest | ||||
|  */ | ||||
| class BalanceChartRequest extends FormRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; | ||||
| 
 | ||||
|     /** | ||||
|      * Get all data from the request. | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'accounts' => $this->getAccountList(), | ||||
|             'period'   => $this->convertString('period'), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The rules that the incoming request must be matched against. | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start'      => 'required|date|after:1970-01-02|before:2038-01-17', | ||||
|             'end'        => 'required|date|after_or_equal:start|before:2038-01-17|after:1970-01-02', | ||||
|             'accounts.*' => 'required|exists:accounts,id', | ||||
|             'period'     => sprintf('required|in:%s', implode(',', config('firefly.valid_view_ranges'))), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             static function (Validator $validator): void { | ||||
|                 // validate transaction query data.
 | ||||
|                 $data = $validator->getData(); | ||||
|                 if (!array_key_exists('accounts', $data)) { | ||||
|                     $validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts'])); | ||||
| 
 | ||||
|                     return; | ||||
|                 } | ||||
|                 if (!is_array($data['accounts'])) { | ||||
|                     $validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts'])); | ||||
|                 } | ||||
|             } | ||||
|         ); | ||||
|         if ($validator->fails()) { | ||||
|             Log::channel('audit')->error(sprintf('Validation errors in %s', self::class), $validator->errors()->toArray()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,92 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| /* | ||||
|  * DashboardChartRequest.php | ||||
|  * Copyright (c) 2023 james@firefly-iii.org | ||||
|  * | ||||
|  * This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Api\V2\Request\Chart; | ||||
| 
 | ||||
| use Illuminate\Contracts\Validation\Validator; | ||||
| use FireflyIII\Enums\UserRoleEnum; | ||||
| use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; | ||||
| use FireflyIII\Support\Request\ChecksLogin; | ||||
| use FireflyIII\Support\Request\ConvertsDataTypes; | ||||
| use Illuminate\Foundation\Http\FormRequest; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| 
 | ||||
| /** | ||||
|  * Class ChartRequest | ||||
|  */ | ||||
| class ChartRequest extends FormRequest | ||||
| { | ||||
|     use ChecksLogin; | ||||
|     use ConvertsDataTypes; | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; | ||||
| 
 | ||||
|     public function getParameters(): array | ||||
|     { | ||||
|         // $queryParameters = QueryParameters::cast($this->all());
 | ||||
|         return [ | ||||
|             'start'       => $this->convertDateTime('start')?->startOfDay(), | ||||
|             'end'         => $this->convertDateTime('end')?->endOfDay(), | ||||
|             'preselected' => $this->convertString('preselected', 'empty'), | ||||
|             'period'      => $this->convertString('period', '1M'), | ||||
|             'accounts'    => $this->arrayFromValue($this->get('accounts')), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The rules that the incoming request must be matched against. | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'start'       => 'required|date|after:1970-01-02|before:2038-01-17|before_or_equal:end', | ||||
|             'end'         => 'required|date|after:1970-01-02|before:2038-01-17|after_or_equal:start', | ||||
|             'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))), | ||||
|             'period'      => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))), | ||||
|             'accounts.*'  => 'exists:accounts,id', | ||||
|         ]; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             static function (Validator $validator): void { | ||||
|                 // validate transaction query data.
 | ||||
|                 $data = $validator->getData(); | ||||
|                 if (!array_key_exists('accounts', $data)) { | ||||
|                     // $validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts']));
 | ||||
|                     return; | ||||
|                 } | ||||
|                 if (!is_array($data['accounts'])) { | ||||
|                     $validator->errors()->add('accounts', trans('validation.filled', ['attribute' => 'accounts'])); | ||||
|                 } | ||||
|             } | ||||
|         ); | ||||
|         if ($validator->fails()) { | ||||
|             Log::channel('audit')->error(sprintf('Validation errors in %s', self::class), $validator->errors()->toArray()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user