private static Loan GetTestLoan( AccrualBasis accrualBasis = AccrualBasis.ActualActual, decimal amount = 0, decimal interestRate = 0, DateTime?interestAccrualStartDate = null, DateTime?maturityDate = null ) => new Loan { AccrualBasis = accrualBasis, Amount = amount, InterestRate = interestRate, InterestAccrualStartDate = interestAccrualStartDate ?? new DateTime(2001, 1, 1), MaturityDate = maturityDate ?? new DateTime(2002, 1, 1) };
internal static decimal CalculateTerm( LocalDate startDate, LocalDate endDate, AccrualBasis accrualBasis ) { var years = Period.Between(startDate, endDate, PeriodUnits.Years).Years; var startPlusYears = startDate.PlusYears(years); decimal days = Period.Between(startPlusYears, endDate, PeriodUnits.Days).Days; var remainingYearPart = accrualBasis switch { AccrualBasis.Actual360 => days / 360, AccrualBasis.Actual365 => days / 365, AccrualBasis.ActualActual => days / CalendarSystem.Gregorian.GetDaysInYear(endDate.Year), AccrualBasis.Thirty360 => GetDaysForThirty360(startPlusYears, endDate) / 360, _ => throw new InvalidOperationException("shouldn't happen") }; return(years + remainingYearPart); }
private static int GetDaysInYear(AccrualBasis accrualBasis, int year) => accrualBasis switch {
public Loan(string loanId, double originalBalance, double currentBalance, DateTime firstPaymentDate, DateTime factorDate, int originalLoanTerm, int originalAmortTerm, int originalIOTerm, double grossCoupon, double feeStrip, AccrualBasis accrualBasis, string originalPrepaymentString) { loan = CreateLoan(loanId, originalBalance, currentBalance, firstPaymentDate.toYYYYMMDD(), factorDate.toYYYYMMDD(), originalLoanTerm, originalAmortTerm, originalIOTerm, grossCoupon, feeStrip, accrualBasis, originalPrepaymentString); }
private static extern IntPtr CreateLoan([MarshalAs(UnmanagedType.LPStr)] string loanId, double originalBalance, double currentBalance, int firstPaymentDateYYYYMMDD, int factorDateYYYYMMDD, int originalLoanTerm, int originalAmortTerm, int originalIOTerm, double grossCoupon, double feeStrip, AccrualBasis accrualBasis, string originalPrepaymentString);