LockupEvent.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 의무보호예수/반환 정보 (getSafeDpDutyDepoStatus, 락업) — 예수/반환 일정·수량·사유 (Wave 2 ★P1).
  5. /// 자연키 UNIQUE (IssucoCustno, ShotnIsin, SafedpDt, OccrSeq, DutySafedpRacd) — 한 종목·예수일에 사유가 여럿일 수 있어 사유코드까지 포함.
  6. /// 수집은 조회기준일(BEGIN_DT) 날짜 스윕 후 window(스윕 창) delete+insert 로 반영한다.
  7. /// ⚠️ 실응답의 SECN_KACD 는 코드(0101)가 아니라 종목종류명(보통주) 문자열이다(fixture 확인) — 문자열로 저장.
  8. /// DUTY_SAFEDP_RACD 는 코드표가 크므로 코드 원문(문자열)으로 저장한다.
  9. /// </summary>
  10. public class LockupEvent
  11. {
  12. [Key]
  13. public int ID { get; private set; }
  14. /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
  15. public int IssucoCustno { get; private set; }
  16. /// <summary>한글종목명 (KOR_SECN_NM)</summary>
  17. public string KorSecnNm { get; private set; } = default!;
  18. /// <summary>종목종류 (SECN_KACD — 실응답은 보통주/우선주… 명칭 문자열)</summary>
  19. public string? SecnKacd { get; private set; }
  20. /// <summary>단축코드 (SHOTN_ISIN)</summary>
  21. public string ShotnIsin { get; private set; } = default!;
  22. /// <summary>시장구분 (MART_TPCD)</summary>
  23. public string? MartTpcd { get; private set; }
  24. /// <summary>업무구분 (OCCR_SEQ) — 1예수 2반환</summary>
  25. public string OccrSeq { get; private set; } = default!;
  26. /// <summary>의무보호예수일 (SAFEDP_DT)</summary>
  27. public DateOnly SafedpDt { get; private set; }
  28. /// <summary>예수주식수 (SAFEDP_QTY)</summary>
  29. public long? SafedpQty { get; private set; }
  30. /// <summary>보호예수사유코드 (DUTY_SAFEDP_RACD) — 코드 원문 문자열 (코드표 큼)</summary>
  31. public string DutySafedpRacd { get; private set; } = default!;
  32. /// <summary>반환일 (RETURN_DT)</summary>
  33. public DateOnly? ReturnDt { get; private set; }
  34. /// <summary>반환주식수 (RETURN_QTY)</summary>
  35. public long? ReturnQty { get; private set; }
  36. /// <summary>총발행주식수 (TOTAL_STK_CNT)</summary>
  37. public long? TotalStkCnt { get; private set; }
  38. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  39. private LockupEvent() { }
  40. public static LockupEvent Create(
  41. int issucoCustno,
  42. string korSecnNm,
  43. string? secnKacd,
  44. string shotnIsin,
  45. string? martTpcd,
  46. string occrSeq,
  47. DateOnly safedpDt,
  48. long? safedpQty,
  49. string dutySafedpRacd,
  50. DateOnly? returnDt,
  51. long? returnQty,
  52. long? totalStkCnt)
  53. {
  54. if (string.IsNullOrWhiteSpace(korSecnNm))
  55. {
  56. throw new ArgumentException("korSecnNm required", nameof(korSecnNm));
  57. }
  58. if (string.IsNullOrWhiteSpace(shotnIsin))
  59. {
  60. throw new ArgumentException("shotnIsin required", nameof(shotnIsin));
  61. }
  62. if (string.IsNullOrWhiteSpace(occrSeq))
  63. {
  64. throw new ArgumentException("occrSeq required", nameof(occrSeq));
  65. }
  66. if (string.IsNullOrWhiteSpace(dutySafedpRacd))
  67. {
  68. throw new ArgumentException("dutySafedpRacd required", nameof(dutySafedpRacd));
  69. }
  70. return new LockupEvent
  71. {
  72. IssucoCustno = issucoCustno,
  73. KorSecnNm = korSecnNm.Trim(),
  74. SecnKacd = string.IsNullOrWhiteSpace(secnKacd) ? null : secnKacd.Trim(),
  75. ShotnIsin = shotnIsin.Trim(),
  76. MartTpcd = string.IsNullOrWhiteSpace(martTpcd) ? null : martTpcd.Trim(),
  77. OccrSeq = occrSeq.Trim(),
  78. SafedpDt = safedpDt,
  79. SafedpQty = safedpQty,
  80. DutySafedpRacd = dutySafedpRacd.Trim(),
  81. ReturnDt = returnDt,
  82. ReturnQty = returnQty,
  83. TotalStkCnt = totalStkCnt
  84. };
  85. }
  86. }