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