| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Stocks;
- /// <summary>
- /// SEIBro 총회일정 정보 (getGmeetInfo) — 주총 일정·장소·전자투표 (Wave 3).
- /// 자연키 UNIQUE (IssucoCustno, RgtStdDt, GmetKacd) — 한 회사·권리기준일·총회종류당 1행.
- /// 이벤트 구동: RightsBaseDate(getStddtInfo 적재) 의 RGT_RACD∈{001,002,003,009} 인 (회사번호, 기준일)을 트리거로 수집한다.
- /// </summary>
- public class GeneralMeeting
- {
- [Key]
- public int ID { get; private set; }
- /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
- public int IssucoCustno { get; private set; }
- /// <summary>발행회사발행체번호 (ISSUIN_NO)</summary>
- public string? IssuinNo { get; private set; }
- /// <summary>총회종류코드 (GMET_KACD) — 001정기 002임시 003종류 009기타</summary>
- public string GmetKacd { get; private set; } = default!;
- /// <summary>권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)</summary>
- public string? RgtRsnDetailSortCd { get; private set; }
- /// <summary>명부폐쇄시작일자 (ROST_CLOSE_BEGIN_DT)</summary>
- public DateOnly? RostCloseBeginDt { get; private set; }
- /// <summary>명부폐쇄종료일자 (ROST_CLOSE_EXPRY_DT)</summary>
- public DateOnly? RostCloseExpryDt { get; private set; }
- /// <summary>총회개최여부 (GMET_OMEET_YN, Y/N)</summary>
- public bool? GmetOmeetYn { get; private set; }
- /// <summary>총회장소구분코드 (GMET_PLACE_TPCD) — 1서울 2지방 3해당없음</summary>
- public string? GmetPlaceTpcd { get; private set; }
- /// <summary>이사회결의공시일자 (COUNCL_DTERMIN_PUBN_DT)</summary>
- public DateOnly? CouncilDterminPubnDt { get; private set; }
- /// <summary>총회장소 (GMET_PLACE)</summary>
- public string? GmetPlace { get; private set; }
- /// <summary>주식매수청구관련여부 (STK_BUYREQ_RL_YN, Y/N)</summary>
- public bool? StkBuyreqRlYn { get; private set; }
- /// <summary>권리기준일자 (RGT_STD_DT)</summary>
- public DateOnly RgtStdDt { get; private set; }
- /// <summary>총회일자 (GMET_DT)</summary>
- public DateOnly? GmetDt { get; private set; }
- /// <summary>총회시각 (GMET_TTM) — HHmm 문자 (예 0900)</summary>
- public string? GmetTtm { get; private set; }
- /// <summary>통지시한일자 (NOTC_DLINE_DT)</summary>
- public DateOnly? NotcDlineDt { get; private set; }
- /// <summary>연기여부 (DFER_YN, Y/N)</summary>
- public bool? DferYn { get; private set; }
- /// <summary>전자투표 적용여부 (EVOTE_YN, Y/N)</summary>
- public bool? EvoteYn { get; private set; }
- /// <summary>전자증권 여부 (ELTSC_YN, Y/N)</summary>
- public bool? IsElectronicSecurity { get; private set; }
- public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
- private GeneralMeeting() { }
- public static GeneralMeeting Create(
- int issucoCustno,
- string? issuinNo,
- string gmetKacd,
- string? rgtRsnDetailSortCd,
- DateOnly? rostCloseBeginDt,
- DateOnly? rostCloseExpryDt,
- bool? gmetOmeetYn,
- string? gmetPlaceTpcd,
- DateOnly? councilDterminPubnDt,
- string? gmetPlace,
- bool? stkBuyreqRlYn,
- DateOnly rgtStdDt,
- DateOnly? gmetDt,
- string? gmetTtm,
- DateOnly? notcDlineDt,
- bool? dferYn,
- bool? evoteYn,
- bool? isElectronicSecurity)
- {
- if (string.IsNullOrWhiteSpace(gmetKacd))
- {
- throw new ArgumentException("gmetKacd required", nameof(gmetKacd));
- }
- return new GeneralMeeting
- {
- IssucoCustno = issucoCustno,
- IssuinNo = Trimmed(issuinNo),
- GmetKacd = gmetKacd.Trim(),
- RgtRsnDetailSortCd = Trimmed(rgtRsnDetailSortCd),
- RostCloseBeginDt = rostCloseBeginDt,
- RostCloseExpryDt = rostCloseExpryDt,
- GmetOmeetYn = gmetOmeetYn,
- GmetPlaceTpcd = Trimmed(gmetPlaceTpcd),
- CouncilDterminPubnDt = councilDterminPubnDt,
- GmetPlace = Trimmed(gmetPlace),
- StkBuyreqRlYn = stkBuyreqRlYn,
- RgtStdDt = rgtStdDt,
- GmetDt = gmetDt,
- GmetTtm = Trimmed(gmetTtm),
- NotcDlineDt = notcDlineDt,
- DferYn = dferYn,
- EvoteYn = evoteYn,
- IsElectronicSecurity = isElectronicSecurity
- };
- }
- /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키는 불변)</summary>
- public void Update(
- string? issuinNo,
- string? rgtRsnDetailSortCd,
- DateOnly? rostCloseBeginDt,
- DateOnly? rostCloseExpryDt,
- bool? gmetOmeetYn,
- string? gmetPlaceTpcd,
- DateOnly? councilDterminPubnDt,
- string? gmetPlace,
- bool? stkBuyreqRlYn,
- DateOnly? gmetDt,
- string? gmetTtm,
- DateOnly? notcDlineDt,
- bool? dferYn,
- bool? evoteYn,
- bool? isElectronicSecurity)
- {
- var changed = false;
- changed |= Set(Trimmed(issuinNo), IssuinNo, v => IssuinNo = v);
- changed |= Set(Trimmed(rgtRsnDetailSortCd), RgtRsnDetailSortCd, v => RgtRsnDetailSortCd = v);
- changed |= Set(rostCloseBeginDt, RostCloseBeginDt, v => RostCloseBeginDt = v);
- changed |= Set(rostCloseExpryDt, RostCloseExpryDt, v => RostCloseExpryDt = v);
- changed |= Set(gmetOmeetYn, GmetOmeetYn, v => GmetOmeetYn = v);
- changed |= Set(Trimmed(gmetPlaceTpcd), GmetPlaceTpcd, v => GmetPlaceTpcd = v);
- changed |= Set(councilDterminPubnDt, CouncilDterminPubnDt, v => CouncilDterminPubnDt = v);
- changed |= Set(Trimmed(gmetPlace), GmetPlace, v => GmetPlace = v);
- changed |= Set(stkBuyreqRlYn, StkBuyreqRlYn, v => StkBuyreqRlYn = v);
- changed |= Set(gmetDt, GmetDt, v => GmetDt = v);
- changed |= Set(Trimmed(gmetTtm), GmetTtm, v => GmetTtm = v);
- changed |= Set(notcDlineDt, NotcDlineDt, v => NotcDlineDt = v);
- changed |= Set(dferYn, DferYn, v => DferYn = v);
- changed |= Set(evoteYn, EvoteYn, v => EvoteYn = v);
- changed |= Set(isElectronicSecurity, IsElectronicSecurity, v => IsElectronicSecurity = v);
- if (changed)
- {
- UpdatedAt = DateTime.UtcNow;
- }
- }
- private static string? Trimmed(string? value)
- {
- return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
- }
- private static bool Set<T>(T incoming, T current, Action<T> assign)
- {
- if (EqualityComparer<T>.Default.Equals(incoming, current))
- {
- return false;
- }
- assign(incoming);
- return true;
- }
- }
|