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