diff --git a/src/Controller/TransactionController.php b/src/Controller/TransactionController.php new file mode 100644 index 0000000..c6b484d --- /dev/null +++ b/src/Controller/TransactionController.php @@ -0,0 +1,162 @@ +communityRepository = new CommunityRepository(); + $this->communityMemberRepository = new CommunityMemberRepository(); + $this->currencyRepository = new CurrencyRepository(); + $this->transactionRepository = new TransactionRepository(); + } + + public function isAuthenticationRequired(): bool + { + return true; + } + + public function authorize(): bool + { + $communityId = \Container::$request->query('communityId'); + $this->community = $this->communityRepository->getById($communityId); + if ($this->community === null) { + return false; + } + + /** + * @var User $user + */ + $user = \Container::$request->user(); + $this->ownCommunityMember = $this->communityMemberRepository->getByCommunityAndUser($this->community, $user); + if ($this->ownCommunityMember === null) { + return false; + } + + return true; + } + + public function getTransactions(): IContent + { + Container::$persistentDataManager->loadRelationsFromDb($this->community, true, ['main_currency']); + $exchangeRateCalculator = new ExchangeRateCalculator($this->community->getMainCurrency()); + + $itemsPerPage = 50; + $numberOfTransactions = $this->transactionRepository->countAllByCommunity($this->community); + $pages = ceil($numberOfTransactions / $itemsPerPage); + $currentPage = Container::$request->query('page') ?: 0; + $transactions = $this->transactionRepository->getPagedByCommunity( + $this->community, + $currentPage * $itemsPerPage, + $itemsPerPage, + true, + ['currency', 'payer_user', 'payee_user'] + ); + + return new HtmlContent('communities/transactions', [ + 'community' => $this->community, + 'exchangeRateCalculator' => $exchangeRateCalculator, + 'pages' => $pages, + 'currentPage' => $currentPage, + 'transactions' => $transactions + ]); + } + + public function getTransactionEdit(): ?IContent + { + $transactionId = Container::$request->query('transactionId'); + if ($transactionId) { + $transaction = $this->transactionRepository->getById($transactionId); + if ($transaction === null) { + return null; + } + } else { + $transaction = null; + } + + return new HtmlContent('communities/transaction_edit', [ + 'community' => $this->community, + 'transaction' => $transaction, + 'members' => $this->getMembers($this->community), + 'currencies' => $this->getCurrencies($this->community) + ]); + } + + public function saveTransaction(): ?IContent + { + $transactionId = Container::$request->query('transactionId'); + if ($transactionId) { + $transaction = $this->transactionRepository->getById($transactionId); + } else { + $transaction = new Transaction(); + $transaction->setCommunity($this->community); + } + + $transaction->setCurrencyId(Container::$request->post('currency_id')); + $transaction->setPayerUserId(Container::$request->post('payer_user_id')); + $transaction->setPayeeUserId(Container::$request->post('payee_user_id') ?: null); + $transaction->setDescription(Container::$request->post('description')); + $transaction->setSum(Container::$request->post('sum')); + $transaction->setTimeDate(new DateTime(Container::$request->post('time'))); + Container::$persistentDataManager->saveToDb($transaction); + + return new JsonContent(['success' => true]); + } + + public function deleteTransaction(): IContent + { + $transaction = $this->transactionRepository->getById(Container::$request->query('transactionId')); + Container::$persistentDataManager->deleteFromDb($transaction); + + return new JsonContent(['success' => true]); + } + + private function getMembers(Community $community): array + { + $members = iterator_to_array($this->communityMemberRepository->getAllByCommunity($community, true, ['user'])); + usort($members, function($a, $b) { + return strnatcmp($a->getUser()->getDisplayName(), $b->getUser()->getDisplayName()); + }); + return $members; + } + + private function getCurrencies(Community $community): array + { + $currencies = iterator_to_array($this->currencyRepository->getAllByCommunity($community)); + usort($currencies, function($a, $b) { + return strnatcmp($a->getCode(), $b->getCode()); + }); + usort($currencies, function($a, $b) use ($community) { + return (int)($b->getId() === $community->getMainCurrencyId()) - (int)($a->getId() === $community->getMainCurrencyId()); + }); + return $currencies; + } +}