namespace Infrastructure.StockData; /// /// SEIBro getFmnmAltInfo(상호변경) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력. /// 자연키(ISSUCO_CUSTNO, RGT_STD_DT) 중 하나라도 없거나 비형식이면 건너뛴다. /// 상호(전/후·국/영)·혼용유통기간·단일유통일 매핑. /// public static class SeibroFmnmAltParser { public sealed record Row( int IssucoCustno, DateOnly RgtStdDt, string? FmnmBfaltKorNm, string? FmnmBfaltEngNm, string? FmnmAltKorNm, string? FmnmAltEngNm, DateOnly? MixusCirclBeginDt, DateOnly? MixusCirclExpryDt, DateOnly? UniCirclDt ); 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 rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT")); if (custno is null || rgtStdDt is null) { continue; } rows.Add(new Row( custno.Value, rgtStdDt.Value, SeibroXml.GetOrNull(fields, "FMNM_BFALT_KOR_NM")?.Trim(), SeibroXml.GetOrNull(fields, "FMNM_BFALT_ENG_NM")?.Trim(), SeibroXml.GetOrNull(fields, "FMNM_ALT_KOR_NM")?.Trim(), SeibroXml.GetOrNull(fields, "FMNM_ALT_ENG_NM")?.Trim(), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MIXUS_CIRCL_BEGIN_DT")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "MIXUS_CIRCL_EXPRY_DT")), SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "UNI_CIRCL_DT")) )); } return rows; } }