Created
August 16, 2018 21:50
-
-
Save russellkt/89f5cbc6615e5a6bf4141a6c03cf3baf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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