SeibroCDParser.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getCDInfo(CD 종목 정보) 응답 파서 — 순수 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 SeibroCDParser
  9. {
  10. public sealed record Row(
  11. int? IssucoCustno,
  12. string? KorSecnNm,
  13. string? IssuCurCd,
  14. decimal? FirstIssuAmt,
  15. string? IssuWhcd,
  16. decimal? FaceAmt,
  17. decimal? SaleAmt,
  18. decimal? DiscnRate,
  19. string? IntPayMannTpcd,
  20. DateOnly? IssuDt,
  21. DateOnly? XpirDt,
  22. bool? EltscYn
  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. rows.Add(new Row(
  30. SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")),
  31. SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim(),
  32. SeibroXml.GetOrNull(fields, "ISSU_CUR_CD")?.Trim(),
  33. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "FIRST_ISSU_AMT")),
  34. SeibroXml.GetOrNull(fields, "ISSU_WHCD")?.Trim(),
  35. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "FACE_AMT")),
  36. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "SALE_AMT")),
  37. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "DISCN_RATE")),
  38. SeibroXml.GetOrNull(fields, "INT_PAY_MANN_TPCD")?.Trim(),
  39. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ISSU_DT")),
  40. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XPIR_DT")),
  41. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ELTSC_YN"))
  42. ));
  43. }
  44. return rows;
  45. }
  46. }