namespace Infrastructure.StockData; /// /// SEIBro getCostPaySchedul(대금지급일정) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// ⚠️ 응답엔 지급구분(PAY_COST_TPCD)·지급일(TH1_PAY_TERM_BEGIN_DT)이 없다 — 요청 파라미터라 수집 배치가 스탬핑한다. /// 따라서 Row 는 회사/종목/사유 필드만 담는다. ISSUCO_CUSTNO·ISIN 중 하나라도 없으면 건너뛴다. /// public static class SeibroCostPaySchedulParser { public sealed record Row( int IssucoCustno, string Isin, string? KorSecnNm, string? SecnKacd, DateOnly? RgtStdDt, string? RgtRacdNm, string? RgtRsnDetailSortCd ); public static IReadOnlyList Parse(SeibroXml.Envelope envelope) { var rows = new List(); foreach (var fields in envelope.Rows) { var custno = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")); var isin = SeibroXml.GetOrNull(fields, "ISIN")?.Trim(); if (custno is null || string.IsNullOrEmpty(isin)) { continue; } rows.Add(new Row( custno.Value, isin, SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim(), SeibroXml.GetOrNull(fields, "SECN_KACD")?.Trim(), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT")), SeibroXml.GetOrNull(fields, "RGT_RACD_NM")?.Trim(), SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim() )); } return rows; } }