From 9a091abf3deb288e3c3a688f784f02830710b33c Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Fri, 26 Nov 2021 23:41:02 +0100 Subject: [PATCH] Premium waiver: apply shifted time to child blocks --- R/InsuranceContract.R | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/R/InsuranceContract.R b/R/InsuranceContract.R index aa2112b..9d033ee 100644 --- a/R/InsuranceContract.R +++ b/R/InsuranceContract.R @@ -544,10 +544,22 @@ InsuranceContract = R6Class( } if (!is.null(self$blocks)) { for (b in self$blocks) { - .args = as.list(match.call()[-1]) - # correctly shift the valuesFrom by each block's blockStart parameter - .args$valuesFrom = max(0, .args$valuesFrom - b$Parameters$ContractData$blockStart) - do.call(b$calculateContract, .args) + # + # .args = as.list(match.call()[-1]) + # # correctly shift the valuesFrom by each block's blockStart parameter + # .args$valuesFrom = max(0, .args$valuesFrom - b$Parameters$ContractData$blockStart) + # do.call(b$calculateContract, .args) + # + b$calculateContract( + calculate = calculate, + valuesFrom = max(0, valuesFrom - b$Parameters$ContractData$blockStart), + premiumCalculationTime = max(0, premiumCalculationTime - b$Parameters$ContractData$blockStart), + preservePastPV = preservePastPV, + additionalCapital = additionalCapital, + recalculatePremiums = recalculatePremiums, + recalculatePremiumSum = recalculatePremiumSum, + history_comment = history_comment, + history_type = history_type) } } self$Values$int = private$determineInternalValues() @@ -775,19 +787,26 @@ InsuranceContract = R6Class( #' \code{sumInsured} is adjusted according to the existing reserves. #' #' @param t Time of the premium waiver. + #' @param ... Further parameters (currently unused) #' #' @examples #' # TODO - premiumWaiver = function(t) { + premiumWaiver = function(t, ...) { if (getOption('LIC.debug.premiumWaiver', FALSE)) { browser(); } - newSumInsured = self$Values$reserves[[toString(t), "PremiumFreeSumInsured"]]; + if (length(self$blocks) > 0) { + for (b in self$blocks) { + b$premiumWaiver(t - b$Parameters$ContractData$blockStart, ...) + } + } else { + newSumInsured = self$Values$reserves[[toString(t), "PremiumFreeSumInsured"]]; + self$Parameters$ContractData$sumInsured = newSumInsured; + } self$Parameters$ContractState$premiumWaiver = TRUE; self$Parameters$ContractState$surrenderPenalty = FALSE; # Surrender penalty has already been applied, don't apply a second time self$Parameters$ContractState$alphaRefunded = TRUE; # Alpha cost (if applicable) have already been refunded partially, don't refund again - - self$Parameters$ContractData$sumInsured = newSumInsured; + # TODO: Extract current amount of premium refund and feed that into the calculateContract function... self$calculateContract( valuesFrom = t, -- GitLab