medicafe 0.251017.0__py3-none-any.whl → 0.251023.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 +77 -11
- MediBot/MediBot_Preprocessor_lib.py +1895 -1821
- MediBot/__init__.py +1 -1
- MediCafe/__init__.py +1 -1
- MediCafe/api_core.py +16 -0
- MediCafe/error_reporter.py +3 -0
- MediCafe/graphql_utils.py +40 -21
- MediLink/MediLink_Deductible.py +21 -0
- MediLink/MediLink_Gmail.py +15 -6
- MediLink/MediLink_main.py +22 -8
- MediLink/MediLink_smart_import.py +3 -2
- MediLink/__init__.py +1 -1
- MediLink/gmail_http_utils.py +2 -3
- {medicafe-0.251017.0.dist-info → medicafe-0.251023.0.dist-info}/METADATA +1 -1
- {medicafe-0.251017.0.dist-info → medicafe-0.251023.0.dist-info}/RECORD +19 -19
- {medicafe-0.251017.0.dist-info → medicafe-0.251023.0.dist-info}/LICENSE +0 -0
- {medicafe-0.251017.0.dist-info → medicafe-0.251023.0.dist-info}/WHEEL +0 -0
- {medicafe-0.251017.0.dist-info → medicafe-0.251023.0.dist-info}/entry_points.txt +0 -0
- {medicafe-0.251017.0.dist-info → medicafe-0.251023.0.dist-info}/top_level.txt +0 -0
MediBot/__init__.py
CHANGED
MediCafe/__init__.py
CHANGED
MediCafe/api_core.py
CHANGED
|
@@ -1464,6 +1464,22 @@ def get_eligibility_super_connector(client, payer_id, provider_last_name, search
|
|
|
1464
1464
|
print("[Eligibility] GraphQL error code={} desc={}".format(code, desc))
|
|
1465
1465
|
except Exception:
|
|
1466
1466
|
pass
|
|
1467
|
+
|
|
1468
|
+
# Terminal self-help hints for auth/authorization cases
|
|
1469
|
+
# Non-throwing hint emitter (kept outside core logic path)
|
|
1470
|
+
def _emit_hint_for_status(status_str):
|
|
1471
|
+
try:
|
|
1472
|
+
if status_str == '401':
|
|
1473
|
+
print("[Eligibility] Hint: Authentication failed. Verify client credentials/token and endpoint config.")
|
|
1474
|
+
elif status_str == '403':
|
|
1475
|
+
print("[Eligibility] Hint: Access denied. Verify providerTaxId/TIN and account permissions/roles for endpoint.")
|
|
1476
|
+
except Exception:
|
|
1477
|
+
pass
|
|
1478
|
+
|
|
1479
|
+
try:
|
|
1480
|
+
_emit_hint_for_status(str(sc_status))
|
|
1481
|
+
except Exception:
|
|
1482
|
+
pass
|
|
1467
1483
|
except Exception:
|
|
1468
1484
|
pass
|
|
1469
1485
|
|
MediCafe/error_reporter.py
CHANGED
|
@@ -229,6 +229,9 @@ def submit_support_bundle(zip_path):
|
|
|
229
229
|
elif code == 401:
|
|
230
230
|
print("[ERROR] Unauthorized (401). Check error_reporting.auth_token.")
|
|
231
231
|
return False
|
|
232
|
+
elif code == 403:
|
|
233
|
+
print("[ERROR] Forbidden (403). The receiver denied access. Verify REPORT_TOKEN and receiver permissions.")
|
|
234
|
+
return False
|
|
232
235
|
elif code == 413:
|
|
233
236
|
print("[ERROR] Too large (413). Consider reducing max log lines.")
|
|
234
237
|
return False
|
MediCafe/graphql_utils.py
CHANGED
|
@@ -268,6 +268,36 @@ class GraphQLQueryBuilder:
|
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
270
|
|
|
271
|
+
def _map_graphql_error_to_status_message(error):
|
|
272
|
+
"""Map provider GraphQL error to (statuscode, message) using simple heuristics.
|
|
273
|
+
Python 3.4-compatible; avoids dependencies and centralizes logic.
|
|
274
|
+
"""
|
|
275
|
+
try:
|
|
276
|
+
if not isinstance(error, dict):
|
|
277
|
+
return '500', 'GraphQL error: unknown format'
|
|
278
|
+
code = ((error.get('extensions', {}) or {}).get('code') or
|
|
279
|
+
error.get('code') or 'GRAPHQL_ERROR')
|
|
280
|
+
msg = (error.get('message') or error.get('description') or 'GraphQL error')
|
|
281
|
+
code_upper = str(code).upper()
|
|
282
|
+
msg_lower = str(msg).lower()
|
|
283
|
+
|
|
284
|
+
# 401 auth failures
|
|
285
|
+
if (code == 'UNAUTHORIZED_AUTHENTICATION_FAILED' or
|
|
286
|
+
('UNAUTH' in code_upper) or
|
|
287
|
+
('AUTHENTICATION' in code_upper)):
|
|
288
|
+
return '401', 'Authentication failed: {}'.format(msg)
|
|
289
|
+
|
|
290
|
+
# 403 authorization/access issues
|
|
291
|
+
if ('FORBIDDEN' in code_upper) or ('AUTHORIZATION' in code_upper) or ('ACCESS_DENIED' in code_upper) or \
|
|
292
|
+
('forbidden' in msg_lower) or ('permission' in msg_lower):
|
|
293
|
+
return '403', 'Authorization failed: {}'.format(msg)
|
|
294
|
+
|
|
295
|
+
# Default
|
|
296
|
+
return '500', '{}: {}'.format(code, msg)
|
|
297
|
+
except Exception:
|
|
298
|
+
return '500', 'GraphQL error: unknown'
|
|
299
|
+
|
|
300
|
+
|
|
271
301
|
class GraphQLResponseTransformer:
|
|
272
302
|
"""Transforms GraphQL responses to match REST API format"""
|
|
273
303
|
|
|
@@ -284,24 +314,15 @@ class GraphQLResponseTransformer:
|
|
|
284
314
|
Transformed response matching REST API format
|
|
285
315
|
"""
|
|
286
316
|
try:
|
|
287
|
-
# Check for authentication errors first
|
|
317
|
+
# Check for authentication/authorization errors first
|
|
288
318
|
if 'errors' in graphql_response:
|
|
289
319
|
error = graphql_response['errors'][0]
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
'message': 'Authentication failed: {}'.format(error_message),
|
|
297
|
-
'rawGraphQLResponse': graphql_response
|
|
298
|
-
}
|
|
299
|
-
else:
|
|
300
|
-
return {
|
|
301
|
-
'statuscode': '500',
|
|
302
|
-
'message': 'GraphQL error: {} - {}'.format(error_code, error_message),
|
|
303
|
-
'rawGraphQLResponse': graphql_response
|
|
304
|
-
}
|
|
320
|
+
statuscode, mapped_msg = _map_graphql_error_to_status_message(error)
|
|
321
|
+
return {
|
|
322
|
+
'statuscode': statuscode,
|
|
323
|
+
'message': mapped_msg,
|
|
324
|
+
'rawGraphQLResponse': graphql_response
|
|
325
|
+
}
|
|
305
326
|
|
|
306
327
|
# Check if GraphQL response has data
|
|
307
328
|
if 'data' not in graphql_response:
|
|
@@ -544,12 +565,10 @@ class GraphQLResponseTransformer:
|
|
|
544
565
|
# Handle GraphQL errors
|
|
545
566
|
if isinstance(graphql_response, dict) and 'errors' in graphql_response:
|
|
546
567
|
first_err = graphql_response['errors'][0] if graphql_response['errors'] else {}
|
|
547
|
-
|
|
548
|
-
msg = first_err.get('message') or first_err.get('description') or 'GraphQL error'
|
|
549
|
-
status = '401' if 'AUTH' in str(code).upper() else '500'
|
|
568
|
+
statuscode, mapped_msg = _map_graphql_error_to_status_message(first_err)
|
|
550
569
|
return {
|
|
551
|
-
'statuscode':
|
|
552
|
-
'message':
|
|
570
|
+
'statuscode': statuscode,
|
|
571
|
+
'message': mapped_msg,
|
|
553
572
|
'rawGraphQLResponse': graphql_response
|
|
554
573
|
}
|
|
555
574
|
|
MediLink/MediLink_Deductible.py
CHANGED
|
@@ -676,6 +676,27 @@ def get_eligibility_info(client, payer_id, provider_last_name, date_of_birth, me
|
|
|
676
676
|
error_messages_for_row.append("Extensions include {} detail record(s)".format(len(details)))
|
|
677
677
|
except Exception:
|
|
678
678
|
pass
|
|
679
|
+
|
|
680
|
+
# Provide concise terminal hints for 401/403 outcomes (XP-safe)
|
|
681
|
+
def _emit_hint(status_code):
|
|
682
|
+
try:
|
|
683
|
+
if status_code == '401':
|
|
684
|
+
h = "Hint: Authentication failed. Verify API credentials/token and endpoint configuration."
|
|
685
|
+
if h not in printed_messages:
|
|
686
|
+
print(h)
|
|
687
|
+
printed_messages.add(h)
|
|
688
|
+
elif status_code == '403':
|
|
689
|
+
h = "Hint: Access denied. Verify provider TIN/NPI and account permissions/roles."
|
|
690
|
+
if h not in printed_messages:
|
|
691
|
+
print(h)
|
|
692
|
+
printed_messages.add(h)
|
|
693
|
+
except Exception:
|
|
694
|
+
pass
|
|
695
|
+
|
|
696
|
+
try:
|
|
697
|
+
_emit_hint(super_connector_eligibility.get('statuscode'))
|
|
698
|
+
except Exception:
|
|
699
|
+
pass
|
|
679
700
|
|
|
680
701
|
# Check status code
|
|
681
702
|
if super_connector_eligibility:
|
MediLink/MediLink_Gmail.py
CHANGED
|
@@ -470,13 +470,22 @@ def handle_post_response(url, payload, headers):
|
|
|
470
470
|
else:
|
|
471
471
|
log("Link retrieval initiated successfully.")
|
|
472
472
|
elif response.status_code == 401:
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
473
|
+
# Automatic re-auth: clear token and prompt user to re-consent, keep server up
|
|
474
|
+
log("Unauthorized (401). Clearing cached token and initiating re-authentication flow. Response body: {}".format(response.text))
|
|
475
|
+
delete_token_file()
|
|
476
|
+
auth_url = get_authorization_url()
|
|
477
|
+
print("Your Google session needs to be refreshed to regain permissions. A browser window will open to re-authorize the app with the required scopes.")
|
|
478
|
+
open_browser_with_executable(auth_url)
|
|
479
|
+
# Wait for the OAuth redirect/flow to complete; the server remains running
|
|
480
|
+
shutdown_event.wait()
|
|
477
481
|
elif response.status_code == 403:
|
|
478
|
-
|
|
479
|
-
|
|
482
|
+
# Treat 403 similarly; scopes may be missing/changed. Force a fresh consent.
|
|
483
|
+
log("Forbidden (403). Clearing cached token and prompting for fresh consent. Response body: {}".format(response.text))
|
|
484
|
+
delete_token_file()
|
|
485
|
+
auth_url = get_authorization_url()
|
|
486
|
+
print("Permissions appear insufficient (403). Opening browser to request the correct Google permissions.")
|
|
487
|
+
open_browser_with_executable(auth_url)
|
|
488
|
+
shutdown_event.wait()
|
|
480
489
|
elif response.status_code == 404:
|
|
481
490
|
log("Not Found. Verify the URL and ensure the Apps Script is deployed correctly. Response body: {}".format(response.text))
|
|
482
491
|
shutdown_event.set()
|
MediLink/MediLink_main.py
CHANGED
|
@@ -41,6 +41,20 @@ if PERFORMANCE_LOGGING:
|
|
|
41
41
|
|
|
42
42
|
# NOTE: Configuration loading moved to function level to avoid import-time dependencies
|
|
43
43
|
|
|
44
|
+
# --- Safe logging helpers (XP/3.4.4 compatible) ---
|
|
45
|
+
def _safe_log(message, level="INFO"):
|
|
46
|
+
"""Attempt to log via MediLink logger, fallback to print on failure."""
|
|
47
|
+
try:
|
|
48
|
+
MediLink_ConfigLoader.log(message, level=level)
|
|
49
|
+
except Exception:
|
|
50
|
+
try:
|
|
51
|
+
print(message)
|
|
52
|
+
except Exception:
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
def _safe_debug(message):
|
|
56
|
+
_safe_log(message, level="DEBUG")
|
|
57
|
+
|
|
44
58
|
# TODO There needs to be a crosswalk auditing feature right alongside where all the names get fetched during initial startup maybe?
|
|
45
59
|
# Vision:
|
|
46
60
|
# - Fast audit pass on startup with 3s timeout: report missing names/IDs, do not block.
|
|
@@ -181,8 +195,8 @@ def main_menu():
|
|
|
181
195
|
# Clear screen before showing menu header
|
|
182
196
|
try:
|
|
183
197
|
os.system('cls' if os.name == 'nt' else 'clear')
|
|
184
|
-
except Exception:
|
|
185
|
-
|
|
198
|
+
except Exception as e:
|
|
199
|
+
_safe_debug("Clear screen failed: {}".format(e)) # Fallback if cls/clear fails
|
|
186
200
|
|
|
187
201
|
# Display Welcome Message
|
|
188
202
|
welcome_start = time.time()
|
|
@@ -197,8 +211,8 @@ def main_menu():
|
|
|
197
211
|
uploaded, total = flush_queued_reports()
|
|
198
212
|
if total:
|
|
199
213
|
print("Queued reports: {} | Uploaded now: {}".format(total, uploaded))
|
|
200
|
-
except Exception:
|
|
201
|
-
|
|
214
|
+
except Exception as e:
|
|
215
|
+
_safe_log("Queue flush skipped due to error: {}".format(e), level="WARNING")
|
|
202
216
|
|
|
203
217
|
# Show message if new records were found during boot-time scan. TODO we need this to use the 'Last acknowledgements update:' timestamp to decide if it has already run in the last day so
|
|
204
218
|
# that we're not running it multiple times in rapid succession automatically. (user-initiated checks are fine like via selection of (1. Check for new remittances))
|
|
@@ -256,8 +270,8 @@ def main_menu():
|
|
|
256
270
|
_last_ack_updated_at = now_ts
|
|
257
271
|
# remove executed
|
|
258
272
|
_scheduled_ack_checks = [t for t in _scheduled_ack_checks if t > now_ts]
|
|
259
|
-
except Exception:
|
|
260
|
-
|
|
273
|
+
except Exception as e:
|
|
274
|
+
_safe_log("Scheduled acknowledgements check skipped: {}".format(e), level="WARNING")
|
|
261
275
|
|
|
262
276
|
# Define static menu options for consistent numbering
|
|
263
277
|
options = ["Check for new remittances", "Submit claims", "Exit", "Tools"]
|
|
@@ -269,8 +283,8 @@ def main_menu():
|
|
|
269
283
|
if _last_ack_updated_at:
|
|
270
284
|
ts_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(_last_ack_updated_at))
|
|
271
285
|
print("Last acknowledgements update: {}".format(ts_str))
|
|
272
|
-
except Exception:
|
|
273
|
-
|
|
286
|
+
except Exception as e:
|
|
287
|
+
_safe_debug("Display of last ack update failed: {}".format(e))
|
|
274
288
|
MediLink_UI.display_menu(options)
|
|
275
289
|
menu_display_end = time.time()
|
|
276
290
|
if PERFORMANCE_LOGGING:
|
|
@@ -55,8 +55,9 @@ except Exception as e:
|
|
|
55
55
|
medilink_ui = None
|
|
56
56
|
medilink_patient_processor = None
|
|
57
57
|
print("[+] Fallback to core components")
|
|
58
|
-
except:
|
|
59
|
-
|
|
58
|
+
except Exception as e:
|
|
59
|
+
# Keep non-blocking behavior; include reason for easier debugging
|
|
60
|
+
print("[-] Smart import system not available: {}".format(e))
|
|
60
61
|
api_core = None
|
|
61
62
|
logging_config = None
|
|
62
63
|
core_utils = None
|
MediLink/__init__.py
CHANGED
MediLink/gmail_http_utils.py
CHANGED
|
@@ -76,11 +76,10 @@ def inspect_token(access_token, log, delete_token_file_fn=None, stop_server_fn=N
|
|
|
76
76
|
else:
|
|
77
77
|
log("Failed to inspect token. Status code: {}, Body: {}".format(response.status_code, response.text))
|
|
78
78
|
if response.status_code == 400 and "invalid_token" in response.text:
|
|
79
|
-
|
|
79
|
+
# Token is invalid (revoked/expired). Clear cache and let caller trigger re-auth.
|
|
80
|
+
log("Access token is invalid. Clearing token cache and keeping server running for re-auth.")
|
|
80
81
|
if delete_token_file_fn:
|
|
81
82
|
delete_token_file_fn()
|
|
82
|
-
if stop_server_fn:
|
|
83
|
-
stop_server_fn()
|
|
84
83
|
return None
|
|
85
84
|
return None
|
|
86
85
|
except Exception as e:
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
MediBot/MediBot.bat,sha256=dWBZ2__t1uPvEuN76ETOD_mDo7368rP3tDrJd4MHCFY,26306
|
|
2
|
-
MediBot/MediBot.py,sha256=
|
|
2
|
+
MediBot/MediBot.py,sha256=ABSqWikb_c1VSuR4n8Vh5YfOqzDCi2jnnp3sg_xOYg0,51092
|
|
3
3
|
MediBot/MediBot_Charges.py,sha256=a28if_f_IoazIHiqlaFosFnfEgEoCwb9LQ6aOyk5-D0,10704
|
|
4
4
|
MediBot/MediBot_Crosswalk_Library.py,sha256=6LrpRx2UKVeH3TspS9LpR93iw5M7nTqN6IYpC-6PPGE,26060
|
|
5
5
|
MediBot/MediBot_Crosswalk_Utils.py,sha256=dFJRB_8q0iiAxZ2GY-2HsMl5Z7FvkXezzwx6LZoAglI,39589
|
|
6
6
|
MediBot/MediBot_Notepad_Utils.py,sha256=fOsjyfoSpgmQyc8TcnLm53faLMOUUL18cspo5PZqJK4,8719
|
|
7
7
|
MediBot/MediBot_Post.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
MediBot/MediBot_Preprocessor.py,sha256=gQRVAWbRHx_PMK6a7q93tp7Z-Dhjn5r0lJz3d0wAzeU,19067
|
|
9
|
-
MediBot/MediBot_Preprocessor_lib.py,sha256=
|
|
9
|
+
MediBot/MediBot_Preprocessor_lib.py,sha256=UsUUoleKvWsykIfOvOWwoPHNsWkxfegK20mtN8F4eLs,94583
|
|
10
10
|
MediBot/MediBot_UI.py,sha256=tQISM2gULmQVc4JbeVsn4pjgOYsQZiJpx1_IU407rO8,25870
|
|
11
11
|
MediBot/MediBot_dataformat_library.py,sha256=D46fdPtxcgfWTzaLBtSvjtozzZBNqNiODgu4vKMZrBg,10746
|
|
12
12
|
MediBot/MediBot_debug.bat,sha256=F5Lfi3nFEEo4Ddx9EbX94u3fNAMgzMp3wsn-ULyASTM,6017
|
|
13
13
|
MediBot/MediBot_docx_decoder.py,sha256=9BSjV-kB90VHnqfL_5iX4zl5u0HcHvHuL7YNfx3gXpQ,33143
|
|
14
14
|
MediBot/MediBot_smart_import.py,sha256=Emvz7NwemHGCHvG5kZcUyXMcCheidbGKaPfOTg-YCEs,6684
|
|
15
|
-
MediBot/__init__.py,sha256=
|
|
15
|
+
MediBot/__init__.py,sha256=OA4iq1l1csk8UI4eVsZd898vRTMeErqvXDoXkAHrvE4,3192
|
|
16
16
|
MediBot/clear_cache.bat,sha256=F6-VhETWw6xDdGWG2wUqvtXjCl3lY4sSUFqF90bM8-8,1860
|
|
17
17
|
MediBot/crash_diagnostic.bat,sha256=j8kUtyBg6NOWbXpeFuEqIRHOkVzgUrLOqO3FBMfNxTo,9268
|
|
18
18
|
MediBot/f_drive_diagnostic.bat,sha256=4572hZaiwZ5wVAarPcZJQxkOSTwAdDuT_X914noARak,6878
|
|
@@ -22,15 +22,15 @@ MediBot/process_csvs.bat,sha256=3tI7h1z9eRj8rUUL4wJ7dy-Qrak20lRmpAPtGbUMbVQ,3489
|
|
|
22
22
|
MediBot/update_json.py,sha256=vvUF4mKCuaVly8MmoadDO59M231fCIInc0KI1EtDtPA,3704
|
|
23
23
|
MediBot/update_medicafe.py,sha256=G1lyvVOHYuho1d-TJQNN6qaB4HBWaJ2PpXqemBoPlRQ,17937
|
|
24
24
|
MediCafe/MediLink_ConfigLoader.py,sha256=NoLb2YiJwlkrRYCt2PHvcFJ7yTIRWQCrsvkZIJWreM4,11141
|
|
25
|
-
MediCafe/__init__.py,sha256=
|
|
25
|
+
MediCafe/__init__.py,sha256=mNGfJnmP3CEIKZcHPJxjdvsXUodTUGR4eoKGOKdotlk,5721
|
|
26
26
|
MediCafe/__main__.py,sha256=mRNyk3D9Ilnu2XhgVI_rut7r5Ro7UIKtwV871giAHI8,12992
|
|
27
|
-
MediCafe/api_core.py,sha256=
|
|
27
|
+
MediCafe/api_core.py,sha256=pkRh8oT3x1wWfdw7on0J4QQo2Bnb2IjYTPX0ONiz4Wc,91530
|
|
28
28
|
MediCafe/api_factory.py,sha256=I5AeJoyu6m7oCrjc2OvVvO_4KSBRutTsR1riiWhTZV0,12086
|
|
29
29
|
MediCafe/api_utils.py,sha256=KWQB0q1k5E6frOFFlKWcFpHNcqfrS7KJ_82672wbupw,14041
|
|
30
30
|
MediCafe/core_utils.py,sha256=XKUpyv7yKjIQ8iNrhD76PIURyt6GZxb98v0daiI7aaw,27303
|
|
31
31
|
MediCafe/deductible_utils.py,sha256=-ixDYwI3JNAyACrFjKqoX_hD3Awzownq441U0PSrwXw,64932
|
|
32
|
-
MediCafe/error_reporter.py,sha256=
|
|
33
|
-
MediCafe/graphql_utils.py,sha256=
|
|
32
|
+
MediCafe/error_reporter.py,sha256=YFp1kNWBw_8zVCd0YW6VV142-l9SrJ5LhNYdmKgu5uU,8326
|
|
33
|
+
MediCafe/graphql_utils.py,sha256=jo4CboMb9i5_qD0jkfrLbL87_Q3aFiwOntZhjF9fMsI,51928
|
|
34
34
|
MediCafe/logging_config.py,sha256=auT65LN5oDEXVhkMeLke63kJHTWxYf2o8YihAfQFgzU,5493
|
|
35
35
|
MediCafe/logging_demo.py,sha256=TwUhzafna5pMdN3zSKGrpUWRqX96F1JGGsSUtr3dygs,1975
|
|
36
36
|
MediCafe/migration_helpers.py,sha256=48GnP4xcgvDNNlzoWsKASCpF4H0KnyveHPbz6kjQy50,17737
|
|
@@ -47,11 +47,11 @@ MediLink/MediLink_Charges.py,sha256=82fnqHGvT7tfdfjucnFHiLdUE0WhHDXrcS0k_Ln3c8U,
|
|
|
47
47
|
MediLink/MediLink_ClaimStatus.py,sha256=nKX7QymhCULiaGfISYw_P0Eqy0TP6qKG4C2d3TdGFVo,22720
|
|
48
48
|
MediLink/MediLink_DataMgmt.py,sha256=9hc5jyWU65nYT66afDybOyYAcW-DvEYuHpWTun96U50,52407
|
|
49
49
|
MediLink/MediLink_Decoder.py,sha256=1gzdybNg4Vv69s5PNbX8bPNrXT_N_kPpFpt2HpkauWA,16430
|
|
50
|
-
MediLink/MediLink_Deductible.py,sha256=
|
|
50
|
+
MediLink/MediLink_Deductible.py,sha256=HsEykbZD5YZVjpipIiaFhcLMI-h7anB3E2yU6WQL91E,69358
|
|
51
51
|
MediLink/MediLink_Deductible_Validator.py,sha256=x6tHJOi88TblUpDPSH6QhIdXXRgr3rXI7kYPVGZYCgU,24998
|
|
52
52
|
MediLink/MediLink_Display_Utils.py,sha256=MonsX6VPbdvqwY_V8sHUYrXCS0fMKc4toJvG0oyr-V4,24872
|
|
53
53
|
MediLink/MediLink_Down.py,sha256=s4_z-RaqHYanjwbQCl-OSkg4XIpcIQ2Q6jXa8-q_QXw,28111
|
|
54
|
-
MediLink/MediLink_Gmail.py,sha256=
|
|
54
|
+
MediLink/MediLink_Gmail.py,sha256=KnTm7Z_Q5B1n9hNtCR00wDWWWmRVf86f-JtKdZKRKpA,28637
|
|
55
55
|
MediLink/MediLink_Mailer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
56
|
MediLink/MediLink_Parser.py,sha256=eRVZ4ckZ5gDOrcvtCUZP3DOd3Djly66rCIk0aYXLz14,12567
|
|
57
57
|
MediLink/MediLink_PatientProcessor.py,sha256=9r2w4p45d30Tn0kbXL3j5574MYOehP83tDirNOw_Aek,19977
|
|
@@ -60,18 +60,18 @@ MediLink/MediLink_Scheduler.py,sha256=UJvxhDvHraqra2_TlQVlGeh5jRFrrfK6nCVUHnKOEM
|
|
|
60
60
|
MediLink/MediLink_UI.py,sha256=ZEJ14EGh7pDu1XjAdORDFiay4UtTsLNWwNSJ0prHFWg,10381
|
|
61
61
|
MediLink/MediLink_Up.py,sha256=uB6J63hWOn8Ot8iGtc2_OgcejNWVgnX7Se_e_UWBNho,38082
|
|
62
62
|
MediLink/MediLink_insurance_utils.py,sha256=g741Fj2K26cMy0JX5d_XavMw9LgkK6hjaUJYfysT7t8,9301
|
|
63
|
-
MediLink/MediLink_main.py,sha256=
|
|
64
|
-
MediLink/MediLink_smart_import.py,sha256=
|
|
63
|
+
MediLink/MediLink_main.py,sha256=jWxh1ydNwBi07T4Aw9CRalBporvxpd1Akjfk_vbDuWY,25548
|
|
64
|
+
MediLink/MediLink_smart_import.py,sha256=ZUXvAkIA2Pk2uuyLZazKfKK8YGdkZt1VAeZo_ZSUyxk,9942
|
|
65
65
|
MediLink/Soumit_api.py,sha256=5JfOecK98ZC6NpZklZW2AkOzkjvrbYxpJpZNH3rFxDw,497
|
|
66
|
-
MediLink/__init__.py,sha256=
|
|
67
|
-
MediLink/gmail_http_utils.py,sha256=
|
|
66
|
+
MediLink/__init__.py,sha256=81O-jPStZK-DliXuD5hVRTFnTRmEisCKhRyt624iY-w,3888
|
|
67
|
+
MediLink/gmail_http_utils.py,sha256=mYChIhkbA1oJaAJA-nY3XgHQY-H7zvZJUZPhUagomsI,4047
|
|
68
68
|
MediLink/gmail_oauth_utils.py,sha256=Ugr-DEqs4_RddRMSCJ_dbgA3TVeaxpbAor-dktcTIgY,3713
|
|
69
69
|
MediLink/openssl.cnf,sha256=76VdcGCykf0Typyiv8Wd1mMVKixrQ5RraG6HnfKFqTo,887
|
|
70
70
|
MediLink/test.py,sha256=DM_E8gEbhbVfTAm3wTMiNnK2GCD1e5eH6gwTk89QIc4,3116
|
|
71
71
|
MediLink/webapp.html,sha256=DwDYjVvluGJ7eDdvEogfKN4t24ZJRoIUuSBfCYCL-3w,21252
|
|
72
|
-
medicafe-0.
|
|
73
|
-
medicafe-0.
|
|
74
|
-
medicafe-0.
|
|
75
|
-
medicafe-0.
|
|
76
|
-
medicafe-0.
|
|
77
|
-
medicafe-0.
|
|
72
|
+
medicafe-0.251023.0.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
|
|
73
|
+
medicafe-0.251023.0.dist-info/METADATA,sha256=c11fABULAMMKESxoarV2B2SKsuCzkAtOMiElbS7GLxg,3414
|
|
74
|
+
medicafe-0.251023.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
75
|
+
medicafe-0.251023.0.dist-info/entry_points.txt,sha256=m3RBUBjr-xRwEkKJ5W4a7NlqHZP_1rllGtjZnrRqKe8,52
|
|
76
|
+
medicafe-0.251023.0.dist-info/top_level.txt,sha256=U6-WBJ9RCEjyIs0BlzbQq_PwedCp_IV9n1616NNV5zA,26
|
|
77
|
+
medicafe-0.251023.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|