medicafe 0.250610.1__tar.gz → 0.250630.0__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.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_API_v3.py +104 -3
  2. medicafe-0.250630.0/MediLink/MediLink_GraphQL.py +992 -0
  3. {medicafe-0.250610.1/medicafe.egg-info → medicafe-0.250630.0}/PKG-INFO +1 -1
  4. {medicafe-0.250610.1 → medicafe-0.250630.0/medicafe.egg-info}/PKG-INFO +1 -1
  5. {medicafe-0.250610.1 → medicafe-0.250630.0}/medicafe.egg-info/SOURCES.txt +1 -0
  6. {medicafe-0.250610.1 → medicafe-0.250630.0}/setup.py +1 -1
  7. {medicafe-0.250610.1 → medicafe-0.250630.0}/LICENSE +0 -0
  8. {medicafe-0.250610.1 → medicafe-0.250630.0}/MANIFEST.in +0 -0
  9. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot.bat +0 -0
  10. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot.py +0 -0
  11. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_Charges.py +0 -0
  12. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_Crosswalk_Library.py +0 -0
  13. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_Post.py +0 -0
  14. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_Preprocessor.py +0 -0
  15. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_Preprocessor_lib.py +0 -0
  16. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_UI.py +0 -0
  17. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_dataformat_library.py +0 -0
  18. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/MediBot_docx_decoder.py +0 -0
  19. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/PDF_to_CSV_Cleaner.py +0 -0
  20. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/__init__.py +0 -0
  21. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/update_json.py +0 -0
  22. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediBot/update_medicafe.py +0 -0
  23. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink.py +0 -0
  24. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_837p_encoder.py +0 -0
  25. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_837p_encoder_library.py +0 -0
  26. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_API_Generator.py +0 -0
  27. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_API_v2.py +0 -0
  28. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_APIs.py +0 -0
  29. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Azure.py +0 -0
  30. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_ClaimStatus.py +0 -0
  31. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_ConfigLoader.py +0 -0
  32. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_DataMgmt.py +0 -0
  33. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Decoder.py +0 -0
  34. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Deductible.py +0 -0
  35. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Down.py +0 -0
  36. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Gmail.py +0 -0
  37. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Mailer.py +0 -0
  38. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Parser.py +0 -0
  39. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Scan.py +0 -0
  40. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Scheduler.py +0 -0
  41. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_UI.py +0 -0
  42. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_Up.py +0 -0
  43. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/MediLink_batch.bat +0 -0
  44. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/Soumit_api.py +0 -0
  45. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/__init__.py +0 -0
  46. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/openssl.cnf +0 -0
  47. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/test.py +0 -0
  48. {medicafe-0.250610.1 → medicafe-0.250630.0}/MediLink/webapp.html +0 -0
  49. {medicafe-0.250610.1 → medicafe-0.250630.0}/README.md +0 -0
  50. {medicafe-0.250610.1 → medicafe-0.250630.0}/medicafe.egg-info/dependency_links.txt +0 -0
  51. {medicafe-0.250610.1 → medicafe-0.250630.0}/medicafe.egg-info/not-zip-safe +0 -0
  52. {medicafe-0.250610.1 → medicafe-0.250630.0}/medicafe.egg-info/requires.txt +0 -0
  53. {medicafe-0.250610.1 → medicafe-0.250630.0}/medicafe.egg-info/top_level.txt +0 -0
  54. {medicafe-0.250610.1 → medicafe-0.250630.0}/setup.cfg +0 -0
@@ -3,8 +3,10 @@ import time, requests, yaml, json, os, traceback
3
3
 
4
4
  try:
5
5
  from MediLink import MediLink_ConfigLoader
6
+ from MediLink import MediLink_GraphQL
6
7
  except ImportError:
7
8
  import MediLink_ConfigLoader
9
+ import MediLink_GraphQL
8
10
 
