SeibroStkListParser.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getStkListInfo(주식 상장/유통형태 변경) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// 자연키(ISIN, SHOTN_ISIN, KOR_SECN_NM, APLI_DT) 중 하나라도 없거나 적용일 비형식이면 건너뛴다.
  5. /// BFALT/AFALT_CIRCL_FORM 은 빈값(신규 등록 등) 가능 → null. 코드 원문 문자열로 담는다.
  6. /// </summary>
  7. public static class SeibroStkListParser
  8. {
  9. public sealed record Row(
  10. int? IssucoCustno,
  11. string Isin,
  12. string ShotnIsin,
  13. string KorSecnNm,
  14. string? BfaltCirclForm,
  15. string? AfaltCirclForm,
  16. DateOnly ApliDt
  17. );
  18. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  19. {
  20. var rows = new List<Row>();
  21. foreach (var fields in envelope.Rows)
  22. {
  23. var isin = SeibroXml.GetOrNull(fields, "ISIN")?.Trim();
  24. var shotnIsin = SeibroXml.GetOrNull(fields, "SHOTN_ISIN")?.Trim();
  25. var korSecnNm = SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim();
  26. var apliDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "APLI_DT"));
  27. if (string.IsNullOrEmpty(isin) || string.IsNullOrEmpty(shotnIsin) || string.IsNullOrEmpty(korSecnNm) || apliDt is null)
  28. {
  29. continue;
  30. }
  31. rows.Add(new Row(
  32. SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")),
  33. isin,
  34. shotnIsin,
  35. korSecnNm,
  36. SeibroXml.GetOrNull(fields, "BFALT_CIRCL_FORM")?.Trim(),
  37. SeibroXml.GetOrNull(fields, "AFALT_CIRCL_FORM")?.Trim(),
  38. apliDt.Value
  39. ));
  40. }
  41. return rows;
  42. }
  43. }