medicafe 0.240716.2__py3-none-any.whl → 0.240809.0__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.
- MediBot/MediBot.py +13 -2
- MediBot/MediBot_Preprocessor_lib.py +14 -2
- MediLink/MediLink.py +4 -4
- MediLink/MediLink_837p_encoder.py +64 -47
- MediLink/MediLink_837p_encoder_library.py +20 -8
- MediLink/MediLink_API_v3.py +109 -5
- MediLink/MediLink_ConfigLoader.py +1 -1
- MediLink/MediLink_DataMgmt.py +4 -4
- MediLink/MediLink_Deductible.py +57 -50
- MediLink/MediLink_Down.py +29 -30
- MediLink/MediLink_UI.py +9 -1
- MediLink/MediLink_Up.py +179 -110
- {medicafe-0.240716.2.dist-info → medicafe-0.240809.0.dist-info}/METADATA +1 -1
- {medicafe-0.240716.2.dist-info → medicafe-0.240809.0.dist-info}/RECORD +17 -17
- {medicafe-0.240716.2.dist-info → medicafe-0.240809.0.dist-info}/WHEEL +1 -1
- {medicafe-0.240716.2.dist-info → medicafe-0.240809.0.dist-info}/LICENSE +0 -0
- {medicafe-0.240716.2.dist-info → medicafe-0.240809.0.dist-info}/top_level.txt +0 -0
MediLink/MediLink_Up.py
CHANGED
|
@@ -4,8 +4,9 @@ import re
|
|
|
4
4
|
import subprocess
|
|
5
5
|
from tqdm import tqdm
|
|
6
6
|
import MediLink_837p_encoder
|
|
7
|
-
from MediLink_ConfigLoader import log
|
|
7
|
+
from MediLink_ConfigLoader import log, load_configuration
|
|
8
8
|
from MediLink_DataMgmt import operate_winscp
|
|
9
|
+
import MediLink_API_v3
|
|
9
10
|
|
|
10
11
|
# Internet Connectivity Check
|
|
11
12
|
def check_internet_connection():
|
|
@@ -13,6 +14,12 @@ def check_internet_connection():
|
|
|
13
14
|
Checks if there is an active internet connection.
|
|
14
15
|
Returns: Boolean indicating internet connectivity status.
|
|
15
16
|
"""
|
|
17
|
+
# Check if TestMode is enabled
|
|
18
|
+
config, _ = load_configuration()
|
|
19
|
+
if config.get("MediLink_Config", {}).get("TestMode", True):
|
|
20
|
+
# If TestMode is True, skip the connectivity check and return True as if the internet connection were fine
|
|
21
|
+
return True
|
|
22
|
+
|
|
16
23
|
try:
|
|
17
24
|
# Run a ping command to a reliable external server (e.g., Google's DNS server)
|
|
18
25
|
ping_process = subprocess.Popen(["ping", "-n", "1", "8.8.8.8"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
@@ -28,6 +35,16 @@ def check_internet_connection():
|
|
|
28
35
|
return False
|
|
29
36
|
|
|
30
37
|
def submit_claims(detailed_patient_data_grouped_by_endpoint, config):
|
|
38
|
+
"""
|
|
39
|
+
Submits claims for each endpoint, either via WinSCP or API, based on configuration settings.
|
|
40
|
+
|
|
41
|
+
Parameters:
|
|
42
|
+
- detailed_patient_data_grouped_by_endpoint: Dictionary with endpoints as keys and lists of patient data as values.
|
|
43
|
+
- config: Configuration settings loaded from a JSON file.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
- None
|
|
47
|
+
"""
|
|
31
48
|
# Accumulate submission results
|
|
32
49
|
submission_results = {}
|
|
33
50
|
|
|
@@ -35,41 +52,53 @@ def submit_claims(detailed_patient_data_grouped_by_endpoint, config):
|
|
|
35
52
|
print("No new files detected for submission.")
|
|
36
53
|
return
|
|
37
54
|
|
|
38
|
-
#
|
|
55
|
+
# Iterate through each endpoint and submit claims
|
|
39
56
|
for endpoint, patients_data in tqdm(detailed_patient_data_grouped_by_endpoint.items(), desc="Progress", unit="endpoint"):
|
|
40
|
-
if not patients_data:
|
|
57
|
+
if not patients_data:
|
|
41
58
|
continue
|
|
42
59
|
|
|
60
|
+
# Determine the submission method (e.g., "winscp" or "api")
|
|
61
|
+
method = config.get('MediLink_Config', {}).get('endpoints', {}).get(endpoint, {}).get('submission_method', 'winscp')
|
|
62
|
+
|
|
43
63
|
# Attempt submission to each endpoint
|
|
44
64
|
if True: #confirm_transmission({endpoint: patients_data}): # Confirm transmission to each endpoint with detailed overview
|
|
45
65
|
if check_internet_connection():
|
|
46
66
|
# Process files per endpoint
|
|
47
67
|
converted_files = MediLink_837p_encoder.convert_files_for_submission(patients_data, config)
|
|
48
|
-
if converted_files:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
if converted_files:
|
|
69
|
+
if method == 'winscp':
|
|
70
|
+
# Transmit files via WinSCP
|
|
71
|
+
try:
|
|
72
|
+
operation_type = "upload"
|
|
73
|
+
transmission_result = operate_winscp(operation_type, converted_files, config['MediLink_Config']['endpoints'][endpoint], config['MediLink_Config']['local_claims_path'], config)
|
|
74
|
+
success_dict = handle_transmission_result(transmission_result, config, operation_type, method)
|
|
75
|
+
submission_results[endpoint] = success_dict
|
|
76
|
+
except FileNotFoundError as e:
|
|
77
|
+
print("Failed to transmit files to {}. Error: Log file not found - {}".format(endpoint, str(e)))
|
|
78
|
+
submission_results[endpoint] = {"status": False, "error": "Log file not found - " + str(e)}
|
|
79
|
+
except IOError as e:
|
|
80
|
+
print("Failed to transmit files to {}. Error: Input/output error - {}".format(endpoint, str(e)))
|
|
81
|
+
submission_results[endpoint] = {"status": False, "error": "Input/output error - " + str(e)}
|
|
82
|
+
except Exception as e:
|
|
83
|
+
print("Failed to transmit files to {}. Error: {}".format(endpoint, str(e)))
|
|
84
|
+
submission_results[endpoint] = {"status": False, "error": str(e)}
|
|
85
|
+
elif method == 'api':
|
|
86
|
+
# Transmit files via API
|
|
87
|
+
try:
|
|
88
|
+
api_responses = []
|
|
89
|
+
client = MediLink_API_v3.APIClient()
|
|
90
|
+
for file_path in converted_files:
|
|
91
|
+
with open(file_path, 'r') as file:
|
|
92
|
+
x12_request_data = file.read().replace('\n', '').replace('\r', '').strip()
|
|
93
|
+
response = MediLink_API_v3.submit_uhc_claim(client, x12_request_data)
|
|
94
|
+
api_responses.append((file_path, response))
|
|
95
|
+
success_dict = handle_transmission_result(api_responses, config, "api", method)
|
|
96
|
+
submission_results[endpoint] = success_dict
|
|
97
|
+
except Exception as e:
|
|
98
|
+
print("Failed to transmit files via API to {}. Error: {}".format(endpoint, str(e)))
|
|
99
|
+
submission_results[endpoint] = {"status": False, "error": str(e)}
|
|
70
100
|
else:
|
|
71
|
-
|
|
72
|
-
print("No files were converted for transmission to {0}.".format(endpoint))
|
|
101
|
+
print("No files were converted for transmission to {}.".format(endpoint))
|
|
73
102
|
else:
|
|
74
103
|
print("Error: No internet connection detected.")
|
|
75
104
|
log("Error: No internet connection detected.", level="ERROR")
|
|
@@ -78,89 +107,102 @@ def submit_claims(detailed_patient_data_grouped_by_endpoint, config):
|
|
|
78
107
|
print("Exiting transmission process. Please try again later.")
|
|
79
108
|
return # Exiting the function if the user decides not to retry
|
|
80
109
|
else:
|
|
81
|
-
|
|
110
|
+
# This else statement is inaccessible because it is preceded by an if True condition,
|
|
111
|
+
# which is always true and effectively makes the else clause unreachable.
|
|
112
|
+
# To handle this, we need to decide under what conditions the submission should be canceled.
|
|
113
|
+
# One option is to replace the if True with a condition that checks for some pre-submission criteria.
|
|
114
|
+
# For instance, if there is a confirmation step or additional checks that need to be performed before
|
|
115
|
+
# proceeding with the submission, these could be included here.
|
|
116
|
+
print("Transmission canceled for endpoint {}.".format(endpoint))
|
|
82
117
|
|
|
83
118
|
# Continue to next endpoint regardless of the previous outcomes
|
|
84
119
|
|
|
85
120
|
# Build and display receipt
|
|
86
121
|
build_and_display_receipt(submission_results, config)
|
|
87
122
|
|
|
88
|
-
print("Claim submission process completed.\n")
|
|
123
|
+
print("Claim submission process completed.\n")
|
|
89
124
|
|
|
90
|
-
def handle_transmission_result(transmission_result, config, operation_type):
|
|
91
|
-
"""
|
|
92
|
-
Analyze the outcomes of file transmissions based on WinSCP log entries.
|
|
93
|
-
|
|
94
|
-
:param transmission_result: List of paths for files that were attempted to be transmitted.
|
|
95
|
-
:param config: Configuration dictionary containing paths and settings.
|
|
96
|
-
:return: Dictionary mapping each file path to a boolean indicating successful transmission.
|
|
125
|
+
def handle_transmission_result(transmission_result, config, operation_type, method):
|
|
97
126
|
"""
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
# BUG local_claims_path is where the uploads are only. this needs to have a switch. Check where WinSCP actually logs though.
|
|
101
|
-
log_path = os.path.join(config['MediLink_Config']['local_claims_path'], log_filename)
|
|
102
|
-
success_dict = {}
|
|
127
|
+
Analyze the outcomes of file transmissions based on WinSCP log entries or API responses.
|
|
103
128
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
129
|
+
Parameters:
|
|
130
|
+
- transmission_result: List of paths for files that were attempted to be transmitted or API response details.
|
|
131
|
+
- config: Configuration dictionary containing paths and settings.
|
|
132
|
+
- operation_type: The type of operation being performed (e.g., "upload").
|
|
133
|
+
- method: The transmission method used ("winscp" or "api").
|
|
107
134
|
|
|
108
|
-
|
|
135
|
+
Returns:
|
|
136
|
+
- Dictionary mapping each file path or API response to a tuple indicating successful transmission and any relevant messages.
|
|
137
|
+
"""
|
|
138
|
+
success_dict = {}
|
|
109
139
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
140
|
+
if method == "winscp":
|
|
141
|
+
# Define the log filename based on the operation type
|
|
142
|
+
log_filename = "winscp_{}.log".format(operation_type)
|
|
143
|
+
# BUG local_claims_path is where the uploads are only. this needs to have a switch. Check where WinSCP actually logs though.
|
|
144
|
+
log_path = os.path.join(config['MediLink_Config']['local_claims_path'], log_filename)
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
# Read the contents of the WinSCP log file
|
|
148
|
+
with open(log_path, 'r') as log_file:
|
|
149
|
+
log_contents = log_file.readlines()
|
|
150
|
+
|
|
151
|
+
if not log_contents:
|
|
152
|
+
# Handle the case where the log file is empty
|
|
153
|
+
log("Log file '{}' is empty.".format(log_path))
|
|
154
|
+
success_dict = {file_path: (False, "Log file empty") for file_path in transmission_result}
|
|
155
|
+
else:
|
|
156
|
+
# Process the last few lines of the log file for transfer status
|
|
157
|
+
last_lines = log_contents[-15:]
|
|
158
|
+
for file_path in transmission_result:
|
|
123
159
|
success_message = "Transfer done: '{}'".format(file_path)
|
|
124
|
-
log("Looking for: {} in WinSCP log.".format(success_message))
|
|
125
160
|
success = any(success_message in line for line in last_lines)
|
|
126
|
-
|
|
127
|
-
success_dict[file_path] = success
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
161
|
+
message = "Success" if success else "Transfer incomplete or error occurred"
|
|
162
|
+
success_dict[file_path] = (success, message)
|
|
163
|
+
|
|
164
|
+
except FileNotFoundError:
|
|
165
|
+
# Log file not found, handle the error
|
|
166
|
+
log("Log file '{}' not found.".format(log_path))
|
|
167
|
+
success_dict = {file_path: (False, "Log file not found") for file_path in transmission_result}
|
|
168
|
+
except IOError as e:
|
|
169
|
+
# Handle IO errors, such as issues reading the log file
|
|
170
|
+
log("IO error when handling the log file '{}': {}".format(log_path, e))
|
|
171
|
+
success_dict = {file_path: (False, "IO error: {}".format(e)) for file_path in transmission_result}
|
|
172
|
+
except Exception as e:
|
|
173
|
+
# Catch all other exceptions and log them
|
|
174
|
+
log("Error processing the transmission log: {}".format(e))
|
|
175
|
+
success_dict = {file_path: (False, "Error: {}".format(e)) for file_path in transmission_result}
|
|
176
|
+
|
|
177
|
+
elif method == "api":
|
|
178
|
+
# Process each API response to determine the success status
|
|
179
|
+
for file_path, response in transmission_result:
|
|
180
|
+
try:
|
|
181
|
+
# Check if the API response indicates a successful submission
|
|
182
|
+
success = response.get('message') in ["Claim validated and sent for further processing", "Acknowledgement pending"]
|
|
183
|
+
# Record the API message.
|
|
184
|
+
message = response.get('message', 'No message provided')
|
|
185
|
+
success_dict[file_path] = (success, message)
|
|
186
|
+
except Exception as e:
|
|
187
|
+
# Handle API exception
|
|
188
|
+
log("Error processing API response: {}".format(e))
|
|
189
|
+
success_dict[file_path] = (False, str(e))
|
|
143
190
|
|
|
144
191
|
return success_dict
|
|
145
192
|
|
|
146
193
|
def build_and_display_receipt(submission_results, config):
|
|
147
194
|
"""
|
|
148
|
-
|
|
149
|
-
|
|
195
|
+
Builds and displays a receipt for submitted claims, including both successful and failed submissions.
|
|
150
196
|
A receipt of submitted claims is typically attached to each printed facesheet for recordkeeping confirming submission.
|
|
151
|
-
|
|
152
|
-
input: accumulated success_dict
|
|
153
|
-
(historical record won't work because the winscp logs will be incomplete, use clearinghouse to check historical records.)
|
|
154
|
-
|
|
155
|
-
2.) Parse each of the 837p files from filepaths in success_dict:
|
|
156
197
|
|
|
157
|
-
|
|
198
|
+
Parameters:
|
|
199
|
+
- submission_results: Dictionary containing submission results with detailed information for each endpoint.
|
|
200
|
+
- config: Configuration settings loaded from a JSON file.
|
|
158
201
|
|
|
159
|
-
|
|
202
|
+
Returns:
|
|
203
|
+
- None
|
|
160
204
|
"""
|
|
161
205
|
# Prepare data for receipt
|
|
162
|
-
# Organize submission results into a format suitable for the receipt
|
|
163
|
-
log("Preparing receipt data...")
|
|
164
206
|
receipt_data = prepare_receipt_data(submission_results)
|
|
165
207
|
|
|
166
208
|
# Build the receipt
|
|
@@ -172,43 +214,59 @@ def build_and_display_receipt(submission_results, config):
|
|
|
172
214
|
|
|
173
215
|
# Save the receipt to a text file
|
|
174
216
|
save_receipt_to_file(receipt_content, config)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return receipt_data
|
|
217
|
+
|
|
218
|
+
log("Receipt has been generated and saved.")
|
|
178
219
|
|
|
179
220
|
def prepare_receipt_data(submission_results):
|
|
180
221
|
"""
|
|
181
222
|
Prepare submission results for a receipt, including data from both successful and failed submissions.
|
|
182
|
-
|
|
223
|
+
|
|
183
224
|
This function extracts patient names, dates of service, amounts billed, and insurance names from an 837p file.
|
|
184
225
|
It also includes the date and time of batch claim submission, and the receiver name from the 1000B segment.
|
|
185
226
|
Data is organized by receiver name and includes both successful and failed submissions.
|
|
186
|
-
|
|
227
|
+
|
|
187
228
|
Parameters:
|
|
188
|
-
- submission_results (dict): Contains submission results grouped by endpoint, with
|
|
189
|
-
|
|
229
|
+
- submission_results (dict): Contains submission results grouped by endpoint, with detailed status information.
|
|
230
|
+
|
|
190
231
|
Returns:
|
|
191
232
|
- dict: Organized data for receipt preparation, including both successful and failed submission details.
|
|
192
233
|
"""
|
|
193
234
|
receipt_data = {}
|
|
194
235
|
for endpoint, files in submission_results.items():
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
236
|
+
log("Processing endpoint: {}".format(endpoint), level="INFO")
|
|
237
|
+
for file_path, file_result in files.items():
|
|
238
|
+
log("File path: {}".format(file_path), level="DEBUG")
|
|
239
|
+
log("File result: {}".format(file_result), level="DEBUG")
|
|
240
|
+
|
|
241
|
+
try:
|
|
242
|
+
# Unpack the tuple to get status and message
|
|
243
|
+
status, message = file_result
|
|
244
|
+
except ValueError as e:
|
|
245
|
+
log("ValueError: {} for file_result: {}".format(e, file_result), level="ERROR")
|
|
246
|
+
continue
|
|
247
|
+
except Exception as e:
|
|
248
|
+
log("Unexpected error: {}".format(e), level="ERROR")
|
|
249
|
+
continue
|
|
250
|
+
|
|
251
|
+
log("Status: {}, Message: {}".format(status, message), level="DEBUG")
|
|
252
|
+
|
|
199
253
|
if endpoint not in receipt_data:
|
|
200
254
|
receipt_data[endpoint] = {
|
|
201
|
-
"
|
|
202
|
-
"
|
|
255
|
+
"patients": [],
|
|
256
|
+
"date_of_submission": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
203
257
|
}
|
|
204
258
|
|
|
205
|
-
#
|
|
259
|
+
# Parse patient details and add the result status and message
|
|
260
|
+
patient_data, _ = parse_837p_file(file_path)
|
|
206
261
|
for patient in patient_data:
|
|
207
|
-
patient['status'] =
|
|
208
|
-
|
|
262
|
+
patient['status'] = status
|
|
263
|
+
patient['message'] = message
|
|
264
|
+
|
|
209
265
|
receipt_data[endpoint]["patients"].extend(patient_data)
|
|
210
266
|
|
|
211
267
|
validate_data(receipt_data)
|
|
268
|
+
log("Receipt data: {}".format(receipt_data), level="DEBUG")
|
|
269
|
+
|
|
212
270
|
return receipt_data
|
|
213
271
|
|
|
214
272
|
def validate_data(receipt_data):
|
|
@@ -216,7 +274,7 @@ def validate_data(receipt_data):
|
|
|
216
274
|
for endpoint, data in receipt_data.items():
|
|
217
275
|
patients = data.get("patients", [])
|
|
218
276
|
for index, patient in enumerate(patients, start=1):
|
|
219
|
-
missing_fields = [field for field in ('name', 'service_date', 'amount_billed', 'insurance_name', 'status') if
|
|
277
|
+
missing_fields = [field for field in ('name', 'service_date', 'amount_billed', 'insurance_name', 'status') if patient.get(field) in (None, '')]
|
|
220
278
|
|
|
221
279
|
if missing_fields:
|
|
222
280
|
# Log the missing fields without revealing PHI
|
|
@@ -315,13 +373,14 @@ def build_receipt_content(receipt_data):
|
|
|
315
373
|
|
|
316
374
|
# Adding patient information in a tabular format
|
|
317
375
|
for patient in data["patients"]:
|
|
318
|
-
|
|
376
|
+
# Use the message as the status if the submission failed
|
|
377
|
+
status_display = "SUCCESS" if patient['status'] else patient['message']
|
|
319
378
|
patient_info = "{:<20} | {:<15} | ${:<14} | {:<20} | {:<10}".format(
|
|
320
379
|
patient['name'],
|
|
321
380
|
patient['service_date'],
|
|
322
381
|
patient['amount_billed'],
|
|
323
382
|
patient['insurance_name'],
|
|
324
|
-
|
|
383
|
+
status_display
|
|
325
384
|
)
|
|
326
385
|
receipt_lines.append(patient_info)
|
|
327
386
|
|
|
@@ -331,17 +390,27 @@ def build_receipt_content(receipt_data):
|
|
|
331
390
|
return receipt_content
|
|
332
391
|
|
|
333
392
|
def save_receipt_to_file(receipt_content, config):
|
|
393
|
+
"""
|
|
394
|
+
Saves the receipt content to a text file and opens it for the user.
|
|
395
|
+
|
|
396
|
+
Parameters:
|
|
397
|
+
- receipt_content (str): The formatted content of the receipt.
|
|
398
|
+
- config: Configuration settings loaded from a JSON file.
|
|
399
|
+
|
|
400
|
+
Returns:
|
|
401
|
+
- None
|
|
402
|
+
"""
|
|
334
403
|
try:
|
|
335
|
-
# Save the receipt content to a text file named Receipt_[date_of_submission].txt
|
|
336
|
-
# Use the configured local storage path to determine the file location
|
|
337
404
|
file_name = "Receipt_{0}.txt".format(datetime.now().strftime('%Y%m%d_%H%M%S'))
|
|
338
405
|
file_path = os.path.join(config['MediLink_Config']['local_claims_path'], file_name)
|
|
339
406
|
|
|
340
407
|
with open(file_path, 'w') as file:
|
|
341
408
|
file.write(receipt_content)
|
|
342
409
|
|
|
343
|
-
|
|
344
|
-
|
|
410
|
+
log("Receipt saved to:", file_path)
|
|
411
|
+
# Open the file automatically for the user (Windows-specific)
|
|
412
|
+
if os.name == 'nt':
|
|
413
|
+
os.startfile(file_path)
|
|
345
414
|
except Exception as e:
|
|
346
415
|
print("Failed to save or open receipt file:", e)
|
|
347
416
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
MediBot/MediBot.bat,sha256=B_iUMQro6kPrTbGOePsTvOq3N9nXn5fE7xnkt4jfSrE,7032
|
|
2
|
-
MediBot/MediBot.py,sha256=
|
|
2
|
+
MediBot/MediBot.py,sha256=JZ8AxdZRuilOXYUlkv8MFSb538INd9T0TQUplRkHI_I,17454
|
|
3
3
|
MediBot/MediBot_Charges.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
MediBot/MediBot_Crosswalk_Library.py,sha256=RxwihSpPtTlnDbPiQ1VWnPVVdjYA-L69OPWREXMTGiQ,14862
|
|
5
5
|
MediBot/MediBot_Post.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
MediBot/MediBot_Preprocessor.py,sha256=OI9rfDF01OLuLFZoSzIceO3r5fkKEFN7tynXPIceoo4,11941
|
|
7
|
-
MediBot/MediBot_Preprocessor_lib.py,sha256=
|
|
7
|
+
MediBot/MediBot_Preprocessor_lib.py,sha256=7fxKFgDMVetX1QB5IQJoW9f5hz4Kpim0hfBx-yEP6M8,25083
|
|
8
8
|
MediBot/MediBot_UI.py,sha256=_CS9BV3882mNp-UmMUPKZOsDI3ZGxft5mcr36-Nq1FQ,10318
|
|
9
9
|
MediBot/MediBot_dataformat_library.py,sha256=AVRAl4oDHR6nq2bBiJf2YABrdtnfiQYdYzV0BMvL7U0,8346
|
|
10
10
|
MediBot/MediBot_docx_decoder.py,sha256=nO5N8qPsZoiFzicSJ5mbBfjaqGinxgh_VzjLhEsj95U,13712
|
|
@@ -13,20 +13,20 @@ 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=eAu3BPYtlGlwVGZdTUmrqq4qLTVcplt-6EnzcGCheG0,1557
|
|
15
15
|
MediBot/update_medicafe.py,sha256=CYxRHNXb-ZwGELWSXJA90foMwac_GBdXhD9hwClUjpA,2249
|
|
16
|
-
MediLink/MediLink.py,sha256=
|
|
16
|
+
MediLink/MediLink.py,sha256=JsTGXQVCbwaYir_2BoeZzFq43g8UoqAp_kB4s94BL38,18117
|
|
17
17
|
MediLink/MediLink_277_decoder.py,sha256=Z3hQK2j-YzdXjov6aDlDRc7M_auFBnl3se4OF5q6_04,4358
|
|
18
|
-
MediLink/MediLink_837p_encoder.py,sha256=
|
|
19
|
-
MediLink/MediLink_837p_encoder_library.py,sha256=
|
|
18
|
+
MediLink/MediLink_837p_encoder.py,sha256=X94So0mQpl_x1p_lz1_1HMMhyLvlnIDOMr_r5ZxhfLQ,24069
|
|
19
|
+
MediLink/MediLink_837p_encoder_library.py,sha256=7Sn0g46AwyVShGPX_qzrd3rojaHRySuor4Ej3_dYrO0,42414
|
|
20
20
|
MediLink/MediLink_API_Generator.py,sha256=AvKJOoQKl2_dJG517chsVAjBKqEEIEz_c12OL03J428,10387
|
|
21
21
|
MediLink/MediLink_API_v2.py,sha256=mcIgLnXPS_NaUBrkKJ8mxCUaQ0AuQUeU1vG6DoplbVY,7733
|
|
22
|
-
MediLink/MediLink_API_v3.py,sha256=
|
|
22
|
+
MediLink/MediLink_API_v3.py,sha256=ZggkLisZ8tLDuHBIPxg7yr1CHQvGMWiWyiEsfvmWSYU,23081
|
|
23
23
|
MediLink/MediLink_APIs.py,sha256=_EFNjBFwtZsEJM771xa6g-zQCCRrebIHj73ElVVZ8Fs,6229
|
|
24
24
|
MediLink/MediLink_ClaimStatus.py,sha256=s6Ll46yU2-jJueF-3jqVyJ53s1Qll1MONkX2vm1alLY,8655
|
|
25
|
-
MediLink/MediLink_ConfigLoader.py,sha256=
|
|
26
|
-
MediLink/MediLink_DataMgmt.py,sha256=
|
|
25
|
+
MediLink/MediLink_ConfigLoader.py,sha256=4cEaA9ulNHPuXLV76EUIDr0YHPuFjIlg3MvTH0-s1x4,4211
|
|
26
|
+
MediLink/MediLink_DataMgmt.py,sha256=nJ74pXR_PeHS2ODuqw6EP4HzB1tqWZVHprcAkEVEMo0,20461
|
|
27
27
|
MediLink/MediLink_Decoder.py,sha256=L4b3OnVERhgP68T4Lvty9MJNXutPAjXRPBjYpzSj2ZM,7139
|
|
28
|
-
MediLink/MediLink_Deductible.py,sha256=
|
|
29
|
-
MediLink/MediLink_Down.py,sha256=
|
|
28
|
+
MediLink/MediLink_Deductible.py,sha256=BUa_vx084KRyJfS0x3lOZGNw-8ppeeePEEnX1oAbpiU,8967
|
|
29
|
+
MediLink/MediLink_Down.py,sha256=ykDGxV7j9gVyUibfCfvCvyoKXgP7AgiVXSKY4QH05ac,7097
|
|
30
30
|
MediLink/MediLink_ERA_decoder.py,sha256=MiOtDcXnmevPfHAahIlTLlUc14VcQWAor9Xa7clA2Ts,8710
|
|
31
31
|
MediLink/MediLink_Gmail.py,sha256=FV13-umZIouhetnwkGOBgFQYl5FTyOs__SpjaycUxKk,21195
|
|
32
32
|
MediLink/MediLink_Mailer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -34,14 +34,14 @@ MediLink/MediLink_Parser.py,sha256=p2RlCut84hESXjR7tyCZ9O-gUbsUQeYqRp1bXhKbxu4,6
|
|
|
34
34
|
MediLink/MediLink_Scan.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
35
|
MediLink/MediLink_Scheduler.py,sha256=UJvxhDvHraqra2_TlQVlGeh5jRFrrfK6nCVUHnKOEMY,38
|
|
36
36
|
MediLink/MediLink_StatusCheck.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
-
MediLink/MediLink_UI.py,sha256=
|
|
38
|
-
MediLink/MediLink_Up.py,sha256=
|
|
37
|
+
MediLink/MediLink_UI.py,sha256=lPRmbZ54swIVpyHgwb612v3rUZo_DkCthokqdHPf5Vo,6367
|
|
38
|
+
MediLink/MediLink_Up.py,sha256=iMWrCqbRrreVDoR-_zNeaHYArX3WS9L5WWiz6WQHWKM,22185
|
|
39
39
|
MediLink/MediLink_batch.bat,sha256=nqL5QwCLyRQFSPdv6kgtcV_cpky7FXSOWVl6OxjRXb4,118
|
|
40
40
|
MediLink/Soumit_api.py,sha256=5JfOecK98ZC6NpZklZW2AkOzkjvrbYxpJpZNH3rFxDw,497
|
|
41
41
|
MediLink/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
42
|
MediLink/test.py,sha256=kSvvJRL_3fWuNS3_x4hToOnUljGLoeEw6SUTHQWQRJk,3108
|
|
43
|
-
medicafe-0.
|
|
44
|
-
medicafe-0.
|
|
45
|
-
medicafe-0.
|
|
46
|
-
medicafe-0.
|
|
47
|
-
medicafe-0.
|
|
43
|
+
medicafe-0.240809.0.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
|
|
44
|
+
medicafe-0.240809.0.dist-info/METADATA,sha256=fwdrZBF0Ut7DkLoegPj4xCDEyGFBxkVhik-MxaA4KAo,4625
|
|
45
|
+
medicafe-0.240809.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
46
|
+
medicafe-0.240809.0.dist-info/top_level.txt,sha256=3uOwR4q_SP8Gufk2uCHoKngAgbtdOwQC6Qjl7ViBa_c,17
|
|
47
|
+
medicafe-0.240809.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|