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
};
}
}