namespace Infrastructure.StockData; /// /// SEIBro getRedCondiInfo(파생결합증권 상환조건) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// 실샘플 래퍼 = <RESULT> **대문자** (readme §1 확정 — 파생결합 5종 중 하나). /// ⚠️ 응답에 ISIN 이 없어(요청 파라미터로만 받음) 배치가 요청 ISIN 을 스탬핑 — 여기선 (RedCondiTpcd, ValatNtimesSeq, 값) 반환. /// 자연키 RED_CONDI_TPCD·VALAT_NTIMES_SEQ 없으면 스킵. 상환조건/계산식은 최대 1000자 자유 텍스트. /// public static class SeibroRedCondiParser { public sealed record Row( string RedCondiTpcd, int ValatNtimesSeq, DateOnly? MidValatPayDt, DateOnly? MidValatBeginDt, DateOnly? MidValatExpryDt, string? RedCondiContent, string? RedFormulaContent ); public static IReadOnlyList Parse(SeibroXml.Envelope envelope) { var rows = new List(); foreach (var fields in envelope.Rows) { var tpcd = SeibroXml.GetOrNull(fields, "RED_CONDI_TPCD")?.Trim(); var seq = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "VALAT_NTIMES_SEQ")); if (string.IsNullOrEmpty(tpcd) || seq is null) { continue; } rows.Add(new Row( tpcd, seq.Value, SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MID_VALAT_PAY_DT")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MID_VALAT_BEGIN_DT")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MID_VALAT_EXPRY_DT")), SeibroXml.GetOrNull(fields, "RED_CONDI_CONTENT")?.Trim(), SeibroXml.GetOrNull(fields, "RED_FORMULA_CONTENT")?.Trim() )); } return rows; } }