SeibroSlbDealingParser.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getSlbDealingByIsin(종목별 대차거래 현황) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// ⚠️ 응답엔 ISIN·STD_DT 가 없다(fixture 확인) — 요청 파라미터(ISIN, STD_DT)를 수집 배치가 스탬핑한다.
  5. /// 따라서 Row 는 대차 수치 필드만 담는다. 금액은 콤마 제거 후 long, 비율은 decimal(".01" 선행점 포함).
  6. /// 모든 수치 필드가 없으면(빈 vector) 행이 생성되지 않는다.
  7. /// </summary>
  8. public static class SeibroSlbDealingParser
  9. {
  10. public sealed record Row(
  11. long? TotIssuStkqty,
  12. long? TrQty,
  13. long? MatcQty,
  14. long? RedQty,
  15. long? SlbTrRemQty,
  16. long? FrinerLendRemAmt,
  17. decimal? FrinerLendRemRatio,
  18. long? NativeLendRemAmt,
  19. decimal? NativeLendRemRatio,
  20. long? FrinerBrwRemAmt,
  21. decimal? FrinerBrwRemRatio,
  22. long? NativeBrwRemAmt,
  23. decimal? NativeBrwRemRatio
  24. );
  25. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  26. {
  27. var rows = new List<Row>();
  28. foreach (var fields in envelope.Rows)
  29. {
  30. rows.Add(new Row(
  31. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "TOT_ISSU_STKQTY")),
  32. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "TR_QTY")),
  33. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "MATC_QTY")),
  34. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "RED_QTY")),
  35. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "SLB_TR_REM_QTY")),
  36. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "FRINER_LEND_REM_AMT")),
  37. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "FRINER_LEND_REM_RATIO")),
  38. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "NATIVE_LEND_REM_AMT")),
  39. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "NATIVE_LEND_REM_RATIO")),
  40. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "FRINER_BRW_REM_AMT")),
  41. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "FRINER_BRW_REM_RATIO")),
  42. SeibroFieldParse.Long(SeibroXml.GetOrNull(fields, "NATIVE_BRW_REM_AMT")),
  43. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "NATIVE_BRW_REM_RATIO"))
  44. ));
  45. }
  46. return rows;
  47. }
  48. }