SeibroRedCondiParser.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getRedCondiInfo(파생결합증권 상환조건) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// 실샘플 래퍼 = &lt;RESULT&gt; **대문자** (readme §1 확정 — 파생결합 5종 중 하나).
  5. /// ⚠️ 응답에 ISIN 이 없어(요청 파라미터로만 받음) 배치가 요청 ISIN 을 스탬핑 — 여기선 (RedCondiTpcd, ValatNtimesSeq, 값) 반환.
  6. /// 자연키 RED_CONDI_TPCD·VALAT_NTIMES_SEQ 없으면 스킵. 상환조건/계산식은 최대 1000자 자유 텍스트.
  7. /// </summary>
  8. public static class SeibroRedCondiParser
  9. {
  10. public sealed record Row(
  11. string RedCondiTpcd,
  12. int ValatNtimesSeq,
  13. DateOnly? MidValatPayDt,
  14. DateOnly? MidValatBeginDt,
  15. DateOnly? MidValatExpryDt,
  16. string? RedCondiContent,
  17. string? RedFormulaContent
  18. );
  19. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  20. {
  21. var rows = new List<Row>();
  22. foreach (var fields in envelope.Rows)
  23. {
  24. var tpcd = SeibroXml.GetOrNull(fields, "RED_CONDI_TPCD")?.Trim();
  25. var seq = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "VALAT_NTIMES_SEQ"));
  26. if (string.IsNullOrEmpty(tpcd) || seq is null)
  27. {
  28. continue;
  29. }
  30. rows.Add(new Row(
  31. tpcd,
  32. seq.Value,
  33. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MID_VALAT_PAY_DT")),
  34. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MID_VALAT_BEGIN_DT")),
  35. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MID_VALAT_EXPRY_DT")),
  36. SeibroXml.GetOrNull(fields, "RED_CONDI_CONTENT")?.Trim(),
  37. SeibroXml.GetOrNull(fields, "RED_FORMULA_CONTENT")?.Trim()
  38. ));
  39. }
  40. return rows;
  41. }
  42. }