medicafe 0.240613.0__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.

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,131 +52,157 @@ 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
- # Wrap the iteration with tqdm for a progress bar
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: # Skip if no patient data for the endpoint
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: # Check if files were successfully converted
49
- # Transmit files per endpoint
50
- try:
51
- operation_type = "upload"
52
- transmission_result = operate_winscp(operation_type, converted_files, config['MediLink_Config']['endpoints'][endpoint], config['MediLink_Config']['local_claims_path'], config)
53
- success_dict = handle_transmission_result(transmission_result, config, operation_type)
54
- submission_results[endpoint] = success_dict
55
- # TODO Future work: Availity SentFiles: Retrieve and interpret the response file from Availity SentFiles to acknowledge successful transfers.
56
- except FileNotFoundError as e:
57
- # Log that the log file is not found
58
- print("Failed to transmit files to {0}. Error: Log file not found - {1}".format(endpoint, str(e)))
59
- submission_results[endpoint] = {"status": False, "error": "Log file not found - " + str(e)}
60
-
61
- except IOError as e:
62
- # Log IO errors
63
- print("Failed to transmit files to {0}. Error: Input/output error - {1}".format(endpoint, str(e)))
64
- submission_results[endpoint] = {"status": False, "error": "Input/output error - " + str(e)}
65
-
66
- except Exception as e:
67
- # Log other exceptions
68
- print("Failed to transmit files to {0}. Error: {1}".format(endpoint, str(e)))
69
- submission_results[endpoint] = {"status": False, "error": str(e)}
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
- print("No internet connection detected.")
103
+ print("Error: No internet connection detected.")
104
+ log("Error: No internet connection detected.", level="ERROR")
75
105
  try_again = input("Do you want to try again? (Y/N): ").strip().lower()
76
106
  if try_again != 'y':
77
107
  print("Exiting transmission process. Please try again later.")
78
108
  return # Exiting the function if the user decides not to retry
79
109
  else:
80
- print("Transmission canceled for endpoint {0}.".format(endpoint))
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))
81
117
 
82
118
  # Continue to next endpoint regardless of the previous outcomes
83
119
 
84
120
  # Build and display receipt
85
121
  build_and_display_receipt(submission_results, config)
86
122
 
87
- print("Claim submission process completed.\n")
123
+ print("Claim submission process completed.\n")
88
124
 
89
- def handle_transmission_result(transmission_result, config, operation_type):
90
- """
91
- Analyze the outcomes of file transmissions based on WinSCP log entries.
92
-
93
- :param transmission_result: List of paths for files that were attempted to be transmitted.
94
- :param config: Configuration dictionary containing paths and settings.
95
- :return: Dictionary mapping each file path to a boolean indicating successful transmission.
125
+ def handle_transmission_result(transmission_result, config, operation_type, method):
96
126
  """
97
- log_filename = "winscp_{}.log".format(operation_type)
98
-
99
- # BUG local_claims_path is where the uploads are only. this needs to have a switch. Check where WinSCP actually logs though.
100
- log_path = os.path.join(config['MediLink_Config']['local_claims_path'], log_filename)
101
- success_dict = {}
127
+ Analyze the outcomes of file transmissions based on WinSCP log entries or API responses.
102
128
 
103
- try:
104
- with open(log_path, 'r') as log_file:
105
- log_contents = log_file.readlines()
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").
106
134
 
107
- log("WinSCP Log file opened and contents read successfully.")
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 = {}
108
139
 
109
- if log_contents is None:
110
- log("Unexpected NoneType for log_contents")
111
- elif not log_contents:
112
- log("Log file '{}' is empty.".format(log_path))
113
- success_dict = {file_path: False for file_path in transmission_result}
114
- else:
115
- last_lines = log_contents[-15:]
116
- log("Processing the last {} lines of the log file.".format(len(last_lines)))
117
- for file_path in transmission_result:
118
- if file_path is None:
119
- log("Error: NoneType file path found in transmission results.")
120
- continue
121
- try:
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:
122
159
  success_message = "Transfer done: '{}'".format(file_path)
