From eda1415e86b50a458ac89fed53ea59c2716a4c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 17 Jun 2023 13:46:13 +0200 Subject: [PATCH] RVRNEXT-43 implement multiple payees in transaction controller --- src/Controller/TransactionController.php | 53 ++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/Controller/TransactionController.php b/src/Controller/TransactionController.php index 0bbb91c..b6a220b 100644 --- a/src/Controller/TransactionController.php +++ b/src/Controller/TransactionController.php @@ -6,11 +6,13 @@ use RVR\Finance\ExchangeRateCalculator; use RVR\PersistentData\Model\Community; use RVR\PersistentData\Model\CommunityMember; use RVR\PersistentData\Model\Transaction; +use RVR\PersistentData\Model\TransactionPayee; use RVR\PersistentData\Model\User; use RVR\Repository\CommunityMemberRepository; use RVR\Repository\CommunityRepository; use RVR\Repository\CurrencyRepository; use RVR\Repository\TransactionRepository; +use RVR\Repository\TransactionPayeeRepository; use RVR\Repository\EventRepository; use SokoWeb\Interfaces\Authentication\IAuthenticationRequired; use SokoWeb\Interfaces\Authorization\ISecured; @@ -28,6 +30,8 @@ class TransactionController implements IAuthenticationRequired, ISecured private TransactionRepository $transactionRepository; + private TransactionPayeeRepository $transactionPayeeRepository; + private EventRepository $eventRepository; private ?Community $community; @@ -40,6 +44,7 @@ class TransactionController implements IAuthenticationRequired, ISecured $this->communityMemberRepository = new CommunityMemberRepository(); $this->currencyRepository = new CurrencyRepository(); $this->transactionRepository = new TransactionRepository(); + $this->transactionPayeeRepository = new TransactionPayeeRepository(); $this->eventRepository = new EventRepository(); } @@ -91,16 +96,19 @@ class TransactionController implements IAuthenticationRequired, ISecured $currentPage, $itemsPerPage, true, - ['currency', 'payer_user', 'payee_user'] + ['currency', 'payer_user'] ) : $this->transactionRepository->getPagedByCommunity( $this->community, $currentPage, $itemsPerPage, true, - ['event', 'currency', 'payer_user', 'payee_user'] + ['event', 'currency', 'payer_user'] ); + $transactions = iterator_to_array($transactions); + Container::$persistentDataManager->loadMultiRelationsFromDb($transactions, 'payees', true, ['user']); + return new HtmlContent('communities/transactions', [ 'community' => $this->community, 'event' => $event, @@ -108,7 +116,8 @@ class TransactionController implements IAuthenticationRequired, ISecured 'pages' => ceil($numberOfTransactions / $itemsPerPage), 'currentPage' => $currentPage, 'numberOfTransactions' => $numberOfTransactions, - 'transactions' => $transactions + 'transactions' => $transactions, + 'members' => $this->getMembers($this->community) ]); } @@ -122,6 +131,10 @@ class TransactionController implements IAuthenticationRequired, ISecured } Container::$persistentDataManager->loadRelationsFromDb($transaction, false, ['event']); $event = $transaction->getEvent(); + $payeeUserIds = []; + foreach ($this->transactionPayeeRepository->getAllByTransaction($transaction) as $payee) { + $payeeUserIds[] = $payee->getUserId(); + } } else { $transaction = null; $eventSlug = Container::$request->query('event'); @@ -130,11 +143,13 @@ class TransactionController implements IAuthenticationRequired, ISecured } else { $event = null; } + $payeeUserIds = []; } return new HtmlContent('communities/transaction_edit', [ 'community' => $this->community, 'transaction' => $transaction, + 'payeeUserIds' => $payeeUserIds, 'event' => $event, 'members' => $this->getMembers($this->community), 'currencies' => $this->getCurrencies($this->community) @@ -154,18 +169,48 @@ class TransactionController implements IAuthenticationRequired, ISecured $transaction->setEventId(Container::$request->post('event_id') ?: null); $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); + $payeeUserIds = array_unique(Container::$request->post('payee_user_ids')); + if (count($payeeUserIds) === $this->communityMemberRepository->countAllByCommunity($this->community)) { + $payeeUserIds = []; + } + + $currentPayees = []; + foreach ($payeeUserIds as $payeeUserId) { + $payee = new TransactionPayee(); + $payee->setTransaction($transaction); + $payee->setUserId((int)$payeeUserId); + $currentPayees[(int)$payeeUserId] = $payee; + } + $existingPayees = []; + if ($transactionId) { + foreach ($this->transactionPayeeRepository->getAllByTransaction($transaction) as $payee) { + $existingPayees[$payee->getUserId()] = $payee; + } + } + + foreach (array_diff_key($currentPayees, $existingPayees) as $newPayee) { + Container::$persistentDataManager->saveToDb($newPayee); + } + foreach (array_diff_key($existingPayees, $currentPayees) as $deletedPayee) { + Container::$persistentDataManager->deleteFromDb($deletedPayee); + } + return new JsonContent(['success' => true]); } public function deleteTransaction(): IContent { $transaction = $this->transactionRepository->getById(Container::$request->query('transactionId')); + + foreach ($this->transactionPayeeRepository->getAllByTransaction($transaction) as $payee) { + Container::$persistentDataManager->deleteFromDb($payee); + } + Container::$persistentDataManager->deleteFromDb($transaction); return new JsonContent(['success' => true]);