ListingChangeEvent.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 주식 상장(유통형태 변경) 정보 (getStkListInfo) — 예탁지정·상장 유통형태 변경 이벤트 (Wave 2).
  5. /// 월 윈도우(ALT_BEGIN_DT~ALT_EXPRY_DT 최대 1개월/콜) 스윕 후 window(적용일 범위) delete+insert 로 반영한다.
  6. /// 유통형태 코드(BFALT/AFALT_CIRCL_FORM)는 코드 원문 문자열로 저장 — [110]유가 [211]예탁지정 [230]보호예수 등.
  7. /// </summary>
  8. public class ListingChangeEvent
  9. {
  10. [Key]
  11. public int ID { get; private set; }
  12. /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
  13. public int? IssucoCustno { get; private set; }
  14. /// <summary>종목코드 (ISIN)</summary>
  15. public string Isin { get; private set; } = default!;
  16. /// <summary>단축코드 (SHOTN_ISIN)</summary>
  17. public string ShotnIsin { get; private set; } = default!;
  18. /// <summary>종목명 (KOR_SECN_NM)</summary>
  19. public string KorSecnNm { get; private set; } = default!;
  20. /// <summary>변경전 유통형태 (BFALT_CIRCL_FORM) — 코드 원문. 미제공 null</summary>
  21. public string? BfaltCirclForm { get; private set; }
  22. /// <summary>변경후 유통형태 (AFALT_CIRCL_FORM) — 코드 원문</summary>
  23. public string? AfaltCirclForm { get; private set; }
  24. /// <summary>변경(적용)일자 (APLI_DT)</summary>
  25. public DateOnly ApliDt { get; private set; }
  26. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  27. private ListingChangeEvent() { }
  28. public static ListingChangeEvent Create(
  29. int? issucoCustno,
  30. string isin,
  31. string shotnIsin,
  32. string korSecnNm,
  33. string? bfaltCirclForm,
  34. string? afaltCirclForm,
  35. DateOnly apliDt)
  36. {
  37. if (string.IsNullOrWhiteSpace(isin))
  38. {
  39. throw new ArgumentException("isin required", nameof(isin));
  40. }
  41. if (string.IsNullOrWhiteSpace(shotnIsin))
  42. {
  43. throw new ArgumentException("shotnIsin required", nameof(shotnIsin));
  44. }
  45. if (string.IsNullOrWhiteSpace(korSecnNm))
  46. {
  47. throw new ArgumentException("korSecnNm required", nameof(korSecnNm));
  48. }
  49. return new ListingChangeEvent
  50. {
  51. IssucoCustno = issucoCustno,
  52. Isin = isin.Trim(),
  53. ShotnIsin = shotnIsin.Trim(),
  54. KorSecnNm = korSecnNm.Trim(),
  55. BfaltCirclForm = string.IsNullOrWhiteSpace(bfaltCirclForm) ? null : bfaltCirclForm.Trim(),
  56. AfaltCirclForm = string.IsNullOrWhiteSpace(afaltCirclForm) ? null : afaltCirclForm.Trim(),
  57. ApliDt = apliDt
  58. };
  59. }
  60. }