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/__init__.py CHANGED
@@ -19,7 +19,7 @@ Smart Import Integration:
19
19
  medibot_main = get_components('medibot_main')
20
20
  """
21
21
 
22
- __version__ = "0.251017.0"
22
+ __version__ = "0.251023.0"
23
23
  __author__ = "Daniel Vidaud"
24
24
  __email__ = "daniel@personalizedtransformation.com"
25
25
 
MediCafe/__init__.py CHANGED
@@ -27,7 +27,7 @@ Smart Import System:
27
27
  api_suite = get_api_access()
28
28
  """
29
29
 
30
- __version__ = "0.251017.0"
30
+ __version__ = "0.251023.0"
31
31
  __author__ = "Daniel Vidaud"
32
32
  __email__ = "daniel@personalizedtransformation.com"
33
33
 
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
 
@@ -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
- error_code = error.get('extensions', {}).get('code', 'UNKNOWN_ERROR')
291
- error_message = error.get('message', 'Unknown error')
292
-
293
- if error_code == 'UNAUTHORIZED_AUTHENTICATION_FAILED':
294
- return {
295
- 'statuscode': '401',
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
- code = (first_err.get('extensions', {}) or {}).get('code') or first_err.get('code') or 'GRAPHQL_ERROR'
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': status,
552
- 'message': '{}: {}'.format(code, msg),
570
+ 'statuscode': statuscode,
571
+ 'message': mapped_msg,
553
572
  'rawGraphQLResponse': graphql_response
554
573
  }
555
574
 
@@ -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:
@@ -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
- log("Unauthorized. Check if the token has the necessary scopes.Response body: {}".format(response.text))
474
- token_info = http_inspect_token(headers['Authorization'].split(' ')[1], log, delete_token_file_fn=delete_token_file, stop_server_fn=stop_server)
475
- log("Token details: {}".format(token_info))
476
- shutdown_event.set()
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
- log("Forbidden access. Ensure that the OAuth client has the correct permissions. Response body: {}".format(response.text))
479
- shutdown_event.set()
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
- pass # Fallback if cls/clear fails
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
- pass
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
- pass
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
- pass
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
- print("[-] Smart import system not available")
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
@@ -22,7 +22,7 @@ Smart Import Integration:
22
22
  datamgmt = get_components('medilink_datamgmt')
23
23
  """
24
24
 
25
- __version__ = "0.251017.0"
25
+ __version__ = "0.251023.0"
26
26
  __author__ = "Daniel Vidaud"
27
27
  __email__ = "daniel@personalizedtransformation.com"
28
28
 
@@ -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
- log("Access token is invalid. Deleting token.json and stopping the server.")
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: medicafe
3
- Version: 0.251017.0
3
+ Version: 0.251023.0
4
4
  Summary: MediCafe
5
5
  Home-page: https://github.com/katanada2/MediCafe
6
6
  Author: Daniel Vidaud
@@ -1,18 +1,18 @@
1
1
  MediBot/MediBot.bat,sha256=dWBZ2__t1uPvEuN76ETOD_mDo7368rP3tDrJd4MHCFY,26306
2
- MediBot/MediBot.py,sha256=9kpNZdNg3awxj0Oa5AszSZrcmyqhPZ0FHeYRHOeumBw,48750
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=ELG0x8DSbByGbnoLOgiztzkYRBekiPb0BmxGw3cic1c,89210
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=Gj1gmPtY2Ua-T9wxwcjl2OXVo7dMcZI4FkOg-YVWvLg,3192
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=5NhwImtNbn5vzqKaqRB0It076F7C2Zmb0REd1jY4BxE,5721
25
+ MediCafe/__init__.py,sha256=mNGfJnmP3CEIKZcHPJxjdvsXUodTUGR4eoKGOKdotlk,5721
26
26
  MediCafe/__main__.py,sha256=mRNyk3D9Ilnu2XhgVI_rut7r5Ro7UIKtwV871giAHI8,12992
27
- MediCafe/api_core.py,sha256=r9cqa5-HU4A7iz3NLxzRwuxsxOfDiJn9SRgtPjT83qU,90764
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=t9AAkkVsmZMxPMSA6DW7wDf2cxXpFfA9oJW5-thg5VQ,8176
33
- MediCafe/graphql_utils.py,sha256=3BYl4wrox40063RwCtIqsrxSMA5rdchCP69RGi-U4aY,51317
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=8Npibnv4p7HDGhz8t7bf760lbkGbV3fMVIfKjNgxYjA,68168
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=hMHgseSi58qPMivZpEhZbY6k-tyxC-hHcWaS7xVNFbI,28011
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=CAXu0IRzhra3ppIFDcCppFNAZp7kCuN6gPtJSdFqGzs,24857
64
- MediLink/MediLink_smart_import.py,sha256=B5SfBn_4bYEWJJDolXbjnwKx_-MaqGZ76LyXQwWDV80,9838
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=xK9uzY41kqKgKT5uxifwKQd001nXnAzeHPJdwjB4Yeo,3888
67
- MediLink/gmail_http_utils.py,sha256=gtqCCrzJC7e8JFQzMNrf7EbK8na2h4sfTu-NMaZ_UHc,4006
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.251017.0.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
73
- medicafe-0.251017.0.dist-info/METADATA,sha256=d86uW7sAJWTEBOxVF00UdawI9PmXuNoMuiE7iGCTYE0,3414
74
- medicafe-0.251017.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
75
- medicafe-0.251017.0.dist-info/entry_points.txt,sha256=m3RBUBjr-xRwEkKJ5W4a7NlqHZP_1rllGtjZnrRqKe8,52
76
- medicafe-0.251017.0.dist-info/top_level.txt,sha256=U6-WBJ9RCEjyIs0BlzbQq_PwedCp_IV9n1616NNV5zA,26
77
- medicafe-0.251017.0.dist-info/RECORD,,
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,,