namespace Infrastructure.StockData; /// /// SEIBro getOddLotInfo(단주대금) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// ⚠️ 응답엔 ISSUCO_CUSTNO·지급일(TH1_PAY_TERM_BEGIN_DT)이 없다 — 요청 파라미터라 수집 배치가 스탬핑한다. /// 따라서 Row 는 권리기준일 이하 필드만 담는다. RGT_STD_DT 가 없으면 건너뛴다(자연키 일부). /// ESTM_STDPRC(산정기준가)는 NUMBER(9) 정수지만 방어적으로 decimal 로 읽는다. /// public static class SeibroOddLotParser { public sealed record Row( DateOnly RgtStdDt, string? RgtRacd, string? RgtRacdNm, string? RgtRsnDetailSortCd, string? EstmStdTpcd, DateOnly? EstmStdDt, decimal? EstmStdprc, DateOnly? RostCloseBeginDt, DateOnly? RostCloseExpryDt, DateOnly? XrgtDt ); public static IReadOnlyList Parse(SeibroXml.Envelope envelope) { var rows = new List(); foreach (var fields in envelope.Rows) { var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT")); if (rgtStdDt is null) { continue; } rows.Add(new Row( rgtStdDt.Value, SeibroXml.GetOrNull(fields, "RGT_RACD")?.Trim(), SeibroXml.GetOrNull(fields, "RGT_RACD_NM")?.Trim(), SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim(), SeibroXml.GetOrNull(fields, "ESTM_STD_TPCD")?.Trim(), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ESTM_STD_DT")), SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "ESTM_STDPRC")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_BEGIN_DT")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_EXPRY_DT")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XRGT_DT")) )); } return rows; } }