opposite transaction

This commit is contained in:
2024-11-19 15:39:27 +01:00
parent f63cb0b946
commit b06597f36e
8 changed files with 167 additions and 17 deletions
@@ -0,0 +1,6 @@
package com.sasiedzi.event.service;
public enum Account {
Boisko,
Skarbiec,
}
@@ -168,8 +168,6 @@ public class EventService {
transactionRepository.save(transaction);
}
if (event.getRegistrations() != null && !event.getRegistrations().isEmpty()) {
String fieldServiceAccountName = "Boisko";
String vaultAccountName = "Skarbiec";
List<UserAccount> accounts = userAccountRepository.findAll();
Map<String, UserAccount> accountsByLogin = new HashMap<>();
accounts.forEach(acc -> {
@@ -182,17 +180,17 @@ public class EventService {
Map<String, UserAccount> accountsByAccountName = accounts
.stream()
.collect(Collectors.toMap(UserAccount::getName, Function.identity(), (existing, replacement) -> existing));
if (!accountsByAccountName.containsKey(fieldServiceAccountName)) {
if (!accountsByAccountName.containsKey(Account.Boisko.name())) {
UserAccount entity = new UserAccount();
entity.setName(fieldServiceAccountName);
entity.setName(Account.Boisko.name());
entity = userAccountRepository.save(entity);
accountsByAccountName.put(fieldServiceAccountName, entity);
accountsByAccountName.put(Account.Boisko.name(), entity);
}
if (!accountsByAccountName.containsKey(vaultAccountName)) {
if (!accountsByAccountName.containsKey(Account.Skarbiec.name())) {
UserAccount entity = new UserAccount();
entity.setName(vaultAccountName);
entity.setName(Account.Skarbiec.name());
entity = userAccountRepository.save(entity);
accountsByAccountName.put(vaultAccountName, entity);
accountsByAccountName.put(Account.Skarbiec.name(), entity);
}
List<UserAccount> accountsToCharge = new ArrayList<>();
event
@@ -209,7 +207,7 @@ public class EventService {
TransactionItem fieldServiceItem = new TransactionItem();
fieldServiceItem.setEvent(event);
fieldServiceItem.setAmount(event.getCost());
fieldServiceItem.setUserAccount(accountsByAccountName.get(fieldServiceAccountName));
fieldServiceItem.setUserAccount(accountsByAccountName.get(Account.Boisko.name()));
fieldServiceItem.setTransaction(transaction);
transaction.getTransactionItems().add(fieldServiceItem);
accountsToCharge.forEach(userAccount -> {
@@ -230,7 +228,7 @@ public class EventService {
TransactionItem vaultItem = new TransactionItem();
vaultItem.setEvent(event);
vaultItem.setAmount(vaultValue);
vaultItem.setUserAccount(accountsByAccountName.get(vaultAccountName));
vaultItem.setUserAccount(accountsByAccountName.get(Account.Skarbiec.name()));
vaultItem.setTransaction(transaction);
transaction.getTransactionItems().add(vaultItem);
}
@@ -0,0 +1,103 @@
package com.sasiedzi.event.service;
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.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.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class TransactionService {
@Autowired
TransactionRepository transactionRepository;
@Autowired
UserAccountRepository userAccountRepository;
public Transaction save(Transaction transaction) {
Set<TransactionItem> items = transaction.getTransactionItems();
Set<TransactionItem> vaults = items
.stream()
.filter(item -> Account.Skarbiec.name().equals(item.getUserAccount().getName()))
.collect(Collectors.toSet());
Set<TransactionItem> nonVaults = items
.stream()
.filter(item -> !Account.Skarbiec.name().equals(item.getUserAccount().getName()))
.collect(Collectors.toSet());
BigDecimal vaultValue = nonVaults
.stream()
.map(TransactionItem::getAmount)
.map(BigDecimal::negate)
.reduce(BigDecimal.ZERO, BigDecimal::add);
boolean vaultIsNeeded = vaultValue.compareTo(BigDecimal.ZERO) != 0;
HashSet<TransactionItem> itemsToBeRemoved = new HashSet<>();
if (vaultIsNeeded) {
if (vaults.isEmpty()) {
TransactionItem transactionItem = new TransactionItem();
UserAccount vaultAccount = userAccountRepository
.findAll()
.stream()
.filter(item -> Account.Skarbiec.name().equals(item.getName()))
.findFirst()
.orElse(null);
transactionItem.setUserAccount(vaultAccount);
transactionItem.setAmount(vaultValue);
transactionItem.setTransaction(transaction);
transaction.getTransactionItems().add(transactionItem);
} else {
TransactionItem first = null;
for (TransactionItem item : vaults) {
if (first == null) {
first = item;
} else {
itemsToBeRemoved.add(item);
}
}
first.setAmount(vaultValue);
}
} else {
itemsToBeRemoved.addAll(vaults);
}
itemsToBeRemoved.forEach(transactionItem -> {
transaction.getTransactionItems().remove(transactionItem);
});
if (transaction.getDate() == null) transaction.setDate(LocalDate.now());
return transactionRepository.save(transaction);
}
public Transaction createOpposite(Long id) {
Transaction existing = transactionRepository.findOneWithEagerRelationships(id).orElseGet(Transaction::new);
Transaction newTransaction = new Transaction();
newTransaction.setType(TransactionType.INTERNALTRANSFER);
newTransaction.setEvent(existing.getEvent());
for (TransactionItem item : existing.getTransactionItems()) {
TransactionItem newItem = new TransactionItem();
newItem.setAmount(item.getAmount().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;
}
}
@@ -3,6 +3,7 @@ package com.sasiedzi.event.web.rest;
import com.sasiedzi.event.domain.*;
import com.sasiedzi.event.repository.TransactionRepository;
import com.sasiedzi.event.security.AuthoritiesConstants;
import com.sasiedzi.event.service.TransactionService;
import com.sasiedzi.event.web.rest.errors.BadRequestAlertException;
import java.math.BigDecimal;
import java.net.URI;
@@ -11,6 +12,7 @@ import java.util.*;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
@@ -54,7 +56,7 @@ public class TransactionResource {
if (transaction.getId() != null) {
throw new BadRequestAlertException("A new transaction cannot already have an ID", ENTITY_NAME, "idexists");
}
transaction = transactionRepository.save(transaction);
transaction = transactionService.save(transaction);
return ResponseEntity.created(new URI("/api/transactions/" + transaction.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, false, ENTITY_NAME, transaction.getId().toString()))
.body(transaction);
@@ -88,7 +90,7 @@ public class TransactionResource {
throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
}
transaction = transactionRepository.save(transaction);
transaction = transactionService.save(transaction);
return ResponseEntity.ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, false, ENTITY_NAME, transaction.getId().toString()))
.body(transaction);
@@ -279,6 +281,21 @@ public class TransactionResource {
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("/opposing/{id}")
public Transaction getTransactionOpposite(@PathVariable("id") Long id) {
LOG.debug("REST request to get Transaction : {}", id);
return transactionService.createOpposite(id);
}
/**
* {@code DELETE /transactions/:id} : delete the "id" transaction.
*