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;
}
}