diff --git a/R/InsuranceParameters.R b/R/InsuranceParameters.R index 388ef50b5fc9df7cf8f89b1fbf20b6872a7b1987..2dd20cf46dbfae0bec451dacc8e5885108896621 100644 --- a/R/InsuranceParameters.R +++ b/R/InsuranceParameters.R @@ -255,7 +255,11 @@ InsuranceContract.Values = list( #' month are relevant.} #' \item{\code{$balanceSheetMethod}}{How to interpolate the balance sheet #' reserves (at the balandeSheetDate) from the yearly contractual -#' reserves.} +#' reserves. Either a string "30/360", "act/act", "act/360", "act/365" +#' or a function with signature \code{balanceSheetMethod(params, contractDates, balanceDates)} +#' that returns a vector of coefficients for each year to +#' interpolate the reserves available at the given \code{contractDates} +#' for the desirec \code{balanceDates}}} #' \item{\code{$surrenderValueCalculation}}{A function describing the surrender #' value calculation.} #' \item{\code{$premiumFrequencyOrder}}{Order of the approximation for diff --git a/R/InsuranceTarif.R b/R/InsuranceTarif.R index c978c1102fbc5f7fedafd8a2d23e8806bf2b0ee2..7f3a26b5c7b8696a749ae2071b67955125ba44d6 100644 --- a/R/InsuranceTarif.R +++ b/R/InsuranceTarif.R @@ -1082,7 +1082,9 @@ InsuranceTarif = R6Class( contractDates = params$ContractData$contractClosing + years(1:years); balanceDates = balanceDate + years(1:years - 1); - if (params$ActuarialBases$balanceSheetMethod == "30/360") { + if (is.function(params$ActuarialBases$balanceSheetMethod)) { + baf = params$ActuarialBases$balanceSheetMethod(params = params, contractDates = contractDates, balanceDates = balanceDates) + } else if (params$ActuarialBases$balanceSheetMethod == "30/360") { baf = ((month(balanceDates + days(1)) - month(contractDates) - 1) %% 12 + 1) / 12 } else if (params$ActuarialBases$balanceSheetMethod == "act/act") { baf = as.numeric((balanceDates + days(1)) - contractDates, units = "days" ) / as.numeric(balanceDates - (balanceDates - years(1)), units = "days")