medicafe 0.250728.8__py3-none-any.whl → 0.250728.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of medicafe might be problematic. Click here for more details.
- MediLink/MediLink.py +66 -26
- MediLink/MediLink_837p_encoder_library.py +22 -6
- MediLink/MediLink_DataMgmt.py +27 -9
- MediLink/MediLink_UI.py +20 -10
- MediLink/MediLink_insurance_utils.py +35 -69
- MediLink/__init__.py +1 -0
- MediLink/insurance_type_integration_test.py +55 -75
- {medicafe-0.250728.8.dist-info → medicafe-0.250728.9.dist-info}/METADATA +1 -1
- {medicafe-0.250728.8.dist-info → medicafe-0.250728.9.dist-info}/RECORD +12 -12
- {medicafe-0.250728.8.dist-info → medicafe-0.250728.9.dist-info}/LICENSE +0 -0
- {medicafe-0.250728.8.dist-info → medicafe-0.250728.9.dist-info}/WHEEL +0 -0
- {medicafe-0.250728.8.dist-info → medicafe-0.250728.9.dist-info}/top_level.txt +0 -0
MediLink/MediLink.py
CHANGED
|
@@ -33,17 +33,25 @@ def collect_detailed_patient_data(selected_files, config, crosswalk):
|
|
|
33
33
|
"""
|
|
34
34
|
Collects detailed patient data from the selected files.
|
|
35
35
|
|
|
36
|
+
DATA FLOW CLARIFICATION:
|
|
37
|
+
This function processes fixed-width files through extract_and_suggest_endpoint(),
|
|
38
|
+
which creates data structures with 'patient_id' field (sourced from 'CHART' field).
|
|
39
|
+
This is DIFFERENT from MediBot's parse_z_dat() flow which uses 'PATID' field.
|
|
40
|
+
|
|
36
41
|
:param selected_files: List of selected file paths.
|
|
37
42
|
:param config: Configuration settings loaded from a JSON file.
|
|
38
43
|
:param crosswalk: Crosswalk data for mapping purposes.
|
|
39
|
-
:return: A list of detailed patient data.
|
|
44
|
+
:return: A list of detailed patient data with 'patient_id' field populated.
|
|
40
45
|
"""
|
|
41
46
|
detailed_patient_data = []
|
|
42
47
|
for file_path in selected_files:
|
|
48
|
+
# IMPORTANT: extract_and_suggest_endpoint creates data with 'patient_id' field
|
|
49
|
+
# sourced from the 'CHART' field in fixed-width files
|
|
43
50
|
detailed_data = extract_and_suggest_endpoint(file_path, config, crosswalk)
|
|
44
51
|
detailed_patient_data.extend(detailed_data) # Accumulate detailed data for processing
|
|
45
52
|
|
|
46
53
|
# Enrich the detailed patient data with insurance type
|
|
54
|
+
# NOTE: This receives data from extract_and_suggest_endpoint with 'patient_id' field
|
|
47
55
|
detailed_patient_data = enrich_with_insurance_type(detailed_patient_data, insurance_options)
|
|
48
56
|
|
|
49
57
|
# Display summaries and provide an option for bulk edit
|
|
@@ -56,8 +64,16 @@ def enrich_with_insurance_type(detailed_patient_data, patient_insurance_type_map
|
|
|
56
64
|
Enriches the detailed patient data with insurance type based on patient ID.
|
|
57
65
|
Enhanced with optional API integration and comprehensive logging.
|
|
58
66
|
|
|
67
|
+
DATA FLOW CLARIFICATION:
|
|
68
|
+
This function receives data from collect_detailed_patient_data() -> extract_and_suggest_endpoint().
|
|
69
|
+
The patient ID field is 'patient_id' (NOT 'PATID').
|
|
70
|
+
|
|
71
|
+
IMPORTANT: Do not confuse with MediBot's parse_z_dat() flow which uses 'PATID'.
|
|
72
|
+
MediLink flow: fixed-width files -> extract_and_suggest_endpoint() -> 'patient_id' field (from 'CHART')
|
|
73
|
+
MediBot flow: Z.dat files -> parse_z_dat() -> 'PATID' field
|
|
74
|
+
|
|
59
75
|
Parameters:
|
|
60
|
-
- detailed_patient_data: List of dictionaries containing detailed patient data.
|
|
76
|
+
- detailed_patient_data: List of dictionaries containing detailed patient data with 'patient_id' field.
|
|
61
77
|
- patient_insurance_mapping: Dictionary mapping patient IDs to their insurance types.
|
|
62
78
|
|
|
63
79
|
Returns:
|
|
@@ -70,48 +86,60 @@ def enrich_with_insurance_type(detailed_patient_data, patient_insurance_type_map
|
|
|
70
86
|
UHC and which ones are not yet supported so they know which ones they need to edit. It is possible that we may want to isolate the
|
|
71
87
|
patient data that is already pulled from UHC so that the user can see which ones are already using the enriched data.
|
|
72
88
|
"""
|
|
73
|
-
#
|
|
89
|
+
# Enhanced mode check with graceful degradation
|
|
90
|
+
enhanced_mode = False
|
|
91
|
+
|
|
74
92
|
try:
|
|
75
93
|
from MediLink_insurance_utils import (
|
|
76
94
|
get_feature_flag,
|
|
77
|
-
enrich_patient_data_with_metadata,
|
|
78
|
-
generate_insurance_assignment_summary,
|
|
79
95
|
validate_insurance_type_from_config
|
|
80
96
|
)
|
|
81
97
|
enhanced_mode = get_feature_flag('enhanced_insurance_enrichment', default=False)
|
|
82
|
-
|
|
83
|
-
|
|
98
|
+
MediLink_ConfigLoader.log("Insurance enhancement utilities loaded successfully", level="DEBUG")
|
|
99
|
+
except ImportError as e:
|
|
100
|
+
MediLink_ConfigLoader.log("Insurance utils not available: {}. Using legacy mode.".format(str(e)), level="INFO")
|
|
101
|
+
enhanced_mode = False
|
|
102
|
+
except Exception as e:
|
|
103
|
+
MediLink_ConfigLoader.log("Error initializing insurance enhancements: {}. Using legacy mode.".format(str(e)), level="ERROR")
|
|
84
104
|
enhanced_mode = False
|
|
85
105
|
|
|
86
106
|
if patient_insurance_type_mapping is None:
|
|
87
|
-
MediLink_ConfigLoader.log("No Patient:Insurance-Type mapping available.", level="
|
|
107
|
+
MediLink_ConfigLoader.log("No Patient:Insurance-Type mapping available.", level="INFO")
|
|
88
108
|
patient_insurance_type_mapping = {}
|
|
89
109
|
|
|
90
|
-
# Enhanced mode with
|
|
110
|
+
# Enhanced mode with validation
|
|
91
111
|
if enhanced_mode:
|
|
92
112
|
MediLink_ConfigLoader.log("Using enhanced insurance type enrichment", level="INFO")
|
|
93
113
|
|
|
94
114
|
for data in detailed_patient_data:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
generate_insurance_assignment_summary(detailed_patient_data)
|
|
115
|
+
# FIELD NAME CLARIFICATION: Use 'patient_id' field created by extract_and_suggest_endpoint()
|
|
116
|
+
# This field contains the value from the 'CHART' field in the original fixed-width file
|
|
117
|
+
patient_id = data.get('patient_id')
|
|
118
|
+
if patient_id:
|
|
119
|
+
raw_insurance_type = patient_insurance_type_mapping.get(patient_id, '12') # Default to '12' (PPO/SBR09)
|
|
120
|
+
validated_insurance_type = validate_insurance_type_from_config(raw_insurance_type, patient_id)
|
|
121
|
+
data['insurance_type'] = validated_insurance_type
|
|
122
|
+
data['insurance_type_source'] = 'MANUAL' if patient_id in patient_insurance_type_mapping else 'DEFAULT'
|
|
123
|
+
else:
|
|
124
|
+
# Handle case where patient_id is missing or empty
|
|
125
|
+
MediLink_ConfigLoader.log("No patient_id found in data record", level="WARNING")
|
|
126
|
+
data['insurance_type'] = '12' # SBR09 default PPO
|
|
127
|
+
data['insurance_type_source'] = 'DEFAULT_FALLBACK'
|
|
109
128
|
|
|
110
129
|
else:
|
|
111
130
|
# Legacy mode (preserve existing behavior exactly)
|
|
131
|
+
MediLink_ConfigLoader.log("Using legacy insurance type enrichment", level="INFO")
|
|
112
132
|
for data in detailed_patient_data:
|
|
113
|
-
|
|
114
|
-
|
|
133
|
+
# FIELD NAME CLARIFICATION: Use 'patient_id' field created by extract_and_suggest_endpoint()
|
|
134
|
+
# This field contains the value from the 'CHART' field in the original fixed-width file
|
|
135
|
+
patient_id = data.get('patient_id')
|
|
136
|
+
if patient_id:
|
|
137
|
+
insurance_type = patient_insurance_type_mapping.get(patient_id, '12') # Default to '12' (PPO/SBR09)
|
|
138
|
+
else:
|
|
139
|
+
# Handle case where patient_id is missing or empty
|
|
140
|
+
MediLink_ConfigLoader.log("No patient_id found in data record", level="WARNING")
|
|
141
|
+
insurance_type = '12' # Default when no patient ID available
|
|
142
|
+
|
|
115
143
|
data['insurance_type'] = insurance_type
|
|
116
144
|
|
|
117
145
|
return detailed_patient_data
|
|
@@ -123,6 +151,16 @@ def extract_and_suggest_endpoint(file_path, config, crosswalk):
|
|
|
123
151
|
an endpoint based on insurance provider information found in the crosswalk and prepares
|
|
124
152
|
detailed patient data for processing.
|
|
125
153
|
|
|
154
|
+
DATA FLOW CLARIFICATION:
|
|
155
|
+
This function is the PRIMARY data source for MediLink patient processing.
|
|
156
|
+
It creates the 'patient_id' field by extracting the 'CHART' field from fixed-width files.
|
|
157
|
+
|
|
158
|
+
IMPORTANT: This is DIFFERENT from MediBot's parse_z_dat() which extracts 'PATID'.
|
|
159
|
+
|
|
160
|
+
Field mapping for MediLink flow:
|
|
161
|
+
- Fixed-width file 'CHART' field -> detailed_data['patient_id']
|
|
162
|
+
- This 'patient_id' is then used by enrich_with_insurance_type()
|
|
163
|
+
|
|
126
164
|
Parameters:
|
|
127
165
|
- file_path: Path to the fixed-width file.
|
|
128
166
|
- crosswalk: Crosswalk dictionary loaded from a JSON file.
|
|
@@ -177,7 +215,9 @@ def extract_and_suggest_endpoint(file_path, config, crosswalk):
|
|
|
177
215
|
detailed_data = parsed_data.copy() # Copy parsed_data to avoid modifying the original dictionary
|
|
178
216
|
detailed_data.update({
|
|
179
217
|
'file_path': file_path,
|
|
180
|
-
|
|
218
|
+
# CRITICAL FIELD MAPPING: 'CHART' field from fixed-width file becomes 'patient_id'
|
|
219
|
+
# This is the field that enrich_with_insurance_type() will use
|
|
220
|
+
'patient_id': parsed_data.get('CHART'), # ← This is the key field mapping for MediLink flow
|
|
181
221
|
'surgery_date': parsed_data.get('DATE'),
|
|
182
222
|
'patient_name': ' '.join([parsed_data.get(key, '') for key in ['FIRST', 'MIDDLE', 'LAST']]),
|
|
183
223
|
'amount': parsed_data.get('AMOUNT'),
|
|
@@ -607,8 +607,11 @@ def insurance_type_selection(parsed_data):
|
|
|
607
607
|
try:
|
|
608
608
|
from MediLink_insurance_utils import safe_insurance_type_selection
|
|
609
609
|
return safe_insurance_type_selection(parsed_data, _original_insurance_type_selection_logic)
|
|
610
|
-
except ImportError:
|
|
611
|
-
MediLink_ConfigLoader.log("Enhanced insurance selection not available
|
|
610
|
+
except ImportError as e:
|
|
611
|
+
MediLink_ConfigLoader.log("Enhanced insurance selection not available: {}. Using original logic".format(str(e)), level="INFO")
|
|
612
|
+
return _original_insurance_type_selection_logic(parsed_data)
|
|
613
|
+
except Exception as e:
|
|
614
|
+
MediLink_ConfigLoader.log("Error in enhanced insurance selection: {}. Using original logic".format(str(e)), level="ERROR")
|
|
612
615
|
return _original_insurance_type_selection_logic(parsed_data)
|
|
613
616
|
|
|
614
617
|
def _original_insurance_type_selection_logic(parsed_data):
|
|
@@ -653,11 +656,24 @@ def _original_insurance_type_selection_logic(parsed_data):
|
|
|
653
656
|
# User input for insurance type
|
|
654
657
|
user_input = input("Enter the 2-character code for the insurance type (or press Enter to default to '12' for PPO): ").strip().upper()
|
|
655
658
|
|
|
656
|
-
#
|
|
657
|
-
if user_input
|
|
658
|
-
|
|
659
|
+
# Input validation and assignment
|
|
660
|
+
if user_input:
|
|
661
|
+
# Basic format validation
|
|
662
|
+
if len(user_input) > 3 or not user_input.isalnum():
|
|
663
|
+
print("Invalid format: Insurance codes should be 1-3 alphanumeric characters. Defaulting to PPO.")
|
|
664
|
+
elif user_input in insurance_options:
|
|
665
|
+
insurance_type_code = user_input
|
|
666
|
+
print("Selected: {} - {}".format(user_input, insurance_options[user_input]))
|
|
667
|
+
else:
|
|
668
|
+
# User wants to use a code not in config - confirm with them
|
|
669
|
+
confirm = input("Code '{}' not found in configuration. Use it anyway? (y/n): ".format(user_input)).strip().lower()
|
|
670
|
+
if confirm in ['y', 'yes']:
|
|
671
|
+
insurance_type_code = user_input
|
|
672
|
+
print("Using code: {}".format(user_input))
|
|
673
|
+
else:
|
|
674
|
+
print("Defaulting to PPO (Preferred Provider Organization)")
|
|
659
675
|
else:
|
|
660
|
-
print("
|
|
676
|
+
print("Using default: PPO (Preferred Provider Organization)")
|
|
661
677
|
|
|
662
678
|
return insurance_type_code
|
|
663
679
|
|
MediLink/MediLink_DataMgmt.py
CHANGED
|
@@ -616,25 +616,43 @@ def confirm_all_suggested_endpoints(detailed_patient_data):
|
|
|
616
616
|
return detailed_patient_data
|
|
617
617
|
|
|
618
618
|
def bulk_edit_insurance_types(detailed_patient_data, insurance_options):
|
|
619
|
-
|
|
620
|
-
print("
|
|
619
|
+
"""Allow user to edit insurance types in a table-like format with validation"""
|
|
620
|
+
print("\nEdit Insurance Type (Enter the code). Enter 'LIST' to display available insurance types.")
|
|
621
621
|
|
|
622
622
|
for data in detailed_patient_data:
|
|
623
|
-
|
|
623
|
+
patient_id = data.get('patient_id', 'Unknown')
|
|
624
|
+
patient_name = data.get('patient_name', 'Unknown')
|
|
625
|
+
current_insurance_type = data.get('insurance_type', '12')
|
|
624
626
|
current_insurance_description = insurance_options.get(current_insurance_type, "Unknown")
|
|
627
|
+
|
|
625
628
|
print("({}) {:<25} | Current Ins. Type: {} - {}".format(
|
|
626
|
-
|
|
629
|
+
patient_id, patient_name, current_insurance_type, current_insurance_description))
|
|
627
630
|
|
|
628
631
|
while True:
|
|
629
|
-
new_insurance_type = input("Enter new insurance type (or press Enter to keep current): ").upper()
|
|
632
|
+
new_insurance_type = input("Enter new insurance type (or press Enter to keep current): ").strip().upper()
|
|
633
|
+
|
|
630
634
|
if new_insurance_type == 'LIST':
|
|
631
635
|
MediLink_UI.display_insurance_options(insurance_options)
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
636
|
+
continue
|
|
637
|
+
|
|
638
|
+
elif not new_insurance_type:
|
|
639
|
+
# Keep current insurance type
|
|
640
|
+
break
|
|
641
|
+
|
|
642
|
+
elif new_insurance_type in insurance_options:
|
|
643
|
+
# Valid insurance type from config
|
|
644
|
+
data['insurance_type'] = new_insurance_type
|
|
635
645
|
break
|
|
646
|
+
|
|
636
647
|
else:
|
|
637
|
-
|
|
648
|
+
# User wants to use a code not in config - confirm with them
|
|
649
|
+
confirm = input("Code '{}' not found in configuration. Use it anyway? (y/n): ".format(new_insurance_type)).strip().lower()
|
|
650
|
+
if confirm in ['y', 'yes']:
|
|
651
|
+
data['insurance_type'] = new_insurance_type
|
|
652
|
+
break
|
|
653
|
+
else:
|
|
654
|
+
print("Invalid insurance type. Please enter a valid code or type 'LIST' to see options.")
|
|
655
|
+
continue
|
|
638
656
|
|
|
639
657
|
def review_and_confirm_changes(detailed_patient_data, insurance_options):
|
|
640
658
|
# Review and confirm changes
|
MediLink/MediLink_UI.py
CHANGED
|
@@ -102,14 +102,18 @@ def get_new_endpoint_choice():
|
|
|
102
102
|
|
|
103
103
|
# Function to display full list of insurance options
|
|
104
104
|
def display_insurance_options(insurance_options=None):
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
"""Display insurance options, loading from config if not provided"""
|
|
106
|
+
|
|
107
|
+
if insurance_options is None:
|
|
108
|
+
config, _ = MediLink_ConfigLoader.load_configuration()
|
|
109
|
+
insurance_options = config.get('MediLink_Config', {}).get('insurance_options', {})
|
|
109
110
|
|
|
110
|
-
print("\nInsurance Type Options:")
|
|
111
|
+
print("\nInsurance Type Options (SBR09 Codes):")
|
|
112
|
+
print("-" * 50)
|
|
111
113
|
for code, description in sorted(insurance_options.items()):
|
|
112
|
-
print("{}: {}".format(code, description))
|
|
114
|
+
print("{:>3}: {}".format(code, description))
|
|
115
|
+
print("-" * 50)
|
|
116
|
+
print("Note: '12' (PPO) is the default if no selection is made.")
|
|
113
117
|
print() # Add a blank line for better readability
|
|
114
118
|
|
|
115
119
|
def display_patient_summaries(detailed_patient_data):
|
|
@@ -130,10 +134,10 @@ def display_file_summary(index, summary):
|
|
|
130
134
|
|
|
131
135
|
# Add header row if it's the first index
|
|
132
136
|
if index == 1:
|
|
133
|
-
print("{:<3} {:5} {:<10} {:20} {:15} {:
|
|
137
|
+
print("{:<3} {:5} {:<10} {:20} {:15} {:3} {:20}".format(
|
|
134
138
|
"No.", "Date", "ID", "Name", "Primary Ins.", "IT", "Current Endpoint"
|
|
135
139
|
))
|
|
136
|
-
print("-"*
|
|
140
|
+
print("-"*82)
|
|
137
141
|
|
|
138
142
|
# Check if insurance_type is available; if not, set a default placeholder (this should already be '12' at this point)
|
|
139
143
|
insurance_type = summary.get('insurance_type', '--')
|
|
@@ -143,14 +147,20 @@ def display_file_summary(index, summary):
|
|
|
143
147
|
summary.get('user_preferred_endpoint') or
|
|
144
148
|
summary.get('suggested_endpoint', 'AVAILITY'))
|
|
145
149
|
|
|
150
|
+
# Format insurance type for display - handle both 2 and 3 character codes
|
|
151
|
+
if insurance_type and len(insurance_type) <= 3:
|
|
152
|
+
insurance_display = insurance_type
|
|
153
|
+
else:
|
|
154
|
+
insurance_display = insurance_type[:3] if insurance_type else '--'
|
|
155
|
+
|
|
146
156
|
# Displays the summary of a file.
|
|
147
|
-
print("{:02d}. {:5} ({:<8}) {:20} {:15} {:
|
|
157
|
+
print("{:02d}. {:5} ({:<8}) {:20} {:15} {:3} {:20}".format(
|
|
148
158
|
index,
|
|
149
159
|
surgery_date.strftime("%m-%d"),
|
|
150
160
|
summary['patient_id'],
|
|
151
161
|
summary['patient_name'][:20],
|
|
152
162
|
summary['primary_insurance'][:15],
|
|
153
|
-
|
|
163
|
+
insurance_display,
|
|
154
164
|
effective_endpoint[:20])
|
|
155
165
|
)
|
|
156
166
|
|
|
@@ -13,9 +13,19 @@ except ImportError:
|
|
|
13
13
|
import MediLink_ConfigLoader
|
|
14
14
|
import MediLink_UI
|
|
15
15
|
|
|
16
|
+
# Safe tqdm import with fallback
|
|
17
|
+
try:
|
|
18
|
+
from tqdm import tqdm
|
|
19
|
+
except ImportError:
|
|
20
|
+
# Fallback for when tqdm is not available
|
|
21
|
+
def tqdm(iterable, desc="Processing", **kwargs):
|
|
22
|
+
if desc:
|
|
23
|
+
print("{}...".format(desc))
|
|
24
|
+
return iterable
|
|
25
|
+
|
|
16
26
|
# Feature flag system
|
|
17
27
|
def get_feature_flag(flag_name, default=False):
|
|
18
|
-
"""
|
|
28
|
+
"""Get feature flag from config or return default"""
|
|
19
29
|
try:
|
|
20
30
|
config, _ = MediLink_ConfigLoader.load_configuration()
|
|
21
31
|
feature_flags = config.get("MediLink_Config", {}).get("feature_flags", {})
|
|
@@ -27,25 +37,34 @@ def get_feature_flag(flag_name, default=False):
|
|
|
27
37
|
# Enhanced insurance type validation
|
|
28
38
|
def validate_insurance_type_from_config(insurance_type_code, payer_id=""):
|
|
29
39
|
"""
|
|
30
|
-
Validate insurance type against configuration
|
|
40
|
+
Validate insurance type against configuration.
|
|
31
41
|
Returns validated type or safe fallback.
|
|
32
42
|
"""
|
|
33
43
|
try:
|
|
34
44
|
config, _ = MediLink_ConfigLoader.load_configuration()
|
|
35
|
-
insurance_options = config
|
|
45
|
+
insurance_options = config.get('MediLink_Config', {}).get('insurance_options', {})
|
|
36
46
|
|
|
37
47
|
if not insurance_type_code:
|
|
38
|
-
MediLink_ConfigLoader.log("Empty insurance type code for payer {}, using default PPO".format(payer_id), level="
|
|
48
|
+
MediLink_ConfigLoader.log("Empty insurance type code for payer {}, using default PPO".format(payer_id), level="INFO")
|
|
39
49
|
return '12' # Default to PPO
|
|
40
50
|
|
|
41
|
-
#
|
|
51
|
+
# Clean and normalize input
|
|
52
|
+
insurance_type_code = str(insurance_type_code).strip().upper()
|
|
53
|
+
|
|
54
|
+
# Basic format validation
|
|
55
|
+
if len(insurance_type_code) > 3 or not insurance_type_code.isalnum():
|
|
56
|
+
MediLink_ConfigLoader.log("Invalid insurance type format '{}' for payer {}, using PPO fallback".format(
|
|
57
|
+
insurance_type_code, payer_id), level="WARNING")
|
|
58
|
+
return '12'
|
|
59
|
+
|
|
60
|
+
# Configuration lookup - insurance type exists in config
|
|
42
61
|
if insurance_type_code in insurance_options:
|
|
43
62
|
MediLink_ConfigLoader.log("Validated insurance type '{}' for payer {}".format(
|
|
44
63
|
insurance_type_code, payer_id), level="DEBUG")
|
|
45
64
|
return insurance_type_code
|
|
46
65
|
|
|
47
66
|
# Unknown type - log and fallback
|
|
48
|
-
MediLink_ConfigLoader.log("
|
|
67
|
+
MediLink_ConfigLoader.log("Unknown insurance type '{}' for payer {} - using PPO fallback".format(
|
|
49
68
|
insurance_type_code, payer_id), level="WARNING")
|
|
50
69
|
|
|
51
70
|
return '12' # Safe fallback to PPO
|
|
@@ -54,69 +73,22 @@ def validate_insurance_type_from_config(insurance_type_code, payer_id=""):
|
|
|
54
73
|
MediLink_ConfigLoader.log("Insurance validation error: {} - using PPO fallback".format(str(e)), level="ERROR")
|
|
55
74
|
return '12'
|
|
56
75
|
|
|
57
|
-
# Enhanced patient data enrichment
|
|
58
|
-
def enrich_patient_data_with_metadata(detailed_patient_data, insurance_source='MANUAL'):
|
|
59
|
-
"""
|
|
60
|
-
Add metadata to patient data for tracking and monitoring.
|
|
61
|
-
Safe enhancement that doesn't break existing functionality.
|
|
62
|
-
"""
|
|
63
|
-
enhanced_data = []
|
|
64
|
-
|
|
65
|
-
for data in detailed_patient_data:
|
|
66
|
-
# Create enhanced copy
|
|
67
|
-
enhanced_record = data.copy()
|
|
68
|
-
|
|
69
|
-
# Add metadata fields
|
|
70
|
-
enhanced_record['insurance_type_source'] = insurance_source
|
|
71
|
-
enhanced_record['insurance_type_validated'] = True
|
|
72
|
-
enhanced_record['insurance_type_timestamp'] = time.time()
|
|
73
|
-
enhanced_record['insurance_type_metadata'] = {}
|
|
74
|
-
|
|
75
|
-
enhanced_data.append(enhanced_record)
|
|
76
|
-
|
|
77
|
-
return enhanced_data
|
|
78
|
-
|
|
79
|
-
# Insurance type assignment logging
|
|
80
|
-
def log_insurance_type_decision(patient_id, insurance_type, source, metadata=None):
|
|
81
|
-
"""Enhanced logging for insurance type assignments"""
|
|
82
|
-
log_data = {
|
|
83
|
-
'patient_id': patient_id,
|
|
84
|
-
'insurance_type': insurance_type,
|
|
85
|
-
'source': source,
|
|
86
|
-
'timestamp': time.time()
|
|
87
|
-
}
|
|
88
|
-
if metadata:
|
|
89
|
-
log_data['metadata'] = metadata
|
|
90
|
-
|
|
91
|
-
MediLink_ConfigLoader.log("Insurance assignment: {}".format(json.dumps(log_data)), level="INFO")
|
|
92
|
-
|
|
93
76
|
# Monitoring and statistics
|
|
94
77
|
def generate_insurance_assignment_summary(detailed_patient_data):
|
|
95
|
-
"""
|
|
96
|
-
Generate summary statistics for insurance type assignments.
|
|
97
|
-
Helps monitor system performance and data quality.
|
|
98
|
-
"""
|
|
78
|
+
"""Generate basic summary statistics for insurance type assignments"""
|
|
99
79
|
if not detailed_patient_data:
|
|
100
80
|
return {}
|
|
101
81
|
|
|
102
|
-
# Collect statistics
|
|
103
|
-
source_counts = {}
|
|
82
|
+
# Collect basic statistics
|
|
104
83
|
insurance_type_counts = {}
|
|
105
84
|
|
|
106
85
|
for data in detailed_patient_data:
|
|
107
|
-
source = data.get('insurance_type_source', 'UNKNOWN')
|
|
108
86
|
insurance_type = data.get('insurance_type', 'UNKNOWN')
|
|
109
|
-
|
|
110
|
-
source_counts[source] = source_counts.get(source, 0) + 1
|
|
111
87
|
insurance_type_counts[insurance_type] = insurance_type_counts.get(insurance_type, 0) + 1
|
|
112
88
|
|
|
113
|
-
total_patients = len(detailed_patient_data)
|
|
114
|
-
|
|
115
89
|
summary = {
|
|
116
|
-
'total_patients':
|
|
117
|
-
'
|
|
118
|
-
'insurance_types': insurance_type_counts,
|
|
119
|
-
'timestamp': time.time()
|
|
90
|
+
'total_patients': len(detailed_patient_data),
|
|
91
|
+
'insurance_types': insurance_type_counts
|
|
120
92
|
}
|
|
121
93
|
|
|
122
94
|
# Log summary
|
|
@@ -138,23 +110,22 @@ def safe_insurance_type_selection(parsed_data, fallback_function):
|
|
|
138
110
|
|
|
139
111
|
if enhanced_mode:
|
|
140
112
|
# Try enhanced selection (would be implemented here)
|
|
141
|
-
MediLink_ConfigLoader.log("Attempting enhanced insurance selection
|
|
113
|
+
MediLink_ConfigLoader.log("Attempting enhanced insurance selection", level="DEBUG")
|
|
142
114
|
# For now, just call fallback - actual enhancement would go here
|
|
143
115
|
result = fallback_function(parsed_data)
|
|
144
|
-
|
|
116
|
+
MediLink_ConfigLoader.log("Insurance decision: type={}, method=ENHANCED".format(result), level="INFO")
|
|
145
117
|
return result
|
|
146
118
|
else:
|
|
147
119
|
# Use standard selection
|
|
148
120
|
result = fallback_function(parsed_data)
|
|
149
|
-
|
|
121
|
+
MediLink_ConfigLoader.log("Insurance decision: type={}, method=MANUAL".format(result), level="INFO")
|
|
150
122
|
return result
|
|
151
123
|
|
|
152
124
|
except Exception as e:
|
|
153
125
|
# Error handling with safe fallback
|
|
154
|
-
MediLink_ConfigLoader.log("Insurance selection error
|
|
155
|
-
patient_name, str(e)), level="ERROR")
|
|
126
|
+
MediLink_ConfigLoader.log("Insurance selection error: {}. Using PPO default.".format(str(e)), level="ERROR")
|
|
156
127
|
|
|
157
|
-
|
|
128
|
+
MediLink_ConfigLoader.log("Insurance decision: type=12, method=ERROR_FALLBACK, error={}".format(str(e)), level="INFO")
|
|
158
129
|
return '12' # Safe fallback
|
|
159
130
|
|
|
160
131
|
# Configuration validation
|
|
@@ -237,12 +208,7 @@ def process_patients_with_progress(patients, processing_function, description="P
|
|
|
237
208
|
processed_results = []
|
|
238
209
|
errors = []
|
|
239
210
|
|
|
240
|
-
|
|
241
|
-
from tqdm import tqdm
|
|
242
|
-
iterator = tqdm(patients, desc=description)
|
|
243
|
-
except ImportError:
|
|
244
|
-
iterator = patients
|
|
245
|
-
MediLink_ConfigLoader.log("Processing {} patients (tqdm not available)".format(len(patients)), level="INFO")
|
|
211
|
+
iterator = tqdm(patients, desc=description)
|
|
246
212
|
|
|
247
213
|
for i, patient in enumerate(iterator):
|
|
248
214
|
try:
|
MediLink/__init__.py
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .MediLink import enrich_with_insurance_type
|
|
@@ -4,27 +4,29 @@
|
|
|
4
4
|
|
|
5
5
|
import time
|
|
6
6
|
import json
|
|
7
|
+
import sys, os
|
|
8
|
+
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
7
9
|
|
|
8
10
|
try:
|
|
9
11
|
from MediLink import MediLink_ConfigLoader
|
|
10
|
-
from
|
|
11
|
-
|
|
12
|
-
validate_insurance_configuration,
|
|
13
|
-
get_feature_flag,
|
|
14
|
-
EnhancedAPIClient
|
|
12
|
+
from MediLink_API_v3 import (
|
|
13
|
+
APIClient
|
|
15
14
|
)
|
|
16
|
-
from
|
|
17
|
-
enrich_with_insurance_type
|
|
18
|
-
monitor_insurance_type_assignments
|
|
15
|
+
from MediLink import (
|
|
16
|
+
enrich_with_insurance_type
|
|
19
17
|
)
|
|
20
|
-
from
|
|
18
|
+
from MediLink_837p_encoder_library import (
|
|
21
19
|
insurance_type_selection,
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
_original_insurance_type_selection_logic
|
|
21
|
+
)
|
|
22
|
+
from MediLink_insurance_utils import (
|
|
23
|
+
validate_insurance_type_from_config,
|
|
24
|
+
get_feature_flag,
|
|
25
|
+
generate_insurance_assignment_summary
|
|
24
26
|
)
|
|
25
27
|
except ImportError as e:
|
|
26
28
|
print("Import error: {}".format(str(e)))
|
|
27
|
-
print("This module requires the
|
|
29
|
+
print("This module requires the insurance type components.")
|
|
28
30
|
|
|
29
31
|
def run_insurance_type_integration_tests():
|
|
30
32
|
"""
|
|
@@ -46,12 +48,13 @@ def run_insurance_type_integration_tests():
|
|
|
46
48
|
test_results['total_tests'] += 1
|
|
47
49
|
try:
|
|
48
50
|
print("\n1. Testing Production Readiness Validation...")
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
from MediLink_insurance_utils import validate_insurance_configuration
|
|
52
|
+
validate_insurance_configuration()
|
|
53
|
+
print(" PASS Production readiness validation PASSED")
|
|
51
54
|
test_results['passed_tests'] += 1
|
|
52
55
|
test_results['test_details'].append({'test': 'production_readiness', 'status': 'PASSED'})
|
|
53
56
|
except Exception as e:
|
|
54
|
-
print("
|
|
57
|
+
print(" FAIL Production readiness validation FAILED: {}".format(str(e)))
|
|
55
58
|
test_results['failed_tests'] += 1
|
|
56
59
|
test_results['test_details'].append({'test': 'production_readiness', 'status': 'FAILED', 'error': str(e)})
|
|
57
60
|
|
|
@@ -59,12 +62,13 @@ def run_insurance_type_integration_tests():
|
|
|
59
62
|
test_results['total_tests'] += 1
|
|
60
63
|
try:
|
|
61
64
|
print("\n2. Testing Insurance Configuration Validation...")
|
|
65
|
+
from MediLink_insurance_utils import validate_insurance_configuration
|
|
62
66
|
validate_insurance_configuration()
|
|
63
|
-
print("
|
|
67
|
+
print(" PASS Insurance configuration validation PASSED")
|
|
64
68
|
test_results['passed_tests'] += 1
|
|
65
69
|
test_results['test_details'].append({'test': 'insurance_config', 'status': 'PASSED'})
|
|
66
70
|
except Exception as e:
|
|
67
|
-
print("
|
|
71
|
+
print(" FAIL Insurance configuration validation FAILED: {}".format(str(e)))
|
|
68
72
|
test_results['failed_tests'] += 1
|
|
69
73
|
test_results['test_details'].append({'test': 'insurance_config', 'status': 'FAILED', 'error': str(e)})
|
|
70
74
|
|
|
@@ -76,24 +80,24 @@ def run_insurance_type_integration_tests():
|
|
|
76
80
|
enhanced_flag = get_feature_flag('enhanced_insurance_enrichment', default=False)
|
|
77
81
|
print(" API Insurance Selection Flag: {}".format(api_flag))
|
|
78
82
|
print(" Enhanced Insurance Enrichment Flag: {}".format(enhanced_flag))
|
|
79
|
-
print("
|
|
83
|
+
print(" PASS Feature flag system PASSED")
|
|
80
84
|
test_results['passed_tests'] += 1
|
|
81
85
|
test_results['test_details'].append({'test': 'feature_flags', 'status': 'PASSED'})
|
|
82
86
|
except Exception as e:
|
|
83
|
-
print("
|
|
87
|
+
print(" FAIL Feature flag system FAILED: {}".format(str(e)))
|
|
84
88
|
test_results['failed_tests'] += 1
|
|
85
89
|
test_results['test_details'].append({'test': 'feature_flags', 'status': 'FAILED', 'error': str(e)})
|
|
86
90
|
|
|
87
|
-
# Test 4:
|
|
91
|
+
# Test 4: API Client Initialization
|
|
88
92
|
test_results['total_tests'] += 1
|
|
89
93
|
try:
|
|
90
|
-
print("\n4. Testing
|
|
91
|
-
api_client =
|
|
92
|
-
print("
|
|
94
|
+
print("\n4. Testing API Client Initialization...")
|
|
95
|
+
api_client = APIClient()
|
|
96
|
+
print(" PASS API client initialization PASSED")
|
|
93
97
|
test_results['passed_tests'] += 1
|
|
94
98
|
test_results['test_details'].append({'test': 'api_client_init', 'status': 'PASSED'})
|
|
95
99
|
except Exception as e:
|
|
96
|
-
print("
|
|
100
|
+
print(" FAIL API client initialization FAILED: {}".format(str(e)))
|
|
97
101
|
test_results['failed_tests'] += 1
|
|
98
102
|
test_results['test_details'].append({'test': 'api_client_init', 'status': 'FAILED', 'error': str(e)})
|
|
99
103
|
|
|
@@ -109,11 +113,11 @@ def run_insurance_type_integration_tests():
|
|
|
109
113
|
}
|
|
110
114
|
result = insurance_type_selection(test_parsed_data)
|
|
111
115
|
assert result == '12', "Should return pre-assigned insurance type"
|
|
112
|
-
print("
|
|
116
|
+
print(" PASS Insurance type selection backward compatibility PASSED")
|
|
113
117
|
test_results['passed_tests'] += 1
|
|
114
118
|
test_results['test_details'].append({'test': 'backward_compatibility', 'status': 'PASSED'})
|
|
115
119
|
except Exception as e:
|
|
116
|
-
print("
|
|
120
|
+
print(" FAIL Insurance type selection backward compatibility FAILED: {}".format(str(e)))
|
|
117
121
|
test_results['failed_tests'] += 1
|
|
118
122
|
test_results['test_details'].append({'test': 'backward_compatibility', 'status': 'FAILED', 'error': str(e)})
|
|
119
123
|
|
|
@@ -131,33 +135,18 @@ def run_insurance_type_integration_tests():
|
|
|
131
135
|
enriched_data = enrich_with_insurance_type(test_patient_data)
|
|
132
136
|
assert len(enriched_data) == 1, "Should return same number of patients"
|
|
133
137
|
assert 'insurance_type' in enriched_data[0], "Should add insurance_type field"
|
|
134
|
-
|
|
135
|
-
print(" ✅ Patient data enrichment PASSED")
|
|
138
|
+
print(" PASS Patient data enrichment PASSED")
|
|
136
139
|
test_results['passed_tests'] += 1
|
|
137
140
|
test_results['test_details'].append({'test': 'patient_enrichment', 'status': 'PASSED'})
|
|
138
141
|
except Exception as e:
|
|
139
|
-
print("
|
|
142
|
+
print(" FAIL Patient data enrichment FAILED: {}".format(str(e)))
|
|
140
143
|
test_results['failed_tests'] += 1
|
|
141
144
|
test_results['test_details'].append({'test': 'patient_enrichment', 'status': 'FAILED', 'error': str(e)})
|
|
142
145
|
|
|
143
|
-
# Test 7:
|
|
146
|
+
# Test 7: Monitoring System
|
|
144
147
|
test_results['total_tests'] += 1
|
|
145
148
|
try:
|
|
146
|
-
print("\n7. Testing
|
|
147
|
-
api_available = is_api_insurance_selection_available()
|
|
148
|
-
print(" API Insurance Selection Available: {}".format(api_available))
|
|
149
|
-
print(" ✅ API availability check PASSED")
|
|
150
|
-
test_results['passed_tests'] += 1
|
|
151
|
-
test_results['test_details'].append({'test': 'api_availability', 'status': 'PASSED'})
|
|
152
|
-
except Exception as e:
|
|
153
|
-
print(" ❌ API availability check FAILED: {}".format(str(e)))
|
|
154
|
-
test_results['failed_tests'] += 1
|
|
155
|
-
test_results['test_details'].append({'test': 'api_availability', 'status': 'FAILED', 'error': str(e)})
|
|
156
|
-
|
|
157
|
-
# Test 8: Monitoring System
|
|
158
|
-
test_results['total_tests'] += 1
|
|
159
|
-
try:
|
|
160
|
-
print("\n8. Testing Monitoring System...")
|
|
149
|
+
print("\n7. Testing Monitoring System...")
|
|
161
150
|
test_patient_data = [
|
|
162
151
|
{
|
|
163
152
|
'patient_id': 'TEST001',
|
|
@@ -170,12 +159,12 @@ def run_insurance_type_integration_tests():
|
|
|
170
159
|
'insurance_type_source': 'API'
|
|
171
160
|
}
|
|
172
161
|
]
|
|
173
|
-
|
|
174
|
-
print("
|
|
162
|
+
generate_insurance_assignment_summary(test_patient_data)
|
|
163
|
+
print(" PASS Monitoring system PASSED")
|
|
175
164
|
test_results['passed_tests'] += 1
|
|
176
165
|
test_results['test_details'].append({'test': 'monitoring', 'status': 'PASSED'})
|
|
177
166
|
except Exception as e:
|
|
178
|
-
print("
|
|
167
|
+
print(" FAIL Monitoring system FAILED: {}".format(str(e)))
|
|
179
168
|
test_results['failed_tests'] += 1
|
|
180
169
|
test_results['test_details'].append({'test': 'monitoring', 'status': 'FAILED', 'error': str(e)})
|
|
181
170
|
|
|
@@ -184,13 +173,13 @@ def run_insurance_type_integration_tests():
|
|
|
184
173
|
print("TEST SUMMARY")
|
|
185
174
|
print("=" * 60)
|
|
186
175
|
print("Total Tests: {}".format(test_results['total_tests']))
|
|
187
|
-
print("Passed: {}
|
|
188
|
-
print("Failed: {}
|
|
176
|
+
print("Passed: {}".format(test_results['passed_tests']))
|
|
177
|
+
print("Failed: {}".format(test_results['failed_tests']))
|
|
189
178
|
|
|
190
179
|
if test_results['failed_tests'] == 0:
|
|
191
|
-
print("\
|
|
180
|
+
print("\nPASS ALL TESTS! System ready for deployment.")
|
|
192
181
|
else:
|
|
193
|
-
print("\
|
|
182
|
+
print("\nFAIL {} TESTS. Review before deployment.".format(test_results['failed_tests']))
|
|
194
183
|
for test in test_results['test_details']:
|
|
195
184
|
if test['status'] == 'FAILED':
|
|
196
185
|
print(" - {}: {}".format(test['test'], test.get('error', 'Unknown error')))
|
|
@@ -203,41 +192,33 @@ def test_insurance_type_validation():
|
|
|
203
192
|
print("INSURANCE TYPE VALIDATION TESTS")
|
|
204
193
|
print("=" * 50)
|
|
205
194
|
|
|
206
|
-
# Import validation function
|
|
207
|
-
from MediLink_API_v3_enhanced import validate_insurance_type_from_super_connector
|
|
208
|
-
|
|
209
195
|
test_cases = [
|
|
210
196
|
{
|
|
211
197
|
'name': 'Valid PPO Type',
|
|
212
|
-
'plan_description': 'Preferred Provider Organization',
|
|
213
198
|
'insurance_type': '12',
|
|
214
199
|
'payer_id': '87726',
|
|
215
200
|
'expected': '12'
|
|
216
201
|
},
|
|
217
202
|
{
|
|
218
203
|
'name': 'Valid HMO Type',
|
|
219
|
-
'plan_description': 'Health Maintenance Organization',
|
|
220
204
|
'insurance_type': 'HM',
|
|
221
205
|
'payer_id': '87726',
|
|
222
206
|
'expected': 'HM'
|
|
223
207
|
},
|
|
224
208
|
{
|
|
225
|
-
'name': 'Novel Valid Type',
|
|
226
|
-
'plan_description': 'Exclusive Provider Organization',
|
|
209
|
+
'name': 'Novel Valid Type (Strict Validation)',
|
|
227
210
|
'insurance_type': 'EP',
|
|
228
211
|
'payer_id': '87726',
|
|
229
|
-
'expected': '
|
|
212
|
+
'expected': '12' # Strict validation rejects novel codes
|
|
230
213
|
},
|
|
231
214
|
{
|
|
232
215
|
'name': 'Invalid Type Format',
|
|
233
|
-
'plan_description': 'Some Plan',
|
|
234
216
|
'insurance_type': 'INVALID123',
|
|
235
217
|
'payer_id': '87726',
|
|
236
218
|
'expected': '12' # Should fallback to PPO
|
|
237
219
|
},
|
|
238
220
|
{
|
|
239
221
|
'name': 'Empty Type',
|
|
240
|
-
'plan_description': 'Some Plan',
|
|
241
222
|
'insurance_type': '',
|
|
242
223
|
'payer_id': '87726',
|
|
243
224
|
'expected': '12' # Should fallback to PPO
|
|
@@ -249,21 +230,20 @@ def test_insurance_type_validation():
|
|
|
249
230
|
|
|
250
231
|
for test_case in test_cases:
|
|
251
232
|
try:
|
|
252
|
-
result =
|
|
253
|
-
test_case['plan_description'],
|
|
233
|
+
result = validate_insurance_type_from_config(
|
|
254
234
|
test_case['insurance_type'],
|
|
255
235
|
test_case['payer_id']
|
|
256
236
|
)
|
|
257
237
|
|
|
258
238
|
if result == test_case['expected']:
|
|
259
|
-
print("
|
|
239
|
+
print("PASS {}: {} -> {}".format(test_case['name'], test_case['insurance_type'], result))
|
|
260
240
|
passed += 1
|
|
261
241
|
else:
|
|
262
|
-
print("
|
|
242
|
+
print("FAIL {}: Expected {}, got {}".format(test_case['name'], test_case['expected'], result))
|
|
263
243
|
failed += 1
|
|
264
244
|
|
|
265
245
|
except Exception as e:
|
|
266
|
-
print("
|
|
246
|
+
print("FAIL {}: Exception - {}".format(test_case['name'], str(e)))
|
|
267
247
|
failed += 1
|
|
268
248
|
|
|
269
249
|
print("\nValidation Tests Summary: {} passed, {} failed".format(passed, failed))
|
|
@@ -301,9 +281,9 @@ def create_test_configuration():
|
|
|
301
281
|
|
|
302
282
|
print("Test configuration created:")
|
|
303
283
|
print(json.dumps(test_config, indent=2))
|
|
304
|
-
print("\
|
|
305
|
-
print("
|
|
306
|
-
print("
|
|
284
|
+
print("\nCopy this configuration to your config.json file")
|
|
285
|
+
print("Ensure TestMode is False for production")
|
|
286
|
+
print("Enable feature flags gradually during rollout")
|
|
307
287
|
|
|
308
288
|
return test_config
|
|
309
289
|
|
|
@@ -332,9 +312,9 @@ def deployment_checklist():
|
|
|
332
312
|
for item in checklist:
|
|
333
313
|
print(item)
|
|
334
314
|
|
|
335
|
-
print("\
|
|
336
|
-
print("
|
|
337
|
-
print("
|
|
315
|
+
print("\nComplete all checklist items before deployment")
|
|
316
|
+
print("Follow gradual rollout plan with feature flags")
|
|
317
|
+
print("Monitor logs and metrics closely during rollout")
|
|
338
318
|
|
|
339
319
|
if __name__ == "__main__":
|
|
340
320
|
print("Insurance Type Selection Enhancement - Integration Test Suite")
|
|
@@ -363,6 +343,6 @@ if __name__ == "__main__":
|
|
|
363
343
|
print("Overall Tests: {} passed, {} failed out of {} total".format(total_passed, total_failed, total_tests))
|
|
364
344
|
|
|
365
345
|
if total_failed == 0:
|
|
366
|
-
print("
|
|
346
|
+
print("PASS ALL SYSTEMS GO! Ready for phased deployment.")
|
|
367
347
|
else:
|
|
368
|
-
print("
|
|
348
|
+
print("FAIL Address {} failed tests before deployment.".format(total_failed))
|
|
@@ -13,11 +13,11 @@ MediBot/PDF_to_CSV_Cleaner.py,sha256=ZZphmq-5K04DkrZNlcwNAIoZPOD_ROWvS3PMkKFxeiM
|
|
|
13
13
|
MediBot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
MediBot/update_json.py,sha256=9FJZb-32EujpKuSoCjyCbdTdthOIuhcMoN4Wchuzn8A,2508
|
|
15
15
|
MediBot/update_medicafe.py,sha256=E09jPw_aBjO30YqqUqDOL1zxN1srCyraFDX6vPexGLo,12725
|
|
16
|
-
MediLink/MediLink.py,sha256=
|
|
16
|
+
MediLink/MediLink.py,sha256=p91MYghOCbNf3ikTzm5P9V1Luj035yd83EDbQ-Ov6oM,33258
|
|
17
17
|
MediLink/MediLink_277_decoder.py,sha256=Z3hQK2j-YzdXjov6aDlDRc7M_auFBnl3se4OF5q6_04,4358
|
|
18
18
|
MediLink/MediLink_837p_cob_library.py,sha256=pWWd03yXTamNJKDbPCdOCkfglW4OLXQtIN3eiMSdfAA,29934
|
|
19
19
|
MediLink/MediLink_837p_encoder.py,sha256=2YcbIi3G3AETLDITWJIcMh2kBM62IgwR0W_lCVVLO0w,28816
|
|
20
|
-
MediLink/MediLink_837p_encoder_library.py,sha256=
|
|
20
|
+
MediLink/MediLink_837p_encoder_library.py,sha256=GR-3ltBz9f1E9rjMGu_rpmqSzsi-ioD-NT3DHLcwRcw,57560
|
|
21
21
|
MediLink/MediLink_837p_utilities.py,sha256=Bi91S1aJbsEOpWXp_IOUgCQ76IPiOJNkOfXXtcirzmI,10416
|
|
22
22
|
MediLink/MediLink_API_Generator.py,sha256=vBZ8moR9tvv7mb200HlZnJrk1y-bQi8E16I2r41vgVM,10345
|
|
23
23
|
MediLink/MediLink_API_v2.py,sha256=mcIgLnXPS_NaUBrkKJ8mxCUaQ0AuQUeU1vG6DoplbVY,7733
|
|
@@ -26,7 +26,7 @@ MediLink/MediLink_APIs.py,sha256=jm3f9T034MJKH8A_CIootULoeuk7H8s7PazpFZRCbKI,622
|
|
|
26
26
|
MediLink/MediLink_Azure.py,sha256=Ow70jctiHFIylskBExN7WUoRgrKOvBR6jNTnQMk6lJA,210
|
|
27
27
|
MediLink/MediLink_ClaimStatus.py,sha256=kXIDidxSGuqTwjFNMQIKms42jqIu5Qmnet-7Ohe8zjE,11645
|
|
28
28
|
MediLink/MediLink_ConfigLoader.py,sha256=u9ecB0SIN7zuJAo8KcoQys95BtyAo-8S2n4mRd0S3XU,4356
|
|
29
|
-
MediLink/MediLink_DataMgmt.py,sha256=
|
|
29
|
+
MediLink/MediLink_DataMgmt.py,sha256=Wly53vnZo-kIxO0o3e45guj0cMIWDqVmLl6-fWQtVqI,34084
|
|
30
30
|
MediLink/MediLink_Decoder.py,sha256=lKWiOcRClz8F5P3jrvFTq_hW9XF4OrPfA4LFz2zLSLg,14013
|
|
31
31
|
MediLink/MediLink_Deductible.py,sha256=els8CQMK3pRzlqzs12HDgqx42WLXuHFU-nfXiA4y0Js,39426
|
|
32
32
|
MediLink/MediLink_Deductible_Validator.py,sha256=2g-lZd-Y5fJ1mfP87vM6oABg0t5Om-7EkEkilVvDWYY,22888
|
|
@@ -39,21 +39,21 @@ MediLink/MediLink_Parser.py,sha256=w2ZD4minjwkaMz7nzP_r8v_Ow_uM5KHjpPSY8mIHcdE,9
|
|
|
39
39
|
MediLink/MediLink_Scan.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
40
|
MediLink/MediLink_Scheduler.py,sha256=UJvxhDvHraqra2_TlQVlGeh5jRFrrfK6nCVUHnKOEMY,38
|
|
41
41
|
MediLink/MediLink_StatusCheck.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
|
-
MediLink/MediLink_UI.py,sha256=
|
|
42
|
+
MediLink/MediLink_UI.py,sha256=cDWKaXCqQgBUMSkPfQqs5ZFHSm7T3SUycXlrVqVOWzY,8327
|
|
43
43
|
MediLink/MediLink_Up.py,sha256=r_VvTGsMzJUy_y-51kMYDBvVdxiq4lYm20PPIU31lCY,24119
|
|
44
44
|
MediLink/MediLink_api_utils.py,sha256=dsGLRPRvSwfXPLrrfgnkIKGDIF00wE93TrDB6HMDPQU,11857
|
|
45
45
|
MediLink/MediLink_batch.bat,sha256=nqL5QwCLyRQFSPdv6kgtcV_cpky7FXSOWVl6OxjRXb4,118
|
|
46
|
-
MediLink/MediLink_insurance_utils.py,sha256=
|
|
46
|
+
MediLink/MediLink_insurance_utils.py,sha256=igZ9m5PUE8hNLvfC1R2JlJzXJg0V_-aUHDH3FZ4kOnY,9463
|
|
47
47
|
MediLink/Soumit_api.py,sha256=5JfOecK98ZC6NpZklZW2AkOzkjvrbYxpJpZNH3rFxDw,497
|
|
48
|
-
MediLink/__init__.py,sha256=
|
|
49
|
-
MediLink/insurance_type_integration_test.py,sha256=
|
|
48
|
+
MediLink/__init__.py,sha256=RzjaFqYmxaCsZxj7-6XosL6P5tj2VIcQZ7ZxZ-n1HEk,50
|
|
49
|
+
MediLink/insurance_type_integration_test.py,sha256=CiaMejWOjKwQ-FdhYIenCNwtjKSENkTJGUU5XjdrfGs,14273
|
|
50
50
|
MediLink/openssl.cnf,sha256=76VdcGCykf0Typyiv8Wd1mMVKixrQ5RraG6HnfKFqTo,887
|
|
51
51
|
MediLink/test.py,sha256=kSvvJRL_3fWuNS3_x4hToOnUljGLoeEw6SUTHQWQRJk,3108
|
|
52
52
|
MediLink/test_cob_library.py,sha256=wUMv0-Y6fNsKcAs8Z9LwfmEBRO7oBzBAfWmmzwoNd1g,13841
|
|
53
53
|
MediLink/test_validation.py,sha256=FJrfdUFK--xRScIzrHCg1JeGdm0uJEoRnq6CgkP2lwM,4154
|
|
54
54
|
MediLink/webapp.html,sha256=JPKT559aFVBi1r42Hz7C77Jj0teZZRumPhBev8eSOLk,19806
|
|
55
|
-
medicafe-0.250728.
|
|
56
|
-
medicafe-0.250728.
|
|
57
|
-
medicafe-0.250728.
|
|
58
|
-
medicafe-0.250728.
|
|
59
|
-
medicafe-0.250728.
|
|
55
|
+
medicafe-0.250728.9.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
|
|
56
|
+
medicafe-0.250728.9.dist-info/METADATA,sha256=o_lCO6JP1efgXD2f3R6avtqIl4LkDwRPYjL1Gtu1_p8,5501
|
|
57
|
+
medicafe-0.250728.9.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
58
|
+
medicafe-0.250728.9.dist-info/top_level.txt,sha256=3uOwR4q_SP8Gufk2uCHoKngAgbtdOwQC6Qjl7ViBa_c,17
|
|
59
|
+
medicafe-0.250728.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|