using System.ComponentModel.DataAnnotations; using Domain.Entities.Payments.ValueObject; namespace Domain.Entities.Payments; /// /// 대사(reconciliation) 로그. PG(다날) 호출은 성공했는데 그 이후 로컬 저장(SaveChanges)이 실패해 /// PG-지갑/주문 상태가 어긋날 수 있는 순간을 독립 커밋으로 기록한다. 운영자가 이 로그를 근거로 /// 다날 콘솔과 대조해 수동 대사한다. (Phase 1.5) /// public class PaymentReconcileLog { [Key] public int ID { get; private set; } /// 대사 대상 주문(PaymentOrder.ID). FK 는 걸지 않는다 — 로그는 best-effort 로 항상 남아야 한다. public int PaymentOrderID { get; private set; } /// 발생 흐름 (Confirm/Cancel/AdminCancel) public ReconcileKind Kind { get; private set; } /// 다날 거래번호 (있으면) public string? TransactionID { get; private set; } /// 대상 금액 (충전/환불 포인트) public int Amount { get; private set; } /// 실패 사유 요약 (예외 메시지) public string Reason { get; private set; } = default!; public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; private PaymentReconcileLog() { } public static PaymentReconcileLog Create( ReconcileKind kind, int paymentOrderID, string? transactionID, int amount, string reason ) { return new PaymentReconcileLog { Kind = kind, PaymentOrderID = paymentOrderID, TransactionID = transactionID, Amount = amount, Reason = string.IsNullOrEmpty(reason) ? "-" : reason.Length > 1000 ? reason[..1000] : reason }; } }