medicafe 0.250708.0__tar.gz → 0.250708.1__tar.gz

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.

Files changed (54) hide show
  1. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Deductible.py +182 -30
  2. {medicafe-0.250708.0/medicafe.egg-info → medicafe-0.250708.1}/PKG-INFO +1 -1
  3. {medicafe-0.250708.0 → medicafe-0.250708.1/medicafe.egg-info}/PKG-INFO +1 -1
  4. {medicafe-0.250708.0 → medicafe-0.250708.1}/setup.py +1 -1
  5. {medicafe-0.250708.0 → medicafe-0.250708.1}/LICENSE +0 -0
  6. {medicafe-0.250708.0 → medicafe-0.250708.1}/MANIFEST.in +0 -0
  7. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot.bat +0 -0
  8. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot.py +0 -0
  9. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_Charges.py +0 -0
  10. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_Crosswalk_Library.py +0 -0
  11. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_Post.py +0 -0
  12. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_Preprocessor.py +0 -0
  13. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_Preprocessor_lib.py +0 -0
  14. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_UI.py +0 -0
  15. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_dataformat_library.py +0 -0
  16. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/MediBot_docx_decoder.py +0 -0
  17. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/PDF_to_CSV_Cleaner.py +0 -0
  18. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/__init__.py +0 -0
  19. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/update_json.py +0 -0
  20. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediBot/update_medicafe.py +0 -0
  21. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink.py +0 -0
  22. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_837p_encoder.py +0 -0
  23. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_837p_encoder_library.py +0 -0
  24. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_API_Generator.py +0 -0
  25. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_API_v2.py +0 -0
  26. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_API_v3.py +0 -0
  27. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_APIs.py +0 -0
  28. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Azure.py +0 -0
  29. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_ClaimStatus.py +0 -0
  30. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_ConfigLoader.py +0 -0
  31. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_DataMgmt.py +0 -0
  32. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Decoder.py +0 -0
  33. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Down.py +0 -0
  34. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Gmail.py +0 -0
  35. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_GraphQL.py +0 -0
  36. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Mailer.py +0 -0
  37. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Parser.py +0 -0
  38. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Scan.py +0 -0
  39. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Scheduler.py +0 -0
  40. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_UI.py +0 -0
  41. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_Up.py +0 -0
  42. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/MediLink_batch.bat +0 -0
  43. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/Soumit_api.py +0 -0
  44. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/__init__.py +0 -0
  45. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/openssl.cnf +0 -0
  46. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/test.py +0 -0
  47. {medicafe-0.250708.0 → medicafe-0.250708.1}/MediLink/webapp.html +0 -0
  48. {medicafe-0.250708.0 → medicafe-0.250708.1}/README.md +0 -0
  49. {medicafe-0.250708.0 → medicafe-0.250708.1}/medicafe.egg-info/SOURCES.txt +0 -0
  50. {medicafe-0.250708.0 → medicafe-0.250708.1}/medicafe.egg-info/dependency_links.txt +0 -0
  51. {medicafe-0.250708.0 → medicafe-0.250708.1}/medicafe.egg-info/not-zip-safe +0 -0
  52. {medicafe-0.250708.0 → medicafe-0.250708.1}/medicafe.egg-info/requires.txt +0 -0
  53. {medicafe-0.250708.0 → medicafe-0.250708.1}/medicafe.egg-info/top_level.txt +0 -0
  54. {medicafe-0.250708.0 → medicafe-0.250708.1}/setup.cfg +0 -0
