SeibroXrcStkStatParser.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getXrcStkStatInfo(주식관련사채 행사대상 주식정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// ⚠️ 실샘플 fixture 가 result="0"(0행)이라 필드 매핑을 라이브로 검증하지 못했다 — 주식.md 스펙 기준으로 구현했으며
  5. /// 운영 첫 수집 시 로그로 필드명(대소문자 포함)을 확인해야 한다. SeibroXml 은 대소문자 무시라 명칭만 맞으면 매핑된다.
  6. /// 자연키(BOND_ISIN, XRC_STK_ISIN) 중 하나라도 없으면 건너뛴다.
  7. /// </summary>
  8. public static class SeibroXrcStkStatParser
  9. {
  10. public sealed record Row(
  11. string BondIsin,
  12. string? BondSecnNm,
  13. string? BondKindNm,
  14. string XrcStkIsin,
  15. string? StkSecnNm,
  16. string? WrtbIsin,
  17. string? WrtbSecnNm,
  18. decimal? XrcRatio,
  19. decimal? XrcPrice,
  20. int? SetaccEndtermLimitDays,
  21. int? NewstkAllocDdBfLimitDays,
  22. string? DmanLimitRsnContent
  23. );
  24. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  25. {
  26. var rows = new List<Row>();
  27. foreach (var fields in envelope.Rows)
  28. {
  29. var bondIsin = SeibroXml.GetOrNull(fields, "BOND_ISIN")?.Trim();
  30. var xrcStkIsin = SeibroXml.GetOrNull(fields, "XRC_STK_ISIN")?.Trim();
  31. if (string.IsNullOrEmpty(bondIsin) || string.IsNullOrEmpty(xrcStkIsin))
  32. {
  33. continue;
  34. }
  35. rows.Add(new Row(
  36. bondIsin,
  37. SeibroXml.GetOrNull(fields, "BOND_SECN_NM")?.Trim(),
  38. SeibroXml.GetOrNull(fields, "BOND_KIND_NM")?.Trim(),
  39. xrcStkIsin,
  40. SeibroXml.GetOrNull(fields, "STK_SECN_NM")?.Trim(),
  41. SeibroXml.GetOrNull(fields, "WRTB_ISIN")?.Trim(),
  42. SeibroXml.GetOrNull(fields, "WRTB_SECN_NM")?.Trim(),
  43. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_RATIO")),
  44. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_PRICE")),
  45. SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "SETACC_ENDTERM_LIMIT_DAYS")),
  46. SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "NEWSTK_ALOC_DD_BF_LIMIT_DAYS")),
  47. SeibroXml.GetOrNull(fields, "DMAN_LIMIT_RSN_CONTENT")?.Trim()
  48. ));
  49. }
  50. return rows;
  51. }
  52. }