using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// SEIBro CP 종목 정보 (getCPInfo) — 발행금액·할인기관·지급은행·원천징수·신용등급 4사 (Wave 4). PK Isin. /// 신용등급 코드는 원문 문자열 저장(채권.md 공통표). rolling per-ISIN 대상 = ShortTermIssuance 발견분 중 SECN_TPCD=12(어음/CP). /// public class CpMaster { /// 종목코드 (ISIN) — PK [Key] [MaxLength(12)] public string Isin { get; private set; } = default!; /// 발행사 번호 (ISSUCO_CUSTNO) public int? IssucoCustno { get; private set; } /// 한글종목명 (KOR_SECN_NM) public string? KorSecnNm { get; private set; } /// 발행통화코드 (ISSU_CUR_CD) public string? IssuCurCd { get; private set; } /// 발행금액 (ISSU_AMT) public decimal? IssuAmt { get; private set; } /// 종목종류코드 (SECN_KACD) — 1201일반기업어음 1202유동화ABCP … public string? SecnKacd { get; private set; } /// 어음분류코드 (BILL_CACD) — 1기업 2상업 3무역 4표지 5자발 public string? BillCacd { get; private set; } /// 발행방법코드 (ISSU_WHCD) public string? IssuWhcd { get; private set; } /// 매출일자 (SALE_DT) public DateOnly? SaleDt { get; private set; } /// 이자지급방식구분코드 (INT_PAY_MANN_TPCD) — 1할인식 2부리식 public string? IntPayMannTpcd { get; private set; } /// 발행일자 (ISSU_DT) public DateOnly? IssuDt { get; private set; } /// 만기일자 (XPIR_DT) public DateOnly? XpirDt { get; private set; } /// 할인기관고객번호 (DISCN_ORG_CUSTNO) public int? DiscnOrgCustno { get; private set; } /// 할인기관명 (DISCN_ORD_NM) public string? DiscnOrdNm { get; private set; } /// 지급은행지점번호 (PAY_BANK_BRONO) public int? PayBankBrono { get; private set; } /// 지급은행명 (BANK_NM) public string? BankNm { get; private set; } /// 원천징수구분코드 (WHOLD_TPCD) — 1상환시 2매출시 3미확정 public string? WholdTpcd { get; private set; } /// KIS평가등급코드 (KIS_VALAT_GRD_CD) — 신용등급코드표 원문 public string? KisValatGrdCd { get; private set; } /// NICE평가등급코드 (NICE_VALAT_GRD_CD) — 신용등급코드표 원문 public string? NiceValatGrdCd { get; private set; } /// 서울신용평가등급코드 (SCI_VALAT_GRD_CD) — 신용등급코드표 원문 public string? SciValatGrdCd { get; private set; } /// 한국기업평가등급코드 (KR_VALAT_GRD_CD) — 신용등급코드표 원문 public string? KrValatGrdCd { get; private set; } public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow; private CpMaster() { } public static CpMaster Create(string isin, CpMasterFields f) { if (string.IsNullOrWhiteSpace(isin)) { throw new ArgumentException("isin required", nameof(isin)); } var entity = new CpMaster { Isin = isin.Trim() }; entity.Apply(f); return entity; } /// 재수집 반영 (PK Isin 은 불변) — 변경 시에만 UpdatedAt public void Update(CpMasterFields f) { Apply(f); } private void Apply(CpMasterFields f) { var changed = false; changed |= Set(f.IssucoCustno, IssucoCustno, v => IssucoCustno = v); changed |= Set(Trimmed(f.KorSecnNm), KorSecnNm, v => KorSecnNm = v); changed |= Set(Trimmed(f.IssuCurCd), IssuCurCd, v => IssuCurCd = v); changed |= Set(f.IssuAmt, IssuAmt, v => IssuAmt = v); changed |= Set(Trimmed(f.SecnKacd), SecnKacd, v => SecnKacd = v); changed |= Set(Trimmed(f.BillCacd), BillCacd, v => BillCacd = v); changed |= Set(Trimmed(f.IssuWhcd), IssuWhcd, v => IssuWhcd = v); changed |= Set(f.SaleDt, SaleDt, v => SaleDt = v); changed |= Set(Trimmed(f.IntPayMannTpcd), IntPayMannTpcd, v => IntPayMannTpcd = v); changed |= Set(f.IssuDt, IssuDt, v => IssuDt = v); changed |= Set(f.XpirDt, XpirDt, v => XpirDt = v); changed |= Set(f.DiscnOrgCustno, DiscnOrgCustno, v => DiscnOrgCustno = v); changed |= Set(Trimmed(f.DiscnOrdNm), DiscnOrdNm, v => DiscnOrdNm = v); changed |= Set(f.PayBankBrono, PayBankBrono, v => PayBankBrono = v); changed |= Set(Trimmed(f.BankNm), BankNm, v => BankNm = v); changed |= Set(Trimmed(f.WholdTpcd), WholdTpcd, v => WholdTpcd = v); changed |= Set(Trimmed(f.KisValatGrdCd), KisValatGrdCd, v => KisValatGrdCd = v); changed |= Set(Trimmed(f.NiceValatGrdCd), NiceValatGrdCd, v => NiceValatGrdCd = v); changed |= Set(Trimmed(f.SciValatGrdCd), SciValatGrdCd, v => SciValatGrdCd = v); changed |= Set(Trimmed(f.KrValatGrdCd), KrValatGrdCd, v => KrValatGrdCd = 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; } } /// CpMaster 필드 묶음 (getCPInfo 필드 다수) public sealed record CpMasterFields( int? IssucoCustno, string? KorSecnNm, string? IssuCurCd, decimal? IssuAmt, string? SecnKacd, string? BillCacd, string? IssuWhcd, DateOnly? SaleDt, string? IntPayMannTpcd, DateOnly? IssuDt, DateOnly? XpirDt, int? DiscnOrgCustno, string? DiscnOrdNm, int? PayBankBrono, string? BankNm, string? WholdTpcd, string? KisValatGrdCd, string? NiceValatGrdCd, string? SciValatGrdCd, string? KrValatGrdCd );