| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- namespace Infrastructure.StockData;
- /// <summary>
- /// SEIBro getStkListInfo(주식 상장/유통형태 변경) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
- /// 자연키(ISIN, SHOTN_ISIN, KOR_SECN_NM, APLI_DT) 중 하나라도 없거나 적용일 비형식이면 건너뛴다.
- /// BFALT/AFALT_CIRCL_FORM 은 빈값(신규 등록 등) 가능 → null. 코드 원문 문자열로 담는다.
- /// </summary>
- 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<Row> Parse(SeibroXml.Envelope envelope)
- {
- var rows = new List<Row>();
- 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;
- }
- }
|