| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- namespace Infrastructure.StockData;
- /// <summary>
- /// SEIBro getSlbDealingByIsin(종목별 대차거래 현황) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
- /// ⚠️ 응답엔 ISIN·STD_DT 가 없다(fixture 확인) — 요청 파라미터(ISIN, STD_DT)를 수집 배치가 스탬핑한다.
- /// 따라서 Row 는 대차 수치 필드만 담는다. 금액은 콤마 제거 후 long, 비율은 decimal(".01" 선행점 포함).
- /// 모든 수치 필드가 없으면(빈 vector) 행이 생성되지 않는다.
- /// </summary>
- 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<Row> Parse(SeibroXml.Envelope envelope)
- {
- var rows = new List<Row>();
- 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;
- }
- }
|