Skip to content

Commit e134afc

Browse files
committed
feat: 장부 생성 시 증빙자료, 영수증을 증빙자료로 통합한다.
1 parent a150ac8 commit e134afc

File tree

4 files changed

+151
-0
lines changed

4 files changed

+151
-0
lines changed

src/main/java/com/moneymong/domain/ledger/api/LedgerControllerV2.java

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

33
import com.moneymong.domain.ledger.api.request.*;
44
import com.moneymong.domain.ledger.api.response.LedgerDetailInfoView;
5+
import com.moneymong.domain.ledger.api.response.LedgerDetailInfoViewV2;
56
import com.moneymong.domain.ledger.api.response.ledger.LedgerInfoViewV2;
67
import com.moneymong.domain.ledger.service.manager.LedgerDetailService;
8+
import com.moneymong.domain.ledger.service.manager.LedgerService;
79
import com.moneymong.domain.ledger.service.reader.LedgerReader;
810
import com.moneymong.global.security.token.dto.jwt.JwtAuthentication;
911
import io.swagger.v3.oas.annotations.Operation;
@@ -19,9 +21,24 @@
1921
@RestController
2022
@RequiredArgsConstructor
2123
public class LedgerControllerV2 {
24+
private final LedgerService ledgerService;
2225
private final LedgerReader ledgerReader;
2326
private final LedgerDetailService ledgerDetailService;
2427

28+
@Operation(summary = "장부 내역 등록 API V2")
29+
@PostMapping("/{id}")
30+
public LedgerDetailInfoViewV2 createLedger(
31+
@AuthenticationPrincipal JwtAuthentication user,
32+
@PathVariable("id") final Long ledgerId,
33+
@RequestBody @Valid final CreateLedgerRequestV2 request
34+
) {
35+
return ledgerService.createLedgerV2(
36+
user.getId(),
37+
ledgerId,
38+
request
39+
);
40+
}
41+
2542
@Operation(summary = " 장부 내역 조회 API")
2643
@GetMapping("/{id}")
2744
public LedgerInfoViewV2 search(
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.moneymong.domain.ledger.api.request;
2+
3+
import com.moneymong.domain.ledger.entity.enums.FundType;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
import jakarta.validation.constraints.Size;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
11+
import java.time.ZonedDateTime;
12+
import java.util.List;
13+
14+
@Getter
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public class CreateLedgerRequestV2 {
18+
@NotBlank(message = "storeInfo를 입력해주세요.")
19+
private String storeInfo;
20+
21+
@NotNull(message = "fundType(INCOME, EXPENSE)를 입력해주세요.")
22+
private FundType fundType;
23+
24+
@NotNull(message = "amount를 입력해주세요.")
25+
private Integer amount;
26+
27+
@NotBlank(message = "description를 입력해주세요.")
28+
private String description;
29+
30+
@NotNull(message = "paymentDate를 입력해주세요.")
31+
private ZonedDateTime paymentDate;
32+
33+
@Size(max = 12, message = "증빙 자료 12개 이하 입력해주세요.")
34+
private List<String> documentImageUrls;
35+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.moneymong.domain.ledger.api.response;
2+
3+
import com.moneymong.domain.ledger.entity.LedgerDetail;
4+
import com.moneymong.domain.ledger.entity.LedgerDocument;
5+
import com.moneymong.domain.ledger.entity.enums.FundType;
6+
import com.moneymong.domain.user.entity.User;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
9+
import lombok.Getter;
10+
11+
import java.time.ZonedDateTime;
12+
import java.util.List;
13+
14+
@Getter
15+
@Builder
16+
@AllArgsConstructor
17+
public class LedgerDetailInfoViewV2 {
18+
private Long id;
19+
private String storeInfo;
20+
private Integer amount;
21+
private FundType fundType;
22+
private String description;
23+
private ZonedDateTime paymentDate;
24+
private List<LedgerDocumentInfoView> documentImageUrls;
25+
private String authorName;
26+
27+
public static LedgerDetailInfoViewV2 of(
28+
final LedgerDetail ledgerDetail,
29+
final List<LedgerDocument> ledgerDocuments,
30+
final User user
31+
) {
32+
return LedgerDetailInfoViewV2
33+
.builder()
34+
.id(ledgerDetail.getId())
35+
.storeInfo(ledgerDetail.getStoreInfo())
36+
.amount(ledgerDetail.getAmount())
37+
.fundType(ledgerDetail.getFundType())
38+
.description(ledgerDetail.getDescription())
39+
.paymentDate(ledgerDetail.getPaymentDate())
40+
.documentImageUrls(
41+
ledgerDocuments
42+
.stream()
43+
.map(ledgerDocument -> LedgerDocumentInfoView.from(ledgerDocument.getId(),
44+
ledgerDocument.getDocumentImageUrl()))
45+
.toList()
46+
)
47+
.authorName(user.getNickname())
48+
.build();
49+
}
50+
}

src/main/java/com/moneymong/domain/ledger/service/manager/LedgerService.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import com.moneymong.domain.agency.entity.enums.AgencyUserRole;
55
import com.moneymong.domain.agency.repository.AgencyUserRepository;
66
import com.moneymong.domain.ledger.api.request.CreateLedgerRequest;
7+
import com.moneymong.domain.ledger.api.request.CreateLedgerRequestV2;
78
import com.moneymong.domain.ledger.api.request.UpdateLedgerRequest;
89
import com.moneymong.domain.ledger.api.response.LedgerDetailInfoView;
10+
import com.moneymong.domain.ledger.api.response.LedgerDetailInfoViewV2;
911
import com.moneymong.domain.ledger.entity.Ledger;
1012
import com.moneymong.domain.ledger.entity.LedgerDetail;
1113
import com.moneymong.domain.ledger.entity.LedgerDocument;
@@ -35,6 +37,53 @@ public class LedgerService {
3537
private final LedgerRepository ledgerRepository;
3638
private final LedgerDetailRepository ledgerDetailRepository;
3739

40+
@Transactional
41+
public LedgerDetailInfoViewV2 createLedgerV2(
42+
final Long userId,
43+
final Long ledgerId,
44+
final CreateLedgerRequestV2 request
45+
) {
46+
// === 유저 ===
47+
User user = getUser(userId);
48+
49+
Ledger ledger = getLedger(ledgerId);
50+
51+
// === 소속 ===
52+
AgencyUser agencyUser = getAgencyUser(userId, ledger);
53+
54+
// === 권한 ===
55+
validateStaffUserRole(agencyUser.getAgencyUserRole());
56+
57+
// 장부 내역 등록
58+
LedgerDetail ledgerDetail = ledgerDetailService.createLedgerDetail(
59+
ledger,
60+
user,
61+
request.getStoreInfo(),
62+
request.getFundType(),
63+
request.getAmount(),
64+
ledger.getTotalBalance(),
65+
request.getDescription(),
66+
request.getPaymentDate()
67+
);
68+
69+
// 장부 증빙 자료 등록
70+
List<LedgerDocument> ledgerDocuments = List.of();
71+
List<String> requestDocumentImageUrls = request.getDocumentImageUrls();
72+
73+
if (!requestDocumentImageUrls.isEmpty()) {
74+
ledgerDocuments = ledgerDocumentManager.createLedgerDocuments(
75+
ledgerDetail.getId(),
76+
requestDocumentImageUrls
77+
);
78+
}
79+
80+
return LedgerDetailInfoViewV2.of(
81+
ledgerDetail,
82+
ledgerDocuments,
83+
user
84+
);
85+
}
86+
3887
@Transactional
3988
public LedgerDetailInfoView createLedger(
4089
final Long userId,

0 commit comments

Comments
 (0)