| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- namespace Infrastructure.StockData;
- /// <summary>
- /// SEIBro getOddLotInfo(단주대금) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
- /// ⚠️ 응답엔 ISSUCO_CUSTNO·지급일(TH1_PAY_TERM_BEGIN_DT)이 없다 — 요청 파라미터라 수집 배치가 스탬핑한다.
- /// 따라서 Row 는 권리기준일 이하 필드만 담는다. RGT_STD_DT 가 없으면 건너뛴다(자연키 일부).
- /// ESTM_STDPRC(산정기준가)는 NUMBER(9) 정수지만 방어적으로 decimal 로 읽는다.
- /// </summary>
- 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<Row> Parse(SeibroXml.Envelope envelope)
- {
- var rows = new List<Row>();
- 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;
- }
- }
|