| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Stocks;
- /// <summary>
- /// SEIBro 시장별 단축코드 ↔ 발행회사번호 매핑 (getShotnByMart) — (Market, ShortCode) UNIQUE.
- /// ISSUCO_CUSTNO 는 SEIBro 기업정보 API 전체의 조인키라 Wave 0 에서 가장 먼저 구축한다.
- /// K-OTC(13)·기타(50) 등 KRX Stock 이 커버하지 않는 시장의 유일한 종목 마스터이기도 하다
- /// (KOSPI/KOSDAQ/KONEX 는 Stock.IssucoCustno 로도 스탬핑되지만 이 테이블이 원본 스냅샷).
- /// </summary>
- public class SeibroIssuerCode
- {
- [Key]
- public int ID { get; private set; }
- /// <summary>시장구분 (MART_TPCD, char 2) — [11]유가 [12]코스닥 [13]K-OTC [14]코넥스 [50]기타</summary>
- public string Market { get; private set; } = default!;
- /// <summary>단축코드 (SHOTN_ISIN)</summary>
- public string ShortCode { get; private set; } = default!;
- /// <summary>종목명 (KOR_SECN_NM)</summary>
- public string Name { get; private set; } = default!;
- /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO) — 예탁결제원 부여</summary>
- public int IssucoCustno { get; private set; }
- /// <summary>마지막 동기화 시각 (UTC)</summary>
- public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
- private SeibroIssuerCode() { }
- public static SeibroIssuerCode Create(string market, string shortCode, string name, int issucoCustno)
- {
- if (market is not { Length: 2 } || market.Any(c => !char.IsAsciiDigit(c)))
- {
- throw new ArgumentException("market must be 2 digits (MART_TPCD)", nameof(market));
- }
- if (string.IsNullOrWhiteSpace(shortCode) || shortCode.Trim().Length > 12)
- {
- throw new ArgumentException("shortCode required (max 12)", nameof(shortCode));
- }
- if (string.IsNullOrWhiteSpace(name))
- {
- throw new ArgumentException("name required", nameof(name));
- }
- return new SeibroIssuerCode
- {
- Market = market,
- ShortCode = shortCode.Trim(),
- Name = name.Trim(),
- IssucoCustno = issucoCustno
- };
- }
- /// <summary>재동기화 반영 — 이름/회사번호 변경 시에만 UpdatedAt 갱신 (무변경 upsert 는 no-op)</summary>
- public void Update(string name, int issucoCustno)
- {
- var changed = false;
- if (!string.IsNullOrWhiteSpace(name) && Name != name.Trim())
- {
- Name = name.Trim();
- changed = true;
- }
- if (IssucoCustno != issucoCustno)
- {
- IssucoCustno = issucoCustno;
- changed = true;
- }
- if (changed)
- {
- UpdatedAt = DateTime.UtcNow;
- }
- }
- }
|