DerivAssetExercise.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 파생결합증권 기초자산 행사정보 (getAssetXrcInfo) — 행사기준비율·행사가격 (Wave 5). 자연키 UNIQUE (Isin, AssetSeq, XrcStdSeq).
  5. /// rolling per-ISIN(DerivMaster 있는 것). AssetSeq 로 DerivAsset 연계, 행사기준일련번호(XrcStdSeq)별 기준비율/행사가격 다수 행.
  6. /// ⚠️ 응답에 ISIN 이 없어(요청 파라미터로만 받음) 배치가 요청 ISIN 을 스탬핑한다.
  7. /// </summary>
  8. public class DerivAssetExercise
  9. {
  10. [Key]
  11. public int ID { get; private set; }
  12. /// <summary>종목코드 (ISIN, 스탬핑)</summary>
  13. public string Isin { get; private set; } = default!;
  14. /// <summary>자산일련번호 (ASSET_SEQ) — getAssetInfo 연계</summary>
  15. public int AssetSeq { get; private set; }
  16. /// <summary>행사기준일련번호 (XRC_STD_SEQ)</summary>
  17. public int XrcStdSeq { get; private set; }
  18. /// <summary>행사기준비율 % (XRC_STD_RATIO) — 기준가 대비</summary>
  19. public decimal? XrcStdRatio { get; private set; }
  20. /// <summary>행사가격 (XRC_PRICE)</summary>
  21. public decimal? XrcPrice { get; private set; }
  22. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  23. private DerivAssetExercise() { }
  24. public static DerivAssetExercise Create(string isin, int assetSeq, int xrcStdSeq, decimal? xrcStdRatio, decimal? xrcPrice)
  25. {
  26. if (string.IsNullOrWhiteSpace(isin))
  27. {
  28. throw new ArgumentException("isin required", nameof(isin));
  29. }
  30. return new DerivAssetExercise
  31. {
  32. Isin = isin.Trim(),
  33. AssetSeq = assetSeq,
  34. XrcStdSeq = xrcStdSeq,
  35. XrcStdRatio = xrcStdRatio,
  36. XrcPrice = xrcPrice
  37. };
  38. }
  39. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 Isin/AssetSeq/XrcStdSeq 은 불변)</summary>
  40. public void Update(decimal? xrcStdRatio, decimal? xrcPrice)
  41. {
  42. var changed = false;
  43. changed |= Set(xrcStdRatio, XrcStdRatio, v => XrcStdRatio = v);
  44. changed |= Set(xrcPrice, XrcPrice, v => XrcPrice = v);
  45. if (changed)
  46. {
  47. UpdatedAt = DateTime.UtcNow;
  48. }
  49. }
  50. private static bool Set<T>(T incoming, T current, Action<T> assign)
  51. {
  52. if (EqualityComparer<T>.Default.Equals(incoming, current))
  53. {
  54. return false;
  55. }
  56. assign(incoming);
  57. return true;
  58. }
  59. }