From 00a9dd13451ed8592369d2fe7220388fbefc7ba0 Mon Sep 17 00:00:00 2001 From: Ryan Ez Zerqti Date: Tue, 28 Apr 2026 11:15:19 +0200 Subject: [PATCH] fix Transaction --- .../controller/TransactionController.java | 17 +++++--- .../fr/moneybuddy/dtos/Money/AddMoney.java | 3 ++ .../fr/moneybuddy/model/SubAccount.java | 1 + .../fr/moneybuddy/model/Transaction.java | 1 + .../repository/TransactionRepository.java | 8 +++- .../fr/moneybuddy/service/CoinService.java | 32 ++++++++++++--- .../fr/moneybuddy/service/IncomeService.java | 1 + .../fr/moneybuddy/service/MoneyService.java | 7 ++-- .../service/ProgressOrchestratorService.java | 10 ++++- .../fr/moneybuddy/service/TaskService.java | 2 +- .../service/TransactionService.java | 41 +++++++++++++++---- 11 files changed, 96 insertions(+), 27 deletions(-) diff --git a/src/main/java/moneybuddy/fr/moneybuddy/controller/TransactionController.java b/src/main/java/moneybuddy/fr/moneybuddy/controller/TransactionController.java index 7914fbc..2ccaea1 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/controller/TransactionController.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/controller/TransactionController.java @@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; import moneybuddy.fr.moneybuddy.model.Transaction; import moneybuddy.fr.moneybuddy.service.TransactionService; +import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -23,14 +24,20 @@ public class TransactionController { private final TransactionService transactionService; - @GetMapping("/subAccount/{subAccountId}") - public ResponseEntity> getTransactions( + @GetMapping("/subAccount") + public ResponseEntity> getTransactions( @RequestHeader("Authorization") String authHeader, - @PathVariable String subAccountId, - @RequestParam(required = false) boolean isGoal) { + @RequestParam(required = false) String subAccountId, + @RequestParam(required = false) boolean isGoal, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "50") int size, + @RequestParam(defaultValue = "createdAt") String sortBy, + @RequestParam(defaultValue = "desc") String sortDir) { String token = authHeader.substring(7); return ResponseEntity.status(HttpStatus.OK) - .body(transactionService.getTransactions(token, subAccountId, isGoal)); + .body( + transactionService.getTransactions( + token, subAccountId, isGoal, page, size, sortBy, sortDir)); } @GetMapping("/goal/{goalId}") diff --git a/src/main/java/moneybuddy/fr/moneybuddy/dtos/Money/AddMoney.java b/src/main/java/moneybuddy/fr/moneybuddy/dtos/Money/AddMoney.java index 44e3738..782f5a5 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/dtos/Money/AddMoney.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/dtos/Money/AddMoney.java @@ -26,6 +26,9 @@ public class AddMoney { @Positive(message = "Le montant doit être supérieur à zéro") private BigDecimal amount; + @NotBlank(message = "Emoji est obligatoire") + private String emoji; + private String description; private String goalId; } diff --git a/src/main/java/moneybuddy/fr/moneybuddy/model/SubAccount.java b/src/main/java/moneybuddy/fr/moneybuddy/model/SubAccount.java index a154c86..ec83a56 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/model/SubAccount.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/model/SubAccount.java @@ -42,6 +42,7 @@ public class SubAccount { @Builder.Default private BigDecimal money = BigDecimal.ZERO.setScale(2); @Builder.Default private BigDecimal income = BigDecimal.ZERO.setScale(2); @Builder.Default private int coin = 0; + @Builder.Default private int energy = 5; @Builder.Default private String iconStyle = "bottts-neutral"; @Builder.Default private String iconName = "Mason"; diff --git a/src/main/java/moneybuddy/fr/moneybuddy/model/Transaction.java b/src/main/java/moneybuddy/fr/moneybuddy/model/Transaction.java index 8be641c..9ac13f2 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/model/Transaction.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/model/Transaction.java @@ -38,4 +38,5 @@ public class Transaction { private String oldAmount; private String newAmount; private String description; + private String emoji; } diff --git a/src/main/java/moneybuddy/fr/moneybuddy/repository/TransactionRepository.java b/src/main/java/moneybuddy/fr/moneybuddy/repository/TransactionRepository.java index cb1f747..4342395 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/repository/TransactionRepository.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/repository/TransactionRepository.java @@ -15,15 +15,19 @@ @Repository public interface TransactionRepository extends MongoRepository { - List findAllByChildId(String childId); + @Query(value = "{ 'goalId': { $ne: null }}") + Page findByChildIdAndGoal(String childId, Pageable pageable); @Query(value = "{ 'goalId': { $ne: null }}") - List findByChildAndGoal(String childId); + Page findByAccountIdAndGoal(String accountId, Pageable pageable); List findAllByGoalId(String goalId); Page findAllByAccountId(String accountId, Pageable pageable); + Page findAllByAccountIdAndChildId( + String accountId, String childId, Pageable pageable); + Page findAllByParentId(String parentId, Pageable pageable); Page findAllByChildId(String childId, Pageable pageable); diff --git a/src/main/java/moneybuddy/fr/moneybuddy/service/CoinService.java b/src/main/java/moneybuddy/fr/moneybuddy/service/CoinService.java index 0116fcf..0573fe7 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/service/CoinService.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/service/CoinService.java @@ -13,14 +13,13 @@ import moneybuddy.fr.moneybuddy.model.enums.TransactionCategory; import moneybuddy.fr.moneybuddy.model.enums.TransactionType; import moneybuddy.fr.moneybuddy.repository.SubAccountRepository; -import moneybuddy.fr.moneybuddy.repository.TransactionRepository; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class CoinService { private final SubAccountRepository subAccountRepository; - private final TransactionRepository transactionRepository; + private final TransactionService transactionService; public int updateCoin(SubAccount subAccount, int coin, boolean isAdd) { int currentCoin = subAccount.getCoin(); @@ -38,10 +37,31 @@ public int updateCoin(SubAccount subAccount, int coin, boolean isAdd) { return currentCoin; } - public void updateCoinForTask(SubAccount subAccount, Task task, boolean isAdd) { + public void updateCoinForCourseOrChapter( + SubAccount subAccount, int coinReward, String description) { + if (coinReward == 0) return; + + int currentBalance = updateCoin(subAccount, coinReward, true); + + Transaction transaction = + Transaction.builder() + .childId(subAccount.getId()) + .accountId(subAccount.getAccountId()) + .amount(String.valueOf(coinReward)) + .oldAmount(String.valueOf(currentBalance)) + .newAmount(String.valueOf(subAccount.getCoin())) + .description(description) + .type(TransactionType.CREDIT) + .category(TransactionCategory.COIN) + .createdAt(LocalDateTime.now()) + .build(); + transactionService.createTransaction(transaction); + } + + public void updateCoinForTask(SubAccount subAccount, Task task) { if (task.getCoinReward() == 0) return; - int currentBalance = updateCoin(subAccount, task.getCoinReward(), isAdd); + int currentBalance = updateCoin(subAccount, task.getCoinReward(), true); Transaction transaction = Transaction.builder() @@ -52,10 +72,10 @@ public void updateCoinForTask(SubAccount subAccount, Task task, boolean isAdd) { .oldAmount(String.valueOf(currentBalance)) .newAmount(String.valueOf(subAccount.getCoin())) .description(task.getDescription()) - .type(isAdd ? TransactionType.CREDIT : TransactionType.DEBIT) + .type(TransactionType.CREDIT) .category(TransactionCategory.COIN) .createdAt(LocalDateTime.now()) .build(); - transactionRepository.save(transaction); + transactionService.createTransaction(transaction); } } diff --git a/src/main/java/moneybuddy/fr/moneybuddy/service/IncomeService.java b/src/main/java/moneybuddy/fr/moneybuddy/service/IncomeService.java index 5dd93e4..22c86a4 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/service/IncomeService.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/service/IncomeService.java @@ -54,6 +54,7 @@ public void createTransactionForIncome(Income income) { .description(income.getTask().getDescription()) .incomeId(income.getId()) .build(); + transactionService.createTransaction(transaction); } diff --git a/src/main/java/moneybuddy/fr/moneybuddy/service/MoneyService.java b/src/main/java/moneybuddy/fr/moneybuddy/service/MoneyService.java index 6ab7a31..10b01cb 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/service/MoneyService.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/service/MoneyService.java @@ -16,14 +16,13 @@ import moneybuddy.fr.moneybuddy.model.enums.TransactionCategory; import moneybuddy.fr.moneybuddy.model.enums.TransactionType; import moneybuddy.fr.moneybuddy.repository.SubAccountRepository; -import moneybuddy.fr.moneybuddy.repository.TransactionRepository; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class MoneyService { private final SubAccountRepository subAccountRepository; - private final TransactionRepository transactionRepository; + private final TransactionService transactionService; private final JwtService jwtService; public void updateMoney(AddMoney request, String token, boolean isAdd) { @@ -67,10 +66,12 @@ public void updateMoney(AddMoney request, String token, boolean isAdd) { .oldAmount(String.valueOf(currentBalance)) .newAmount(String.valueOf(newBalance)) .description(request.getDescription()) + .emoji(request.getEmoji()) .type(isAdd ? TransactionType.CREDIT : TransactionType.DEBIT) .category(TransactionCategory.MONEY) .createdAt(LocalDateTime.now()) .build(); - transactionRepository.save(transaction); + + transactionService.createTransaction(transaction); } } diff --git a/src/main/java/moneybuddy/fr/moneybuddy/service/ProgressOrchestratorService.java b/src/main/java/moneybuddy/fr/moneybuddy/service/ProgressOrchestratorService.java index e83fdfd..1ce27b0 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/service/ProgressOrchestratorService.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/service/ProgressOrchestratorService.java @@ -40,7 +40,10 @@ public CompletedCourse completeCourse(String token, String courseId) { if (status == CompletedCourse.COMPLETED) { if (subAccount.getRole() == SubAccountRole.CHILD) - coinService.updateCoin(subAccount, course.getCoinReward(), true); + coinService.updateCoinForCourseOrChapter( + subAccount, + course.getCoinReward(), + String.format("Cours %s complété !", course.getTitle())); completeChapter(subAccount, course.getChapterId()); } @@ -54,6 +57,9 @@ public void completeChapter(SubAccount subAccount, String chapterId) { userProgressService.markChapterAsCompleted(subAccount, chapter); if (subAccount.getRole() == SubAccountRole.CHILD) - coinService.updateCoin(subAccount, chapter.getCoinReward(), true); + coinService.updateCoinForCourseOrChapter( + subAccount, + chapter.getCoinReward(), + String.format("Chapitre %s complété !", chapter.getTitle())); } } diff --git a/src/main/java/moneybuddy/fr/moneybuddy/service/TaskService.java b/src/main/java/moneybuddy/fr/moneybuddy/service/TaskService.java index f3bf6b8..71cd467 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/service/TaskService.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/service/TaskService.java @@ -197,7 +197,7 @@ public ResponseEntity completeTask(TaskComplete req, String token, if (req.isDone()) { incomeService.increaseSubAccountIncome(subAccount, task.getMoneyReward(), task); - coinService.updateCoinForTask(subAccount, task, true); + coinService.updateCoinForTask(subAccount, task); task.setStatus(TaskStatus.COMPLETED); } diff --git a/src/main/java/moneybuddy/fr/moneybuddy/service/TransactionService.java b/src/main/java/moneybuddy/fr/moneybuddy/service/TransactionService.java index 6eba020..0745166 100644 --- a/src/main/java/moneybuddy/fr/moneybuddy/service/TransactionService.java +++ b/src/main/java/moneybuddy/fr/moneybuddy/service/TransactionService.java @@ -20,6 +20,7 @@ public class TransactionService { private final SubAccountService subAccountService; private final TransactionRepository transactionRepository; + private final JwtService jwtService; private final Utils utils; public Page getAllTransactions( @@ -36,11 +37,37 @@ public Page getAllTransactions( return transactions; } - public List getTransactions(String token, String subAccountId, boolean isGoal) { - List transactions = - isGoal - ? transactionRepository.findByChildAndGoal(subAccountId) - : transactionRepository.findAllByChildId(subAccountId); + public Page getTransactions( + String token, + String subAccountIdParams, + boolean isGoal, + int page, + int size, + String sortBy, + String sortDir) { + SubAccountRole subAccountRole = jwtService.extractSubAccountRole(token); + subAccountRole = + subAccountRole.equals(SubAccountRole.OWNER) ? SubAccountRole.PARENT : subAccountRole; + String accountId = jwtService.extractSubAccountAccountId(token); + String subAccountId = jwtService.extractSubAccountId(token); + + Pageable pageable = utils.pagination(page, size, sortBy, sortDir); + Page transactions; + + if (subAccountRole.equals(SubAccountRole.PARENT)) { + transactions = + isGoal + ? transactionRepository.findByAccountIdAndGoal(accountId, pageable) + : subAccountIdParams != null + ? transactionRepository.findAllByAccountIdAndChildId( + accountId, subAccountIdParams, pageable) + : transactionRepository.findAllByAccountId(accountId, pageable); + } else { + transactions = + isGoal + ? transactionRepository.findByChildIdAndGoal(subAccountId, pageable) + : transactionRepository.findAllByChildId(subAccountId, pageable); + } return transactions; } @@ -64,9 +91,7 @@ public Page getAllTransactionsBySubAccountId( } public List getTransactionByGoalId(String goalId) { - - List transactions = transactionRepository.findAllByGoalId(goalId); - return transactions; + return transactionRepository.findAllByGoalId(goalId); } public void createTransaction(Transaction transaction) {