From 38fcb8b62f9db7b71ee7e192ab8c797dda1722c6 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Thu, 30 Jul 2026 09:39:22 +0000 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=A7=A4=EC=9E=85=20?= =?UTF-8?q?=EC=8A=B9=EC=9D=B8=20=EA=B2=BD=EB=A1=9C=20Spring=20Boot=203=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20(ACX-E2E-1785394564819)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/acquirex/domain/Acquisition.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/main/java/com/acquirex/domain/Acquisition.java 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