namespace Infrastructure.StockData; /// /// SEIBro getUnlistCirclInfo(비상장유통추정) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// ⚠️ 응답엔 STD_DT 가 없다(fixture 확인) — 요청 파라미터(STD_DT)를 수집 배치가 스탬핑한다. /// ⚠️ 종목종류명 필드는 SECN_KACD_NM (스펙 xlsx 의 SECN_KACA_NM 은 오기 — docs/SEIBro/주식.md §2). /// 자연키(ISIN)·대표명(REP_SECN_NM) 없는 행은 건너뛴다. /// public static class SeibroUnlistCirclParser { public sealed record Row( string Isin, string? ShotnIsin, string RepSecnNm, string? SecnKacdNm, long? GenDepoQty, long? RthingReturnStkqty, long? AcnttrQty, bool? IsElectronicSecurity ); public static IReadOnlyList Parse(SeibroXml.Envelope envelope) { var rows = new List(); foreach (var fields in envelope.Rows) { var isin = SeibroXml.GetOrNull(fields, "ISIN")?.Trim(); var repSecnNm = SeibroXml.GetOrNull(fields, "REP_SECN_NM")?.Trim(); if (string.IsNullOrEmpty(isin) || string.IsNullOrEmpty(repSecnNm)) { continue; } rows.Add(new Row( isin, SeibroXml.GetOrNull(fields, "SHOTN_ISIN")?.Trim(), repSecnNm, SeibroXml.GetOrNull(fields, "SECN_KACD_NM")?.Trim(), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "GEN_DEPO_QTY")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "RTHING_RETURN_STKQTY")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "ACNTTR_QTY")), SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ELTSC_YN")) )); } return rows; } }