claims-journey-simulator / simulator.py
Bader Alabddan
Initial commit - Claims Journey Simulator
15df6b1
import random
def simulate_journey(claim_type, complexity, adjuster_experience, satisfaction_target):
"""
Simulate claims journey with timeline, decision points, and projections
Args:
claim_type: Type of claim (Auto, Property, Liability, Workers Comp, Health)
complexity: Complexity level (Simple, Moderate, Complex, Very Complex)
adjuster_experience: Years of adjuster experience (0-20)
satisfaction_target: Target customer satisfaction percentage (0-100)
Returns:
dict with timeline, decision_points, estimated_duration, cost_projection, risk_factors
"""
# Base timeline by claim type
base_timelines = {
"Auto": [
{"day": 0, "event": "FNOL received"},
{"day": 1, "event": "Adjuster assigned"},
{"day": 3, "event": "Vehicle inspection completed"},
{"day": 5, "event": "Estimate approved"},
{"day": 12, "event": "Repairs completed"},
{"day": 13, "event": "Final inspection"},
{"day": 14, "event": "Claim closed"}
],
"Property": [
{"day": 0, "event": "FNOL received"},
{"day": 1, "event": "Adjuster assigned"},
{"day": 2, "event": "Property inspection scheduled"},
{"day": 5, "event": "Damage assessment completed"},
{"day": 7, "event": "Estimate approved"},
{"day": 21, "event": "Repairs completed"},
{"day": 22, "event": "Final walkthrough"},
{"day": 23, "event": "Claim closed"}
],
"Liability": [
{"day": 0, "event": "FNOL received"},
{"day": 1, "event": "Adjuster assigned"},
{"day": 3, "event": "Investigation initiated"},
{"day": 7, "event": "Witness statements collected"},
{"day": 14, "event": "Liability determination"},
{"day": 21, "event": "Settlement negotiation"},
{"day": 28, "event": "Settlement agreement"},
{"day": 30, "event": "Claim closed"}
],
"Workers Comp": [
{"day": 0, "event": "FNOL received"},
{"day": 1, "event": "Case manager assigned"},
{"day": 2, "event": "Medical treatment authorized"},
{"day": 7, "event": "Medical evaluation completed"},
{"day": 14, "event": "Return to work assessment"},
{"day": 30, "event": "Ongoing treatment review"},
{"day": 45, "event": "Claim closed or continued"}
],
"Health": [
{"day": 0, "event": "Claim received"},
{"day": 1, "event": "Initial review"},
{"day": 3, "event": "Medical necessity verification"},
{"day": 5, "event": "Claim processed"},
{"day": 7, "event": "Payment issued"},
{"day": 10, "event": "Claim closed"}
]
}
timeline = base_timelines.get(claim_type, base_timelines["Auto"]).copy()
# Adjust timeline based on complexity
complexity_multipliers = {
"Simple": 0.7,
"Moderate": 1.0,
"Complex": 1.5,
"Very Complex": 2.0
}
multiplier = complexity_multipliers.get(complexity, 1.0)
# Adjust timeline days
for event in timeline:
event["day"] = int(event["day"] * multiplier)
# Adjust for adjuster experience (more experience = faster)
if adjuster_experience > 10:
experience_factor = 0.9
elif adjuster_experience > 5:
experience_factor = 1.0
else:
experience_factor = 1.1
for event in timeline:
event["day"] = int(event["day"] * experience_factor)
# Adjust for satisfaction target (higher target = more time for communication)
if satisfaction_target > 90:
satisfaction_factor = 1.1
elif satisfaction_target > 80:
satisfaction_factor = 1.05
else:
satisfaction_factor = 1.0
for event in timeline:
event["day"] = int(event["day"] * satisfaction_factor)
# Calculate estimated duration
estimated_duration = max([event["day"] for event in timeline])
# Generate decision points
decision_points = []
if claim_type == "Auto":
decision_points = [
"Coverage verification",
"Liability determination",
"Estimate approval",
"Repair shop selection"
]
elif claim_type == "Property":
decision_points = [
"Coverage verification",
"Damage scope determination",
"Contractor selection",
"Additional living expenses approval"
]
elif claim_type == "Liability":
decision_points = [
"Liability assessment",
"Coverage limits review",
"Settlement authority",
"Legal counsel involvement"
]
elif claim_type == "Workers Comp":
decision_points = [
"Compensability determination",
"Medical treatment authorization",
"Disability rating",
"Return to work planning"
]
else: # Health
decision_points = [
"Medical necessity review",
"Coverage verification",
"Payment calculation",
"Appeal handling if needed"
]
# Add complexity-based decision points
if complexity in ["Complex", "Very Complex"]:
decision_points.append("Senior adjuster review")
decision_points.append("Special investigation unit referral")
# Calculate cost projection
base_costs = {
"Auto": 8500,
"Property": 15000,
"Liability": 25000,
"Workers Comp": 12000,
"Health": 3500
}
base_cost = base_costs.get(claim_type, 10000)
cost_projection = base_cost * multiplier
# Adjust for experience (more experience = better cost control)
if adjuster_experience > 10:
cost_projection *= 0.95
elif adjuster_experience < 3:
cost_projection *= 1.1
# Generate risk factors
risk_factors = []
if complexity in ["Complex", "Very Complex"]:
risk_factors.append("High complexity may lead to delays")
if adjuster_experience < 3:
risk_factors.append("Junior adjuster may require supervision")
if satisfaction_target > 90:
risk_factors.append("High satisfaction target requires extra communication")
if claim_type == "Liability":
risk_factors.append("Potential for litigation")
if estimated_duration > 30:
risk_factors.append("Extended duration may impact customer satisfaction")
if not risk_factors:
risk_factors.append("No significant risk factors identified")
return {
"timeline": timeline,
"decision_points": decision_points,
"estimated_duration": estimated_duration,
"cost_projection": cost_projection,
"risk_factors": risk_factors
}