| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Stocks;
- /// <summary>
- /// 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 지연을 감안한다.
- /// </summary>
- public class ForeignSettlementNation
- {
- [Key]
- public int ID { get; private set; }
- /// <summary>결제일자 (SETL_DT, 요청값 스탬핑)</summary>
- public DateOnly SetlDt { get; private set; }
- /// <summary>국가코드 (NATION_CD, 요청값 스탬핑) — US/JP/HK/CN/E1 등 43종</summary>
- public string NationCd { get; private set; } = default!;
- /// <summary>국제업무분류코드 (INTL_BIZ_CACD) — 1110매수 1120매도</summary>
- public string IntlBizCacd { get; private set; } = default!;
- /// <summary>종목구분코드 (SECN_TPCD) — 71외화주식~78외화수익증권</summary>
- public string SecnTpcd { get; private set; } = default!;
- /// <summary>결제건수 (SETL_COUNT)</summary>
- public long? SetlCount { get; private set; }
- /// <summary>외화증권결제금액 (FRSEC_SETL_AMT) — USD</summary>
- 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
- };
- }
- /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 SetlDt/NationCd/IntlBizCacd/SecnTpcd 은 불변)</summary>
- 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>(T incoming, T current, Action<T> assign)
- {
- if (EqualityComparer<T>.Default.Equals(incoming, current))
- {
- return false;
- }
- assign(incoming);
- return true;
- }
- }
|