SeibroStddtParser.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getStddtInfo(기준일 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// 자연키(ISSUCO_CUSTNO, RGT_STD_DT, RGT_RACD, RGT_RSN_DTAIL_SORT_CD) 중 하나라도 없거나 회사번호 비숫자·기준일 비형식이면 건너뛴다.
  5. /// Wave 3 기업행위(총회·상호변경 등) 이벤트 발견 소스로 RGT_RACD 를 그대로 저장한다.
  6. /// </summary>
  7. public static class SeibroStddtParser
  8. {
  9. public sealed record Row(
  10. int IssucoCustno,
  11. string RepSecnNm,
  12. DateOnly RgtStdDt,
  13. string RgtRacd,
  14. string? RgtRacdNm,
  15. string RgtRsnDetailSortCd
  16. );
  17. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  18. {
  19. var rows = new List<Row>();
  20. foreach (var fields in envelope.Rows)
  21. {
  22. var custno = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO"));
  23. var repSecnNm = SeibroXml.GetOrNull(fields, "REP_SECN_NM")?.Trim();
  24. var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
  25. var rgtRacd = SeibroXml.GetOrNull(fields, "RGT_RACD")?.Trim();
  26. var sortCd = SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim();
  27. if (custno is null || string.IsNullOrEmpty(repSecnNm) || rgtStdDt is null || string.IsNullOrEmpty(rgtRacd) || string.IsNullOrEmpty(sortCd))
  28. {
  29. continue;
  30. }
  31. rows.Add(new Row(
  32. custno.Value,
  33. repSecnNm,
  34. rgtStdDt.Value,
  35. rgtRacd,
  36. SeibroXml.GetOrNull(fields, "RGT_RACD_NM")?.Trim(),
  37. sortCd
  38. ));
  39. }
  40. return rows;
  41. }
  42. }