""" 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)