EstbMaster.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 전자단기사채 종목 정보 (getESTBInfo) — 발행·만기·일물·모집방법·신용등급 4사 (Wave 4). PK Isin.
  5. /// 신용등급 코드는 원문 문자열 저장(채권.md 공통표). rolling per-ISIN 대상 = ShortTermIssuance 발견분 중 SECN_TPCD=14(전단채).
  6. /// </summary>
  7. public class EstbMaster
  8. {
  9. /// <summary>종목코드 (ISIN) — PK</summary>
  10. [Key]
  11. [MaxLength(12)]
  12. public string Isin { get; private set; } = default!;
  13. /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
  14. public int? IssucoCustno { get; private set; }
  15. /// <summary>전자단기사채종류코드 (ESTB_KACD) — 1일반 2AB 3PF AB 4특수</summary>
  16. public string? EstbKacd { get; private set; }
  17. /// <summary>한글종목명 (KOR_SECN_NM)</summary>
  18. public string? KorSecnNm { get; private set; }
  19. /// <summary>발행통화코드 (ISSU_CUR_CD)</summary>
  20. public string? IssuCurCd { get; private set; }
  21. /// <summary>발행금액 (ISSU_AMT)</summary>
  22. public decimal? IssuAmt { get; private set; }
  23. /// <summary>모집방법코드 (RECU_WHCD) — 11공모 21사모 22CBO기초사모 23전문투자형사모 26경영참여형사모 99면제</summary>
  24. public string? RecuWhcd { get; private set; }
  25. /// <summary>발행일자 (ISSU_DT)</summary>
  26. public DateOnly? IssuDt { get; private set; }
  27. /// <summary>만기일자 (XPIR_DT)</summary>
  28. public DateOnly? XpirDt { get; private set; }
  29. /// <summary>일물 (DAYOBJ) — 만기일-발행일</summary>
  30. public string? Dayobj { get; private set; }
  31. /// <summary>원천징수여부 (WHOLD_YN) — Y징수 N면제</summary>
  32. public bool? WholdYn { get; private set; }
  33. /// <summary>보증여부 (GRORG_YN, Y/N)</summary>
  34. public bool? GrorgYn { get; private set; }
  35. /// <summary>KIS평가등급코드 (KIS_VALAT_GRD_CD) — 신용등급코드표 원문</summary>
  36. public string? KisValatGrdCd { get; private set; }
  37. /// <summary>NICE평가등급코드 (NICE_VALAT_GRD_CD) — 신용등급코드표 원문</summary>
  38. public string? NiceValatGrdCd { get; private set; }
  39. /// <summary>서울신용평가등급코드 (SCI_VALAT_GRD_CD) — 신용등급코드표 원문</summary>
  40. public string? SciValatGrdCd { get; private set; }
  41. /// <summary>한국기업평가등급코드 (KR_VALAT_GRD_CD) — 신용등급코드표 원문</summary>
  42. public string? KrValatGrdCd { get; private set; }
  43. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  44. private EstbMaster() { }
  45. public static EstbMaster Create(string isin, EstbMasterFields f)
  46. {
  47. if (string.IsNullOrWhiteSpace(isin))
  48. {
  49. throw new ArgumentException("isin required", nameof(isin));
  50. }
  51. var entity = new EstbMaster { Isin = isin.Trim() };
  52. entity.Apply(f);
  53. return entity;
  54. }
  55. /// <summary>재수집 반영 (PK Isin 은 불변) — 변경 시에만 UpdatedAt</summary>
  56. public void Update(EstbMasterFields f)
  57. {
  58. Apply(f);
  59. }
  60. private void Apply(EstbMasterFields f)
  61. {
  62. var changed = false;
  63. changed |= Set(f.IssucoCustno, IssucoCustno, v => IssucoCustno = v);
  64. changed |= Set(Trimmed(f.EstbKacd), EstbKacd, v => EstbKacd = v);
  65. changed |= Set(Trimmed(f.KorSecnNm), KorSecnNm, v => KorSecnNm = v);
  66. changed |= Set(Trimmed(f.IssuCurCd), IssuCurCd, v => IssuCurCd = v);
  67. changed |= Set(f.IssuAmt, IssuAmt, v => IssuAmt = v);
  68. changed |= Set(Trimmed(f.RecuWhcd), RecuWhcd, v => RecuWhcd = v);
  69. changed |= Set(f.IssuDt, IssuDt, v => IssuDt = v);
  70. changed |= Set(f.XpirDt, XpirDt, v => XpirDt = v);
  71. changed |= Set(Trimmed(f.Dayobj), Dayobj, v => Dayobj = v);
  72. changed |= Set(f.WholdYn, WholdYn, v => WholdYn = v);
  73. changed |= Set(f.GrorgYn, GrorgYn, v => GrorgYn = v);
  74. changed |= Set(Trimmed(f.KisValatGrdCd), KisValatGrdCd, v => KisValatGrdCd = v);
  75. changed |= Set(Trimmed(f.NiceValatGrdCd), NiceValatGrdCd, v => NiceValatGrdCd = v);
  76. changed |= Set(Trimmed(f.SciValatGrdCd), SciValatGrdCd, v => SciValatGrdCd = v);
  77. changed |= Set(Trimmed(f.KrValatGrdCd), KrValatGrdCd, v => KrValatGrdCd = v);
  78. if (changed)
  79. {
  80. UpdatedAt = DateTime.UtcNow;
  81. }
  82. }
  83. private static string? Trimmed(string? value)
  84. {
  85. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  86. }
  87. private static bool Set<T>(T incoming, T current, Action<T> assign)
  88. {
  89. if (EqualityComparer<T>.Default.Equals(incoming, current))
  90. {
  91. return false;
  92. }
  93. assign(incoming);
  94. return true;
  95. }
  96. }
  97. /// <summary>EstbMaster 필드 묶음 (getESTBInfo)</summary>
  98. public sealed record EstbMasterFields(
  99. int? IssucoCustno,
  100. string? EstbKacd,
  101. string? KorSecnNm,
  102. string? IssuCurCd,
  103. decimal? IssuAmt,
  104. string? RecuWhcd,
  105. DateOnly? IssuDt,
  106. DateOnly? XpirDt,
  107. string? Dayobj,
  108. bool? WholdYn,
  109. bool? GrorgYn,
  110. string? KisValatGrdCd,
  111. string? NiceValatGrdCd,
  112. string? SciValatGrdCd,
  113. string? KrValatGrdCd
  114. );