using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Domain.Entities.Members; using Domain.Entities.Payments.ValueObject; namespace Domain.Entities.Payments.Danal; /// /// 다날 결제 승인 요청 + 응답 통합 /// confirm API 호출 시 요청 데이터를 먼저 저장하고, 응답 수신 시 업데이트 /// public class DanalConfirm { [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 string? CertificateToken { get; private set; } // ── 응답 필드 (승인 완료 시 업데이트) ──────────────────────────── /// 응답 코드 (0000 = 성공) public string? ResponseCode { get; private set; } /// 응답 메시지 public string? ResponseMessage { get; private set; } /// 승인된 상품명 public string? OrderName { get; private set; } /// 최종 승인 금액 public int? TotalAmount { get; private set; } /// 할인 금액 public int? DiscountAmount { get; private set; } /// 사용자 이름 public string? UserName { get; private set; } // ── 카드 응답 ──────────────────────────────────────────────────── /// 승인일자 (YYYYMMDD) public string? TransDate { get; private set; } /// 승인시간 public string? TransTime { get; private set; } /// 카드사 코드 public string? CardCode { get; private set; } /// 카드사 이름 public string? CardName { get; private set; } /// 카드번호 (마스킹) public string? CardNo { get; private set; } /// 할부 개월 수 (0=일시불) public byte? InstallmentMonths { get; private set; } /// 승인번호 public string? ApproveNo { get; private set; } // ── 휴대폰 응답 ───────────────────────────────────────────────── /// 결제 승인 일시 public string? ApprovalDateTime { get; private set; } /// 정기 결제 시 사용하는 키 public string? AuthKey { get; private set; } // ── 계좌이체 응답 ──────────────────────────────────────────────── /// 출금계좌 뒷자리 public string? AccountNumber { get; private set; } /// 은행 코드 public string? BankCode { get; private set; } /// 구매자 ID public string? UserId { get; private set; } /// 구매자 이메일 public string? UserEmail { get; private set; } // ── 가상계좌 응답 ──────────────────────────────────────────────── /// 입금은행 이름 public string? BankName { get; private set; } /// 입금 마감 날짜 (YYYYMMDD) public string? ExpireDate { get; private set; } /// 입금 마감 시간 public string? ExpireTime { get; private set; } /// 가상계좌 번호 public string? VirtualAccountNumber { get; private set; } /// 현금영수증 설정 유무 public string? UseCashReceipt { get; private set; } public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; public DateTime? UpdatedAt { get; private set; } private DanalConfirm() { } /// 승인 요청 시 생성 (응답 전) public static DanalConfirm CreateRequest( int memberID, int paymentOrderID, PaymentMethod method, string transactionID, string orderID, int amount, string merchantID, string? certificateToken = null ) { return new DanalConfirm { MemberID = memberID, PaymentOrderID = paymentOrderID, Method = method, TransactionID = transactionID, OrderID = orderID, Amount = amount, MerchantID = merchantID, CertificateToken = certificateToken }; } /// 승인 응답 수신 시 업데이트 public void SetResponse( string code, string message, string? orderName = null, int? totalAmount = null, int? discountAmount = null, string? userName = null, string? transDate = null, string? transTime = null, string? cardCode = null, string? cardName = null, string? cardNo = null, byte? installmentMonths = null, string? approveNo = null, string? approvalDateTime = null, string? authKey = null, string? accountNumber = null, string? bankCode = null, string? userId = null, string? userEmail = null, string? bankName = null, string? expireDate = null, string? expireTime = null, string? virtualAccountNumber = null, string? useCashReceipt = null ) { ResponseCode = code; ResponseMessage = message; OrderName = orderName; TotalAmount = totalAmount; DiscountAmount = discountAmount; UserName = userName; TransDate = transDate; TransTime = transTime; CardCode = cardCode; CardName = cardName; CardNo = cardNo; InstallmentMonths = installmentMonths; ApproveNo = approveNo; ApprovalDateTime = approvalDateTime; AuthKey = authKey; AccountNumber = accountNumber; BankCode = bankCode; UserId = userId; UserEmail = userEmail; BankName = bankName; ExpireDate = expireDate; ExpireTime = expireTime; VirtualAccountNumber = virtualAccountNumber; UseCashReceipt = useCashReceipt; UpdatedAt = DateTime.UtcNow; } public bool IsSuccess => ResponseCode == "0000"; }