From feeb49e78a8f52d2714cd31830bedc36f0b6df4b Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold.kainhofer@at.ey.com>
Date: Tue, 3 Nov 2020 17:34:15 +0100
Subject: [PATCH] Allow arbitrary balance sheet reserve interpolation method
 (by passing a function for the balanceSheetMethod parameter)

---
 R/InsuranceParameters.R | 6 +++++-
 R/InsuranceTarif.R      | 4 +++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/R/InsuranceParameters.R b/R/InsuranceParameters.R
index 388ef50..2dd20cf 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 c978c11..7f3a26b 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")
-- 
GitLab