lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [5200] Improve premium-tax encapsulation


From: Greg Chicares
Subject: [lmi-commits] [5200] Improve premium-tax encapsulation
Date: Wed, 08 Jun 2011 15:43:29 +0000

Revision: 5200
          http://svn.sv.gnu.org/viewvc/?view=rev&root=lmi&revision=5200
Author:   chicares
Date:     2011-06-08 15:43:29 +0000 (Wed, 08 Jun 2011)
Log Message:
-----------
Improve premium-tax encapsulation

Modified Paths:
--------------
    lmi/trunk/ChangeLog
    lmi/trunk/account_value.hpp
    lmi/trunk/ihs_acctval.cpp
    lmi/trunk/ihs_avmly.cpp
    lmi/trunk/premium_tax.cpp
    lmi/trunk/premium_tax.hpp

Modified: lmi/trunk/ChangeLog
===================================================================
--- lmi/trunk/ChangeLog 2011-06-02 10:30:35 UTC (rev 5199)
+++ lmi/trunk/ChangeLog 2011-06-08 15:43:29 UTC (rev 5200)
@@ -27969,3 +27969,19 @@
   loads_test.cpp
 Improve premium-tax encapsulation.
 
+20110602T1030Z <address@hidden> [650]
+
+  ihs_avmly.cpp
+  premium_tax.cpp
+  premium_tax.hpp
+Improve certain member names.
+
+20110608T1543Z <address@hidden> [650]
+
+  account_value.hpp
+  ihs_acctval.cpp
+  ihs_avmly.cpp
+  premium_tax.cpp
+  premium_tax.hpp
+Improve premium-tax encapsulation.
+

Modified: lmi/trunk/account_value.hpp
===================================================================
--- lmi/trunk/account_value.hpp 2011-06-02 10:30:35 UTC (rev 5199)
+++ lmi/trunk/account_value.hpp 2011-06-08 15:43:29 UTC (rev 5200)
@@ -245,7 +245,6 @@
         (double a_pmt
         ,double a_portion_exempt_from_premium_tax
         );
-    double GetPremTaxLoad(double payment);
     void TxLoanRepay             ();
 
     void TxSetBOMAV              ();
@@ -455,7 +454,6 @@
     double  MaxLoan;
     double  UnusedTargetPrem;
     double  AnnualTargetPrem;
-    double  PolicyYearRunningTotalPremiumSubjectToPremiumTax;
     double  MaxWD;
     double  GrossWD;
     double  NetWD;
@@ -511,7 +509,6 @@
     double       YearsSpecAmtLoadRate;
     double       YearsSepAcctLoadRate;
     double       YearsSalesLoadRefundRate;
-    double       YearsPremTaxLoadRate;
     double       YearsDacTaxLoadRate;
 
     double  MonthsPolicyFees;
@@ -573,9 +570,6 @@
     double  YearsTotalGrossIntCredited;
     double  YearsTotalLoanIntAccrued;
     double  YearsTotalPolicyFee;
-    double  YearsTotalPremTaxLoad;
-    double  YearsTotalPremTaxLoadInStateOfDomicile;
-    double  YearsTotalPremTaxLoadInPremiumTaxState;
     double  YearsTotalDacTaxLoad;
     double  YearsTotalSpecAmtLoad;
     double  YearsTotalSepAcctLoad;

Modified: lmi/trunk/ihs_acctval.cpp
===================================================================
--- lmi/trunk/ihs_acctval.cpp   2011-06-02 10:30:35 UTC (rev 5199)
+++ lmi/trunk/ihs_acctval.cpp   2011-06-08 15:43:29 UTC (rev 5200)
@@ -47,6 +47,7 @@
 #include "miscellany.hpp"
 #include "mortality_rates.hpp"
 #include "outlay.hpp"
+#include "premium_tax.hpp"
 #include "stl_extensions.hpp"
 #include "stratified_algorithms.hpp"
 #include "surrchg_rates.hpp"
@@ -897,6 +898,8 @@
 // TODO ?? Solve...() should reset not inputs but...something else?
     SetAnnualInvariants();
 
+    PremiumTax_->start_new_year();
+
     MonthsPolicyFees            = 0.0;
     SpecAmtLoad                 = 0.0;
 
@@ -915,9 +918,6 @@
     YearsTotalLoanIntAccrued    = 0.0;
     YearsTotalNetCoiCharge      = 0.0;
     YearsTotalPolicyFee         = 0.0;
