From 025bd5a89a882fdf41056afb041ea6489acc42a3 Mon Sep 17 00:00:00 2001 From: pbk2312 Date: Wed, 21 May 2025 14:58:14 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=A7=80=EC=B6=9C=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EC=8B=9C=20=EC=99=B8=ED=99=94=20=EC=A0=84=EA=B3=A0,=20?= =?UTF-8?q?=EC=9B=90=ED=99=94=EC=9E=94=EA=B3=A0=20=EA=BC=AC=EC=9E=84=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/budget/entity/Budget.java | 13 +++- .../expense/service/ExpenseService.java | 60 ++++++++++++------- 2 files changed, 52 insertions(+), 21 deletions(-) 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 8ddfa980..546a8ee3 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 @@ -2,7 +2,6 @@ import static com.luckyseven.backend.sharedkernel.exception.ExceptionCode.INSUFFICIENT_BALANCE; -import com.luckyseven.backend.domain.budget.dto.BudgetUpdateRequest; import com.luckyseven.backend.domain.team.entity.Team; import com.luckyseven.backend.sharedkernel.entity.BaseEntity; import com.luckyseven.backend.sharedkernel.exception.CustomLogicException; @@ -158,6 +157,18 @@ public void creditKrw(BigDecimal krwAmount) { balance = balance.add(krwAmount); } + public void creditForeign(BigDecimal foreignAmount) { + BigDecimal krwAmount = foreignAmount.multiply(avgExchangeRate); + this.balance = this.balance.add(krwAmount); + + if (this.foreignBalance == null) { + this.foreignBalance = BigDecimal.ZERO; + } + + this.foreignBalance = this.foreignBalance.add(foreignAmount); + } + + private void validateSufficientBalance(BigDecimal amount, BigDecimal current) { if (current.compareTo(amount) < 0) { throw new CustomLogicException(INSUFFICIENT_BALANCE); diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/expense/service/ExpenseService.java b/Backend/src/main/java/com/luckyseven/backend/domain/expense/service/ExpenseService.java index c477861c..71914e3b 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/expense/service/ExpenseService.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/expense/service/ExpenseService.java @@ -45,15 +45,9 @@ public class ExpenseService { public CreateExpenseResponse saveExpense(Long teamId, ExpenseRequest request) { Team team = findTeamOrThrow(teamId); Member payer = memberService.findMemberOrThrow(request.payerId()); - Budget budget = team.getBudget(); + Budget budget = getBudgetFromTeam(team); - if (request.paymentMethod() == PaymentMethod.CASH) { - // 외화 결제: 외화 및 원화 잔액 차감 - budget.debitForeign(request.amount()); - } else { - // 카드 결제: 원화 잔액 차감 - budget.debitKrw(request.amount()); - } + calculateAndBudgetUpdate(request.paymentMethod(), budget, request.amount()); Expense expense = ExpenseMapper.fromExpenseRequest(request, team, payer); Expense saved = expenseRepository.save(expense); @@ -84,14 +78,10 @@ public CreateExpenseResponse updateExpense(Long expenseId, ExpenseUpdateRequest BigDecimal newAmount = request.amount(); BigDecimal delta = newAmount.subtract(originalAmount); - Budget budget = expense.getTeam().getBudget(); - if (delta.compareTo(BigDecimal.ZERO) > 0) { - // 금액 증가 시 원화 잔액 차감 - budget.debitKrw(delta); - } else if (delta.compareTo(BigDecimal.ZERO) < 0) { - // 금액 감소 시 줄어든 만큼 원화 환불 - budget.creditKrw(delta.abs()); - } + Budget budget = getBudgetFromTeam(expense.getTeam()); + PaymentMethod method = expense.getPaymentMethod(); + + updateBudget(delta, method, budget); expense.update(request.description(), newAmount, request.category()); evictRecentExpensesForTeam(expense.getTeam().getId()); @@ -102,16 +92,47 @@ public CreateExpenseResponse updateExpense(Long expenseId, ExpenseUpdateRequest public ExpenseBalanceResponse deleteExpense(Long expenseId) { Expense expense = findExpenseOrThrow(expenseId); Long teamId = expense.getTeam().getId(); - Budget budget = expense.getTeam().getBudget(); + Budget budget = getBudgetFromTeam(expense.getTeam()); + + PaymentMethod method = expense.getPaymentMethod(); + + budgetcredit(method, budget, expense.getAmount()); - // 지출 삭제 시 원화 환불 - budget.creditKrw(expense.getAmount()); expenseRepository.delete(expense); evictRecentExpensesForTeam(teamId); return ExpenseMapper.toExpenseBalanceResponse(budget); } + private static void budgetcredit(PaymentMethod method, Budget budget, BigDecimal amount) { + if (method == PaymentMethod.CASH) { + budget.creditForeign(amount); + } else { + budget.creditKrw(amount); + } + } + + private static void calculateAndBudgetUpdate(PaymentMethod request, Budget budget, + BigDecimal amount) { + if (request == PaymentMethod.CASH) { + budget.debitForeign(amount); + } else { + budget.debitKrw(amount); + } + } + + private static void updateBudget(BigDecimal delta, PaymentMethod method, Budget budget) { + if (delta.compareTo(BigDecimal.ZERO) > 0) { + calculateAndBudgetUpdate(method, budget, delta); + } else if (delta.compareTo(BigDecimal.ZERO) < 0) { + budgetcredit(method, budget, delta.abs()); + } + } + + private Budget getBudgetFromTeam(Team team) { + return team.getBudget(); + } + private void evictRecentExpensesForTeam(Long teamId) { cacheEvictService.evictByPrefix("recentExpenses", "team:" + teamId + ":"); } @@ -136,5 +157,4 @@ private Team findTeamOrThrow(Long teamId) { return teamRepository.findTeamWithBudget(teamId) .orElseThrow(() -> new CustomLogicException(TEAM_NOT_FOUND)); } - }