namespace Infrastructure.StockData;
///
/// SEIBro getIntPayInfo(채권 이자지급 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
/// ⚠️ 실샘플 fixture 가 result="0"(빈) 이라 필드 매핑은 채권.md 스펙 기준 — 운영 첫 수집 시 로그로 확인.
/// ⚠️ 응답에 ISIN 필드가 없다(요청 파라미터로만 받음) — Isin 은 배치가 요청값을 스탬핑하므로 여기선 필드 묶음만 반환.
/// 종목당 1행이라 첫 행만 의미가 있으나 방어적으로 전 행 반환. Y/N→bool, 날짜→DateOnly, 숫자→decimal/int.
///
public static class SeibroIntPayParser
{
public sealed record Row(
decimal? CouponRate,
string? IntPayWayTpcd,
int? IntPayCycleTerms,
string? IntPayCycleTpcd,
string? RvltSeverTpcd,
bool? AcrintPayYn,
string? BankHolidayIntPaydayTpcd,
string? IntPayTimsTpcd,
DateOnly? BeforeDate,
DateOnly? AfterDate
);
public static IReadOnlyList Parse(SeibroXml.Envelope envelope)
{
var rows = new List();
foreach (var fields in envelope.Rows)
{
rows.Add(new Row(
SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "COUPON_RATE")),
SeibroXml.GetOrNull(fields, "INT_PAY_WAY_TPCD")?.Trim(),
SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "INT_PAY_CYCLE_TERMS")),
SeibroXml.GetOrNull(fields, "INT_PAY_CYCLE_TPCD")?.Trim(),
SeibroXml.GetOrNull(fields, "RVLT_SEVER_TPCD")?.Trim(),
SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ACRINT_PAY_YN")),
SeibroXml.GetOrNull(fields, "BANK_HOLIDAY_INT_PAYDD_TPCD")?.Trim(),
SeibroXml.GetOrNull(fields, "INT_PAY_TIMS_TPCD")?.Trim(),
SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "BEFORE_DATE")),
SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "AFTER_DATE"))
));
}
return rows;
}
}