DerivIssuance.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 파생결합증권 발행내역 (getDerivCombiIssuInfo) — ELS/ELB/DLS/DLB 발행종목 (Wave 5). 자연키 UNIQUE (Isin).
  5. /// DerivMaster(getDerivCombiIsinInfo) rolling 의 발견 소스 — 발행일(ISSU_DT) × 종류(SECN_KACD{4101/4102/4301/4302}) 날짜 스윕으로 신규 ISIN 을 찾는다.
  6. /// 응답에 없는 SecnKacd·IssuDt 는 요청 파라미터를 배치가 스탬핑한다(응답 필드는 Isin·KorSecnNm·IssucoCustno 3종뿐).
  7. /// </summary>
  8. public class DerivIssuance
  9. {
  10. [Key]
  11. public int ID { get; private set; }
  12. /// <summary>종목코드 (ISIN)</summary>
  13. public string Isin { get; private set; } = default!;
  14. /// <summary>한글종목명 (KOR_SECN_NM)</summary>
  15. public string? KorSecnNm { get; private set; }
  16. /// <summary>발행회사고객번호 (ISSUCO_CUSTNO)</summary>
  17. public int? IssucoCustno { get; private set; }
  18. /// <summary>종목종류코드 (SECN_KACD, 요청값 스탬핑) — 4101ELS 4102ELB 4301DLS 4302DLB</summary>
  19. public string SecnKacd { get; private set; } = default!;
  20. /// <summary>발행일자 (ISSU_DT, 요청값 스탬핑)</summary>
  21. public DateOnly IssuDt { get; private set; }
  22. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  23. private DerivIssuance() { }
  24. public static DerivIssuance Create(string isin, string? korSecnNm, int? issucoCustno, string secnKacd, DateOnly issuDt)
  25. {
  26. if (string.IsNullOrWhiteSpace(isin))
  27. {
  28. throw new ArgumentException("isin required", nameof(isin));
  29. }
  30. return new DerivIssuance
  31. {
  32. Isin = isin.Trim(),
  33. KorSecnNm = Trimmed(korSecnNm),
  34. IssucoCustno = issucoCustno,
  35. SecnKacd = secnKacd.Trim(),
  36. IssuDt = issuDt
  37. };
  38. }
  39. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 Isin 은 불변)</summary>
  40. public void Update(string? korSecnNm, int? issucoCustno, string secnKacd, DateOnly issuDt)
  41. {
  42. var changed = false;
  43. changed |= Set(Trimmed(korSecnNm), KorSecnNm, v => KorSecnNm = v);
  44. changed |= Set(issucoCustno, IssucoCustno, v => IssucoCustno = v);
  45. changed |= Set(secnKacd.Trim(), SecnKacd, v => SecnKacd = v);
  46. changed |= Set(issuDt, IssuDt, v => IssuDt = v);
  47. if (changed)
  48. {
  49. UpdatedAt = DateTime.UtcNow;
  50. }
  51. }
  52. private static string? Trimmed(string? value)
  53. {
  54. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  55. }
  56. private static bool Set<T>(T incoming, T current, Action<T> assign)
  57. {
  58. if (EqualityComparer<T>.Default.Equals(incoming, current))
  59. {
  60. return false;
  61. }
  62. assign(incoming);
  63. return true;
  64. }
  65. }