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);
}