namespace Infrastructure.StockData; /// /// SEIBro getSlbDealingByIsin(종목별 대차거래 현황) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// ⚠️ 응답엔 ISIN·STD_DT 가 없다(fixture 확인) — 요청 파라미터(ISIN, STD_DT)를 수집 배치가 스탬핑한다. /// 따라서 Row 는 대차 수치 필드만 담는다. 금액은 콤마 제거 후 long, 비율은 decimal(".01" 선행점 포함). /// 모든 수치 필드가 없으면(빈 vector) 행이 생성되지 않는다. /// public static class SeibroSlbDealingParser { public sealed record Row( long? TotIssuStkqty, long? TrQty, long? MatcQty, long? RedQty, long? SlbTrRemQty, long? FrinerLendRemAmt, decimal? FrinerLendRemRatio, long? NativeLendRemAmt, decimal? NativeLendRemRatio, long? FrinerBrwRemAmt, decimal? FrinerBrwRemRatio, long? NativeBrwRemAmt, decimal? NativeBrwRemRatio ); public static IReadOnlyList Parse(SeibroXml.Envelope envelope) { var rows = new List(); foreach (var fields in envelope.Rows) { rows.Add(new Row( SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "TOT_ISSU_STKQTY")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "TR_QTY")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "MATC_QTY")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "RED_QTY")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "SLB_TR_REM_QTY")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "FRINER_LEND_REM_AMT")), SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "FRINER_LEND_REM_RATIO")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "NATIVE_LEND_REM_AMT")), SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "NATIVE_LEND_REM_RATIO")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "FRINER_BRW_REM_AMT")), SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "FRINER_BRW_REM_RATIO")), SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "NATIVE_BRW_REM_AMT")), SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "NATIVE_BRW_REM_RATIO")) )); } return rows; } }