Sakshi
policy analyser app
0106d5f
"""
Rules for policy analyser
@author : Sakshi Tantak
"""
# Imports
import json
from datetime import datetime
from policy_analyser.llm import call_openai
def prepare_payload(extraction):
payload = {
'Sum Insured (SI)' : 0,
'Pre-existing diseases (PED) Waiting period' : 0,
'30-Day Waiting Period' : False,
'Specific Illness Waiting Period' : 0,
'Maternity waiting period' : 0,
'Exclusions' : [],
'Maternity benefits' : False,
'OPD' : 0,
'Copay' : 0,
'Deductible' : 0,
'Daycare treatment' : [],
'Free Health checkup' : False,
'Restoration benefit' : False,
'Sublimits' : [],
'Room rent limit (proportionate deduction)' : 100,
'Pre & Post Hospitalization' : False,
'Domiciliary Cover' : False,
'No claim bonus' : 0,
'Ambulance cover' : 0,
'International coverage' : False,
'Dental treatment' : 0,
'AYUSH treatment' : False,
'Health incentives' : False,
'Wellness Services' : False,
'Consumables/ Non medical expenses' : False,
'Hospital Cash' : False,
'Adults' : 0,
'Children' : 0,
'City' : '',
'Is Top City' : True,
'Policy Age' : 0
}
num_adults, num_children, is_top_city = 0, 0, True
today = datetime.today()
for entity in extraction:
if entity['entityName'] in ['Exclusions', 'Daycare treatment', 'Sublimits']:
try:
value = json.loads(entity['entityValue'])
payload[entity['entityName']] = value
except:
pass
if entity['entityName'] == "Policy Holder's Details":
value = entity['entityValue']
city = ''
try:
value = json.loads(value)
if 'city' in value:
city = value['city']
try:
response = call_openai('Does a given city string belong to set of given cities : [Mumbai, Delhi, Bangalore, Chennai, Hyderabad, Gurgaon, Pune]. Answer in true/false only', city)
is_top_city = True if response == 'true' else False
except:
pass
except:
pass
payload['Is Top City'] = is_top_city
payload['City'] = city
if entity['entityName'] == 'Insured Persons details':
value = entity['entityValue']
try:
value = json.loads(value)
for person in value:
if 'date_of_birth' in person:
dob = person['date_of_birth']
dob = datetime.strptime(dob, '%d/%m/%Y')
age = (today - dob).days / 365
elif 'age' in person:
age = person['age']
if age >= 18:
num_adults += 1
else:
num_children += 1
except:
num_adults = 1
payload['Adults'] = num_adults
payload['Children'] = num_children
if entity['entityName'] == 'Policy Details':
try:
value = json.loads(entity['entityValue'])
if 'policy_start_date' in value:
payload['Policy Age'] = ((today - datetime.strptime(value['policy_start_date'], '%d/%m/%Y')).days / 365) * 12
except:
pass
if entity['entityName'] in ['Sum Insured (SI)', 'Pre-existing diseases (PED) Waiting period', 'Specific Illness Waiting Period',
'Maternity waiting period', 'OPD', 'Copay', 'Deductible', 'No claim bonus', 'Ambulance cover',
'Dental treatment', 'Room rent limit (proportionate deduction)']:
value = entity['entityValue']
if isinstance(value, (float, int)):
payload[entity['entityName']] = value
else:
try:
value = float(value)
payload[entity['entityName']] = value
except:
pass
if entity['entityName'] in ['30-Day Waiting Period', 'Maternity benefits', 'Free Health checkup',
'Restoration benefit', 'Pre & Post Hospitalization', 'Domiciliary Cover',
'International coverage', 'AYUSH treatment', 'Health incentives', 'Wellness Services',
'Consumables/ Non medical expenses', 'Hospital Cash']:
value = entity['entityValue']
if isinstance(value, bool):
payload[entity['entityName']] = value
else:
payload[entity['entityName']] = True if 'true' in value else False
return payload
def rules(payload):
analysis = []
if payload['Adults'] == 1:
if payload['Is Top City']:
if payload['Sum Insured (SI)'] >= 2500000:
verdict, reason = 'Good', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 25L for an adult in {payload["City"]}'
if payload['Sum Insured (SI)'] >= 1000000 and payload['Sum Insured (SI)'] < 2500000:
verdict, reason = 'Average', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) < 25L but > 10L for an adult in {payload["City"]}'
if payload['Sum Insured (SI)'] < 1000000:
verdict, reason = 'Bad', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) < 10L for an adult in {payload["City"]}'
else:
if payload['Sum Insured (SI)'] >= 1000000:
verdict, reason = 'Good', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 10L for an adult in {payload["City"]}'
if payload['Sum Insured (SI)'] >= 500000 and payload['Sum Insured (SI)'] < 1000000:
verdict, reason = 'Average', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 5L but < 10L for an adult in {payload["City"]}'
if payload['Sum Insured (SI)'] < 500000:
verdict, reason = 'Bad', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) < 5L for an adult in {payload["City"]}'
if payload['Adults'] >= 2:
if payload['Children'] == 0:
if payload['Is Top City']:
if payload['Sum Insured (SI)'] >= 5000000:
verdict, reason = 'Good', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 50L for {payload["Adults"]} adults in {payload["City"]}'
if payload['Sum Insured (SI)'] >= 2500000 and payload['Sum Insured (SI)'] < 5000000:
verdict, reason = 'Average', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 25L but < 50L for {payload["Adults"]} adults in {payload["City"]}'
if payload['Sum Insured (SI)'] < 2500000:
verdict, reason = 'Bad', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) < 25L for {payload["Adults"]} adults in {payload["City"]}'
else:
if payload['Sum Insured (SI)'] >= 2500000:
verdict, reason = 'Good', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 25L for {payload["Adults"]} adults in {payload["City"]}'
if payload['Sum Insured (SI)'] >= 1000000 and payload['Sum Insured (SI)'] < 2500000:
verdict, reason = 'Average', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 10L but < 25L for {payload["Adults"]} adults in {payload["City"]}'
if payload['Sum Insured (SI)'] < 1000000:
verdict, reason = 'Bad', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) < 10L for {payload["Adults"]} adults in {payload["City"]}'
if payload['Children'] >= 1:
if payload['Children'] > 1 or payload['Is Top City']:
if payload['Sum Insured (SI)'] >= 10000000:
verdict, reason = 'Good', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 1 CR for {payload["Adults"]} adults & {payload["Children"]} children in {payload["City"]}'
if payload['Sum Insured (SI)'] >= 5000000 and payload['Sum Insured (SI)'] < 10000000:
verdict, reason = 'Average', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 50L but < 1 CR for {payload["Adults"]} adults & {payload["Children"]} children in {payload["City"]}'
if payload['Sum Insured (SI)'] < 5000000:
verdict, reason = 'Bad', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) < 50L for {payload["Adults"]} adults & {payload["Children"]} children in {payload["City"]}'
else:
if payload['Sum Insured (SI)'] >= 5000000:
verdict, reason = 'Good', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 50L for {payload["Adults"]} adults & {payload["Children"]} children in {payload["City"]}'
if payload['Sum Insured (SI)'] >= 2500000 and payload['Sum Insured (SI)'] < 5000000:
verdict, reason = 'Average', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) > 25L but < 50L for {payload["Adults"]} adults & {payload["Children"]} children in {payload["City"]}'
if payload['Sum Insured (SI)'] < 2500000:
verdict, reason = 'Bad', f'Sum Insured (SI) ({payload["Sum Insured (SI)"]}) < 25L for {payload["Adults"]} adults & {payload["Children"]} children in {payload["City"]}'
analysis.append(
{
'factor' : 'Sum Insured (SI)',
'verdict' : verdict,
'reason' : reason
}
)
if payload['Room rent limit (proportionate deduction)'] > 0:
verdict, reason = 'Bad', f'There is cap of {payload["Room rent limit (proportionate deduction)"]} on room rent'
else:
verdict, reason = 'Good', 'There is no cap on room rent'
analysis.append({'factor' : 'Room rent limit (proportionate deduction)', 'verdict' : verdict, 'reason' : reason})
if payload['Deductible'] > 0:
verdict, reason = 'Bad', f'There is a deductible of {payload["Deductible"]}'
else:
verdict, reason = 'Good', 'No deductible'
analysis.append({'factor' : 'Deductible', 'verdict' : verdict, 'reason' : reason})
if payload['Sublimits'] == []:
verdict, reason = 'Good', 'There are no sublimits on any treatments or diseases'
else:
verdict = 'Bad'
sublimits_str = '\n'.join([f'{sublimit["sublimit_name"]}: {sublimit["sublimit_value"]}' for sublimit in payload['Sublimits']])
reason = f'Following sublimits were found in your policy:\n{sublimits_str}'
analysis.append({'factor' :'Sublimits', 'verdict' : verdict, 'reason' : reason})
if payload['Copay'] == 0 and payload['Copay'] <= 5:
verdict, reason = 'Good', f'Copayment ({payload["Copay"]}) < 5%'
elif payload['Copay'] > 5 and payload['Copay'] <= 10:
verdict, reason = 'Average', f'Copayment ({payload["Copay"]}) > 5% but < 10%'
elif payload['Copay'] > 10:
verdict, reason = 'Bad', f'Copayment (({payload["Copay"]})) > 10%'
analysis.append({'factor' : 'Copay', 'verdict' : verdict, 'reason' : reason})
if payload['Pre-existing diseases (PED) Waiting period'] > 0:
if payload['Policy Age'] > payload['Pre-existing diseases (PED) Waiting period']:
verdict, reason = 'Good', f'Your policy has a waiting period of {payload["Pre-existing diseases (PED) Waiting period"]} months on pre-existing diseases but the waiting period has expired as of today'
else:
verdict, reason = 'Bad', f'Your policy has a waiting period of {payload["Pre-existing diseases (PED) Waiting period"]} months on pre-existing diseases which is yet to expire'
else:
verdict, reason = 'Good', f'Your policy has no waiting period on pre-existing diseases'
analysis.append({'factor' : 'Pre-existing diseases (PED) Waiting period', 'verdict' : verdict, 'reason' : reason})
if payload['30-Day Waiting Period']:
if payload['Policy Age'] > 1:
verdict, reason = 'Good', f'Your policy has a 30 day waiting period but it has expired as of today'
else:
verdict, reason = 'Bad', f'Your policy has a 30 day waiting period which is yet to expire'
else:
verdict, reason = 'Good', f'Your policy has no 30 day waiting period'
analysis.append({'factor' : '30-Day Waiting Period', 'verdict' : verdict, 'reason' : reason})
if payload['Specific Illness Waiting Period'] > 0:
if payload['Policy Age'] > payload['Specific Illness Waiting Period']:
verdict, reason = 'Good', f'Your policy has a waiting period of {payload["Specific Illness Waiting Period"]} on specific illnesses but the waiting period has expired as of today'
else:
verdict, reason = 'Bad', f'Your policy has a waiting period of {payload["Specific Illness Waiting Period"]} on specific illnesses which is yet to expire'
else:
verdict, reason = 'Good', f'Your policy has no waiting period any on specific illnesses'
analysis.append({'factor' : 'Specific Illness Waiting Period', 'verdict' : verdict, 'reason' : reason})
if payload['Maternity benefits']:
analysis.append(
{
'factor' : 'Maternity benefits',
'verdict' : 'Good',
'reason' : 'Maternity benefits present, check waiting period'
}
)
if payload['Maternity waiting period'] > 0:
if payload['Policy Age'] > payload['Maternity waiting period']:
verdict, reason = 'Good', f'Your policy has a waiting period of {payload["Maternity waiting period"]} for maternity cases but it has expired as of today'
else:
verdict, reason = 'Bad', f'Your policy has a waiting period of {payload["Maternity waiting period"]} for maternity cases which is yet to expire'
else:
verdict, reason = 'Good', f'Your policy has a no waiting period for maternity cases'
analysis.append({'factor' : 'Maternity waiting period', 'verdict' : verdict, 'reason' : reason})
else:
analysis.append(
{
'factor' : 'Maternity benefits',
'verdict' : 'Bad',
'reason' : 'No maternity benefits'
}
)
return analysis
if __name__ == '__main__':
import json
import glob
dirpath = '/Users/sakshi.tantak/Downloads/Porting Documents/testing-data/sample/poc'
for file in glob.glob(f'{dirpath}/*.analysis.json'):
json_data = json.load(open(file))
payload = prepare_payload(json_data[1]['response']['processed'])
json_data.append({
'stage' : 'POST_PROCESS',
'response' : payload,
'time' : 0
})
# print(json_data)
with open(file, 'w') as f:
json.dump(json_data, f, indent = 4)