using System.ComponentModel.DataAnnotations;
namespace Domain.Entities.Stocks;
///
/// SEIBro 총회안건 정보 (getGmeetMeasureInfo) — 주총 안건·결과 (Wave 3).
/// 자연키 UNIQUE (IssucoCustno, RgtStdDt, AgendaSeq) — 한 회사·권리기준일·안건일련번호당 1행.
/// GeneralMeeting 과 동일 트리거(RGT_RACD 총회계열)로 함께 수집한다.
///
public class MeetingAgenda
{
[Key]
public int ID { get; private set; }
/// 발행회사 고객번호 (ISSUCO_CUSTNO)
public int IssucoCustno { get; private set; }
/// 발행회사발행체번호 (ISSUIN_NO)
public string? IssuinNo { get; private set; }
/// 권리기준일자 (RGT_STD_DT)
public DateOnly RgtStdDt { get; private set; }
/// 총회일자 (GMET_DT)
public DateOnly? GmetDt { get; private set; }
/// 총회종류코드 (GMET_KACD) — 001정기 002임시 003종류 009기타
public string? GmetKacd { get; private set; }
/// 안건일련번호 (AGENDA_SEQ)
public int AgendaSeq { get; private set; }
/// 안건표시번호 (AGENDA_XPRES_NO)
public string? AgendaXpresNo { get; private set; }
/// 안건조회순서 (AGENDA_SCH_SEQO)
public string? AgendaSchSeqo { get; private set; }
/// 안건번호 (AGENDA_NO)
public string? AgendaNo { get; private set; }
/// 세부안건번호 (DTAIL_AGENDA_NO)
public string? DtailAgendaNo { get; private set; }
/// 안건명 (AGENDA_NM)
public string AgendaNm { get; private set; } = default!;
/// 영문안건명 (ENG_AGENDA_NM)
public string? EngAgendaNm { get; private set; }
/// 세부안건명 (DTAIL_AGENDA_NM)
public string? DtailAgendaNm { get; private set; }
/// 세부영문안건명 (DTAIL_ENG_AGENDA_NM)
public string? DtailEngAgendaNm { get; private set; }
/// 투표방식구분코드 (VOTE_MANN_TPCD) — 1집중투표 4최다득표자선임 9해당없음
public string? VoteMannTpcd { get; private set; }
/// 총회결과구분코드 (GMET_RESULT_TPCD) — 1승인 2부결 3수정승인 4부분승인 5철회
public string? GmetResultTpcd { get; private set; }
public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
private MeetingAgenda() { }
public static MeetingAgenda Create(
int issucoCustno,
string? issuinNo,
DateOnly rgtStdDt,
DateOnly? gmetDt,
string? gmetKacd,
int agendaSeq,
string? agendaXpresNo,
string? agendaSchSeqo,
string? agendaNo,
string? dtailAgendaNo,
string agendaNm,
string? engAgendaNm,
string? dtailAgendaNm,
string? dtailEngAgendaNm,
string? voteMannTpcd,
string? gmetResultTpcd)
{
if (string.IsNullOrWhiteSpace(agendaNm))
{
throw new ArgumentException("agendaNm required", nameof(agendaNm));
}
return new MeetingAgenda
{
IssucoCustno = issucoCustno,
IssuinNo = Trimmed(issuinNo),
RgtStdDt = rgtStdDt,
GmetDt = gmetDt,
GmetKacd = Trimmed(gmetKacd),
AgendaSeq = agendaSeq,
AgendaXpresNo = Trimmed(agendaXpresNo),
AgendaSchSeqo = Trimmed(agendaSchSeqo),
AgendaNo = Trimmed(agendaNo),
DtailAgendaNo = Trimmed(dtailAgendaNo),
AgendaNm = agendaNm.Trim(),
EngAgendaNm = Trimmed(engAgendaNm),
DtailAgendaNm = Trimmed(dtailAgendaNm),
DtailEngAgendaNm = Trimmed(dtailEngAgendaNm),
VoteMannTpcd = Trimmed(voteMannTpcd),
GmetResultTpcd = Trimmed(gmetResultTpcd)
};
}
/// 재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키는 불변)
public void Update(
string? issuinNo,
DateOnly? gmetDt,
string? gmetKacd,
string? agendaXpresNo,
string? agendaSchSeqo,
string? agendaNo,
string? dtailAgendaNo,
string agendaNm,
string? engAgendaNm,
string? dtailAgendaNm,
string? dtailEngAgendaNm,
string? voteMannTpcd,
string? gmetResultTpcd)
{
var changed = false;
changed |= Set(Trimmed(issuinNo), IssuinNo, v => IssuinNo = v);
changed |= Set(gmetDt, GmetDt, v => GmetDt = v);
changed |= Set(Trimmed(gmetKacd), GmetKacd, v => GmetKacd = v);
changed |= Set(Trimmed(agendaXpresNo), AgendaXpresNo, v => AgendaXpresNo = v);
changed |= Set(Trimmed(agendaSchSeqo), AgendaSchSeqo, v => AgendaSchSeqo = v);
changed |= Set(Trimmed(agendaNo), AgendaNo, v => AgendaNo = v);
changed |= Set(Trimmed(dtailAgendaNo), DtailAgendaNo, v => DtailAgendaNo = v);
if (!string.IsNullOrWhiteSpace(agendaNm) && AgendaNm != agendaNm.Trim())
{
AgendaNm = agendaNm.Trim();
changed = true;
}
changed |= Set(Trimmed(engAgendaNm), EngAgendaNm, v => EngAgendaNm = v);
changed |= Set(Trimmed(dtailAgendaNm), DtailAgendaNm, v => DtailAgendaNm = v);
changed |= Set(Trimmed(dtailEngAgendaNm), DtailEngAgendaNm, v => DtailEngAgendaNm = v);
changed |= Set(Trimmed(voteMannTpcd), VoteMannTpcd, v => VoteMannTpcd = v);
changed |= Set(Trimmed(gmetResultTpcd), GmetResultTpcd, v => GmetResultTpcd = 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;
}
}