| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Stocks;
- /// <summary>
- /// SEIBro 권리기준일 (getStddtInfo) — 발행회사별 권리 발생 기준일·사유 (Wave 1).
- /// 자연키 UNIQUE (IssucoCustno, RgtStdDt, RgtRacd, RgtRsnDetailSortCd).
- /// Wave 3(총회·상호변경·단주 등)의 이벤트 발견 소스 — RGT_RACD 로 후속 기업행위 API 호출 대상을 판별한다.
- /// (예: 001/002/003/009 → 총회, 204 → 상호변경)
- /// </summary>
- public class RightsBaseDate
- {
- [Key]
- public int ID { get; private set; }
- /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
- public int IssucoCustno { get; private set; }
- /// <summary>대표종목명 (REP_SECN_NM)</summary>
- public string RepSecnNm { get; private set; } = default!;
- /// <summary>권리기준일자 (RGT_STD_DT)</summary>
- public DateOnly RgtStdDt { get; private set; }
- /// <summary>권리사유코드 (RGT_RACD) — 001정기총회 … 907이익소각</summary>
- public string RgtRacd { get; private set; } = default!;
- /// <summary>권리사유명 (RGT_RACD_NM)</summary>
- public string? RgtRacdNm { get; private set; }
- /// <summary>권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)</summary>
- public string RgtRsnDetailSortCd { get; private set; } = default!;
- public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
- private RightsBaseDate() { }
- public static RightsBaseDate Create(
- int issucoCustno,
- string repSecnNm,
- DateOnly rgtStdDt,
- string rgtRacd,
- string? rgtRacdNm,
- string rgtRsnDetailSortCd)
- {
- if (string.IsNullOrWhiteSpace(repSecnNm))
- {
- throw new ArgumentException("repSecnNm required", nameof(repSecnNm));
- }
- if (string.IsNullOrWhiteSpace(rgtRacd))
- {
- throw new ArgumentException("rgtRacd required", nameof(rgtRacd));
- }
- if (string.IsNullOrWhiteSpace(rgtRsnDetailSortCd))
- {
- throw new ArgumentException("rgtRsnDetailSortCd required", nameof(rgtRsnDetailSortCd));
- }
- return new RightsBaseDate
- {
- IssucoCustno = issucoCustno,
- RepSecnNm = repSecnNm.Trim(),
- RgtStdDt = rgtStdDt,
- RgtRacd = rgtRacd.Trim(),
- RgtRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim(),
- RgtRsnDetailSortCd = rgtRsnDetailSortCd.Trim()
- };
- }
- /// <summary>재수집 반영 — 이름/사유명 변경 시에만 UpdatedAt 갱신 (자연키는 불변)</summary>
- public void Update(string repSecnNm, string? rgtRacdNm)
- {
- var changed = false;
- if (!string.IsNullOrWhiteSpace(repSecnNm) && RepSecnNm != repSecnNm.Trim())
- {
- RepSecnNm = repSecnNm.Trim();
- changed = true;
- }
- var normalizedRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim();
- if (RgtRacdNm != normalizedRacdNm)
- {
- RgtRacdNm = normalizedRacdNm;
- changed = true;
- }
- if (changed)
- {
- UpdatedAt = DateTime.UtcNow;
- }
- }
- }
|