using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// SEIBro 권리기준일 (getStddtInfo) — 발행회사별 권리 발생 기준일·사유 (Wave 1). /// 자연키 UNIQUE (IssucoCustno, RgtStdDt, RgtRacd, RgtRsnDetailSortCd). /// Wave 3(총회·상호변경·단주 등)의 이벤트 발견 소스 — RGT_RACD 로 후속 기업행위 API 호출 대상을 판별한다. /// (예: 001/002/003/009 → 총회, 204 → 상호변경) /// public class RightsBaseDate { [Key] public int ID { get; private set; } /// 발행회사 고객번호 (ISSUCO_CUSTNO) public int IssucoCustno { get; private set; } /// 대표종목명 (REP_SECN_NM) public string RepSecnNm { get; private set; } = default!; /// 권리기준일자 (RGT_STD_DT) public DateOnly RgtStdDt { get; private set; } /// 권리사유코드 (RGT_RACD) — 001정기총회 … 907이익소각 public string RgtRacd { get; private set; } = default!; /// 권리사유명 (RGT_RACD_NM) public string? RgtRacdNm { get; private set; } /// 권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD) public string RgtRsnDetailSortCd { get; private set; } = default!; public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow; private RightsBaseDate() { } public static RightsBaseDate Create( int issucoCustno, string repSecnNm, DateOnly rgtStdDt, string rgtRacd, string? rgtRacdNm, string rgtRsnDetailSortCd) { if (string.IsNullOrWhiteSpace(repSecnNm)) { throw new ArgumentException("repSecnNm required", nameof(repSecnNm)); } if (string.IsNullOrWhiteSpace(rgtRacd)) { throw new ArgumentException("rgtRacd required", nameof(rgtRacd)); } if (string.IsNullOrWhiteSpace(rgtRsnDetailSortCd)) { throw new ArgumentException("rgtRsnDetailSortCd required", nameof(rgtRsnDetailSortCd)); } return new RightsBaseDate { IssucoCustno = issucoCustno, RepSecnNm = repSecnNm.Trim(), RgtStdDt = rgtStdDt, RgtRacd = rgtRacd.Trim(), RgtRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim(), RgtRsnDetailSortCd = rgtRsnDetailSortCd.Trim() }; } /// 재수집 반영 — 이름/사유명 변경 시에만 UpdatedAt 갱신 (자연키는 불변) public void Update(string repSecnNm, string? rgtRacdNm) { var changed = false; if (!string.IsNullOrWhiteSpace(repSecnNm) && RepSecnNm != repSecnNm.Trim()) { RepSecnNm = repSecnNm.Trim(); changed = true; } var normalizedRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim(); if (RgtRacdNm != normalizedRacdNm) { RgtRacdNm = normalizedRacdNm; changed = true; } if (changed) { UpdatedAt = DateTime.UtcNow; } } }