SeibroBondOptionXrcParser.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getBondOptionXrcInfo(채권 조기상환 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// 자연키 (ISIN, ERLY_RED_DT) 중 하나라도 없으면 건너뛴다. 날짜(YYYYMMDD)→DateOnly, 콤마 포함 숫자→decimal.
  5. /// </summary>
  6. public static class SeibroBondOptionXrcParser
  7. {
  8. public sealed record Row(
  9. string Isin,
  10. string? KorSecnNm,
  11. DateOnly? XrcBeginDt,
  12. DateOnly? XrcExpryDt,
  13. DateOnly ErlyRedDt,
  14. string? OptionTpcd,
  15. decimal? ApliIrate,
  16. decimal? ErlyRedamtVal,
  17. decimal? IntPayAmt,
  18. decimal? IssuRema,
  19. decimal? XrcRatio
  20. );
  21. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  22. {
  23. var rows = new List<Row>();
  24. foreach (var fields in envelope.Rows)
  25. {
  26. var isin = SeibroXml.GetOrNull(fields, "ISIN")?.Trim();
  27. var erlyRedDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ERLY_RED_DT"));
  28. if (string.IsNullOrEmpty(isin) || erlyRedDt is null)
  29. {
  30. continue;
  31. }
  32. rows.Add(new Row(
  33. isin,
  34. SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim(),
  35. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XRC_BEGIN_DT")),
  36. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XRC_EXPRY_DT")),
  37. erlyRedDt.Value,
  38. SeibroXml.GetOrNull(fields, "OPTION_TPCD")?.Trim(),
  39. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "APLI_IRATE")),
  40. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "ERLY_REDAMT_VAL")),
  41. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "INT_PAY_AMT")),
  42. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "ISSU_REMA")),
  43. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_RATIO"))
  44. ));
  45. }
  46. return rows;
  47. }
  48. }