From 1c14535bee015709b50239d37a3846c125d037c3 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 17 Feb 2019 17:30:10 +0100 Subject: [PATCH] Fixed #396 - change repeating end option leads to error if tags are involved --- .../controller/TransactionController.java | 2 +- .../database/DatabaseParser_v3.java | 2 +- .../database/legacy/LegacyParser.java | 6 +-- .../budgetmaster/entities/{ => tag}/Tag.java | 4 +- .../entities/tag/TagScheduler.java | 41 +++++++++++++++++++ .../entities/transaction/Transaction.java | 12 ++++-- .../entities/transaction/Transaction_.java | 2 +- .../repositories/TagRepository.java | 2 +- .../repositories/TransactionRepository.java | 3 ++ .../budgetmaster/services/HelpersService.java | 2 +- .../budgetmaster/services/ImportService.java | 2 +- .../report/ReportGeneratorService.java | 2 +- .../database/DatabaseImportTest.java | 8 +++- .../database/DatabaseParser_v3Test.java | 2 +- .../database/LegacyParserTest.java | 2 +- 15 files changed, 74 insertions(+), 18 deletions(-) rename src/main/java/de/deadlocker8/budgetmaster/entities/{ => tag}/Tag.java (92%) create mode 100644 src/main/java/de/deadlocker8/budgetmaster/entities/tag/TagScheduler.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java index ae0635a8a..3a2f6cb53 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java @@ -1,7 +1,7 @@ package de.deadlocker8.budgetmaster.controller; import de.deadlocker8.budgetmaster.entities.Settings; -import de.deadlocker8.budgetmaster.entities.Tag; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import de.deadlocker8.budgetmaster.filter.FilterConfiguration; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java index 936d77ef7..eb967c16d 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java @@ -1,9 +1,9 @@ package de.deadlocker8.budgetmaster.database; import com.google.gson.*; -import de.deadlocker8.budgetmaster.entities.*; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.category.Category; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; import de.deadlocker8.budgetmaster.repeating.endoption.*; diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java index 700c69aed..a2271ac2f 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java @@ -237,14 +237,14 @@ public class LegacyParser return null; } - private List<de.deadlocker8.budgetmaster.entities.Tag> getTagsByPaymentID(int paymentID) + private List<de.deadlocker8.budgetmaster.entities.tag.Tag> getTagsByPaymentID(int paymentID) { - List<de.deadlocker8.budgetmaster.entities.Tag> tags = new ArrayList<>(); + List<de.deadlocker8.budgetmaster.entities.tag.Tag> tags = new ArrayList<>(); for(TagMatch tagMatch : tagMatches) { if(tagMatch.getPaymentID() == paymentID) { - tags.add(new de.deadlocker8.budgetmaster.entities.Tag(tagMatch.getTagName())); + tags.add(new de.deadlocker8.budgetmaster.entities.tag.Tag(tagMatch.getTagName())); } } diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/Tag.java b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/Tag.java similarity index 92% rename from src/main/java/de/deadlocker8/budgetmaster/entities/Tag.java rename to src/main/java/de/deadlocker8/budgetmaster/entities/tag/Tag.java index 3814cf90c..dcddf0121 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/entities/Tag.java +++ b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/Tag.java @@ -1,4 +1,4 @@ -package de.deadlocker8.budgetmaster.entities; +package de.deadlocker8.budgetmaster.entities.tag; import com.google.gson.annotations.Expose; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; @@ -24,7 +24,7 @@ public class Tag private String name; @ManyToMany(mappedBy = "tags", fetch = FetchType.LAZY) - private transient List<Transaction> referringTransactions; + private List<Transaction> referringTransactions; public Tag() { diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/tag/TagScheduler.java b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/TagScheduler.java new file mode 100644 index 000000000..d5acd0f5c --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/TagScheduler.java @@ -0,0 +1,41 @@ +package de.deadlocker8.budgetmaster.entities.tag; + +import de.deadlocker8.budgetmaster.repositories.TagRepository; +import de.deadlocker8.budgetmaster.repositories.TransactionRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class TagScheduler +{ + private final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); + + private TagRepository tagRepository; + private TransactionRepository transactionRepository; + + @Autowired + public TagScheduler(TagRepository tagRepository, TransactionRepository transactionRepository) + { + this.tagRepository = tagRepository; + this.transactionRepository = transactionRepository; + } + + @Scheduled(fixedRate = 60*1000) + public void tagCleaner() + { + LOGGER.debug("Cleaning Tags..."); + List<Tag> tags = tagRepository.findAll(); + for(Tag tag : tags) + { + if(transactionRepository.findAllByTagsContaining(tag).size() == 0) + { + tagRepository.delete(tag); + } + } + } +} diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java index a17497072..2b68a0a72 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java +++ b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java @@ -1,7 +1,7 @@ package de.deadlocker8.budgetmaster.entities.transaction; import com.google.gson.annotations.Expose; -import de.deadlocker8.budgetmaster.entities.Tag; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.category.Category; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; @@ -40,8 +40,14 @@ public class Transaction @Expose private String description; - @ManyToMany(cascade = CascadeType.ALL) + @ManyToMany @Expose + @JoinTable( + name = "transaction_tags", + joinColumns = @JoinColumn( + name = "transaction_id", referencedColumnName = "ID"), + inverseJoinColumns = @JoinColumn( + name = "tags_id", referencedColumnName = "ID")) private List<Tag> tags; @ManyToOne(optional = true, cascade = CascadeType.ALL) @@ -198,4 +204,4 @@ public class Transaction { return Objects.hash(ID, amount, date, account, category, name, description, tags, repeatingOption); } -} \ No newline at end of file +} diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java index 311580ba5..9a6c2d2f9 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java +++ b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java @@ -1,6 +1,6 @@ package de.deadlocker8.budgetmaster.entities.transaction; -import de.deadlocker8.budgetmaster.entities.Tag; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.category.Category; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java index 21fb2b22f..dce776463 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java +++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java @@ -1,6 +1,6 @@ package de.deadlocker8.budgetmaster.repositories; -import de.deadlocker8.budgetmaster.entities.Tag; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java index 359ad8e01..0c6691ba6 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java +++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java @@ -1,5 +1,6 @@ package de.deadlocker8.budgetmaster.repositories; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import org.joda.time.DateTime; @@ -18,6 +19,8 @@ public interface TransactionRepository extends JpaRepository<Transaction, Intege List<Transaction> findAllByAccount(Account account); + List<Transaction> findAllByTagsContaining(Tag tag); + @Query(value = "SELECT SUM(t.amount) FROM `transaction` as t WHERE t.account_id = ?1 AND t.date BETWEEN ?2 AND ?3", nativeQuery = true) Integer getRest(int accountID, String startDate, String endDate); } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java index 3d031609c..753356151 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java @@ -2,7 +2,7 @@ package de.deadlocker8.budgetmaster.services; import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch; import de.deadlocker8.budgetmaster.entities.Settings; -import de.deadlocker8.budgetmaster.entities.Tag; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.account.AccountType; import de.deadlocker8.budgetmaster.entities.category.CategoryType; diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java index 75bf793e6..50f91605d 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java @@ -5,7 +5,7 @@ import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch; import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList; import de.deadlocker8.budgetmaster.entities.category.Category; import de.deadlocker8.budgetmaster.entities.category.CategoryType; -import de.deadlocker8.budgetmaster.entities.Tag; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import de.deadlocker8.budgetmaster.repositories.CategoryRepository; import de.deadlocker8.budgetmaster.repositories.TagRepository; diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java index 6d6874193..3015a0fe5 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java @@ -2,7 +2,7 @@ package de.deadlocker8.budgetmaster.services.report; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; -import de.deadlocker8.budgetmaster.entities.Tag; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import de.deadlocker8.budgetmaster.entities.report.ReportColumn; import de.deadlocker8.budgetmaster.reports.*; diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java index 8ea640292..19317aec1 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java @@ -1,10 +1,10 @@ package de.deadlocker8.budgetmaster.database; -import de.deadlocker8.budgetmaster.entities.*; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.account.AccountType; import de.deadlocker8.budgetmaster.entities.category.Category; import de.deadlocker8.budgetmaster.entities.category.CategoryType; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import de.deadlocker8.budgetmaster.repositories.CategoryRepository; import de.deadlocker8.budgetmaster.repositories.TagRepository; @@ -262,6 +262,12 @@ public class DatabaseImportTest return null; } + @Override + public List<Transaction> findAllByTagsContaining(Tag tag) + { + return null; + } + @Override public Integer getRest(int accountID, String startDate, String endDate) { diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java index aba53cde2..7a662d7e1 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java +++ b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java @@ -1,10 +1,10 @@ package de.deadlocker8.budgetmaster.database; -import de.deadlocker8.budgetmaster.entities.*; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.account.AccountType; import de.deadlocker8.budgetmaster.entities.category.Category; import de.deadlocker8.budgetmaster.entities.category.CategoryType; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndAfterXTimes; diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java b/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java index 290fef245..4fd0cd427 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java @@ -1,11 +1,11 @@ package de.deadlocker8.budgetmaster.database; import de.deadlocker8.budgetmaster.database.legacy.LegacyParser; -import de.deadlocker8.budgetmaster.entities.*; import de.deadlocker8.budgetmaster.entities.account.Account; import de.deadlocker8.budgetmaster.entities.account.AccountType; import de.deadlocker8.budgetmaster.entities.category.Category; import de.deadlocker8.budgetmaster.entities.category.CategoryType; +import de.deadlocker8.budgetmaster.entities.tag.Tag; import de.deadlocker8.budgetmaster.entities.transaction.Transaction; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndDate; -- GitLab