From c2d20d57343eaec06245660e30775169332b2451 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Fri, 15 Apr 2016 18:24:39 +0200
Subject: [PATCH] Set tariff-wide default for premiumPeriod

If not explicitly given in the contract, premiumPeriod is taken from the Tarif.
---
 R/.gitignore          | 1 +
 R/InsuranceContract.R | 6 +++++-
 R/InsuranceTarif.R    | 9 ++++++---
 3 files changed, 12 insertions(+), 4 deletions(-)
 create mode 100644 R/.gitignore

diff --git a/R/.gitignore b/R/.gitignore
new file mode 100644
index 0000000..53c4b98
--- /dev/null
+++ b/R/.gitignore
@@ -0,0 +1 @@
+TODO.txt
diff --git a/R/InsuranceContract.R b/R/InsuranceContract.R
index 79f0b41..07dc9df 100644
--- a/R/InsuranceContract.R
+++ b/R/InsuranceContract.R
@@ -49,7 +49,11 @@ InsuranceContract = R6Class(
       self$tarif = tarif;
       self$age = age;
       self$policyPeriod = policyPeriod;
-      self$premiumPeriod = premiumPeriod;
+      if (missing(premiumPeriod) && !is.na(self$tarif$premiumPeriod)) {
+        self$premiumPeriod = self$tarif$premiumPeriod;
+      } else {
+        self$premiumPeriod = premiumPeriod;
+      }
       self$sumInsured = sumInsured;
       if (!missing(deferral))     self$deferral = deferral;
       if (!missing(YOB))          self$YOB = YOB;
diff --git a/R/InsuranceTarif.R b/R/InsuranceTarif.R
index b43c8cb..034cdab 100644
--- a/R/InsuranceTarif.R
+++ b/R/InsuranceTarif.R
@@ -9,9 +9,9 @@ PaymentTimeEnum = setSingleEnum("PaymentTime", levels = c("in advance", "in arre
 
 
 # Initialize a cost matrix with dimensions: [CostType, Basis, Period], with:
-#     CostType: alpha, Zillmer, beta, gamma
+#     CostType: alpha, Zillmer, beta, gamma, gamma_nopremiums
 #     Basis:    SumInsured, SumPremiums, GrossPremium
-#     Period:   once, premiumPeriod, policyPeriod
+#     Period:   once, PremiumPeriod, PremiumFree, PolicyPeriod
 # TODO: gamma an Erlebensleistungen?
 initializeCosts = function() {
   dimnm=list(
@@ -46,6 +46,7 @@ InsuranceTarif = R6Class(
     benefitFrequencyOrder = 0,
     widowFactor = 0,
 
+    premiumPeriod = NA,
     premiumRefund = 0,
     premiumRefundLoading = 0,  # Mindesttodesfallrisiko soll damit erreicht werden, z.B. 105% der einbezahlten Prämien
 
@@ -67,7 +68,7 @@ InsuranceTarif = R6Class(
       ),
 
 
-    initialize = function(name = NA, mortalityTable = NA, i = NA, type = "wholelife", ..., premiumFrequencyOrder = 0, benefitFrequencyOrder = 0, costs) {
+    initialize = function(name = NA, mortalityTable = NA, i = NA, type = "wholelife", ..., premiumPeriod = NA, premiumFrequencyOrder = 0, benefitFrequencyOrder = 0, costs) {
       if (!missing(name))           self$name = name;
       if (!missing(mortalityTable)) self$mortalityTable = mortalityTable;
       if (!missing(i))              self$i = i;
@@ -75,6 +76,8 @@ InsuranceTarif = R6Class(
       self$costs = if (!missing(costs)) costs else initializeCosts();
       if (!missing(benefitFrequencyOrder)) self$benefitFrequencyOrder = benefitFrequencyOrder;
       if (!missing(premiumFrequencyOrder)) self$premiumFrequencyOrder = premiumFrequencyOrder;
+      # Set default premiumPeriod, e.g. single premium, to be used when the contract has no explicit premium period
+      if (!missing(premiumPeriod))  self$premiumPeriod = premiumPeriod;
 
       self$v = 1/(1+self$i);
 
-- 
GitLab