namespace Infrastructure.StockData; /// /// SEIBro getStkListInfo(주식 상장/유통형태 변경) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// 자연키(ISIN, SHOTN_ISIN, KOR_SECN_NM, APLI_DT) 중 하나라도 없거나 적용일 비형식이면 건너뛴다. /// BFALT/AFALT_CIRCL_FORM 은 빈값(신규 등록 등) 가능 → null. 코드 원문 문자열로 담는다. /// public static class SeibroStkListParser { public sealed record Row( int? IssucoCustno, string Isin, string ShotnIsin, string KorSecnNm, string? BfaltCirclForm, string? AfaltCirclForm, DateOnly ApliDt ); 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 shotnIsin = SeibroXml.GetOrNull(fields, "SHOTN_ISIN")?.Trim(); var korSecnNm = SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim(); var apliDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "APLI_DT")); if (string.IsNullOrEmpty(isin) || string.IsNullOrEmpty(shotnIsin) || string.IsNullOrEmpty(korSecnNm) || apliDt is null) { continue; } rows.Add(new Row( SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")), isin, shotnIsin, korSecnNm, SeibroXml.GetOrNull(fields, "BFALT_CIRCL_FORM")?.Trim(), SeibroXml.GetOrNull(fields, "AFALT_CIRCL_FORM")?.Trim(), apliDt.Value )); } return rows; } }