diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java index ae0635a8a4e05d9bb775891a373dc538bfd7e3ad..3a2f6cb530e96f0dc019959f9777c646ec50dc0e 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 936d77ef7d72eff96bb826c4076117db4cdd9dae..eb967c16d4dcc55b754461687edab9efa2253a69 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 700c69aed3395256cf2d98e582b0566b7a451929..a2271ac2ff248f18df4b109f95f4188e8895d123 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 3814cf90c0c353fe94ef3ff863e3520e50fc3acc..dcddf01215507a808d558a73144af7a246f5abdd 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 0000000000000000000000000000000000000000..d5acd0f5ccd0814600545cd72f5e7d728db18a57 --- /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 a17497072a0d66be2d5fa7b33efc80d74ebd29c5..2b68a0a72a70743b9be4e1682a9482fddfa5dc22 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 311580ba5417940badde745678bbbef97f2ffc9f..9a6c2d2f938f175143d662270d618ba226e5ddd7 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 21fb2b22ff5e6fa73eb9718ac4654c3de3adce27..dce776463ced743d26270cf21bed831fa978060e 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 359ad8e01e606f7e1631f806e83793e37dc3ab7d..0c6691ba6f19889838b8db8bbfe6be05e670cbaa 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 3d031609c06ca53bee3c6df05bb60a0a4cc2a7ff..75335615111fc9552706bda9709f9f4d37f4586e 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 75bf793e6d83948b96432731ffce19df888ff38f..50f91605d6797a0244ffa6b3903b2a51afc75564 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 6d6874193f1df6046c3d29e8327b43b921eb9694..3015a0fe5e24fe6f1ec827de037766dc0c5c4660 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 8ea6402923254d59738b7655fb57798245a95dee..19317aec174d6995f45f93ef0f5bb82ec983aec7 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 aba53cde27859778928c6d4604137dc9c5c337a5..7a662d7e1512a6f2fd1afc414fab0a2215d15ba2 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 290fef2456d7965ecb7204b5cf9f4658f7666a2e..4fd0cd4277ca5f68a73dc52d83414d297f6d4a18 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;