SeibroAssetParser.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Domain.Entities.Stocks;
  2. namespace Infrastructure.StockData;
  3. /// <summary>
  4. /// SEIBro getAssetInfo(파생결합증권 기초자산 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  5. /// 실샘플 래퍼 = &lt;RESULT&gt; **대문자** (readme §1 확정 — 파생결합 5종 중 하나).
  6. /// ISIN 은 응답에 존재하나(가이드 xlsx 누락분, 실샘플에 있음) 없으면 요청값을 배치가 스탬핑하므로 여기선 (AssetSeq, 필드묶음) 반환.
  7. /// 자연키 ASSET_SEQ 없으면 스킵. ⚠️ StndBassetCd 는 반환 원문(KSD31*/KR7* 체계 가능) 그대로 저장 — 매핑 흡수 금지.
  8. /// </summary>
  9. public static class SeibroAssetParser
  10. {
  11. public sealed record Row(
  12. int AssetSeq,
  13. DerivAssetFields Fields
  14. );
  15. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  16. {
  17. var rows = new List<Row>();
  18. foreach (var fields in envelope.Rows)
  19. {
  20. var assetSeq = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ASSET_SEQ"));
  21. if (assetSeq is null)
  22. {
  23. continue;
  24. }
  25. rows.Add(new Row(
  26. assetSeq.Value,
  27. new DerivAssetFields(
  28. SeibroXml.GetOrNull(fields, "STND_BASSET_CD")?.Trim(),
  29. SeibroXml.GetOrNull(fields, "STND_BASSET_NM")?.Trim(),
  30. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_STDPRC")),
  31. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_STOP_LOLMT_RATIO")),
  32. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_STOP_LOLMT_PRICE")),
  33. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_STOP_UPLMT_RATIO")),
  34. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_STOP_UPLMT_PRICE")),
  35. SeibroXml.GetOrNull(fields, "BASSET_FIRST_VALAT_TPCD")?.Trim(),
  36. SeibroXml.GetOrNull(fields, "BASSET_LAST_VALAT_TPCD")?.Trim(),
  37. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "FIRST_STDPRC_DECSN_BEGIN_DT")),
  38. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "FIRST_STDPRC_DECSN_EXPRY_DT")),
  39. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "LAST_STDPRC_DECSN_BEGIN_DT")),
  40. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "LAST_STDPRC_DECSN_EXPRY_DT")),
  41. SeibroXml.GetOrNull(fields, "RVLT_SEVER_TPCD")?.Trim()
  42. )
  43. ));
  44. }
  45. return rows;
  46. }
  47. }