DerivRedemption.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 파생결합증권 상환종목 (getRedIsinInfo) — 상환일별 상환종목·수량 (Wave 5). 자연키 UNIQUE (Isin, RedDt, DerisecExerTpcd).
  5. /// 상환일(RED_DT) × 종류(SECN_KACD{4101/4102/4301/4302}) 날짜 스윕으로 수집. 응답 필드는 Isin·DerisecExerTpcd·RedQty 3종.
  6. /// 응답에 없는 RedDt·SecnKacd 는 요청 파라미터를 배치가 스탬핑한다. 같은 상환일에 만기·조기(2/3) 두 건 가능하여 (Isin, RedDt, DerisecExerTpcd) 로 구분.
  7. /// </summary>
  8. public class DerivRedemption
  9. {
  10. [Key]
  11. public int ID { get; private set; }
  12. /// <summary>종목코드 (ISIN)</summary>
  13. public string Isin { get; private set; } = default!;
  14. /// <summary>파생증권권리행사구분코드 (DERISEC_EXER_TPCD) — 2만기상환 3조기상환</summary>
  15. public string DerisecExerTpcd { get; private set; } = default!;
  16. /// <summary>상환수량 (RED_QTY)</summary>
  17. public decimal? RedQty { get; private set; }
  18. /// <summary>상환일자 (RED_DT, 요청값 스탬핑)</summary>
  19. public DateOnly RedDt { get; private set; }
  20. /// <summary>종목종류코드 (SECN_KACD, 요청값 스탬핑) — 4101ELS 4102ELB 4301DLS 4302DLB</summary>
  21. public string SecnKacd { get; private set; } = default!;
  22. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  23. private DerivRedemption() { }
  24. public static DerivRedemption Create(string isin, string derisecExerTpcd, decimal? redQty, DateOnly redDt, string secnKacd)
  25. {
  26. if (string.IsNullOrWhiteSpace(isin))
  27. {
  28. throw new ArgumentException("isin required", nameof(isin));
  29. }
  30. return new DerivRedemption
  31. {
  32. Isin = isin.Trim(),
  33. DerisecExerTpcd = derisecExerTpcd.Trim(),
  34. RedQty = redQty,
  35. RedDt = redDt,
  36. SecnKacd = secnKacd.Trim()
  37. };
  38. }
  39. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 Isin/RedDt/DerisecExerTpcd 은 불변)</summary>
  40. public void Update(decimal? redQty, string secnKacd)
  41. {
  42. var changed = false;
  43. changed |= Set(redQty, RedQty, v => RedQty = v);
  44. changed |= Set(secnKacd.Trim(), SecnKacd, v => SecnKacd = v);
  45. if (changed)
  46. {
  47. UpdatedAt = DateTime.UtcNow;
  48. }
  49. }
  50. private static bool Set<T>(T incoming, T current, Action<T> assign)
  51. {
  52. if (EqualityComparer<T>.Default.Equals(incoming, current))
  53. {
  54. return false;
  55. }
  56. assign(incoming);
  57. return true;
  58. }
  59. }