using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Domain.Entities.Members; using Domain.Entities.Payments.Danal.ValueObject; using Domain.Entities.Payments.ValueObject; namespace Domain.Entities.Payments.Danal; /// /// 다날 결제 취소 요청 + 응답 통합 /// 전체 취소 / 부분 취소 모두 지원 /// public class DanalCancel { [ForeignKey(nameof(MemberID))] public virtual Member? Member { get; private set; } [ForeignKey(nameof(PaymentOrderID))] public virtual PaymentOrder? PaymentOrder { get; private set; } [Key] public int ID { get; private set; } public int MemberID { get; private set; } public int PaymentOrderID { get; private set; } public PaymentMethod Method { get; private set; } /// 원거래 번호 public string TransactionID { get; private set; } = default!; /// 가맹점 주문번호 public string OrderID { get; private set; } = default!; /// 취소 금액 public int Amount { get; private set; } /// CPID public string MerchantID { get; private set; } = default!; /// 전체/부분 취소 public DanalCancelType CancelType { get; private set; } /// 취소 요청자 (admin / system / member) public string? CancelRequester { get; private set; } /// 취소 사유 public string? CancelReason { get; private set; } // ── 응답 필드 ──────────────────────────────────────────────────── /// 응답 코드 (0000 = 성공) public string? ResponseCode { get; private set; } /// 응답 메시지 public string? ResponseMessage { get; private set; } /// 원거래 ID (다날 응답) public string? OriginalTransactionID { get; private set; } /// 취소된 금액 (다날 응답) public int? CancelledAmount { get; private set; } /// 원거래 승인일자 public string? TransDate { get; private set; } /// 원거래 승인시간 public string? TransTime { get; private set; } /// 부분취소 후 남은 금액 (Balance) public int? Balance { get; private set; } /// 부분취소 후 남은 결제 잔액 (RemainedAmount) public int? RemainedAmount { get; private set; } /// 승인 발생 일시 public string? ApprovalDateTime { get; private set; } public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; public DateTime? UpdatedAt { get; private set; } private DanalCancel() { } public static DanalCancel CreateRequest( int memberID, int paymentOrderID, PaymentMethod method, string transactionID, string orderID, int amount, string merchantID, DanalCancelType cancelType, string? cancelRequester = null, string? cancelReason = null ) { return new DanalCancel { MemberID = memberID, PaymentOrderID = paymentOrderID, Method = method, TransactionID = transactionID, OrderID = orderID, Amount = amount, MerchantID = merchantID, CancelType = cancelType, CancelRequester = cancelRequester, CancelReason = cancelReason }; } public void SetResponse( string code, string message, string? originalTransactionID = null, int? cancelledAmount = null, string? transDate = null, string? transTime = null, int? balance = null, int? remainedAmount = null, string? approvalDateTime = null ) { ResponseCode = code; ResponseMessage = message; OriginalTransactionID = originalTransactionID; CancelledAmount = cancelledAmount; TransDate = transDate; TransTime = transTime; Balance = balance; RemainedAmount = remainedAmount; ApprovalDateTime = approvalDateTime; UpdatedAt = DateTime.UtcNow; } public bool IsSuccess => ResponseCode == "0000"; }