using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// 전자공시(DART) 공시 1건 (OpenDART list.json) — RceptNo(접수번호 14자리) 가 비즈니스 UNIQUE 키. /// list.json 이 stock_code(6자리 단축코드)를 이미 포함하므로 corpCode.xml 매핑 없이 종목별 조회가 가능하다. /// 비상장(자산운용/신탁 등)은 stock_code 가 "" → null 로 저장. corp_cls 는 시장구분(Y유가/K코스닥/N코넥스/E기타). /// 수집은 접수일(rcept_dt) 기준 최근 N일 페이징. 원문(문서 본문)은 저장하지 않고 목록 메타만 담는 read-only 피드. /// public class Disclosure { [Key] public long ID { get; private set; } /// 접수번호 (rcept_no) — 14자리, 비즈니스 UNIQUE 키. DART 문서 링크 구성에 사용 가능 public string RceptNo { get; private set; } = default!; /// 고유번호 (corp_code) — 8자리 DART 법인 고유코드 public string CorpCode { get; private set; } = default!; /// 법인명 (corp_name) public string CorpName { get; private set; } = default!; /// 종목코드 (stock_code) — 6자리 단축코드. 비상장이면 null public string? StockCode { get; private set; } /// 법인구분 (corp_cls) — Y유가/K코스닥/N코넥스/E기타. 1자리 public string CorpCls { get; private set; } = default!; /// 보고서명 (report_nm) public string ReportNm { get; private set; } = default!; /// 공시 제출인명 (flr_nm) public string FlrNm { get; private set; } = default!; /// 접수일자 (rcept_dt, YYYYMMDD) public DateOnly RceptDt { get; private set; } /// 비고 (rm) — 정정/첨부정정 등 표시. 없으면 null public string? Rm { get; private set; } public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; private Disclosure() { } public static Disclosure Create( string rceptNo, string corpCode, string corpName, string? stockCode, string corpCls, string reportNm, string flrNm, DateOnly rceptDt, string? rm = null ) { if (string.IsNullOrWhiteSpace(rceptNo)) { throw new ArgumentException("rceptNo required", nameof(rceptNo)); } if (string.IsNullOrWhiteSpace(corpCode)) { throw new ArgumentException("corpCode required", nameof(corpCode)); } if (string.IsNullOrWhiteSpace(reportNm)) { throw new ArgumentException("reportNm required", nameof(reportNm)); } return new Disclosure { RceptNo = rceptNo.Trim(), CorpCode = corpCode.Trim(), CorpName = corpName.Trim(), StockCode = string.IsNullOrWhiteSpace(stockCode) ? null : stockCode.Trim(), CorpCls = corpCls.Trim(), ReportNm = reportNm.Trim(), FlrNm = flrNm.Trim(), RceptDt = rceptDt, Rm = string.IsNullOrWhiteSpace(rm) ? null : rm.Trim() }; } }