namespace YLErp.Modules.SwapModule.Accrual; /// /// 计息政策(不可变配置)。把"算头算尾 / 单复利率 / 重置频率 / 年化天数"收敛为一处, /// 取代旧代码里散落各处的 calcFirst/calcLast 布尔对与魔法数字。 /// /// 单/复利不再另立枚举——直接复用既有 DB 枚举 InterestTypeEnum(单利=0 / 复利=1), /// 通过 暴露为类型安全的 bool。 /// public sealed class AccrualPolicy { /// 算头算尾约定(AccrualBoundary,物理上杜绝 calcFirst/calcLast 传反)。 public AccrualBoundary Convention { get; } /// 是否复利(利滚利)。来自 DB 的 InterestTypeEnum;单利=false,复利=true。 public bool IsCompound { get; } /// 利率重置周期(天)。FR007 通常为 7;复利时亦为"利息并入本金"的周期。 public int ResetPeriodDays { get; } /// 年化基数(365 / 360)。 public int AnnualDays { get; } /// 是否年化(position.IsAnnualized)。决定利息是否再除以 ; /// 与 一同收敛 daycount 语义,不再作为裸 bool 散落在计息签名里。 public bool IsAnnualized { get; } public AccrualPolicy(AccrualBoundary convention, bool isCompound, int resetPeriodDays, int annualDays, bool isAnnualized = false) => (Convention, IsCompound, ResetPeriodDays, AnnualDays, IsAnnualized) = (convention, isCompound, resetPeriodDays, annualDays, isAnnualized); /// 从 swap_position 构造 EOD 计息政策(算头算尾,重置周期取 interest_rest_days)。 public static AccrualPolicy BuildEod(DBModels.swap_position position, int annualDays, bool isCompound) => new(AccrualBoundary.Both, isCompound, position.interest_rest_days ?? 1, annualDays, position.IsAnnualized); }