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.

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
- # 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
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
- 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))
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
- log_filename = "winscp_{}.log".format(operation_type)
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
- try:
105
- with open(log_path, 'r') as log_file:
106
- 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").
107
134
 
108
- 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 = {}
109
139
 
110
- if log_contents is None:
111
- log("Unexpected NoneType for log_contents")
112
- elif not log_contents:
113
- log("Log file '{}' is empty.".format(log_path))
114
- success_dict = {file_path: False for file_path in transmission_result}
115
- else:
116
- last_lines = log_contents[-15:]
117
- log("Processing the last {} lines of the log file.".format(len(last_lines)))
118
- for file_path in transmission_result:
119
- if file_path is None:
120
- log("Error: NoneType file path found in transmission results.")
121
- continue
122
- 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:
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
- log("Validation: {0} - Transfer done for file: {1}".format(success, file_path))
127
- success_dict[file_path] = success
128
- except TypeError as e:
129
- log("TypeError during processing file path '{}': {}".format(file_path, e))
130
- log("Completed WinSCP log verification check.")
131
-
132
- except FileNotFoundError:
133
- log("Log file '{}' not found.".format(log_path))
134
- success_dict = {file_path: False for file_path in transmission_result}
135
-
136
- except IOError as e:
137
- log("IO error when handling the log file '{}': {}".format(log_path, e))
138
- success_dict = {file_path: False for file_path in transmission_result}
139
-
140
- except Exception as e:
141
- log("Error processing the transmission log: {}".format(e))
142
- 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))
143
190
 
144
191
  return success_dict
145
192
 
146
193
  def build_and_display_receipt(submission_results, config):
147
194
  """
148
- Define Submission Receipt:
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
- 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.
158
201
 
159
- 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
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
- # Probably return receipt_data since its the easier to use dictionary
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 success status.
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
- for file_path, success in files.items():
196
- # Parse the 837p file for patient data, regardless of success.
197
- patient_data, date_of_submission = parse_837p_file(file_path)
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
- "date_of_submission": date_of_submission,
202
- "patients": []
255
+ "patients": [],
256
+ "date_of_submission": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
203
257
  }
204
258
 
205
- # 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)
206
261
  for patient in patient_data:
207
- patient['status'] = success
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 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, '')]
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
- 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']
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
- success_status
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
- # Open the file automatically for the user
344
- 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)
345
414
  except Exception as e:
346
415
  print("Failed to save or open receipt file:", e)
347
416
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: medicafe
3
- Version: 0.240716.2
3
+ Version: 0.240809.0
4
4
  Summary: MediCafe
5
5
  Home-page: https://github.com/katanada2
6
6
  Author: Daniel Vidaud
@@ -1,10 +1,10 @@
1
1
  MediBot/MediBot.bat,sha256=B_iUMQro6kPrTbGOePsTvOq3N9nXn5fE7xnkt4jfSrE,7032
2
- MediBot/MediBot.py,sha256=X7ZU-xYsnw7xL7nBZTDudhSXdsnEavcHORE4hPM4L58,16704
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=aU5VWwLqDxka8DGLkrji6C9rYMzoqjxLScZ64Ya-0ok,24170
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=GRMe3OiskBGVpHDGIrTmY4_t2pc5J_pznHt5Z5mU8X8,18054
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=onrbzk-6QG97oHRn-AvDtcsYyQ-OpqZJE4KWjgPTwxQ,23550
19
- MediLink/MediLink_837p_encoder_library.py,sha256=_K162u1spMWZg-7HMebEU2yciGx_1T6lX7FW02Ek3fA,41831
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=8X-5ldKnAJzfE2R0nywa6xYq6C7kqJ3lLDCyqXg9FP4,15911
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=p1Fkm-KeRR1vcIS-7K6RUP7g1B7HrgO_KbjmwwNCX4A,4161
26
- MediLink/MediLink_DataMgmt.py,sha256=y8nNe25mj2ajUmPo7508q_T1vxkYiKzwdRit0oX8V9s,20344
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=3uCUluPx6sHsU7tj9wM62PZK_WY8VOPFlXG3Iccgiy4,8520
29
- MediLink/MediLink_Down.py,sha256=1SIzPLSI4w4Prb2u0FXsf1Bd6Nksb0tMv0N8w1aWzyE,7110
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=kAtWApyvaE1qMOy5Vzszy3zPBI25wT29jG1XkIWnAAs,6164
38
- MediLink/MediLink_Up.py,sha256=tKkMaz0FvbIXCJ9eQ2LXp6r4_Ou4yDaqRtekfZE6bF0,18546
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.240716.2.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
44
- medicafe-0.240716.2.dist-info/METADATA,sha256=edgBR0DGETtGim21JGQ13iz2K-kqqJwl41hXGAYJxRQ,4625
45
- medicafe-0.240716.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
46
- medicafe-0.240716.2.dist-info/top_level.txt,sha256=3uOwR4q_SP8Gufk2uCHoKngAgbtdOwQC6Qjl7ViBa_c,17
47
- medicafe-0.240716.2.dist-info/RECORD,,
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,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5