From 047b60fbddb898e119bc2a8b8a6e6621dc936d5a Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Fri, 22 Apr 2016 00:33:14 +0200
Subject: [PATCH] Add the cost present values (absolute value, i.e. multiplied
 by the premiums and premium sum where applicable) to the present values
 vector for later use.

This also fixes the net reserves calculation
---
 R/InsuranceContract.R |  4 ++--
 R/InsuranceTarif.R    | 30 ++++++++++++++++++++++++------
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/R/InsuranceContract.R b/R/InsuranceContract.R
index 0a113c2..b2717b9 100644
--- a/R/InsuranceContract.R
+++ b/R/InsuranceContract.R
@@ -340,7 +340,7 @@ InsuranceContract = R6Class(
 
     # Add total benefits present value to the PV array. This can only be done after premium calculation, because e.g. premium refund depends on gross premium!
     calculatePresentValuesAllBenefits = function() {
-      pvAllBenefits = self$tarif$presentValueBenefits(presentValues = self$presentValues, premiums = self$premiums, sumInsured = self$sumInsured );
+      pvAllBenefits = self$tarif$presentValueBenefits(presentValues = self$presentValues, presentValuesCosts = self$presentValuesCosts, premiums = self$premiums, sumInsured = self$sumInsured, premiumSum = self$premiumSum );
       self$presentValues = cbind(self$presentValues, pvAllBenefits)
       self$presentValues
     },
@@ -354,7 +354,7 @@ InsuranceContract = R6Class(
     },
 
     calculateReserves = function() {
-      self$reserves = self$tarif$reserveCalculation(premiums=self$premiums, pvBenefits=self$presentValues, pvCosts=self$presentValuesCosts, sumInsured=self$sumInsured, loadings = self$loadings);
+      self$reserves = self$tarif$reserveCalculation(premiums=self$premiums, pvBenefits=self$presentValues, pvCosts=self$presentValuesCosts, sumInsured=self$sumInsured, premiumSum = self$premiumSum, loadings = self$loadings);
     },
 
     premiumAnalysis = function() {
diff --git a/R/InsuranceTarif.R b/R/InsuranceTarif.R
index e6bbbe9..a3f5b89 100644
--- a/R/InsuranceTarif.R
+++ b/R/InsuranceTarif.R
@@ -248,12 +248,24 @@ InsuranceTarif = R6Class(
       dimnames(res) = list(nm[[1]], colnames)
       res
     },
-    presentValueBenefits = function(presentValues, premiums, sumInsured=1) {
+    presentValueBenefits = function(presentValues, presentValuesCosts, premiums, sumInsured=1, premiumSum=0) {
+      refundAddon = self$premiumRefundLoading;
+      # TODO: Here we don't use the securityLoading parameter => Shall it be used or are these values to be understood without additional security loading?
       benefits.unit    = presentValues[,"survival"] + presentValues[,"death_SumInsured"];
       benefits         = benefits.unit * sumInsured;
-      allBenefits.unit = presentValues[,"survival"] + presentValues[,"death_SumInsured"] + presentValues[,"death_GrossPremium"] * premiums[["unit.gross"]];
+      allBenefits.unit = presentValues[,"survival"] + presentValues[,"death_SumInsured"] + presentValues[,"death_GrossPremium"] * premiums[["unit.gross"]] * (1+refundAddon);
       allBenefits      = allBenefits.unit * sumInsured;
-      cbind(benefits.unit=benefits.unit, benefits=benefits, allBenefits.unit=allBenefits.unit, allBenefits=allBenefits)
+
+      benefitsCosts = presentValuesCosts[,,"SumInsured"]*sumInsured +
+        presentValuesCosts[,,"SumPremiums"] * premiumSum * premiums[["gross"]] +
+        presentValuesCosts[,,"GrossPremium"] * premiums[["gross"]];
+
+      cbind(
+        benefits.unit=benefits.unit,
+        benefits=benefits,
+        allBenefits.unit=allBenefits.unit,
+        allBenefits=allBenefits,
+        benefitsCosts)
     },
 
     getPremiumCoefficients = function(type="gross", coeffBenefits, coeffCosts, ...,
@@ -365,15 +377,21 @@ InsuranceTarif = R6Class(
       list("premiums"=premiums, "coefficients"=coefficients)
     },
 
-    reserveCalculation = function (premiums, pvBenefits, pvCosts, sumInsured=1, ...) {
+    reserveCalculation = function (premiums, pvBenefits, pvCosts, sumInsured=1, premiumSum=0, ...) {
       resNet = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["net"]] * pvBenefits[,"premiums"];
-      resZ = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["Zillmer"]] * pvBenefits[,"premiums"];
+      BWLminBWP = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["net"]] * pvBenefits[,"premiums"];
+      BWZcorr = pvBenefits["0","Zillmer"]/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"];
+      # resZ = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["net"]] * pvBenefits[,"premiums"] - pvCosts["0", "Zillmer", "SumInsured"]*premiumSum/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"];
+      resZ=BWLminBWP - BWZcorr;
+
+        #premiums[["Zillmer"]] * pvBenefits[,"premiums"];
       res.gamma    = (pvCosts[,"gamma", "SumInsured"] - pvCosts["0", "gamma", "SumInsured"]/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"])*sumInsured;
+      res.gamma.alt = pvBenefits[,"gamma"] - pvBenefits["0", "gamma"]/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"]
 
       # res.premiumfree =
       # res.gamma.premiumfree =
 
-      res = cbind("net"=resNet, "Zillmer"=resZ, "gamma"=res.gamma#, "Reserve.premiumfree"=res.premiumfree, "Reserve.gamma.premiumfree"=res.gamma.premiumfree);
+      res = cbind("net"=resNet, "BWLminBWP"=BWLminBWP, "BWZcorr"= BWZcorr, "Zillmer"=resZ, "gamma"=res.gamma, "gamma.alt"=res.gamma.alt#, "Reserve.premiumfree"=res.premiumfree, "Reserve.gamma.premiumfree"=res.gamma.premiumfree);
       );
       rownames(res) <- rownames(pvBenefits);
       res
-- 
GitLab