SeibroBondStatParser.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using Domain.Entities.Stocks;
  2. namespace Infrastructure.StockData;
  3. /// <summary>
  4. /// SEIBro getBondStatInfo(채권 종목 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  5. /// ⚠️ 응답에 ISIN 필드가 없다(요청 파라미터로만 받음, 실샘플 확인) — Isin 은 배치가 요청값을 스탬핑하므로 여기선 필드 묶음만 반환.
  6. /// 신용등급 4사 코드(KIS/NICE/SCI/KR_VALAT_GRD_CD)는 원문 문자열, Y/N→bool, 날짜→DateOnly, 콤마 숫자→decimal.
  7. /// getBondStatInfo 는 종목당 1행이라 첫 행만 의미가 있으나 방어적으로 전 행 반환.
  8. /// </summary>
  9. public static class SeibroBondStatParser
  10. {
  11. public static IReadOnlyList<BondMasterFields> Parse(SeibroXml.Envelope envelope)
  12. {
  13. var rows = new List<BondMasterFields>();
  14. foreach (var fields in envelope.Rows)
  15. {
  16. rows.Add(new BondMasterFields(
  17. SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")),
  18. SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim(),
  19. SeibroXml.GetOrNull(fields, "SECN_KACD")?.Trim(),
  20. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ISSU_DT")),
  21. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XPIR_DT")),
  22. SeibroXml.GetOrNull(fields, "ISSU_CUR_CD")?.Trim(),
  23. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "FIRST_ISSU_AMT")),
  24. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "ISSU_REMA")),
  25. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "PAYIN_AMT")),
  26. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "COUPON_RATE")),
  27. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XPIRED_RATE")),
  28. SeibroXml.GetOrNull(fields, "RECU_WHCD")?.Trim(),
  29. SeibroXml.GetOrNull(fields, "ISSU_WHCD")?.Trim(),
  30. SeibroXml.GetOrNull(fields, "PARTICUL_BOND_KIND_TPCD")?.Trim(),
  31. SeibroXml.GetOrNull(fields, "OPTION_TPCD")?.Trim(),
  32. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "FORC_ERLY_RED_YN")),
  33. SeibroXml.GetOrNull(fields, "MR_CHG_TPCD")?.Trim(),
  34. SeibroXml.GetOrNull(fields, "REGI_ORG_TPCD")?.Trim(),
  35. SeibroXml.GetOrNull(fields, "GRTY_TPCD")?.Trim(),
  36. SeibroXml.GetOrNull(fields, "SIGNA_TPCD")?.Trim(),
  37. SeibroXml.GetOrNull(fields, "RANK_TPCD")?.Trim(),
  38. SeibroXml.GetOrNull(fields, "INT_PAY_WAY_TPCD")?.Trim(),
  39. SeibroXml.GetOrNull(fields, "SINT_CINT_TPCD")?.Trim(),
  40. SeibroXml.GetOrNull(fields, "IRATE_CHG_TPCD")?.Trim(),
  41. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XPIR_GUAR_PRATE")),
  42. SeibroXml.GetOrNull(fields, "XPIR_GUAR_PRATE_TPCD")?.Trim(),
  43. SeibroXml.GetOrNull(fields, "PRCP_RED_WHCD")?.Trim(),
  44. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "APLI_DT")),
  45. SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "DLIST_DT")),
  46. SeibroXml.GetOrNull(fields, "KIS_VALAT_GRD_CD")?.Trim(),
  47. SeibroXml.GetOrNull(fields, "NICE_VALAT_GRD_CD")?.Trim(),
  48. SeibroXml.GetOrNull(fields, "SCI_VALAT_GRD_CD")?.Trim(),
  49. SeibroXml.GetOrNull(fields, "KR_VALAT_GRD_CD")?.Trim(),
  50. SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ELTSC_YN")),
  51. SeibroXml.GetOrNull(fields, "EXER_MBODY_TPCD")?.Trim(),
  52. SeibroXml.GetOrNull(fields, "INT_ESTM_MANN_TPCD")?.Trim()
  53. ));
  54. }
  55. return rows;
  56. }
  57. }