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;
}
}