9
11
  """
10
12
  TODO At some point it might make sense to test their acknoledgment endpoint. body is transactionId.
@@ -168,7 +170,15 @@ class APIClient(BaseAPIClient):
168
170
  if call_type == 'GET':
169
171
  return requests.get(url, headers=headers, params=params)
170
172
  elif call_type == 'POST':
171
- headers['Content-Type'] = 'application/json'
173
+ # Check if there are custom headers (any headers beyond Authorization and Accept)
174
+ custom_headers = {k: v for k, v in headers.items() if k not in ['Authorization', 'Accept']}
175
+
176
+ if custom_headers:
177
+ # Log that custom headers were detected
178
+ MediLink_ConfigLoader.log("Custom headers detected: {}".format(custom_headers), level="DEBUG")
179
+ else:
180
+ # Set default Content-Type if no custom headers
181
+ headers['Content-Type'] = 'application/json'
172
182
  return requests.post(url, headers=headers, json=data)
173
183
  elif call_type == 'DELETE':
174
184
  return requests.delete(url, headers=headers)
@@ -467,6 +477,85 @@ def get_eligibility_v3(client, payer_id, provider_last_name, search_option, date
467
477
 
468
478
  return client.make_api_call(endpoint_name, 'POST', url_extension, params=None, data=body)
469
479
 
480
+ def get_eligibility_super_connector(client, payer_id, provider_last_name, search_option, date_of_birth, member_id, npi,
481
+ first_name=None, last_name=None, payer_label=None, payer_name=None, service_start=None, service_end=None,
482
+ middle_name=None, gender=None, ssn=None, city=None, state=None, zip=None, group_number=None,
483
+ service_type_code=None, provider_first_name=None, tax_id_number=None, provider_name_id=None,
484
+ corporate_tax_owner_id=None, corporate_tax_owner_name=None, organization_name=None,
485
+ organization_id=None, identify_service_level_deductible=True):
486
+ """
487
+ GraphQL Super Connector version of eligibility check that maps to the same interface as get_eligibility_v3.
488
+ This function provides a drop-in replacement for the REST API with identical input/output behavior.
489
+ """
490
+ # Ensure all required parameters have values
491
+ if not all([client, payer_id, provider_last_name, search_option, date_of_birth, member_id, npi]):
492
+ raise ValueError("All required parameters must have values: client, payer_id, provider_last_name, search_option, date_of_birth, member_id, npi")
493
+
494
+ # Validate payer_id
495
+ valid_payer_ids = ["87726", "06111", "25463", "37602", "39026", "74227", "65088", "81400", "03432", "86050", "86047", "95378", "95467"]
496
+ if payer_id not in valid_payer_ids:
497
+ raise ValueError("Invalid payer_id: {}. Must be one of: {}".format(payer_id, ", ".join(valid_payer_ids)))
498
+
499
+ endpoint_name = 'UHCAPI'
500
+ url_extension = client.config['MediLink_Config']['endpoints'][endpoint_name]['additional_endpoints']['eligibility_super_connector']
501
+
502
+ # Get provider TIN from config (using existing billing_provider_tin)
503
+ provider_tin = client.config['MediLink_Config'].get('billing_provider_tin')
504
+ if not provider_tin:
505
+ raise ValueError("Provider TIN not found in configuration")
506
+
507
+ # Construct GraphQL query variables from the input parameters
508
+ # Map the REST API parameters to GraphQL input structure
509
+ graphql_variables = {
510
+ "memberId": member_id,
511
+ "firstName": first_name or "",
512
+ "lastName": last_name or provider_last_name, # Use provider_last_name as fallback for lastName
513
+ "dateOfBirth": date_of_birth,
514
+ "serviceStartDate": service_start or date_of_birth, # Use date_of_birth as fallback
515
+ "serviceEndDate": service_end or date_of_birth, # Use date_of_birth as fallback
516
+ "coverageTypes": ["Medical"], # Default to Medical coverage
517
+ "payerId": payer_id,
518
+ "providerLastName": provider_last_name,
519
+ "providerFirstName": provider_first_name or "",
520
+ "providerNPI": npi
521
+ }
522
+
523
+ # Remove empty values
524
+ graphql_variables = {k: v for k, v in graphql_variables.items() if v}
525
+
526
+ # Build GraphQL request using the new module
527
+ # Hardcoded switch to use sample data for testing
528
+ USE_SAMPLE_DATA = True # Set to False to use constructed data
529
+
530
+ if USE_SAMPLE_DATA:
531
+ # Use the sample data from swagger documentation
532
+ graphql_body = MediLink_GraphQL.get_sample_eligibility_request()
533
+ MediLink_ConfigLoader.log("Using SAMPLE DATA from swagger documentation", level="INFO")
534
+ else:
535
+ # Build GraphQL request with actual data
536
+ graphql_body = MediLink_GraphQL.build_eligibility_request(graphql_variables)
537
+ MediLink_ConfigLoader.log("Using CONSTRUCTED DATA with provided parameters", level="INFO")
538
+
539
+ # Log the GraphQL request
540
+ MediLink_ConfigLoader.log("GraphQL request body: {}".format(json.dumps(graphql_body, indent=2)), level="DEBUG")
541
+
542
+ # Add required headers for Super Connector
543
+ headers = {
544
+ 'Content-Type': 'application/json',
545
+ 'Accept': 'application/json',
546
+ 'env': 'sandbox',
547
+ 'tin': provider_tin
548
+ }
549
+
550
+ # Make the GraphQL API call
551
+ response = client.make_api_call(endpoint_name, 'POST', url_extension, params=None, data=graphql_body, headers=headers)
552
+
553
+ # Transform GraphQL response to match REST API format
554
+ # This ensures the calling code doesn't know the difference
555
+ transformed_response = MediLink_GraphQL.transform_eligibility_response(response)
556
+
557
+ return transformed_response
558
+
470
559
  def is_test_mode(client, body, endpoint_type):
471
560
  """
