using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// SEIBro 국가별 외화증권 결제현황 (getNationFrsecSetlInfo) — KSD 를 통한 외화증권 매수/매도 결제건수·금액(USD), 국가×매매구분×종목구분별 (Wave 6). /// 자연키 UNIQUE (SetlDt, NationCd, IntlBizCacd, SecnTpcd). 응답 필드는 IntlBizCacd·SecnTpcd·SetlCount·FrsecSetlAmt 4종 — 배치가 SETL_DT·NATION_CD 를 요청값으로 스탬핑한다. /// IntlBizCacd(국제업무분류) = 1110매수 / 1120매도. 외화 결제는 미국시간 T일 결제가 처리일 T+1 반영(getSecnFrsecSetlInfo 주석 참고)이라 결제일 스윕은 T+1 지연을 감안한다. /// public class ForeignSettlementNation { [Key] public int ID { get; private set; } /// 결제일자 (SETL_DT, 요청값 스탬핑) public DateOnly SetlDt { get; private set; } /// 국가코드 (NATION_CD, 요청값 스탬핑) — US/JP/HK/CN/E1 등 43종 public string NationCd { get; private set; } = default!; /// 국제업무분류코드 (INTL_BIZ_CACD) — 1110매수 1120매도 public string IntlBizCacd { get; private set; } = default!; /// 종목구분코드 (SECN_TPCD) — 71외화주식~78외화수익증권 public string SecnTpcd { get; private set; } = default!; /// 결제건수 (SETL_COUNT) public long? SetlCount { get; private set; } /// 외화증권결제금액 (FRSEC_SETL_AMT) — USD public decimal? FrsecSetlAmt { get; private set; } public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow; private ForeignSettlementNation() { } public static ForeignSettlementNation Create(DateOnly setlDt, string nationCd, string intlBizCacd, string secnTpcd, long? setlCount, decimal? frsecSetlAmt) { if (string.IsNullOrWhiteSpace(nationCd)) { throw new ArgumentException("nationCd required", nameof(nationCd)); } if (string.IsNullOrWhiteSpace(intlBizCacd)) { throw new ArgumentException("intlBizCacd required", nameof(intlBizCacd)); } if (string.IsNullOrWhiteSpace(secnTpcd)) { throw new ArgumentException("secnTpcd required", nameof(secnTpcd)); } return new ForeignSettlementNation { SetlDt = setlDt, NationCd = nationCd.Trim(), IntlBizCacd = intlBizCacd.Trim(), SecnTpcd = secnTpcd.Trim(), SetlCount = setlCount, FrsecSetlAmt = frsecSetlAmt }; } /// 재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 SetlDt/NationCd/IntlBizCacd/SecnTpcd 은 불변) public void Update(long? setlCount, decimal? frsecSetlAmt) { var changed = false; changed |= Set(setlCount, SetlCount, v => SetlCount = v); changed |= Set(frsecSetlAmt, FrsecSetlAmt, v => FrsecSetlAmt = 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; } }