diff --git a/src/main/java/com/sasiedzi/event/domain/Transaction.java b/src/main/java/com/sasiedzi/event/domain/Transaction.java index 8e56390..a174fb8 100644 --- a/src/main/java/com/sasiedzi/event/domain/Transaction.java +++ b/src/main/java/com/sasiedzi/event/domain/Transaction.java @@ -7,8 +7,8 @@ import jakarta.persistence.*; import java.io.Serializable; import java.time.LocalDate; import java.time.temporal.ChronoUnit; -import java.util.HashSet; -import java.util.Set; +import java.util.*; +import org.hibernate.annotations.SortComparator; /** * A Transaction. @@ -42,7 +42,8 @@ public class Transaction implements Serializable { @OneToMany(fetch = FetchType.LAZY, mappedBy = "transaction", cascade = CascadeType.ALL, orphanRemoval = true) @JsonIgnoreProperties(value = { "transaction", "event", "registration" }, allowSetters = true) - private Set transactionItems = new HashSet<>(); + @SortComparator(TransactionItemComparator.class) + private List transactionItems = Transaction.getEmptyTransactionItemSet(); @Transient private UserAccount beneficiary; @@ -151,11 +152,11 @@ public class Transaction implements Serializable { return this; } - public Set getTransactionItems() { + public List getTransactionItems() { return this.transactionItems; } - public void setTransactionItems(Set transactionItems) { + public void setTransactionItems(List transactionItems) { if (this.transactionItems != null) { this.transactionItems.forEach(i -> i.setTransaction(null)); } @@ -165,7 +166,7 @@ public class Transaction implements Serializable { this.transactionItems = transactionItems; } - public Transaction transactionItems(Set transactionItems) { + public Transaction transactionItems(List transactionItems) { this.setTransactionItems(transactionItems); return this; } @@ -211,4 +212,8 @@ public class Transaction implements Serializable { ", comment='" + getComment() + "'" + "}"; } + + public static List getEmptyTransactionItemSet() { + return new ArrayList(); + } } diff --git a/src/main/java/com/sasiedzi/event/domain/TransactionItemComparator.java b/src/main/java/com/sasiedzi/event/domain/TransactionItemComparator.java new file mode 100644 index 0000000..7938a34 --- /dev/null +++ b/src/main/java/com/sasiedzi/event/domain/TransactionItemComparator.java @@ -0,0 +1,24 @@ +package com.sasiedzi.event.domain; + +import java.util.Comparator; + +public class TransactionItemComparator implements Comparator { + + private UserAccountComparator userAccountComparator = new UserAccountComparator(); + + @Override + public int compare(TransactionItem item1, TransactionItem item2) { + // Sprawdzamy, czy którykolwiek z obiektów jest null + if (item1 == null && item2 == null) return 0; + if (item1 == null) return -1; + if (item2 == null) return 1; + + // Teraz porównujemy pola userAccount + return compareUserAccounts(item1.getUserAccount(), item2.getUserAccount()); + } + + private int compareUserAccounts(UserAccount ua1, UserAccount ua2) { + // Używamy naszego komparatora UserAccount + return userAccountComparator.compare(ua1, ua2); + } +} diff --git a/src/main/java/com/sasiedzi/event/domain/UserAccountComparator.java b/src/main/java/com/sasiedzi/event/domain/UserAccountComparator.java new file mode 100644 index 0000000..cb9a208 --- /dev/null +++ b/src/main/java/com/sasiedzi/event/domain/UserAccountComparator.java @@ -0,0 +1,58 @@ +package com.sasiedzi.event.domain; + +import com.sasiedzi.event.service.Account; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; + +public class UserAccountComparator implements Comparator { + + String[] specialAccounts; + + public UserAccountComparator() { + ArrayList specialAccountList = new ArrayList(); + specialAccountList.addAll(Arrays.stream(Account.values()).map(Enum::toString).toList()); + specialAccountList.add("Tomasz Taraszewski"); + this.specialAccounts = specialAccountList.toArray(new String[0]); + } + + @Override + public int compare(UserAccount ua1, UserAccount ua2) { + // Sprawdzamy, czy obiekty nie są null + if (ua1 == null && ua2 == null) return 0; + if (ua1 == null) return -1; + if (ua2 == null) return 1; + + String name1 = ua1.getName(); + String name2 = ua2.getName(); + + // Sprawdzamy, czy oba są null + if (name1 == null && name2 == null) return 0; + if (name1 == null) return -1; + if (name2 == null) return 1; + + // Najpierw sprawdzamy, czy nazwy znajdują się w liście specjalnych nazw + int index1 = findSpecialNameIndex(name1); + int index2 = findSpecialNameIndex(name2); + + // Jeśli obie nazwy są specjalne, porównujemy ich indeksy + if (index1 != -1 && index2 != -1) { + return Integer.compare(index1, index2); + } + // Jeśli tylko jedna nazwa jest specjalna, ona jest "mniejsza" + if (index1 != -1) return -1; + if (index2 != -1) return 1; + + // Jeśli żadna z nazw nie jest specjalna, porównujemy alfabetycznie + return name1.compareTo(name2); + } + + private int findSpecialNameIndex(String name) { + for (int i = 0; i < specialAccounts.length; i++) { + if (specialAccounts[i].equalsIgnoreCase(name)) { + return i; // Zwracamy indeks specjalnej nazwy + } + } + return -1; // Nazwa nie jest specjalna + } +} diff --git a/src/main/java/com/sasiedzi/event/service/EventService.java b/src/main/java/com/sasiedzi/event/service/EventService.java index 04f6d53..31d728f 100644 --- a/src/main/java/com/sasiedzi/event/service/EventService.java +++ b/src/main/java/com/sasiedzi/event/service/EventService.java @@ -176,7 +176,7 @@ public class EventService { transaction.setEvent(event); transaction.setType(TransactionType.MATCH); transaction.setDate(LocalDate.now()); - transaction.setTransactionItems(new HashSet<>()); + transaction.setTransactionItems(Transaction.getEmptyTransactionItemSet()); transactionRepository.save(transaction); } else { transaction = allTransactions.get(0); diff --git a/src/main/java/com/sasiedzi/event/service/TransactionService.java b/src/main/java/com/sasiedzi/event/service/TransactionService.java index 6cc13ce..3b74b5e 100644 --- a/src/main/java/com/sasiedzi/event/service/TransactionService.java +++ b/src/main/java/com/sasiedzi/event/service/TransactionService.java @@ -1,9 +1,6 @@ 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.*; import com.sasiedzi.event.domain.enumeration.TransactionType; import com.sasiedzi.event.repository.TransactionItemRepository; import com.sasiedzi.event.repository.TransactionRepository; @@ -12,9 +9,11 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; +import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestParam; @Service @Transactional @@ -33,7 +32,7 @@ public class TransactionService { private EventService eventService; public Transaction save(Transaction transaction) { - Set items = transaction.getTransactionItems(); + List items = transaction.getTransactionItems(); String beneficiaryAccountName = transaction.getBeneficiary() == null ? Account.Skarbiec.toString() : transaction.getBeneficiary().getName(); @@ -196,4 +195,61 @@ public class TransactionService { public UserAccount getAccount(Account account) { return userAccountRepository.findByName(account.toString()).stream().min(Comparator.comparing(UserAccount::getId)).orElse(null); } + + public List getAllTransactions() { + // LOG.debug("REST request to get all Transactions"); + // if (eagerload) { + // return transactionRepository.findAllWithEagerRelationships(); + // } else { + // return transactionRepository.findAll(); + // } + List all = transactionRepository.findAll(); + Map accounts = new HashMap<>(); + Map, BigDecimal> items = new LinkedHashMap<>(); + all.forEach(transaction -> { + transaction + .getTransactionItems() + .forEach(transactionItem -> { + accounts.put(transactionItem.getUserAccount(), transactionItem); + }); + }); + all.forEach(transaction -> { + transaction + .getTransactionItems() + .forEach(transactionItem -> { + items.put( + Pair.of(transactionItem.getUserAccount(), transaction), + add(items.get(Pair.of(transactionItem.getUserAccount(), transaction)), transactionItem.getAmount()) + ); + }); + }); + List accountsSorted = accounts.keySet().stream().sorted(new UserAccountComparator()).toList(); + + List out = new ArrayList<>(); + for (Transaction transaction : all.stream().sorted(Comparator.comparing(Transaction::getDate)).toList()) { + TransactionDTO transactionDTO = new TransactionDTO( + transaction.getId(), + transaction.getType(), + transaction.getDate(), + transaction.getComment(), + transaction.getEvent() + ); + for (UserAccount userAccount : accountsSorted) { + BigDecimal amount = items.get(Pair.of(userAccount, transaction)); + + TransactionItem item = new TransactionItem(); + item.setUserAccount(userAccount); + transactionDTO.getItems().add(item); + item.setAmount(amount); + } + out.add(transactionDTO); + } + + return out; + } + + BigDecimal add(BigDecimal val, BigDecimal val2) { + if (val == null) return val2; + return val.add(val2); + } } 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 45e71c6..bf614f3 100644 --- a/src/main/java/com/sasiedzi/event/web/rest/TransactionResource.java +++ b/src/main/java/com/sasiedzi/event/web/rest/TransactionResource.java @@ -170,64 +170,7 @@ public class TransactionResource { public List getAllTransactions( @RequestParam(name = "eagerload", required = false, defaultValue = "true") boolean eagerload ) { - // LOG.debug("REST request to get all Transactions"); - // if (eagerload) { - // return transactionRepository.findAllWithEagerRelationships(); - // } else { - // return transactionRepository.findAll(); - // } - List all = transactionRepository.findAll(); - Map accounts = new HashMap<>(); - Map, BigDecimal> items = new HashMap<>(); - all.forEach(transaction -> { - transaction - .getTransactionItems() - .forEach(transactionItem -> { - accounts.put(transactionItem.getUserAccount(), transactionItem); - }); - }); - all.forEach(transaction -> { - transaction - .getTransactionItems() - .forEach(transactionItem -> { - items.put( - Pair.of(transactionItem.getUserAccount(), transaction), - add(items.get(Pair.of(transactionItem.getUserAccount(), transaction)), transactionItem.getAmount()) - ); - }); - }); - List accountsSorted = accounts - .keySet() - .stream() - .sorted(Comparator.comparing(UserAccount::getName).thenComparing(Comparator.comparing(UserAccount::getName))) - .toList(); - - List out = new ArrayList<>(); - for (Transaction transaction : all.stream().sorted(Comparator.comparing(Transaction::getDate)).toList()) { - TransactionDTO transactionDTO = new TransactionDTO( - transaction.getId(), - transaction.getType(), - transaction.getDate(), - transaction.getComment(), - transaction.getEvent() - ); - for (UserAccount userAccount : accountsSorted) { - BigDecimal amount = items.get(Pair.of(userAccount, transaction)); - - TransactionItem item = new TransactionItem(); - item.setUserAccount(userAccount); - transactionDTO.getItems().add(item); - item.setAmount(amount); - } - out.add(transactionDTO); - } - - return out; - } - - BigDecimal add(BigDecimal val, BigDecimal val2) { - if (val == null) return val2; - return val.add(val2); + return transactionService.getAllTransactions(); } // private Comparator getMyAccountFirstComparator (final String myAccountName) { diff --git a/src/test/java/com/sasiedzi/event/domain/TransactionTest.java b/src/test/java/com/sasiedzi/event/domain/TransactionTest.java index 4a73c3f..fae6121 100644 --- a/src/test/java/com/sasiedzi/event/domain/TransactionTest.java +++ b/src/test/java/com/sasiedzi/event/domain/TransactionTest.java @@ -51,11 +51,11 @@ class TransactionTest { assertThat(transaction.getTransactionItems()).doesNotContain(transactionItemBack); assertThat(transactionItemBack.getTransaction()).isNull(); - transaction.transactionItems(new HashSet<>(Set.of(transactionItemBack))); + transaction.transactionItems(Transaction.getEmptyTransactionItemSet()); assertThat(transaction.getTransactionItems()).containsOnly(transactionItemBack); assertThat(transactionItemBack.getTransaction()).isEqualTo(transaction); - transaction.setTransactionItems(new HashSet<>()); + transaction.setTransactionItems(Transaction.getEmptyTransactionItemSet()); assertThat(transaction.getTransactionItems()).doesNotContain(transactionItemBack); assertThat(transactionItemBack.getTransaction()).isNull(); }