@@ -212,47 +212,199 @@ def get_eligibility_info(client, payer_id, provider_last_name, date_of_birth, me
212
212
  MediLink_ConfigLoader.log("Error: {}".format(e), level="ERROR")
213
213
  return None
214
214
 
215
- # Function to extract required fields and display in a tabular format
216
- def display_eligibility_info(data, dob, member_id, output_file):
217
- if data is None:
218
- return
215
+ # Helper functions to extract data from different API response formats
216
+
217
+ def extract_legacy_patient_info(policy):
218
+ """Extract patient information from legacy API response format"""
219
+ patient_info = policy.get("patientInfo", [{}])[0]
220
+ return {
221
+ 'lastName': patient_info.get("lastName", ""),
222
+ 'firstName': patient_info.get("firstName", ""),
223
+ 'middleName': patient_info.get("middleName", "")
224
+ }
219
225
 
220
- for policy in data.get("memberPolicies", []):
221
- # Skip non-medical policies
222
- if policy.get("policyInfo", {}).get("coverageType", "") != "Medical":
223
- continue
226
+ def extract_super_connector_patient_info(eligibility_data):
227
+ """Extract patient information from Super Connector API response format"""
228
+ if not eligibility_data or 'data' not in eligibility_data:
229
+ return {'lastName': '', 'firstName': '', 'middleName': ''}
230
+
231
+ # Navigate to the first eligibility record
232
+ eligibility_list = eligibility_data.get('data', {}).get('checkEligibility', {}).get('eligibility', [])
233
+ if not eligibility_list:
234
+ return {'lastName': '', 'firstName': '', 'middleName': ''}
235
+
236
+ first_eligibility = eligibility_list[0]
237
+ member_info = first_eligibility.get('eligibilityInfo', {}).get('member', {})
238
+
239
+ return {
240
+ 'lastName': member_info.get("lastName", ""),
241
+ 'firstName': member_info.get("firstName", ""),
242
+ 'middleName': member_info.get("middleName", "")
243
+ }
224
244
 
225
- patient_info = policy.get("patientInfo", [{}])[0]
226
- lastName = patient_info.get("lastName", "")
227
- firstName = patient_info.get("firstName", "")
228
- middleName = patient_info.get("middleName", "")
229
-
230
- # Check if the remaining amount is per individual first, then fallback to family
231
- deductible_info = policy.get("deductibleInfo", {})
232
- if 'individual' in deductible_info:
233
- remaining_amount = deductible_info['individual']['inNetwork'].get("remainingAmount", "")
234
- elif 'family' in deductible_info:
235
- remaining_amount = deductible_info['family']['inNetwork'].get("remainingAmount", "")
236
- else:
237
- remaining_amount = ""
245
+ def extract_legacy_remaining_amount(policy):
246
+ """Extract remaining amount from legacy API response format"""
247
+ deductible_info = policy.get("deductibleInfo", {})
248
+ if 'individual' in deductible_info:
249
+ return deductible_info['individual']['inNetwork'].get("remainingAmount", "")
250
+ elif 'family' in deductible_info:
251
+ return deductible_info['family']['inNetwork'].get("remainingAmount", "")
252
+ else:
253
+ return ""
254
+
255
+ def extract_super_connector_remaining_amount(eligibility_data):
256
+ """Extract remaining amount from Super Connector API response format"""
257
+ if not eligibility_data or 'data' not in eligibility_data:
258
+ return ""
259
+
260
+ # Navigate to the first eligibility record
261
+ eligibility_list = eligibility_data.get('data', {}).get('checkEligibility', {}).get('eligibility', [])
262
+ if not eligibility_list:
263
+ return ""
264
+
265
+ first_eligibility = eligibility_list[0]
266
+ service_levels = first_eligibility.get('serviceLevels', [])
267
+
268
+ # Look for deductible information in service levels
269
+ for service_level in service_levels:
270
+ individual_services = service_level.get('individual', [])
271
+ for individual in individual_services:
272
+ services = individual.get('services', [])
273
+ for service in services:
274
+ # Look for deductible-related information
275
+ if service.get('service') == 'deductible' or 'deductible' in service.get('text', '').lower():
276
+ return service.get('remainingAmount', "")
277
+
278
+ # If no specific deductible found, try to get from plan levels
279
+ plan_levels = first_eligibility.get('eligibilityInfo', {}).get('planLevels', [])
280
+ for plan_level in plan_levels:
281
+ if plan_level.get('level') == 'deductibleInfo/outOfPocket/coPayMax':
282
+ individual_levels = plan_level.get('individual', [])
283
+ if individual_levels:
284
+ return individual_levels[0].get('remainingAmount', "")
285
+
286
+ return ""
287
+
288
+ def extract_legacy_insurance_info(policy):
289
+ """Extract insurance information from legacy API response format"""
290
+ insurance_info = policy.get("insuranceInfo", {})
291
+ return {
292
+ 'insuranceType': insurance_info.get("insuranceType", ""),
293
+ 'insuranceTypeCode': insurance_info.get("insuranceTypeCode", ""),
294
+ 'memberId': insurance_info.get("memberId", ""),
295
+ 'payerId': insurance_info.get("payerId", "")
296
+ }
297
+
298
+ def extract_super_connector_insurance_info(eligibility_data):
299
+ """Extract insurance information from Super Connector API response format"""
300
+ if not eligibility_data or 'data' not in eligibility_data:
301
+ return {'insuranceType': '', 'insuranceTypeCode': '', 'memberId': '', 'payerId': ''}
302
+
303
+ # Navigate to the first eligibility record
304
+ eligibility_list = eligibility_data.get('data', {}).get('checkEligibility', {}).get('eligibility', [])
305
+ if not eligibility_list:
306
+ return {'insuranceType': '', 'insuranceTypeCode': '', 'memberId': '', 'payerId': ''}
307
+
308
+ first_eligibility = eligibility_list[0]
309
+ insurance_info = first_eligibility.get('eligibilityInfo', {}).get('insuranceInfo', {})
310
+
311
+ # Get coverage type from coverageTypes array
312
+ coverage_types = insurance_info.get('coverageTypes', [])
313
+ insurance_type = ""
314
+ if coverage_types:
315
+ insurance_type = coverage_types[0].get('description', '')
316
+
317
+ return {
318
+ 'insuranceType': insurance_type,
319
+ 'insuranceTypeCode': insurance_info.get("productCode", ""),
320
+ 'memberId': insurance_info.get("policyNumber", ""),
321
+ 'payerId': insurance_info.get("payerId", "")
322
+ }
238
323
 
239
- insurance_info = policy.get("insuranceInfo", {})
240
- ins_insuranceType = insurance_info.get("insuranceType", "")
241
- ins_insuranceTypeCode = insurance_info.get("insuranceTypeCode", "")
242
- ins_memberID = insurance_info.get("memberId", "")
243
- ins_payerID = insurance_info.get("payerId", "")
324
+ def extract_legacy_policy_status(policy):
325
+ """Extract policy status from legacy API response format"""
326
+ policy_info = policy.get("policyInfo", {})
327
+ return policy_info.get("policyStatus", "")
328
+
329
+ def extract_super_connector_policy_status(eligibility_data):
330
+ """Extract policy status from Super Connector API response format"""
331
+ if not eligibility_data or 'data' not in eligibility_data:
332
+ return ""
333
+
334
+ # Navigate to the first eligibility record
335
+ eligibility_list = eligibility_data.get('data', {}).get('checkEligibility', {}).get('eligibility', [])
336
+ if not eligibility_list:
337
+ return ""
338
+
339
+ first_eligibility = eligibility_list[0]
340
+ insurance_info = first_eligibility.get('eligibilityInfo', {}).get('insuranceInfo', {})
341
+
342
+ return insurance_info.get("policyStatus", "")
343
+
344
+ def is_legacy_response_format(data):
345
+ """Determine if the response is in legacy format (has memberPolicies)"""
346
+ return data is not None and "memberPolicies" in data
347
+
348
+ def is_super_connector_response_format(data):
349
+ """Determine if the response is in Super Connector format (has data.checkEligibility)"""
350
+ return data is not None and "data" in data and "checkEligibility" in data.get("data", {})
244
351
 
245
- policy_info = policy.get("policyInfo", {})
246
- policy_status = policy_info.get("policyStatus", "")
352
+ # Function to extract required fields and display in a tabular format
353
+ def display_eligibility_info(data, dob, member_id, output_file):
354
+ if data is None:
355
+ return
247
356
 
248
- patient_name = "{} {} {}".format(firstName, middleName, lastName).strip()[:20]
357
+ # Determine which API response format we're dealing with
358
+ if is_legacy_response_format(data):
359
+ # Handle legacy API response format
360
+ for policy in data.get("memberPolicies", []):
361
+ # Skip non-medical policies
362
+ if policy.get("policyInfo", {}).get("coverageType", "") != "Medical":
363
+ continue
364
+
365
+ patient_info = extract_legacy_patient_info(policy)
366
+ remaining_amount = extract_legacy_remaining_amount(policy)
367
+ insurance_info = extract_legacy_insurance_info(policy)
368
+ policy_status = extract_legacy_policy_status(policy)
369
+
370
+ patient_name = "{} {} {}".format(
371
+ patient_info['firstName'],
372
+ patient_info['middleName'],
373
+ patient_info['lastName']
374
+ ).strip()[:20]
375
+
376
+ # Display patient information in a table row format
377
+ table_row = "{:<20} | {:<10} | {:<40} | {:<5} | {:<14} | {:<14}".format(
378
+ patient_name, dob, insurance_info['insuranceType'],
379
+ insurance_info['payerId'], policy_status, remaining_amount)
380
+ output_file.write(table_row + "\n")
381
+ print(table_row) # Print to console for progressive display
382
+
383
+ elif is_super_connector_response_format(data):
384
+ # Handle Super Connector API response format
385
+ patient_info = extract_super_connector_patient_info(data)
386
+ remaining_amount = extract_super_connector_remaining_amount(data)
387
+ insurance_info = extract_super_connector_insurance_info(data)
388
+ policy_status = extract_super_connector_policy_status(data)
389
+
390
+ patient_name = "{} {} {}".format(
391
+ patient_info['firstName'],
392
+ patient_info['middleName'],
393
+ patient_info['lastName']
394
+ ).strip()[:20]
249
395
 
250
396
  # Display patient information in a table row format
251
397
  table_row = "{:<20} | {:<10} | {:<40} | {:<5} | {:<14} | {:<14}".format(
252
- patient_name, dob, ins_insuranceType, ins_payerID, policy_status, remaining_amount)
398
+ patient_name, dob, insurance_info['insuranceType'],
399
+ insurance_info['payerId'], policy_status, remaining_amount)
253
400
  output_file.write(table_row + "\n")
254
401
  print(table_row) # Print to console for progressive display
255
402
 
403
+ else:
404
+ # Unknown response format - log for debugging
405
+ MediLink_ConfigLoader.log("Unknown response format in display_eligibility_info", level="WARNING")
406
+ MediLink_ConfigLoader.log("Response structure: {}".format(json.dumps(data, indent=2)), level="DEBUG")
407
+
256
408
  # Main Execution Flow
257
409
  if __name__ == "__main__":
258
410
  # Step 1: Handle Manual Deductible Lookups
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: medicafe
3
- Version: 0.250708.0
3
+ Version: 0.250708.1
4
4
  Summary: MediCafe
5
5
  Home-page: https://github.com/katanada2
6
6
  Author: Daniel Vidaud
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: medicafe
3
- Version: 0.250708.0
3
+ Version: 0.250708.1
4
4
  Summary: MediCafe
5
5
  Home-page: https://github.com/katanada2
6
6
  Author: Daniel Vidaud
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='medicafe',
5
- version="0.250708.0",
5
+ version="0.250708.1",
6
6
  description='MediCafe',
7
7
  long_description="""
8
8
  # Project Overview: MediCafe
File without changes
File without changes
File without changes
File without changes