diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptDetailResponse.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptDetailResponse.java index f25ec01..6fb6737 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptDetailResponse.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptDetailResponse.java @@ -16,7 +16,8 @@ public record ReceiptDetailResponse( BigDecimal amount, String etc, String receiptImageUrl, - List receiptItems + List receiptItems, + boolean amountMatched ) { public static ReceiptDetailResponse of(Receipt receipt) { @@ -29,6 +30,7 @@ public static ReceiptDetailResponse of(Receipt receipt) { .etc(receipt.getEtc()) .receiptImageUrl(receipt.getReceiptImageUrl()) .receiptItems(ReceiptItemResponse.of(receipt.getReceiptItems())) + .amountMatched(receipt.isAmountMatched()) .build(); } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptResponse.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptResponse.java index a20e5e3..05f5398 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptResponse.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptResponse.java @@ -14,7 +14,8 @@ public record ReceiptResponse( LocalDate date, BigDecimal amount, String etc, - String receiptImageUrl + String receiptImageUrl, + boolean amountMatched ) { public static ReceiptResponse of(Receipt receipt) { @@ -26,6 +27,7 @@ public static ReceiptResponse of(Receipt receipt) { .amount(receipt.getAmount()) .etc(receipt.getEtc()) .receiptImageUrl(receipt.getReceiptImageUrl()) + .amountMatched(receipt.isAmountMatched()) .build(); } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java index 7f96838..7bcc6dc 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java @@ -10,6 +10,7 @@ import com.ClubAccount_BE.receipt.application.port.out.UpdateReceiptPort; import com.ClubAccount_BE.receipt.domain.Receipt; import com.ClubAccount_BE.receipt.domain.ReceiptItem; +import com.ClubAccount_BE.receipt.mapper.ReceiptItemMapper; import com.ClubAccount_BE.receipt.mapper.ReceiptMapper; import com.ClubAccount_BE.user.domain.User; import java.time.LocalDate; @@ -29,7 +30,9 @@ public class ReceiptRepositoryAdapter @Override public Long createReceipt(Receipt receipt, List receiptItems) { ReceiptEntity receiptEntity = ReceiptMapper.toEntity(receipt); - receiptEntity.replaceReceiptItem(receiptItems); + receiptItems.stream() + .map(ReceiptItemMapper::toEntity) + .forEach(receiptEntity::addReceiptItem); return receiptRepository .save(receiptEntity) .getId(); @@ -74,7 +77,9 @@ public Long updateReceipt( .orElseThrow(() -> new ApiException(RECEIPT_NOT_FOUND)); receiptEntity.updateReceipt(receipt); - receiptEntity.replaceReceiptItem(receiptItems); + receiptItems.stream() + .map(ReceiptItemMapper::toEntity) + .forEach(receiptEntity::addReceiptItem); return receiptEntity.getId(); } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/persistence/entity/ReceiptEntity.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/persistence/entity/ReceiptEntity.java index ce84a89..22674ec 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/persistence/entity/ReceiptEntity.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/persistence/entity/ReceiptEntity.java @@ -2,9 +2,7 @@ import com.ClubAccount_BE.core.entity.TimeBaseEntity; import com.ClubAccount_BE.receipt.domain.Receipt; -import com.ClubAccount_BE.receipt.domain.ReceiptItem; import com.ClubAccount_BE.receipt.domain.type.ReceiptCategory; -import com.ClubAccount_BE.receipt.mapper.ReceiptItemMapper; import com.ClubAccount_BE.user.adapter.out.persistence.entity.UserEntity; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -61,6 +59,9 @@ public class ReceiptEntity extends TimeBaseEntity { private String receiptImageUrl; + @Column(nullable = false) + private boolean amountMatched; + @Builder.Default @OneToMany(mappedBy = "receipt", cascade = CascadeType.ALL, orphanRemoval = true) private List receiptItems = new ArrayList<>(); @@ -71,6 +72,7 @@ public void updateReceipt(Receipt receipt) { this.amount = receipt.getAmount(); this.date = receipt.getDate(); this.etc = receipt.getEtc(); + this.receiptItems.clear(); } public void addReceiptItem(ReceiptItemEntity receiptItem) { @@ -79,11 +81,4 @@ public void addReceiptItem(ReceiptItemEntity receiptItem) { receiptItem.addReceipt(this); } } - - public void replaceReceiptItem(List receiptItems) { - this.receiptItems.clear(); - receiptItems.stream() - .map(ReceiptItemMapper::toEntity) - .forEach(this::addReceiptItem); - } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java b/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java index a28da30..826e905 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java +++ b/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java @@ -8,6 +8,7 @@ import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptPort; import com.ClubAccount_BE.receipt.domain.Receipt; import com.ClubAccount_BE.receipt.domain.ReceiptItem; +import com.ClubAccount_BE.receipt.domain.service.ReceiptEditor; import com.ClubAccount_BE.receipt.domain.service.ReceiptItemEditor; import com.ClubAccount_BE.user.domain.User; import java.util.List; @@ -22,9 +23,8 @@ public class CreateReceiptService implements CreateReceiptUseCase { private final CreateReceiptPort createReceiptPort; - private final UploadReceiptPort uploadReceiptPort; - + private final ReceiptEditor receiptEditor; private final ReceiptItemEditor receiptItemEditor; @Override @@ -33,7 +33,6 @@ public Long createReceipt( MultipartFile image, ReceiptRequest receiptRequest ) { - Receipt receipt = Receipt.create( user, receiptRequest.category(), @@ -43,8 +42,9 @@ public Long createReceipt( receiptRequest.etc(), image == null ? DEFAULT_IMAGE : uploadReceiptPort.uploadReceipt(image) ); - List receiptItems = receiptItemEditor.toReceiptItems(receiptRequest, receipt); + boolean isAmountMatched = receiptEditor.checkAmountMatch(receipt, receiptItems); + receipt.updateAmountMatched(isAmountMatched); return createReceiptPort.createReceipt(receipt, receiptItems); } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/service/UpdateReceiptService.java b/src/main/java/com/ClubAccount_BE/receipt/application/service/UpdateReceiptService.java index 57de395..e0420fe 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/application/service/UpdateReceiptService.java +++ b/src/main/java/com/ClubAccount_BE/receipt/application/service/UpdateReceiptService.java @@ -5,6 +5,7 @@ import com.ClubAccount_BE.receipt.application.port.out.UpdateReceiptPort; import com.ClubAccount_BE.receipt.domain.Receipt; import com.ClubAccount_BE.receipt.domain.ReceiptItem; +import com.ClubAccount_BE.receipt.domain.service.ReceiptEditor; import com.ClubAccount_BE.receipt.domain.service.ReceiptItemEditor; import com.ClubAccount_BE.user.domain.User; import java.util.List; @@ -18,7 +19,7 @@ public class UpdateReceiptService implements UpdateReceiptUseCase { private final UpdateReceiptPort updateReceiptPort; - + private final ReceiptEditor receiptEditor; private final ReceiptItemEditor receiptItemEditor; @Override @@ -38,6 +39,8 @@ public Long updateReceipt( ); List receiptItems = receiptItemEditor.toReceiptItems(receiptRequest, receipt); + boolean isAmountMatched = receiptEditor.checkAmountMatch(receipt, receiptItems); + receipt.updateAmountMatched(isAmountMatched); return updateReceiptPort.updateReceipt(receiptId, receipt, receiptItems); } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/domain/Receipt.java b/src/main/java/com/ClubAccount_BE/receipt/domain/Receipt.java index 5bde06c..cb7bcf0 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/domain/Receipt.java +++ b/src/main/java/com/ClubAccount_BE/receipt/domain/Receipt.java @@ -20,6 +20,7 @@ public class Receipt { private final String etc; private final String receiptImageUrl; private final List receiptItems; + private boolean amountMatched; @Builder private Receipt( @@ -31,7 +32,8 @@ private Receipt( BigDecimal amount, String etc, String receiptImageUrl, - List receiptItems + List receiptItems, + boolean amountMatched ) { this.id = id; this.user = user; @@ -42,6 +44,7 @@ private Receipt( this.etc = etc; this.receiptImageUrl = receiptImageUrl; this.receiptItems = receiptItems; + this.amountMatched = amountMatched; } public static Receipt create( @@ -83,4 +86,8 @@ public static Receipt update( .etc(etc) .build(); } + + public void updateAmountMatched(boolean amountMatched) { + this.amountMatched = amountMatched; + } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java b/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java index c854a98..73f3660 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java +++ b/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java @@ -2,7 +2,9 @@ import com.ClubAccount_BE.receipt.domain.DetailCategoryResult; import com.ClubAccount_BE.receipt.domain.Receipt; +import com.ClubAccount_BE.receipt.domain.ReceiptItem; import com.ClubAccount_BE.receipt.domain.type.ReceiptCategory; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -11,6 +13,17 @@ @Service public class ReceiptEditor { + /** + * 영수증 금액과 영수증 아이템 금액 비교 + */ + public boolean checkAmountMatch(Receipt receipt, List items) { + BigDecimal total = items.stream() + .map(ReceiptItem::getTotalPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + return total.compareTo(receipt.getAmount()) == 0; + } + /** * 영수증 카테고리 비율 계산 */ diff --git a/src/main/java/com/ClubAccount_BE/receipt/mapper/ReceiptMapper.java b/src/main/java/com/ClubAccount_BE/receipt/mapper/ReceiptMapper.java index c524a8a..b23282c 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/mapper/ReceiptMapper.java +++ b/src/main/java/com/ClubAccount_BE/receipt/mapper/ReceiptMapper.java @@ -15,7 +15,9 @@ public static ReceiptEntity toEntity(Receipt receipt) { .amount(receipt.getAmount()) .date(receipt.getDate()) .etc(receipt.getEtc()) - .receiptImageUrl(receipt.getReceiptImageUrl()).build(); + .receiptImageUrl(receipt.getReceiptImageUrl()) + .amountMatched(receipt.isAmountMatched()) + .build(); } public static Receipt toDomain(ReceiptEntity receiptEntity) { @@ -32,6 +34,7 @@ public static Receipt toDomain(ReceiptEntity receiptEntity) { .map(ReceiptItemMapper::toDomain) .toList() ) + .amountMatched(receiptEntity.isAmountMatched()) .build(); } }