[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [lmi-commits] [5200] Improve premium-tax encapsulation,
Greg Chicares <=