ConvertibleExercise.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 주식관련사채 행사내역 (getXrcStkOptionXrcInfo) — CB/BW/EB 권리행사 내역 (Wave 3).
  5. /// 날짜 스윕(권리행사일 RGT_STD_DT) → 권리행사일 window delete+insert 로 반영.
  6. /// 반환된 DISTINCT BondIsin 이 ConvertibleBondTarget(getXrcStkStatInfo)의 발견 소스가 된다.
  7. /// ⚠️ getXrcStkOptionXrcInfo 실샘플이 result="0"(0행) 이라 필드 매핑은 주식.md 스펙 기준 — 운영 첫 수집 시 로그로 확인 필요.
  8. /// </summary>
  9. public class ConvertibleExercise
  10. {
  11. [Key]
  12. public int ID { get; private set; }
  13. /// <summary>채권 종목코드 (BOND_ISIN)</summary>
  14. public string BondIsin { get; private set; } = default!;
  15. /// <summary>채권 한글종목명 (BOND_KOR_SECN_NM)</summary>
  16. public string? BondKorSecnNm { get; private set; }
  17. /// <summary>채권종류코드 (BOND_KIND_NM) — EB/CB/BW</summary>
  18. public string? BondKindNm { get; private set; }
  19. /// <summary>행사주식 종목코드 (XRC_STK_ISIN)</summary>
  20. public string? XrcStkIsin { get; private set; }
  21. /// <summary>행사주식명 (STK_KOR_SECN_NM)</summary>
  22. public string? StkKorSecnNm { get; private set; }
  23. /// <summary>권리행사일 (RGT_STD_DT)</summary>
  24. public DateOnly RgtStdDt { get; private set; }
  25. /// <summary>행사시작일 (XRC_POSS_BEGIN_DT)</summary>
  26. public DateOnly? XrcPossBeginDt { get; private set; }
  27. /// <summary>행사종료일 (XRC_POSS_EXPRY_DT)</summary>
  28. public DateOnly? XrcPossExpryDt { get; private set; }
  29. /// <summary>행사금액 (XRC_AMT)</summary>
  30. public decimal? XrcAmt { get; private set; }
  31. /// <summary>행사주수 (XRC_QTY)</summary>
  32. public decimal? XrcQty { get; private set; }
  33. /// <summary>행사가격 (XRC_PRICE)</summary>
  34. public decimal? XrcPrice { get; private set; }
  35. /// <summary>주식상장일 (LIST_DT)</summary>
  36. public DateOnly? ListDt { get; private set; }
  37. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  38. private ConvertibleExercise() { }
  39. public static ConvertibleExercise Create(
  40. string bondIsin,
  41. string? bondKorSecnNm,
  42. string? bondKindNm,
  43. string? xrcStkIsin,
  44. string? stkKorSecnNm,
  45. DateOnly rgtStdDt,
  46. DateOnly? xrcPossBeginDt,
  47. DateOnly? xrcPossExpryDt,
  48. decimal? xrcAmt,
  49. decimal? xrcQty,
  50. decimal? xrcPrice,
  51. DateOnly? listDt)
  52. {
  53. if (string.IsNullOrWhiteSpace(bondIsin))
  54. {
  55. throw new ArgumentException("bondIsin required", nameof(bondIsin));
  56. }
  57. return new ConvertibleExercise
  58. {
  59. BondIsin = bondIsin.Trim(),
  60. BondKorSecnNm = Trimmed(bondKorSecnNm),
  61. BondKindNm = Trimmed(bondKindNm),
  62. XrcStkIsin = Trimmed(xrcStkIsin),
  63. StkKorSecnNm = Trimmed(stkKorSecnNm),
  64. RgtStdDt = rgtStdDt,
  65. XrcPossBeginDt = xrcPossBeginDt,
  66. XrcPossExpryDt = xrcPossExpryDt,
  67. XrcAmt = xrcAmt,
  68. XrcQty = xrcQty,
  69. XrcPrice = xrcPrice,
  70. ListDt = listDt
  71. };
  72. }
  73. private static string? Trimmed(string? value)
  74. {
  75. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  76. }
  77. }