SeibroCostPaySchedulParser.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getCostPaySchedul(대금지급일정) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// ⚠️ 응답엔 지급구분(PAY_COST_TPCD)·지급일(TH1_PAY_TERM_BEGIN_DT)이 없다 — 요청 파라미터라 수집 배치가 스탬핑한다.
  5. /// 따라서 Row 는 회사/종목/사유 필드만 담는다. ISSUCO_CUSTNO·ISIN 중 하나라도 없으면 건너뛴다.
  6. /// </summary>
  7. public static class SeibroCostPaySchedulParser
  8. {
  9. public sealed record Row(
  10. int IssucoCustno,
  11. string Isin,
  12. string? KorSecnNm,
  13. string? SecnKacd,
  14. DateOnly? RgtStdDt,
  15. string? RgtRacdNm,
  16. string? RgtRsnDetailSortCd
  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 custno = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO"));
  24. var isin = SeibroXml.GetOrNull(fields, "ISIN")?.Trim();
  25. if (custno is null || string.IsNullOrEmpty(isin))
  26. {
  27. continue;
  28. }
  29. rows.Add(new Row(
  30. custno.Value,
  31. isin,
  32. SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim(),
  33. SeibroXml.GetOrNull(fields, "SECN_KACD")?.Trim(),
  34. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT")),
  35. SeibroXml.GetOrNull(fields, "RGT_RACD_NM")?.Trim(),
  36. SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim()
  37. ));
  38. }
  39. return rows;
  40. }
  41. }