lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [5698] Calculate maximum premium tax


From: Greg Chicares
Subject: [lmi-commits] [5698] Calculate maximum premium tax
Date: Thu, 18 Apr 2013 15:04:23 +0000

Revision: 5698
          http://svn.sv.gnu.org/viewvc/?view=rev&root=lmi&revision=5698
Author:   chicares
Date:     2013-04-18 15:04:22 +0000 (Thu, 18 Apr 2013)
Log Message:
-----------
Calculate maximum premium tax

Modified Paths:
--------------
    lmi/trunk/antediluvian_stubs.cpp
    lmi/trunk/premium_tax.cpp
    lmi/trunk/premium_tax.hpp
    lmi/trunk/premium_tax_test.cpp
    lmi/trunk/stratified_charges.cpp
    lmi/trunk/stratified_charges.hpp

Modified: lmi/trunk/antediluvian_stubs.cpp
===================================================================
--- lmi/trunk/antediluvian_stubs.cpp    2013-04-18 13:50:16 UTC (rev 5697)
+++ lmi/trunk/antediluvian_stubs.cpp    2013-04-18 15:04:22 UTC (rev 5698)
@@ -26,7 +26,7 @@
 #   pragma hdrstop
 #endif // __BORLANDC__
 
-#include "lmi.hpp"          // is_antediluvian_fork()
+#include "lmi.hpp"                      // is_antediluvian_fork()
 #include "mec_server.hpp"
 #include "product_data.hpp"
 #include "stratified_charges.hpp"
@@ -158,6 +158,11 @@
     return empty_string;
 }
 
+double stratified_charges::maximum_tiered_premium_tax_rate(mcenum_state) const
+{
+    return 0.0;
+}
+
 double stratified_charges::minimum_tiered_premium_tax_rate(mcenum_state) const
 {
     return 0.0;

Modified: lmi/trunk/premium_tax.cpp
===================================================================
--- lmi/trunk/premium_tax.cpp   2013-04-18 13:50:16 UTC (rev 5697)
+++ lmi/trunk/premium_tax.cpp   2013-04-18 15:04:22 UTC (rev 5698)
@@ -100,6 +100,7 @@
     ,amortize_premium_load_  (amortize_premium_load)
     ,levy_rate_              (0.0)   // Reset below.
     ,load_rate_              (0.0)   // Reset below.
+    ,maximum_load_rate_      (0.0)   // Reset below.
     ,minimum_load_rate_      (0.0)   // Reset below.
     ,domiciliary_load_rate_  (0.0)   // Reset below.
     ,is_tiered_in_tax_state_ (false) // Reset below.
@@ -140,6 +141,7 @@
         }
     }
 
+    maximum_load_rate_ = ascertain_maximum_load_rate(strata);
     minimum_load_rate_ = ascertain_minimum_load_rate(strata);
 
     test_consistency();
@@ -156,6 +158,7 @@
     ,amortize_premium_load_  (false)
     ,levy_rate_              (0.0) // Reset below.
     ,load_rate_              (0.0)
+    ,maximum_load_rate_      (0.0)
     ,minimum_load_rate_      (0.0)
     ,domiciliary_load_rate_  (0.0)
     ,is_tiered_in_tax_state_ (false)
@@ -423,8 +426,30 @@
 }
 #endif // 0
 
-/// Lowest premium-tax load, for 7702 and 7702A purposes.
+/// Highest premium-tax load, for calculating pay-as-you-go premium.
 
+double premium_tax::ascertain_maximum_load_rate(stratified_charges const& 
strata) const
+{
+    if(amortize_premium_load_)
+        {
+        return 0.0;
+        }
+    else if(!varies_by_state_)
+        {
+        return load_rate_;
+        }
+    else if(is_tiered_in_tax_state_)
+        {
+        return strata.maximum_tiered_premium_tax_rate(tax_state_);
+        }
+    else
+        {
+        return load_rate_;
+        }
+}
+
+/// Lowest premium-tax load, for conservative 7702 and 7702A calculations.
+
 double premium_tax::ascertain_minimum_load_rate(stratified_charges const& 
strata) const
 {
     if(amortize_premium_load_)
@@ -460,6 +485,11 @@
     return load_rate_;
 }
 
