Disclosure.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// 전자공시(DART) 공시 1건 (OpenDART list.json) — RceptNo(접수번호 14자리) 가 비즈니스 UNIQUE 키.
  5. /// list.json 이 stock_code(6자리 단축코드)를 이미 포함하므로 corpCode.xml 매핑 없이 종목별 조회가 가능하다.
  6. /// 비상장(자산운용/신탁 등)은 stock_code 가 "" → null 로 저장. corp_cls 는 시장구분(Y유가/K코스닥/N코넥스/E기타).
  7. /// 수집은 접수일(rcept_dt) 기준 최근 N일 페이징. 원문(문서 본문)은 저장하지 않고 목록 메타만 담는 read-only 피드.
  8. /// </summary>
  9. public class Disclosure
  10. {
  11. [Key]
  12. public long ID { get; private set; }
  13. /// <summary>접수번호 (rcept_no) — 14자리, 비즈니스 UNIQUE 키. DART 문서 링크 구성에 사용 가능</summary>
  14. public string RceptNo { get; private set; } = default!;
  15. /// <summary>고유번호 (corp_code) — 8자리 DART 법인 고유코드</summary>
  16. public string CorpCode { get; private set; } = default!;
  17. /// <summary>법인명 (corp_name)</summary>
  18. public string CorpName { get; private set; } = default!;
  19. /// <summary>종목코드 (stock_code) — 6자리 단축코드. 비상장이면 null</summary>
  20. public string? StockCode { get; private set; }
  21. /// <summary>법인구분 (corp_cls) — Y유가/K코스닥/N코넥스/E기타. 1자리</summary>
  22. public string CorpCls { get; private set; } = default!;
  23. /// <summary>보고서명 (report_nm)</summary>
  24. public string ReportNm { get; private set; } = default!;
  25. /// <summary>공시 제출인명 (flr_nm)</summary>
  26. public string FlrNm { get; private set; } = default!;
  27. /// <summary>접수일자 (rcept_dt, YYYYMMDD)</summary>
  28. public DateOnly RceptDt { get; private set; }
  29. /// <summary>비고 (rm) — 정정/첨부정정 등 표시. 없으면 null</summary>
  30. public string? Rm { get; private set; }
  31. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  32. private Disclosure() { }
  33. public static Disclosure Create(
  34. string rceptNo,
  35. string corpCode,
  36. string corpName,
  37. string? stockCode,
  38. string corpCls,
  39. string reportNm,
  40. string flrNm,
  41. DateOnly rceptDt,
  42. string? rm = null
  43. ) {
  44. if (string.IsNullOrWhiteSpace(rceptNo))
  45. {
  46. throw new ArgumentException("rceptNo required", nameof(rceptNo));
  47. }
  48. if (string.IsNullOrWhiteSpace(corpCode))
  49. {
  50. throw new ArgumentException("corpCode required", nameof(corpCode));
  51. }
  52. if (string.IsNullOrWhiteSpace(reportNm))
  53. {
  54. throw new ArgumentException("reportNm required", nameof(reportNm));
  55. }
  56. return new Disclosure
  57. {
  58. RceptNo = rceptNo.Trim(),
  59. CorpCode = corpCode.Trim(),
  60. CorpName = corpName.Trim(),
  61. StockCode = string.IsNullOrWhiteSpace(stockCode) ? null : stockCode.Trim(),
  62. CorpCls = corpCls.Trim(),
  63. ReportNm = reportNm.Trim(),
  64. FlrNm = flrNm.Trim(),
  65. RceptDt = rceptDt,
  66. Rm = string.IsNullOrWhiteSpace(rm) ? null : rm.Trim()
  67. };
  68. }
  69. }