-    YearsTotalPremTaxLoad       = 0.0;
-    YearsTotalPremTaxLoadInStateOfDomicile = 0.0;
-    YearsTotalPremTaxLoadInPremiumTaxState = 0.0;
     YearsTotalDacTaxLoad        = 0.0;
     YearsTotalSpecAmtLoad       = 0.0;
     YearsTotalSepAcctLoad       = 0.0;
@@ -925,8 +925,6 @@
 
     NextYearsProjectedCoiCharge = 0.0;
 
-    PolicyYearRunningTotalPremiumSubjectToPremiumTax = 0.0;
-
     DacTaxRsv                   = 0.0;
 
     RequestedLoan       = Outlay_->new_cash_loans()[Year];
@@ -1321,9 +1319,9 @@
     VariantValues().LoanIntAccrued    [Year] = YearsTotalLoanIntAccrued   ;
     VariantValues().NetCOICharge      [Year] = YearsTotalNetCoiCharge     ;
     VariantValues().PolicyFee         [Year] = YearsTotalPolicyFee        ;
-    VariantValues().PremTaxLoad       [Year] = YearsTotalPremTaxLoad      ;
     VariantValues().DacTaxLoad        [Year] = YearsTotalDacTaxLoad       ;
     VariantValues().SpecAmtLoad       [Year] = YearsTotalSpecAmtLoad      ;
+    VariantValues().PremTaxLoad       [Year] = PremiumTax_->ytd_load();
 
     double notional_sep_acct_charge =
           YearsTotalSepAcctLoad
@@ -1535,7 +1533,6 @@
     YearsSpecAmtLoadRate    = Loads_->specified_amount_load (GenBasis_)[Year];
     YearsSepAcctLoadRate    = Loads_->separate_account_load (GenBasis_)[Year];
     YearsSalesLoadRefundRate= Loads_->refundable_sales_load_proportion()[Year];
-    YearsPremTaxLoadRate    = Loads_->premium_tax_load                ()[Year];
     YearsDacTaxLoadRate     = Loads_->dac_tax_load                    ()[Year];
 }
 

Modified: lmi/trunk/ihs_avmly.cpp
===================================================================
--- lmi/trunk/ihs_avmly.cpp     2011-06-02 10:30:35 UTC (rev 5199)
+++ lmi/trunk/ihs_avmly.cpp     2011-06-08 15:43:29 UTC (rev 5200)
@@ -1463,14 +1463,13 @@
     double total_load =
           target_portion * YearsTotLoadTgt
         + excess_portion * YearsTotLoadExc
-        - a_portion_exempt_from_premium_tax * YearsPremTaxLoadRate
+        - a_portion_exempt_from_premium_tax * PremiumTax_->load_rate()
         ;
 
-    premium_tax_load_ = GetPremTaxLoad
-        ( a_pmt
-        - a_portion_exempt_from_premium_tax
+    premium_tax_load_ = PremiumTax_->GetPremTaxLoad
+        (a_pmt - a_portion_exempt_from_premium_tax
+        ,*StratifiedCharges_
         );
-    YearsTotalPremTaxLoad += premium_tax_load_;
 
     dac_tax_load_ = YearsDacTaxLoadRate * a_pmt;
     YearsTotalDacTaxLoad += dac_tax_load_;
@@ -1490,64 +1489,6 @@
     return round_net_premium()(sum_of_separate_loads);
 }
 