123
- log("Looking for: {} in WinSCP log.".format(success_message))
124
160
  success = any(success_message in line for line in last_lines)
125
- log("Validation: {0} - Transfer done for file: {1}".format(success, file_path))
126
- success_dict[file_path] = success
127
- except TypeError as e:
128
- log("TypeError during processing file path '{}': {}".format(file_path, e))
129
- log("Completed WinSCP log verification check.")
130
-
131
- except FileNotFoundError:
132
- log("Log file '{}' not found.".format(log_path))
133
- success_dict = {file_path: False for file_path in transmission_result}
134
-
135
- except IOError as e:
136
- log("IO error when handling the log file '{}': {}".format(log_path, e))
137
- success_dict = {file_path: False for file_path in transmission_result}
138
-
139
- except Exception as e:
140
- log("Error processing the transmission log: {}".format(e))
141
- success_dict = {file_path: False for file_path in transmission_result}
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))
142
190
 
143
191
  return success_dict
144
192
 
145
193
  def build_and_display_receipt(submission_results, config):
146
194
  """
147
- Define Submission Receipt:
148
-
195
+ Builds and displays a receipt for submitted claims, including both successful and failed submissions.
149
196
  A receipt of submitted claims is typically attached to each printed facesheet for recordkeeping confirming submission.
150
-
151
- input: accumulated success_dict
152
- (historical record won't work because the winscp logs will be incomplete, use clearinghouse to check historical records.)
153
-
154
- 2.) Parse each of the 837p files from filepaths in success_dict:
155
197
 
156
- Note: each file will only have one receiver name and one date & time of submission. The dictionary should be organized such that the receiver name (for that file) is the key for a list of patients with patient data.
198
+ Parameters:
199
+ - submission_results: Dictionary containing submission results with detailed information for each endpoint.
200
+ - config: Configuration settings loaded from a JSON file.
157
201
 
158
- output: print to screen a pretty ASCII human-readable organized 'receipt' by receiver name using the dictionary data, then dump to a notepad called Receipt_[date of submission].txt at config[MediLink_Config][local_storage_path] and subprocess open the file to the user to see.
202
+ Returns:
203
+ - None
159
204
  """
160
205
  # Prepare data for receipt
161
- # Organize submission results into a format suitable for the receipt
162
- log("Preparing receipt data...")
163
206
  receipt_data = prepare_receipt_data(submission_results)
164
207
 
165
208
  # Build the receipt
@@ -171,43 +214,59 @@ def build_and_display_receipt(submission_results, config):
171
214
 
172
215
  # Save the receipt to a text file
173
216
  save_receipt_to_file(receipt_content, config)
174
-
175
- # Probably return receipt_data since its the easier to use dictionary
176
- return receipt_data
217
+
218
+ log("Receipt has been generated and saved.")
177
219
 
178
220
  def prepare_receipt_data(submission_results):
179
221
  """
180
222
  Prepare submission results for a receipt, including data from both successful and failed submissions.
181
-
223
+
182
224
  This function extracts patient names, dates of service, amounts billed, and insurance names from an 837p file.
183
225
  It also includes the date and time of batch claim submission, and the receiver name from the 1000B segment.
184
226
  Data is organized by receiver name and includes both successful and failed submissions.
185
-
227
+
186
228
  Parameters:
187
- - submission_results (dict): Contains submission results grouped by endpoint, with success status.
188
-
229
+ - submission_results (dict): Contains submission results grouped by endpoint, with detailed status information.
230
+
189
231
  Returns:
190
232
  - dict: Organized data for receipt preparation, including both successful and failed submission details.
191
233
  """
192
234
  receipt_data = {}
193
235
  for endpoint, files in submission_results.items():
194
- for file_path, success in files.items():
195
- # Parse the 837p file for patient data, regardless of success.
196
- patient_data, date_of_submission = parse_837p_file(file_path)
197
-
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
+
198
253
  if endpoint not in receipt_data:
