From d671e38cba42004935550a2cbf25c399d37c6a62 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Thu, 30 Jul 2026 10:38:03 +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 --- .../domain/AcquisitionApproval.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/main/java/com/acquirex/cardapproval/domain/AcquisitionApproval.java diff --git a/src/main/java/com/acquirex/cardapproval/domain/AcquisitionApproval.java b/src/main/java/com/acquirex/cardapproval/domain/AcquisitionApproval.java new file mode 100644 index 0000000..69ff5e5 --- /dev/null +++ b/src/main/java/com/acquirex/cardapproval/domain/AcquisitionApproval.java @@ -0,0 +1,114 @@ +package com.acquirex.cardapproval.domain; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.*; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +/** + * 카드 매입 승인 도메인 엔티티 + * Jakarta Persistence API 3.1 (JPA 3.1) - Spring Boot 3.x + */ +@Entity +@Table(name = "acquisition_approvals") +@Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder +public class AcquisitionApproval { + + @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 @Positive + @Column(name = "acquisition_amount", nullable = false, precision = 15, scale = 2) + private BigDecimal acquisitionAmount; + + @NotNull @Positive + @Column(name = "approval_amount", nullable = false, precision = 15, scale = 2) + private BigDecimal approvalAmount; + + @NotBlank + @Column(name = "approval_number", nullable = false, length = 12) + private String approvalNumber; + + @NotNull + @Column(name = "acquisition_datetime", nullable = false) + private LocalDateTime acquisitionDatetime; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "approval_status", nullable = false, length = 20) + private ApprovalStatus approvalStatus; + + @Column(name = "cancel_yn", length = 1) + @Builder.Default + private String cancelYn = "N"; + + @Column(name = "cancel_datetime") + private LocalDateTime cancelDatetime; + + @Column(name = "cancel_reason", length = 200) + private String cancelReason; + + @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 cancel(String reason) { + this.cancelYn = "Y"; + this.cancelDatetime = LocalDateTime.now(); + this.cancelReason = reason; + this.approvalStatus = ApprovalStatus.CANCELLED; + } + + public enum ApprovalStatus { + PENDING, APPROVED, REJECTED, CANCELLED, COMPLETED + } +} + +/** + * 카드 매입 승인 레포지토리 + * Spring Data JPA (Spring Boot 3.x) + */ +@Repository +interface AcquisitionApprovalRepository extends JpaRepository { + + List findByMerchantIdAndCancelYn(String merchantId, String cancelYn); + + Optional findByApprovalNumber(String approvalNumber); + + @Query("SELECT a FROM AcquisitionApproval a WHERE a.acquisitionDatetime BETWEEN :startDate AND :endDate") + List findByAcquisitionDatetimeBetween( + @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate); +} \ No newline at end of file