From 752dbb8519c089a0d9bd6f28c7ae41226379d5e4 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sun, 22 Jan 2023 21:47:09 +0100
Subject: [PATCH] Fixes for sumInsured calculation, addExtension

* Fix sumInsured calcualtion from given premium
* unittest for addExtension with different tariff
* Fix policyPeriod for main contract with multiple blocks (e.g. addExtension)
* Clean up unit tests
---
 R/InsuranceContract.R                |  3 +++
 tests/testthat/test-CF-Annuity.R     | 33 ++++++++++++++++++++++++++++
 tests/testthat/test-extendContract.R |  4 ++++
 3 files changed, 40 insertions(+)

diff --git a/R/InsuranceContract.R b/R/InsuranceContract.R
index acf4e74..492353a 100644
--- a/R/InsuranceContract.R
+++ b/R/InsuranceContract.R
@@ -856,8 +856,10 @@ InsuranceContract = R6Class(
             colIntR = rep(NA_real_, rows)
             colDur = rep(NA_real_, rows)
             colPrem = rep(NA_real_, rows)
+            polPeriod = self$Parameters$ContractData$policyPeriod
             for (b in self$blocks) {
                 start = b$Parameters$ContractData$blockStart
+                polPeriod = max(polPeriod, b$Parameters$ContractData$policyPeriod + start)
                 colDt = coalesce(colDt, pad0(b$Values$reservesBalanceSheet[,"date"],     start = start, value = as.Date(NA), value.start = as.Date(NA), l = rows))
                 colTime = coalesce(colTime, pad0(b$Values$reservesBalanceSheet[,"time"] + start, start = start, value = NA, value.start = NA, l = rows))
 
@@ -865,6 +867,7 @@ InsuranceContract = R6Class(
                 colDur  = coalesce(colDur,  pad0(b$Values$basicData[,"PolicyDuration"],  start = start, value = NA, value.start = NA, l = rows))
                 colPrem = coalesce(colPrem, pad0(b$Values$basicData[,"PremiumPeriod"],   start = start, value = NA, value.start = NA, l = rows))
             }
+            self$Parameters$ContractData$policyPeriod = polPeriod;
             self$Values$reservesBalanceSheet[,"date"] = colDt;
             self$Values$reservesBalanceSheet[,"time"] = colTime;
             self$Values$basicData[,"InterestRate"] = colIntR
diff --git a/tests/testthat/test-CF-Annuity.R b/tests/testthat/test-CF-Annuity.R
index ed4a930..90ab579 100644
--- a/tests/testthat/test-CF-Annuity.R
+++ b/tests/testthat/test-CF-Annuity.R
@@ -33,3 +33,36 @@ test_that("Annuity Cash Flows", {
     expect_equal(Contract.Annuity$Values$cashFlows$survival_advance, c(rep(1, 55), 0))
 })
 
+Tarif.Annuity = InsuranceTarif$new(
+    name = "Example Tariff - Immediate Annuity",
+    type = "annuity",
+    tarif = "Ann1",
+    desc = "An annuity with single-premium",
+    premiumPeriod = 1,
+
+    mortalityTable = AVOe2005R.unisex,
+    i = 0.005
+)
+Contract.Annuity = InsuranceContract$new(
+    tarif = Tarif.Annuity,
+    age = 65, YOB = 1955,
+    sumInsured = 1200,
+    policyPeriod = 55,
+    contractClosing = as.Date("2020-09-01")
+)
+
+Contract.Annuity$Parameters$ContractData$sumInsured
+Contract.Annuity$Values$premiums
+
+
+Contract.Annuity1 = InsuranceContract$new(
+    tarif = Tarif.Annuity,
+    age = 65, YOB = 1955,
+    premium = 32004.67817,
+    # sumInsured = NULL,
+    policyPeriod = 55,
+    contractClosing = as.Date("2020-09-01")
+)
+Contract.Annuity1$Parameters$ContractData$sumInsured
+
+Contract.Annuity1$Values$premiums
diff --git a/tests/testthat/test-extendContract.R b/tests/testthat/test-extendContract.R
index 59e0413..e0a9f0f 100644
--- a/tests/testthat/test-extendContract.R
+++ b/tests/testthat/test-extendContract.R
@@ -40,4 +40,8 @@ test_that("Extend contract by $addExtension", {
     ContractD = ContractA$clone()$addExtension(id = "Verlängerung1", contractPeriod = 5, sumInsured = 20000)
     expect_equal(ContractD$blocks$Verlängerung1$Values$premiums[["written"]], 315.109)
     expect_equal(ContractD$blocks$Verlängerung1$Values$reserves[["0", "contractual"]], 10000)
+
+    # extension with increased sumInsured and different tariff: check whether interest rate has really changed
+    ContractE = ContractA$clone()$addExtension(id = "Verlängerung1", contractPeriod = 5, sumInsured = 20000, tarif = Tarif.EndowmentB)
+    expect_equal(unname(ContractE$Values$basicData[c(1,20,30,40), "InterestRate"]), c(0.03, 0.03, 0.01, 0.01))
 })
-- 
GitLab