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;
}
}