BondIssuance.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 채권 발행내역 (getBondIssuInfo) — 회사채·주식관련사채 발행종목 (Wave 4). 자연키 UNIQUE (Isin).
  5. /// BondMaster(getBondStatInfo) rolling 의 발견 소스 — 발행일(ISSU_DT) 날짜 스윕으로 신규 ISIN 을 찾는다.
  6. /// </summary>
  7. public class BondIssuance
  8. {
  9. [Key]
  10. public int ID { get; private set; }
  11. /// <summary>발행일자 (ISSU_DT)</summary>
  12. public DateOnly IssuDt { get; private set; }
  13. /// <summary>발행회사고객번호 (ISSUCO_CUSTNO)</summary>
  14. public int? IssucoCustno { get; private set; }
  15. /// <summary>발행회사 명칭 (ISSUCO_CUST_NM)</summary>
  16. public string? IssucoCustNm { get; private set; }
  17. /// <summary>종목코드 (ISIN)</summary>
  18. public string Isin { get; private set; } = default!;
  19. /// <summary>한글종목명 (KOR_SECN_NM)</summary>
  20. public string? KorSecnNm { get; private set; }
  21. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  22. private BondIssuance() { }
  23. public static BondIssuance Create(DateOnly issuDt, int? issucoCustno, string? issucoCustNm, string isin, string? korSecnNm)
  24. {
  25. if (string.IsNullOrWhiteSpace(isin))
  26. {
  27. throw new ArgumentException("isin required", nameof(isin));
  28. }
  29. return new BondIssuance
  30. {
  31. IssuDt = issuDt,
  32. IssucoCustno = issucoCustno,
  33. IssucoCustNm = Trimmed(issucoCustNm),
  34. Isin = isin.Trim(),
  35. KorSecnNm = Trimmed(korSecnNm)
  36. };
  37. }
  38. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 Isin 은 불변)</summary>
  39. public void Update(DateOnly issuDt, int? issucoCustno, string? issucoCustNm, string? korSecnNm)
  40. {
  41. var changed = false;
  42. changed |= Set(issuDt, IssuDt, v => IssuDt = v);
  43. changed |= Set(issucoCustno, IssucoCustno, v => IssucoCustno = v);
  44. changed |= Set(Trimmed(issucoCustNm), IssucoCustNm, v => IssucoCustNm = v);
  45. changed |= Set(Trimmed(korSecnNm), KorSecnNm, v => KorSecnNm = v);
  46. if (changed)
  47. {
  48. UpdatedAt = DateTime.UtcNow;
  49. }
  50. }
  51. private static string? Trimmed(string? value)
  52. {
  53. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  54. }
  55. private static bool Set<T>(T incoming, T current, Action<T> assign)
  56. {
  57. if (EqualityComparer<T>.Default.Equals(incoming, current))
  58. {
  59. return false;
  60. }
  61. assign(incoming);
  62. return true;
  63. }
  64. }