mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 02:36:28 +00:00 
			
		
		
		
	Updated website boxes.
This commit is contained in:
		| @@ -198,7 +198,7 @@ class BudgetController extends Controller | ||||
|         $inactive          = $this->repository->getInactiveBudgets(); | ||||
|         $periodStart       = $start->formatLocalized($this->monthAndDayFormat); | ||||
|         $periodEnd         = $end->formatLocalized($this->monthAndDayFormat); | ||||
|         $budgetInformation = $this->collectBudgetInformation($budgets, $start, $end); | ||||
|         $budgetInformation = $this->repository->collectBudgetInformation($budgets, $start, $end); | ||||
|         $defaultCurrency   = Amount::getDefaultCurrency(); | ||||
|         $available         = $this->repository->getAvailableBudget($defaultCurrency, $start, $end); | ||||
|         $spent             = array_sum(array_column($budgetInformation, 'spent')); | ||||
| @@ -252,8 +252,8 @@ class BudgetController extends Controller | ||||
|      * | ||||
|      * @return View | ||||
|      * | ||||
|      *  @SuppressWarnings(PHPMD.CyclomaticComplexity) | ||||
|      *  @SuppressWarnings(PHPMD.ExcessiveMethodLength) | ||||
|      * @SuppressWarnings(PHPMD.CyclomaticComplexity) | ||||
|      * @SuppressWarnings(PHPMD.ExcessiveMethodLength) | ||||
|      */ | ||||
|     public function noBudget(Request $request, JournalRepositoryInterface $repository, string $moment = '') | ||||
|     { | ||||
| @@ -457,50 +457,6 @@ class BudgetController extends Controller | ||||
|         return view('budgets.income', compact('available', 'start', 'end')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $budgets | ||||
|      * @param Carbon     $start | ||||
|      * @param Carbon     $end | ||||
|      * | ||||
|      * @return array | ||||
|      * @SuppressWarnings(PHPMD.CyclomaticComplexity) | ||||
|      */ | ||||
|     private function collectBudgetInformation(Collection $budgets, Carbon $start, Carbon $end): array | ||||
|     { | ||||
|         // get account information | ||||
|         /** @var AccountRepositoryInterface $accountRepository */ | ||||
|         $accountRepository = app(AccountRepositoryInterface::class); | ||||
|         $accounts          = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); | ||||
|         $return            = []; | ||||
|         /** @var Budget $budget */ | ||||
|         foreach ($budgets as $budget) { | ||||
|             $budgetId          = $budget->id; | ||||
|             $return[$budgetId] = [ | ||||
|                 'spent'      => $this->repository->spentInPeriod(new Collection([$budget]), $accounts, $start, $end), | ||||
|                 'budgeted'   => '0', | ||||
|                 'currentRep' => false, | ||||
|             ]; | ||||
|             $budgetLimits      = $this->repository->getBudgetLimits($budget, $start, $end); | ||||
|             $otherLimits       = new Collection; | ||||
|  | ||||
|             // get all the budget limits relevant between start and end and examine them: | ||||
|             /** @var BudgetLimit $limit */ | ||||
|             foreach ($budgetLimits as $limit) { | ||||
|                 if ($limit->start_date->isSameDay($start) && $limit->end_date->isSameDay($end) | ||||
|                 ) { | ||||
|                     $return[$budgetId]['currentLimit'] = $limit; | ||||
|                     $return[$budgetId]['budgeted']     = $limit->amount; | ||||
|                     continue; | ||||
|                 } | ||||
|                 // otherwise it's just one of the many relevant repetitions: | ||||
|                 $otherLimits->push($limit); | ||||
|             } | ||||
|             $return[$budgetId]['otherLimits'] = $otherLimits; | ||||
|         } | ||||
|  | ||||
|         return $return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Budget $budget | ||||
|      * @param Carbon $start | ||||
|   | ||||
							
								
								
									
										194
									
								
								app/Http/Controllers/Json/BoxController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								app/Http/Controllers/Json/BoxController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,194 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BoxController.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Http\Controllers\Json; | ||||
|  | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Helpers\Collector\JournalCollectorInterface; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Support\CacheProperties; | ||||
| use Response; | ||||
|  | ||||
| /** | ||||
|  * Class BoxController | ||||
|  * | ||||
|  * @package FireflyIII\Http\Controllers\Json | ||||
|  */ | ||||
| class BoxController extends Controller | ||||
| { | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function available(BudgetRepositoryInterface $repository) | ||||
|     { | ||||
|         $start = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = session('end', Carbon::now()->endOfMonth()); | ||||
|         $today = new Carbon; | ||||
|         $cache = new CacheProperties; | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty($today); | ||||
|         $cache->addProperty('box-available'); | ||||
|         if ($cache->has()) { | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|         // get available amount | ||||
|         $currency  = app('amount')->getDefaultCurrency(); | ||||
|         $available = $repository->getAvailableBudget($currency, $start, $end); | ||||
|  | ||||
|  | ||||
|         // get spent amount: | ||||
|         $budgets           = $repository->getActiveBudgets(); | ||||
|         $budgetInformation = $repository->collectBudgetInformation($budgets, $start, $end); | ||||
|         $spent             = strval(array_sum(array_column($budgetInformation, 'spent'))); | ||||
|         $left              = bcadd($available, $spent); | ||||
|         // left less than zero? then it's zero: | ||||
|         if (bccomp($left, '0') === -1) { | ||||
|             $left = '0'; | ||||
|         } | ||||
|         $days   = $today->diffInDays($end); | ||||
|         $perDay = '0'; | ||||
|         if ($days !== 0) { | ||||
|             $perDay = bcdiv($left, strval($days)); | ||||
|         } | ||||
|  | ||||
|         $return = [ | ||||
|             'perDay' => app('amount')->formatAnything($currency, $perDay, false), | ||||
|             'left'   => app('amount')->formatAnything($currency, $left, false), | ||||
|         ]; | ||||
|  | ||||
|         $cache->store($return); | ||||
|  | ||||
|         return Response::json($return); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function balance() | ||||
|     { | ||||
|         $start = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = session('end', Carbon::now()->endOfMonth()); | ||||
|  | ||||
|         $cache = new CacheProperties; | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty('box-balance'); | ||||
|         if ($cache->has()) { | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|  | ||||
|         // try a collector for income: | ||||
|         /** @var JournalCollectorInterface $collector */ | ||||
|         $collector = app(JournalCollectorInterface::class); | ||||
|         $collector->setAllAssetAccounts()->setRange($start, $end) | ||||
|                   ->setTypes([TransactionType::DEPOSIT]) | ||||
|                   ->withOpposingAccount(); | ||||
|         $income   = strval($collector->getJournals()->sum('transaction_amount')); | ||||
|         $currency = app('amount')->getDefaultCurrency(); | ||||
|  | ||||
|         // expense: | ||||
|         // try a collector for expenses: | ||||
|         /** @var JournalCollectorInterface $collector */ | ||||
|         $collector = app(JournalCollectorInterface::class); | ||||
|         $collector->setAllAssetAccounts()->setRange($start, $end) | ||||
|                   ->setTypes([TransactionType::WITHDRAWAL]) | ||||
|                   ->withOpposingAccount(); | ||||
|         $expense = strval($collector->getJournals()->sum('transaction_amount')); | ||||
|  | ||||
|         $response = [ | ||||
|             'income'   => app('amount')->formatAnything($currency, $income, false), | ||||
|             'expense'  => app('amount')->formatAnything($currency, $expense, false), | ||||
|             'combined' => app('amount')->formatAnything($currency, bcadd($income, $expense), false), | ||||
|         ]; | ||||
|  | ||||
|         $cache->store($response); | ||||
|  | ||||
|         return Response::json($response); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param BillRepositoryInterface $repository | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function bills(BillRepositoryInterface $repository) | ||||
|     { | ||||
|         $start = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = session('end', Carbon::now()->endOfMonth()); | ||||
|  | ||||
|         $cache = new CacheProperties; | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty('box-bills'); | ||||
|         if ($cache->has()) { | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|  | ||||
|         /* | ||||
|          * 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   = bcmul($repository->getBillsPaidInRange($start, $end), '-1'); | ||||
|         $unpaidAmount = $repository->getBillsUnpaidInRange($start, $end); // will be a positive amount. | ||||
|         $currency     = app('amount')->getDefaultCurrency(); | ||||
|  | ||||
|         $return = [ | ||||
|             'paid'   => app('amount')->formatAnything($currency, $paidAmount, false), | ||||
|             'unpaid' => app('amount')->formatAnything($currency, $unpaidAmount, false), | ||||
|         ]; | ||||
|         $cache->store($return); | ||||
|  | ||||
|         return Response::json($return); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param AccountRepositoryInterface $repository | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function netWorth(AccountRepositoryInterface $repository) | ||||
|     { | ||||
|         $start = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = session('end', Carbon::now()->endOfMonth()); | ||||
|  | ||||
|         $cache = new CacheProperties; | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty('box-net-worth'); | ||||
|         if ($cache->has()) { | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|         $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); | ||||
|         $currency = app('amount')->getDefaultCurrency(); | ||||
|         $balances = app('steam')->balancesByAccounts($accounts, new Carbon); | ||||
|         $sum      = '0'; | ||||
|         foreach ($balances as $entry) { | ||||
|             $sum = bcadd($sum, $entry); | ||||
|         } | ||||
|  | ||||
|         $return = [ | ||||
|             'net_worth' => app('amount')->formatAnything($currency, $sum, false), | ||||
|         ]; | ||||
|  | ||||
|         $cache->store($return); | ||||
|  | ||||
|         return Response::json($return); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -60,114 +60,6 @@ class JsonController extends Controller | ||||
|         return Response::json(['html' => $view]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param BillRepositoryInterface $repository | ||||
|      * | ||||
|      * @return \Symfony\Component\HttpFoundation\Response | ||||
|      */ | ||||
|     public function boxBillsPaid(BillRepositoryInterface $repository) | ||||
|     { | ||||
|         $start = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = session('end', Carbon::now()->endOfMonth()); | ||||
|  | ||||
|         /* | ||||
|          * 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. | ||||
|          */ | ||||
|         $amount   = $repository->getBillsPaidInRange($start, $end); // will be a negative amount. | ||||
|         $amount   = bcmul($amount, '-1'); | ||||
|         $currency = Amount::getDefaultCurrency(); | ||||
|  | ||||
|         $data = ['box' => 'bills-paid', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; | ||||
|  | ||||
|         return Response::json($data); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param BillRepositoryInterface $repository | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function boxBillsUnpaid(BillRepositoryInterface $repository) | ||||
|     { | ||||
|         $start    = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end      = session('end', Carbon::now()->endOfMonth()); | ||||
|         $amount   = $repository->getBillsUnpaidInRange($start, $end); // will be a positive amount. | ||||
|         $currency = Amount::getDefaultCurrency(); | ||||
|         $data     = ['box' => 'bills-unpaid', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; | ||||
|  | ||||
|         return Response::json($data); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      * @internal param AccountTaskerInterface $accountTasker | ||||
|      * @internal param AccountRepositoryInterface $repository | ||||
|      * | ||||
|      */ | ||||
|     public function boxIn() | ||||
|     { | ||||
|         $start = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = session('end', Carbon::now()->endOfMonth()); | ||||
|  | ||||
|         // works for json too! | ||||
|         $cache = new CacheProperties; | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty('box-in'); | ||||
|         if ($cache->has()) { | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|  | ||||
|         // try a collector for income: | ||||
|         /** @var JournalCollectorInterface $collector */ | ||||
|         $collector = app(JournalCollectorInterface::class); | ||||
|         $collector->setAllAssetAccounts()->setRange($start, $end) | ||||
|                   ->setTypes([TransactionType::DEPOSIT]) | ||||
|                   ->withOpposingAccount(); | ||||
|  | ||||
|         $amount   = strval($collector->getJournals()->sum('transaction_amount')); | ||||
|         $currency = Amount::getDefaultCurrency(); | ||||
|         $data     = ['box' => 'in', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; | ||||
|         $cache->store($data); | ||||
|  | ||||
|         return Response::json($data); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return \Symfony\Component\HttpFoundation\Response | ||||
|      * @internal param AccountTaskerInterface $accountTasker | ||||
|      * @internal param AccountRepositoryInterface $repository | ||||
|      * | ||||
|      */ | ||||
|     public function boxOut() | ||||
|     { | ||||
|         $start = session('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = session('end', Carbon::now()->endOfMonth()); | ||||
|  | ||||
|         // works for json too! | ||||
|         $cache = new CacheProperties; | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty('box-out'); | ||||
|         if ($cache->has()) { | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|  | ||||
|         // try a collector for expenses: | ||||
|         /** @var JournalCollectorInterface $collector */ | ||||
|         $collector = app(JournalCollectorInterface::class); | ||||
|         $collector->setAllAssetAccounts()->setRange($start, $end) | ||||
|                   ->setTypes([TransactionType::WITHDRAWAL]) | ||||
|                   ->withOpposingAccount(); | ||||
|         $amount   = strval($collector->getJournals()->sum('transaction_amount')); | ||||
|         $currency = Amount::getDefaultCurrency(); | ||||
|         $data     = ['box' => 'out', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; | ||||
|         $cache->store($data); | ||||
|  | ||||
|         return Response::json($data); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param BudgetRepositoryInterface $repository | ||||
|      * | ||||
|   | ||||
		Reference in New Issue
	
	Block a user