From 22e52ea46c9358571de1300dd631e2ccd4d45cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awek=20Zatorski?= Date: Sun, 1 Dec 2024 15:00:08 +0100 Subject: [PATCH] transactions --- .../repository/UserAccountRepository.java | 2 + .../com/sasiedzi/event/service/Account.java | 6 + .../event/service/TransactionService.java | 126 +++++++++++++++--- .../event/web/rest/TransactionResource.java | 39 +++++- .../app/entities/event/event-details.vue | 25 ++++ .../transaction/transaction-details.vue | 21 ++- .../transaction-update.component.ts | 53 +++++++- .../transaction/transaction-update.vue | 21 +-- .../transaction/transaction.service.ts | 28 ++++ .../app/entities/transaction/transaction.vue | 7 +- src/main/webapp/app/router/entities.ts | 18 +++ .../app/shared/model/transaction.model.ts | 3 +- 12 files changed, 299 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java b/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java index 73ade7f..639496f 100644 --- a/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java +++ b/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java @@ -32,4 +32,6 @@ public interface UserAccountRepository extends UserAccountRepositoryWithBagRelat @Query("select userAccount from UserAccount userAccount join fetch userAccount.users") // List findByUserLogin(String login); List findAllFetchAccounts(); + + List findByName(String name); } diff --git a/src/main/java/com/sasiedzi/event/service/Account.java b/src/main/java/com/sasiedzi/event/service/Account.java index c7e092c..b1ff7b5 100644 --- a/src/main/java/com/sasiedzi/event/service/Account.java +++ b/src/main/java/com/sasiedzi/event/service/Account.java @@ -3,4 +3,10 @@ package com.sasiedzi.event.service; public enum Account { Boisko, Skarbiec, + Counter { + @Override + public String toString() { + return "Subkonto Tomka"; + } + }, } diff --git a/src/main/java/com/sasiedzi/event/service/TransactionService.java b/src/main/java/com/sasiedzi/event/service/TransactionService.java index cc9c0e1..3722101 100644 --- a/src/main/java/com/sasiedzi/event/service/TransactionService.java +++ b/src/main/java/com/sasiedzi/event/service/TransactionService.java @@ -1,17 +1,16 @@ package com.sasiedzi.event.service; +import com.sasiedzi.event.domain.Event; import com.sasiedzi.event.domain.Transaction; import com.sasiedzi.event.domain.TransactionItem; import com.sasiedzi.event.domain.UserAccount; import com.sasiedzi.event.domain.enumeration.TransactionType; +import com.sasiedzi.event.repository.TransactionItemRepository; import com.sasiedzi.event.repository.TransactionRepository; import com.sasiedzi.event.repository.UserAccountRepository; import java.math.BigDecimal; import java.time.LocalDate; -import java.util.Date; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -27,52 +26,61 @@ public class TransactionService { @Autowired UserAccountRepository userAccountRepository; + @Autowired + private TransactionItemRepository transactionItemRepository; + + @Autowired + private EventService eventService; + public Transaction save(Transaction transaction) { Set items = transaction.getTransactionItems(); - Set vaults = items + String beneficiaryAccountName = transaction.getBeneficiary() == null + ? Account.Skarbiec.toString() + : transaction.getBeneficiary().getName(); + Set beneficiaryItems = items .stream() - .filter(item -> Account.Skarbiec.name().equals(item.getUserAccount().getName())) + .filter(item -> beneficiaryAccountName.equals(item.getUserAccount().getName())) .collect(Collectors.toSet()); - Set nonVaults = items + Set nonBeneficiaryItems = items .stream() - .filter(item -> !Account.Skarbiec.name().equals(item.getUserAccount().getName())) + .filter(item -> !beneficiaryAccountName.equals(item.getUserAccount().getName())) .collect(Collectors.toSet()); - BigDecimal vaultValue = nonVaults + BigDecimal beneficiaryValue = nonBeneficiaryItems .stream() .map(TransactionItem::getAmount) .map(BigDecimal::negate) .reduce(BigDecimal.ZERO, BigDecimal::add); - boolean vaultIsNeeded = vaultValue.compareTo(BigDecimal.ZERO) != 0; + boolean beneficiaryItemIsNeeded = beneficiaryValue.compareTo(BigDecimal.ZERO) != 0; HashSet itemsToBeRemoved = new HashSet<>(); - if (vaultIsNeeded) { - if (vaults.isEmpty()) { + if (beneficiaryItemIsNeeded) { + if (beneficiaryItems.isEmpty()) { TransactionItem transactionItem = new TransactionItem(); - UserAccount vaultAccount = userAccountRepository + UserAccount beneficiaryAccount = userAccountRepository .findAll() .stream() - .filter(item -> Account.Skarbiec.name().equals(item.getName())) + .filter(item -> beneficiaryAccountName.equals(item.getName())) .findFirst() .orElse(null); - transactionItem.setUserAccount(vaultAccount); - transactionItem.setAmount(vaultValue); + transactionItem.setUserAccount(beneficiaryAccount); + transactionItem.setAmount(beneficiaryValue); transactionItem.setTransaction(transaction); transaction.getTransactionItems().add(transactionItem); } else { TransactionItem first = null; - for (TransactionItem item : vaults) { + for (TransactionItem item : beneficiaryItems) { if (first == null) { first = item; } else { itemsToBeRemoved.add(item); } } - first.setAmount(vaultValue); + first.setAmount(beneficiaryValue); } } else { - itemsToBeRemoved.addAll(vaults); + itemsToBeRemoved.addAll(beneficiaryItems); } itemsToBeRemoved.forEach(transactionItem -> { @@ -100,4 +108,84 @@ public class TransactionService { } return newTransaction; } + + public Transaction createPayments(Long id) { + Transaction existing = transactionRepository.findOneWithEagerRelationships(id).orElseGet(Transaction::new); + Transaction newTransaction = new Transaction(); + newTransaction.setType(TransactionType.INTERNALTRANSFER); + setBeneficiary(newTransaction); + newTransaction.setEvent(existing.getEvent()); + calculateBalances(existing.getTransactionItems().stream().map(TransactionItem::getUserAccount).toList()); + for (TransactionItem item : existing.getTransactionItems()) { + BigDecimal accountBalance = item.getUserAccount().getBalance(); + if (accountBalance == null) { + accountBalance = BigDecimal.ZERO; + } + if (accountBalance.compareTo(BigDecimal.ZERO) < 0 && !Account.Skarbiec.toString().equals(item.getUserAccount().getName())) { + TransactionItem newItem = new TransactionItem(); + newItem.setAmount(accountBalance.negate()); + newItem.setTransaction(newTransaction); + newItem.setUserAccount(item.getUserAccount()); + newItem.setEvent(item.getEvent()); + newItem.setRegistration(item.getRegistration()); + newItem.setComment(item.getComment()); + newTransaction.getTransactionItems().add(newItem); + } + } + return newTransaction; + } + + public Transaction createFieldPayment(Long eventId) { + Transaction newTransaction = new Transaction(); + newTransaction.setType(TransactionType.FIELDPAYMENT); + setBeneficiary(newTransaction); + Event event = null; + if (eventId != null) { + event = eventService.findOne(eventId).orElse(null); + newTransaction.setEvent(event); + } + TransactionItem newItem = new TransactionItem(); + newItem.setAmount(new BigDecimal("375")); + newItem.setTransaction(newTransaction); + newItem.setUserAccount(getAccount(Account.Counter)); + newItem.setEvent(event); + newTransaction.getTransactionItems().add(newItem); + return newTransaction; + } + + private void calculateBalances(List userAccounts) { + Map> itemsByUserAccountId = transactionItemRepository + .findAll() + .stream() + .collect(Collectors.groupingBy(item -> item.getUserAccount().getId())); + for (UserAccount userAccount : userAccounts) { + List itemsForAccount = itemsByUserAccountId.get(userAccount.getId()); + BigDecimal balance = itemsForAccount.stream().map(TransactionItem::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + userAccount.setBalance(balance); + } + } + + public Transaction get(Long id) { + Transaction transaction = transactionRepository.findOneWithEagerRelationships(id).orElse(null); + setBeneficiary(transaction); + return transaction; + } + + private void setBeneficiary(Transaction transaction) { + switch (transaction.getType()) { + case INTERNALTRANSFER -> { + transaction.setBeneficiary(getAccount(Account.Counter)); + } + case MATCH, PURCHASE -> { + transaction.setBeneficiary(getAccount(Account.Skarbiec)); + } + case FIELDPAYMENT -> { + transaction.setBeneficiary(getAccount(Account.Boisko)); + } + } + } + + public UserAccount getAccount(Account account) { + return userAccountRepository.findByName(account.toString()).stream().min(Comparator.comparing(UserAccount::getId)).orElse(null); + } } diff --git a/src/main/java/com/sasiedzi/event/web/rest/TransactionResource.java b/src/main/java/com/sasiedzi/event/web/rest/TransactionResource.java index ad16b44..45e71c6 100644 --- a/src/main/java/com/sasiedzi/event/web/rest/TransactionResource.java +++ b/src/main/java/com/sasiedzi/event/web/rest/TransactionResource.java @@ -271,19 +271,44 @@ public class TransactionResource { * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the transaction, or with status {@code 404 (Not Found)}. */ @GetMapping("/{id}") - public ResponseEntity getTransaction(@PathVariable("id") Long id) { + public Transaction getTransaction(@PathVariable("id") Long id) { LOG.debug("REST request to get Transaction : {}", id); - Optional transaction = transactionRepository.findOneWithEagerRelationships(id); - // if (transaction.isPresent()) { - // transaction.get().getTransactionItems().stream().sorted(); - // transaction.get().getTransactionItems().sort(Comparator.comparing(item -> item.getUserAccount().getName())); - // } - return ResponseUtil.wrapOrNotFound(transaction); + return transactionService.get(id); + // Optional transaction = transactionRepository.findOneWithEagerRelationships(id); + // // if (transaction.isPresent()) { + // // transaction.get().getTransactionItems().stream().sorted(); + // // transaction.get().getTransactionItems().sort(Comparator.comparing(item -> item.getUserAccount().getName())); + // // } + // return ResponseUtil.wrapOrNotFound(transaction); } @Autowired TransactionService transactionService; + /** + * {@code GET /transactions/:id} : get the "id" transaction. + * + * @param id the id of the transaction to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the transaction, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/payments/{id}") + public Transaction createPayments(@PathVariable("id") Long id) { + LOG.debug("REST request to get Transaction : {}", id); + return transactionService.createPayments(id); + } + + /** + * {@code GET /transactions/:id} : get the "id" transaction. + * + * @param id the id of the transaction to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the transaction, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/field-payment/{id}") + public Transaction getTransactionPayments(@PathVariable("id") Long id) { + LOG.debug("REST request to get Transaction : {}", id); + return transactionService.createFieldPayment(id); + } + /** * {@code GET /transactions/:id} : get the "id" transaction. * diff --git a/src/main/webapp/app/entities/event/event-details.vue b/src/main/webapp/app/entities/event/event-details.vue index 9d15e15..206225c 100644 --- a/src/main/webapp/app/entities/event/event-details.vue +++ b/src/main/webapp/app/entities/event/event-details.vue @@ -45,6 +45,31 @@  Dołącz do wydarzenia + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/webapp/app/entities/transaction/transaction-update.component.ts b/src/main/webapp/app/entities/transaction/transaction-update.component.ts index d84f933..da5ba9e 100644 --- a/src/main/webapp/app/entities/transaction/transaction-update.component.ts +++ b/src/main/webapp/app/entities/transaction/transaction-update.component.ts @@ -42,16 +42,44 @@ export default defineComponent({ try { if (dictUserAccounts.value.length == 0) { const res2 = await userAccountService().retrieve(); - console.log('got accounts' + res2); dictUserAccounts.value = res2.data; } const res = await transactionService().find(transactionId, opposing); transaction.value = res; - // console.log('len'+transaction.value.transactionItems?.length); - // console.log('len'+dictUserAccounts.value.length); - // console.log('id'+transaction.value.transactionItems[0].userAccount.id); - // console.log('id'+(dictUserAccounts.value.find(account => account.id === transaction.value.transactionItems[0].userAccount.id) || null)); - // transaction.value.transactionItems[0].userAccount = dictUserAccounts.value.find(account => account.id === transaction.value.transactionItems[0].userAccount.id) || null; + transaction.value.transactionItems.forEach((item, index) => { + const matchingAccount = dictUserAccounts.value.find(account => account.id === item.userAccount.id); + transaction.value.transactionItems[index].userAccount = matchingAccount || null; + }); + } catch (error) { + alertService.showHttpError(error.response); + } + }; + + const retrieveTransactionForPayments = async transactionId => { + try { + if (dictUserAccounts.value.length == 0) { + const res2 = await userAccountService().retrieve(); + dictUserAccounts.value = res2.data; + } + const res = await transactionService().payments(transactionId); + transaction.value = res; + transaction.value.transactionItems.forEach((item, index) => { + const matchingAccount = dictUserAccounts.value.find(account => account.id === item.userAccount.id); + transaction.value.transactionItems[index].userAccount = matchingAccount || null; + }); + } catch (error) { + alertService.showHttpError(error.response); + } + }; + + const retrieveTransactionForFieldPayment = async eventId => { + try { + if (dictUserAccounts.value.length == 0) { + const res2 = await userAccountService().retrieve(); + dictUserAccounts.value = res2.data; + } + const res = await transactionService().fieldPayment(eventId); + transaction.value = res; transaction.value.transactionItems.forEach((item, index) => { const matchingAccount = dictUserAccounts.value.find(account => account.id === item.userAccount.id); transaction.value.transactionItems[index].userAccount = matchingAccount || null; @@ -76,14 +104,27 @@ export default defineComponent({ retrieveUserAccounts(); if (route.params?.transactionId) { + console.log('a1'); retrieveTransaction(route.params.transactionId, false); } if (route.params?.opposingTransactionId) { + console.log('a2'); console.log('getting opposite transaction for ' + route.params?.opposingTransactionId); retrieveTransaction(route.params.opposingTransactionId, true); } + if (route.params?.paymentsForTransactionId) { + console.log('a3'); + retrieveTransactionForPayments(route.params.paymentsForTransactionId); + } + + if (route.params?.paymentForFieldByEventId) { + console.log('a4'); + retrieveTransactionForFieldPayment(route.params.paymentForFieldByEventId); + } + console.log('a5'); + const initRelationships = () => { eventService() .retrieve() diff --git a/src/main/webapp/app/entities/transaction/transaction-update.vue b/src/main/webapp/app/entities/transaction/transaction-update.vue index fd6025e..c5efa76 100644 --- a/src/main/webapp/app/entities/transaction/transaction-update.vue +++ b/src/main/webapp/app/entities/transaction/transaction-update.vue @@ -76,7 +76,14 @@
- +
+ + + + +
@@ -84,7 +91,7 @@ - Locked + Account Amount Comment @@ -96,9 +103,9 @@ {{ item.id }} - - - + + + -
- +