OddLotPayment.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 단주대금 정보 (getOddLotInfo) — 단주대금 사유·산정기준·권리락일 (Wave 3).
  5. /// 자연키 UNIQUE (IssucoCustno, PayDate, RgtStdDt) — 회사·지급일·권리기준일당 1행.
  6. /// 이벤트 구동: PaymentSchedule 중 PAY_COST_TPCD=3(단주) 인 (회사번호, 지급일)을 트리거로 수집한다.
  7. /// ⚠️ 응답엔 ISSUCO_CUSTNO·지급일(TH1_PAY_TERM_BEGIN_DT)이 없어 요청값을 스탬핑한다.
  8. /// </summary>
  9. public class OddLotPayment
  10. {
  11. [Key]
  12. public int ID { get; private set; }
  13. /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO, 요청 스탬핑)</summary>
  14. public int IssucoCustno { get; private set; }
  15. /// <summary>대금지급일 (TH1_PAY_TERM_BEGIN_DT, 요청 스탬핑)</summary>
  16. public DateOnly PayDate { get; private set; }
  17. /// <summary>권리기준일자 (RGT_STD_DT)</summary>
  18. public DateOnly RgtStdDt { get; private set; }
  19. /// <summary>권리사유코드 (RGT_RACD)</summary>
  20. public string? RgtRacd { get; private set; }
  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; }
  25. /// <summary>산정기준구분코드 (ESTM_STD_TPCD) — 04상장일종가 10액면가 …</summary>
  26. public string? EstmStdTpcd { get; private set; }
  27. /// <summary>산정기준일자 (ESTM_STD_DT)</summary>
  28. public DateOnly? EstmStdDt { get; private set; }
  29. /// <summary>산정기준가 (ESTM_STDPRC)</summary>
  30. public decimal? EstmStdprc { get; private set; }
  31. /// <summary>명부폐쇄시작일자 (ROST_CLOSE_BEGIN_DT)</summary>
  32. public DateOnly? RostCloseBeginDt { get; private set; }
  33. /// <summary>명부폐쇄종료일자 (ROST_CLOSE_EXPRY_DT)</summary>
  34. public DateOnly? RostCloseExpryDt { get; private set; }
  35. /// <summary>권리락일자 (XRGT_DT)</summary>
  36. public DateOnly? XrgtDt { get; private set; }
  37. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  38. private OddLotPayment() { }
  39. public static OddLotPayment Create(
  40. int issucoCustno,
  41. DateOnly payDate,
  42. DateOnly rgtStdDt,
  43. string? rgtRacd,
  44. string? rgtRacdNm,
  45. string? rgtRsnDetailSortCd,
  46. string? estmStdTpcd,
  47. DateOnly? estmStdDt,
  48. decimal? estmStdprc,
  49. DateOnly? rostCloseBeginDt,
  50. DateOnly? rostCloseExpryDt,
  51. DateOnly? xrgtDt)
  52. {
  53. return new OddLotPayment
  54. {
  55. IssucoCustno = issucoCustno,
  56. PayDate = payDate,
  57. RgtStdDt = rgtStdDt,
  58. RgtRacd = Trimmed(rgtRacd),
  59. RgtRacdNm = Trimmed(rgtRacdNm),
  60. RgtRsnDetailSortCd = Trimmed(rgtRsnDetailSortCd),
  61. EstmStdTpcd = Trimmed(estmStdTpcd),
  62. EstmStdDt = estmStdDt,
  63. EstmStdprc = estmStdprc,
  64. RostCloseBeginDt = rostCloseBeginDt,
  65. RostCloseExpryDt = rostCloseExpryDt,
  66. XrgtDt = xrgtDt
  67. };
  68. }
  69. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키는 불변)</summary>
  70. public void Update(
  71. string? rgtRacd,
  72. string? rgtRacdNm,
  73. string? rgtRsnDetailSortCd,
  74. string? estmStdTpcd,
  75. DateOnly? estmStdDt,
  76. decimal? estmStdprc,
  77. DateOnly? rostCloseBeginDt,
  78. DateOnly? rostCloseExpryDt,
  79. DateOnly? xrgtDt)
  80. {
  81. var changed = false;
  82. changed |= Set(Trimmed(rgtRacd), RgtRacd, v => RgtRacd = v);
  83. changed |= Set(Trimmed(rgtRacdNm), RgtRacdNm, v => RgtRacdNm = v);
  84. changed |= Set(Trimmed(rgtRsnDetailSortCd), RgtRsnDetailSortCd, v => RgtRsnDetailSortCd = v);
  85. changed |= Set(Trimmed(estmStdTpcd), EstmStdTpcd, v => EstmStdTpcd = v);
  86. changed |= Set(estmStdDt, EstmStdDt, v => EstmStdDt = v);
  87. changed |= Set(estmStdprc, EstmStdprc, v => EstmStdprc = v);
  88. changed |= Set(rostCloseBeginDt, RostCloseBeginDt, v => RostCloseBeginDt = v);
  89. changed |= Set(rostCloseExpryDt, RostCloseExpryDt, v => RostCloseExpryDt = v);
  90. changed |= Set(xrgtDt, XrgtDt, v => XrgtDt = v);
  91. if (changed)
  92. {
  93. UpdatedAt = DateTime.UtcNow;
  94. }
  95. }
  96. private static string? Trimmed(string? value)
  97. {
  98. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  99. }
  100. private static bool Set<T>(T incoming, T current, Action<T> assign)
  101. {
  102. if (EqualityComparer<T>.Default.Equals(incoming, current))
  103. {
  104. return false;
  105. }
  106. assign(incoming);
  107. return true;
  108. }
  109. }