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