Skip to content

Commit ee5f3b5

Browse files
authored
Merge pull request #27 from C4-ComeTrue/feature/opixxx_step3
Feature/opixxx step3
2 parents b560afc + d5db300 commit ee5f3b5

File tree

18 files changed

+870
-3
lines changed

18 files changed

+870
-3
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.c4marathon.assignment.global.util;
2+
3+
import java.security.SecureRandom;
4+
5+
import lombok.AccessLevel;
6+
import lombok.NoArgsConstructor;
7+
8+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
9+
public class SettlementUtil {
10+
private static final SecureRandom SECURE_RANDOM = new SecureRandom();
11+
12+
public static int getRandomInt(int range) {
13+
return SECURE_RANDOM.nextInt(range);
14+
}
15+
16+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.c4marathon.assignment.settlement.domain;
2+
3+
import static jakarta.persistence.FetchType.*;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
import org.c4marathon.assignment.global.entity.BaseEntity;
9+
10+
import jakarta.persistence.CascadeType;
11+
import jakarta.persistence.Column;
12+
import jakarta.persistence.Entity;
13+
import jakarta.persistence.EnumType;
14+
import jakarta.persistence.Enumerated;
15+
import jakarta.persistence.GeneratedValue;
16+
import jakarta.persistence.GenerationType;
17+
import jakarta.persistence.Id;
18+
import jakarta.persistence.OneToMany;
19+
import lombok.AccessLevel;
20+
import lombok.Builder;
21+
import lombok.Getter;
22+
import lombok.NoArgsConstructor;
23+
24+
@Entity
25+
@Getter
26+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
27+
public class Settlement extends BaseEntity {
28+
@Id
29+
@GeneratedValue(strategy = GenerationType.IDENTITY)
30+
@Column(name = "settlement_id")
31+
private Long id;
32+
33+
private Long requestAccountId; //정산 요청한 계좌 ID
34+
35+
private int totalAmount; //총 정산 금액
36+
37+
private int amount; //내 정산 금액
38+
39+
@Enumerated(EnumType.STRING)
40+
private SettlementType type;
41+
42+
@OneToMany(mappedBy = "settlement", fetch = LAZY, cascade = CascadeType.ALL)
43+
private List<SettlementDetail> settlementDetails = new ArrayList<>();
44+
45+
@Builder
46+
private Settlement(Long requestAccountId, int totalAmount, SettlementType type) {
47+
this.requestAccountId = requestAccountId;
48+
this.totalAmount = totalAmount;
49+
this.type = type;
50+
}
51+
52+
public static Settlement create(Long requestAccountId, int totalAmount, SettlementType type) {
53+
return Settlement.builder()
54+
.requestAccountId(requestAccountId)
55+
.totalAmount(totalAmount)
56+
.type(type)
57+
.build();
58+
}
59+
60+
public void setAmount(int amount) {
61+
this.amount = amount;
62+
}
63+
64+
public void addSettlementDetail(SettlementDetail settlementDetail) {
65+
this.settlementDetails.add(settlementDetail);
66+
settlementDetail.setSettlement(this);
67+
68+
}
69+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.c4marathon.assignment.settlement.domain;
2+
3+
import org.c4marathon.assignment.global.entity.BaseEntity;
4+
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.FetchType;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.GenerationType;
10+
import jakarta.persistence.Id;
11+
import jakarta.persistence.JoinColumn;
12+
import jakarta.persistence.ManyToOne;
13+
import lombok.AccessLevel;
14+
import lombok.Builder;
15+
import lombok.Getter;
16+
import lombok.NoArgsConstructor;
17+
18+
@Entity
19+
@Getter
20+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
21+
public class SettlementDetail extends BaseEntity {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
@Column(name = "settlement_detail_id")
26+
private Long id;
27+
28+
private Long accountId;
29+
30+
private int amount;
31+
32+
@ManyToOne(fetch = FetchType.LAZY)
33+
@JoinColumn(name = "settlement_id", nullable = false)
34+
private Settlement settlement;
35+
36+
@Builder
37+
private SettlementDetail(Settlement settlement, Long accountId, int amount) {
38+
this.settlement = settlement;
39+
this.accountId = accountId;
40+
this.amount = amount;
41+
}
42+
43+
public static SettlementDetail create(Settlement settlement, Long accountId, int amount) {
44+
SettlementDetail settlementDetail = SettlementDetail.builder()
45+
.accountId(accountId)
46+
.amount(amount)
47+
.build();
48+
settlement.addSettlementDetail(settlementDetail);
49+
return settlementDetail;
50+
}
51+
52+
public void setSettlement(Settlement settlement) {
53+
this.settlement = settlement;
54+
}
55+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.c4marathon.assignment.settlement.domain;
2+
3+
public enum SettlementType {
4+
EQUAL,
5+
RANDOM
6+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.c4marathon.assignment.settlement.domain.repository;
2+
3+
import java.util.List;
4+
5+
import org.c4marathon.assignment.settlement.domain.SettlementDetail;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
9+
10+
public interface SettlementDetailRepository extends JpaRepository<SettlementDetail, Long> {
11+
12+
@Query("""
13+
SELECT sd
14+
FROM SettlementDetail sd
15+
JOIN FETCH sd.settlement s
16+
WHERE sd.accountId = :accountId
17+
""")
18+
List<SettlementDetail> findByAccountId(@Param("accountId") Long accountId);
19+
20+
}
21+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.c4marathon.assignment.settlement.domain.repository;
2+
3+
import java.util.List;
4+
5+
import org.c4marathon.assignment.settlement.domain.Settlement;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
8+
public interface SettlementRepository extends JpaRepository<Settlement, Long> {
9+
List<Settlement> findByRequestAccountId(Long requestAccountId);
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.c4marathon.assignment.settlement.dto;
2+
3+
public record ReceivedSettlementResponse(
4+
Long settlementId,
5+
Long requestAccountId,
6+
int totalAmount,
7+
Long myAccountId,
8+
int mySettlementAmount
9+
) {
10+
11+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.c4marathon.assignment.settlement.dto;
2+
3+
public record SettlementDetailInfo(
4+
Long settlementDetailId,
5+
Long accountId,
6+
int amount
7+
) {
8+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.c4marathon.assignment.settlement.dto;
2+
3+
import java.util.List;
4+
5+
import org.c4marathon.assignment.settlement.domain.SettlementType;
6+
7+
import jakarta.validation.constraints.Max;
8+
import jakarta.validation.constraints.NotNull;
9+
import jakarta.validation.constraints.PositiveOrZero;
10+
11+
public record SettlementRequest(
12+
13+
@PositiveOrZero
14+
@Max(value = 100, message = "100명까지 정산이 가능합니다.")
15+
int totalNumber,
16+
17+
@PositiveOrZero
18+
int totalAmount,
19+
20+
@NotNull(message = "정산 인원을 추가해주세요.")
21+
List<Long> accountIds,
22+
23+
@NotNull(message = "정산 타입을 선택해주세요.")
24+
SettlementType type
25+
26+
) {
27+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.c4marathon.assignment.settlement.dto;
2+
3+
import java.util.List;
4+
5+
6+
public record SettlementResponse(
7+
Long settlementId,
8+
Long requestAccountId,
9+
int totalAmount,
10+
List<SettlementDetailInfo> members
11+
) {
12+
}

0 commit comments

Comments
 (0)