| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- namespace Infrastructure.StockData;
- /// <summary>
- /// SEIBro getDivInfo(배당분배금내역) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
- /// ⚠️ 응답엔 ISSUCO_CUSTNO 가 없다(샘플 확인) — 종목 조인은 ISIN 으로 한다.
- /// 자연키(ISIN, RGT_STD_DT) 가 없거나 비형식인 행은 건너뛴다. 소수/율은 콤마 제거 후 decimal, 날짜는 YYYYMMDD→DateOnly.
- /// 차등배당 4필드는 대부분 빈값(무차등) → null. TH1_PAY_TERM_BEGIN_DT 는 스펙·샘플 모두 존재하나 미제공 시 null 방어.
- /// </summary>
- public static class SeibroDivInfoParser
- {
- public sealed record Row(
- string Isin,
- string KorSecnNm,
- string? SecnKacdNm,
- DateOnly RgtStdDt,
- decimal? Pval,
- decimal? StkAllocRatio,
- decimal? CashAllocRatio,
- decimal? CashAllocAmt,
- decimal? MartpDivRate,
- DateOnly? Th1PayTermBeginDt,
- DateOnly? DeliDt,
- bool? MajshrEtcDiffAllocYn,
- bool? TstkNoagnYn,
- decimal? CashDiffDiviAmt,
- decimal? CashDiffDiviRate,
- decimal? StkDiffDiviRate,
- decimal? MartpDiffDiviRate
- );
- 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 korSecnNm = SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim();
- var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
- if (string.IsNullOrEmpty(isin) || string.IsNullOrEmpty(korSecnNm) || rgtStdDt is null)
- {
- continue;
- }
- rows.Add(new Row(
- isin,
- korSecnNm,
- SeibroXml.GetOrNull(fields, "SECN_KACD_NM")?.Trim(),
- rgtStdDt.Value,
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "PVAL")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "STK_ALOC_RATIO")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_ALOC_RATIO")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_ALOC_AMT")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "MARTP_DIV_RATE")),
- SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "TH1_PAY_TERM_BEGIN_DT")),
- SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "DELI_DT")),
- SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "MAJSHR_ETC_DIFF_ALOC_YN")),
- SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "TSTK_NOAGN_YN")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_DIFF_DIVIAMT_VAL")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_DIFF_DIVI_RATE")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "STK_DIFF_DIVI_RATE")),
- SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "MARTP_DIFF_DIVI_RATE"))
- ));
- }
- return rows;
- }
- }
|