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