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