diff --git a/src/main/java/com/acquirex/domain/Acquisition.java b/src/main/java/com/acquirex/domain/Acquisition.java new file mode 100644 index 0000000..2e6ffa8 --- /dev/null +++ b/src/main/java/com/acquirex/domain/Acquisition.java @@ -0,0 +1,87 @@ +package com.acquirex.domain; + +import jakarta.persistence.*; +import jakarta.validation.constraints.*; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 카드 매입 정보 도메인 엔티티 + * Jakarta EE 9+ 어노테이션 사용 (Spring Boot 3) + */ +@Entity +@Table(name = "acquisitions") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Acquisition { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotBlank(message = "가맹점 번호는 필수입니다") + @Column(name = "merchant_id", nullable = false, length = 20) + private String merchantId; + + @NotBlank(message = "카드번호는 필수입니다") + @Column(name = "card_number", nullable = false, length = 19) + private String cardNumber; + + @NotNull(message = "매입 금액은 필수입니다") + @Positive(message = "매입 금액은 양수여야 합니다") + @Column(name = "amount", nullable = false, precision = 15, scale = 2) + private BigDecimal amount; + + @NotBlank(message = "거래 번호는 필수입니다") + @Column(name = "transaction_id", nullable = false, unique = true, length = 30) + private String transactionId; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false, length = 20) + private AcquisitionStatus status; + + @Column(name = "approval_code", length = 10) + private String approvalCode; + + @Column(name = "approved_at") + private LocalDateTime approvedAt; + + @Column(name = "created_at", nullable = false, updatable = false) + private LocalDateTime createdAt; + + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @PrePersist + protected void onCreate() { + createdAt = LocalDateTime.now(); + updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + updatedAt = LocalDateTime.now(); + } + + public void approve(String approvalCode) { + this.status = AcquisitionStatus.APPROVED; + this.approvalCode = approvalCode; + this.approvedAt = LocalDateTime.now(); + } + + public void reject(String reason) { + this.status = AcquisitionStatus.REJECTED; + } +} + +/** + * 카드 매입 승인 상태 열거형 + */ +enum AcquisitionStatus { + PENDING, APPROVED, REJECTED, CANCELLED +} \ No newline at end of file