SriBond.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// 사회책임투자채권(SRI) 정보 스냅샷 (KRX OpenAPI esg/sri_bond_info) — (Code, TradeDate) UNIQUE.
  5. /// 채권 일별매매(BondDailyTrade)와 달리 가격/거래량이 아니라 발행 정보(발행기관·채권종류·발행일·상환일·표면이자율·발행금액 등) 레지스트리다.
  6. /// 응답이 basDd 파라미터로 그날 상장된 SRI 채권 전량을 반환하므로(스냅샷) 종목마다 여러 basDd 행이 생긴다 → (Code=표준코드, TradeDate=기준일자)로 UQ.
  7. /// 표준코드(ISU_CD)는 12자리 ISIN. 날짜(LIST_DD/ISU_DD/REDMPT_DD)는 yyyyMMdd 미제공/오류 시 null. 금액은 원 단위 long, 표면이자율은 decimal(9,5)%.
  8. /// </summary>
  9. public class SriBond
  10. {
  11. [Key]
  12. public long ID { get; private set; }
  13. /// <summary>표준코드 (ISU_CD) — 12자리 ISIN. UQ 키의 일부</summary>
  14. public string Code { get; private set; } = default!;
  15. /// <summary>기준일자 (BAS_DD) — 스냅샷 일자. UQ 키의 일부</summary>
  16. public DateOnly TradeDate { get; private set; }
  17. /// <summary>발행기관 (ISUR_NM)</summary>
  18. public string IssuerName { get; private set; } = default!;
  19. /// <summary>채권종류 (SRI_BND_TP_NM, 예: "녹색채권"/"사회적채권"/"지속가능채권")</summary>
  20. public string SriBondType { get; private set; } = default!;
  21. /// <summary>종목명 (ISU_NM)</summary>
  22. public string Name { get; private set; } = default!;
  23. /// <summary>상장일 (LIST_DD) — 미제공 시 null</summary>
  24. public DateOnly? ListDate { get; private set; }
  25. /// <summary>발행일 (ISU_DD) — 미제공 시 null</summary>
  26. public DateOnly? IssueDate { get; private set; }
  27. /// <summary>상환일 (REDMPT_DD) — 미제공 시 null</summary>
  28. public DateOnly? RedemptionDate { get; private set; }
  29. /// <summary>표면이자율 % (ISU_RT) — 미제공 시 null</summary>
  30. public decimal? CouponRate { get; private set; }
  31. /// <summary>발행금액 (ISU_AMT, 원)</summary>
  32. public long IssueAmount { get; private set; }
  33. /// <summary>상장금액 (LIST_AMT, 원)</summary>
  34. public long ListAmount { get; private set; }
  35. /// <summary>채권유형 (BND_TP_NM, 예: "회사채") — 미제공 시 null</summary>
  36. public string? BondType { get; private set; }
  37. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  38. private SriBond() { }
  39. public static SriBond Create(
  40. string code,
  41. DateOnly tradeDate,
  42. string issuerName,
  43. string sriBondType,
  44. string name,
  45. DateOnly? listDate,
  46. DateOnly? issueDate,
  47. DateOnly? redemptionDate,
  48. decimal? couponRate,
  49. long issueAmount,
  50. long listAmount,
  51. string? bondType
  52. ) {
  53. if (string.IsNullOrWhiteSpace(code))
  54. {
  55. throw new ArgumentException("code required", nameof(code));
  56. }
  57. if (string.IsNullOrWhiteSpace(issuerName))
  58. {
  59. throw new ArgumentException("issuerName required", nameof(issuerName));
  60. }
  61. if (string.IsNullOrWhiteSpace(name))
  62. {
  63. throw new ArgumentException("name required", nameof(name));
  64. }
  65. return new SriBond
  66. {
  67. Code = code.Trim(),
  68. TradeDate = tradeDate,
  69. IssuerName = issuerName.Trim(),
  70. SriBondType = sriBondType.Trim(),
  71. Name = name.Trim(),
  72. ListDate = listDate,
  73. IssueDate = issueDate,
  74. RedemptionDate = redemptionDate,
  75. CouponRate = couponRate,
  76. IssueAmount = issueAmount,
  77. ListAmount = listAmount,
  78. BondType = bondType
  79. };
  80. }
  81. /// <summary>동일 (Code, TradeDate) 재수집 시 값 갱신 (upsert)</summary>
  82. public void Update(
  83. string issuerName,
  84. string sriBondType,
  85. string name,
  86. DateOnly? listDate,
  87. DateOnly? issueDate,
  88. DateOnly? redemptionDate,
  89. decimal? couponRate,
  90. long issueAmount,
  91. long listAmount,
  92. string? bondType
  93. ) {
  94. IssuerName = issuerName.Trim();
  95. SriBondType = sriBondType.Trim();
  96. Name = name.Trim();
  97. ListDate = listDate;
  98. IssueDate = issueDate;
  99. RedemptionDate = redemptionDate;
  100. CouponRate = couponRate;
  101. IssueAmount = issueAmount;
  102. ListAmount = listAmount;
  103. BondType = bondType;
  104. }
  105. }