ForeignCustodyNation.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 국가별 외화증권 보관현황 (getNationFrsecCusInfo) — KSD 를 통한 외화증권 보관금액(USD), 국가×종목구분별 (Wave 6). 자연키 UNIQUE (StdDt, NationCd, SecnTpcd).
  5. /// 서학개미 위젯용 국가별 외화증권 보관금액 추이의 소스. 응답 필드는 SecnTpcd·FrsecCusAmt 2종 — 배치가 STD_DT·NATION_CD 를 요청값으로 스탬핑한다.
  6. /// SecnTpcd 는 문자열 코드 그대로 저장 (71외화주식 72외화DR 73외화WRTS 74외화RGTS 75외화채권 76외화CD 77외화CP 78외화수익증권).
  7. /// </summary>
  8. public class ForeignCustodyNation
  9. {
  10. [Key]
  11. public int ID { get; private set; }
  12. /// <summary>기준일자 (STD_DT, 요청값 스탬핑)</summary>
  13. public DateOnly StdDt { get; private set; }
  14. /// <summary>국가코드 (NATION_CD, 요청값 스탬핑) — US/JP/HK/CN/E1 등 43종</summary>
  15. public string NationCd { get; private set; } = default!;
  16. /// <summary>종목구분코드 (SECN_TPCD) — 71외화주식~78외화수익증권</summary>
  17. public string SecnTpcd { get; private set; } = default!;
  18. /// <summary>외화증권보관금액 (FRSEC_CUS_AMT) — USD</summary>
  19. public decimal? FrsecCusAmt { get; private set; }
  20. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  21. private ForeignCustodyNation() { }
  22. public static ForeignCustodyNation Create(DateOnly stdDt, string nationCd, string secnTpcd, decimal? frsecCusAmt)
  23. {
  24. if (string.IsNullOrWhiteSpace(nationCd))
  25. {
  26. throw new ArgumentException("nationCd required", nameof(nationCd));
  27. }
  28. if (string.IsNullOrWhiteSpace(secnTpcd))
  29. {
  30. throw new ArgumentException("secnTpcd required", nameof(secnTpcd));
  31. }
  32. return new ForeignCustodyNation
  33. {
  34. StdDt = stdDt,
  35. NationCd = nationCd.Trim(),
  36. SecnTpcd = secnTpcd.Trim(),
  37. FrsecCusAmt = frsecCusAmt
  38. };
  39. }
  40. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 StdDt/NationCd/SecnTpcd 은 불변)</summary>
  41. public void Update(decimal? frsecCusAmt)
  42. {
  43. var changed = Set(frsecCusAmt, FrsecCusAmt, v => FrsecCusAmt = v);
  44. if (changed)
  45. {
  46. UpdatedAt = DateTime.UtcNow;
  47. }
  48. }
  49. private static bool Set<T>(T incoming, T current, Action<T> assign)
  50. {
  51. if (EqualityComparer<T>.Default.Equals(incoming, current))
  52. {
  53. return false;
  54. }
  55. assign(incoming);
  56. return true;
  57. }
  58. }