SeibroXrcStkOptionXrcParser.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getXrcStkOptionXrcInfo(주식관련사채 행사내역) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// ⚠️ 실샘플 fixture 가 result="0"(0행)이라 필드 매핑을 라이브로 검증하지 못했다 — 주식.md 스펙 기준으로 구현했으며
  5. /// 운영 첫 수집 시 로그로 필드명(대소문자 포함)을 확인해야 한다.
  6. /// 날짜 스윕(권리행사일 RGT_STD_DT) 결과 — BOND_ISIN·RGT_STD_DT 중 하나라도 없으면 건너뛴다.
  7. /// XRC_AMT/XRC_QTY/XRC_PRICE 는 소수 표기 가능 → decimal.
  8. /// </summary>
  9. public static class SeibroXrcStkOptionXrcParser
  10. {
  11. public sealed record Row(
  12. string BondIsin,
  13. string? BondKorSecnNm,
  14. string? BondKindNm,
  15. string? XrcStkIsin,
  16. string? StkKorSecnNm,
  17. DateOnly RgtStdDt,
  18. DateOnly? XrcPossBeginDt,
  19. DateOnly? XrcPossExpryDt,
  20. decimal? XrcAmt,
  21. decimal? XrcQty,
  22. decimal? XrcPrice,
  23. DateOnly? ListDt
  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. var bondIsin = SeibroXml.GetOrNull(fields, "BOND_ISIN")?.Trim();
  31. var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
  32. if (string.IsNullOrEmpty(bondIsin) || rgtStdDt is null)
  33. {
  34. continue;
  35. }
  36. rows.Add(new Row(
  37. bondIsin,
  38. SeibroXml.GetOrNull(fields, "BOND_KOR_SECN_NM")?.Trim(),
  39. SeibroXml.GetOrNull(fields, "BOND_KIND_NM")?.Trim(),
  40. SeibroXml.GetOrNull(fields, "XRC_STK_ISIN")?.Trim(),
  41. SeibroXml.GetOrNull(fields, "STK_KOR_SECN_NM")?.Trim(),
  42. rgtStdDt.Value,
  43. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XRC_POSS_BEGIN_DT")),
  44. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XRC_POSS_EXPRY_DT")),
  45. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_AMT")),
  46. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_QTY")),
  47. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_PRICE")),
  48. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "LIST_DT"))
  49. ));
  50. }
  51. return rows;
  52. }
  53. }