PaymentSchedule.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 대금지급일정 정보 (getCostPaySchedul) — 배당금/단주대금 지급일정 (Wave 3).
  5. /// 날짜 스윕(대금지급일 TH1_PAY_TERM_BEGIN_DT × 지급구분 PAY_COST_TPCD{1배당금,3단주대금}) → 지급일 window delete+insert.
  6. /// ⚠️ 응답엔 TH1_PAY_TERM_BEGIN_DT·PAY_COST_TPCD 가 없어(요청 파라미터) 수집 배치가 스탬핑한다.
  7. /// 단주대금(PayCostTpcd=3) 지급건은 OddLotPayment(getOddLotInfo) 수집 트리거가 된다.
  8. /// </summary>
  9. public class PaymentSchedule
  10. {
  11. [Key]
  12. public int ID { get; private set; }
  13. /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
  14. public int IssucoCustno { get; private set; }
  15. /// <summary>종목번호 (ISIN)</summary>
  16. public string Isin { get; private set; } = default!;
  17. /// <summary>한글종목명 (KOR_SECN_NM)</summary>
  18. public string? KorSecnNm { get; private set; }
  19. /// <summary>종목종류코드 (SECN_KACD) — 101보통주 201우선주</summary>
  20. public string? SecnKacd { get; private set; }
  21. /// <summary>권리기준일자 (RGT_STD_DT)</summary>
  22. public DateOnly? RgtStdDt { get; private set; }
  23. /// <summary>권리사유명 (RGT_RACD_NM) — 예 국내CB행사·국내BW행사 (실샘플 확인, 가이드 xlsx 누락분)</summary>
  24. public string? RgtRacdNm { get; private set; }
  25. /// <summary>권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)</summary>
  26. public string? RgtRsnDetailSortCd { get; private set; }
  27. /// <summary>지급대금구분코드 (PAY_COST_TPCD, 요청 스탬핑) — 1배당금 3단주대금</summary>
  28. public string PayCostTpcd { get; private set; } = default!;
  29. /// <summary>대금지급일 (TH1_PAY_TERM_BEGIN_DT, 요청 스탬핑) — 1차지급기간시작일</summary>
  30. public DateOnly Th1PayTermBeginDt { get; private set; }
  31. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  32. private PaymentSchedule() { }
  33. public static PaymentSchedule Create(
  34. int issucoCustno,
  35. string isin,
  36. string? korSecnNm,
  37. string? secnKacd,
  38. DateOnly? rgtStdDt,
  39. string? rgtRacdNm,
  40. string? rgtRsnDetailSortCd,
  41. string payCostTpcd,
  42. DateOnly th1PayTermBeginDt)
  43. {
  44. if (string.IsNullOrWhiteSpace(isin))
  45. {
  46. throw new ArgumentException("isin required", nameof(isin));
  47. }
  48. if (string.IsNullOrWhiteSpace(payCostTpcd))
  49. {
  50. throw new ArgumentException("payCostTpcd required", nameof(payCostTpcd));
  51. }
  52. return new PaymentSchedule
  53. {
  54. IssucoCustno = issucoCustno,
  55. Isin = isin.Trim(),
  56. KorSecnNm = Trimmed(korSecnNm),
  57. SecnKacd = Trimmed(secnKacd),
  58. RgtStdDt = rgtStdDt,
  59. RgtRacdNm = Trimmed(rgtRacdNm),
  60. RgtRsnDetailSortCd = Trimmed(rgtRsnDetailSortCd),
  61. PayCostTpcd = payCostTpcd.Trim(),
  62. Th1PayTermBeginDt = th1PayTermBeginDt
  63. };
  64. }
  65. private static string? Trimmed(string? value)
  66. {
  67. return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
  68. }
  69. }