Skip to content

Commit a86e52c

Browse files
authored
[TB-23] 영수증 카테고리 비율 조회 API 구현 (#27)
1 parent 6e8ad40 commit a86e52c

File tree

16 files changed

+175
-43
lines changed

16 files changed

+175
-43
lines changed

src/main/java/com/ClubAccount_BE/core/config/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
4949
API_V1_PREFIX + "/auth/reset-password",
5050
API_V1_PREFIX + "/{link}/receipts",
5151
API_V1_PREFIX + "/{link}/receipts/{receiptId}",
52+
API_V1_PREFIX + "/{link}/receipts/category",
5253
"/api-docs",
5354
"/swagger-custom-ui.html",
5455
"/v3/api-docs",

src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/CreateReceiptController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.ClubAccount_BE.core.meta.LoginUser;
44
import com.ClubAccount_BE.receipt.adapter.in.web.api.CreateReceiptApi;
55
import com.ClubAccount_BE.receipt.adapter.in.web.dto.request.ReceiptRequest;
6-
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptCreateResponse;
76
import com.ClubAccount_BE.receipt.application.port.in.CreateReceiptUseCase;
87
import com.ClubAccount_BE.user.domain.User;
98
import jakarta.validation.Valid;
@@ -22,7 +21,7 @@ public class CreateReceiptController implements CreateReceiptApi {
2221
private final CreateReceiptUseCase createReceiptUseCase;
2322

2423
@PostMapping("/create")
25-
public ReceiptCreateResponse createReceipt(
24+
public Long createReceipt(
2625
@LoginUser User user,
2726
@RequestPart(value = "image", required = false) MultipartFile image,
2827
@Valid @RequestPart(value = "request") ReceiptRequest receiptRequest

src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/FindReceiptController.java

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

33
import com.ClubAccount_BE.core.response.PagingResponse;
44
import com.ClubAccount_BE.receipt.adapter.in.web.api.FindReceiptApi;
5+
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptCategoryResponse;
56
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptDetailResponse;
67
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptResponse;
78
import com.ClubAccount_BE.receipt.application.port.in.FindReceiptUseCase;
@@ -37,4 +38,11 @@ public ReceiptDetailResponse getReceipt(
3738
) {
3839
return findReceiptUseCase.getReceipt(link, receiptId);
3940
}
41+
42+
@GetMapping("/{link}/receipts/category")
43+
public ReceiptCategoryResponse getReceiptCategoryRatio(
44+
@PathVariable(value = "link") UUID link
45+
) {
46+
return findReceiptUseCase.getReceiptCategoryRatio(link);
47+
}
4048
}

src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/CreateReceiptApi.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.ClubAccount_BE.core.meta.LoginUser;
44
import com.ClubAccount_BE.receipt.adapter.in.web.dto.request.ReceiptRequest;
5-
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptCreateResponse;
65
import com.ClubAccount_BE.user.domain.User;
76
import io.swagger.v3.oas.annotations.Operation;
87
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -14,7 +13,7 @@
1413
public interface CreateReceiptApi {
1514

1615
@Operation(summary = "영수증 등록", description = "파싱된 영수증 정보를 등록한다.")
17-
ReceiptCreateResponse createReceipt(
16+
Long createReceipt(
1817
@LoginUser User user,
1918
@RequestPart(value = "image", required = false) MultipartFile image,
2019
@Valid @RequestPart(value = "request") ReceiptRequest receiptRequest

src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/FindReceiptApi.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ClubAccount_BE.receipt.adapter.in.web.api;
22

33
import com.ClubAccount_BE.core.response.PagingResponse;
4+
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptCategoryResponse;
45
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptDetailResponse;
56
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptResponse;
67
import io.swagger.v3.oas.annotations.Operation;
@@ -25,4 +26,9 @@ ReceiptDetailResponse getReceipt(
2526
@PathVariable(value = "link") UUID link,
2627
@PathVariable("receiptId") Long receiptId
2728
);
29+
30+
@Operation(summary = "영수증 카테고리 비율 조회", description = "등록된 영수증의 카테고리 비율을 조회한다.")
31+
ReceiptCategoryResponse getReceiptCategoryRatio(
32+
@PathVariable(value = "link") UUID link
33+
);
2834
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.ClubAccount_BE.receipt.adapter.in.web.dto.response;
2+
3+
import com.ClubAccount_BE.receipt.domain.DetailCategoryResult;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.Builder;
6+
7+
@Builder
8+
public record ReceiptCategoryResponse(
9+
@Schema(description = "회식비 비율")
10+
float groupDiningRatio,
11+
12+
@Schema(description = "물품 구매비 비율")
13+
float supplyPurchaseRatio,
14+
15+
@Schema(description = "정기 구독비 비율")
16+
float subscriptionRatio,
17+
18+
@Schema(description = "대관비 비율")
19+
float venueRentalRatio,
20+
21+
@Schema(description = "기타 비율")
22+
float otherRatio
23+
) {
24+
25+
public static ReceiptCategoryResponse of(DetailCategoryResult result) {
26+
return ReceiptCategoryResponse.builder()
27+
.groupDiningRatio(result.getGroupDiningRatio())
28+
.supplyPurchaseRatio(result.getSupplyPurchaseRatio())
29+
.subscriptionRatio(result.getSubscriptionRatio())
30+
.venueRentalRatio(result.getVenueRentalRatio())
31+
.otherRatio(result.getOtherRatio())
32+
.build();
33+
}
34+
35+
}

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

Lines changed: 0 additions & 30 deletions
This file was deleted.

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ public Receipt getReceipt(User user, Long receiptId) {
4646
.orElseThrow(() -> new IllegalArgumentException("Receipt not found"));
4747
}
4848

49+
@Override
50+
public List<Receipt> getReceiptCategoryList(User user) {
51+
return receiptRepository
52+
.findAllByUserId(user.getId())
53+
.stream()
54+
.map(ReceiptMapper::toDomain)
55+
.toList();
56+
}
57+
4958
@Override
5059
public Long updateReceipt(
5160
Long receiptId,

src/main/java/com/ClubAccount_BE/receipt/adapter/out/persistence/repository/ReceiptRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ClubAccount_BE.receipt.adapter.out.persistence.repository;
22

33
import com.ClubAccount_BE.receipt.adapter.out.persistence.entity.ReceiptEntity;
4+
import java.util.List;
45
import java.util.Optional;
56
import org.springframework.data.domain.Page;
67
import org.springframework.data.domain.Pageable;
@@ -11,6 +12,8 @@ public interface ReceiptRepository extends JpaRepository<ReceiptEntity, Long> {
1112

1213
Page<ReceiptEntity> findAllByUserId(Long id, Pageable pageable);
1314

15+
List<ReceiptEntity> findAllByUserId(Long id);
16+
1417
@EntityGraph(attributePaths = "receiptItems")
1518
Optional<ReceiptEntity> findReceiptById(Long receiptId);
1619
}

src/main/java/com/ClubAccount_BE/receipt/application/port/in/CreateReceiptUseCase.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.ClubAccount_BE.receipt.application.port.in;
22

33
import com.ClubAccount_BE.receipt.adapter.in.web.dto.request.ReceiptRequest;
4-
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptCreateResponse;
54
import com.ClubAccount_BE.user.domain.User;
65
import org.springframework.web.multipart.MultipartFile;
76

87
public interface CreateReceiptUseCase {
98

10-
ReceiptCreateResponse createReceipt(
9+
Long createReceipt(
1110
User user,
1211
MultipartFile image,
1312
ReceiptRequest receiptRequest

0 commit comments

Comments
 (0)