199
254
  receipt_data[endpoint] = {
200
- "date_of_submission": date_of_submission,
201
- "patients": []
255
+ "patients": [],
256
+ "date_of_submission": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
202
257
  }
203
258
 
204
- # Enhance patient data with success status
259
+ # Parse patient details and add the result status and message
260
+ patient_data, _ = parse_837p_file(file_path)
205
261
  for patient in patient_data:
206
- patient['status'] = success
207
-
262
+ patient['status'] = status
263
+ patient['message'] = message
264
+
208
265
  receipt_data[endpoint]["patients"].extend(patient_data)
209
266
 
210
267
  validate_data(receipt_data)
268
+ log("Receipt data: {}".format(receipt_data), level="DEBUG")
269
+
211
270
  return receipt_data
212
271
 
213
272
  def validate_data(receipt_data):
@@ -215,7 +274,7 @@ def validate_data(receipt_data):
215
274
  for endpoint, data in receipt_data.items():
216
275
  patients = data.get("patients", [])
217
276
  for index, patient in enumerate(patients, start=1):
218
- missing_fields = [field for field in ('name', 'service_date', 'amount_billed', 'insurance_name', 'status') if not patient.get(field)]
277
+ missing_fields = [field for field in ('name', 'service_date', 'amount_billed', 'insurance_name', 'status') if patient.get(field) in (None, '')]
219
278
 
220
279
  if missing_fields:
221
280
  # Log the missing fields without revealing PHI
@@ -314,13 +373,14 @@ def build_receipt_content(receipt_data):
314
373
 
315
374
  # Adding patient information in a tabular format
316
375
  for patient in data["patients"]:
317
- success_status = "SUCCESS" if patient['status'] else "FAILED"
376
+ # Use the message as the status if the submission failed
377
+ status_display = "SUCCESS" if patient['status'] else patient['message']
318
378
  patient_info = "{:<20} | {:<15} | ${:<14} | {:<20} | {:<10}".format(
319
379
  patient['name'],
320
380
  patient['service_date'],
321
381
  patient['amount_billed'],
322
382
  patient['insurance_name'],
323
- success_status
383
+ status_display
324
384
  )
325
385
  receipt_lines.append(patient_info)
326
386
 
@@ -330,17 +390,27 @@ def build_receipt_content(receipt_data):
330
390
  return receipt_content
331
391
 
