namespace Infrastructure.StockData;
///
/// SEIBro getStkListInfo(주식 상장/유통형태 변경) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
/// 자연키(ISIN, SHOTN_ISIN, KOR_SECN_NM, APLI_DT) 중 하나라도 없거나 적용일 비형식이면 건너뛴다.
/// BFALT/AFALT_CIRCL_FORM 은 빈값(신규 등록 등) 가능 → null. 코드 원문 문자열로 담는다.
///
public static class SeibroStkListParser
{
public sealed record Row(
int? IssucoCustno,
string Isin,
string ShotnIsin,
string KorSecnNm,
string? BfaltCirclForm,
string? AfaltCirclForm,
DateOnly ApliDt
);
public static IReadOnlyList Parse(SeibroXml.Envelope envelope)
{
var rows = new List();
foreach (var fields in envelope.Rows)
{
var isin = SeibroXml.GetOrNull(fields, "ISIN")?.Trim();
var shotnIsin = SeibroXml.GetOrNull(fields, "SHOTN_ISIN")?.Trim();
var korSecnNm = SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim();
var apliDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "APLI_DT"));
if (string.IsNullOrEmpty(isin) || string.IsNullOrEmpty(shotnIsin) || string.IsNullOrEmpty(korSecnNm) || apliDt is null)
{
continue;
}
rows.Add(new Row(
SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")),
isin,
shotnIsin,
korSecnNm,
SeibroXml.GetOrNull(fields, "BFALT_CIRCL_FORM")?.Trim(),
SeibroXml.GetOrNull(fields, "AFALT_CIRCL_FORM")?.Trim(),
apliDt.Value
));
}
return rows;
}
}