using System.ComponentModel.DataAnnotations;
namespace Domain.Entities.Stocks;
///
/// SEIBro 파생결합증권 기초자산 행사정보 (getAssetXrcInfo) — 행사기준비율·행사가격 (Wave 5). 자연키 UNIQUE (Isin, AssetSeq, XrcStdSeq).
/// rolling per-ISIN(DerivMaster 있는 것). AssetSeq 로 DerivAsset 연계, 행사기준일련번호(XrcStdSeq)별 기준비율/행사가격 다수 행.
/// ⚠️ 응답에 ISIN 이 없어(요청 파라미터로만 받음) 배치가 요청 ISIN 을 스탬핑한다.
///
public class DerivAssetExercise
{
[Key]
public int ID { get; private set; }
/// 종목코드 (ISIN, 스탬핑)
public string Isin { get; private set; } = default!;
/// 자산일련번호 (ASSET_SEQ) — getAssetInfo 연계
public int AssetSeq { get; private set; }
/// 행사기준일련번호 (XRC_STD_SEQ)
public int XrcStdSeq { get; private set; }
/// 행사기준비율 % (XRC_STD_RATIO) — 기준가 대비
public decimal? XrcStdRatio { get; private set; }
/// 행사가격 (XRC_PRICE)
public decimal? XrcPrice { get; private set; }
public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
private DerivAssetExercise() { }
public static DerivAssetExercise Create(string isin, int assetSeq, int xrcStdSeq, decimal? xrcStdRatio, decimal? xrcPrice)
{
if (string.IsNullOrWhiteSpace(isin))
{
throw new ArgumentException("isin required", nameof(isin));
}
return new DerivAssetExercise
{
Isin = isin.Trim(),
AssetSeq = assetSeq,
XrcStdSeq = xrcStdSeq,
XrcStdRatio = xrcStdRatio,
XrcPrice = xrcPrice
};
}
/// 재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 Isin/AssetSeq/XrcStdSeq 은 불변)
public void Update(decimal? xrcStdRatio, decimal? xrcPrice)
{
var changed = false;
changed |= Set(xrcStdRatio, XrcStdRatio, v => XrcStdRatio = v);
changed |= Set(xrcPrice, XrcPrice, v => XrcPrice = v);
if (changed)
{
UpdatedAt = DateTime.UtcNow;
}
}
private static bool Set(T incoming, T current, Action assign)
{
if (EqualityComparer.Default.Equals(incoming, current))
{
return false;
}
assign(incoming);
return true;
}
}