Skip to content

Instantly share code, notes, and snippets.

@russellkt
Created August 16, 2018 21:50
Show Gist options
  • Save russellkt/89f5cbc6615e5a6bf4141a6c03cf3baf to your computer and use it in GitHub Desktop.
Save russellkt/89f5cbc6615e5a6bf4141a6c03cf3baf to your computer and use it in GitHub Desktop.
var _ = Underscore.load();
function getCountyFactors(county) {
var allCountyFactors = getTableByName('CountyFactors','Index');
var countyFactors = allCountyFactors.select({"County":county.toUpperCase()});
var countyFactorsMap = {};
_.each(countyFactors, function(countyFactor){
countyFactorsMap[countyFactor.getFieldValue('Peril')] = countyFactor.getFieldValue('Factor');
});
return countyFactorsMap;
}
function getDeductibleFactors(deductible){
var allDeductibleFactors = getTableByName('DeductibleFactors','Index');
var deductibleFactors = allDeductibleFactors.select({"Deductible":deductible});
var deductibleFactorsMap = {};
_.each(deductibleFactors, function(deductibleFactor){
deductibleFactorsMap[deductibleFactor.getFieldValue('Peril')] = deductibleFactor.getFieldValue('Factor');
});
return deductibleFactorsMap;
}
function getDPBaseDwellingFire(fields){
var factors = getTableByName('DPDwellingFireFactors','Index');
var queryFields = _.pick(fields,'ProtectionClass','Families','Occupancy','Construction',"Limit");
return getDPBase(factors, queryFields);
}
function getDPBaseContentsFire(fields){
var factors = getTableByName('DPContentsFireFactors','Index');
var queryFields = _.pick(fields,'ProtectionClass','Construction',"Limit");
return getDPBase(factors, queryFields);
}
function getDPBase(factors, queryFields){
var baseExcess = getBaseExcessLimits(queryFields["Limit"]);
queryFields["Limit"] = baseExcess["base"];
var totalBase = factors.select(queryFields).first().getFieldValue('Factor');
if(baseExcess["excess"] > 0){
queryFields["Limit"] = 100;
var excessFactor = factors.select(queryFields).first().getFieldValue('Factor');
var excessRate = baseExcess["excess"] / 100.0 * excessFactor;
totalBase += excessRate;
}
return totalBase;
}
function getBaseExcessLimits(limit){
return {"base": Math.min(limit,50000), "excess": Math.max(0,limit-50000)};
}
function calculateDPRates(quote){
_.each(quote["Items"], function(item){
var ratingFields = _.omit(quote,"Items");
ratingFields["Limit"] = item["Limit"];
ratingFields["Coverage"] = item["Item"]
item["firePremium"] = calculateDPFire(ratingFields,item);
var allied = calculateDPAllied(ratingFields);
item["ecPremium"] = allied["EC"];
item["otherPremium"] = allied["Other"];
});
return quote;
}
function calculateDPFire(ratingFields, item){
var dpBaseFireFunction = getBaseFireFunction(item);
var base = dpBaseFireFunction(ratingFields);
return applyFactorsToBase(base, ratingFields, "Fire");
}
function calculateDPAllied(ratingFields){
var base = getDPBaseAllied(ratingFields);
var allied = {"EC": 0, "Other":0};
allied["EC"] = applyFactorsToBase(base["EC"], ratingFields, "EC");
allied["Other"] = base["Other"] * getDeductibleFactors(ratingFields["Deductible"])["EC"];
return allied;
}
function applyFactorsToBase(base, ratingFields, peril){
ratingFields["Peril"] = peril;
var countyFactor = getCountyFactors(ratingFields['County'])[peril];
var deductibleFactor = getDeductibleFactors(ratingFields['Deductible'])[peril];
return base * countyFactor * deductibleFactor;
}
function getBaseFireFunction(item){
var fireFunctions = {"Dwelling" : getDPBaseDwellingFire,
"Contents" : getDPBaseContentsFire };
return fireFunctions[item["Item"]];
}
function getDPBaseAllied(fields){
var factors = getTableByName('DPECFactors','Index');
var queryFields = _.pick(fields,"Zone","Limit","Coverage");
var alliedBase = {"EC": 0, "Other": 0};
queryFields["Line"] = "Basic";
var ec = getDPBase(factors, queryFields);
if(fields["Line"] != "Basic"){
queryFields["Line"] = fields["Line"];
var broadSpecial = getDPBase(factors, queryFields);
alliedBase["Other"] = broadSpecial - ec;
}
alliedBase["EC"] = ec;
return alliedBase;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment