diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/budget/dto/BudgetUpdateRequest.java b/Backend/src/main/java/com/luckyseven/backend/domain/budget/dto/BudgetUpdateRequest.java index e11a51b2..ef475bf9 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/budget/dto/BudgetUpdateRequest.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/budget/dto/BudgetUpdateRequest.java @@ -1,7 +1,9 @@ package com.luckyseven.backend.domain.budget.dto; import com.fasterxml.jackson.annotation.JsonProperty; +import com.luckyseven.backend.domain.budget.entity.CurrencyCode; import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; import java.math.BigDecimal; import lombok.Getter; import lombok.experimental.SuperBuilder; diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/budget/entity/Budget.java b/Backend/src/main/java/com/luckyseven/backend/domain/budget/entity/Budget.java index 14d07fdd..fb028454 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/budget/entity/Budget.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/budget/entity/Budget.java @@ -66,13 +66,7 @@ public Budget(Team team, BigDecimal totalAmount, Long setBy, public void setTotalAmount(BigDecimal totalAmount) { this.totalAmount = totalAmount; - } - - public void addBalance(BudgetUpdateRequest request) { - if (request.additionalBudget() == null) { - return; - } - this.balance = this.balance.add(request.additionalBudget()); + this.balance = totalAmount; } public void setExchangeInfo(boolean isExchanged, BigDecimal amount, BigDecimal exchangeRate) { @@ -115,6 +109,7 @@ private void updateForeignBalance(BigDecimal amount, BigDecimal exchangeRate) { foreignBalance = BigDecimal.ZERO; } this.foreignBalance = this.foreignBalance.add(additionalBudget); + this.avgExchangeRate = exchangeRate; } public void setForeignBalance() { diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/budget/service/BudgetService.java b/Backend/src/main/java/com/luckyseven/backend/domain/budget/service/BudgetService.java index 0dac2243..9a7e19f8 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/budget/service/BudgetService.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/budget/service/BudgetService.java @@ -13,6 +13,7 @@ import com.luckyseven.backend.domain.team.repository.TeamRepository; import jakarta.persistence.EntityNotFoundException; import jakarta.transaction.Transactional; +import java.math.BigDecimal; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -34,6 +35,7 @@ public BudgetCreateResponse save(Long teamId, Long loginMemberId, BudgetCreateRe Budget budget = Budget.builder() .team(team) .totalAmount(request.totalAmount()) + .avgExchangeRate(request.exchangeRate()) .setBy(loginMemberId) .balance(request.totalAmount()) .foreignCurrency(request.foreignCurrency()) @@ -92,8 +94,8 @@ private static void addBudget(BudgetUpdateRequest request, Budget budget) { budget.updateExchangeInfo(request.isExchanged(), request.additionalBudget(), request.exchangeRate()); - budget.setTotalAmount(budget.getTotalAmount().add(request.additionalBudget())); - budget.addBalance(request); + BigDecimal sum = budget.getTotalAmount().add(request.additionalBudget()); + budget.setTotalAmount(sum); } } diff --git a/Frontend/luckeyseven/src/components/OverviewTabContent.js b/Frontend/luckeyseven/src/components/OverviewTabContent.js index 3c7ba331..7ee31153 100644 --- a/Frontend/luckeyseven/src/components/OverviewTabContent.js +++ b/Frontend/luckeyseven/src/components/OverviewTabContent.js @@ -20,10 +20,13 @@ const OverviewTabContent = ({ dashboardData }) => { avgExchangeRate = 0, // 기본값 설정 } = dashboardData; - const totalExpense = totalAmount - balance; + // totalExpense가 0 이하가 될 수 없도록 Math.max 사용 + const totalExpense = Math.max(0, totalAmount - balance); + // 남은 예산은 총 지출 - 지출로 계산하고, 항상 총 지출보다 작거나 같도록 보장 + const remainingBudget = Math.min(totalAmount, Math.max(0, totalAmount - totalExpense)); const totalExpensePercentage = totalAmount > 0 ? (totalExpense / totalAmount) * 100 : 0; - const remainingBudgetPercentage = totalAmount > 0 ? (balance / totalAmount) * 100 : 0; - + const remainingBudgetPercentage = totalAmount > 0 ? (remainingBudget / totalAmount) * 100 : 0; + // 지출 목록이 없는 경우 빈 배열로 처리 const transformedExpenses = Array.isArray(expenseList) ? expenseList.map(expense => ({ id: expense.id, @@ -40,7 +43,7 @@ const OverviewTabContent = ({ dashboardData }) => { return (
총 예산: {SafeFormatterUtil.formatCurrency(budget?.totalAmount)} KRW
원화 잔고: {SafeFormatterUtil.formatCurrency(budget?.balance)} KRW
외화 잔고: {SafeFormatterUtil.formatCurrency(budget?.foreignBalance)} {budget?.foreignCurrency || 'KRW'}
-평균 환율: {budget?.avgExchangeRate || 0}
+평균 환율: {SafeFormatterUtil.formatCurrency(budget?.avgExchangeRate)}