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