ShortTermIssuance.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 단기금융증권 발행내역 (getShortmIssuInfo) — CD/CP/전단채 발행종목 (Wave 4). 자연키 UNIQUE (Isin).
  5. /// CdMaster/CpMaster/EstbMaster rolling 의 발견 소스 — 발행일(ISSU_DT) × 종목구분(SECN_TPCD{12,13,14}) 날짜 스윕.
  6. /// 응답에 없는 SecnTpcd·IssuDt 는 요청 파라미터를 배치가 스탬핑한다.
  7. /// </summary>
  8. public class ShortTermIssuance
  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>발행회사 명칭 (ISSUCO_CUST_NM)</summary>
  19. public string? IssucoCustNm { get; private set; }
  20. /// <summary>종목구분코드 (SECN_TPCD, 요청값 스탬핑) — 12어음(CP) 13CD 14전자단기사채</summary>
  21. public string SecnTpcd { get; private set; } = default!;
  22. /// <summary>발행일자 (ISSU_DT, 요청값 스탬핑)</summary>
  23. public DateOnly IssuDt { get; private set; }
  24. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  25. private ShortTermIssuance() { }
  26. public static ShortTermIssuance Create(string isin, string? korSecnNm, int? issucoCustno, string? issucoCustNm, string secnTpcd, DateOnly issuDt)
  27. {
  28. if (string.IsNullOrWhiteSpace(isin))
  29. {
  30. throw new ArgumentException("isin required", nameof(isin));
  31. }
  32. if (string.IsNullOrWhiteSpace(secnTpcd))
  33. {
  34. throw new ArgumentException("secnTpcd required", nameof(secnTpcd));
  35. }
  36. return new ShortTermIssuance
  37. {
  38. Isin = isin.Trim(),
  39. KorSecnNm = Trimmed(korSecnNm),
  40. IssucoCustno = issucoCustno,
  41. IssucoCustNm = Trimmed(issucoCustNm),
  42. SecnTpcd = secnTpcd.Trim(),
  43. IssuDt = issuDt
  44. };
  45. }
  46. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 Isin 은 불변)</summary>
  47. public void Update(string? korSecnNm, int? issucoCustno, string? issucoCustNm, string secnTpcd, DateOnly issuDt)
  48. {
  49. var changed = false;
  50. changed |= Set(Trimmed(korSecnNm), KorSecnNm, v => KorSecnNm = v);
  51. changed |= Set(issucoCustno, IssucoCustno, v => IssucoCustno = v);
  52. changed |= Set(Trimmed(issucoCustNm), IssucoCustNm, v => IssucoCustNm = v);
  53. changed |= Set(secnTpcd.Trim(), SecnTpcd, v => SecnTpcd = v);
  54. changed |= Set(issuDt, IssuDt, v => IssuDt = v);
  55. if (changed)
  56. {
  57. UpdatedAt = DateTime.UtcNow;
  58. }
  59. }
  60. private static string? Trimmed(string? value)
  61. {
  62. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  63. }
  64. private static bool Set<T>(T incoming, T current, Action<T> assign)
  65. {
  66. if (EqualityComparer<T>.Default.Equals(incoming, current))
  67. {
  68. return false;
  69. }
  70. assign(incoming);
  71. return true;
  72. }
  73. }