using Domain.Entities.Stocks; namespace Infrastructure.StockData; /// /// SEIBro getCPInfo(CP 종목 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// ⚠️ 응답에 ISIN 필드가 없다(요청 파라미터로만 받음, 실샘플 확인) — Isin 은 배치가 요청값을 스탬핑하므로 여기선 필드 묶음만 반환. /// 신용등급 4사 코드는 원문 문자열, 날짜→DateOnly, 콤마 숫자→decimal/int. 종목당 1행이나 방어적으로 전 행 반환. /// public static class SeibroCPParser { public static IReadOnlyList Parse(SeibroXml.Envelope envelope) { var rows = new List(); foreach (var fields in envelope.Rows) { rows.Add(new CpMasterFields( SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")), SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim(), SeibroXml.GetOrNull(fields, "ISSU_CUR_CD")?.Trim(), SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "ISSU_AMT")), SeibroXml.GetOrNull(fields, "SECN_KACD")?.Trim(), SeibroXml.GetOrNull(fields, "BILL_CACD")?.Trim(), SeibroXml.GetOrNull(fields, "ISSU_WHCD")?.Trim(), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "SALE_DT")), SeibroXml.GetOrNull(fields, "INT_PAY_MANN_TPCD")?.Trim(), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ISSU_DT")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XPIR_DT")), SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "DISCN_ORG_CUSTNO")), SeibroXml.GetOrNull(fields, "DISCN_ORD_NM")?.Trim(), SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "PAY_BANK_BRONO")), SeibroXml.GetOrNull(fields, "BANK_NM")?.Trim(), SeibroXml.GetOrNull(fields, "WHOLD_TPCD")?.Trim(), SeibroXml.GetOrNull(fields, "KIS_VALAT_GRD_CD")?.Trim(), SeibroXml.GetOrNull(fields, "NICE_VALAT_GRD_CD")?.Trim(), SeibroXml.GetOrNull(fields, "SCI_VALAT_GRD_CD")?.Trim(), SeibroXml.GetOrNull(fields, "KR_VALAT_GRD_CD")?.Trim() )); } return rows; } }