332
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
+ """
333
403
  try:
334
- # Save the receipt content to a text file named Receipt_[date_of_submission].txt
335
- # Use the configured local storage path to determine the file location
336
404
  file_name = "Receipt_{0}.txt".format(datetime.now().strftime('%Y%m%d_%H%M%S'))
337
405
  file_path = os.path.join(config['MediLink_Config']['local_claims_path'], file_name)
338
406
 
339
407
  with open(file_path, 'w') as file:
340
408
  file.write(receipt_content)
341
409
 
342
- # Open the file automatically for the user
343
- os.startfile(file_path)
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)
344
414
  except Exception as e:
345
415
  print("Failed to save or open receipt file:", e)
346
416
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: medicafe
3
- Version: 0.240613.0
3
+ Version: 0.240809.0
4
4
  Summary: MediCafe
5
5
  Home-page: https://github.com/katanada2
6
6
  Author: Daniel Vidaud
@@ -16,6 +16,7 @@ Requires-Dist: pandas ==0.20.0
16
16
  Requires-Dist: tqdm ==4.14.0
17
17
  Requires-Dist: lxml ==4.2.0
18
18
  Requires-Dist: python-docx
19
+ Requires-Dist: PyYAML ==5.2
19
20
 
20
21
 
21
22
  # Project Overview: MediCafe
@@ -0,0 +1,47 @@
1
+ MediBot/MediBot.bat,sha256=B_iUMQro6kPrTbGOePsTvOq3N9nXn5fE7xnkt4jfSrE,7032
2
+ MediBot/MediBot.py,sha256=JZ8AxdZRuilOXYUlkv8MFSb538INd9T0TQUplRkHI_I,17454
3
+ MediBot/MediBot_Charges.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ MediBot/MediBot_Crosswalk_Library.py,sha256=RxwihSpPtTlnDbPiQ1VWnPVVdjYA-L69OPWREXMTGiQ,14862
5
+ MediBot/MediBot_Post.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ MediBot/MediBot_Preprocessor.py,sha256=OI9rfDF01OLuLFZoSzIceO3r5fkKEFN7tynXPIceoo4,11941
7
+ MediBot/MediBot_Preprocessor_lib.py,sha256=7fxKFgDMVetX1QB5IQJoW9f5hz4Kpim0hfBx-yEP6M8,25083
8
+ MediBot/MediBot_UI.py,sha256=_CS9BV3882mNp-UmMUPKZOsDI3ZGxft5mcr36-Nq1FQ,10318
9
+ MediBot/MediBot_dataformat_library.py,sha256=AVRAl4oDHR6nq2bBiJf2YABrdtnfiQYdYzV0BMvL7U0,8346
10
+ MediBot/MediBot_docx_decoder.py,sha256=nO5N8qPsZoiFzicSJ5mbBfjaqGinxgh_VzjLhEsj95U,13712
11
+ MediBot/MediPost.py,sha256=C1hZJFr65rN6F_dckjdBxFC0vL2CoqY9W3YFqU5HXtE,336
12
+ MediBot/PDF_to_CSV_Cleaner.py,sha256=ZZphmq-5K04DkrZNlcwNAIoZPOD_ROWvS3PMkKFxeiM,8799
13
+ MediBot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ MediBot/update_json.py,sha256=eAu3BPYtlGlwVGZdTUmrqq4qLTVcplt-6EnzcGCheG0,1557
15
+ MediBot/update_medicafe.py,sha256=CYxRHNXb-ZwGELWSXJA90foMwac_GBdXhD9hwClUjpA,2249
16
+ MediLink/MediLink.py,sha256=JsTGXQVCbwaYir_2BoeZzFq43g8UoqAp_kB4s94BL38,18117
17
+ MediLink/MediLink_277_decoder.py,sha256=Z3hQK2j-YzdXjov6aDlDRc7M_auFBnl3se4OF5q6_04,4358
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
+ MediLink/MediLink_API_Generator.py,sha256=AvKJOoQKl2_dJG517chsVAjBKqEEIEz_c12OL03J428,10387
21
+ MediLink/MediLink_API_v2.py,sha256=mcIgLnXPS_NaUBrkKJ8mxCUaQ0AuQUeU1vG6DoplbVY,7733
22
+ MediLink/MediLink_API_v3.py,sha256=ZggkLisZ8tLDuHBIPxg7yr1CHQvGMWiWyiEsfvmWSYU,23081
23
+ MediLink/MediLink_APIs.py,sha256=_EFNjBFwtZsEJM771xa6g-zQCCRrebIHj73ElVVZ8Fs,6229
24
+ MediLink/MediLink_ClaimStatus.py,sha256=s6Ll46yU2-jJueF-3jqVyJ53s1Qll1MONkX2vm1alLY,8655
25
+ MediLink/MediLink_ConfigLoader.py,sha256=4cEaA9ulNHPuXLV76EUIDr0YHPuFjIlg3MvTH0-s1x4,4211
26
+ MediLink/MediLink_DataMgmt.py,sha256=nJ74pXR_PeHS2ODuqw6EP4HzB1tqWZVHprcAkEVEMo0,20461
27
+ MediLink/MediLink_Decoder.py,sha256=L4b3OnVERhgP68T4Lvty9MJNXutPAjXRPBjYpzSj2ZM,7139
28
+ MediLink/MediLink_Deductible.py,sha256=BUa_vx084KRyJfS0x3lOZGNw-8ppeeePEEnX1oAbpiU,8967
29
+ MediLink/MediLink_Down.py,sha256=ykDGxV7j9gVyUibfCfvCvyoKXgP7AgiVXSKY4QH05ac,7097
30
+ MediLink/MediLink_ERA_decoder.py,sha256=MiOtDcXnmevPfHAahIlTLlUc14VcQWAor9Xa7clA2Ts,8710
31
+ MediLink/MediLink_Gmail.py,sha256=FV13-umZIouhetnwkGOBgFQYl5FTyOs__SpjaycUxKk,21195
32
+ MediLink/MediLink_Mailer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ MediLink/MediLink_Parser.py,sha256=p2RlCut84hESXjR7tyCZ9O-gUbsUQeYqRp1bXhKbxu4,6322
34
+ MediLink/MediLink_Scan.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ MediLink/MediLink_Scheduler.py,sha256=UJvxhDvHraqra2_TlQVlGeh5jRFrrfK6nCVUHnKOEMY,38
36
+ MediLink/MediLink_StatusCheck.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ MediLink/MediLink_UI.py,sha256=lPRmbZ54swIVpyHgwb612v3rUZo_DkCthokqdHPf5Vo,6367
38
+ MediLink/MediLink_Up.py,sha256=iMWrCqbRrreVDoR-_zNeaHYArX3WS9L5WWiz6WQHWKM,22185
39
+ MediLink/MediLink_batch.bat,sha256=nqL5QwCLyRQFSPdv6kgtcV_cpky7FXSOWVl6OxjRXb4,118
40
+ MediLink/Soumit_api.py,sha256=5JfOecK98ZC6NpZklZW2AkOzkjvrbYxpJpZNH3rFxDw,497
41
+ MediLink/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ MediLink/test.py,sha256=kSvvJRL_3fWuNS3_x4hToOnUljGLoeEw6SUTHQWQRJk,3108
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,,
@@ -1,43 +0,0 @@
1
- MediBot/MediBot.bat,sha256=9RK-ID3T2xPz3cDEeTlv7nhMy_GhbGYtbD4vutGOSeE,6153
2
- MediBot/MediBot.py,sha256=X7ZU-xYsnw7xL7nBZTDudhSXdsnEavcHORE4hPM4L58,16704
3
- MediBot/MediBot_Charges.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- MediBot/MediBot_Crosswalk_Library.py,sha256=PRsPtoGOwpHvqYnLl_ABTMNkKJlFHtqjgldWxnXQmQI,14669
5
- MediBot/MediBot_Post.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- MediBot/MediBot_Preprocessor.py,sha256=OI9rfDF01OLuLFZoSzIceO3r5fkKEFN7tynXPIceoo4,11941
7
- MediBot/MediBot_Preprocessor_lib.py,sha256=aU5VWwLqDxka8DGLkrji6C9rYMzoqjxLScZ64Ya-0ok,24170
8
- MediBot/MediBot_UI.py,sha256=_CS9BV3882mNp-UmMUPKZOsDI3ZGxft5mcr36-Nq1FQ,10318
9
- MediBot/MediBot_dataformat_library.py,sha256=AVRAl4oDHR6nq2bBiJf2YABrdtnfiQYdYzV0BMvL7U0,8346
10
- MediBot/MediBot_docx_decoder.py,sha256=y2OOjRPWKYn5LnCX3lngNQtGkOOEE6VDaeqvkkIc5ec,13341
11
- MediBot/MediPost.py,sha256=C1hZJFr65rN6F_dckjdBxFC0vL2CoqY9W3YFqU5HXtE,336
12
- MediBot/PDF_to_CSV_Cleaner.py,sha256=ZZphmq-5K04DkrZNlcwNAIoZPOD_ROWvS3PMkKFxeiM,8799
13
- MediBot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- MediBot/update_json.py,sha256=eAu3BPYtlGlwVGZdTUmrqq4qLTVcplt-6EnzcGCheG0,1557
15
- MediBot/update_medicafe.py,sha256=CYxRHNXb-ZwGELWSXJA90foMwac_GBdXhD9hwClUjpA,2249
16
- MediLink/MediLink.py,sha256=X95f6h3s5zgfPrmVO7jCIU8OHmxbiqiUB_XVQI5oVf8,19616
17
- MediLink/MediLink_277_decoder.py,sha256=Z3hQK2j-YzdXjov6aDlDRc7M_auFBnl3se4OF5q6_04,4358
18
- MediLink/MediLink_837p_encoder.py,sha256=onrbzk-6QG97oHRn-AvDtcsYyQ-OpqZJE4KWjgPTwxQ,23550
19
- MediLink/MediLink_837p_encoder_library.py,sha256=RdXsG-k_plNE4vMgFel7L00nwq3pG67iWCpJGXlUtjs,42676
20
- MediLink/MediLink_API_v2.py,sha256=P--ud2ENGsqnB8JLQQ_eiEJw8KGSlIO2eQKz0DfXeNo,7670
21
- MediLink/MediLink_APIs.py,sha256=_EFNjBFwtZsEJM771xa6g-zQCCRrebIHj73ElVVZ8Fs,6229
22
- MediLink/MediLink_ConfigLoader.py,sha256=rrZmy1_d8-2qx_G7pCph-zhlQq_6c6jorYl47J0DxYo,3914
23
- MediLink/MediLink_DataMgmt.py,sha256=y8nNe25mj2ajUmPo7508q_T1vxkYiKzwdRit0oX8V9s,20344
24
- MediLink/MediLink_Decoder.py,sha256=F_cCYhLwhQj72YgFpSuo1FNcxRrHWbaY2iVpD_fypxc,2418
25
- MediLink/MediLink_Down.py,sha256=ND0_QPhKXTqN8JYqbzwZbfxvn3X-iqFHn4SCm4EXkug,5916
26
- MediLink/MediLink_ERA_decoder.py,sha256=MiOtDcXnmevPfHAahIlTLlUc14VcQWAor9Xa7clA2Ts,8710
27
- MediLink/MediLink_Gmail.py,sha256=FV13-umZIouhetnwkGOBgFQYl5FTyOs__SpjaycUxKk,21195
28
- MediLink/MediLink_Mailer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- MediLink/MediLink_Parser.py,sha256=U1hMkhTObNHk_4AXNnCAonnnPYaCiz9L0epP6a0KH2k,4271
30
- MediLink/MediLink_Scan.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- MediLink/MediLink_Scheduler.py,sha256=UJvxhDvHraqra2_TlQVlGeh5jRFrrfK6nCVUHnKOEMY,38
32
- MediLink/MediLink_StatusCheck.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- MediLink/MediLink_UI.py,sha256=k_Kz5tB2NC2CIZLd3JRWCu5IJfGUAr14Iw4kY6sECZo,6979
34
- MediLink/MediLink_Up.py,sha256=02KS_pRZxFd-dZek-YzYfph409BBRfNKCouAWph9op8,18460
35
- MediLink/MediLink_batch.bat,sha256=nqL5QwCLyRQFSPdv6kgtcV_cpky7FXSOWVl6OxjRXb4,118
36
- MediLink/Soumit_api.py,sha256=5JfOecK98ZC6NpZklZW2AkOzkjvrbYxpJpZNH3rFxDw,497
37
- MediLink/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- MediLink/test.py,sha256=kSvvJRL_3fWuNS3_x4hToOnUljGLoeEw6SUTHQWQRJk,3108
39
- medicafe-0.240613.0.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
40
- medicafe-0.240613.0.dist-info/METADATA,sha256=v1DwnPeliwkBR2b7dA6YEdRGu_LEUAjwGZvINtuVpbM,4596
41
- medicafe-0.240613.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
42
- medicafe-0.240613.0.dist-info/top_level.txt,sha256=3uOwR4q_SP8Gufk2uCHoKngAgbtdOwQC6Qjl7ViBa_c,17
43
- medicafe-0.240613.0.dist-info/RECORD,,