| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Stocks;
- /// <summary>
- /// SEIBro 주식관련사채 행사대상 주식정보 (getXrcStkStatInfo) — CB/BW/EB 행사대상·행사가·행사비율 (Wave 3).
- /// 자연키 UNIQUE (BondIsin, XrcStkIsin) — 한 채권·행사주식 조합당 1행.
- /// rolling per-채권ISIN — 발견 소스는 ConvertibleExercise(getXrcStkOptionXrcInfo) 가 반환한 DISTINCT BOND_ISIN.
- /// ⚠️ getXrcStkStatInfo 실샘플이 result="0"(0행) 이라 필드 매핑은 주식.md 스펙 기준 — 운영 첫 수집 시 로그로 확인 필요.
- /// </summary>
- public class ConvertibleBondTarget
- {
- [Key]
- public int ID { get; private set; }
- /// <summary>채권 종목번호 (BOND_ISIN) — EB/BW/CB</summary>
- public string BondIsin { get; private set; } = default!;
- /// <summary>채권 종목명 (BOND_SECN_NM)</summary>
- public string? BondSecnNm { get; private set; }
- /// <summary>채권종류코드 (BOND_KIND_NM) — EB/CB/분리형BW/비분리형BW</summary>
- public string? BondKindNm { get; private set; }
- /// <summary>행사주식종목번호 (XRC_STK_ISIN)</summary>
- public string XrcStkIsin { get; private set; } = default!;
- /// <summary>주식 종목명 (STK_SECN_NM)</summary>
- public string? StkSecnNm { get; private set; }
- /// <summary>신주인수권증권종목번호 (WRTB_ISIN)</summary>
- public string? WrtbIsin { get; private set; }
- /// <summary>신주인수권증권명 (WRTB_SECN_NM)</summary>
- public string? WrtbSecnNm { get; private set; }
- /// <summary>행사비율 (XRC_RATIO)</summary>
- public decimal? XrcRatio { get; private set; }
- /// <summary>행사가격 (XRC_PRICE)</summary>
- public decimal? XrcPrice { get; private set; }
- /// <summary>결산기말제한일수 (SETACC_ENDTERM_LIMIT_DAYS)</summary>
- public int? SetaccEndtermLimitDays { get; private set; }
- /// <summary>신주배정일전제한일수 (NEWSTK_ALOC_DD_BF_LIMIT_DAYS)</summary>
- public int? NewstkAllocDdBfLimitDays { get; private set; }
- /// <summary>청구제한사유내용 (DMAN_LIMIT_RSN_CONTENT)</summary>
- public string? DmanLimitRsnContent { get; private set; }
- public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
- private ConvertibleBondTarget() { }
- public static ConvertibleBondTarget Create(
- string bondIsin,
- string? bondSecnNm,
- string? bondKindNm,
- string xrcStkIsin,
- string? stkSecnNm,
- string? wrtbIsin,
- string? wrtbSecnNm,
- decimal? xrcRatio,
- decimal? xrcPrice,
- int? setaccEndtermLimitDays,
- int? newstkAllocDdBfLimitDays,
- string? dmanLimitRsnContent)
- {
- if (string.IsNullOrWhiteSpace(bondIsin))
- {
- throw new ArgumentException("bondIsin required", nameof(bondIsin));
- }
- if (string.IsNullOrWhiteSpace(xrcStkIsin))
- {
- throw new ArgumentException("xrcStkIsin required", nameof(xrcStkIsin));
- }
- return new ConvertibleBondTarget
- {
- BondIsin = bondIsin.Trim(),
- BondSecnNm = Trimmed(bondSecnNm),
- BondKindNm = Trimmed(bondKindNm),
- XrcStkIsin = xrcStkIsin.Trim(),
- StkSecnNm = Trimmed(stkSecnNm),
- WrtbIsin = Trimmed(wrtbIsin),
- WrtbSecnNm = Trimmed(wrtbSecnNm),
- XrcRatio = xrcRatio,
- XrcPrice = xrcPrice,
- SetaccEndtermLimitDays = setaccEndtermLimitDays,
- NewstkAllocDdBfLimitDays = newstkAllocDdBfLimitDays,
- DmanLimitRsnContent = Trimmed(dmanLimitRsnContent)
- };
- }
- /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키는 불변)</summary>
- public void Update(
- string? bondSecnNm,
- string? bondKindNm,
- string? stkSecnNm,
- string? wrtbIsin,
- string? wrtbSecnNm,
- decimal? xrcRatio,
- decimal? xrcPrice,
- int? setaccEndtermLimitDays,
- int? newstkAllocDdBfLimitDays,
- string? dmanLimitRsnContent)
- {
- var changed = false;
- changed |= Set(Trimmed(bondSecnNm), BondSecnNm, v => BondSecnNm = v);
- changed |= Set(Trimmed(bondKindNm), BondKindNm, v => BondKindNm = v);
- changed |= Set(Trimmed(stkSecnNm), StkSecnNm, v => StkSecnNm = v);
- changed |= Set(Trimmed(wrtbIsin), WrtbIsin, v => WrtbIsin = v);
- changed |= Set(Trimmed(wrtbSecnNm), WrtbSecnNm, v => WrtbSecnNm = v);
- changed |= Set(xrcRatio, XrcRatio, v => XrcRatio = v);
- changed |= Set(xrcPrice, XrcPrice, v => XrcPrice = v);
- changed |= Set(setaccEndtermLimitDays, SetaccEndtermLimitDays, v => SetaccEndtermLimitDays = v);
- changed |= Set(newstkAllocDdBfLimitDays, NewstkAllocDdBfLimitDays, v => NewstkAllocDdBfLimitDays = v);
- changed |= Set(Trimmed(dmanLimitRsnContent), DmanLimitRsnContent, v => DmanLimitRsnContent = 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;
- }
- }
|