diff --git a/server/src/main/java/server/haengdong/application/BillActionDetailService.java b/server/src/main/java/server/haengdong/application/BillActionDetailService.java index aadddc00e..55d39aac0 100644 --- a/server/src/main/java/server/haengdong/application/BillActionDetailService.java +++ b/server/src/main/java/server/haengdong/application/BillActionDetailService.java @@ -9,7 +9,6 @@ import server.haengdong.application.response.BillActionDetailsAppResponse; import server.haengdong.domain.action.BillAction; import server.haengdong.domain.action.BillActionDetail; -import server.haengdong.domain.action.BillActionDetailRepository; import server.haengdong.domain.action.BillActionRepository; import server.haengdong.domain.event.Event; import server.haengdong.exception.HaengdongErrorCode; @@ -20,7 +19,6 @@ @Service public class BillActionDetailService { - private final BillActionDetailRepository billActionDetailRepository; private final BillActionRepository billActionRepository; public BillActionDetailsAppResponse findBillActionDetails(String token, Long actionId) { @@ -28,8 +26,7 @@ public BillActionDetailsAppResponse findBillActionDetails(String token, Long act .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.BILL_ACTION_NOT_FOUND)); validateToken(token, billAction); - List billActionDetails = billActionDetailRepository.findAllByBillAction(billAction); - + List billActionDetails = billAction.getBillActionDetails(); return BillActionDetailsAppResponse.of(billActionDetails); } @@ -43,7 +40,7 @@ public void updateBillActionDetails(String token, Long actionId, BillActionDetai validateToken(token, billAction); validateTotalPrice(billActionDetailUpdateAppRequests, billAction); - List billActionDetails = billActionDetailRepository.findAllByBillAction(billAction); + List billActionDetails = billAction.getBillActionDetails(); for (BillActionDetailUpdateAppRequest updateRequest : billActionDetailUpdateAppRequests) { BillActionDetail detailToUpdate = billActionDetails.stream() diff --git a/server/src/main/java/server/haengdong/application/BillActionService.java b/server/src/main/java/server/haengdong/application/BillActionService.java index 55a14d4d0..dae36a2e7 100644 --- a/server/src/main/java/server/haengdong/application/BillActionService.java +++ b/server/src/main/java/server/haengdong/application/BillActionService.java @@ -9,8 +9,6 @@ import server.haengdong.domain.action.Action; import server.haengdong.domain.action.ActionRepository; import server.haengdong.domain.action.BillAction; -import server.haengdong.domain.action.BillActionDetail; -import server.haengdong.domain.action.BillActionDetailRepository; import server.haengdong.domain.action.BillActionRepository; import server.haengdong.domain.action.CurrentMembers; import server.haengdong.domain.action.MemberAction; @@ -26,7 +24,6 @@ public class BillActionService { private final BillActionRepository billActionRepository; - private final BillActionDetailRepository billActionDetailRepository; private final MemberActionRepository memberActionRepository; private final ActionRepository actionRepository; private final EventRepository eventRepository; @@ -39,12 +36,9 @@ public void saveAllBillAction(String eventToken, List requ CurrentMembers currentMembers = CurrentMembers.of(findMemberActions); for (BillActionAppRequest request : requests) { - BillAction billAction = request.toBillAction(action); + BillAction billAction = request.toBillAction(action, currentMembers); billActionRepository.save(billAction); action = action.next(); - if (currentMembers.isNotEmpty()) { - saveBillActionDetails(billAction, currentMembers); - } } } @@ -54,13 +48,6 @@ private Action createStartAction(Event event) { .orElse(Action.createFirst(event)); } - private void saveBillActionDetails(BillAction billAction, CurrentMembers currentMembers) { - long pricePerMember = billAction.getPrice() / currentMembers.size(); - currentMembers.getMembers().stream() - .map(memberName -> new BillActionDetail(billAction, memberName, pricePerMember, false)) - .forEach(billActionDetailRepository::save); - } - @Transactional public void updateBillAction(String token, Long actionId, BillActionUpdateAppRequest request) { BillAction billAction = billActionRepository.findByAction_Id(actionId) @@ -68,26 +55,9 @@ public void updateBillAction(String token, Long actionId, BillActionUpdateAppReq validateToken(token, billAction); - resetBillActionDetail(billAction, request.price()); - billAction.update(request.title(), request.price()); } - private void resetBillActionDetail(BillAction billAction, Long updatePrice) { - if (!billAction.getPrice().equals(updatePrice)) { - List billActionDetails = billActionDetailRepository.findAllByBillAction(billAction); - int memberCount = billActionDetails.size(); - if (memberCount != 0) { - Long eachPrice = updatePrice / memberCount; - billActionDetails.forEach(billActionDetail -> { - billActionDetail.updatePrice(eachPrice); - billActionDetail.updateIsFixed(false); - } - ); - } - } - } - private void validateToken(String token, BillAction billAction) { Event event = billAction.getEvent(); if (event.isTokenMismatch(token)) { @@ -95,17 +65,16 @@ private void validateToken(String token, BillAction billAction) { } } - private Event getEvent(String eventToken) { - return eventRepository.findByToken(eventToken) - .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.EVENT_NOT_FOUND)); - } - @Transactional public void deleteBillAction(String token, Long actionId) { Event event = eventRepository.findByToken(token) .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.EVENT_NOT_FOUND)); - billActionDetailRepository.deleteByBillAction_Action_EventAndBillAction_ActionId(event, actionId); billActionRepository.deleteByAction_EventAndActionId(event, actionId); } + + private Event getEvent(String eventToken) { + return eventRepository.findByToken(eventToken) + .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.EVENT_NOT_FOUND)); + } } diff --git a/server/src/main/java/server/haengdong/application/MemberActionService.java b/server/src/main/java/server/haengdong/application/MemberActionService.java index b5215688a..245de8cef 100644 --- a/server/src/main/java/server/haengdong/application/MemberActionService.java +++ b/server/src/main/java/server/haengdong/application/MemberActionService.java @@ -1,8 +1,6 @@ package server.haengdong.application; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,8 +9,6 @@ import server.haengdong.domain.action.Action; import server.haengdong.domain.action.ActionRepository; import server.haengdong.domain.action.BillAction; -import server.haengdong.domain.action.BillActionDetail; -import server.haengdong.domain.action.BillActionDetailRepository; import server.haengdong.domain.action.BillActionRepository; import server.haengdong.domain.action.CurrentMembers; import server.haengdong.domain.action.MemberAction; @@ -31,7 +27,6 @@ public class MemberActionService { private final MemberActionRepository memberActionRepository; private final EventRepository eventRepository; private final ActionRepository actionRepository; - private final BillActionDetailRepository billActionDetailRepository; private final BillActionRepository billActionRepository; @Transactional @@ -100,37 +95,6 @@ private void resetBillAction(Event event, BillAction billAction) { billAction.getSequence()); CurrentMembers currentMembers = CurrentMembers.of(memberActions); - billActionDetailRepository.deleteAllByBillAction(billAction); - - if (currentMembers.isNotEmpty()) { - Long price = billAction.getPrice(); - int currentMemberCount = currentMembers.size(); - long eachPrice = price / currentMemberCount; - long remainder = price % currentMemberCount; - List billActionDetails = getBillActionDetails( - billAction, - currentMembers, - eachPrice, - remainder - ); - billActionDetailRepository.saveAll(billActionDetails); - } - } - - private List getBillActionDetails( - BillAction billAction, - CurrentMembers currentMembers, - long eachPrice, - long remainder - ) { - List members = currentMembers.getMembers().stream().toList(); - List billActionDetails = IntStream.range(0, members.size() - 1) - .mapToObj(index -> new BillActionDetail(billAction, members.get(index), eachPrice, false)) - .collect(Collectors.toList()); - BillActionDetail lastBillActionDetail = new BillActionDetail(billAction, members.get(members.size() - 1), - eachPrice + remainder, false); - billActionDetails.add(lastBillActionDetail); - - return billActionDetails; + billAction.resetBillActionDetails(currentMembers); } } diff --git a/server/src/main/java/server/haengdong/application/request/BillActionAppRequest.java b/server/src/main/java/server/haengdong/application/request/BillActionAppRequest.java index acd0149f9..21eb17d4a 100644 --- a/server/src/main/java/server/haengdong/application/request/BillActionAppRequest.java +++ b/server/src/main/java/server/haengdong/application/request/BillActionAppRequest.java @@ -2,13 +2,14 @@ import server.haengdong.domain.action.Action; import server.haengdong.domain.action.BillAction; +import server.haengdong.domain.action.CurrentMembers; public record BillActionAppRequest( String title, Long price ) { - public BillAction toBillAction(Action action) { - return new BillAction(action, title, price); + public BillAction toBillAction(Action action, CurrentMembers currentMembers) { + return BillAction.create(action, title, price, currentMembers); } } diff --git a/server/src/main/java/server/haengdong/domain/action/BillAction.java b/server/src/main/java/server/haengdong/domain/action/BillAction.java index 0b35040e6..943b40ce5 100644 --- a/server/src/main/java/server/haengdong/domain/action/BillAction.java +++ b/server/src/main/java/server/haengdong/domain/action/BillAction.java @@ -10,7 +10,10 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -45,13 +48,8 @@ public class BillAction implements Comparable { private List billActionDetails = new ArrayList<>(); public BillAction(Action action, String title, Long price) { - this(null, action, title, price); - } - - private BillAction(Long id, Action action, String title, Long price) { validateTitle(title); validatePrice(price); - this.id = id; this.action = action; this.title = title.trim(); this.price = price; @@ -70,23 +68,69 @@ private void validatePrice(Long price) { } } + public static BillAction create(Action action, String title, Long price, CurrentMembers currentMembers) { + BillAction billAction = new BillAction(action, title, price); + billAction.resetBillActionDetails(currentMembers); + return billAction; + } + + public void resetBillActionDetails(CurrentMembers currentMembers) { + this.billActionDetails.clear(); + Iterator priceIterator = distributePrice(currentMembers.size()).iterator(); + + for (String member : currentMembers.getMembers()) { + BillActionDetail billActionDetail = new BillActionDetail(this, member, priceIterator.next(), false); + this.billActionDetails.add(billActionDetail); + } + } + + private void resetBillActionDetails() { + Iterator priceIterator = distributePrice(billActionDetails.size()).iterator(); + + billActionDetails.forEach(billActionDetail -> { + billActionDetail.updatePrice(priceIterator.next()); + billActionDetail.updateIsFixed(false); + }); + } + + private List distributePrice(int memberCount) { + if (memberCount == 0) { + return new ArrayList<>(); + } + long eachPrice = price / memberCount; + long remainder = price % memberCount; + + List results = Stream.generate(() -> eachPrice) + .limit(memberCount - 1) + .collect(Collectors.toList()); + results.add(eachPrice + remainder); + return results; + } + public void update(String title, Long price) { validateTitle(title); validatePrice(price); - this.title = title; + this.title = title.trim(); this.price = price; + resetBillActionDetails(); } - public boolean isSamePrice(Long price) { - return this.price.equals(price); + public void addDetails(List billActionDetails) { + billActionDetails.forEach(this::addDetail); } - public Long getSequence() { - return action.getSequence(); + private void addDetail(BillActionDetail billActionDetail) { + this.billActionDetails.add(billActionDetail); + billActionDetail.setBillAction(this); } - public Event getEvent() { - return action.getEvent(); + public boolean isFixed() { + return billActionDetails.stream() + .anyMatch(BillActionDetail::isFixed); + } + + public boolean isSamePrice(Long price) { + return this.price.equals(price); } public Long findPriceByMemberName(String memberName) { @@ -97,20 +141,12 @@ public Long findPriceByMemberName(String memberName) { .orElse(DEFAULT_PRICE); } - public boolean isFixed() { - return billActionDetails.stream() - .map(BillActionDetail::getPrice) - .distinct() - .count() != 1L; - } - - public void addDetails(List billActionDetails) { - billActionDetails.forEach(this::addDetail); + public Long getSequence() { + return action.getSequence(); } - private void addDetail(BillActionDetail billActionDetail) { - this.billActionDetails.add(billActionDetail); - billActionDetail.setBillAction(this); + public Event getEvent() { + return action.getEvent(); } @Override diff --git a/server/src/main/java/server/haengdong/domain/action/BillActionDetailRepository.java b/server/src/main/java/server/haengdong/domain/action/BillActionDetailRepository.java index 35b331bee..d1d7cfe0f 100644 --- a/server/src/main/java/server/haengdong/domain/action/BillActionDetailRepository.java +++ b/server/src/main/java/server/haengdong/domain/action/BillActionDetailRepository.java @@ -4,7 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import server.haengdong.domain.event.Event; @Repository public interface BillActionDetailRepository extends JpaRepository { @@ -15,8 +14,4 @@ public interface BillActionDetailRepository extends JpaRepository findAllByBillAction(BillAction billAction); - - void deleteAllByBillAction(BillAction billAction); - - void deleteByBillAction_Action_EventAndBillAction_ActionId(Event event, Long actionId); }