SeibroIntPayParser.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getIntPayInfo(채권 이자지급 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// ⚠️ 실샘플 fixture 가 result="0"(빈) 이라 필드 매핑은 채권.md 스펙 기준 — 운영 첫 수집 시 로그로 확인.
  5. /// ⚠️ 응답에 ISIN 필드가 없다(요청 파라미터로만 받음) — Isin 은 배치가 요청값을 스탬핑하므로 여기선 필드 묶음만 반환.
  6. /// 종목당 1행이라 첫 행만 의미가 있으나 방어적으로 전 행 반환. Y/N→bool, 날짜→DateOnly, 숫자→decimal/int.
  7. /// </summary>
  8. public static class SeibroIntPayParser
  9. {
  10. public sealed record Row(
  11. decimal? CouponRate,
  12. string? IntPayWayTpcd,
  13. int? IntPayCycleTerms,
  14. string? IntPayCycleTpcd,
  15. string? RvltSeverTpcd,
  16. bool? AcrintPayYn,
  17. string? BankHolidayIntPaydayTpcd,
  18. string? IntPayTimsTpcd,
  19. DateOnly? BeforeDate,
  20. DateOnly? AfterDate
  21. );
  22. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  23. {
  24. var rows = new List<Row>();
  25. foreach (var fields in envelope.Rows)
  26. {
  27. rows.Add(new Row(
  28. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "COUPON_RATE")),
  29. SeibroXml.GetOrNull(fields, "INT_PAY_WAY_TPCD")?.Trim(),
  30. SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "INT_PAY_CYCLE_TERMS")),
  31. SeibroXml.GetOrNull(fields, "INT_PAY_CYCLE_TPCD")?.Trim(),
  32. SeibroXml.GetOrNull(fields, "RVLT_SEVER_TPCD")?.Trim(),
  33. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ACRINT_PAY_YN")),
  34. SeibroXml.GetOrNull(fields, "BANK_HOLIDAY_INT_PAYDD_TPCD")?.Trim(),
  35. SeibroXml.GetOrNull(fields, "INT_PAY_TIMS_TPCD")?.Trim(),
  36. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "BEFORE_DATE")),
  37. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "AFTER_DATE"))
  38. ));
  39. }
  40. return rows;
  41. }
  42. }