Skip to content

Commit 865374d

Browse files
authored
[TB-27] 영수증 금액 검증에 따른 API 수정 (#32)
1 parent 531822e commit 865374d

File tree

9 files changed

+50
-20
lines changed

9 files changed

+50
-20
lines changed

src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptDetailResponse.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public record ReceiptDetailResponse(
1616
BigDecimal amount,
1717
String etc,
1818
String receiptImageUrl,
19-
List<ReceiptItemResponse> receiptItems
19+
List<ReceiptItemResponse> receiptItems,
20+
boolean amountMatched
2021
) {
2122

2223
public static ReceiptDetailResponse of(Receipt receipt) {
@@ -29,6 +30,7 @@ public static ReceiptDetailResponse of(Receipt receipt) {
2930
.etc(receipt.getEtc())
3031
.receiptImageUrl(receipt.getReceiptImageUrl())
3132
.receiptItems(ReceiptItemResponse.of(receipt.getReceiptItems()))
33+
.amountMatched(receipt.isAmountMatched())
3234
.build();
3335
}
3436
}

src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/dto/response/ReceiptResponse.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ public record ReceiptResponse(
1414
LocalDate date,
1515
BigDecimal amount,
1616
String etc,
17-
String receiptImageUrl
17+
String receiptImageUrl,
18+
boolean amountMatched
1819
) {
1920

2021
public static ReceiptResponse of(Receipt receipt) {
@@ -26,6 +27,7 @@ public static ReceiptResponse of(Receipt receipt) {
2627
.amount(receipt.getAmount())
2728
.etc(receipt.getEtc())
2829
.receiptImageUrl(receipt.getReceiptImageUrl())
30+
.amountMatched(receipt.isAmountMatched())
2931
.build();
3032
}
3133
}

src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.ClubAccount_BE.receipt.application.port.out.UpdateReceiptPort;
1111
import com.ClubAccount_BE.receipt.domain.Receipt;
1212
import com.ClubAccount_BE.receipt.domain.ReceiptItem;
13+
import com.ClubAccount_BE.receipt.mapper.ReceiptItemMapper;
1314
import com.ClubAccount_BE.receipt.mapper.ReceiptMapper;
1415
import com.ClubAccount_BE.user.domain.User;
1516
import java.time.LocalDate;
@@ -29,7 +30,9 @@ public class ReceiptRepositoryAdapter
2930
@Override
3031
public Long createReceipt(Receipt receipt, List<ReceiptItem> receiptItems) {
3132
ReceiptEntity receiptEntity = ReceiptMapper.toEntity(receipt);
32-
receiptEntity.replaceReceiptItem(receiptItems);
33+
receiptItems.stream()
34+
.map(ReceiptItemMapper::toEntity)
35+
.forEach(receiptEntity::addReceiptItem);
3336
return receiptRepository
3437
.save(receiptEntity)
3538
.getId();
@@ -74,7 +77,9 @@ public Long updateReceipt(
7477
.orElseThrow(() -> new ApiException(RECEIPT_NOT_FOUND));
7578

7679
receiptEntity.updateReceipt(receipt);
77-
receiptEntity.replaceReceiptItem(receiptItems);
80+
receiptItems.stream()
81+
.map(ReceiptItemMapper::toEntity)
82+
.forEach(receiptEntity::addReceiptItem);
7883
return receiptEntity.getId();
7984
}
8085
}

src/main/java/com/ClubAccount_BE/receipt/adapter/out/persistence/entity/ReceiptEntity.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
import com.ClubAccount_BE.core.entity.TimeBaseEntity;
44
import com.ClubAccount_BE.receipt.domain.Receipt;
5-
import com.ClubAccount_BE.receipt.domain.ReceiptItem;
65
import com.ClubAccount_BE.receipt.domain.type.ReceiptCategory;
7-
import com.ClubAccount_BE.receipt.mapper.ReceiptItemMapper;
86
import com.ClubAccount_BE.user.adapter.out.persistence.entity.UserEntity;
97
import jakarta.persistence.CascadeType;
108
import jakarta.persistence.Column;
@@ -61,6 +59,9 @@ public class ReceiptEntity extends TimeBaseEntity {
6159

6260
private String receiptImageUrl;
6361

62+
@Column(nullable = false)
63+
private boolean amountMatched;
64+
6465
@Builder.Default
6566
@OneToMany(mappedBy = "receipt", cascade = CascadeType.ALL, orphanRemoval = true)
6667
private List<ReceiptItemEntity> receiptItems = new ArrayList<>();
@@ -71,6 +72,7 @@ public void updateReceipt(Receipt receipt) {
7172
this.amount = receipt.getAmount();
7273
this.date = receipt.getDate();
7374
this.etc = receipt.getEtc();
75+
this.receiptItems.clear();
7476
}
7577

7678
public void addReceiptItem(ReceiptItemEntity receiptItem) {
@@ -79,11 +81,4 @@ public void addReceiptItem(ReceiptItemEntity receiptItem) {
7981
receiptItem.addReceipt(this);
8082
}
8183
}
82-
83-
public void replaceReceiptItem(List<ReceiptItem> receiptItems) {
84-
this.receiptItems.clear();
85-
receiptItems.stream()
86-
.map(ReceiptItemMapper::toEntity)
87-
.forEach(this::addReceiptItem);
88-
}
8984
}

src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptPort;
99
import com.ClubAccount_BE.receipt.domain.Receipt;
1010
import com.ClubAccount_BE.receipt.domain.ReceiptItem;
11+
import com.ClubAccount_BE.receipt.domain.service.ReceiptEditor;
1112
import com.ClubAccount_BE.receipt.domain.service.ReceiptItemEditor;
1213
import com.ClubAccount_BE.user.domain.User;
1314
import java.util.List;
@@ -22,9 +23,8 @@
2223
public class CreateReceiptService implements CreateReceiptUseCase {
2324

2425
private final CreateReceiptPort createReceiptPort;
25-
2626
private final UploadReceiptPort uploadReceiptPort;
27-
27+
private final ReceiptEditor receiptEditor;
2828
private final ReceiptItemEditor receiptItemEditor;
2929

3030
@Override
@@ -33,7 +33,6 @@ public Long createReceipt(
3333
MultipartFile image,
3434
ReceiptRequest receiptRequest
3535
) {
36-
3736
Receipt receipt = Receipt.create(
3837
user,
3938
receiptRequest.category(),
@@ -43,8 +42,9 @@ public Long createReceipt(
4342
receiptRequest.etc(),
4443
image == null ? DEFAULT_IMAGE : uploadReceiptPort.uploadReceipt(image)
4544
);
46-
4745
List<ReceiptItem> receiptItems = receiptItemEditor.toReceiptItems(receiptRequest, receipt);
46+
boolean isAmountMatched = receiptEditor.checkAmountMatch(receipt, receiptItems);
47+
receipt.updateAmountMatched(isAmountMatched);
4848
return createReceiptPort.createReceipt(receipt, receiptItems);
4949
}
5050
}

src/main/java/com/ClubAccount_BE/receipt/application/service/UpdateReceiptService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.ClubAccount_BE.receipt.application.port.out.UpdateReceiptPort;
66
import com.ClubAccount_BE.receipt.domain.Receipt;
77
import com.ClubAccount_BE.receipt.domain.ReceiptItem;
8+
import com.ClubAccount_BE.receipt.domain.service.ReceiptEditor;
89
import com.ClubAccount_BE.receipt.domain.service.ReceiptItemEditor;
910
import com.ClubAccount_BE.user.domain.User;
1011
import java.util.List;
@@ -18,7 +19,7 @@
1819
public class UpdateReceiptService implements UpdateReceiptUseCase {
1920

2021
private final UpdateReceiptPort updateReceiptPort;
21-
22+
private final ReceiptEditor receiptEditor;
2223
private final ReceiptItemEditor receiptItemEditor;
2324

2425
@Override
@@ -38,6 +39,8 @@ public Long updateReceipt(
3839
);
3940

4041
List<ReceiptItem> receiptItems = receiptItemEditor.toReceiptItems(receiptRequest, receipt);
42+
boolean isAmountMatched = receiptEditor.checkAmountMatch(receipt, receiptItems);
43+
receipt.updateAmountMatched(isAmountMatched);
4144
return updateReceiptPort.updateReceipt(receiptId, receipt, receiptItems);
4245
}
4346
}

src/main/java/com/ClubAccount_BE/receipt/domain/Receipt.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class Receipt {
2020
private final String etc;
2121
private final String receiptImageUrl;
2222
private final List<ReceiptItem> receiptItems;
23+
private boolean amountMatched;
2324

2425
@Builder
2526
private Receipt(
@@ -31,7 +32,8 @@ private Receipt(
3132
BigDecimal amount,
3233
String etc,
3334
String receiptImageUrl,
34-
List<ReceiptItem> receiptItems
35+
List<ReceiptItem> receiptItems,
36+
boolean amountMatched
3537
) {
3638
this.id = id;
3739
this.user = user;
@@ -42,6 +44,7 @@ private Receipt(
4244
this.etc = etc;
4345
this.receiptImageUrl = receiptImageUrl;
4446
this.receiptItems = receiptItems;
47+
this.amountMatched = amountMatched;
4548
}
4649

4750
public static Receipt create(
@@ -83,4 +86,8 @@ public static Receipt update(
8386
.etc(etc)
8487
.build();
8588
}
89+
90+
public void updateAmountMatched(boolean amountMatched) {
91+
this.amountMatched = amountMatched;
92+
}
8693
}

src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import com.ClubAccount_BE.receipt.domain.DetailCategoryResult;
44
import com.ClubAccount_BE.receipt.domain.Receipt;
5+
import com.ClubAccount_BE.receipt.domain.ReceiptItem;
56
import com.ClubAccount_BE.receipt.domain.type.ReceiptCategory;
7+
import java.math.BigDecimal;
68
import java.util.List;
79
import java.util.Map;
810
import java.util.stream.Collectors;
@@ -11,6 +13,17 @@
1113
@Service
1214
public class ReceiptEditor {
1315

16+
/**
17+
* 영수증 금액과 영수증 아이템 금액 비교
18+
*/
19+
public boolean checkAmountMatch(Receipt receipt, List<ReceiptItem> items) {
20+
BigDecimal total = items.stream()
21+
.map(ReceiptItem::getTotalPrice)
22+
.reduce(BigDecimal.ZERO, BigDecimal::add);
23+
24+
return total.compareTo(receipt.getAmount()) == 0;
25+
}
26+
1427
/**
1528
* 영수증 카테고리 비율 계산
1629
*/

src/main/java/com/ClubAccount_BE/receipt/mapper/ReceiptMapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ public static ReceiptEntity toEntity(Receipt receipt) {
1515
.amount(receipt.getAmount())
1616
.date(receipt.getDate())
1717
.etc(receipt.getEtc())
18-
.receiptImageUrl(receipt.getReceiptImageUrl()).build();
18+
.receiptImageUrl(receipt.getReceiptImageUrl())
19+
.amountMatched(receipt.isAmountMatched())
20+
.build();
1921
}
2022

2123
public static Receipt toDomain(ReceiptEntity receiptEntity) {
@@ -32,6 +34,7 @@ public static Receipt toDomain(ReceiptEntity receiptEntity) {
3234
.map(ReceiptItemMapper::toDomain)
3335
.toList()
3436
)
37+
.amountMatched(receiptEntity.isAmountMatched())
3538
.build();
3639
}
3740
}

0 commit comments

Comments
 (0)