RVRNEXT-43 implement multiple payees in transaction controller

This commit is contained in:
Bence Pőcze 2023-06-17 13:46:13 +02:00
parent 4e9c7f8c3c
commit eda1415e86
Signed by: bence
GPG Key ID: DC5BD6E95A333E6D

View File

@ -6,11 +6,13 @@ use RVR\Finance\ExchangeRateCalculator;
use RVR\PersistentData\Model\Community; use RVR\PersistentData\Model\Community;
use RVR\PersistentData\Model\CommunityMember; use RVR\PersistentData\Model\CommunityMember;
use RVR\PersistentData\Model\Transaction; use RVR\PersistentData\Model\Transaction;
use RVR\PersistentData\Model\TransactionPayee;
use RVR\PersistentData\Model\User; use RVR\PersistentData\Model\User;
use RVR\Repository\CommunityMemberRepository; use RVR\Repository\CommunityMemberRepository;
use RVR\Repository\CommunityRepository; use RVR\Repository\CommunityRepository;
use RVR\Repository\CurrencyRepository; use RVR\Repository\CurrencyRepository;
use RVR\Repository\TransactionRepository; use RVR\Repository\TransactionRepository;
use RVR\Repository\TransactionPayeeRepository;
use RVR\Repository\EventRepository; use RVR\Repository\EventRepository;
use SokoWeb\Interfaces\Authentication\IAuthenticationRequired; use SokoWeb\Interfaces\Authentication\IAuthenticationRequired;
use SokoWeb\Interfaces\Authorization\ISecured; use SokoWeb\Interfaces\Authorization\ISecured;
@ -28,6 +30,8 @@ class TransactionController implements IAuthenticationRequired, ISecured
private TransactionRepository $transactionRepository; private TransactionRepository $transactionRepository;
private TransactionPayeeRepository $transactionPayeeRepository;
private EventRepository $eventRepository; private EventRepository $eventRepository;
private ?Community $community; private ?Community $community;
@ -40,6 +44,7 @@ class TransactionController implements IAuthenticationRequired, ISecured
$this->communityMemberRepository = new CommunityMemberRepository(); $this->communityMemberRepository = new CommunityMemberRepository();
$this->currencyRepository = new CurrencyRepository(); $this->currencyRepository = new CurrencyRepository();
$this->transactionRepository = new TransactionRepository(); $this->transactionRepository = new TransactionRepository();
$this->transactionPayeeRepository = new TransactionPayeeRepository();
$this->eventRepository = new EventRepository(); $this->eventRepository = new EventRepository();
} }
@ -91,16 +96,19 @@ class TransactionController implements IAuthenticationRequired, ISecured
$currentPage, $currentPage,
$itemsPerPage, $itemsPerPage,
true, true,
['currency', 'payer_user', 'payee_user'] ['currency', 'payer_user']
) : ) :
$this->transactionRepository->getPagedByCommunity( $this->transactionRepository->getPagedByCommunity(
$this->community, $this->community,
$currentPage, $currentPage,
$itemsPerPage, $itemsPerPage,
true, 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', [ return new HtmlContent('communities/transactions', [
'community' => $this->community, 'community' => $this->community,
'event' => $event, 'event' => $event,
@ -108,7 +116,8 @@ class TransactionController implements IAuthenticationRequired, ISecured
'pages' => ceil($numberOfTransactions / $itemsPerPage), 'pages' => ceil($numberOfTransactions / $itemsPerPage),
'currentPage' => $currentPage, 'currentPage' => $currentPage,
'numberOfTransactions' => $numberOfTransactions, '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']); Container::$persistentDataManager->loadRelationsFromDb($transaction, false, ['event']);
$event = $transaction->getEvent(); $event = $transaction->getEvent();
$payeeUserIds = [];
foreach ($this->transactionPayeeRepository->getAllByTransaction($transaction) as $payee) {
$payeeUserIds[] = $payee->getUserId();
}
} else { } else {
$transaction = null; $transaction = null;
$eventSlug = Container::$request->query('event'); $eventSlug = Container::$request->query('event');
@ -130,11 +143,13 @@ class TransactionController implements IAuthenticationRequired, ISecured
} else { } else {
$event = null; $event = null;
} }
$payeeUserIds = [];
} }
return new HtmlContent('communities/transaction_edit', [ return new HtmlContent('communities/transaction_edit', [
'community' => $this->community, 'community' => $this->community,
'transaction' => $transaction, 'transaction' => $transaction,
'payeeUserIds' => $payeeUserIds,
'event' => $event, 'event' => $event,
'members' => $this->getMembers($this->community), 'members' => $this->getMembers($this->community),
'currencies' => $this->getCurrencies($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->setEventId(Container::$request->post('event_id') ?: null);
$transaction->setCurrencyId(Container::$request->post('currency_id')); $transaction->setCurrencyId(Container::$request->post('currency_id'));
$transaction->setPayerUserId(Container::$request->post('payer_user_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->setDescription(Container::$request->post('description'));
$transaction->setSum(Container::$request->post('sum')); $transaction->setSum(Container::$request->post('sum'));
$transaction->setTimeDate(new DateTime(Container::$request->post('time'))); $transaction->setTimeDate(new DateTime(Container::$request->post('time')));
Container::$persistentDataManager->saveToDb($transaction); 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]); return new JsonContent(['success' => true]);
} }
public function deleteTransaction(): IContent public function deleteTransaction(): IContent
{ {
$transaction = $this->transactionRepository->getById(Container::$request->query('transactionId')); $transaction = $this->transactionRepository->getById(Container::$request->query('transactionId'));
foreach ($this->transactionPayeeRepository->getAllByTransaction($transaction) as $payee) {
Container::$persistentDataManager->deleteFromDb($payee);
}
Container::$persistentDataManager->deleteFromDb($transaction); Container::$persistentDataManager->deleteFromDb($transaction);
return new JsonContent(['success' => true]); return new JsonContent(['success' => true]);