| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Stocks;
- /// <summary>
- /// SEIBro 배당분배금내역 (getDivInfo) — 종목별 배정비율·금액·시가배당율·차등배당 (Wave 1 ★P0).
- /// 자연키 UNIQUE (Isin, RgtStdDt) — 한 종목·권리기준일당 1행.
- /// ⚠️ getDivInfo 응답엔 ISSUCO_CUSTNO 가 없다(샘플 확인) — 종목 조인은 Isin 으로 Stock.ISIN 을 맞춘다.
- /// 소수 precision 은 스펙(NUMBER(30,20)/(23,18)) 을 SQL Server decimal 최대(38,x) 안에서 decimal(28,10) 로 안전 설정.
- /// </summary>
- public class Dividend
- {
- [Key]
- public int ID { get; private set; }
- /// <summary>종목번호 (ISIN)</summary>
- public string Isin { get; private set; } = default!;
- /// <summary>한글종목명 (KOR_SECN_NM)</summary>
- public string KorSecnNm { get; private set; } = default!;
- /// <summary>종목종류 (SECN_KACD_NM) — 보통주/우선주/2우선주… 문자열</summary>
- public string? SecnKacdNm { get; private set; }
- /// <summary>권리기준일자 (RGT_STD_DT)</summary>
- public DateOnly RgtStdDt { get; private set; }
- /// <summary>액면가 (PVAL)</summary>
- public decimal? Pval { get; private set; }
- /// <summary>주식배정비율 (STK_ALOC_RATIO)</summary>
- public decimal? StkAllocRatio { get; private set; }
- /// <summary>현금배정비율 (CASH_ALOC_RATIO)</summary>
- public decimal? CashAllocRatio { get; private set; }
- /// <summary>현금배정금액 (CASH_ALOC_AMT) — 1주당 현금배당(원)</summary>
- public decimal? CashAllocAmt { get; private set; }
- /// <summary>시가배당율 (MARTP_DIV_RATE)</summary>
- public decimal? MartpDivRate { get; private set; }
- /// <summary>배당지급일(현금 1차지급시작일, TH1_PAY_TERM_BEGIN_DT)</summary>
- public DateOnly? Th1PayTermBeginDt { get; private set; }
- /// <summary>교부일자(주식, DELI_DT)</summary>
- public DateOnly? DeliDt { get; private set; }
- /// <summary>대주주기타차등배정여부 (MAJSHR_ETC_DIFF_ALOC_YN, Y/N) — 미제공 null</summary>
- public bool? MajshrEtcDiffAllocYn { get; private set; }
- /// <summary>자사주무배정여부 (TSTK_NOAGN_YN, Y/N) — 미제공 null</summary>
- public bool? TstkNoagnYn { get; private set; }
- /// <summary>현금차등배당금액 (CASH_DIFF_DIVIAMT_VAL)</summary>
- public decimal? CashDiffDiviAmt { get; private set; }
- /// <summary>현금차등배당율 (CASH_DIFF_DIVI_RATE)</summary>
- public decimal? CashDiffDiviRate { get; private set; }
- /// <summary>주식차등배당율 (STK_DIFF_DIVI_RATE)</summary>
- public decimal? StkDiffDiviRate { get; private set; }
- /// <summary>시가차등배당율 (MARTP_DIFF_DIVI_RATE)</summary>
- public decimal? MartpDiffDiviRate { get; private set; }
- public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
- private Dividend() { }
- public static Dividend Create(
- string isin,
- string korSecnNm,
- string? secnKacdNm,
- DateOnly rgtStdDt,
- decimal? pval,
- decimal? stkAllocRatio,
- decimal? cashAllocRatio,
- decimal? cashAllocAmt,
- decimal? martpDivRate,
- DateOnly? th1PayTermBeginDt,
- DateOnly? deliDt,
- bool? majshrEtcDiffAllocYn,
- bool? tstkNoagnYn,
- decimal? cashDiffDiviAmt,
- decimal? cashDiffDiviRate,
- decimal? stkDiffDiviRate,
- decimal? martpDiffDiviRate)
- {
- if (string.IsNullOrWhiteSpace(isin))
- {
- throw new ArgumentException("isin required", nameof(isin));
- }
- if (string.IsNullOrWhiteSpace(korSecnNm))
- {
- throw new ArgumentException("korSecnNm required", nameof(korSecnNm));
- }
- return new Dividend
- {
- Isin = isin.Trim(),
- KorSecnNm = korSecnNm.Trim(),
- SecnKacdNm = string.IsNullOrWhiteSpace(secnKacdNm) ? null : secnKacdNm.Trim(),
- RgtStdDt = rgtStdDt,
- Pval = pval,
- StkAllocRatio = stkAllocRatio,
- CashAllocRatio = cashAllocRatio,
- CashAllocAmt = cashAllocAmt,
- MartpDivRate = martpDivRate,
- Th1PayTermBeginDt = th1PayTermBeginDt,
- DeliDt = deliDt,
- MajshrEtcDiffAllocYn = majshrEtcDiffAllocYn,
- TstkNoagnYn = tstkNoagnYn,
- CashDiffDiviAmt = cashDiffDiviAmt,
- CashDiffDiviRate = cashDiffDiviRate,
- StkDiffDiviRate = stkDiffDiviRate,
- MartpDiffDiviRate = martpDiffDiviRate
- };
- }
- /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (무변경 upsert 는 no-op)</summary>
- public void Update(
- string korSecnNm,
- string? secnKacdNm,
- decimal? pval,
- decimal? stkAllocRatio,
- decimal? cashAllocRatio,
- decimal? cashAllocAmt,
- decimal? martpDivRate,
- DateOnly? th1PayTermBeginDt,
- DateOnly? deliDt,
- bool? majshrEtcDiffAllocYn,
- bool? tstkNoagnYn,
- decimal? cashDiffDiviAmt,
- decimal? cashDiffDiviRate,
- decimal? stkDiffDiviRate,
- decimal? martpDiffDiviRate)
- {
- var changed = false;
- if (!string.IsNullOrWhiteSpace(korSecnNm) && KorSecnNm != korSecnNm.Trim())
- {
- KorSecnNm = korSecnNm.Trim();
- changed = true;
- }
- var normalizedSecnKacdNm = string.IsNullOrWhiteSpace(secnKacdNm) ? null : secnKacdNm.Trim();
- if (SecnKacdNm != normalizedSecnKacdNm)
- {
- SecnKacdNm = normalizedSecnKacdNm;
- changed = true;
- }
- if (Pval != pval)
- {
- Pval = pval;
- changed = true;
- }
- if (StkAllocRatio != stkAllocRatio)
- {
- StkAllocRatio = stkAllocRatio;
- changed = true;
- }
- if (CashAllocRatio != cashAllocRatio)
- {
- CashAllocRatio = cashAllocRatio;
- changed = true;
- }
- if (CashAllocAmt != cashAllocAmt)
- {
- CashAllocAmt = cashAllocAmt;
- changed = true;
- }
- if (MartpDivRate != martpDivRate)
- {
- MartpDivRate = martpDivRate;
- changed = true;
- }
- if (Th1PayTermBeginDt != th1PayTermBeginDt)
- {
- Th1PayTermBeginDt = th1PayTermBeginDt;
- changed = true;
- }
- if (DeliDt != deliDt)
- {
- DeliDt = deliDt;
- changed = true;
- }
- if (MajshrEtcDiffAllocYn != majshrEtcDiffAllocYn)
- {
- MajshrEtcDiffAllocYn = majshrEtcDiffAllocYn;
- changed = true;
- }
- if (TstkNoagnYn != tstkNoagnYn)
- {
- TstkNoagnYn = tstkNoagnYn;
- changed = true;
- }
- if (CashDiffDiviAmt != cashDiffDiviAmt)
- {
- CashDiffDiviAmt = cashDiffDiviAmt;
- changed = true;
- }
- if (CashDiffDiviRate != cashDiffDiviRate)
- {
- CashDiffDiviRate = cashDiffDiviRate;
- changed = true;
- }
- if (StkDiffDiviRate != stkDiffDiviRate)
- {
- StkDiffDiviRate = stkDiffDiviRate;
- changed = true;
- }
- if (MartpDiffDiviRate != martpDiffDiviRate)
- {
- MartpDiffDiviRate = martpDiffDiviRate;
- changed = true;
- }
- if (changed)
- {
- UpdatedAt = DateTime.UtcNow;
- }
- }
- }
|