using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// SEIBro 대금지급일정 정보 (getCostPaySchedul) — 배당금/단주대금 지급일정 (Wave 3). /// 날짜 스윕(대금지급일 TH1_PAY_TERM_BEGIN_DT × 지급구분 PAY_COST_TPCD{1배당금,3단주대금}) → 지급일 window delete+insert. /// ⚠️ 응답엔 TH1_PAY_TERM_BEGIN_DT·PAY_COST_TPCD 가 없어(요청 파라미터) 수집 배치가 스탬핑한다. /// 단주대금(PayCostTpcd=3) 지급건은 OddLotPayment(getOddLotInfo) 수집 트리거가 된다. /// public class PaymentSchedule { [Key] public int ID { get; private set; } /// 발행회사 고객번호 (ISSUCO_CUSTNO) public int IssucoCustno { get; private set; } /// 종목번호 (ISIN) public string Isin { get; private set; } = default!; /// 한글종목명 (KOR_SECN_NM) public string? KorSecnNm { get; private set; } /// 종목종류코드 (SECN_KACD) — 101보통주 201우선주 public string? SecnKacd { get; private set; } /// 권리기준일자 (RGT_STD_DT) public DateOnly? RgtStdDt { get; private set; } /// 권리사유명 (RGT_RACD_NM) — 예 국내CB행사·국내BW행사 (실샘플 확인, 가이드 xlsx 누락분) public string? RgtRacdNm { get; private set; } /// 권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD) public string? RgtRsnDetailSortCd { get; private set; } /// 지급대금구분코드 (PAY_COST_TPCD, 요청 스탬핑) — 1배당금 3단주대금 public string PayCostTpcd { get; private set; } = default!; /// 대금지급일 (TH1_PAY_TERM_BEGIN_DT, 요청 스탬핑) — 1차지급기간시작일 public DateOnly Th1PayTermBeginDt { get; private set; } public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow; private PaymentSchedule() { } public static PaymentSchedule Create( int issucoCustno, string isin, string? korSecnNm, string? secnKacd, DateOnly? rgtStdDt, string? rgtRacdNm, string? rgtRsnDetailSortCd, string payCostTpcd, DateOnly th1PayTermBeginDt) { if (string.IsNullOrWhiteSpace(isin)) { throw new ArgumentException("isin required", nameof(isin)); } if (string.IsNullOrWhiteSpace(payCostTpcd)) { throw new ArgumentException("payCostTpcd required", nameof(payCostTpcd)); } return new PaymentSchedule { IssucoCustno = issucoCustno, Isin = isin.Trim(), KorSecnNm = Trimmed(korSecnNm), SecnKacd = Trimmed(secnKacd), RgtStdDt = rgtStdDt, RgtRacdNm = Trimmed(rgtRacdNm), RgtRsnDetailSortCd = Trimmed(rgtRsnDetailSortCd), PayCostTpcd = payCostTpcd.Trim(), Th1PayTermBeginDt = th1PayTermBeginDt }; } private static string? Trimmed(string? value) { return string.IsNullOrWhiteSpace(value) ? null : value.Trim(); } }