+double premium_tax::maximum_load_rate() const
+{
+    return maximum_load_rate_;
+}
+
 double premium_tax::minimum_load_rate() const
 {
     return minimum_load_rate_;

Modified: lmi/trunk/premium_tax.hpp
===================================================================
--- lmi/trunk/premium_tax.hpp   2013-04-18 13:50:16 UTC (rev 5697)
+++ lmi/trunk/premium_tax.hpp   2013-04-18 15:04:22 UTC (rev 5698)
@@ -88,11 +88,6 @@
 /// and SD contracts is not supported, so premium tax is understated
 /// for a few domiciles.
 ///
-/// A greatest-premium-tax-load function is wanted for the approximate
-/// "pay as you go" modal premium (BasicValues::GetModalPremMlyDed()).
-/// At present, that premium is insufficient to prevent instant lapse
-/// in AK and SD when premium tax is passed through as a load.
-///
 /// start_new_year() should be improved as noted in its documentation.
 ///
 /// premium_tax_rates_for_annuities() should be implemented.
@@ -121,12 +116,14 @@
 
     double levy_rate              () const;
     double load_rate              () const;
+    double maximum_load_rate      () const;
     double minimum_load_rate      () const;
     bool   is_tiered              () const;
 
   private:
     void test_consistency() const;
 
+    double ascertain_maximum_load_rate(stratified_charges const& strata) const;
     double ascertain_minimum_load_rate(stratified_charges const& strata) const;
 
     // Ctor value-arguments.
@@ -136,6 +133,7 @@
 
     double levy_rate_;
     double load_rate_;
+    double maximum_load_rate_;
     double minimum_load_rate_;
     double domiciliary_load_rate_;
     bool   is_tiered_in_tax_state_;

Modified: lmi/trunk/premium_tax_test.cpp
===================================================================
--- lmi/trunk/premium_tax_test.cpp      2013-04-18 13:50:16 UTC (rev 5697)
+++ lmi/trunk/premium_tax_test.cpp      2013-04-18 15:04:22 UTC (rev 5698)
@@ -75,6 +75,7 @@
     premium_tax z(mce_s_CT, mce_s_CT, false, db, strata);
     BOOST_TEST_EQUAL(z.levy_rate                (), 0.0175);
     BOOST_TEST_EQUAL(z.load_rate                (), 0.0175);
+    BOOST_TEST_EQUAL(z.maximum_load_rate        (), 0.0175);
     BOOST_TEST_EQUAL(z.minimum_load_rate        (), 0.0175);
     BOOST_TEST_EQUAL(z.is_tiered                (), false );
     BOOST_TEST_EQUAL(z.calculate_load(1.0, strata), 0.0175);
@@ -85,6 +86,7 @@
     premium_tax z(mce_s_CT, mce_s_MA, false, db, strata);
     BOOST_TEST_EQUAL(z.levy_rate                (), 0.0200);
     BOOST_TEST_EQUAL(z.load_rate                (), 0.0200);
+    BOOST_TEST_EQUAL(z.maximum_load_rate        (), 0.0200);
     BOOST_TEST_EQUAL(z.minimum_load_rate        (), 0.0200);
     BOOST_TEST_EQUAL(z.is_tiered                (), false );
     BOOST_TEST_EQUAL(z.calculate_load(1.0, strata), 0.0200);
@@ -95,6 +97,7 @@
     premium_tax z(mce_s_AK, mce_s_CT, false, db, strata);
     BOOST_TEST_EQUAL(z.levy_rate                (), 0.0000);
     BOOST_TEST_EQUAL(z.load_rate                (), 0.0000);
+    BOOST_TEST_EQUAL(z.maximum_load_rate        (), 0.0270);
     BOOST_TEST_EQUAL(z.minimum_load_rate        (), 0.0010);
     BOOST_TEST_EQUAL(z.is_tiered                (), true  );
     BOOST_TEST_EQUAL(z.calculate_load(1.0, strata), 0.0270);
@@ -112,6 +115,7 @@
     premium_tax z(mce_s_AK, mce_s_CT, false, db, strata);
     BOOST_TEST_EQUAL(z.levy_rate                (), 0.0000);
     BOOST_TEST_EQUAL(z.load_rate                (), 0.0000);
+    BOOST_TEST_EQUAL(z.maximum_load_rate        (), 0.0000);
     BOOST_TEST_EQUAL(z.minimum_load_rate        (), 0.0000);
     BOOST_TEST_EQUAL(z.is_tiered                (), true  );
     // TODO ?? This is a pitfall--at least it should be diagnosed.
@@ -129,6 +133,7 @@
     // TODO ?? Don't the suppressed tests indicate a defect?
 //    BOOST_TEST_EQUAL(z.levy_rate                (), 0.0000);
 //    BOOST_TEST_EQUAL(z.load_rate                (), 0.0000);
+    BOOST_TEST_EQUAL(z.maximum_load_rate        (), 0.0000);
     BOOST_TEST_EQUAL(z.minimum_load_rate        (), 0.0000);
     BOOST_TEST_EQUAL(z.is_tiered                (), false );
 //    BOOST_TEST_EQUAL(z.calculate_load(1.0, strata), 0.0000);

Modified: lmi/trunk/stratified_charges.cpp
===================================================================
--- lmi/trunk/stratified_charges.cpp    2013-04-18 13:50:16 UTC (rev 5697)
+++ lmi/trunk/stratified_charges.cpp    2013-04-18 15:04:22 UTC (rev 5698)
@@ -518,6 +518,25 @@
     return !premium_tax_table(state).empty();
 }
 
