From 7c8931cc0ad3b9c44a36094316fdb644f23a8588 Mon Sep 17 00:00:00 2001 From: Jetulio Date: Fri, 7 Nov 2025 17:10:08 -0300 Subject: [PATCH] feat: adicionado endpoint para despesas mensais --- .../DTO/UserMonthlyExpensesDTO.java | 7 ++++ .../controller/UserController.java | 7 ++++ .../repository/ExpenseRepository.java | 34 +++++++++++++++++++ .../com/finboostplus/service/UserService.java | 9 ++++- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserMonthlyExpensesDTO.java diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserMonthlyExpensesDTO.java b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserMonthlyExpensesDTO.java new file mode 100644 index 0000000..44208ad --- /dev/null +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserMonthlyExpensesDTO.java @@ -0,0 +1,7 @@ +package com.finboostplus.DTO; + +import java.math.BigDecimal; + +public record UserMonthlyExpensesDTO(String month, + BigDecimal total) { +} diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/controller/UserController.java b/backend/finboostplus_server/src/main/java/com/finboostplus/controller/UserController.java index 34e5450..1e1f86e 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/controller/UserController.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/controller/UserController.java @@ -27,6 +27,7 @@ import com.finboostplus.DTO.UserCreateDTO; import com.finboostplus.DTO.UserDataDTO; import com.finboostplus.DTO.UserExpensesDTO; +import com.finboostplus.DTO.UserMonthlyExpensesDTO; import com.finboostplus.DTO.UserUpdateDTO; import com.finboostplus.config.TokenRevocationUtil; import com.finboostplus.service.ExpenseService; @@ -107,6 +108,12 @@ public ResponseEntity> getAllUserExpenses( return ResponseEntity.ok(expenses); } + @GetMapping("/me/monthly-expenses") + public ResponseEntity> getUserMonthlyExpenses() { + List expenses = userService.getUserMonthlyExpenses(); + return ResponseEntity.ok(expenses); + } + @GetMapping("/me/classify-spending-by-category") public ResponseEntity> getCategoryRegister() { List category = expenseService.getCategoryRegister(); diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java b/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java index 48d3d2c..a3d91c3 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java @@ -14,6 +14,7 @@ import com.finboostplus.DTO.CategoryRegisterDTO; import com.finboostplus.DTO.UserExpensesDTO; +import com.finboostplus.DTO.UserMonthlyExpensesDTO; import com.finboostplus.model.Expense; import com.finboostplus.projection.GroupAuthorityExpenseProjection; import com.finboostplus.projection.GroupMemberExpenseProjection; @@ -43,6 +44,39 @@ public interface ExpenseRepository extends JpaRepository { """) Page getAllUserExpenses(Long userId, Pageable pageable); + @Query(nativeQuery = true, value = """ + WITH + MESES AS ( + SELECT + GENERATE_SERIES(1, 12) AS MES_NUM + ) + SELECT + TO_CHAR(TO_DATE(M.MES_NUM::TEXT, 'MM'), 'FMMonth') AS MONTH, + COALESCE(SUM(UED.PARTIAL_VALUE), 0) AS TOTAL + FROM + MESES M + LEFT JOIN EXPENSES E ON EXTRACT( + MONTH + FROM + E.DEADLINE_DATE + ) = M.MES_NUM + AND EXTRACT( + YEAR + FROM + E.DEADLINE_DATE + ) = EXTRACT( + YEAR + FROM + CURRENT_DATE + ) + LEFT JOIN USER_EXPENSE_DIVISIONS UED ON E.ID = UED.EXPENSE_ID + AND UED.USER_ID = 1 + GROUP BY + M.MES_NUM + ORDER BY + M.MES_NUM + """) + List getUserMonthlyExpenses(Long userId); // @Query(nativeQuery = true, value = """ // SELECT expenses.id, expenses.title, expenses.description, // categories.name as categoryName, diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/service/UserService.java b/backend/finboostplus_server/src/main/java/com/finboostplus/service/UserService.java index 9eeca6c..900d191 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/service/UserService.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/service/UserService.java @@ -27,6 +27,7 @@ import com.finboostplus.DTO.UserCreateDTO; import com.finboostplus.DTO.UserDataDTO; import com.finboostplus.DTO.UserExpensesDTO; +import com.finboostplus.DTO.UserMonthlyExpensesDTO; import com.finboostplus.DTO.UserUpdateDTO; import com.finboostplus.exception.ForbiddenResourceException; import com.finboostplus.exception.GroupNotFoundException; @@ -106,6 +107,12 @@ public Page getAllUserExpenses(Pageable pageable) { return expenseRepository.getAllUserExpenses(user.getId(), pageable); } + public List getUserMonthlyExpenses() { + User user = userRepository.findByEmailIgnoreCase(authenticated()) + .orElseThrow(() -> new UsernameNotFoundException("Usuário não encontrado")); + return expenseRepository.getUserMonthlyExpenses(user.getId()); + } + @Transactional public boolean saveUser(UserCreateDTO dto) { Optional userOptional = userRepository.findByEmailIgnoreCase(dto.email()); @@ -259,7 +266,7 @@ public boolean switchAuthority(Long newOwnerId, Long groupId, SwitchAuthorityReq return true; } if (!groupMemberRepository.doesUserHasAnyAuthority(user.getId(), - group.getId(), List.of("OWNER" ,"ADMIN"))) + group.getId(), List.of("OWNER", "ADMIN"))) throw new ForbiddenResourceException("Acesso negado"); newUserAuth.setAuthorization(setAuthority); groupMemberRepository.save(newUserAuth);