SeibroDivSchedulParser.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getDivSchedulInfo(배당일정) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// 자연키(ISSUCO_CUSTNO, RGT_STD_DT, RGT_RSN_DTAIL_SORT_CD) 중 하나라도 없거나 회사번호 비숫자·기준일 비형식이면 건너뛴다.
  5. /// 날짜 필드는 YYYYMMDD→DateOnly (빈값 null), ELTSC_YN 은 Y/N→bool (그 외 null).
  6. /// </summary>
  7. public static class SeibroDivSchedulParser
  8. {
  9. public sealed record Row(
  10. int IssucoCustno,
  11. string RepSecnNm,
  12. string? RgtRacd,
  13. string RgtRsnDetailSortCd,
  14. DateOnly RgtStdDt,
  15. string? AllocWhcd,
  16. string? SetaccTpcd,
  17. string? FixTpcd,
  18. DateOnly? RostCloseBeginDt,
  19. DateOnly? RostCloseExpryDt,
  20. DateOnly? XrgtDt,
  21. bool? IsElectronicSecurity
  22. );
  23. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  24. {
  25. var rows = new List<Row>();
  26. foreach (var fields in envelope.Rows)
  27. {
  28. var custno = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO"));
  29. var repSecnNm = SeibroXml.GetOrNull(fields, "REP_SECN_NM")?.Trim();
  30. var sortCd = SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim();
  31. var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
  32. if (custno is null || string.IsNullOrEmpty(repSecnNm) || string.IsNullOrEmpty(sortCd) || rgtStdDt is null)
  33. {
  34. continue;
  35. }
  36. rows.Add(new Row(
  37. custno.Value,
  38. repSecnNm,
  39. SeibroXml.GetOrNull(fields, "RGT_RACD")?.Trim(),
  40. sortCd,
  41. rgtStdDt.Value,
  42. SeibroXml.GetOrNull(fields, "ALOC_WHCD")?.Trim(),
  43. SeibroXml.GetOrNull(fields, "SETACC_TPCD")?.Trim(),
  44. SeibroXml.GetOrNull(fields, "FIX_TPCD")?.Trim(),
  45. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_BEGIN_DT")),
  46. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_EXPRY_DT")),
  47. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XRGT_DT")),
  48. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ELTSC_YN"))
  49. ));
  50. }
  51. return rows;
  52. }
  53. }