using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// SEIBro 상호변경 정보 (getFmnmAltInfo) — 사명 변경 전후·혼용유통기간 (Wave 3). /// 자연키 UNIQUE (IssucoCustno, RgtStdDt) — 한 회사·권리기준일당 1행. /// 이벤트 구동: RightsBaseDate 의 RGT_RACD=204(상호변경) 인 (회사번호, 기준일)을 트리거로 수집한다. /// public class CorpNameChange { [Key] public int ID { get; private set; } /// 발행회사 고객번호 (ISSUCO_CUSTNO) public int IssucoCustno { get; private set; } /// 권리기준일자 (RGT_STD_DT) public DateOnly RgtStdDt { get; private set; } /// 변경전상호(국문, FMNM_BFALT_KOR_NM) public string? FmnmBfaltKorNm { get; private set; } /// 변경전상호(영문, FMNM_BFALT_ENG_NM) public string? FmnmBfaltEngNm { get; private set; } /// 변경후상호(국문, FMNM_ALT_KOR_NM) public string? FmnmAltKorNm { get; private set; } /// 변경후상호(영문, FMNM_ALT_ENG_NM) public string? FmnmAltEngNm { get; private set; } /// 혼용유통시작일자 (MIXUS_CIRCL_BEGIN_DT) public DateOnly? MixusCirclBeginDt { get; private set; } /// 혼용유통종료일자 (MIXUS_CIRCL_EXPRY_DT) public DateOnly? MixusCirclExpryDt { get; private set; } /// 단일유통일자 (UNI_CIRCL_DT) public DateOnly? UniCirclDt { get; private set; } public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow; private CorpNameChange() { } public static CorpNameChange Create( int issucoCustno, DateOnly rgtStdDt, string? fmnmBfaltKorNm, string? fmnmBfaltEngNm, string? fmnmAltKorNm, string? fmnmAltEngNm, DateOnly? mixusCirclBeginDt, DateOnly? mixusCirclExpryDt, DateOnly? uniCirclDt) { return new CorpNameChange { IssucoCustno = issucoCustno, RgtStdDt = rgtStdDt, FmnmBfaltKorNm = Trimmed(fmnmBfaltKorNm), FmnmBfaltEngNm = Trimmed(fmnmBfaltEngNm), FmnmAltKorNm = Trimmed(fmnmAltKorNm), FmnmAltEngNm = Trimmed(fmnmAltEngNm), MixusCirclBeginDt = mixusCirclBeginDt, MixusCirclExpryDt = mixusCirclExpryDt, UniCirclDt = uniCirclDt }; } /// 재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키는 불변) public void Update( string? fmnmBfaltKorNm, string? fmnmBfaltEngNm, string? fmnmAltKorNm, string? fmnmAltEngNm, DateOnly? mixusCirclBeginDt, DateOnly? mixusCirclExpryDt, DateOnly? uniCirclDt) { var changed = false; changed |= Set(Trimmed(fmnmBfaltKorNm), FmnmBfaltKorNm, v => FmnmBfaltKorNm = v); changed |= Set(Trimmed(fmnmBfaltEngNm), FmnmBfaltEngNm, v => FmnmBfaltEngNm = v); changed |= Set(Trimmed(fmnmAltKorNm), FmnmAltKorNm, v => FmnmAltKorNm = v); changed |= Set(Trimmed(fmnmAltEngNm), FmnmAltEngNm, v => FmnmAltEngNm = v); changed |= Set(mixusCirclBeginDt, MixusCirclBeginDt, v => MixusCirclBeginDt = v); changed |= Set(mixusCirclExpryDt, MixusCirclExpryDt, v => MixusCirclExpryDt = v); changed |= Set(uniCirclDt, UniCirclDt, v => UniCirclDt = v); if (changed) { UpdatedAt = DateTime.UtcNow; } } private static string? Trimmed(string? value) { return string.IsNullOrWhiteSpace(value) ? null : value.Trim(); } private static bool Set(T incoming, T current, Action assign) { if (EqualityComparer.Default.Equals(incoming, current)) { return false; } assign(incoming); return true; } }