lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [5549] Initialize base for specified-amount load from new


From: Greg Chicares
Subject: [lmi-commits] [5549] Initialize base for specified-amount load from new input field
Date: Wed, 22 Aug 2012 11:38:17 +0000

Revision: 5549
          http://svn.sv.gnu.org/viewvc/?view=rev&root=lmi&revision=5549
Author:   chicares
Date:     2012-08-22 11:38:16 +0000 (Wed, 22 Aug 2012)
Log Message:
-----------
Initialize base for specified-amount load from new input field

Modified Paths:
--------------
    lmi/trunk/cell.rnc
    lmi/trunk/cell.xsd
    lmi/trunk/ihs_avmly.cpp
    lmi/trunk/input_xml_io.cpp

Modified: lmi/trunk/cell.rnc
===================================================================
--- lmi/trunk/cell.rnc  2012-08-21 13:07:14 UTC (rev 5548)
+++ lmi/trunk/cell.rnc  2012-08-22 11:38:16 UTC (rev 5549)
@@ -253,7 +253,8 @@
      element InforceSeparateAccountValue      {nonnegative_double}
     ,## Inforce 7702A seven-pay premium.
      element InforceSevenPayPremium           {nonnegative_double}
-    ,## Amount on which specified-amount load is charged.
+    ,## Amount on which specified-amount load is charged, with due
+     ## regard to term rider.
      element InforceSpecAmtLoadBase           {nonnegative_double}
     ,## Inforce tax basis.
      element InforceTaxBasis                  {xsd:double}
@@ -398,8 +399,7 @@
     ,## Parameter to be solved for.
      element SolveType                        {solve_type}
     ,## Specified amount for each policy year since issue. Inforce
-     ## extracts require only a scalar representing the current
-     ## specified amount.
+     ## extracts require only the current scalar value.
      element SpecifiedAmount                  {specamt_sequence}
     ,## [obsolete]
      element SpecifiedAmountFromIssue         {nonnegative_double}

Modified: lmi/trunk/cell.xsd
===================================================================
--- lmi/trunk/cell.xsd  2012-08-21 13:07:14 UTC (rev 5548)
+++ lmi/trunk/cell.xsd  2012-08-22 11:38:16 UTC (rev 5549)
@@ -770,7 +770,8 @@
   </xs:element>
   <xs:element name="InforceSpecAmtLoadBase" type="nonnegative_double">
     <xs:annotation>
-      <xs:documentation>Amount on which specified-amount load is 
charged.</xs:documentation>
+      <xs:documentation>Amount on which specified-amount load is charged, with 
due
+regard to term rider.</xs:documentation>
     </xs:annotation>
   </xs:element>
   <xs:element name="InforceTaxBasis" type="xs:double">
@@ -1104,8 +1105,7 @@
   <xs:element name="SpecifiedAmount" type="xs:string">
     <xs:annotation>
       <xs:documentation>Specified amount for each policy year since issue. 
Inforce
-extracts require only a scalar representing the current
-specified amount.</xs:documentation>
+extracts require only the current scalar value.</xs:documentation>
     </xs:annotation>
   </xs:element>
   <xs:element name="SpecifiedAmountFromIssue" type="nonnegative_double">

Modified: lmi/trunk/ihs_avmly.cpp
===================================================================
--- lmi/trunk/ihs_avmly.cpp     2012-08-21 13:07:14 UTC (rev 5548)
+++ lmi/trunk/ihs_avmly.cpp     2012-08-22 11:38:16 UTC (rev 5549)
@@ -1552,38 +1552,26 @@
 {
     // Subtract monthly policy fee and per K charge from account value.
 
-    // These assignments must happen every month.
-
-    // Set base for per K load at issue. Other approaches could be imagined.
+    // Set base for specified-amount load. Usually, this represents
+    // the cost of underwriting, so the amount is determined at issue
+    // and includes term rider.
     if(Year == InforceYear && Month == InforceMonth)
         {
         if(!yare_input_.TermRider)
             {
-            HOPEFULLY(0.0 == InvariantValues().TermSpecAmt[0]);
+            LMI_ASSERT(0.0 == InvariantValues().TermSpecAmt[0]);
             }
-        double z;
-        if(0 == Year && 0 == Month)
-            {
-            z = InvariantValues().TermSpecAmt[0] + 
InvariantValues().SpecAmt[0];
-            }
-        else
-            {
-            // TAXATION !! We could at least change this in xrc help elements:
-            // USER !! User documentation should explain that this
-            // includes any 7702-integrated term rider.
-            //
-            // Some products have loads that depend on the initial
-            // specified amount, which probably includes term; if it
-            // doesn't, then a new input field would need to be added.
-            //
-            // TAXATION !! Is this really desirable? INPUT !! Should we
-            // instead capture specamt as of issue date for this purpose?
-            z = yare_input_.SpecifiedAmount.front();
-            }
-        SpecAmtLoadBase = std::max(z, NetPmts[Month] * YearsCorridorFactor);
+        SpecAmtLoadBase =
+            (0 == Year && 0 == Month)
+            ? InvariantValues().TermSpecAmt[0] + InvariantValues().SpecAmt[0]
+            : yare_input_.InforceSpecAmtLoadBase
+            ;
+        SpecAmtLoadBase = std::max(SpecAmtLoadBase, NetPmts[Month] * 
YearsCorridorFactor);
         SpecAmtLoadBase = std::min(SpecAmtLoadBase, SpecAmtLoadLimit);
         }
 
+    // These assignments must happen every month.
+
     MonthsPolicyFees = YearsMonthlyPolicyFee;
     if(0 == Month)
         {

Modified: lmi/trunk/input_xml_io.cpp
===================================================================
--- lmi/trunk/input_xml_io.cpp  2012-08-21 13:07:14 UTC (rev 5548)
+++ lmi/trunk/input_xml_io.cpp  2012-08-22 11:38:16 UTC (rev 5549)
@@ -525,8 +525,10 @@
     if(file_version < 7)
         {
         // Prior to version 7, 'InforceCumulativePayments' was used
-        // for no-lapse, GPT, and ROP, so set them all equal here for
-        // backward compatibility.
+        // for no-lapse, GPT, and ROP, so set them all equal here
+        // for backward compatibility. This matters little for new
+        // business, but is so cheap that it may as well be done
+        // unconditionally.
         InforceCumulativeGptPremiumsPaid = 
InforceCumulativeNoLapsePayments.value();
         InforceCumulativeRopPayments     = 
InforceCumulativeNoLapsePayments.value();
         }
@@ -573,6 +575,15 @@
                 }
             }
         }
+
+    if(file_version < 7 && EffectiveDate.value() != InforceAsOfDate.value())
+        {
+        // Version 7 introduced 'InforceSpecAmtLoadBase'; previously,
+        // the first element of 'SpecamtHistory' had been used in its
+        // place, which would have disregarded any term rider.
+        RealizeSpecifiedAmount();
+        InforceSpecAmtLoadBase = TermRiderAmount.value() + 
SpecifiedAmountRealized_[0].value();
+        }
 }
 
 void Input::redintegrate_ad_terminum()




reply via email to

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