-/// Calculate premium-tax load.
-///
-/// The premium-tax load and the actual premium tax payable by an
-/// insurer are distinct concepts. They may have equal values when
-/// premium tax is passed through as a load.
-///
-/// DATABASE !! The '.strata' files ought to differentiate tiered
-/// premium-tax load paid by customer from rate paid by insurer.
-///
-/// An assertion ensures that either tiered or non-tiered premium-tax
-/// load is zero.
-
-double AccountValue::GetPremTaxLoad(double payment)
-{
-    double tax_in_premium_tax_state = YearsPremTaxLoadRate * payment;
-    if(PremiumTax_->load_is_tiered_in_premium_tax_state())
-        {
-        LMI_ASSERT(0.0 == tax_in_premium_tax_state);
-        tax_in_premium_tax_state = StratifiedCharges_->tiered_premium_tax
-            (GetPremiumTaxState()
-            ,payment
-            ,PolicyYearRunningTotalPremiumSubjectToPremiumTax
-            );
-        }
-    YearsTotalPremTaxLoadInPremiumTaxState += tax_in_premium_tax_state;
-
-    double tax_in_state_of_domicile = 0.0;
-    if(PremiumTax_->is_retaliatory())
-        {
-        tax_in_state_of_domicile = PremiumTax_->domiciliary_load_rate() * 
payment;
-        if(PremiumTax_->load_is_tiered_in_state_of_domicile())
-            {
-            LMI_ASSERT(0.0 == tax_in_state_of_domicile);
-            tax_in_state_of_domicile = StratifiedCharges_->tiered_premium_tax
-                (GetStateOfDomicile()
-                ,payment
-                ,PolicyYearRunningTotalPremiumSubjectToPremiumTax
-                );
-            }
-        YearsTotalPremTaxLoadInStateOfDomicile += tax_in_state_of_domicile;
-        }
-
-    PolicyYearRunningTotalPremiumSubjectToPremiumTax += payment;
-
-    // 'x' is more robust, though more prone to roundoff error than
-    // 'y', so 'y' is preferred iff they're materially equal.
-    double ytd_premium_tax_reflecting_retaliation = std::max
-        (YearsTotalPremTaxLoadInPremiumTaxState
-        ,YearsTotalPremTaxLoadInStateOfDomicile
-        );
-    double x = std::max
-        (0.0
-        ,ytd_premium_tax_reflecting_retaliation - YearsTotalPremTaxLoad
-        );
-    double y = std::max(tax_in_premium_tax_state, tax_in_state_of_domicile);
-    return materially_equal(x, y) ? y : x;
-}
-
 //============================================================================
 double AccountValue::GetRefundableSalesLoad() const
 {

Modified: lmi/trunk/premium_tax.cpp
===================================================================
--- lmi/trunk/premium_tax.cpp   2011-06-02 10:30:35 UTC (rev 5199)
+++ lmi/trunk/premium_tax.cpp   2011-06-08 15:43:29 UTC (rev 5200)
@@ -29,11 +29,16 @@
 #include "premium_tax.hpp"
 
 #include "alert.hpp"
+#include "assert_lmi.hpp"
 #include "contains.hpp"
 #include "database.hpp"
+#include "materially_equal.hpp"
 #include "mc_enum_types_aux.hpp" // mc_str()
 #include "stratified_charges.hpp"
 
+#include <algorithm>             // std::max()
+#include <vector>
+
 namespace {
 /// Determine whether premium tax is retaliatory.
 ///
@@ -94,9 +99,20 @@
     ,product_database   const& db
     ,stratified_charges const& strata
     )
-    :premium_tax_state_     (premium_tax_state)
-    ,state_of_domicile_     (state_of_domicile)
-    ,amortize_premium_load_ (amortize_premium_load)
+    :premium_tax_state_                   (premium_tax_state)
+    ,state_of_domicile_                   (state_of_domicile)
+    ,amortize_premium_load_               (amortize_premium_load)
+    ,levy_rate_                           (0.0)   // Reset below.
+    ,load_rate_                           (0.0)   // Reset below.
+    ,least_load_rate_                     (0.0)   // Reset below.
+    ,domiciliary_load_rate_               (0.0)   // Reset below.
+    ,load_is_tiered_in_premium_tax_state_ (false) // Reset below.
+    ,load_is_tiered_in_state_of_domicile_ (false) // Reset below.
+    ,is_retaliatory_                      (false) // Reset below.
+    ,PolicyYearRunningTotalPremiumSubjectToPremiumTax(0.0)
+    ,YearsTotalPremTaxLoad                  (0.0)
+    ,YearsTotalPremTaxLoadInStateOfDomicile (0.0)
+    ,YearsTotalPremTaxLoadInPremiumTaxState (0.0)
 {
     load_is_tiered_in_premium_tax_state_ = 
strata.premium_tax_is_tiered(premium_tax_state_);
     load_is_tiered_in_state_of_domicile_ = 
strata.premium_tax_is_tiered(state_of_domicile_);
@@ -155,6 +171,10 @@
     ,load_is_tiered_in_premium_tax_state_ (false)
     ,load_is_tiered_in_state_of_domicile_ (false)
     ,is_retaliatory_                      (false)
+    ,PolicyYearRunningTotalPremiumSubjectToPremiumTax(0.0)
+    ,YearsTotalPremTaxLoad                  (0.0)
+    ,YearsTotalPremTaxLoadInStateOfDomicile (0.0)
+    ,YearsTotalPremTaxLoadInPremiumTaxState (0.0)
 {
     database_index index = db.index().state(premium_tax_state_);
     levy_rate_ = db.Query(DB_PremTaxRate, index);
@@ -221,6 +241,74 @@
         }
 }
 
+void premium_tax::start_new_year()
+{
+    PolicyYearRunningTotalPremiumSubjectToPremiumTax = 0.0;
+    YearsTotalPremTaxLoad                  = 0.0;
+    YearsTotalPremTaxLoadInStateOfDomicile = 0.0;
+    YearsTotalPremTaxLoadInPremiumTaxState = 0.0;
+}
+
+/// Calculate premium-tax load.
+///
+/// The premium-tax load and the actual premium tax payable by an
+/// insurer are distinct concepts. They may have equal values when
+/// premium tax is passed through as a load.
+///
+/// DATABASE !! The '.strata' files ought to differentiate tiered
+/// premium-tax load paid by customer from rate paid by insurer.
+///
+/// An assertion ensures that either tiered or non-tiered premium-tax
+/// load is zero.
+
+double premium_tax::GetPremTaxLoad(double payment, stratified_charges const& 
strata)
+{
+    double tax_in_premium_tax_state = load_rate() * payment;
+    if(load_is_tiered_in_premium_tax_state())
+        {
+        LMI_ASSERT(0.0 == tax_in_premium_tax_state);
+        tax_in_premium_tax_state = strata.tiered_premium_tax
+            (premium_tax_state_
+            ,payment
+            ,PolicyYearRunningTotalPremiumSubjectToPremiumTax
+            );
+        }
+    YearsTotalPremTaxLoadInPremiumTaxState += tax_in_premium_tax_state;
+
+    double tax_in_state_of_domicile = 0.0;
+    if(is_retaliatory())
+        {
+        tax_in_state_of_domicile = domiciliary_load_rate() * payment;
+        if(load_is_tiered_in_state_of_domicile())
+            {
+            LMI_ASSERT(0.0 == tax_in_state_of_domicile);
+            tax_in_state_of_domicile = strata.tiered_premium_tax
+                (state_of_domicile_
+                ,payment
+                ,PolicyYearRunningTotalPremiumSubjectToPremiumTax
+                );
+            }
+        YearsTotalPremTaxLoadInStateOfDomicile += tax_in_state_of_domicile;
+        }
+
+    PolicyYearRunningTotalPremiumSubjectToPremiumTax += payment;
+
+    // 'x' is more robust, though more prone to roundoff error than
+    // 'y', so 'y' is preferred iff they're materially equal.
+    double ytd_premium_tax_reflecting_retaliation = std::max
+        (YearsTotalPremTaxLoadInPremiumTaxState
+        ,YearsTotalPremTaxLoadInStateOfDomicile
+        );
+    double x = std::max
+        (0.0
+        ,ytd_premium_tax_reflecting_retaliation - YearsTotalPremTaxLoad
+        );
+    double y = std::max(tax_in_premium_tax_state, tax_in_state_of_domicile);
+    double z = materially_equal(x, y) ? y : x;
+    YearsTotalPremTaxLoad += z;
+    return z;
+}
+
 /// Lowest premium-tax load, for 7702 and 7702A purposes.
 
 double lowest_premium_tax_load
@@ -303,6 +391,11 @@
     return z;
 }
 