472
561
  Checks if Test Mode is enabled in the client's configuration and simulates the response if it is.
@@ -557,10 +646,11 @@ if __name__ == "__main__":
557
646
 
558
647
  # Define a configuration to enable or disable tests
559
648
  test_config = {
560
- 'test_fetch_payer_name': True,
649
+ 'test_fetch_payer_name': False,
561
650
  'test_claim_summary': False,
562
651
  'test_eligibility': False,
563
652
  'test_eligibility_v3': False,
653
+ 'test_eligibility_super_connector': True,
564
654
  'test_claim_submission': False,
565
655
  }
566
656
 
@@ -606,6 +696,17 @@ if __name__ == "__main__":
606
696
  except Exception as e:
607
697
  print("TEST API: Error in Eligibility v3 Test: {}".format(e))
608
698
 
699
+ # Test 5: Get Eligibility Super Connector (GraphQL)
700
+ if test_config.get('test_eligibility_super_connector', False):
701
+ try:
702
+ for case in api_test_cases:
703
+ eligibility_super_connector = get_eligibility_super_connector(client, payer_id=case['payer_id'], provider_last_name=case['provider_last_name'],
704
+ search_option=case['search_option'], date_of_birth=case['date_of_birth'],
705
+ member_id=case['member_id'], npi=case['npi'])
706
+ print("TEST API: Eligibility Super Connector: {}".format(eligibility_super_connector))
707
+ except Exception as e:
708
+ print("TEST API: Error in Eligibility Super Connector Test: {}".format(e))
709
+
609
710
  """
610
711
  # Example of iterating over multiple patients (if needed)
611
712
  patients = [
@@ -621,7 +722,7 @@ if __name__ == "__main__":
621
722
  except Exception as e:
622
723
  print("Error in getting eligibility for {}: {}".format(patient['provider_last_name'], e))
623
724
  """
624
- # Test 5: UHC Claim Submission
725
+ # Test 6: UHC Claim Submission
625
726
  if test_config.get('test_claim_submission', False):
626
727
  try:
627
728
  x12_request_data = (