CorpNameChange.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 상호변경 정보 (getFmnmAltInfo) — 사명 변경 전후·혼용유통기간 (Wave 3).
  5. /// 자연키 UNIQUE (IssucoCustno, RgtStdDt) — 한 회사·권리기준일당 1행.
  6. /// 이벤트 구동: RightsBaseDate 의 RGT_RACD=204(상호변경) 인 (회사번호, 기준일)을 트리거로 수집한다.
  7. /// </summary>
  8. public class CorpNameChange
  9. {
  10. [Key]
  11. public int ID { get; private set; }
  12. /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
  13. public int IssucoCustno { get; private set; }
  14. /// <summary>권리기준일자 (RGT_STD_DT)</summary>
  15. public DateOnly RgtStdDt { get; private set; }
  16. /// <summary>변경전상호(국문, FMNM_BFALT_KOR_NM)</summary>
  17. public string? FmnmBfaltKorNm { get; private set; }
  18. /// <summary>변경전상호(영문, FMNM_BFALT_ENG_NM)</summary>
  19. public string? FmnmBfaltEngNm { get; private set; }
  20. /// <summary>변경후상호(국문, FMNM_ALT_KOR_NM)</summary>
  21. public string? FmnmAltKorNm { get; private set; }
  22. /// <summary>변경후상호(영문, FMNM_ALT_ENG_NM)</summary>
  23. public string? FmnmAltEngNm { get; private set; }
  24. /// <summary>혼용유통시작일자 (MIXUS_CIRCL_BEGIN_DT)</summary>
  25. public DateOnly? MixusCirclBeginDt { get; private set; }
  26. /// <summary>혼용유통종료일자 (MIXUS_CIRCL_EXPRY_DT)</summary>
  27. public DateOnly? MixusCirclExpryDt { get; private set; }
  28. /// <summary>단일유통일자 (UNI_CIRCL_DT)</summary>
  29. public DateOnly? UniCirclDt { get; private set; }
  30. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  31. private CorpNameChange() { }
  32. public static CorpNameChange Create(
  33. int issucoCustno,
  34. DateOnly rgtStdDt,
  35. string? fmnmBfaltKorNm,
  36. string? fmnmBfaltEngNm,
  37. string? fmnmAltKorNm,
  38. string? fmnmAltEngNm,
  39. DateOnly? mixusCirclBeginDt,
  40. DateOnly? mixusCirclExpryDt,
  41. DateOnly? uniCirclDt)
  42. {
  43. return new CorpNameChange
  44. {
  45. IssucoCustno = issucoCustno,
  46. RgtStdDt = rgtStdDt,
  47. FmnmBfaltKorNm = Trimmed(fmnmBfaltKorNm),
  48. FmnmBfaltEngNm = Trimmed(fmnmBfaltEngNm),
  49. FmnmAltKorNm = Trimmed(fmnmAltKorNm),
  50. FmnmAltEngNm = Trimmed(fmnmAltEngNm),
  51. MixusCirclBeginDt = mixusCirclBeginDt,
  52. MixusCirclExpryDt = mixusCirclExpryDt,
  53. UniCirclDt = uniCirclDt
  54. };
  55. }
  56. /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키는 불변)</summary>
  57. public void Update(
  58. string? fmnmBfaltKorNm,
  59. string? fmnmBfaltEngNm,
  60. string? fmnmAltKorNm,
  61. string? fmnmAltEngNm,
  62. DateOnly? mixusCirclBeginDt,
  63. DateOnly? mixusCirclExpryDt,
  64. DateOnly? uniCirclDt)
  65. {
  66. var changed = false;
  67. changed |= Set(Trimmed(fmnmBfaltKorNm), FmnmBfaltKorNm, v => FmnmBfaltKorNm = v);
  68. changed |= Set(Trimmed(fmnmBfaltEngNm), FmnmBfaltEngNm, v => FmnmBfaltEngNm = v);
  69. changed |= Set(Trimmed(fmnmAltKorNm), FmnmAltKorNm, v => FmnmAltKorNm = v);
  70. changed |= Set(Trimmed(fmnmAltEngNm), FmnmAltEngNm, v => FmnmAltEngNm = v);
  71. changed |= Set(mixusCirclBeginDt, MixusCirclBeginDt, v => MixusCirclBeginDt = v);
  72. changed |= Set(mixusCirclExpryDt, MixusCirclExpryDt, v => MixusCirclExpryDt = v);
  73. changed |= Set(uniCirclDt, UniCirclDt, v => UniCirclDt = v);
  74. if (changed)
  75. {
  76. UpdatedAt = DateTime.UtcNow;
  77. }
  78. }
  79. private static string? Trimmed(string? value)
  80. {
  81. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  82. }
  83. private static bool Set<T>(T incoming, T current, Action<T> assign)
  84. {
  85. if (EqualityComparer<T>.Default.Equals(incoming, current))
  86. {
  87. return false;
  88. }
  89. assign(incoming);
  90. return true;
  91. }
  92. }