using System.ComponentModel.DataAnnotations;
namespace Domain.Entities.Stocks;
///
/// SEIBro 단기금융증권 발행내역 (getShortmIssuInfo) — CD/CP/전단채 발행종목 (Wave 4). 자연키 UNIQUE (Isin).
/// CdMaster/CpMaster/EstbMaster rolling 의 발견 소스 — 발행일(ISSU_DT) × 종목구분(SECN_TPCD{12,13,14}) 날짜 스윕.
/// 응답에 없는 SecnTpcd·IssuDt 는 요청 파라미터를 배치가 스탬핑한다.
///
public class ShortTermIssuance
{
[Key]
public int ID { get; private set; }
/// 종목코드 (ISIN)
public string Isin { get; private set; } = default!;
/// 한글종목명 (KOR_SECN_NM)
public string? KorSecnNm { get; private set; }
/// 발행회사고객번호 (ISSUCO_CUSTNO)
public int? IssucoCustno { get; private set; }
/// 발행회사 명칭 (ISSUCO_CUST_NM)
public string? IssucoCustNm { get; private set; }
/// 종목구분코드 (SECN_TPCD, 요청값 스탬핑) — 12어음(CP) 13CD 14전자단기사채
public string SecnTpcd { get; private set; } = default!;
/// 발행일자 (ISSU_DT, 요청값 스탬핑)
public DateOnly IssuDt { get; private set; }
public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
private ShortTermIssuance() { }
public static ShortTermIssuance Create(string isin, string? korSecnNm, int? issucoCustno, string? issucoCustNm, string secnTpcd, DateOnly issuDt)
{
if (string.IsNullOrWhiteSpace(isin))
{
throw new ArgumentException("isin required", nameof(isin));
}
if (string.IsNullOrWhiteSpace(secnTpcd))
{
throw new ArgumentException("secnTpcd required", nameof(secnTpcd));
}
return new ShortTermIssuance
{
Isin = isin.Trim(),
KorSecnNm = Trimmed(korSecnNm),
IssucoCustno = issucoCustno,
IssucoCustNm = Trimmed(issucoCustNm),
SecnTpcd = secnTpcd.Trim(),
IssuDt = issuDt
};
}
/// 재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (자연키 Isin 은 불변)
public void Update(string? korSecnNm, int? issucoCustno, string? issucoCustNm, string secnTpcd, DateOnly issuDt)
{
var changed = false;
changed |= Set(Trimmed(korSecnNm), KorSecnNm, v => KorSecnNm = v);
changed |= Set(issucoCustno, IssucoCustno, v => IssucoCustno = v);
changed |= Set(Trimmed(issucoCustNm), IssucoCustNm, v => IssucoCustNm = v);
changed |= Set(secnTpcd.Trim(), SecnTpcd, v => SecnTpcd = v);
changed |= Set(issuDt, IssuDt, v => IssuDt = v);
if (changed)
{
UpdatedAt = DateTime.UtcNow;
}
}
private static string? Trimmed(string? value)
{
return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
}
private static bool Set(T incoming, T current, Action assign)
{
if (EqualityComparer.Default.Equals(incoming, current))
{
return false;
}
assign(incoming);
return true;
}
}