+double premium_tax::ytd_load() const
+{
+    return YearsTotalPremTaxLoad;
+}
+
 double premium_tax::levy_rate() const
 {
     return levy_rate_;

Modified: lmi/trunk/premium_tax.hpp
===================================================================
--- lmi/trunk/premium_tax.hpp   2011-06-02 10:30:35 UTC (rev 5199)
+++ lmi/trunk/premium_tax.hpp   2011-06-08 15:43:29 UTC (rev 5200)
@@ -51,6 +51,10 @@
         );
     ~premium_tax();
 
+    void   start_new_year();
+    double GetPremTaxLoad(double payment, stratified_charges const& strata);
+    double ytd_load                           () const;
+
     double levy_rate                          () const;
     double load_rate                          () const;
     double least_load_rate                    () const;
@@ -74,6 +78,11 @@
     bool   load_is_tiered_in_premium_tax_state_;
     bool   load_is_tiered_in_state_of_domicile_;
     bool   is_retaliatory_;
+
+    double PolicyYearRunningTotalPremiumSubjectToPremiumTax;
+    double YearsTotalPremTaxLoad;
+    double YearsTotalPremTaxLoadInStateOfDomicile;
+    double YearsTotalPremTaxLoadInPremiumTaxState;
 };
 
 double lowest_premium_tax_load




reply via email to

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