+/// Highest rate, for calculating pay-as-you-go premium.
+
+double stratified_charges::maximum_tiered_premium_tax_rate(mcenum_state state) 
const
+{
+    std::string const table = premium_tax_table(state);
+    if(table.empty())
+        {
+        return 0.0;
+        }
+    else
+        {
+        stratified_entity const& z = datum(table);
+        LMI_ASSERT(!z.values().empty());
+        return *std::max_element(z.values().begin(), z.values().end());
+        }
+}
+
+/// Lowest rate, for conservative 7702 and 7702A calculations.
+
 double stratified_charges::minimum_tiered_premium_tax_rate(mcenum_state state) 
const
 {
     std::string const table = premium_tax_table(state);

Modified: lmi/trunk/stratified_charges.hpp
===================================================================
--- lmi/trunk/stratified_charges.hpp    2013-04-18 13:50:16 UTC (rev 5697)
+++ lmi/trunk/stratified_charges.hpp    2013-04-18 15:04:22 UTC (rev 5698)
@@ -62,7 +62,9 @@
     ,e_stratified_last
     };
 
-// Implicitly-declared special member functions do the right thing.
+/// A tiered or banded datum.
+///
+/// Implicitly-declared special member functions do the right thing.
 
 class LMI_SO stratified_entity
     :virtual private obstruct_slicing<stratified_entity>
@@ -143,8 +145,7 @@
         ) const;
     bool premium_tax_is_tiered(mcenum_state) const;
 
-    // Lowest rate for conservatism in complicated formulas that
-    // don't yet reflect tiering.
+    double maximum_tiered_premium_tax_rate(mcenum_state) const;
     double minimum_tiered_premium_tax_rate(mcenum_state) const;
 
     static void write_stratified_files();




reply via email to

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