using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// SEIBro 주식 상장(유통형태 변경) 정보 (getStkListInfo) — 예탁지정·상장 유통형태 변경 이벤트 (Wave 2). /// 월 윈도우(ALT_BEGIN_DT~ALT_EXPRY_DT 최대 1개월/콜) 스윕 후 window(적용일 범위) delete+insert 로 반영한다. /// 유통형태 코드(BFALT/AFALT_CIRCL_FORM)는 코드 원문 문자열로 저장 — [110]유가 [211]예탁지정 [230]보호예수 등. /// public class ListingChangeEvent { [Key] public int ID { get; private set; } /// 발행회사 고객번호 (ISSUCO_CUSTNO) public int? IssucoCustno { get; private set; } /// 종목코드 (ISIN) public string Isin { get; private set; } = default!; /// 단축코드 (SHOTN_ISIN) public string ShotnIsin { get; private set; } = default!; /// 종목명 (KOR_SECN_NM) public string KorSecnNm { get; private set; } = default!; /// 변경전 유통형태 (BFALT_CIRCL_FORM) — 코드 원문. 미제공 null public string? BfaltCirclForm { get; private set; } /// 변경후 유통형태 (AFALT_CIRCL_FORM) — 코드 원문 public string? AfaltCirclForm { get; private set; } /// 변경(적용)일자 (APLI_DT) public DateOnly ApliDt { get; private set; } public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow; private ListingChangeEvent() { } public static ListingChangeEvent Create( int? issucoCustno, string isin, string shotnIsin, string korSecnNm, string? bfaltCirclForm, string? afaltCirclForm, DateOnly apliDt) { if (string.IsNullOrWhiteSpace(isin)) { throw new ArgumentException("isin required", nameof(isin)); } if (string.IsNullOrWhiteSpace(shotnIsin)) { throw new ArgumentException("shotnIsin required", nameof(shotnIsin)); } if (string.IsNullOrWhiteSpace(korSecnNm)) { throw new ArgumentException("korSecnNm required", nameof(korSecnNm)); } return new ListingChangeEvent { IssucoCustno = issucoCustno, Isin = isin.Trim(), ShotnIsin = shotnIsin.Trim(), KorSecnNm = korSecnNm.Trim(), BfaltCirclForm = string.IsNullOrWhiteSpace(bfaltCirclForm) ? null : bfaltCirclForm.Trim(), AfaltCirclForm = string.IsNullOrWhiteSpace(afaltCirclForm) ? null : afaltCirclForm.Trim(), ApliDt = apliDt }; } }