lmi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [lmi] master d5a3dff 3/4: Assert that guideline premiums u


From: Greg Chicares
Subject: [lmi-commits] [lmi] master d5a3dff 3/4: Assert that guideline premiums use a correct spec amt charge
Date: Fri, 21 May 2021 09:05:43 -0400 (EDT)

branch: master
commit d5a3dff9d4767e73d0a4c061a8e10f690f60fcb9
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>

    Assert that guideline premiums use a correct spec amt charge
    
    The spec amt charge is based on the initial DB, reflecting corridor;
    but guideline premiums are set before any initial premium is processed.
    This raises the possibility that guidelines are incorrect because the
    corridor is not reflected. (They'd be lower than necessary, so the
    definitional test would still be met.)
    
    That was almost impossible when the statutory rate was four percent:
    the maximum initial premium was based on a six-percent GSP rate, and
    that rate times the GPT corridor factor was unlikely to exceed unity,
    making it unlikely for a contract to be in the corridor on the issue
    date. Perhaps that could happen with a substandard contract. Now that
    the statutory rate can potentially be zero, or perhaps even less, it
    seems best to assert that the spec amt charge used for guidelines is
    the same as the one actually deducted.
---
 7702.html         |  5 +++++
 account_value.hpp |  1 +
 ihs_acctval.cpp   | 22 ++++++++++++++++++++++
 ihs_avmly.cpp     | 22 ++++++++++++++++++----
 4 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/7702.html b/7702.html
index 53daabf..2fb4bc5 100644
--- a/7702.html
+++ b/7702.html
@@ -395,6 +395,11 @@ favorable guideline premiums, a contract should generally 
be
 issued at a SA no lower than its corridor DB (&para;4/2) after
 the initial premium, dumpin, and any estimated &sect;1035
 exchange amount are recognized, net of any term rider.
+<!-- [draft of a new footnote]
+This is unlikely to be be a practical concern, as a GPT contract
+cannot be in the corridor on the issue date unless the GSP rate
+is greater than the reciprocal of the corridor factor.
+-->
 If this is precluded by sales considerations that demand a
 lower SA, then that lower SA becomes the DB for initial
 guideline and seven-pay premiums.
diff --git a/account_value.hpp b/account_value.hpp
index 44b712d..7eb0124 100644
--- a/account_value.hpp
+++ b/account_value.hpp
@@ -435,6 +435,7 @@ class LMI_SO AccountValue final
     currency HoneymoonValue;
 
     // 7702 GPT
+    currency gpt_chg_sa_base_; // Cf. SpecAmtLoadBase
     currency GptForceout;
     currency YearsTotalGptForceout;
 
diff --git a/ihs_acctval.cpp b/ihs_acctval.cpp
index c4112cf..5279b67 100644
--- a/ihs_acctval.cpp
+++ b/ihs_acctval.cpp
@@ -420,6 +420,26 @@ void AccountValue::InitializeLife(mcenum_run_basis a_Basis)
         );
     currency sa = specamt_for_7702(0);
 
+    // Base for specified-amount load, for GPT only.
+    //
+    // Unlike 'SpecAmtLoadBase', this ignores the corridor. Reasons:
+    //  - initial payment is not yet known--e.g., it may be determined
+    //    by a strategy or a solve, perhaps with a non-MEC limit; and
+    //  - it shouldn't matter, because a GPT contract should be issued
+    //    at a spec amt no lower than its initial corridor DB.
+    // Initial guideline premiums are calculated based on the (f)(3)
+    // benefit before any payment or 1035 exchange is accepted, which
+    // by definition cannot exceed the spec amt. If that's less than
+    // the initial corridor DB, then the guideline limit is already
+    // lower than it needs to be, regardless of any spec amt load;
+    // in that case, a warning is given downstream.
+    gpt_chg_sa_base_ =
+        (yare_input_.EffectiveDate == yare_input_.InforceAsOfDate)
+        ? term_specamt(0) + base_specamt(0)
+        : round_specamt().c(yare_input_.InforceSpecAmtLoadBase)
+        ;
+    gpt_chg_sa_base_ = std::min(gpt_chg_sa_base_, SpecAmtLoadLimit);
+
     // It is at best superfluous to do this for every basis.
     // TAXATION !! Don't do that then.
     Irc7702_->Initialize7702
@@ -651,6 +671,8 @@ void AccountValue::SetInitialValues()
             }
         }
 
+    gpt_chg_sa_base_            = C0;
+
     CoiCharge                   = C0;
     RiderCharges                = C0;
     MlyDed                      = C0;
diff --git a/ihs_avmly.cpp b/ihs_avmly.cpp
index 2a22548..fad7cd4 100644
--- a/ihs_avmly.cpp
+++ b/ihs_avmly.cpp
@@ -1601,15 +1601,29 @@ void AccountValue::TxSetBOMAV()
         // CURRENCY !! Should yare_input convert currency inputs to
         // type currency, which is more yare than double?
         LMI_ASSERT(yare_input_.InforceSpecAmtLoadBase <= 
dblize(SpecAmtLoadLimit));
+        currency const x = term_specamt(0) + base_specamt(0);
+        currency const y = round_specamt().c(NetPmts[0] * YearsCorridorFactor);
         SpecAmtLoadBase =
             (0 == Year && 0 == Month)
-            ? std::max
-                (term_specamt(0) + base_specamt(0)
-                ,round_specamt().c(NetPmts[0] * YearsCorridorFactor)
-                )
+            ? std::max(x, y)
             : round_specamt().c(yare_input_.InforceSpecAmtLoadBase)
             ;
         SpecAmtLoadBase = std::min(SpecAmtLoadBase, SpecAmtLoadLimit);
+
+        if(!Solving && mce_gpt == DefnLifeIns_ && x < y)
+            {
+            // Assert that the basis for guideline premiums is
+            // identical to the initial specified amount.
+            LMI_ASSERT(gpt_chg_sa_base_ == SpecAmtLoadBase);
+            warning()
+                << "Initial specified amount is " << x
+                << " but initial corridor death benefit is " << y
+                << ". To achieve the most favorable guideline premiums,"
+                << " consider increasing initial specified amount to " << y
+                << "."
+                << LMI_FLUSH
+                ;
+            }
         }
 
     // These assignments must happen every month.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]