diff --git a/app/Api/V1/Controllers/AvailableBudgetController.php b/app/Api/V1/Controllers/AvailableBudgetController.php index e5f630c1e4..5747dd8ca9 100644 --- a/app/Api/V1/Controllers/AvailableBudgetController.php +++ b/app/Api/V1/Controllers/AvailableBudgetController.php @@ -172,7 +172,7 @@ class AvailableBudgetController extends Controller if (null === $currency) { $currency = app('amount')->getDefaultCurrency(); } - $availableBudget = $this->repository->setAvailableBudget($currency, $data['start'], $data['end'], $data['amount']); + $availableBudget = $this->abRepository->setAvailableBudget($currency, $data['start'], $data['end'], $data['amount']); $manager = new Manager; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $manager->setSerializer(new JsonApiSerializer($baseUrl)); diff --git a/app/Api/V1/Controllers/Chart/AvailableBudgetController.php b/app/Api/V1/Controllers/Chart/AvailableBudgetController.php index 7f36d977b8..fd736399fe 100644 --- a/app/Api/V1/Controllers/Chart/AvailableBudgetController.php +++ b/app/Api/V1/Controllers/Chart/AvailableBudgetController.php @@ -28,6 +28,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\AvailableBudget; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use FireflyIII\User; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; @@ -37,11 +38,14 @@ use Illuminate\Support\Collection; */ class AvailableBudgetController extends Controller { + /** @var OperationsRepositoryInterface */ + private $opsRepository; /** @var BudgetRepositoryInterface */ private $repository; /** * AvailableBudgetController constructor. + * * @codeCoverageIgnore */ public function __construct() @@ -50,9 +54,11 @@ class AvailableBudgetController extends Controller $this->middleware( function ($request, $next) { /** @var User $user */ - $user = auth()->user(); - $this->repository = app(BudgetRepositoryInterface::class); + $user = auth()->user(); + $this->repository = app(BudgetRepositoryInterface::class); + $this->opsRepository = app(OperationsRepositoryInterface::class); $this->repository->setUser($user); + $this->opsRepository->setUser($user); return $next($request); } @@ -68,7 +74,7 @@ class AvailableBudgetController extends Controller { $currency = $availableBudget->transactionCurrency; $budgets = $this->repository->getActiveBudgets(); - $budgetInformation = $this->repository->spentInPeriodMc($budgets, new Collection, $availableBudget->start_date, $availableBudget->end_date); + $budgetInformation = $this->opsRepository->spentInPeriodMc($budgets, new Collection, $availableBudget->start_date, $availableBudget->end_date); $spent = 0.0; // get for current currency diff --git a/app/Api/V1/Controllers/SummaryController.php b/app/Api/V1/Controllers/SummaryController.php index 2cdc8aa86f..622dd6ad57 100644 --- a/app/Api/V1/Controllers/SummaryController.php +++ b/app/Api/V1/Controllers/SummaryController.php @@ -38,6 +38,7 @@ 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\User; use Illuminate\Http\JsonResponse; @@ -59,6 +60,9 @@ class SummaryController extends Controller /** @var CurrencyRepositoryInterface */ private $currencyRepos; + /** @var OperationsRepositoryInterface */ + private $opsRepository; + /** * SummaryController constructor. * @@ -76,12 +80,14 @@ class SummaryController extends Controller $this->budgetRepository = app(BudgetRepositoryInterface::class); $this->accountRepository = app(AccountRepositoryInterface::class); $this->abRepository = app(AvailableBudgetRepositoryInterface::class); + $this->opsRepository = app(OperationsRepositoryInterface::class); $this->billRepository->setUser($user); $this->currencyRepos->setUser($user); $this->budgetRepository->setUser($user); $this->accountRepository->setUser($user); $this->abRepository->setUser($user); + $this->opsRepository->setUser($user); return $next($request); @@ -343,7 +349,7 @@ class SummaryController extends Controller $today = new Carbon; $available = $this->abRepository->getAvailableBudgetWithCurrency($start, $end); $budgets = $this->budgetRepository->getActiveBudgets(); - $spentInfo = $this->budgetRepository->spentInPeriodMc($budgets, new Collection, $start, $end); + $spentInfo = $this->opsRepository->spentInPeriodMc($budgets, new Collection, $start, $end); foreach ($available as $currencyId => $amount) { $currency = $this->currencyRepos->findNull($currencyId); if (null === $currency) { diff --git a/app/Helpers/Report/BudgetReportHelper.php b/app/Helpers/Report/BudgetReportHelper.php index dd85ad8a74..ac25f37caf 100644 --- a/app/Helpers/Report/BudgetReportHelper.php +++ b/app/Helpers/Report/BudgetReportHelper.php @@ -27,6 +27,7 @@ use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use Illuminate\Support\Collection; use Log; @@ -39,6 +40,8 @@ class BudgetReportHelper implements BudgetReportHelperInterface { /** @var BudgetLimitRepositoryInterface */ private $blRepository; + /** @var OperationsRepositoryInterface */ + private $opsRepository; /** @var BudgetRepositoryInterface The budget repository interface. */ private $repository; @@ -47,9 +50,9 @@ class BudgetReportHelper implements BudgetReportHelperInterface */ public function __construct() { - $this->repository = app(BudgetRepositoryInterface::class); - $this->blRepository = app(BudgetLimitRepositoryInterface::class); - + $this->repository = app(BudgetRepositoryInterface::class); + $this->blRepository = app(BudgetLimitRepositoryInterface::class); + $this->opsRepository = app(OperationsRepositoryInterface::class); if ('testing' === config('app.env')) { Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this))); } @@ -85,7 +88,7 @@ class BudgetReportHelper implements BudgetReportHelperInterface ]; // get multi currency expenses first: $budgetLimits = $this->blRepository->getBudgetLimits($budget, $start, $end); - $expenses = $this->repository->spentInPeriodMc(new Collection([$budget]), $accounts, $start, $end); + $expenses = $this->opsRepository->spentInPeriodMc(new Collection([$budget]), $accounts, $start, $end); $defaultCurrency = app('amount')->getDefaultCurrencyByUser($budget->user); Log::debug(sprintf('Default currency for getBudgetReport is %s', $defaultCurrency->code)); if (0 === count($expenses)) { diff --git a/app/Http/Controllers/Budget/AmountController.php b/app/Http/Controllers/Budget/AmountController.php index 174ec61e28..9e9bb68473 100644 --- a/app/Http/Controllers/Budget/AmountController.php +++ b/app/Http/Controllers/Budget/AmountController.php @@ -165,7 +165,7 @@ class AmountController extends Controller $amount = $request->get('amount'); $page = 0 === $request->integer('page') ? 1 : $request->integer('page'); $this->repository->cleanupBudgets(); - $this->repository->setAvailableBudget($defaultCurrency, $start, $end, $amount); + $this->abRepository->setAvailableBudget($defaultCurrency, $start, $end, $amount); app('preferences')->mark(); return redirect(route('budgets.index', [$start->format('Y-m-d')]) . '?page=' . $page); diff --git a/app/Repositories/Budget/AvailableBudgetRepository.php b/app/Repositories/Budget/AvailableBudgetRepository.php index 78e61133b5..3e6d4053c8 100644 --- a/app/Repositories/Budget/AvailableBudgetRepository.php +++ b/app/Repositories/Budget/AvailableBudgetRepository.php @@ -139,6 +139,34 @@ class AvailableBudgetRepository implements AvailableBudgetRepositoryInterface return $query->get(); } + + /** + * @param TransactionCurrency $currency + * @param Carbon $start + * @param Carbon $end + * @param string $amount + * + * @return AvailableBudget + */ + public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget + { + $availableBudget = $this->user->availableBudgets() + ->where('transaction_currency_id', $currency->id) + ->where('start_date', $start->format('Y-m-d 00:00:00')) + ->where('end_date', $end->format('Y-m-d 00:00:00'))->first(); + if (null === $availableBudget) { + $availableBudget = new AvailableBudget; + $availableBudget->user()->associate($this->user); + $availableBudget->transactionCurrency()->associate($currency); + $availableBudget->start_date = $start->format('Y-m-d 00:00:00'); + $availableBudget->end_date = $end->format('Y-m-d 00:00:00'); + } + $availableBudget->amount = $amount; + $availableBudget->save(); + + return $availableBudget; + } + /** * @param User $user */ diff --git a/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php b/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php index 12eecabfd0..ab58cc9846 100644 --- a/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php +++ b/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php @@ -65,6 +65,17 @@ interface AvailableBudgetRepositoryInterface */ public function getAvailableBudgetsByCurrency(TransactionCurrency $currency): Collection; + /** + * @param TransactionCurrency $currency + * @param Carbon $start + * @param Carbon $end + * @param string $amount + * + * @return AvailableBudget + */ + public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget; + + /** * Returns all available budget objects. * diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index d9a5a9071f..febb7ce2b2 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -258,33 +258,6 @@ class BudgetRepository implements BudgetRepositoryInterface return $search->get(); } - /** - * @param TransactionCurrency $currency - * @param Carbon $start - * @param Carbon $end - * @param string $amount - * - * @return AvailableBudget - */ - public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget - { - $availableBudget = $this->user->availableBudgets() - ->where('transaction_currency_id', $currency->id) - ->where('start_date', $start->format('Y-m-d 00:00:00')) - ->where('end_date', $end->format('Y-m-d 00:00:00'))->first(); - if (null === $availableBudget) { - $availableBudget = new AvailableBudget; - $availableBudget->user()->associate($this->user); - $availableBudget->transactionCurrency()->associate($currency); - $availableBudget->start_date = $start->format('Y-m-d 00:00:00'); - $availableBudget->end_date = $end->format('Y-m-d 00:00:00'); - } - $availableBudget->amount = $amount; - $availableBudget->save(); - - return $availableBudget; - } - /** * @param Budget $budget * @param int $order @@ -303,67 +276,6 @@ class BudgetRepository implements BudgetRepositoryInterface $this->user = $user; } - /** - * @param Collection $budgets - * @param Collection $accounts - * @param Carbon $start - * @param Carbon $end - * TODO refactor me. - * - * @return array - */ - public function spentInPeriodMc(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array - { - /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); - $collector->setUser($this->user); - $collector->setRange($start, $end)->setBudgets($budgets)->withBudgetInformation(); - - if ($accounts->count() > 0) { - $collector->setAccounts($accounts); - } - // TODO possible candidate for getExtractedGroups - $set = $collector->getGroups(); - $return = []; - $total = []; - $currencies = []; - /** @var array $group */ - foreach ($set as $group) { - /** @var array $transaction */ - foreach ($group['transactions'] as $transaction) { - $code = $transaction['currency_code']; - if (!isset($currencies[$code])) { - $currencies[$code] = [ - 'id' => $transaction['currency_id'], - 'decimal_places' => $transaction['currency_decimal_places'], - 'code' => $transaction['currency_code'], - 'name' => $transaction['currency_name'], - 'symbol' => $transaction['currency_symbol'], - ]; - } - $total[$code] = isset($total[$code]) ? bcadd($total[$code], $transaction['amount']) : $transaction['amount']; - } - } - /** - * @var string $code - * @var string $spent - */ - foreach ($total as $code => $spent) { - /** @var TransactionCurrency $currency */ - $currency = $currencies[$code]; - $return[] = [ - 'currency_id' => $currency['id'], - 'currency_code' => $code, - 'currency_name' => $currency['name'], - 'currency_symbol' => $currency['symbol'], - 'currency_decimal_places' => $currency['decimal_places'], - 'amount' => $spent, - ]; - } - - return $return; - } - /** * @param Collection $accounts * @param Carbon $start diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 27a3321cee..1d5334ecfa 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -114,40 +114,17 @@ interface BudgetRepositoryInterface */ public function searchBudget(string $query): Collection; - /** - * @param TransactionCurrency $currency - * @param Carbon $start - * @param Carbon $end - * @param string $amount - * - * @return AvailableBudget - */ - public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget; - /** * @param Budget $budget * @param int $order */ public function setBudgetOrder(Budget $budget, int $order): void; - /** * @param User $user */ public function setUser(User $user); - /** - * Return multi-currency spent information. - * - * @param Collection $budgets - * @param Collection $accounts - * @param Carbon $start - * @param Carbon $end - * - * @return array - */ - public function spentInPeriodMc(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array; - /** * @param Collection $accounts * @param Carbon $start diff --git a/app/Repositories/Budget/OperationsRepository.php b/app/Repositories/Budget/OperationsRepository.php index b811203819..7400220087 100644 --- a/app/Repositories/Budget/OperationsRepository.php +++ b/app/Repositories/Budget/OperationsRepository.php @@ -28,6 +28,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\User; use Illuminate\Support\Collection; @@ -216,6 +217,67 @@ class OperationsRepository implements OperationsRepositoryInterface return $collector->getSum(); } + /** + * @param Collection $budgets + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + * @deprecated + */ + public function spentInPeriodMc(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array + { + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollectorInterface::class); + $collector->setUser($this->user); + $collector->setRange($start, $end)->setBudgets($budgets)->withBudgetInformation(); + + if ($accounts->count() > 0) { + $collector->setAccounts($accounts); + } + // TODO possible candidate for getExtractedGroups + $set = $collector->getGroups(); + $return = []; + $total = []; + $currencies = []; + /** @var array $group */ + foreach ($set as $group) { + /** @var array $transaction */ + foreach ($group['transactions'] as $transaction) { + $code = $transaction['currency_code']; + if (!isset($currencies[$code])) { + $currencies[$code] = [ + 'id' => $transaction['currency_id'], + 'decimal_places' => $transaction['currency_decimal_places'], + 'code' => $transaction['currency_code'], + 'name' => $transaction['currency_name'], + 'symbol' => $transaction['currency_symbol'], + ]; + } + $total[$code] = isset($total[$code]) ? bcadd($total[$code], $transaction['amount']) : $transaction['amount']; + } + } + /** + * @var string $code + * @var string $spent + */ + foreach ($total as $code => $spent) { + /** @var TransactionCurrency $currency */ + $currency = $currencies[$code]; + $return[] = [ + 'currency_id' => $currency['id'], + 'currency_code' => $code, + 'currency_name' => $currency['name'], + 'currency_symbol' => $currency['symbol'], + 'currency_decimal_places' => $currency['decimal_places'], + 'amount' => $spent, + ]; + } + + return $return; + } + /** * For now, simply refer to whichever repository holds this function. * TODO might be done better in the future. diff --git a/app/Repositories/Budget/OperationsRepositoryInterface.php b/app/Repositories/Budget/OperationsRepositoryInterface.php index 246a1a78ad..ad40bdc3af 100644 --- a/app/Repositories/Budget/OperationsRepositoryInterface.php +++ b/app/Repositories/Budget/OperationsRepositoryInterface.php @@ -83,5 +83,17 @@ interface OperationsRepositoryInterface */ public function spentInPeriod(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): string; + /** + * Return multi-currency spent information. + * + * @param Collection $budgets + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + * @deprecated + */ + public function spentInPeriodMc(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array; } \ No newline at end of file diff --git a/app/Transformers/AvailableBudgetTransformer.php b/app/Transformers/AvailableBudgetTransformer.php index 0f02659580..5bd93f1f48 100644 --- a/app/Transformers/AvailableBudgetTransformer.php +++ b/app/Transformers/AvailableBudgetTransformer.php @@ -26,6 +26,7 @@ namespace FireflyIII\Transformers; use FireflyIII\Models\AvailableBudget; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use Illuminate\Support\Collection; use Log; @@ -34,6 +35,8 @@ use Log; */ class AvailableBudgetTransformer extends AbstractTransformer { + /** @var OperationsRepositoryInterface */ + private $opsRepository; /** @var BudgetRepositoryInterface */ private $repository; @@ -44,7 +47,8 @@ class AvailableBudgetTransformer extends AbstractTransformer */ public function __construct() { - $this->repository = app(BudgetRepositoryInterface::class); + $this->repository = app(BudgetRepositoryInterface::class); + $this->opsRepository = app(OperationsRepositoryInterface::class); if ('testing' === config('app.env')) { Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this))); } @@ -99,7 +103,7 @@ class AvailableBudgetTransformer extends AbstractTransformer { $allActive = $this->repository->getActiveBudgets(); - return $this->repository->spentInPeriodMc( + return $this->opsRepository->spentInPeriodMc( $allActive, new Collection, $this->parameters->get('start'), $this->parameters->get('end') );