[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [5907] Convert between old and new GPT input
From: |
Greg Chicares |
Subject: |
[lmi-commits] [5907] Convert between old and new GPT input |
Date: |
Sun, 22 Jun 2014 13:52:16 +0000 |
Revision: 5907
http://svn.sv.gnu.org/viewvc/?view=rev&root=lmi&revision=5907
Author: chicares
Date: 2014-06-22 13:52:14 +0000 (Sun, 22 Jun 2014)
Log Message:
-----------
Convert between old and new GPT input
Modified Paths:
--------------
lmi/trunk/ihs_server7702io.cpp
lmi/trunk/ihs_server7702io.hpp
Modified: lmi/trunk/ihs_server7702io.cpp
===================================================================
--- lmi/trunk/ihs_server7702io.cpp 2014-06-21 16:19:26 UTC (rev 5906)
+++ lmi/trunk/ihs_server7702io.cpp 2014-06-22 13:52:14 UTC (rev 5907)
@@ -28,6 +28,9 @@
#include "ihs_server7702io.hpp"
+#include "assert_lmi.hpp"
+#include "value_cast.hpp"
+
#include <iomanip>
#include <ios>
#include <istream>
@@ -208,6 +211,129 @@
return os;
}
+Server7702Input::Server7702Input()
+{
+ // Do nothing.
+}
+
+Server7702Input::Server7702Input(gpt_input const& z)
+{
+ UniqueIdentifier = z["ContractNumber"].str();
+ Duration =
exact_cast<tnr_duration>(z["InforceYear"])->value();
+ IsIssuedToday = 0 == Duration; // Casual, but strictly
correct for all testdeck cases.
+ GrossNontaxableWithdrawal =
exact_cast<tnr_nonnegative_double>(z["PremsPaidDecrement"])->value();
+ Premium =
exact_cast<tnr_nonnegative_double>(z["Payment"])->value();
+ DecreaseRequiredByContract = 0.0;
+ ProductName = z["ProductName"].str();
+ UnderwritingBasis =
exact_cast<mce_uw_basis>(z["GroupUnderwritingType"])->value();
+ PremTaxLoadRate = 0.0;
+ TieredAssetChargeRate = 0.0;
+ LeastBenefitAmountEver = 0.0;
+ OldGuidelineLevelPremium =
exact_cast<tnr_unrestricted_double>(z["InforceGlp"])->value();
+ OldGuidelineSinglePremium =
exact_cast<tnr_unrestricted_double>(z["InforceGsp"])->value();
+ NewIssueAge = exact_cast<tnr_age>(z["IssueAge"])->value();
+ OldIssueAge = NewIssueAge;
+ NewGender =
exact_cast<mce_gender>(z["NewGender"])->value();
+ OldGender =
exact_cast<mce_gender>(z["OldGender"])->value();
+ NewSmoker =
exact_cast<mce_smoking>(z["NewSmoking"])->value();
+ OldSmoker =
exact_cast<mce_smoking>(z["OldSmoking"])->value();
+ NewUnderwritingClass =
exact_cast<mce_class>(z["UnderwritingClass"])->value();
+ OldUnderwritingClass = NewUnderwritingClass;
+ NewStateOfJurisdiction =
exact_cast<mce_state>(z["StateOfJurisdiction"])->value();
+ OldStateOfJurisdiction = NewStateOfJurisdiction;
+ NewDeathBenefitOption =
exact_cast<mce_dbopt_7702>(z["NewDbo"])->value();
+ OldDeathBenefitOption =
exact_cast<mce_dbopt_7702>(z["OldDbo"])->value();
+ NewBenefitAmount =
exact_cast<tnr_nonnegative_double>(z["NewDeathBft"])->value();
+ OldBenefitAmount =
exact_cast<tnr_nonnegative_double>(z["OldDeathBft"])->value();
+ NewSpecifiedAmount =
exact_cast<tnr_nonnegative_double>(z["NewSpecAmt"])->value();
+ OldSpecifiedAmount =
exact_cast<tnr_nonnegative_double>(z["OldSpecAmt"])->value();
+ NewTermAmount =
exact_cast<tnr_nonnegative_double>(z["NewQabTermAmt"])->value();
+ OldTermAmount =
exact_cast<tnr_nonnegative_double>(z["OldQabTermAmt"])->value();
+ NewWaiverOfPremiumInForce = false;
+ OldWaiverOfPremiumInForce = false;
+ NewPremiumsWaived = false;
+ OldPremiumsWaived = false;
+ NewWaiverOfPremiumRating = "None";
+ OldWaiverOfPremiumRating = "None";
+ NewAccidentalDeathInForce = false;
+ OldAccidentalDeathInForce = false;
+ NewAccidentalDeathRating = "None";
+ OldAccidentalDeathRating = "None";
+ NewTableRating =
exact_cast<mce_table_rating>(z["NewSubstandardTable"])->value();
+ OldTableRating =
exact_cast<mce_table_rating>(z["OldSubstandardTable"])->value();
+ NewPermanentFlatAmount0 = 0.0;
+ OldPermanentFlatAmount0 = 0.0;
+ NewPermanentFlatAmount1 = 0.0;
+ OldPermanentFlatAmount1 = 0.0;
+ NewPermanentFlatAmount2 = 0.0;
+ OldPermanentFlatAmount2 = 0.0;
+ NewTemporaryFlatAmount0 = 0.0;
+ OldTemporaryFlatAmount0 = 0.0;
+ NewTemporaryFlatAmount1 = 0.0;
+ OldTemporaryFlatAmount1 = 0.0;
+ NewTemporaryFlatAmount2 = 0.0;
+ OldTemporaryFlatAmount2 = 0.0;
+ NewTemporaryFlatDuration0 = 0;
+ OldTemporaryFlatDuration0 = 0;
+ NewTemporaryFlatDuration1 = 0;
+ OldTemporaryFlatDuration1 = 0;
+ NewTemporaryFlatDuration2 = 0;
+ OldTemporaryFlatDuration2 = 0;
+ LMI_ASSERT(z["OldTarget"] == z["NewTarget"]);
+ TargetPremium =
exact_cast<tnr_nonnegative_double>(z["NewTarget"])->value();
+}
+
+Server7702Input::operator gpt_input() const
+{
+ gpt_input z;
+
+ z["ContractNumber"] = UniqueIdentifier;
+ z["InforceYear"] = value_cast<std::string>(Duration);
+ // For class gpt_input, 'InforceAsOfDate' is primary by default,
+ // so it needs to be set here.
+ calendar_date d = add_years
+ (exact_cast<tnr_date>(z["EffectiveDate"])->value()
+ ,exact_cast<tnr_duration>(z["InforceYear"])->value()
+ ,true
+ );
+ z["InforceAsOfDate"] = value_cast<std::string>(d);
+ z["PremsPaidDecrement"] =
value_cast<std::string>(GrossNontaxableWithdrawal);
+ z["Payment"] = value_cast<std::string>(Premium);
+ z["ProductName"] = ProductName;
+ z["GroupUnderwritingType"] = UnderwritingBasis.str();
+ z["InforceGlp"] =
value_cast<std::string>(OldGuidelineLevelPremium);
+ z["InforceGsp"] =
value_cast<std::string>(OldGuidelineSinglePremium);
+ z["IssueAge"] = value_cast<std::string>(NewIssueAge);
+ LMI_ASSERT(OldIssueAge == NewIssueAge);
+ z["NewGender"] = NewGender.str();
+ z["OldGender"] = OldGender.str();
+ z["NewSmoking"] = NewSmoker.str();
+ z["OldSmoking"] = OldSmoker.str();
+ z["UnderwritingClass"] = NewUnderwritingClass.str();
+ LMI_ASSERT(OldUnderwritingClass == NewUnderwritingClass);
+ z["StateOfJurisdiction"] = NewStateOfJurisdiction.str();
+ LMI_ASSERT(OldStateOfJurisdiction == NewStateOfJurisdiction);
+ z["NewDbo"] = NewDeathBenefitOption.str();
+ z["OldDbo"] = OldDeathBenefitOption.str();
+ z["NewDeathBft"] = value_cast<std::string>(NewBenefitAmount);
+ z["OldDeathBft"] = value_cast<std::string>(OldBenefitAmount);
+ z["NewSpecAmt"] = value_cast<std::string>(NewSpecifiedAmount);
+ z["OldSpecAmt"] = value_cast<std::string>(OldSpecifiedAmount);
+ // It's unclear whether Server7702Input's [Old|New]TermAmount
+ // members were intended to represent an integrated term rider or
+ // a QAB. That doesn't really matter, because these amounts were
+ // never used in the old GPT calculations.
+ z["NewQabTermAmt"] = value_cast<std::string>(NewTermAmount);
+ z["OldQabTermAmt"] = value_cast<std::string>(OldTermAmount);
+ z["NewSubstandardTable"] = NewTableRating.str();
+ z["OldSubstandardTable"] = OldTableRating.str();
+ // 'TargetPremium' should have had "old" and "new" variants.
+ z["OldTarget"] = value_cast<std::string>(TargetPremium);
+ z["NewTarget"] = value_cast<std::string>(TargetPremium);
+
+ return z;
+}
+
//============================================================================
std::istream& operator>> (std::istream& is, Server7702Output& z)
{
Modified: lmi/trunk/ihs_server7702io.hpp
===================================================================
--- lmi/trunk/ihs_server7702io.hpp 2014-06-21 16:19:26 UTC (rev 5906)
+++ lmi/trunk/ihs_server7702io.hpp 2014-06-22 13:52:14 UTC (rev 5907)
@@ -26,6 +26,7 @@
#include "config.hpp"
+#include "gpt_input.hpp"
#include "mc_enum.hpp"
#include "mc_enum_types.hpp"
@@ -34,6 +35,10 @@
struct Server7702Input
{
+ Server7702Input();
+ Server7702Input(gpt_input const&);
+ operator gpt_input() const;
+
std::string UniqueIdentifier; // an arbitrary string that
identifies the contract uniquely. The contract number may be used, but remember
that the server maintains no database of actual contracts.
bool IsIssuedToday; // true if the contract is
issued or reissued today. Used to prevent adjustable events at issue, which
must not occur.
int Duration; // number of policy years
completed since issue (so it starts at 0).
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [lmi-commits] [5907] Convert between old and new GPT input,
Greg Chicares <=