account order

This commit is contained in:
2024-12-06 23:35:28 +01:00
parent 346236ec09
commit 823ac56d8e
7 changed files with 158 additions and 72 deletions
@@ -7,8 +7,8 @@ import jakarta.persistence.*;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.HashSet; import java.util.*;
import java.util.Set; import org.hibernate.annotations.SortComparator;
/** /**
* A Transaction. * A Transaction.
@@ -42,7 +42,8 @@ public class Transaction implements Serializable {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "transaction", cascade = CascadeType.ALL, orphanRemoval = true) @OneToMany(fetch = FetchType.LAZY, mappedBy = "transaction", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnoreProperties(value = { "transaction", "event", "registration" }, allowSetters = true) @JsonIgnoreProperties(value = { "transaction", "event", "registration" }, allowSetters = true)
private Set<TransactionItem> transactionItems = new HashSet<>(); @SortComparator(TransactionItemComparator.class)
private List<TransactionItem> transactionItems = Transaction.getEmptyTransactionItemSet();
@Transient @Transient
private UserAccount beneficiary; private UserAccount beneficiary;
@@ -151,11 +152,11 @@ public class Transaction implements Serializable {
return this; return this;
} }
public Set<TransactionItem> getTransactionItems() { public List<TransactionItem> getTransactionItems() {
return this.transactionItems; return this.transactionItems;
} }
public void setTransactionItems(Set<TransactionItem> transactionItems) { public void setTransactionItems(List<TransactionItem> transactionItems) {
if (this.transactionItems != null) { if (this.transactionItems != null) {
this.transactionItems.forEach(i -> i.setTransaction(null)); this.transactionItems.forEach(i -> i.setTransaction(null));
} }
@@ -165,7 +166,7 @@ public class Transaction implements Serializable {
this.transactionItems = transactionItems; this.transactionItems = transactionItems;
} }
public Transaction transactionItems(Set<TransactionItem> transactionItems) { public Transaction transactionItems(List<TransactionItem> transactionItems) {
this.setTransactionItems(transactionItems); this.setTransactionItems(transactionItems);
return this; return this;
} }
@@ -211,4 +212,8 @@ public class Transaction implements Serializable {
", comment='" + getComment() + "'" + ", comment='" + getComment() + "'" +
"}"; "}";
} }
public static List<TransactionItem> getEmptyTransactionItemSet() {
return new ArrayList();
}
} }
@@ -0,0 +1,24 @@
package com.sasiedzi.event.domain;
import java.util.Comparator;
public class TransactionItemComparator implements Comparator<TransactionItem> {
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);
}
}
@@ -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<UserAccount> {
String[] specialAccounts;
public UserAccountComparator() {
ArrayList<String> specialAccountList = new ArrayList<String>();
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
}
}
@@ -176,7 +176,7 @@ public class EventService {
transaction.setEvent(event); transaction.setEvent(event);
transaction.setType(TransactionType.MATCH); transaction.setType(TransactionType.MATCH);
transaction.setDate(LocalDate.now()); transaction.setDate(LocalDate.now());
transaction.setTransactionItems(new HashSet<>()); transaction.setTransactionItems(Transaction.getEmptyTransactionItemSet());
transactionRepository.save(transaction); transactionRepository.save(transaction);
} else { } else {
transaction = allTransactions.get(0); transaction = allTransactions.get(0);
@@ -1,9 +1,6 @@
package com.sasiedzi.event.service; package com.sasiedzi.event.service;
import com.sasiedzi.event.domain.Event; import com.sasiedzi.event.domain.*;
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.domain.enumeration.TransactionType;
import com.sasiedzi.event.repository.TransactionItemRepository; import com.sasiedzi.event.repository.TransactionItemRepository;
import com.sasiedzi.event.repository.TransactionRepository; import com.sasiedzi.event.repository.TransactionRepository;
@@ -12,9 +9,11 @@ import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
@Service @Service
@Transactional @Transactional
@@ -33,7 +32,7 @@ public class TransactionService {
private EventService eventService; private EventService eventService;
public Transaction save(Transaction transaction) { public Transaction save(Transaction transaction) {
Set<TransactionItem> items = transaction.getTransactionItems(); List<TransactionItem> items = transaction.getTransactionItems();
String beneficiaryAccountName = transaction.getBeneficiary() == null String beneficiaryAccountName = transaction.getBeneficiary() == null
? Account.Skarbiec.toString() ? Account.Skarbiec.toString()
: transaction.getBeneficiary().getName(); : transaction.getBeneficiary().getName();
@@ -196,4 +195,61 @@ public class TransactionService {
public UserAccount getAccount(Account account) { public UserAccount getAccount(Account account) {
return userAccountRepository.findByName(account.toString()).stream().min(Comparator.comparing(UserAccount::getId)).orElse(null); return userAccountRepository.findByName(account.toString()).stream().min(Comparator.comparing(UserAccount::getId)).orElse(null);
} }
public List<TransactionDTO> getAllTransactions() {
// LOG.debug("REST request to get all Transactions");
// if (eagerload) {
// return transactionRepository.findAllWithEagerRelationships();
// } else {
// return transactionRepository.findAll();
// }
List<Transaction> all = transactionRepository.findAll();
Map<UserAccount, TransactionItem> accounts = new HashMap<>();
Map<Pair<UserAccount, Transaction>, 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<UserAccount> accountsSorted = accounts.keySet().stream().sorted(new UserAccountComparator()).toList();
List<TransactionDTO> 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);
}
} }
@@ -170,64 +170,7 @@ public class TransactionResource {
public List<TransactionDTO> getAllTransactions( public List<TransactionDTO> getAllTransactions(
@RequestParam(name = "eagerload", required = false, defaultValue = "true") boolean eagerload @RequestParam(name = "eagerload", required = false, defaultValue = "true") boolean eagerload
) { ) {
// LOG.debug("REST request to get all Transactions"); return transactionService.getAllTransactions();
// if (eagerload) {
// return transactionRepository.findAllWithEagerRelationships();
// } else {
// return transactionRepository.findAll();
// }
List<Transaction> all = transactionRepository.findAll();
Map<UserAccount, TransactionItem> accounts = new HashMap<>();
Map<Pair<UserAccount, Transaction>, 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<UserAccount> accountsSorted = accounts
.keySet()
.stream()
.sorted(Comparator.comparing(UserAccount::getName).thenComparing(Comparator.comparing(UserAccount::getName)))
.toList();
List<TransactionDTO> 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);
} }
// private Comparator<UserAccount> getMyAccountFirstComparator (final String myAccountName) { // private Comparator<UserAccount> getMyAccountFirstComparator (final String myAccountName) {
@@ -51,11 +51,11 @@ class TransactionTest {
assertThat(transaction.getTransactionItems()).doesNotContain(transactionItemBack); assertThat(transaction.getTransactionItems()).doesNotContain(transactionItemBack);
assertThat(transactionItemBack.getTransaction()).isNull(); assertThat(transactionItemBack.getTransaction()).isNull();
transaction.transactionItems(new HashSet<>(Set.of(transactionItemBack))); transaction.transactionItems(Transaction.getEmptyTransactionItemSet());
assertThat(transaction.getTransactionItems()).containsOnly(transactionItemBack); assertThat(transaction.getTransactionItems()).containsOnly(transactionItemBack);
assertThat(transactionItemBack.getTransaction()).isEqualTo(transaction); assertThat(transactionItemBack.getTransaction()).isEqualTo(transaction);
transaction.setTransactionItems(new HashSet<>()); transaction.setTransactionItems(Transaction.getEmptyTransactionItemSet());
assertThat(transaction.getTransactionItems()).doesNotContain(transactionItemBack); assertThat(transaction.getTransactionItems()).doesNotContain(transactionItemBack);
assertThat(transactionItemBack.getTransaction()).isNull(); assertThat(transactionItemBack.getTransaction()).isNull();
} }