RightsBaseDate.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 권리기준일 (getStddtInfo) — 발행회사별 권리 발생 기준일·사유 (Wave 1).
  5. /// 자연키 UNIQUE (IssucoCustno, RgtStdDt, RgtRacd, RgtRsnDetailSortCd).
  6. /// Wave 3(총회·상호변경·단주 등)의 이벤트 발견 소스 — RGT_RACD 로 후속 기업행위 API 호출 대상을 판별한다.
  7. /// (예: 001/002/003/009 → 총회, 204 → 상호변경)
  8. /// </summary>
  9. public class RightsBaseDate
  10. {
  11. [Key]
  12. public int ID { get; private set; }
  13. /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
  14. public int IssucoCustno { get; private set; }
  15. /// <summary>대표종목명 (REP_SECN_NM)</summary>
  16. public string RepSecnNm { get; private set; } = default!;
  17. /// <summary>권리기준일자 (RGT_STD_DT)</summary>
  18. public DateOnly RgtStdDt { get; private set; }
  19. /// <summary>권리사유코드 (RGT_RACD) — 001정기총회 … 907이익소각</summary>
  20. public string RgtRacd { get; private set; } = default!;
  21. /// <summary>권리사유명 (RGT_RACD_NM)</summary>
  22. public string? RgtRacdNm { get; private set; }
  23. /// <summary>권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)</summary>
  24. public string RgtRsnDetailSortCd { get; private set; } = default!;
  25. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  26. private RightsBaseDate() { }
  27. public static RightsBaseDate Create(
  28. int issucoCustno,
  29. string repSecnNm,
  30. DateOnly rgtStdDt,
  31. string rgtRacd,
  32. string? rgtRacdNm,
  33. string rgtRsnDetailSortCd)
  34. {
  35. if (string.IsNullOrWhiteSpace(repSecnNm))
  36. {
  37. throw new ArgumentException("repSecnNm required", nameof(repSecnNm));
  38. }
  39. if (string.IsNullOrWhiteSpace(rgtRacd))
  40. {
  41. throw new ArgumentException("rgtRacd required", nameof(rgtRacd));
  42. }
  43. if (string.IsNullOrWhiteSpace(rgtRsnDetailSortCd))
  44. {
  45. throw new ArgumentException("rgtRsnDetailSortCd required", nameof(rgtRsnDetailSortCd));
  46. }
  47. return new RightsBaseDate
  48. {
  49. IssucoCustno = issucoCustno,
  50. RepSecnNm = repSecnNm.Trim(),
  51. RgtStdDt = rgtStdDt,
  52. RgtRacd = rgtRacd.Trim(),
  53. RgtRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim(),
  54. RgtRsnDetailSortCd = rgtRsnDetailSortCd.Trim()
  55. };
  56. }
  57. /// <summary>재수집 반영 — 이름/사유명 변경 시에만 UpdatedAt 갱신 (자연키는 불변)</summary>
  58. public void Update(string repSecnNm, string? rgtRacdNm)
  59. {
  60. var changed = false;
  61. if (!string.IsNullOrWhiteSpace(repSecnNm) && RepSecnNm != repSecnNm.Trim())
  62. {
  63. RepSecnNm = repSecnNm.Trim();
  64. changed = true;
  65. }
  66. var normalizedRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim();
  67. if (RgtRacdNm != normalizedRacdNm)
  68. {
  69. RgtRacdNm = normalizedRacdNm;
  70. changed = true;
  71. }
  72. if (changed)
  73. {
  74. UpdatedAt = DateTime.UtcNow;
  75. }
  76. }
  77. }