SeibroGmeetParser.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getGmeetInfo(총회일정) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// 자연키(ISSUCO_CUSTNO, RGT_STD_DT, GMET_KACD) 중 하나라도 없거나 회사번호 비숫자·기준일 비형식이면 건너뛴다.
  5. /// 날짜(YYYYMMDD)→DateOnly, Y/N→bool. GMET_TTM 은 HHmm 문자열 그대로.
  6. /// </summary>
  7. public static class SeibroGmeetParser
  8. {
  9. public sealed record Row(
  10. int IssucoCustno,
  11. string? IssuinNo,
  12. string GmetKacd,
  13. string? RgtRsnDetailSortCd,
  14. DateOnly? RostCloseBeginDt,
  15. DateOnly? RostCloseExpryDt,
  16. bool? GmetOmeetYn,
  17. string? GmetPlaceTpcd,
  18. DateOnly? CouncilDterminPubnDt,
  19. string? GmetPlace,
  20. bool? StkBuyreqRlYn,
  21. DateOnly RgtStdDt,
  22. DateOnly? GmetDt,
  23. string? GmetTtm,
  24. DateOnly? NotcDlineDt,
  25. bool? DferYn,
  26. bool? EvoteYn,
  27. bool? IsElectronicSecurity
  28. );
  29. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  30. {
  31. var rows = new List<Row>();
  32. foreach (var fields in envelope.Rows)
  33. {
  34. var custno = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO"));
  35. var gmetKacd = SeibroXml.GetOrNull(fields, "GMET_KACD")?.Trim();
  36. var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
  37. if (custno is null || string.IsNullOrEmpty(gmetKacd) || rgtStdDt is null)
  38. {
  39. continue;
  40. }
  41. rows.Add(new Row(
  42. custno.Value,
  43. SeibroXml.GetOrNull(fields, "ISSUIN_NO")?.Trim(),
  44. gmetKacd,
  45. SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim(),
  46. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_BEGIN_DT")),
  47. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_EXPRY_DT")),
  48. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "GMET_OMEET_YN")),
  49. SeibroXml.GetOrNull(fields, "GMET_PLACE_TPCD")?.Trim(),
  50. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "COUNCL_DTERMIN_PUBN_DT")),
  51. SeibroXml.GetOrNull(fields, "GMET_PLACE")?.Trim(),
  52. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "STK_BUYREQ_RL_YN")),
  53. rgtStdDt.Value,
  54. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "GMET_DT")),
  55. SeibroXml.GetOrNull(fields, "GMET_TTM")?.Trim(),
  56. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "NOTC_DLINE_DT")),
  57. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "DFER_YN")),
  58. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "EVOTE_YN")),
  59. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ELTSC_YN"))
  60. ));
  61. }
  62. return rows;
  63. }
  64. }