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